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-12-14 02:10:01 +0300
committerDennis Schubert <mail@dennis-schubert.de>2016-12-14 02:10:57 +0300
commit241c17a814d1c4c9999a1362c7053e0dc5749cf3 (patch)
tree924b0910535666e95370f29d6043226bc3890e59
parentb88f53a3d3fc608b726835437574fee0095ae69f (diff)
parentea35061febcf4e7991c4d882cd01258ef6f5a3fb (diff)
Merge branch 'release/0.6.2.0'v0.6.2.0
-rw-r--r--.rspec1
-rw-r--r--Changelog.md35
-rw-r--r--Gemfile8
-rw-r--r--Gemfile.lock11
-rw-r--r--app/assets/javascripts/app/app.js2
-rw-r--r--app/assets/javascripts/app/collections/notifications.js114
-rw-r--r--app/assets/javascripts/app/collections/reshares.js5
-rw-r--r--app/assets/javascripts/app/models/notification.js69
-rw-r--r--app/assets/javascripts/app/models/post/interactions.js24
-rw-r--r--app/assets/javascripts/app/pages/contacts.js3
-rw-r--r--app/assets/javascripts/app/pages/profile.js1
-rw-r--r--app/assets/javascripts/app/router.js2
-rw-r--r--app/assets/javascripts/app/views/aspect_membership_view.js4
-rw-r--r--app/assets/javascripts/app/views/comment_stream_view.js40
-rw-r--r--app/assets/javascripts/app/views/conversations_form_view.js83
-rw-r--r--app/assets/javascripts/app/views/conversations_inbox_view.js2
-rw-r--r--app/assets/javascripts/app/views/flash_messages_view.js8
-rw-r--r--app/assets/javascripts/app/views/header_view.js10
-rw-r--r--app/assets/javascripts/app/views/likes_info_view.js12
-rw-r--r--app/assets/javascripts/app/views/notification_dropdown_view.js71
-rw-r--r--app/assets/javascripts/app/views/notifications_view.js117
-rw-r--r--app/assets/javascripts/app/views/profile_header_view.js6
-rw-r--r--app/assets/javascripts/app/views/publisher/mention_view.js2
-rw-r--r--app/assets/javascripts/app/views/reshares_info_view.js12
-rw-r--r--app/assets/javascripts/app/views/search_base_view.js8
-rw-r--r--app/assets/javascripts/app/views/search_view.js2
-rw-r--r--app/assets/javascripts/app/views/tags_view.js2
-rw-r--r--app/assets/javascripts/helpers/browser_notification.js22
-rw-r--r--app/assets/javascripts/helpers/i18n.js2
-rw-r--r--app/assets/javascripts/jsxc.js2
-rw-r--r--app/assets/javascripts/main.js2
-rw-r--r--app/assets/javascripts/mobile/mobile_post_actions.js8
-rw-r--r--app/assets/stylesheets/bootstrap-variables.scss7
-rw-r--r--app/assets/stylesheets/color-variables.scss31
-rw-r--r--app/assets/stylesheets/color_themes/_color_theme_override_dark.scss170
-rw-r--r--app/assets/stylesheets/color_themes/_color_theme_override_origwhite.scss6
-rw-r--r--app/assets/stylesheets/color_themes/dark/_style.scss153
-rw-r--r--app/assets/stylesheets/color_themes/dark/desktop.scss3
-rw-r--r--app/assets/stylesheets/color_themes/dark/mobile.scss63
-rw-r--r--app/assets/stylesheets/color_themes/original_white/_style.scss1
-rw-r--r--app/assets/stylesheets/comments.scss16
-rw-r--r--app/assets/stylesheets/contacts.scss12
-rw-r--r--app/assets/stylesheets/conversations.scss58
-rw-r--r--app/assets/stylesheets/forms.scss3
-rw-r--r--app/assets/stylesheets/header.scss2
-rw-r--r--app/assets/stylesheets/help.scss4
-rw-r--r--app/assets/stylesheets/home.scss4
-rw-r--r--app/assets/stylesheets/hovercard.scss2
-rw-r--r--app/assets/stylesheets/icons.scss2
-rw-r--r--app/assets/stylesheets/interactions.scss6
-rw-r--r--app/assets/stylesheets/invitations.scss8
-rw-r--r--app/assets/stylesheets/markdown-editor.scss6
-rw-r--r--app/assets/stylesheets/mentions.scss2
-rw-r--r--app/assets/stylesheets/mobile/comments.scss2
-rw-r--r--app/assets/stylesheets/mobile/conversations.scss2
-rw-r--r--app/assets/stylesheets/mobile/mobile.scss8
-rw-r--r--app/assets/stylesheets/mobile/tags.scss2
-rw-r--r--app/assets/stylesheets/notifications.scss4
-rw-r--r--app/assets/stylesheets/profile.scss24
-rw-r--r--app/assets/stylesheets/registration.scss2
-rw-r--r--app/assets/stylesheets/sidebar.scss4
-rw-r--r--app/assets/stylesheets/stream_element.scss10
-rw-r--r--app/assets/templates/comment-stream_tpl.jst.hbs8
-rw-r--r--app/assets/templates/conversation_recipient_tag_tpl.jst.hbs12
-rw-r--r--app/assets/templates/header_tpl.jst.hbs9
-rw-r--r--app/controllers/api/openid_connect/authorizations_controller.rb3
-rw-r--r--app/controllers/api/v1/tokens_controller.rb16
-rw-r--r--app/controllers/comments_controller.rb10
-rw-r--r--app/controllers/contacts_controller.rb3
-rw-r--r--app/controllers/conversations_controller.rb45
-rw-r--r--app/controllers/likes_controller.rb2
-rw-r--r--app/controllers/notifications_controller.rb13
-rw-r--r--app/controllers/reshares_controller.rb14
-rw-r--r--app/controllers/share_visibilities_controller.rb13
-rw-r--r--app/controllers/users_controller.rb5
-rw-r--r--app/helpers/application_helper.rb10
-rw-r--r--app/helpers/layout_helper.rb2
-rw-r--r--app/helpers/sessions_helper.rb2
-rw-r--r--app/helpers/stream_helper.rb4
-rw-r--r--app/models/person.rb4
-rw-r--r--app/models/pod.rb9
-rw-r--r--app/models/reshare.rb8
-rw-r--r--app/models/user.rb3
-rw-r--r--app/models/user/authentication_token.rb26
-rw-r--r--app/presenters/post_presenter.rb2
-rw-r--r--app/views/application/_head.haml30
-rw-r--r--app/views/contacts/index.html.haml29
-rw-r--r--app/views/conversations/_new.haml14
-rw-r--r--app/views/conversations/_show.haml3
-rw-r--r--app/views/conversations/new.html.haml12
-rw-r--r--app/views/conversations/new.mobile.haml8
-rw-r--r--app/views/devise/shared/_links.haml4
-rw-r--r--app/views/invitations/new.html.haml45
-rw-r--r--app/views/layouts/application.html.haml44
-rw-r--r--app/views/layouts/application.mobile.haml59
-rw-r--r--app/views/notifications/index.html.haml3
-rw-r--r--app/views/people/show.html.haml2
-rw-r--r--app/views/posts/_photo.html.haml21
-rw-r--r--app/views/shared/_invitations.haml15
-rw-r--r--app/views/users/_edit.haml101
-rw-r--r--app/workers/recheck_scheduled_pods.rb9
-rw-r--r--config/color_themes.yml3
-rw-r--r--config/defaults.yml5
-rw-r--r--config/diaspora.yml.example9
-rw-r--r--config/eye.rb17
-rw-r--r--config/initializers/color_themes.rb4
-rw-r--r--config/initializers/diaspora_federation.rb4
-rw-r--r--config/locales/devise/devise.cs.yml8
-rw-r--r--config/locales/devise/devise.da.yml44
-rw-r--r--config/locales/devise/devise.fr.yml4
-rw-r--r--config/locales/devise/devise.hu.yml16
-rw-r--r--config/locales/devise/devise.hy.yml8
-rw-r--r--config/locales/devise/devise.ia.yml24
-rw-r--r--config/locales/devise/devise.ja.yml14
-rw-r--r--config/locales/devise/devise.nl.yml5
-rw-r--r--config/locales/devise/devise.oc.yml107
-rw-r--r--config/locales/devise/devise.sv.yml48
-rw-r--r--config/locales/devise/devise.te.yml10
-rw-r--r--config/locales/diaspora/ar.yml9
-rw-r--r--config/locales/diaspora/bg.yml9
-rw-r--r--config/locales/diaspora/br.yml10
-rw-r--r--config/locales/diaspora/bs.yml10
-rw-r--r--config/locales/diaspora/cs.yml71
-rw-r--r--config/locales/diaspora/da.yml21
-rw-r--r--config/locales/diaspora/de-CH.yml528
-rw-r--r--config/locales/diaspora/de.yml81
-rw-r--r--config/locales/diaspora/de_formal.yml76
-rw-r--r--config/locales/diaspora/el.yml10
-rw-r--r--config/locales/diaspora/en.yml25
-rw-r--r--config/locales/diaspora/en_1337.yml9
-rw-r--r--config/locales/diaspora/en_pirate.yml5
-rw-r--r--config/locales/diaspora/en_shaw.yml6
-rw-r--r--config/locales/diaspora/en_valspeak.yml10
-rw-r--r--config/locales/diaspora/eo.yml23
-rw-r--r--config/locales/diaspora/es-AR.yml67
-rw-r--r--config/locales/diaspora/es-CL.yml10
-rw-r--r--config/locales/diaspora/es-CO.yml9
-rw-r--r--config/locales/diaspora/es-MX.yml10
-rw-r--r--config/locales/diaspora/es.yml15
-rw-r--r--config/locales/diaspora/eu.yml9
-rw-r--r--config/locales/diaspora/fi.yml10
-rw-r--r--config/locales/diaspora/fr.yml91
-rw-r--r--config/locales/diaspora/fy.yml1
-rw-r--r--config/locales/diaspora/ga.yml1
-rw-r--r--config/locales/diaspora/he.yml10
-rw-r--r--config/locales/diaspora/hu.yml170
-rw-r--r--config/locales/diaspora/hy.yml53
-rw-r--r--config/locales/diaspora/ia.yml306
-rw-r--r--config/locales/diaspora/id.yml9
-rw-r--r--config/locales/diaspora/is.yml7
-rw-r--r--config/locales/diaspora/it.yml10
-rw-r--r--config/locales/diaspora/ja.yml312
-rw-r--r--config/locales/diaspora/ka.yml9
-rw-r--r--config/locales/diaspora/ko.yml10
-rw-r--r--config/locales/diaspora/lt.yml7
-rw-r--r--config/locales/diaspora/mk.yml7
-rw-r--r--config/locales/diaspora/ml.yml10
-rw-r--r--config/locales/diaspora/nb.yml10
-rw-r--r--config/locales/diaspora/nds.yml10
-rw-r--r--config/locales/diaspora/ne.yml1
-rw-r--r--config/locales/diaspora/nl.yml28
-rw-r--r--config/locales/diaspora/nn.yml10
-rw-r--r--config/locales/diaspora/oc.yml1113
-rw-r--r--config/locales/diaspora/pl.yml10
-rw-r--r--config/locales/diaspora/pt-BR.yml69
-rw-r--r--config/locales/diaspora/pt-PT.yml10
-rw-r--r--config/locales/diaspora/ro.yml10
-rw-r--r--config/locales/diaspora/ru.yml21
-rw-r--r--config/locales/diaspora/si.yml1
-rw-r--r--config/locales/diaspora/sk.yml10
-rw-r--r--config/locales/diaspora/sl.yml10
-rw-r--r--config/locales/diaspora/sr.yml5
-rw-r--r--config/locales/diaspora/sv.yml63
-rw-r--r--config/locales/diaspora/te.yml24
-rw-r--r--config/locales/diaspora/tr.yml32
-rw-r--r--config/locales/diaspora/uk.yml10
-rw-r--r--config/locales/diaspora/vi.yml10
-rw-r--r--config/locales/diaspora/wo.yml1
-rw-r--r--config/locales/diaspora/zh-CN.yml9
-rw-r--r--config/locales/diaspora/zh-TW.yml52
-rw-r--r--config/locales/javascript/javascript.ar.yml4
-rw-r--r--config/locales/javascript/javascript.bg.yml3
-rw-r--r--config/locales/javascript/javascript.br.yml2
-rw-r--r--config/locales/javascript/javascript.bs.yml2
-rw-r--r--config/locales/javascript/javascript.cs.yml78
-rw-r--r--config/locales/javascript/javascript.cy.yml3
-rw-r--r--config/locales/javascript/javascript.da.yml10
-rw-r--r--config/locales/javascript/javascript.de-CH.yml36
-rw-r--r--config/locales/javascript/javascript.de.yml11
-rw-r--r--config/locales/javascript/javascript.de_formal.yml12
-rw-r--r--config/locales/javascript/javascript.el.yml2
-rw-r--r--config/locales/javascript/javascript.en.yml10
-rw-r--r--config/locales/javascript/javascript.en_1337.yml3
-rw-r--r--config/locales/javascript/javascript.en_pirate.yml2
-rw-r--r--config/locales/javascript/javascript.en_shaw.yml3
-rw-r--r--config/locales/javascript/javascript.en_valspeak.yml2
-rw-r--r--config/locales/javascript/javascript.eo.yml2
-rw-r--r--config/locales/javascript/javascript.es-AR.yml11
-rw-r--r--config/locales/javascript/javascript.es-CL.yml2
-rw-r--r--config/locales/javascript/javascript.es-MX.yml2
-rw-r--r--config/locales/javascript/javascript.es.yml4
-rw-r--r--config/locales/javascript/javascript.eu.yml2
-rw-r--r--config/locales/javascript/javascript.fi.yml3
-rw-r--r--config/locales/javascript/javascript.fr.yml11
-rw-r--r--config/locales/javascript/javascript.he.yml2
-rw-r--r--config/locales/javascript/javascript.hu.yml20
-rw-r--r--config/locales/javascript/javascript.hy.yml32
-rw-r--r--config/locales/javascript/javascript.ia.yml48
-rw-r--r--config/locales/javascript/javascript.id.yml3
-rw-r--r--config/locales/javascript/javascript.is.yml2
-rw-r--r--config/locales/javascript/javascript.it.yml2
-rw-r--r--config/locales/javascript/javascript.ja.yml52
-rw-r--r--config/locales/javascript/javascript.ka.yml3
-rw-r--r--config/locales/javascript/javascript.ko.yml2
-rw-r--r--config/locales/javascript/javascript.lt.yml3
-rw-r--r--config/locales/javascript/javascript.ml.yml2
-rw-r--r--config/locales/javascript/javascript.ms.yml2
-rw-r--r--config/locales/javascript/javascript.nb.yml31
-rw-r--r--config/locales/javascript/javascript.nl.yml31
-rw-r--r--config/locales/javascript/javascript.nn.yml2
-rw-r--r--config/locales/javascript/javascript.oc.yml316
-rw-r--r--config/locales/javascript/javascript.pl.yml3
-rw-r--r--config/locales/javascript/javascript.pt-BR.yml11
-rw-r--r--config/locales/javascript/javascript.pt-PT.yml2
-rw-r--r--config/locales/javascript/javascript.ro.yml3
-rw-r--r--config/locales/javascript/javascript.ru.yml3
-rw-r--r--config/locales/javascript/javascript.sk.yml2
-rw-r--r--config/locales/javascript/javascript.sl.yml2
-rw-r--r--config/locales/javascript/javascript.sr.yml3
-rw-r--r--config/locales/javascript/javascript.sv.yml50
-rw-r--r--config/locales/javascript/javascript.te.yml19
-rw-r--r--config/locales/javascript/javascript.tr.yml2
-rw-r--r--config/locales/javascript/javascript.uk.yml3
-rw-r--r--config/locales/javascript/javascript.vi.yml2
-rw-r--r--config/locales/javascript/javascript.zh-CN.yml2
-rw-r--r--config/locales/javascript/javascript.zh-TW.yml10
-rw-r--r--config/routes.rb9
-rw-r--r--config/schedule.yml4
-rw-r--r--config/unicorn.rb18
-rw-r--r--db/migrate/20161024231443_add_scheduled_check_to_pod.rb5
-rw-r--r--db/schema.rb23
-rw-r--r--features/desktop/comments.feature13
-rw-r--r--features/desktop/help.feature8
-rw-r--r--features/desktop/invitations.feature11
-rw-r--r--features/desktop/manages_aspects.feature14
-rw-r--r--features/desktop/notifications.feature18
-rw-r--r--features/desktop/reshare.feature24
-rw-r--r--features/step_definitions/aspects_steps.rb2
-rw-r--r--features/step_definitions/conversations_steps.rb8
-rw-r--r--features/step_definitions/custom_web_steps.rb30
-rw-r--r--features/step_definitions/like_steps.rb5
-rw-r--r--features/step_definitions/notifications_steps.rb33
-rw-r--r--lib/direction_detector.rb34
-rw-r--r--lib/stream/aspect.rb12
-rw-r--r--lib/stream/base.rb5
-rw-r--r--spec/configuration_methods_spec.rb2
-rw-r--r--spec/controllers/admin/pods_controller_spec.rb3
-rw-r--r--spec/controllers/admin/users_controller_spec.rb3
-rw-r--r--spec/controllers/admins_controller_spec.rb2
-rw-r--r--spec/controllers/api/openid_connect/authorizations_controller_spec.rb116
-rw-r--r--spec/controllers/api/openid_connect/clients_controller_spec.rb2
-rw-r--r--spec/controllers/api/openid_connect/discovery_controller_spec.rb2
-rw-r--r--spec/controllers/api/openid_connect/id_tokens_controller_spec.rb2
-rw-r--r--spec/controllers/api/openid_connect/token_endpoint_controller_spec.rb2
-rw-r--r--spec/controllers/api/openid_connect/user_applications_spec.rb2
-rw-r--r--spec/controllers/application_controller_spec.rb2
-rw-r--r--spec/controllers/aspect_memberships_controller_spec.rb2
-rw-r--r--spec/controllers/aspects_controller_spec.rb2
-rw-r--r--spec/controllers/blocks_controller_spec.rb2
-rw-r--r--spec/controllers/comments_controller_spec.rb3
-rw-r--r--spec/controllers/contacts_controller_spec.rb13
-rw-r--r--spec/controllers/conversation_visibilities_controller_spec.rb2
-rw-r--r--spec/controllers/conversations_controller_spec.rb518
-rw-r--r--spec/controllers/help_controller_spec.rb2
-rw-r--r--spec/controllers/home_controller_spec.rb2
-rw-r--r--spec/controllers/invitation_codes_controller_spec.rb2
-rw-r--r--spec/controllers/invitations_controller_spec.rb2
-rw-r--r--spec/controllers/jasmine_fixtures/admins_spec.rb2
-rw-r--r--spec/controllers/jasmine_fixtures/aspects_spec.rb2
-rw-r--r--spec/controllers/jasmine_fixtures/contacts_spec.rb2
-rw-r--r--spec/controllers/jasmine_fixtures/conversations_spec.rb2
-rw-r--r--spec/controllers/jasmine_fixtures/notifications_spec.rb4
-rw-r--r--spec/controllers/jasmine_fixtures/people_spec.rb2
-rw-r--r--spec/controllers/jasmine_fixtures/photos_spec.rb2
-rw-r--r--spec/controllers/jasmine_fixtures/status_messages_spec.rb2
-rw-r--r--spec/controllers/jasmine_fixtures/streams_spec.rb2
-rw-r--r--spec/controllers/jasmine_fixtures/users_spec.rb2
-rw-r--r--spec/controllers/likes_controller_spec.rb8
-rw-r--r--spec/controllers/messages_controller_spec.rb2
-rw-r--r--spec/controllers/node_info_controller_spec.rb2
-rw-r--r--spec/controllers/notifications_controller_spec.rb19
-rw-r--r--spec/controllers/participations_controller_spec.rb2
-rw-r--r--spec/controllers/passwords_controller_spec.rb2
-rw-r--r--spec/controllers/people_controller_spec.rb2
-rw-r--r--spec/controllers/photos_controller_spec.rb2
-rw-r--r--spec/controllers/posts_controller_spec.rb2
-rw-r--r--spec/controllers/profiles_controller_spec.rb2
-rw-r--r--spec/controllers/registrations_controller_spec.rb2
-rw-r--r--spec/controllers/report_controller_spec.rb3
-rw-r--r--spec/controllers/reshares_controller_spec.rb44
-rw-r--r--spec/controllers/search_controller_spec.rb5
-rw-r--r--spec/controllers/services_controller_spec.rb2
-rw-r--r--spec/controllers/sessions_controller_spec.rb2
-rw-r--r--spec/controllers/share_visibilities_controller_spec.rb36
-rw-r--r--spec/controllers/social_relay_controller_spec.rb2
-rw-r--r--spec/controllers/status_messages_controller_spec.rb2
-rw-r--r--spec/controllers/streams_controller_spec.rb2
-rw-r--r--spec/controllers/tag_followings_controller_spec.rb2
-rw-r--r--spec/controllers/tags_controller_spec.rb2
-rw-r--r--spec/controllers/terms_controller_spec.rb2
-rw-r--r--spec/controllers/users_controller_spec.rb6
-rw-r--r--spec/federation_callbacks_spec.rb23
-rw-r--r--spec/helpers/application_helper_spec.rb34
-rw-r--r--spec/helpers/conversations_helper_spec.rb2
-rw-r--r--spec/helpers/getting_started_helper_spec.rb1
-rw-r--r--spec/helpers/gon_helper_spec.rb2
-rw-r--r--spec/helpers/interim_stream_hackiness_helper_spec.rb2
-rw-r--r--spec/helpers/jsxc_helper_spec.rb2
-rw-r--r--spec/helpers/language_helper_spec.rb2
-rw-r--r--spec/helpers/layout_helper_spec.rb2
-rw-r--r--spec/helpers/meta_data_helper_spec.rb2
-rw-r--r--spec/helpers/notifications_helper_spec.rb2
-rw-r--r--spec/helpers/notifier_helper_spec.rb2
-rw-r--r--spec/helpers/o_embed_helper_spec.rb2
-rw-r--r--spec/helpers/open_graph_helper_spec.rb2
-rw-r--r--spec/helpers/people_helper_spec.rb2
-rw-r--r--spec/helpers/posts_helper_spec.rb2
-rw-r--r--spec/helpers/report_helper_spec.rb2
-rw-r--r--spec/helpers/stream_helper_spec.rb16
-rw-r--r--spec/helpers/tags_helper_spec.rb2
-rw-r--r--spec/helpers/users_helper_spec.rb2
-rw-r--r--spec/integration/account_deletion_spec.rb2
-rw-r--r--spec/integration/api/user_info_controller_spec.rb1
-rw-r--r--spec/integration/application_spec.rb2
-rw-r--r--spec/integration/contact_deleting_spec.rb2
-rw-r--r--spec/integration/contacts_spec.rb73
-rw-r--r--spec/integration/dispatching_spec.rb2
-rw-r--r--spec/integration/federation/attack_vectors_spec.rb1
-rw-r--r--spec/integration/federation/receive_federation_messages_spec.rb1
-rw-r--r--spec/integration/mentioning_spec.rb2
-rw-r--r--spec/integration/mobile_posts_spec.rb2
-rw-r--r--spec/integration/profile_spec.rb2
-rw-r--r--spec/integration/receiving_spec.rb2
-rw-r--r--spec/integration/tag_people_spec.rb2
-rw-r--r--spec/javascripts/app/app_spec.js35
-rw-r--r--spec/javascripts/app/collections/notifications_collection_spec.js251
-rw-r--r--spec/javascripts/app/models/notification_spec.js85
-rw-r--r--spec/javascripts/app/models/post/interacations_spec.js116
-rw-r--r--spec/javascripts/app/pages/contacts_spec.js26
-rw-r--r--spec/javascripts/app/views/aspect_membership_view_spec.js7
-rw-r--r--spec/javascripts/app/views/comment_stream_view_spec.js146
-rw-r--r--spec/javascripts/app/views/conversations_form_view_spec.js176
-rw-r--r--spec/javascripts/app/views/flash_messages_view-spec.js14
-rw-r--r--spec/javascripts/app/views/header_view_spec.js1
-rw-r--r--spec/javascripts/app/views/help_view_spec.js6
-rw-r--r--spec/javascripts/app/views/likes_info_view_spec.js14
-rw-r--r--spec/javascripts/app/views/notification_dropdown_view_spec.js143
-rw-r--r--spec/javascripts/app/views/notifications_view_spec.js220
-rw-r--r--spec/javascripts/app/views/profile_header_view_spec.js54
-rw-r--r--spec/javascripts/app/views/publisher_mention_view_spec.js2
-rw-r--r--spec/javascripts/app/views/reshares_info_view_spec.js14
-rw-r--r--spec/javascripts/app/views/search_view_spec.js2
-rw-r--r--spec/javascripts/helpers/i18n_spec.js22
-rw-r--r--spec/javascripts/mobile/mobile_post_actions_spec.js12
-rw-r--r--spec/javascripts/onerror-fail.js7
-rw-r--r--spec/javascripts/support/jasmine.yml1
-rw-r--r--spec/lib/account_deleter_spec.rb2
-rw-r--r--spec/lib/api/openid_connect/protected_resource_endpoint_spec.rb2
-rw-r--r--spec/lib/api/openid_connect/token_endpoint_spec.rb2
-rw-r--r--spec/lib/configuration_methods_spec.rb2
-rw-r--r--spec/lib/connection_tester_spec.rb3
-rw-r--r--spec/lib/diaspora/camo_spec.rb2
-rw-r--r--spec/lib/diaspora/exporter_spec.rb1
-rw-r--r--spec/lib/diaspora/federated/base_spec.rb2
-rw-r--r--spec/lib/diaspora/federated/retraction_spec.rb2
-rw-r--r--spec/lib/diaspora/federation/dispatcher/private_spec.rb2
-rw-r--r--spec/lib/diaspora/federation/dispatcher/public_spec.rb2
-rw-r--r--spec/lib/diaspora/federation/dispatcher_spec.rb2
-rw-r--r--spec/lib/diaspora/federation/entities_spec.rb2
-rw-r--r--spec/lib/diaspora/federation/receive_spec.rb2
-rw-r--r--spec/lib/diaspora/fetcher/public_spec.rb3
-rw-r--r--spec/lib/diaspora/markdownify_email_spec.rb2
-rw-r--r--spec/lib/diaspora/markdownify_spec.rb2
-rw-r--r--spec/lib/diaspora/mentionable_spec.rb3
-rw-r--r--spec/lib/diaspora/message_renderer_spec.rb2
-rw-r--r--spec/lib/diaspora/shareable_spec.rb2
-rw-r--r--spec/lib/diaspora/taggable_spec.rb2
-rw-r--r--spec/lib/direction_detector_spec.rb38
-rw-r--r--spec/lib/email_inviter_spec.rb2
-rw-r--r--spec/lib/evil_query_spec.rb2
-rw-r--r--spec/lib/i18n_interpolation_fallbacks_spec.rb2
-rw-r--r--spec/lib/publisher_spec.rb3
-rw-r--r--spec/lib/pubsubhubbub_spec.rb2
-rw-r--r--spec/lib/rack/internet_explorer_version_spec.rb1
-rw-r--r--spec/lib/stream/activity_spec.rb1
-rw-r--r--spec/lib/stream/aspect_spec.rb2
-rw-r--r--spec/lib/stream/base_spec.rb7
-rw-r--r--spec/lib/stream/comments_spec.rb1
-rw-r--r--spec/lib/stream/followed_tag_spec.rb1
-rw-r--r--spec/lib/stream/likes_spec.rb1
-rw-r--r--spec/lib/stream/mention_spec.rb1
-rw-r--r--spec/lib/stream/multi_spec.rb1
-rw-r--r--spec/lib/stream/person_spec.rb1
-rw-r--r--spec/lib/stream/public_spec.rb1
-rw-r--r--spec/lib/stream/tag_spec.rb1
-rw-r--r--spec/locale_spec.rb2
-rw-r--r--spec/mailers/export_spec.rb2
-rw-r--r--spec/mailers/maintenance_spec.rb2
-rw-r--r--spec/mailers/notifier_spec.rb6
-rw-r--r--spec/mailers/report_spec.rb2
-rw-r--r--spec/misc_spec.rb2
-rw-r--r--spec/models/account_deletion_spec.rb2
-rw-r--r--spec/models/acts_as_taggable_on_tag_spec.rb2
-rw-r--r--spec/models/api/openid_connect/id_token_spec.rb2
-rw-r--r--spec/models/aspect_membership_spec.rb2
-rw-r--r--spec/models/aspect_spec.rb2
-rw-r--r--spec/models/aspect_visibility_spec.rb2
-rw-r--r--spec/models/block_spec.rb2
-rw-r--r--spec/models/comment_signature_spec.rb2
-rw-r--r--spec/models/comment_spec.rb2
-rw-r--r--spec/models/contact_spec.rb2
-rw-r--r--spec/models/conversation_spec.rb2
-rw-r--r--spec/models/conversation_visibilities_spec.rb2
-rw-r--r--spec/models/invitation_code_spec.rb2
-rw-r--r--spec/models/like_signature_spec.rb2
-rw-r--r--spec/models/like_spec.rb2
-rw-r--r--spec/models/location_spec.rb2
-rw-r--r--spec/models/mention_spec.rb2
-rw-r--r--spec/models/message_spec.rb2
-rw-r--r--spec/models/notification_spec.rb2
-rw-r--r--spec/models/notifications/also_commented_spec.rb2
-rw-r--r--spec/models/notifications/mentioned_spec.rb2
-rw-r--r--spec/models/notifications/private_message_spec.rb2
-rw-r--r--spec/models/notifications/reshared_spec.rb2
-rw-r--r--spec/models/notifications/started_sharing_spec.rb2
-rw-r--r--spec/models/open_graph_cache_spec.rb2
-rw-r--r--spec/models/participation_spec.rb2
-rw-r--r--spec/models/person_spec.rb3
-rw-r--r--spec/models/photo_spec.rb2
-rw-r--r--spec/models/pod_spec.rb48
-rw-r--r--spec/models/poll_answer_spec.rb2
-rw-r--r--spec/models/poll_participation_signature_spec.rb2
-rw-r--r--spec/models/poll_participation_spec.rb2
-rw-r--r--spec/models/poll_spec.rb2
-rw-r--r--spec/models/post_spec.rb2
-rw-r--r--spec/models/profile_spec.rb2
-rw-r--r--spec/models/report_spec.rb2
-rw-r--r--spec/models/reshare_spec.rb2
-rw-r--r--spec/models/role_spec.rb2
-rw-r--r--spec/models/service_spec.rb3
-rw-r--r--spec/models/services/facebook_spec.rb3
-rw-r--r--spec/models/services/tumblr_spec.rb2
-rw-r--r--spec/models/services/twitter_spec.rb3
-rw-r--r--spec/models/services/wordpress_spec.rb2
-rw-r--r--spec/models/share_visibility_spec.rb2
-rw-r--r--spec/models/signature_order_spec.rb2
-rw-r--r--spec/models/status_message_spec.rb2
-rw-r--r--spec/models/tag_following_spec.rb2
-rw-r--r--spec/models/user/authentication_token_spec.rb40
-rw-r--r--spec/models/user/connecting_spec.rb2
-rw-r--r--spec/models/user/posting_spec.rb2
-rw-r--r--spec/models/user/querying_spec.rb2
-rw-r--r--spec/models/user/social_actions_spec.rb2
-rw-r--r--spec/models/user_preference_spec.rb3
-rw-r--r--spec/models/user_spec.rb2
-rw-r--r--spec/presenters/aspect_membership_presenter_spec.rb2
-rw-r--r--spec/presenters/aspect_presenter_spec.rb2
-rw-r--r--spec/presenters/avatar_presenter_spec.rb2
-rw-r--r--spec/presenters/base_presenter_spec.rb2
-rw-r--r--spec/presenters/contact_presenter_spec.rb2
-rw-r--r--spec/presenters/node_info_presenter_spec.rb2
-rw-r--r--spec/presenters/o_embed_presenter_spec.rb1
-rw-r--r--spec/presenters/person_presenter_spec.rb2
-rw-r--r--spec/presenters/post_ineraction_presenter_spec.rb2
-rw-r--r--spec/presenters/post_presenter_spec.rb2
-rw-r--r--spec/presenters/profile_presenter_spec.rb2
-rw-r--r--spec/presenters/service_presenter_spec.rb2
-rw-r--r--spec/presenters/social_relay_presenter_spec.rb2
-rw-r--r--spec/presenters/statistics_presenter_spec.rb2
-rw-r--r--spec/presenters/user_presenter_spec.rb2
-rw-r--r--spec/serializers/comment_serializer_spec.rb2
-rw-r--r--spec/serializers/notification_serializer_spec.rb2
-rw-r--r--spec/serializers/post_serializer_spec.rb2
-rw-r--r--spec/services/comment_service_spec.rb2
-rw-r--r--spec/services/post_service_spec.rb2
-rw-r--r--spec/services/status_message_creation_service_spec.rb2
-rw-r--r--spec/shared_behaviors/account_deletion.rb2
-rw-r--r--spec/shared_behaviors/receiving.rb2
-rw-r--r--spec/shared_behaviors/relayable.rb2
-rw-r--r--spec/shared_behaviors/signature.rb2
-rw-r--r--spec/shared_behaviors/stream.rb6
-rw-r--r--spec/shared_behaviors/taggable.rb2
-rw-r--r--spec/support/fixture_builder.rb2
-rw-r--r--spec/workers/deferred_dispatch_spec.rb2
-rw-r--r--spec/workers/delete_account_spec.rb2
-rw-r--r--spec/workers/delete_post_from_service_spec.rb2
-rw-r--r--spec/workers/export_photos_spec.rb3
-rw-r--r--spec/workers/export_user_spec.rb3
-rw-r--r--spec/workers/fetch_profile_photo_spec.rb2
-rw-r--r--spec/workers/fetch_webfinger_spec.rb2
-rw-r--r--spec/workers/gather_o_embed_data_spec.rb1
-rw-r--r--spec/workers/gather_open_graph_data_spec.rb1
-rw-r--r--spec/workers/mail/csrf_token_fail_spec.rb2
-rw-r--r--spec/workers/mail/invite_email_spec.rb2
-rw-r--r--spec/workers/mail/liked_spec.rb2
-rw-r--r--spec/workers/mail/mentioned_spec.rb2
-rw-r--r--spec/workers/mail/private_message_spec.rb2
-rw-r--r--spec/workers/mail/reshared_spec.rb2
-rw-r--r--spec/workers/post_to_service_spec.rb2
-rw-r--r--spec/workers/process_photo_spec.rb2
-rw-r--r--spec/workers/publish_to_hub_spec.rb2
-rw-r--r--spec/workers/queue_users_for_removal_spec.rb2
-rw-r--r--spec/workers/receive_private_spec.rb2
-rw-r--r--spec/workers/receive_public_spec.rb2
-rw-r--r--spec/workers/recheck_offline_pods_spec.rb9
-rw-r--r--spec/workers/recurring_pod_check_spec.rb3
-rw-r--r--spec/workers/remove_old_user_spec.rb2
-rw-r--r--spec/workers/reset_password_spec.rb2
-rw-r--r--spec/workers/send_base_spec.rb2
-rw-r--r--spec/workers/send_private_spec.rb2
-rw-r--r--spec/workers/send_public_spec.rb2
-rw-r--r--vendor/assets/javascripts/typeahead.bundle.js2469
522 files changed, 7024 insertions, 5302 deletions
diff --git a/.rspec b/.rspec
index 174e25596..554b09b48 100644
--- a/.rspec
+++ b/.rspec
@@ -3,3 +3,4 @@
--color
--tag ~performance
--order random
+--require spec_helper
diff --git a/Changelog.md b/Changelog.md
index fb6e287d7..e7fe7f459 100644
--- a/Changelog.md
+++ b/Changelog.md
@@ -1,3 +1,38 @@
+# 0.6.2.0
+
+## Refactor
+* Use string-direction gem for rtl detection [#7181](https://github.com/diaspora/diaspora/pull/7181)
+* Reduce i18n.load side effects [#7184](https://github.com/diaspora/diaspora/pull/7184)
+* Force jasmine fails on syntax errors [#7185](https://github.com/diaspora/diaspora/pull/7185)
+* Don't display mail-related view content if it is disabled in the pod's config [#7190](https://github.com/diaspora/diaspora/pull/7190)
+* Use typeahead.js from rails-assets.org [#7192](https://github.com/diaspora/diaspora/pull/7192)
+* Refactor ShareVisibilitesController to use PostService [#7196](https://github.com/diaspora/diaspora/pull/7196)
+* Unify desktop and mobile head elements [#7194](https://github.com/diaspora/diaspora/pull/7194) [#7209](https://github.com/diaspora/diaspora/pull/7209)
+* Refactor flash messages on ajax errors for comments, likes, reshares and aspect memberships [#7202](https://github.com/diaspora/diaspora/pull/7202)
+* Only require AWS-module for fog [#7201](https://github.com/diaspora/diaspora/pull/7201)
+* Only show community spotlight links on the contacts page if community spotlight is enabled [#7213](https://github.com/diaspora/diaspora/pull/7213)
+* Require spec\_helper in .rspec [#7223](https://github.com/diaspora/diaspora/pull/7223)
+* Make the CSRF mail a bit more friendly [#7238](https://github.com/diaspora/diaspora/pull/7238) [#7241](https://github.com/diaspora/diaspora/pull/7241)
+
+## Bug fixes
+* Fix fetching comments after fetching likes [#7167](https://github.com/diaspora/diaspora/pull/7167)
+* Hide 'reshare' button on already reshared posts [#7169](https://github.com/diaspora/diaspora/pull/7169)
+* Only reload profile header when changing aspect memberships [#7183](https://github.com/diaspora/diaspora/pull/7183)
+* Fix visiblity on invitation modal when opening it from the stream [#7191](https://github.com/diaspora/diaspora/pull/7191)
+* Add avatar fallback on tags page [#7198](https://github.com/diaspora/diaspora/pull/7198)
+* Update notifications when changing the stream [#7199](https://github.com/diaspora/diaspora/pull/7199)
+* Fix 500 on mobile commented and liked streams [#7219](https://github.com/diaspora/diaspora/pull/7219)
+
+## Features
+* Show spinner when loading comments in the stream [#7170](https://github.com/diaspora/diaspora/pull/7170)
+* Add a dark color theme [#7152](https://github.com/diaspora/diaspora/pull/7152)
+* Added setting for custom changelog URL [#7166](https://github.com/diaspora/diaspora/pull/7166)
+* Show more information of recipients on conversation creation [#7129](https://github.com/diaspora/diaspora/pull/7129)
+* Update notifications every 5 minutes and when opening the notification dropdown [#6952](https://github.com/diaspora/diaspora/pull/6952)
+* Show browser notifications when receiving new unread notifications [#6952](https://github.com/diaspora/diaspora/pull/6952)
+* Only clear comment textarea when comment submission was successful [#7186](https://github.com/diaspora/diaspora/pull/7186)
+* Add support for graceful unicorn restarts [#7217](https://github.com/diaspora/diaspora/pull/7217)
+
# 0.6.1.0
Note: Although this is a minor release, the configuration file changed because the old Mapbox implementation is no longer valid, and the current implementation requires additional fields. Chances are high that if you're using the old integration, it will be broken anyway. If you do use Mapbox, please check out the `diaspora.yml.example` for new parameters.
diff --git a/Gemfile b/Gemfile
index 5e99577d4..9e4a60e82 100644
--- a/Gemfile
+++ b/Gemfile
@@ -25,7 +25,6 @@ gem "json-schema", "2.7.0"
gem "devise", "4.2.0"
gem "devise_lastseenable", "0.0.6"
-gem "devise-token_authenticatable", "0.5.2"
# Captcha
@@ -73,8 +72,8 @@ gem "activerecord-import", "0.15.0"
# File uploading
+gem "fog", "1.38.0", require: "fog/aws"
gem "carrierwave", "0.11.2"
-gem "fog", "1.38.0"
gem "mini_magick", "4.5.1"
# GUID generation
@@ -105,6 +104,7 @@ source "https://rails-assets.org" do
gem "rails-assets-markdown-it-sup", "1.0.0"
gem "rails-assets-highlightjs", "9.7.0"
gem "rails-assets-bootstrap-markdown", "2.10.0"
+ gem "rails-assets-corejs-typeahead", "1.0.1"
# jQuery plugins
@@ -136,6 +136,10 @@ gem "twitter-text", "1.14.0"
gem "ruby-oembed", "0.10.1"
gem "open_graph_reader", "0.6.1"
+# RTL support
+
+gem "string-direction", "1.2.0"
+
# Security Headers
gem "secure_headers", "3.5.0"
diff --git a/Gemfile.lock b/Gemfile.lock
index 0196e5d41..70ff9e4fe 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -171,8 +171,6 @@ GEM
railties (>= 4.1.0, < 5.1)
responders
warden (~> 1.2.3)
- devise-token_authenticatable (0.5.2)
- devise (>= 4.0.0, < 4.3.0)
devise_lastseenable (0.0.6)
devise
rails (>= 3.0.4)
@@ -648,6 +646,8 @@ GEM
rails-assets-jquery (>= 1.9.1, < 4)
rails-assets-bootstrap-markdown (2.10.0)
rails-assets-bootstrap (~> 3)
+ rails-assets-corejs-typeahead (1.0.1)
+ rails-assets-jquery (>= 1.7)
rails-assets-diaspora_jsxc (0.1.5.develop.7)
rails-assets-emojione (~> 2.0.1)
rails-assets-favico.js (>= 0.3.10, < 0.4)
@@ -821,6 +821,8 @@ GEM
activesupport (>= 3.0)
sprockets (>= 2.8, < 4.0)
state_machine (1.2.0)
+ string-direction (1.2.0)
+ yard (~> 0.8)
swd (1.0.1)
activesupport (>= 3)
attr_required (>= 0.0.5)
@@ -931,7 +933,6 @@ DEPENDENCIES
cucumber-rails (= 1.4.5)
database_cleaner (= 1.5.3)
devise (= 4.2.0)
- devise-token_authenticatable (= 0.5.2)
devise_lastseenable (= 0.0.6)
diaspora-prosody-config (= 0.0.7)
diaspora_federation-rails (= 0.1.5)
@@ -998,6 +999,7 @@ DEPENDENCIES
rails-assets-autosize (= 3.0.17)!
rails-assets-blueimp-gallery (= 2.21.3)!
rails-assets-bootstrap-markdown (= 2.10.0)!
+ rails-assets-corejs-typeahead (= 1.0.1)!
rails-assets-diaspora_jsxc (= 0.1.5.develop.7)!
rails-assets-highlightjs (= 9.7.0)!
rails-assets-jasmine-ajax (= 3.2.0)!
@@ -1034,6 +1036,7 @@ DEPENDENCIES
spring (= 2.0.0)
spring-commands-cucumber (= 1.0.1)
spring-commands-rspec (= 1.0.4)
+ string-direction (= 1.2.0)
test_after_commit (= 1.1.0)
timecop (= 0.8.1)
turbo_dev_assets (= 0.0.2)
@@ -1049,4 +1052,4 @@ DEPENDENCIES
will_paginate (= 3.1.5)
BUNDLED WITH
- 1.13.5
+ 1.13.6
diff --git a/app/assets/javascripts/app/app.js b/app/assets/javascripts/app/app.js
index 1046bd66a..d95852882 100644
--- a/app/assets/javascripts/app/app.js
+++ b/app/assets/javascripts/app/app.js
@@ -90,6 +90,7 @@ var app = {
setupHeader: function() {
if(app.currentUser.authenticated()) {
+ app.notificationsCollection = new app.collections.Notifications();
app.header = new app.views.Header();
$("header").prepend(app.header.el);
app.header.render();
@@ -114,6 +115,7 @@ var app = {
// so we use Backbone.history.navigate instead.
var change = Backbone.history.navigate(link.attr("href").substring(1) ,true);
if(change === undefined) { Backbone.history.loadUrl(link.attr("href").substring(1)); }
+ app.notificationsCollection.fetch();
});
},
diff --git a/app/assets/javascripts/app/collections/notifications.js b/app/assets/javascripts/app/collections/notifications.js
new file mode 100644
index 000000000..151410fe0
--- /dev/null
+++ b/app/assets/javascripts/app/collections/notifications.js
@@ -0,0 +1,114 @@
+app.collections.Notifications = Backbone.Collection.extend({
+ model: app.models.Notification,
+ // URL parameter
+ /* eslint-disable camelcase */
+ url: Routes.notifications({per_page: 10, page: 1}),
+ /* eslint-enable camelcase */
+ page: 2,
+ perPage: 5,
+ unreadCount: 0,
+ unreadCountByType: {},
+ timeout: 300000, // 5 minutes
+
+ initialize: function() {
+ this.fetch();
+ setInterval(this.pollNotifications.bind(this), this.timeout);
+ Diaspora.BrowserNotification.requestPermission();
+ },
+
+ pollNotifications: function() {
+ var unreadCountBefore = this.unreadCount;
+ this.fetch();
+
+ this.once("finishedLoading", function() {
+ if (unreadCountBefore < this.unreadCount) {
+ Diaspora.BrowserNotification.spawnNotification(
+ Diaspora.I18n.t("notifications.new_notifications", {count: this.unreadCount}));
+ }
+ }, this);
+ },
+
+ fetch: function(options) {
+ options = options || {};
+ options.remove = false;
+ options.merge = true;
+ options.parse = true;
+ Backbone.Collection.prototype.fetch.apply(this, [options]);
+ },
+
+ fetchMore: function() {
+ var hasMoreNotifications = (this.page * this.perPage) <= this.length;
+ // There are more notifications to load on the current page
+ if (hasMoreNotifications) {
+ this.page++;
+ // URL parameter
+ /* eslint-disable camelcase */
+ var route = Routes.notifications({per_page: this.perPage, page: this.page});
+ /* eslint-enable camelcase */
+ this.fetch({url: route, pushBack: true});
+ }
+ },
+
+ /**
+ * Adds new models to the collection at the end or at the beginning of the collection and
+ * then fires an event for each model of the collection. It will fire a different event
+ * based on whether the models were added at the end (typically when the scroll triggers to load more
+ * notifications) or at the beginning (new notifications have been added to the front of the list).
+ */
+ set: function(items, options) {
+ options = options || {};
+ options.at = options.pushBack ? this.length : 0;
+
+ // Retreive back the new created models
+ var models = [];
+ var accu = function(model) { models.push(model); };
+ this.on("add", accu);
+ Backbone.Collection.prototype.set.apply(this, [items, options]);
+ this.off("add", accu);
+
+ if (options.pushBack) {
+ models.forEach(function(model) { this.trigger("pushBack", model); }.bind(this));
+ } else {
+ // Fires events in the reverse order so that the first event is prepended in first position
+ models.reverse();
+ models.forEach(function(model) { this.trigger("pushFront", model); }.bind(this));
+ }
+ this.trigger("finishedLoading");
+ },
+
+ parse: function(response) {
+ this.unreadCount = response.unread_count;
+ this.unreadCountByType = response.unread_count_by_type;
+
+ return _.map(response.notification_list, function(item) {
+ /* eslint-disable new-cap */
+ var model = new this.model(item);
+ /* eslint-enable new-cap */
+ model.on("change:unread", this.onChangedUnreadStatus.bind(this));
+ return model;
+ }.bind(this));
+ },
+
+ setAllRead: function() {
+ this.forEach(function(model) { model.setRead(); });
+ },
+
+ setRead: function(guid) {
+ this.find(function(model) { return model.guid === guid; }).setRead();
+ },
+
+ setUnread: function(guid) {
+ this.find(function(model) { return model.guid === guid; }).setUnread();
+ },
+
+ onChangedUnreadStatus: function(model) {
+ if (model.get("unread") === true) {
+ this.unreadCount++;
+ this.unreadCountByType[model.get("type")]++;
+ } else {
+ this.unreadCount = Math.max(this.unreadCount - 1, 0);
+ this.unreadCountByType[model.get("type")] = Math.max(this.unreadCountByType[model.get("type")] - 1, 0);
+ }
+ this.trigger("update");
+ }
+});
diff --git a/app/assets/javascripts/app/collections/reshares.js b/app/assets/javascripts/app/collections/reshares.js
index 1aee51053..ab7bb9173 100644
--- a/app/assets/javascripts/app/collections/reshares.js
+++ b/app/assets/javascripts/app/collections/reshares.js
@@ -2,6 +2,9 @@
app.collections.Reshares = Backbone.Collection.extend({
model: app.models.Reshare,
- url : "/reshares"
+
+ initialize: function(models, options) {
+ this.url = "/posts/" + options.post.id + "/reshares";
+ }
});
// @license-end
diff --git a/app/assets/javascripts/app/models/notification.js b/app/assets/javascripts/app/models/notification.js
new file mode 100644
index 000000000..b2e342116
--- /dev/null
+++ b/app/assets/javascripts/app/models/notification.js
@@ -0,0 +1,69 @@
+app.models.Notification = Backbone.Model.extend({
+ constructor: function(attributes, options) {
+ options = options || {};
+ options.parse = true;
+ Backbone.Model.apply(this, [attributes, options]);
+ this.guid = this.get("id");
+ },
+
+ /**
+ * Flattens the notification object returned by the server.
+ *
+ * The server returns an object that looks like:
+ *
+ * {
+ * "reshared": {
+ * "id": 45,
+ * "target_type": "Post",
+ * "target_id": 11,
+ * "recipient_id": 1,
+ * "unread": true,
+ * "created_at": "2015-10-27T19:56:30.000Z",
+ * "updated_at": "2015-10-27T19:56:30.000Z",
+ * "note_html": <html/>
+ * },
+ * "type": "reshared"
+ * }
+ *
+ * The returned object looks like:
+ *
+ * {
+ * "type": "reshared",
+ * "id": 45,
+ * "target_type": "Post",
+ * "target_id": 11,
+ * "recipient_id": 1,
+ * "unread": true,
+ * "created_at": "2015-10-27T19:56:30.000Z",
+ * "updated_at": "2015-10-27T19:56:30.000Z",
+ * "note_html": <html/>,
+ * }
+ */
+ parse: function(response) {
+ var result = {type: response.type};
+ result = $.extend(result, response[result.type]);
+ return result;
+ },
+
+ setRead: function() {
+ this.setUnreadStatus(false);
+ },
+
+ setUnread: function() {
+ this.setUnreadStatus(true);
+ },
+
+ setUnreadStatus: function(state) {
+ if (this.get("unread") !== state) {
+ $.ajax({
+ url: Routes.notification(this.guid),
+ /* eslint-disable camelcase */
+ data: {set_unread: state},
+ /* eslint-enable camelcase */
+ type: "PUT",
+ context: this,
+ success: function() { this.set("unread", state); }
+ });
+ }
+ }
+});
diff --git a/app/assets/javascripts/app/models/post/interactions.js b/app/assets/javascripts/app/models/post/interactions.js
index 28d6f3a57..3615387e2 100644
--- a/app/assets/javascripts/app/models/post/interactions.js
+++ b/app/assets/javascripts/app/models/post/interactions.js
@@ -70,9 +70,10 @@ app.models.Post.Interactions = Backbone.Model.extend({
self.post.set({participation: true});
self.trigger("change");
self.set({"likes_count" : self.get("likes_count") + 1});
+ self.likes.trigger("change");
},
- error: function() {
- app.flashMessages.error(Diaspora.I18n.t("failed_to_like"));
+ error: function(model, response) {
+ app.flashMessages.handleAjaxError(response);
}
});
@@ -84,23 +85,26 @@ app.models.Post.Interactions = Backbone.Model.extend({
this.userLike().destroy({success : function() {
self.trigger('change');
self.set({"likes_count" : self.get("likes_count") - 1});
+ self.likes.trigger("change");
}});
app.instrument("track", "Unlike");
},
- comment : function (text) {
+ comment: function(text, options) {
var self = this;
+ options = options || {};
- this.comments.make(text).fail(function () {
- app.flashMessages.error(Diaspora.I18n.t("failed_to_comment"));
+ this.comments.make(text).fail(function(response) {
+ app.flashMessages.handleAjaxError(response);
+ if (options.error) { options.error(); }
}).done(function() {
self.post.set({participation: true});
+ self.set({"comments_count": self.get("comments_count") + 1});
self.trigger('change'); //updates after sync
+ if (options.success) { options.success(); }
});
- this.trigger("change"); //updates count in an eager manner
-
app.instrument("track", "Comment");
},
@@ -116,9 +120,11 @@ app.models.Post.Interactions = Backbone.Model.extend({
app.stream.addNow(reshare);
}
interactions.trigger("change");
+ interactions.set({"reshares_count": interactions.get("reshares_count") + 1});
+ interactions.reshares.trigger("change");
})
- .fail(function(){
- app.flashMessages.error(Diaspora.I18n.t("reshares.duplicate"));
+ .fail(function(response) {
+ app.flashMessages.handleAjaxError(response);
});
app.instrument("track", "Reshare");
diff --git a/app/assets/javascripts/app/pages/contacts.js b/app/assets/javascripts/app/pages/contacts.js
index eca20fa33..f9bd2db27 100644
--- a/app/assets/javascripts/app/pages/contacts.js
+++ b/app/assets/javascripts/app/pages/contacts.js
@@ -79,6 +79,9 @@ app.pages.Contacts = Backbone.View.extend({
},
showMessageModal: function(){
+ $("#conversationModal").on("modal:loaded", function() {
+ new app.views.ConversationsForm({prefill: gon.conversationPrefill});
+ });
app.helpers.showModal("#conversationModal");
},
diff --git a/app/assets/javascripts/app/pages/profile.js b/app/assets/javascripts/app/pages/profile.js
index b987ea387..a2b814399 100644
--- a/app/assets/javascripts/app/pages/profile.js
+++ b/app/assets/javascripts/app/pages/profile.js
@@ -31,7 +31,6 @@ app.pages.Profile = app.views.Base.extend({
this.streamCollection = _.has(opts, "streamCollection") ? opts.streamCollection : null;
this.streamViewClass = _.has(opts, "streamView") ? opts.streamView : null;
- this.model.on("change", this.render, this);
this.model.on("sync", this._done, this);
// bind to global events
diff --git a/app/assets/javascripts/app/router.js b/app/assets/javascripts/app/router.js
index 1884bb880..ed8ec9d9a 100644
--- a/app/assets/javascripts/app/router.js
+++ b/app/assets/javascripts/app/router.js
@@ -139,7 +139,7 @@ app.Router = Backbone.Router.extend({
notifications: function() {
this._loadContacts();
this.renderAspectMembershipDropdowns($(document));
- new app.views.Notifications({el: "#notifications_container"});
+ new app.views.Notifications({el: "#notifications_container", collection: app.notificationsCollection});
},
peopleSearch: function() {
diff --git a/app/assets/javascripts/app/views/aspect_membership_view.js b/app/assets/javascripts/app/views/aspect_membership_view.js
index 238349e1d..34ba8bd77 100644
--- a/app/assets/javascripts/app/views/aspect_membership_view.js
+++ b/app/assets/javascripts/app/views/aspect_membership_view.js
@@ -125,7 +125,7 @@ app.views.AspectMembership = app.views.Base.extend({
_displayError: function(model, resp) {
this._done();
this.dropdown.closest(".aspect_membership_dropdown").removeClass("open"); // close the dropdown
- app.flashMessages.error(resp.responseText);
+ app.flashMessages.handleAjaxError(resp);
},
// remove the membership with the given id
@@ -134,7 +134,7 @@ app.views.AspectMembership = app.views.Base.extend({
this.listenToOnce(membership, "sync", this._successDestroyCb);
this.listenToOnce(membership, "error", this._displayError);
- return membership.destroy();
+ return membership.destroy({wait: true});
},
_successDestroyCb: function(aspectMembership) {
diff --git a/app/assets/javascripts/app/views/comment_stream_view.js b/app/assets/javascripts/app/views/comment_stream_view.js
index 0119b3329..05ba192db 100644
--- a/app/assets/javascripts/app/views/comment_stream_view.js
+++ b/app/assets/javascripts/app/views/comment_stream_view.js
@@ -25,6 +25,8 @@ app.views.CommentStream = app.views.Base.extend({
postRenderTemplate : function() {
this.model.comments.each(this.appendComment, this);
+ this.commentBox = this.$(".comment_box");
+ this.commentSubmitButton = this.$("input[name='commit']");
},
presenter: function(){
@@ -38,15 +40,35 @@ app.views.CommentStream = app.views.Base.extend({
createComment: function(evt) {
if(evt){ evt.preventDefault(); }
- var commentText = $.trim(this.$('.comment_box').val());
- this.$(".comment_box").val("");
- this.$(".comment_box").css("height", "");
- if(commentText) {
- this.model.comment(commentText);
- return this;
- } else {
- this.$(".comment_box").focus();
+ var commentText = $.trim(this.commentBox.val());
+ if (commentText === "") {
+ this.commentBox.focus();
+ return;
}
+
+ this.disableCommentBox();
+
+ this.model.comment(commentText, {
+ success: function() {
+ this.commentBox.val("");
+ this.enableCommentBox();
+ autosize.update(this.commentBox);
+ }.bind(this),
+ error: function() {
+ this.enableCommentBox();
+ this.commentBox.focus();
+ }.bind(this)
+ });
+ },
+
+ disableCommentBox: function() {
+ this.commentBox.prop("disabled", true);
+ this.commentSubmitButton.prop("disabled", true);
+ },
+
+ enableCommentBox: function() {
+ this.commentBox.removeAttr("disabled");
+ this.commentSubmitButton.removeAttr("disabled");
},
keyDownOnCommentBox: function(evt) {
@@ -104,10 +126,12 @@ app.views.CommentStream = app.views.Base.extend({
},
expandComments: function(evt){
+ this.$(".loading-comments").removeClass("hidden");
if(evt){ evt.preventDefault(); }
this.model.comments.fetch({
success: function() {
this.$("div.comment.show_comments").addClass("hidden");
+ this.$(".loading-comments").addClass("hidden");
}.bind(this)
});
}
diff --git a/app/assets/javascripts/app/views/conversations_form_view.js b/app/assets/javascripts/app/views/conversations_form_view.js
index bfdfe62fb..74f848de3 100644
--- a/app/assets/javascripts/app/views/conversations_form_view.js
+++ b/app/assets/javascripts/app/views/conversations_form_view.js
@@ -5,40 +5,83 @@ app.views.ConversationsForm = Backbone.View.extend({
events: {
"keydown .conversation-message-text": "keyDown",
+ "click .conversation-recipient-tag .remove": "removeRecipient"
},
initialize: function(opts) {
- this.contacts = _.has(opts, "contacts") ? opts.contacts : null;
- this.prefill = [];
- if (_.has(opts, "prefillName") && _.has(opts, "prefillValue")) {
- this.prefill = [{name: opts.prefillName, value: opts.prefillValue}];
+ opts = opts || {};
+ this.conversationRecipients = [];
+
+ this.typeaheadElement = this.$el.find("#contacts-search-input");
+ this.contactsIdsListInput = this.$el.find("#contact-ids");
+ this.tagListElement = this.$("#recipients-tag-list");
+
+ this.search = new app.views.SearchBase({
+ el: this.$el.find("#new-conversation"),
+ typeaheadInput: this.typeaheadElement,
+ customSearch: true,
+ autoselect: true,
+ remoteRoute: {url: "/contacts", extraParameters: "mutual=true"}
+ });
+
+ this.bindTypeaheadEvents();
+
+ this.tagListElement.empty();
+ if (opts.prefill) {
+ this.prefill(opts.prefill);
}
- this.prepareAutocomplete(this.contacts);
+
this.$("form#new-conversation").on("ajax:success", this.conversationCreateSuccess);
this.$("form#new-conversation").on("ajax:error", this.conversationCreateError);
},
- prepareAutocomplete: function(data){
- this.$("#contact-autocomplete").autoSuggest(data, {
- selectedItemProp: "name",
- searchObjProps: "name",
- asHtmlID: "contact_ids",
- retrieveLimit: 10,
- minChars: 1,
- keyDelay: 0,
- startText: '',
- emptyText: Diaspora.I18n.t("no_results"),
- preFill: this.prefill
- });
- $("#contact_ids").attr("aria-labelledby", "toLabel").focus();
+ addRecipient: function(person) {
+ this.conversationRecipients.push(person);
+ this.updateContactIdsListInput();
+ /* eslint-disable camelcase */
+ this.tagListElement.append(HandlebarsTemplates.conversation_recipient_tag_tpl(person));
+ /* eslint-enable camelcase */
+ },
+
+ prefill: function(handles) {
+ handles.forEach(this.addRecipient.bind(this));
+ },
+
+ updateContactIdsListInput: function() {
+ this.contactsIdsListInput.val(_(this.conversationRecipients).pluck("id").join(","));
+ this.search.ignoreDiasporaIds.length = 0;
+ this.conversationRecipients.forEach(this.search.ignorePersonForSuggestions.bind(this.search));
+ },
+
+ bindTypeaheadEvents: function() {
+ this.typeaheadElement.on("typeahead:select", function(evt, person) {
+ this.onSuggestionSelection(person);
+ }.bind(this));
+ },
+
+ onSuggestionSelection: function(person) {
+ this.addRecipient(person);
+ this.typeaheadElement.typeahead("val", "");
},
- keyDown : function(evt) {
- if(evt.which === Keycodes.ENTER && evt.ctrlKey) {
+ keyDown: function(evt) {
+ if (evt.which === Keycodes.ENTER && evt.ctrlKey) {
$(evt.target).parents("form").submit();
}
},
+ removeRecipient: function(evt) {
+ var $recipientTagEl = $(evt.target).parents(".conversation-recipient-tag");
+ var diasporaHandle = $recipientTagEl.data("diaspora-handle");
+
+ this.conversationRecipients = this.conversationRecipients.filter(function(person) {
+ return diasporaHandle !== person.handle;
+ });
+
+ this.updateContactIdsListInput();
+ $recipientTagEl.remove();
+ },
+
conversationCreateSuccess: function(evt, data) {
app._changeLocation(Routes.conversation(data.id));
},
diff --git a/app/assets/javascripts/app/views/conversations_inbox_view.js b/app/assets/javascripts/app/views/conversations_inbox_view.js
index 97e31f5c3..4e301a8a0 100644
--- a/app/assets/javascripts/app/views/conversations_inbox_view.js
+++ b/app/assets/javascripts/app/views/conversations_inbox_view.js
@@ -9,7 +9,7 @@ app.views.ConversationsInbox = Backbone.View.extend({
},
initialize: function() {
- new app.views.ConversationsForm({contacts: gon.contacts});
+ new app.views.ConversationsForm();
this.setupConversation();
},
diff --git a/app/assets/javascripts/app/views/flash_messages_view.js b/app/assets/javascripts/app/views/flash_messages_view.js
index cb5b214b2..b5c2286d6 100644
--- a/app/assets/javascripts/app/views/flash_messages_view.js
+++ b/app/assets/javascripts/app/views/flash_messages_view.js
@@ -16,5 +16,13 @@ app.views.FlashMessages = app.views.Base.extend({
error: function(message){
this._flash(message, true);
+ },
+
+ handleAjaxError: function(response) {
+ if (response.status === 0) {
+ this.error(Diaspora.I18n.t("errors.connection"));
+ } else {
+ this.error(response.responseText);
+ }
}
});
diff --git a/app/assets/javascripts/app/views/header_view.js b/app/assets/javascripts/app/views/header_view.js
index 5b682c3b3..496cd83d3 100644
--- a/app/assets/javascripts/app/views/header_view.js
+++ b/app/assets/javascripts/app/views/header_view.js
@@ -12,12 +12,12 @@ app.views.Header = app.views.Base.extend({
});
},
- postRenderTemplate: function(){
- new app.views.Notifications({ el: "#notification-dropdown" });
- this.notificationDropdown = new app.views.NotificationDropdown({ el: "#notification-dropdown" });
- new app.views.Search({ el: "#header-search-form" });
+ postRenderTemplate: function() {
+ new app.views.Notifications({el: "#notification-dropdown", collection: app.notificationsCollection});
+ new app.views.NotificationDropdown({el: "#notification-dropdown", collection: app.notificationsCollection});
+ new app.views.Search({el: "#header-search-form"});
},
- menuElement: function(){ return this.$("ul.dropdown"); },
+ menuElement: function() { return this.$("ul.dropdown"); }
});
// @license-end
diff --git a/app/assets/javascripts/app/views/likes_info_view.js b/app/assets/javascripts/app/views/likes_info_view.js
index 9300ac9ad..d511c2ef9 100644
--- a/app/assets/javascripts/app/views/likes_info_view.js
+++ b/app/assets/javascripts/app/views/likes_info_view.js
@@ -11,7 +11,7 @@ app.views.LikesInfo = app.views.Base.extend({
tooltipSelector : ".avatar",
initialize : function() {
- this.model.interactions.bind('change', this.render, this);
+ this.model.interactions.likes.on("change", this.render, this);
this.displayAvatars = false;
},
@@ -19,18 +19,16 @@ app.views.LikesInfo = app.views.Base.extend({
return _.extend(this.defaultPresenter(), {
likes : this.model.interactions.likes.toJSON(),
likesCount : this.model.interactions.likesCount(),
- displayAvatars : this.model.interactions.get("fetched") && this.displayAvatars
+ displayAvatars: this.displayAvatars
});
},
showAvatars : function(evt){
if(evt) { evt.preventDefault() }
this.displayAvatars = true;
- if(!this.model.interactions.get("fetched")){
- this.model.interactions.fetch();
- } else {
- this.model.interactions.trigger("change");
- }
+ this.model.interactions.likes.fetch({success: function() {
+ this.model.interactions.likes.trigger("change");
+ }.bind(this)});
}
});
// @license-end
diff --git a/app/assets/javascripts/app/views/notification_dropdown_view.js b/app/assets/javascripts/app/views/notification_dropdown_view.js
index a44556c9a..a72f1e8f1 100644
--- a/app/assets/javascripts/app/views/notification_dropdown_view.js
+++ b/app/assets/javascripts/app/views/notification_dropdown_view.js
@@ -6,16 +6,21 @@ app.views.NotificationDropdown = app.views.Base.extend({
},
initialize: function(){
- $(document.body).click($.proxy(this.hideDropdown, this));
+ $(document.body).click(this.hideDropdown.bind(this));
- this.notifications = [];
- this.perPage = 5;
- this.hasMoreNotifs = true;
this.badge = this.$el;
this.dropdown = $("#notification-dropdown");
this.dropdownNotifications = this.dropdown.find(".notifications");
this.ajaxLoader = this.dropdown.find(".ajax-loader");
this.perfectScrollbarInitialized = false;
+ this.dropdownNotifications.scroll(this.dropdownScroll.bind(this));
+ this.bindCollectionEvents();
+ },
+
+ bindCollectionEvents: function() {
+ this.collection.on("pushFront", this.onPushFront.bind(this));
+ this.collection.on("pushBack", this.onPushBack.bind(this));
+ this.collection.on("finishedLoading", this.finishLoading.bind(this));
},
toggleDropdown: function(evt){
@@ -31,12 +36,11 @@ app.views.NotificationDropdown = app.views.Base.extend({
},
showDropdown: function(){
- this.resetParams();
this.ajaxLoader.show();
this.dropdown.addClass("dropdown-open");
this.updateScrollbar();
this.dropdownNotifications.addClass("loading");
- this.getNotifications();
+ this.collection.fetch();
},
hideDropdown: function(evt){
@@ -50,40 +54,18 @@ app.views.NotificationDropdown = app.views.Base.extend({
dropdownScroll: function(){
var isLoading = ($(".loading").length === 1);
- if (this.isBottom() && this.hasMoreNotifs && !isLoading){
+ if (this.isBottom() && !isLoading) {
this.dropdownNotifications.addClass("loading");
- this.getNotifications();
+ this.collection.fetchMore();
}
},
- getParams: function(){
- if(this.notifications.length === 0){ return{ per_page: 10, page: 1 }; }
- else{ return{ per_page: this.perPage, page: this.nextPage }; }
- },
-
- resetParams: function(){
- this.notifications.length = 0;
- this.hasMoreNotifs = true;
- delete this.nextPage;
- },
-
isBottom: function(){
var bottom = this.dropdownNotifications.prop("scrollHeight") - this.dropdownNotifications.height();
var currentPosition = this.dropdownNotifications.scrollTop();
return currentPosition + 50 >= bottom;
},
- getNotifications: function(){
- var self = this;
- $.getJSON(Routes.notifications(this.getParams()), function(notifications){
- $.each(notifications, function(){ self.notifications.push(this); });
- self.hasMoreNotifs = notifications.length >= self.perPage;
- if(self.nextPage){ self.nextPage++; }
- else { self.nextPage = 3; }
- self.renderNotifications();
- });
- },
-
hideAjaxLoader: function(){
var self = this;
this.ajaxLoader.find(".spinner").fadeTo(200, 0, function(){
@@ -93,28 +75,23 @@ app.views.NotificationDropdown = app.views.Base.extend({
});
},
- renderNotifications: function(){
- var self = this;
- this.dropdownNotifications.find(".media.stream-element").remove();
- $.each(self.notifications, function(index, notifications){
- $.each(notifications, function(index, notification){
- if($.inArray(notification, notifications) === -1){
- var node = self.dropdownNotifications.append(notification.note_html);
- $(node).find(".unread-toggle .entypo-eye").tooltip("destroy").tooltip();
- $(node).find(self.avatars.selector).error(self.avatars.fallback);
- }
- });
- });
+ onPushBack: function(notification) {
+ var node = this.dropdownNotifications.append(notification.get("note_html"));
+ $(node).find(".unread-toggle .entypo-eye").tooltip("destroy").tooltip();
+ $(node).find(this.avatars.selector).error(this.avatars.fallback);
+ },
- this.hideAjaxLoader();
+ onPushFront: function(notification) {
+ var node = this.dropdownNotifications.prepend(notification.get("note_html"));
+ $(node).find(".unread-toggle .entypo-eye").tooltip("destroy").tooltip();
+ $(node).find(this.avatars.selector).error(this.avatars.fallback);
+ },
+ finishLoading: function() {
app.helpers.timeago(this.dropdownNotifications);
-
this.updateScrollbar();
+ this.hideAjaxLoader();
this.dropdownNotifications.removeClass("loading");
- this.dropdownNotifications.scroll(function(){
- self.dropdownScroll();
- });
},
updateScrollbar: function() {
diff --git a/app/assets/javascripts/app/views/notifications_view.js b/app/assets/javascripts/app/views/notifications_view.js
index 08400742e..3ae156348 100644
--- a/app/assets/javascripts/app/views/notifications_view.js
+++ b/app/assets/javascripts/app/views/notifications_view.js
@@ -1,96 +1,85 @@
// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
app.views.Notifications = Backbone.View.extend({
-
events: {
- "click .unread-toggle" : "toggleUnread",
- "click #mark_all_read_link": "markAllRead"
+ "click .unread-toggle": "toggleUnread",
+ "click #mark-all-read-link": "markAllRead"
},
initialize: function() {
$(".unread-toggle .entypo-eye").tooltip();
app.helpers.timeago($(document));
+ this.bindCollectionEvents();
+ },
+
+ bindCollectionEvents: function() {
+ this.collection.on("change", this.onChangedUnreadStatus.bind(this));
+ this.collection.on("update", this.updateView.bind(this));
},
toggleUnread: function(evt) {
var note = $(evt.target).closest(".stream-element");
var unread = note.hasClass("unread");
var guid = note.data("guid");
- if (unread){ this.setRead(guid); }
- else { this.setUnread(guid); }
- },
-
- getAllUnread: function() { return $(".media.stream-element.unread"); },
-
- setRead: function(guid) { this.setUnreadStatus(guid, false); },
-
- setUnread: function(guid){ this.setUnreadStatus(guid, true); },
-
- setUnreadStatus: function(guid, state){
- $.ajax({
- url: "/notifications/" + guid,
- data: { set_unread: state },
- type: "PUT",
- context: this,
- success: this.clickSuccess
- });
+ if (unread) {
+ this.collection.setRead(guid);
+ } else {
+ this.collection.setUnread(guid);
+ }
},
- clickSuccess: function(data) {
- var guid = data.guid;
- var type = $(".stream-element[data-guid=" + guid + "]").data("type");
- this.updateView(guid, type, data.unread);
+ markAllRead: function() {
+ this.collection.setAllRead();
},
- markAllRead: function(evt){
- if(evt) { evt.preventDefault(); }
- var self = this;
- this.getAllUnread().each(function(i, el){
- self.setRead($(el).data("guid"));
- });
+ onChangedUnreadStatus: function(model) {
+ var unread = model.get("unread");
+ var translationKey = unread ? "notifications.mark_read" : "notifications.mark_unread";
+ var note = $(".stream-element[data-guid=" + model.guid + "]");
+
+ note.find(".entypo-eye")
+ .tooltip("destroy")
+ .removeAttr("data-original-title")
+ .attr("title", Diaspora.I18n.t(translationKey))
+ .tooltip();
+
+ if (unread) {
+ note.removeClass("read").addClass("unread");
+ } else {
+ note.removeClass("unread").addClass("read");
+ }
},
- updateView: function(guid, type, unread) {
- var change = unread ? 1 : -1,
- allNotes = $("#notifications_container .list-group > a:eq(0) .badge"),
- typeNotes = $("#notifications_container .list-group > a[data-type=" + type + "] .badge"),
- headerBadge = $(".notifications-link .badge"),
- note = $(".notifications .stream-element[data-guid=" + guid + "]"),
- markAllReadLink = $("a#mark_all_read_link"),
- translationKey = unread ? "notifications.mark_read" : "notifications.mark_unread";
+ updateView: function() {
+ var notificationsContainer = $("#notifications_container");
- if(unread){ note.removeClass("read").addClass("unread"); }
- else { note.removeClass("unread").addClass("read"); }
+ // update notification counts in the sidebar
+ Object.keys(this.collection.unreadCountByType).forEach(function(notificationType) {
+ var count = this.collection.unreadCountByType[notificationType];
+ this.updateBadge(notificationsContainer.find("a[data-type=" + notificationType + "] .badge"), count);
+ }.bind(this));
- $(".unread-toggle .entypo-eye", note)
- .tooltip("destroy")
- .removeAttr("data-original-title")
- .attr("title",Diaspora.I18n.t(translationKey))
- .tooltip();
+ this.updateBadge(notificationsContainer.find("a[data-type=all] .badge"), this.collection.unreadCount);
- [allNotes, typeNotes, headerBadge].forEach(function(element){
- element.text(function(i, text){
- return parseInt(text) + change;
- });
- });
+ // update notification count in the header
+ this.updateBadge($(".notifications-link .badge"), this.collection.unreadCount);
- [allNotes, typeNotes].forEach(function(badge) {
- if(badge.text() > 0) {
- badge.removeClass("hidden");
- }
- else {
- badge.addClass("hidden");
- }
- });
+ var markAllReadLink = $("a#mark-all-read-link");
- if(headerBadge.text() > 0){
- headerBadge.removeClass("hidden");
+ if (this.collection.unreadCount > 0) {
markAllReadLink.removeClass("disabled");
- }
- else{
- headerBadge.addClass("hidden");
+ } else {
markAllReadLink.addClass("disabled");
}
+ },
+
+ updateBadge: function(badge, count) {
+ badge.text(count);
+ if (count > 0) {
+ badge.removeClass("hidden");
+ } else {
+ badge.addClass("hidden");
+ }
}
});
// @license-end
diff --git a/app/assets/javascripts/app/views/profile_header_view.js b/app/assets/javascripts/app/views/profile_header_view.js
index 906736895..1522b71e4 100644
--- a/app/assets/javascripts/app/views/profile_header_view.js
+++ b/app/assets/javascripts/app/views/profile_header_view.js
@@ -15,6 +15,7 @@ app.views.ProfileHeader = app.views.Base.extend({
initialize: function(opts) {
this.photos = _.has(opts, 'photos') ? opts.photos : null;
this.contacts = _.has(opts, 'contacts') ? opts.contacts : null;
+ this.model.on("change", this.render, this);
$("#mentionModal").on("modal:loaded", this.mentionModalLoaded.bind(this));
$("#mentionModal").on("hidden.bs.modal", this.mentionModalHidden);
},
@@ -79,8 +80,11 @@ app.views.ProfileHeader = app.views.Base.extend({
},
showMessageModal: function(){
+ $("#conversationModal").on("modal:loaded", function() {
+ new app.views.ConversationsForm({prefill: gon.conversationPrefill});
+ });
app.helpers.showModal("#conversationModal");
- },
+ }
});
// @license-end
diff --git a/app/assets/javascripts/app/views/publisher/mention_view.js b/app/assets/javascripts/app/views/publisher/mention_view.js
index 75c0015ea..86b3b07aa 100644
--- a/app/assets/javascripts/app/views/publisher/mention_view.js
+++ b/app/assets/javascripts/app/views/publisher/mention_view.js
@@ -32,7 +32,7 @@ app.views.PublisherMention = app.views.SearchBase.extend({
typeaheadInput: this.typeaheadInput,
customSearch: true,
autoselect: true,
- remoteRoute: "/contacts"
+ remoteRoute: {url: "/contacts"}
});
},
diff --git a/app/assets/javascripts/app/views/reshares_info_view.js b/app/assets/javascripts/app/views/reshares_info_view.js
index b91027e84..a1d985dd4 100644
--- a/app/assets/javascripts/app/views/reshares_info_view.js
+++ b/app/assets/javascripts/app/views/reshares_info_view.js
@@ -11,7 +11,7 @@ app.views.ResharesInfo = app.views.Base.extend({
tooltipSelector : ".avatar",
initialize : function() {
- this.model.interactions.bind("change", this.render, this);
+ this.model.interactions.reshares.bind("change", this.render, this);
this.displayAvatars = false;
},
@@ -19,18 +19,16 @@ app.views.ResharesInfo = app.views.Base.extend({
return _.extend(this.defaultPresenter(), {
reshares : this.model.interactions.reshares.toJSON(),
resharesCount : this.model.interactions.resharesCount(),
- displayAvatars : this.model.interactions.get("fetched") && this.displayAvatars
+ displayAvatars: this.displayAvatars
});
},
showAvatars : function(evt){
if(evt) { evt.preventDefault() }
this.displayAvatars = true;
- if(!this.model.interactions.get("fetched")){
- this.model.interactions.fetch();
- } else {
- this.model.interactions.trigger("change");
- }
+ this.model.interactions.reshares.fetch({success: function() {
+ this.model.interactions.reshares.trigger("change");
+ }.bind(this)});
}
});
// @license-end
diff --git a/app/assets/javascripts/app/views/search_base_view.js b/app/assets/javascripts/app/views/search_base_view.js
index 44277b851..eb00aaeaa 100644
--- a/app/assets/javascripts/app/views/search_base_view.js
+++ b/app/assets/javascripts/app/views/search_base_view.js
@@ -28,9 +28,13 @@ app.views.SearchBase = app.views.Base.extend({
};
// Allow bloodhound to look for remote results if there is a route given in the options
- if(options.remoteRoute) {
+ if (options.remoteRoute && options.remoteRoute.url) {
+ var extraParameters = "";
+ if (options.remoteRoute.extraParameters) {
+ extraParameters += "&" + options.remoteRoute.extraParameters;
+ }
bloodhoundOptions.remote = {
- url: options.remoteRoute + ".json?q=%QUERY",
+ url: options.remoteRoute.url + ".json?q=%QUERY" + extraParameters,
wildcard: "%QUERY",
transform: this.transformBloodhoundResponse.bind(this)
};
diff --git a/app/assets/javascripts/app/views/search_view.js b/app/assets/javascripts/app/views/search_view.js
index b2486659b..c0d8ec749 100644
--- a/app/assets/javascripts/app/views/search_view.js
+++ b/app/assets/javascripts/app/views/search_view.js
@@ -10,7 +10,7 @@ app.views.Search = app.views.SearchBase.extend({
this.searchInput = this.$("#q");
app.views.SearchBase.prototype.initialize.call(this, {
typeaheadInput: this.searchInput,
- remoteRoute: this.$el.attr("action"),
+ remoteRoute: {url: this.$el.attr("action")},
suggestionLink: true
});
this.searchInput.on("typeahead:select", this.suggestionSelected);
diff --git a/app/assets/javascripts/app/views/tags_view.js b/app/assets/javascripts/app/views/tags_view.js
index 3913f8798..9b70df1e6 100644
--- a/app/assets/javascripts/app/views/tags_view.js
+++ b/app/assets/javascripts/app/views/tags_view.js
@@ -5,6 +5,8 @@ app.views.Tags = Backbone.View.extend({
if(app.publisher) {
app.publisher.setText("#"+ opts.hashtagName + " ");
}
+ // add avatar fallback if it can't be loaded
+ $(app.views.Base.prototype.avatars.selector).error(app.views.Base.prototype.avatars.fallback);
}
});
// @license-end
diff --git a/app/assets/javascripts/helpers/browser_notification.js b/app/assets/javascripts/helpers/browser_notification.js
new file mode 100644
index 000000000..e8c8b7d8f
--- /dev/null
+++ b/app/assets/javascripts/helpers/browser_notification.js
@@ -0,0 +1,22 @@
+Diaspora.BrowserNotification = {
+ requestPermission: function() {
+ if ("Notification" in window && Notification.permission !== "granted" && Notification.permission !== "denied") {
+ Notification.requestPermission();
+ }
+ },
+
+ spawnNotification: function(title, summary) {
+ if ("Notification" in window && Notification.permission === "granted") {
+ if (!_.isString(title)) {
+ throw new Error("No notification title given.");
+ }
+
+ summary = summary || "";
+
+ new Notification(title, {
+ body: summary,
+ icon: ImagePaths.get("branding/logos/asterisk_white_mobile.png")
+ });
+ }
+ }
+};
diff --git a/app/assets/javascripts/helpers/i18n.js b/app/assets/javascripts/helpers/i18n.js
index 42bd7a886..e6db0f2e1 100644
--- a/app/assets/javascripts/helpers/i18n.js
+++ b/app/assets/javascripts/helpers/i18n.js
@@ -18,7 +18,7 @@ Diaspora.I18n = {
},
updateLocale: function(locale, data) {
- locale.data = $.extend(locale.data, data);
+ locale.data = $.extend({}, locale.data, data);
var rule = locale.data.pluralization_rule;
if (typeof rule !== "undefined") {
diff --git a/app/assets/javascripts/jsxc.js b/app/assets/javascripts/jsxc.js
index 9209fd7bf..9e90634ca 100644
--- a/app/assets/javascripts/jsxc.js
+++ b/app/assets/javascripts/jsxc.js
@@ -12,7 +12,7 @@
// initialize jsxc xmpp client
$(document).ready(function() {
if (app.currentUser.authenticated()) {
- $.post('api/v1/tokens', null, function(data) {
+ $.post("/user/auth_token", null, function(data) {
if (jsxc && data['token']) {
var jid = app.currentUser.get('diaspora_id');
jsxc.init({
diff --git a/app/assets/javascripts/main.js b/app/assets/javascripts/main.js
index 1d1390820..36541f536 100644
--- a/app/assets/javascripts/main.js
+++ b/app/assets/javascripts/main.js
@@ -30,7 +30,7 @@
//= require markdown-it-sup
//= require highlightjs
//= require clear-form
-//= require typeahead.bundle.js
+//= require corejs-typeahead
//= require app/app
//= require diaspora
//= require_tree ./helpers
diff --git a/app/assets/javascripts/mobile/mobile_post_actions.js b/app/assets/javascripts/mobile/mobile_post_actions.js
index 6f7c18ee6..56df0e533 100644
--- a/app/assets/javascripts/mobile/mobile_post_actions.js
+++ b/app/assets/javascripts/mobile/mobile_post_actions.js
@@ -98,8 +98,12 @@
success: function() {
Diaspora.Mobile.PostActions.toggleActive(link);
},
- error: function() {
- alert(Diaspora.I18n.t("failed_to_reshare"));
+ error: function(response) {
+ if (response.status === 0) {
+ alert(Diaspora.I18n.t("errors.connection"));
+ } else {
+ alert(response.responseText);
+ }
},
complete: function() {
Diaspora.Mobile.PostActions.hideLoader(link);
diff --git a/app/assets/stylesheets/bootstrap-variables.scss b/app/assets/stylesheets/bootstrap-variables.scss
index bca512cff..c8d8f634c 100644
--- a/app/assets/stylesheets/bootstrap-variables.scss
+++ b/app/assets/stylesheets/bootstrap-variables.scss
@@ -187,9 +187,9 @@ $btn-success-color: #333 !default;
// $input-bg-disabled: $gray-lighter
//** Text color for `<input>`s
-// $input-color: $gray
+$input-color: $text-dark-grey !default;
//** `<input>` border color
-// $input-border: #ccc
+$input-border: $border-grey !default;
// TODO: Rename `$input-border-radius` to `$input-border-radius-base` in v4
//** Default `.form-control` border radius
@@ -202,6 +202,7 @@ $btn-success-color: #333 !default;
//** Border color for inputs on focus
// $input-border-focus: #66afe9
+$input-border-focus: $input-border !default;
//** Placeholder text color
// $input-color-placeholder: #999
@@ -668,7 +669,7 @@ $navbar-collapse-max-height: 480px;
//
//##
//** Background color on `.list-group-item`
-$list-group-bg: $white;
+$list-group-bg: $white !default;
//** `.list-group-item` border color
$list-group-border: transparent;
//** List group border radius
diff --git a/app/assets/stylesheets/color-variables.scss b/app/assets/stylesheets/color-variables.scss
index d3862a09d..40acec470 100644
--- a/app/assets/stylesheets/color-variables.scss
+++ b/app/assets/stylesheets/color-variables.scss
@@ -3,31 +3,32 @@ $black: #000;
$text-grey: #999;
$text-dark-grey: #666;
-$text: #333;
+$text-color-pale: $text-grey !default;
+$text-color-active: $black !default;
-$background-white: $white;
-$background-grey: #eee;
-$background-blue: #e7f2f7;
+$background-grey: #eee !default;
+$background-blue: #e7f2f7 !default;
$grey: #2b2b2b;
$medium-gray: #ccc;
$light-grey: #ddd;
-$border-grey: $light-grey;
-$border-medium-grey: $medium-gray;
-$border-dark-grey: $text-grey;
-$border-medium-grey: #ccc;
+$border-grey: $light-grey !default;
+$border-medium-grey: $medium-gray !default;
+$border-dark-grey: $text-grey !default;
$link-grey: #777;
-$link-disabled-grey: $text-grey;
-$green: #8ede3d;
+$icon-color: $black !default;
+
+$green: #8ede3d !default;
$light-green: lighten($green, 20%);
-$red: #a80000;
-$blue: #3f8fba;
+$red: #a80000 !default;
+$blue: #3f8fba !default;
-$main-background: #f0f0f0 !default;
-$sidebars-background: $background-white !default;
-$left-navbar-drawer-background: darken($sidebars-background, 6%);
+$main-background: darken($white, 6%) !default;
+$framed-background: $white !default;
+$left-navbar-drawer-background: darken($white, 6%) !default;
+$hovercard-background: $white !default;
$card-shadow: 0 1px 2px 0 rgba(0, 0, 0, .16), 0 2px 10px 0 rgba(0, 0, 0, .12) !default;
diff --git a/app/assets/stylesheets/color_themes/_color_theme_override_dark.scss b/app/assets/stylesheets/color_themes/_color_theme_override_dark.scss
new file mode 100644
index 000000000..1719460f9
--- /dev/null
+++ b/app/assets/stylesheets/color_themes/_color_theme_override_dark.scss
@@ -0,0 +1,170 @@
+// Only overriding existing selectors here, so disable some lint rules
+// scss-lint:disable IdSelector, SelectorFormat, NestingDepth, SelectorDepth, QualifyingElement
+body {
+ .navbar.navbar-fixed-top #user_menu .dropdown-menu > li > a {
+ color: $text-color;
+ &:hover { color: $white; }
+ }
+
+ .publisher {
+ .mentions-input-box { background-color: $gray; }
+ form {
+ #publisher_textarea_wrapper { background-color: $gray; }
+ .btn.btn-link.question_mark:hover .entypo-cog { color: $gray-light; }
+ }
+
+ .write-preview-tabs > li.active * { color: $text-color; }
+ .md-preview { background-color: $gray; }
+ .md-cancel:hover .entypo-cross { color: $gray-light; }
+ .publisher-buttonbar .btn.btn-link:hover i { color: $gray-light; }
+ }
+
+ .aspect_dropdown li a .text { color: $dropdown-link-color; }
+
+ .info .tag { background-color: $gray-light; }
+
+ .poll_form .progress {
+ background-color: $gray-dark;
+ .bar { background-color: $gray-light; }
+ }
+
+ .stream-element .collapsible {
+ .markdown-content hr { border-top: 1px solid $hr-border; }
+ .expander {
+ @include linear-gradient(transparent, $gray-light, 0%, 95%);
+ border-bottom: 2px solid $gray-light;
+ color: $text-color;
+ text-shadow: 0 0 7px $black;
+ }
+ }
+
+ code,
+ pre {
+ background-color: $gray-dark;
+ border: 1px solid $border-medium-grey;
+ color: $text-color;
+ }
+
+ pre code { border: 0; }
+
+ @import 'highlightjs/darcula';
+
+ #single-post-content .head {
+ #post-info .author { color: lighten($gray-lighter, 27%); }
+ #single-post-actions i.entypo-heart.red:hover { color: $red; }
+ }
+
+ .opengraph a { color: lighten($gray-lighter, 27%); }
+
+ .tag:hover { background-color: desaturate(darken($blue, 35%), 20%); }
+
+ #profile_container .profile_header {
+ #author_info #sharing_message.entypo-check { color: lighten($green, 10%); }
+ }
+
+ #invitationsModal #email_invitation { border-top: 1px dashed $gray-light; }
+
+ #contacts_container #people_stream.contacts .stream-element.in_aspect {
+ background-color: $state-success-bg;
+ border-left: 3px solid darken($state-success-bg, 10%);
+ }
+
+ .left-navbar #tags_list {
+ .as-list {
+ color: $text-color;
+
+ em {
+ background-color: lighten($background-blue, 10%);
+ color: $text-color;
+ }
+ }
+
+ .as-result-item.active { color: $text-color; }
+ }
+
+ #faq .question {
+ background-color: $gray-dark;
+ a.toggle { color: $gray-lighter; }
+ &.collapsed { border: 2px solid $gray-dark; }
+ &.opened {
+ border: 2px solid darken($green, 10%);
+ h4 { background-color: darken($green, 10%); }
+ }
+
+ .answer { background-color: $gray; }
+ }
+
+ #welcome-to-diaspora { background: $orange; }
+
+ .block-form fieldset .form-control:focus { border-color: $input-border; }
+
+ &.page-registrations.action-new,
+ &.page-registrations.action-create {
+ .ball { filter: invert(100%); }
+ }
+
+ .spinner { border-color: $gray-light transparent $gray-light $gray-light; }
+
+ // AutoSuggest CSS
+ ul.as-selections {
+ background-color: $framed-background;
+
+ li.as-selection-item,
+ li.as-selection-item.blur {
+ background-color: $gray-dark;
+ border: 1px solid $gray-darker;
+ box-shadow: 0 1px 1px $gray-darker;
+ color: $text-color;
+ text-shadow: 0 1px 1px $gray-darker;
+ }
+
+ li.as-selection-item a.as-close,
+ li.as-selection-item.blur a.as-close {
+ color: $text-color;
+ text-shadow: 0 1px 1px $gray-darker;
+ }
+
+ li:hover.as-selection-item {
+ background-color: $light-blue;
+ border-color: $brand-primary;
+ color: $white;
+ a.as-close { color: $gray-light; }
+ }
+
+ li.as-selection-item.selected { border-color: $brand-primary; }
+ li.as-selection-item a:hover.as-close { color: $white; }
+ li.as-selection-item a:active.as-close { color: $gray-lighter; }
+ }
+
+ ul.as-list {
+ background-color: $gray-dark;
+ box-shadow: 0 2px 12px $gray-light;
+ color: $text-color;
+ }
+
+ li.as-result-item,
+ li.as-message {
+ border: 1px solid $gray-dark;
+ }
+
+ li.as-result-item.active {
+ background-color: $brand-primary;
+ border-color: $brand-primary;
+ text-shadow: none;
+
+ em { background: darken($brand-primary, 10%); }
+ }
+ // End AutoSuggest CSS
+
+ // Bootstrap Switch CSS
+ .bootstrap-switch {
+ border-color: $border-grey;
+ .bootstrap-switch-label { background: $framed-background; }
+ .bootstrap-switch-handle-on.bootstrap-switch-default,
+ .bootstrap-switch-handle-off.bootstrap-switch-default {
+ background: $gray-dark;
+ color: $text-color;
+ }
+ }
+ // End Bootstrap Switch CSS
+}
diff --git a/app/assets/stylesheets/color_themes/_color_theme_override_origwhite.scss b/app/assets/stylesheets/color_themes/_color_theme_override_origwhite.scss
index c8e7fe62f..1d218888a 100644
--- a/app/assets/stylesheets/color_themes/_color_theme_override_origwhite.scss
+++ b/app/assets/stylesheets/color_themes/_color_theme_override_origwhite.scss
@@ -17,10 +17,4 @@ body {
.left-navbar {
border-right: 1px solid $border-grey;
}
-
- .right-sidebar-fixed-background,
- .right-sidebar-fixed-background,
- .rightbar {
- border-left: 1px solid $sidebars-background;
- }
}
diff --git a/app/assets/stylesheets/color_themes/dark/_style.scss b/app/assets/stylesheets/color_themes/dark/_style.scss
new file mode 100644
index 000000000..1078d86bc
--- /dev/null
+++ b/app/assets/stylesheets/color_themes/dark/_style.scss
@@ -0,0 +1,153 @@
+// Main color(s)
+$white: #fff;
+$black: #000;
+
+$gray-base: $black;
+$gray-darker: lighten($gray-base, 6%);
+$gray-dark: lighten($gray-base, 9.5%);
+$gray: lighten($gray-base, 13.5%);
+$gray-light: lighten($gray-base, 28%);
+$gray-lighter: lighten($gray-base, 58%);
+
+$green: #346535;
+$red: #622;
+$blue: #4183c4;
+$yellow: #645a1b;
+$orange: #664100;
+
+$light-blue: lighten($blue, 5%);
+
+$brand-primary: darken($blue, 5%);
+$brand-success: $green;
+$brand-info: darken(adjust-hue($brand-primary, -30), 15%);
+$brand-danger: lighten($red, 10%);
+
+// Bootstrap Variables
+//== Scaffolding
+$body-bg: $gray;
+$text-color: lighten($gray-lighter, 17%);
+$link-color: $blue;
+
+//== Tables
+$table-bg-accent: $gray-dark;
+$table-border-color: $gray-light;
+
+//== Buttons
+$btn-default-color: $gray-lighter;
+$btn-default-bg: $gray-light;
+$btn-default-border: $gray-darker;
+
+$btn-success-color: $white;
+
+//== Forms
+$input-bg: $gray-dark;
+
+$input-color: $text-color;
+$input-border: $gray-light;
+$input-border-focus: $brand-primary;
+
+$input-color-placeholder: lighten($gray-light, 7%);
+
+$legend-color: $text-color;
+$legend-border-color: $gray-light;
+
+//== Dropdowns
+$dropdown-bg: lighten($gray-base, 15%);
+$dropdown-divider-bg: $gray-darker;
+$dropdown-link-color: $text-color;
+$dropdown-link-hover-color: $dropdown-link-color;
+
+//== Navbar
+$navbar-inverse-bg: $gray-darker;
+$navbar-inverse-link-hover-color: $text-color;
+$navbar-inverse-brand-hover-color: $navbar-inverse-link-hover-color;
+
+//== Tabs
+$nav-tabs-active-link-hover-bg: $gray;
+$nav-tabs-active-link-hover-border-color: $gray-darker;
+
+//== Navs
+$nav-link-hover-bg: $gray-darker;
+
+//== Pagination
+$pagination-color: $light-blue;
+$pagination-bg: $gray-light;
+$pagination-border: $gray-darker;
+
+$pagination-hover-color: $gray-dark;
+$pagination-hover-bg: $light-blue;
+$pagination-hover-border: $pagination-border;
+
+$pagination-active-border: $pagination-border;
+
+$pagination-disabled-color: $gray-dark;
+$pagination-disabled-bg: $gray-light;
+$pagination-disabled-border: $pagination-border;
+
+//== Form states and alerts
+$state-success-text: lighten($green, 30%);
+$state-success-bg: darken($green, 10%);
+$state-success-border: darken($state-success-bg, 20%);
+
+$state-info-text: lighten($blue, 20%);
+$state-info-bg: darken($blue, 20%);
+$state-info-border: darken($state-info-bg, 20%);
+
+$state-warning-text: lighten($yellow, 30%);
+$state-warning-bg: $yellow;
+$state-warning-border: darken($state-warning-bg, 20%);
+
+$state-danger-text: lighten($red, 40%);
+$state-danger-bg: $red;
+$state-danger-border: darken($state-danger-bg, 20%);
+
+
+//== Popovers
+$popover-bg: lighten($gray, 5%);
+$popover-border-color: $gray-darker;
+
+//== Modals
+$modal-content-bg: $gray;
+$modal-header-border-color: $gray-light;
+
+//== List group
+$list-group-bg: $gray;
+$list-group-link-color: $text-color;
+
+//== Panels
+$panel-bg: $gray;
+$panel-default-text: $text-color;
+$panel-default-border: $gray-darker;
+$panel-default-heading-bg: $gray-dark;
+
+//== Thumbnails
+$thumbnail-border: $gray-darker;
+
+//== Wells
+$well-bg: $gray-dark;
+
+//== Close
+$close-color: $gray-lighter;
+
+//== Type
+$hr-border: $gray-light;
+
+// Variables
+$text-color-pale: $gray-light;
+$text-color-active: lighten($gray-lighter, 27%);
+
+$background-grey: $gray-dark;
+$background-blue: desaturate(darken($blue, 25%), 15%);
+
+$border-grey: $gray-darker;
+$border-medium-grey: $gray-light;
+$border-dark-grey: darken($border-grey, 4.5%);
+
+$icon-color: $text-color;
+
+$main-background: $gray-dark;
+$framed-background: $gray;
+$left-navbar-drawer-background: $main-background;
+$hovercard-background: $gray;
+
+@import 'color_themes/color_theme_override_dark';
diff --git a/app/assets/stylesheets/color_themes/dark/desktop.scss b/app/assets/stylesheets/color_themes/dark/desktop.scss
new file mode 100644
index 000000000..92ef0cbea
--- /dev/null
+++ b/app/assets/stylesheets/color_themes/dark/desktop.scss
@@ -0,0 +1,3 @@
+@import 'mixins';
+@import 'color_themes/dark/style';
+@import 'application';
diff --git a/app/assets/stylesheets/color_themes/dark/mobile.scss b/app/assets/stylesheets/color_themes/dark/mobile.scss
new file mode 100644
index 000000000..39846a50b
--- /dev/null
+++ b/app/assets/stylesheets/color_themes/dark/mobile.scss
@@ -0,0 +1,63 @@
+@import 'mixins';
+@import 'color_themes/dark/style';
+
+// Only overriding existing selectors here, so disable some lint rules
+// scss-lint:disable SelectorFormat, NestingDepth, SelectorDepth
+body {
+ .settings-container,
+ .stream-element,
+ .login-form {
+ border: 1px solid $border-grey;
+ }
+
+ .stream-element,
+ .comments {
+ .from a { color: $text-color; }
+ .info { color: lighten($gray-light, 12%); }
+ .nsfw-shield { background-color: $gray-light; }
+
+ .bottom-bar {
+ background: lighten($framed-background, 4.5%);
+ .post-action .disabled { color: $text-color-pale; }
+ .post-stats .count { background-color: lighten($framed-background, 4.5%); }
+ }
+
+ .reshare {
+ border-bottom: 1px solid $border-medium-grey;
+ .reshare_via span { color: $border-medium-grey; }
+ }
+ }
+
+ .more-link,
+ .no-more-posts {
+ background: { color: $btn-default-bg; }
+ border: 1px solid $gray;
+
+ h1,
+ h2 {
+ color: $text-color;
+ text-shadow: 0 2px 0 $gray;
+ }
+ }
+
+ .stream-element.unread { background-color: $gray; }
+ .stream-element.read { background-color: $gray-darker; }
+
+ .header-full-width { border-bottom: 1px solid $border-grey; }
+
+ .user_aspects {
+ &,
+ &:focus,
+ &:active {
+ border-color: $gray-light;
+ }
+
+ &.has_connection {
+ background-color: $green;
+ color: $white;
+ }
+ }
+}
+// scss-lint:enable IdSelector, SelectorFormat, NestingDepth, SelectorDepth
+
+@import 'mobile/mobile';
diff --git a/app/assets/stylesheets/color_themes/original_white/_style.scss b/app/assets/stylesheets/color_themes/original_white/_style.scss
index 57228dfdf..448ce77f4 100644
--- a/app/assets/stylesheets/color_themes/original_white/_style.scss
+++ b/app/assets/stylesheets/color_themes/original_white/_style.scss
@@ -3,7 +3,6 @@ $background: #fff;
// Variables
$main-background: $background;
-$sidebars-background: $background;
$card-shadow: none;
@import 'color_themes/color_theme_override_origwhite';
diff --git a/app/assets/stylesheets/comments.scss b/app/assets/stylesheets/comments.scss
index 3a9828c8f..7b6d76757 100644
--- a/app/assets/stylesheets/comments.scss
+++ b/app/assets/stylesheets/comments.scss
@@ -1,13 +1,27 @@
.comment_stream {
.show_comments {
- margin-top: 5px;
border-top: 1px solid $border-grey;
+ line-height: $line-height-computed;
+ margin-top: 5px;
a {
color: $text-grey;
font-size: 13px;
}
.media { margin-top: 10px; }
}
+
+ .loading-comments {
+ height: $line-height-computed + 11px; // height of .show_comments: line-height, 10px margin, 1px border
+ margin-top: -$line-height-computed - 11px;
+
+ .loader {
+ height: 20px;
+ width: 20px;
+ }
+
+ .media { margin: 5px; }
+ }
+
.comments > .comment,
.comment.new-comment-form-wrapper {
.avatar {
diff --git a/app/assets/stylesheets/contacts.scss b/app/assets/stylesheets/contacts.scss
index a11cc8a93..4d49d39ad 100644
--- a/app/assets/stylesheets/contacts.scss
+++ b/app/assets/stylesheets/contacts.scss
@@ -38,13 +38,13 @@
margin-right: 25px;
}
#chat_privilege_toggle > .enabled {
- color: #000;
+ color: $text-color-active;
}
.contacts-header-icon {
font-size: 24.5px;
line-height: 40px;
- color: lighten($black,75%);
- &:hover { color: $black; }
+ color: $text-color-pale;
+ &:hover { color: $text-color; }
}
#suggest_member.btn { margin-top: 8px; }
}
@@ -56,14 +56,14 @@
font-size: 20px;
line-height: 50px;
margin: 0 10px;
- color: lighten($black,75%);
- &:hover { color: $black; }
+ color: $text-color-pale;
+ &:hover { color: $text-color; }
}
&.in_aspect {
border-left: 3px solid $brand-success;
background-color: lighten($brand-success,35%);
}
- &:not(.in_aspect) { border-left: 3px solid $white; }
+ &:not(.in_aspect) { border-left: 3px solid $framed-background; }
}
.no_contacts {
diff --git a/app/assets/stylesheets/conversations.scss b/app/assets/stylesheets/conversations.scss
index efb89b669..8c1216cd5 100644
--- a/app/assets/stylesheets/conversations.scss
+++ b/app/assets/stylesheets/conversations.scss
@@ -17,7 +17,7 @@
}
.stream-element {
- background-color: $white;
+ background-color: $framed-background;
padding: 10px;
.avatar {
@@ -30,7 +30,7 @@
.stream-element.message,
.stream-element.new-message {
- border: 1px solid $light-grey;
+ border: 1px solid $border-grey;
box-shadow: $card-shadow;
margin-bottom: 20px;
@@ -83,7 +83,7 @@
}
}
- &.unread { background-color: darken($background-white, 5%); }
+ &.unread { background-color: $background-grey; }
&.selected { background-color: $blue; }
.last_author, .last_message {
@@ -183,10 +183,60 @@
}
// scss-lint:enable SelectorDepth
-#new_conversation_pane {
+.new-conversation {
ul.as-selections { width: 100% !important; }
+
input#contact_ids { box-shadow: none; }
+
label { font-weight: bold; }
+
+ .twitter-typeahead,
+ .tt-menu {
+ width: 100%;
+ }
+}
+
+.recipients-tag-list {
+ .conversation-recipient-tag {
+ background-color: $brand-primary;
+ border-radius: $btn-border-radius-base;
+ display: inline-flex;
+ margin: 0 2px $form-group-margin-bottom;
+ padding: 8px;
+
+ &:first-child { margin-left: 0; }
+
+ &:last-child { margin-right: 0; }
+
+ div {
+ align-self: center;
+ justify-content: flex-start;
+ }
+ }
+
+ .avatar {
+ height: 40px;
+ margin-right: 8px;
+ width: 40px;
+ }
+
+ .name-and-handle {
+ color: $white;
+ margin-right: 8px;
+ text-align: left;
+
+ .diaspora-id { font-size: $font-size-small; }
+ }
+
+ .entypo-circled-cross {
+ color: $white;
+ cursor: pointer;
+ font-size: 20px;
+ height: 22px;
+ line-height: 22px;
+
+ &:hover { color: $light-grey; }
+ }
}
.new-conversation.form-horizontal .form-group:last-of-type { margin-bottom: 0; }
diff --git a/app/assets/stylesheets/forms.scss b/app/assets/stylesheets/forms.scss
index 98a02a623..2f0717bba 100644
--- a/app/assets/stylesheets/forms.scss
+++ b/app/assets/stylesheets/forms.scss
@@ -13,9 +13,7 @@ textarea {
&:active:focus,
&:invalid:focus,
&:invalid:required:focus {
- border-color: $border-grey;
box-shadow: none;
- color: $text-dark-grey;
}
}
// scss-lint:enable QualifyingElement
@@ -29,7 +27,6 @@ textarea {
margin: 20px auto;
fieldset {
- background-color: $white;
margin-bottom: 1em;
position: relative; // To correctly place the entypo icon
diff --git a/app/assets/stylesheets/header.scss b/app/assets/stylesheets/header.scss
index 4d7aa516b..668cef21c 100644
--- a/app/assets/stylesheets/header.scss
+++ b/app/assets/stylesheets/header.scss
@@ -106,7 +106,7 @@
}
.view_all {
background-color: $link-color;
- border-top: 3px solid $white;
+ border-top: 3px solid $dropdown-bg;
text-align: center;
a {
color: $white;
diff --git a/app/assets/stylesheets/help.scss b/app/assets/stylesheets/help.scss
index d5a864770..c19e09439 100644
--- a/app/assets/stylesheets/help.scss
+++ b/app/assets/stylesheets/help.scss
@@ -98,9 +98,9 @@ ul#help_nav {
line-height: 70px;
[class^="entypo-"], [class*="entypo-"] {
- color: #bfbfbf;
+ color: $text-color-pale;
- &.entypo-chat{ color: #000000; }
+ &.entypo-chat { color: $text-color-active; }
}
}
}
diff --git a/app/assets/stylesheets/home.scss b/app/assets/stylesheets/home.scss
index b661e4b4f..1dd6555ad 100644
--- a/app/assets/stylesheets/home.scss
+++ b/app/assets/stylesheets/home.scss
@@ -33,8 +33,8 @@
}
.landing-info-card {
- background-color: $white;
- border: 1px solid $light-grey;
+ background-color: $framed-background;
+ border: 1px solid $border-grey;
box-shadow: $card-shadow;
margin-bottom: 25px;
margin-top: 25px;
diff --git a/app/assets/stylesheets/hovercard.scss b/app/assets/stylesheets/hovercard.scss
index 1cf9ae620..ffe8e3cb8 100644
--- a/app/assets/stylesheets/hovercard.scss
+++ b/app/assets/stylesheets/hovercard.scss
@@ -7,7 +7,7 @@
min-width: 250px;
max-width: 400px;
- background-color: $background-white;
+ background-color: $hovercard-background;
border: 1px solid $border-dark-grey;
font-size: small;
diff --git a/app/assets/stylesheets/icons.scss b/app/assets/stylesheets/icons.scss
index b4496bbd3..a6cc1f917 100644
--- a/app/assets/stylesheets/icons.scss
+++ b/app/assets/stylesheets/icons.scss
@@ -1,6 +1,6 @@
[class^="entypo-"], [class*="entypo-"] {
font-style: normal;
- color: black;
+ color: $icon-color;
&.red { color: #A40802; }
&.white { color: white; }
diff --git a/app/assets/stylesheets/interactions.scss b/app/assets/stylesheets/interactions.scss
index e2f95d677..211f27acd 100644
--- a/app/assets/stylesheets/interactions.scss
+++ b/app/assets/stylesheets/interactions.scss
@@ -4,7 +4,7 @@
[class^="entypo-"],
[class*="entypo-"] {
- color: $text-grey;
+ color: $text-color-pale;
font-size: $font-size-base;
line-height: $line-height-base;
vertical-align: middle;
@@ -12,12 +12,12 @@
[class^="entypo-"]:hover,
[class*="entypo-"]:hover {
- color: $text;
+ color: $text-color;
}
&.hide_conversation i { font-size: $line-height-computed * 1.5; }
&.delete_conversation i { font-size: $font-size-base * 1.5; }
- &.destroy_participation i { color: $black; }
+ &.destroy_participation i { color: $text-color-active; }
&.destroy_participation i:hover { color: $text-dark-grey; }
}
}
diff --git a/app/assets/stylesheets/invitations.scss b/app/assets/stylesheets/invitations.scss
index a78bed09f..f7f7451d2 100644
--- a/app/assets/stylesheets/invitations.scss
+++ b/app/assets/stylesheets/invitations.scss
@@ -1,5 +1,5 @@
#invite_code {
- background-color: $white;
+ background-color: $framed-background;
cursor: text;
display: block;
margin-top: 5px;
@@ -7,13 +7,13 @@
#invitationsModal {
.modal-header, .modal-body {
- color: $text;
+ color: $text-color;
font-size: $font-size-base;
text-align: initial;
}
#paste_link { font-weight: 700; }
#invite_code { margin-top: 10px; }
- #codes_left { color: $text-grey; }
+ #codes_left { color: $text-color-pale; }
.controls { margin-left: 140px; }
#email_invitation {
padding-top: 10px;
@@ -21,7 +21,7 @@
border-top: 1px dashed $border-grey;
label { font-weight: 700; }
#already_sent {
- color: $text-grey;
+ color: $text-color-pale;
font-size: 12px;
}
}
diff --git a/app/assets/stylesheets/markdown-editor.scss b/app/assets/stylesheets/markdown-editor.scss
index cb731118b..e6a679258 100644
--- a/app/assets/stylesheets/markdown-editor.scss
+++ b/app/assets/stylesheets/markdown-editor.scss
@@ -1,6 +1,6 @@
.md-footer,
.md-header {
- background: $sidebars-background;
+ background: $white;
border: 0;
display: block;
height: 42px;
@@ -10,7 +10,7 @@
[class^="entypo-"],
[class*="entypo-"],
.glyphicon {
- color: $black;
+ color: $icon-color;
}
}
@@ -72,7 +72,7 @@
width: 18px;
}
- &:hover .entypo-cross { color: $text; }
+ &:hover .entypo-cross { color: $text-color; }
}
diff --git a/app/assets/stylesheets/mentions.scss b/app/assets/stylesheets/mentions.scss
index 71028e629..a6920e7b3 100644
--- a/app/assets/stylesheets/mentions.scss
+++ b/app/assets/stylesheets/mentions.scss
@@ -75,7 +75,7 @@
}
.mentions {
- color: white;
+ color: transparent;
font-size: $font-size-base;
font-family: Arial, Helvetica, sans-serif;
overflow: hidden;
diff --git a/app/assets/stylesheets/mobile/comments.scss b/app/assets/stylesheets/mobile/comments.scss
index 7f5382c37..e77bf196a 100644
--- a/app/assets/stylesheets/mobile/comments.scss
+++ b/app/assets/stylesheets/mobile/comments.scss
@@ -33,7 +33,7 @@
&.active:not(.bottom_collapse),
&.active:not(.bottom_collapse) > [class^="entypo"] {
- color: $text;
+ color: $text-color;
}
}
diff --git a/app/assets/stylesheets/mobile/conversations.scss b/app/assets/stylesheets/mobile/conversations.scss
index e0e02411a..ef3409f79 100644
--- a/app/assets/stylesheets/mobile/conversations.scss
+++ b/app/assets/stylesheets/mobile/conversations.scss
@@ -61,3 +61,5 @@
.subject { padding: 0 10px; }
.message-count, .unread-message-count { margin: 10px 2px; }
+
+.new-conversation .as-selections { background-color: transparent; }
diff --git a/app/assets/stylesheets/mobile/mobile.scss b/app/assets/stylesheets/mobile/mobile.scss
index 7996bcee9..1b16f4d09 100644
--- a/app/assets/stylesheets/mobile/mobile.scss
+++ b/app/assets/stylesheets/mobile/mobile.scss
@@ -150,7 +150,7 @@ footer {
border-radius: 5px;
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);
- background-color: #fff;
+ background-color: $framed-background;
margin-bottom: 10px;
border: 1px solid #bbb;
@@ -176,7 +176,7 @@ footer {
border-radius: 3px 3px 0 0;
border: {
- bottom: 1px solid #ccc;
+ bottom: 1px solid $border-medium-grey;
}
img.big-stream-photo {
@@ -322,7 +322,7 @@ footer {
}
.header-full-width {
- background-color: #fff;
+ background-color: $framed-background;
border-bottom: 1px solid #aaa;
margin: -10px; // Counter the #main padding
margin-bottom: 10px;
@@ -462,7 +462,7 @@ select {
font-weight: bold;
color: $text-grey;
background: {
- color: #fff;
+ color: $framed-background;
}
}
}
diff --git a/app/assets/stylesheets/mobile/tags.scss b/app/assets/stylesheets/mobile/tags.scss
index ba5f0ac67..665e41d98 100644
--- a/app/assets/stylesheets/mobile/tags.scss
+++ b/app/assets/stylesheets/mobile/tags.scss
@@ -3,7 +3,7 @@ ul.followed_tags {
margin: 0px;
> li {
- background-color: $white;
+ background-color: $framed-background;
border: 1px solid $border-grey;
border-radius: 5px;
box-shadow: 0 1px 2px rgba($border-dark-grey, 0.5);
diff --git a/app/assets/stylesheets/notifications.scss b/app/assets/stylesheets/notifications.scss
index 16f12513c..27df15086 100644
--- a/app/assets/stylesheets/notifications.scss
+++ b/app/assets/stylesheets/notifications.scss
@@ -73,7 +73,7 @@
background-color: $background-grey;
.unread-toggle {
opacity: 1 !important;
- .entypo-eye { color: $black; }
+ .entypo-eye { color: $text-color-active; }
}
}
@@ -90,7 +90,7 @@
padding: 9px 5px;
.entypo-eye {
cursor: pointer;
- color: lighten($black,75%);
+ color: $text-color-pale;
font-size: 17px;
line-height: 17px;
}
diff --git a/app/assets/stylesheets/profile.scss b/app/assets/stylesheets/profile.scss
index 727c99fee..cec99ef33 100644
--- a/app/assets/stylesheets/profile.scss
+++ b/app/assets/stylesheets/profile.scss
@@ -1,7 +1,7 @@
#profile_container {
.profile_header {
margin-bottom: 15px;
- background-color: $white;
+ background-color: $framed-background;
padding-left: 10px;
padding-right: 10px;
padding-top: 20px;
@@ -22,7 +22,7 @@
font-weight: 700;
}
#diaspora_handle {
- color: $text-grey;
+ color: $text-color-pale;
font-size: 20px;
}
#sharing_message {
@@ -64,8 +64,8 @@
.profile-header-icon {
font-size: 24.5px;
line-height: 30px;
- color: lighten($black,75%);
- &:hover { color: $black; }
+ color: $text-color-pale;
+ &:hover { color: $text-color; }
}
#mention_button { font-weight: 700; }
}
@@ -80,8 +80,12 @@
&.active {
border-bottom: 3px solid $brand-primary;
a {
- color: $black;
- [class^="entypo-"], [class*="entypo-"] { color: $black; }
+ color: $text-color-active;
+
+ [class^="entypo-"],
+ [class*="entypo-"] {
+ color: $text-color-active;
+ }
}
}
a {
@@ -94,9 +98,13 @@
margin-right: 2px;
}
&:hover {
- color: $black;
- [class^="entypo-"], [class*="entypo-"] { color: $black; }
+ color: $text-color-active;
text-decoration: none;
+
+ [class^="entypo-"],
+ [class*="entypo-"] {
+ color: $text-color-active;
+ }
}
}
}
diff --git a/app/assets/stylesheets/registration.scss b/app/assets/stylesheets/registration.scss
index 53c65674d..123161d6a 100644
--- a/app/assets/stylesheets/registration.scss
+++ b/app/assets/stylesheets/registration.scss
@@ -35,7 +35,7 @@
}
.captcha-input {
- border-bottom: 1px solid $border-grey;
+ border-bottom: 1px solid $input-border;
border-bottom-left-radius: 5px;
border-bottom-right-radius: 5px;
box-sizing: border-box;
diff --git a/app/assets/stylesheets/sidebar.scss b/app/assets/stylesheets/sidebar.scss
index 1df833b42..a09f5d84b 100644
--- a/app/assets/stylesheets/sidebar.scss
+++ b/app/assets/stylesheets/sidebar.scss
@@ -1,7 +1,7 @@
.sidebar,
.framed-content {
- background-color: $white;
- border: 1px solid $light-grey;
+ background-color: $framed-background;
+ border: 1px solid $border-grey;
border-top: 0;
box-shadow: $card-shadow;
diff --git a/app/assets/stylesheets/stream_element.scss b/app/assets/stylesheets/stream_element.scss
index e9f466676..317c8db7e 100644
--- a/app/assets/stylesheets/stream_element.scss
+++ b/app/assets/stylesheets/stream_element.scss
@@ -15,7 +15,7 @@
position: relative;
.control-icons {
- background: $white;
+ background: $framed-background;
border-radius: 4px;
padding-left: 4px;
position: absolute;
@@ -26,7 +26,7 @@
}
.thumbnail {
- background: $white;
+ background: $framed-background;
border-radius: 0;
box-shadow: $card-shadow;
height: 240px;
@@ -40,7 +40,7 @@
&:hover,
&:focus,
&:active {
- border-color: $light-grey;
+ border-color: $border-grey;
text-decoration: none;
}
@@ -62,7 +62,7 @@
#main_stream .stream-element {
margin-bottom: 20px;
- border: 1px solid $light-grey;
+ border: 1px solid $border-grey;
box-shadow: $card-shadow;
&.highlighted {
@@ -72,7 +72,7 @@
}
.stream-element {
- background-color: $white;
+ background-color: $framed-background;
padding: 10px;
& > .media {
diff --git a/app/assets/templates/comment-stream_tpl.jst.hbs b/app/assets/templates/comment-stream_tpl.jst.hbs
index 0b6678a10..e7343507d 100644
--- a/app/assets/templates/comment-stream_tpl.jst.hbs
+++ b/app/assets/templates/comment-stream_tpl.jst.hbs
@@ -6,6 +6,14 @@
</div>
</div>
+<div class="loading-comments comment text-center hidden">
+ <div class="media">
+ <div class="loader">
+ <div class="spinner"></div>
+ </div>
+ </div>
+</div>
+
<div class="comments"> </div>
{{#if loggedIn}}
diff --git a/app/assets/templates/conversation_recipient_tag_tpl.jst.hbs b/app/assets/templates/conversation_recipient_tag_tpl.jst.hbs
new file mode 100644
index 000000000..296c0b7f9
--- /dev/null
+++ b/app/assets/templates/conversation_recipient_tag_tpl.jst.hbs
@@ -0,0 +1,12 @@
+<div class="conversation-recipient-tag clearfix" data-diaspora-handle="{{ handle }}">
+ <div href="{{ url }}">
+ <img src="{{ avatar }}" class="avatar img-responsive center-block">
+ </div>
+ <div class="pull-left clearfix name-and-handle" href="{{ url }}">
+ <div class="name">{{ name }}</div>
+ <div class="diaspora-id">{{ handle }}</div>
+ </div>
+ <div class="remove pull-right clearfix">
+ <i class="entypo-circled-cross"></i>
+ </div>
+</div>
diff --git a/app/assets/templates/header_tpl.jst.hbs b/app/assets/templates/header_tpl.jst.hbs
index a895d99c9..ab8a27a95 100644
--- a/app/assets/templates/header_tpl.jst.hbs
+++ b/app/assets/templates/header_tpl.jst.hbs
@@ -53,7 +53,7 @@
<ul class="dropdown-menu" role="menu">
<div class="header">
<div class="pull-right">
- <a href="#" id="mark_all_read_link" class="btn btn-default btn-sm {{#unless current_user.notifications_count}}disabled{{/unless}}">
+ <a href="#" id="mark-all-read-link" class="btn btn-default btn-sm {{#unless current_user.notifications_count}}disabled{{/unless}}">
{{t "header.mark_all_as_read"}}
</a>
</div>
@@ -61,11 +61,10 @@
{{t "header.recent_notifications"}}
</h4>
</div>
- <div class="notifications">
- <div class="ajax-loader">
- <div class="spinner"></div>
- </div>
+ <div class="ajax-loader">
+ <div class="spinner"></div>
</div>
+ <div class="notifications"></div>
<div class="view_all">
<a href="/notifications" id="view_all_notifications">
{{t "header.view_all"}}
diff --git a/app/controllers/api/openid_connect/authorizations_controller.rb b/app/controllers/api/openid_connect/authorizations_controller.rb
index 7103ad95e..cc2e6a0a6 100644
--- a/app/controllers/api/openid_connect/authorizations_controller.rb
+++ b/app/controllers/api/openid_connect/authorizations_controller.rb
@@ -125,6 +125,7 @@ module Api
session[:response_type] = @response_type
session[:redirect_uri] = @redirect_uri
session[:scopes] = scopes_as_space_seperated_values
+ session[:state] = params[:state]
session[:nonce] = params[:nonce]
end
@@ -149,6 +150,7 @@ module Api
session.delete(:response_type)
session.delete(:redirect_uri)
session.delete(:scopes)
+ session.delete(:state)
session.delete(:nonce)
end
@@ -162,6 +164,7 @@ module Api
req.update_param("redirect_uri", session[:redirect_uri])
req.update_param("response_type", response_type_as_space_seperated_values)
req.update_param("scope", session[:scopes])
+ req.update_param("state", session[:state])
req.update_param("nonce", session[:nonce])
end
diff --git a/app/controllers/api/v1/tokens_controller.rb b/app/controllers/api/v1/tokens_controller.rb
deleted file mode 100644
index f59c2eac5..000000000
--- a/app/controllers/api/v1/tokens_controller.rb
+++ /dev/null
@@ -1,16 +0,0 @@
-class Api::V1::TokensController < ApplicationController
- skip_before_filter :verify_authenticity_token
- before_filter :authenticate_user!
-
- respond_to :json
-
- def create
- current_user.ensure_authentication_token!
- render :status => 200, :json => { :token => current_user.authentication_token }
- end
-
- def destroy
- current_user.reset_authentication_token!
- render :json => true, :status => 200
- end
-end
diff --git a/app/controllers/comments_controller.rb b/app/controllers/comments_controller.rb
index 9abc7503b..bde3e2fbb 100644
--- a/app/controllers/comments_controller.rb
+++ b/app/controllers/comments_controller.rb
@@ -12,11 +12,17 @@ class CommentsController < ApplicationController
end
def create
- comment = comment_service.create(params[:post_id], params[:text])
+ begin
+ comment = comment_service.create(params[:post_id], params[:text])
+ rescue ActiveRecord::RecordNotFound
+ render text: I18n.t("comments.create.error"), status: 404
+ return
+ end
+
if comment
respond_create_success(comment)
else
- render nothing: true, status: 404
+ render text: I18n.t("comments.create.error"), status: 422
end
end
diff --git a/app/controllers/contacts_controller.rb b/app/controllers/contacts_controller.rb
index a0be1dcec..ed5999f35 100644
--- a/app/controllers/contacts_controller.rb
+++ b/app/controllers/contacts_controller.rb
@@ -17,7 +17,8 @@ class ContactsController < ApplicationController
# Used for mentions in the publisher and pagination on the contacts page
format.json {
@people = if params[:q].present?
- Person.search(params[:q], current_user, only_contacts: true).limit(15)
+ mutual = params[:mutual].present? && params[:mutual]
+ Person.search(params[:q], current_user, only_contacts: true, mutual: mutual).limit(15)
else
set_up_contacts_json
end
diff --git a/app/controllers/conversations_controller.rb b/app/controllers/conversations_controller.rb
index ba99b6b6a..c69b6d7d8 100644
--- a/app/controllers/conversations_controller.rb
+++ b/app/controllers/conversations_controller.rb
@@ -30,12 +30,17 @@ class ConversationsController < ApplicationController
end
def create
- contact_ids = params[:contact_ids]
+ # Contacts autocomplete does not work the same way on mobile and desktop
+ # Mobile returns contact ids array while desktop returns person id
+ # This will have to be removed when mobile autocomplete is ported to Typeahead
+ recipients_param, column = [%i(contact_ids id), %i(person_ids person_id)].find {|param, _| params[param].present? }
+ if recipients_param
+ person_ids = current_user.contacts.mutual.where(column => params[recipients_param].split(",")).pluck(:person_id)
+ end
- # Can't split nil
- if contact_ids
- contact_ids = contact_ids.split(',') if contact_ids.is_a? String
- person_ids = current_user.contacts.where(id: contact_ids).pluck(:person_id)
+ unless person_ids.present?
+ render text: I18n.t("javascripts.conversation.create.no_recipient"), status: 422
+ return
end
opts = params.require(:conversation).permit(:subject)
@@ -43,16 +48,12 @@ class ConversationsController < ApplicationController
opts[:message] = { text: params[:conversation][:text] }
@conversation = current_user.build_conversation(opts)
- if person_ids.present? && @conversation.save
+ if @conversation.save
Diaspora::Federation::Dispatcher.defer_dispatch(current_user, @conversation)
flash[:notice] = I18n.t("conversations.create.sent")
render json: {id: @conversation.id}
else
- message = I18n.t("conversations.create.fail")
- if person_ids.blank?
- message = I18n.t("javascripts.conversation.create.no_recipient")
- end
- render text: message, status: 422
+ render text: I18n.t("conversations.create.fail"), status: 422
end
end
@@ -91,17 +92,23 @@ class ConversationsController < ApplicationController
return
end
- @contacts_json = contacts_data.to_json
- @contact_ids = ""
-
- if params[:contact_id]
- @contact_ids = current_user.contacts.find(params[:contact_id]).id
- elsif params[:aspect_id]
- @contact_ids = current_user.aspects.find(params[:aspect_id]).contacts.map{|c| c.id}.join(',')
- end
if session[:mobile_view] == true && request.format.html?
+ @contacts_json = contacts_data.to_json
+
+ @contact_ids = if params[:contact_id]
+ current_user.contacts.find(params[:contact_id]).id
+ elsif params[:aspect_id]
+ current_user.aspects.find(params[:aspect_id]).contacts.pluck(:id).join(",")
+ end
+
render :layout => true
else
+ if params[:contact_id]
+ gon.push conversation_prefill: [current_user.contacts.find(params[:contact_id]).person.as_json]
+ elsif params[:aspect_id]
+ gon.push conversation_prefill: current_user.aspects
+ .find(params[:aspect_id]).contacts.map {|c| c.person.as_json }
+ end
render :layout => false
end
end
diff --git a/app/controllers/likes_controller.rb b/app/controllers/likes_controller.rb
index adf92827e..5c2c65789 100644
--- a/app/controllers/likes_controller.rb
+++ b/app/controllers/likes_controller.rb
@@ -26,7 +26,7 @@ class LikesController < ApplicationController
format.json { render :json => @like.as_api_response(:backbone), :status => 201 }
end
else
- render :nothing => true, :status => 422
+ render text: I18n.t("likes.create.error"), status: 422
end
end
diff --git a/app/controllers/notifications_controller.rb b/app/controllers/notifications_controller.rb
index 7ddb9b8d6..aae218b69 100644
--- a/app/controllers/notifications_controller.rb
+++ b/app/controllers/notifications_controller.rb
@@ -52,7 +52,7 @@ class NotificationsController < ApplicationController
format.html
format.xml { render :xml => @notifications.to_xml }
format.json {
- render json: @notifications, each_serializer: NotificationSerializer
+ render json: render_as_json(@unread_notification_count, @grouped_unread_notification_counts, @notifications)
}
end
end
@@ -82,4 +82,15 @@ class NotificationsController < ApplicationController
end
end
+ private
+
+ def render_as_json(unread_count, unread_count_by_type, notification_list)
+ {
+ unread_count: unread_count,
+ unread_count_by_type: unread_count_by_type,
+ notification_list: notification_list.map {|note|
+ NotificationSerializer.new(note, default_serializer_options).as_json
+ }
+ }.as_json
+ end
end
diff --git a/app/controllers/reshares_controller.rb b/app/controllers/reshares_controller.rb
index 22915891a..7345e6343 100644
--- a/app/controllers/reshares_controller.rb
+++ b/app/controllers/reshares_controller.rb
@@ -14,7 +14,19 @@ class ResharesController < ApplicationController
current_user.dispatch_post(@reshare)
render :json => ExtremePostPresenter.new(@reshare, current_user), :status => 201
else
- render :nothing => true, :status => 422
+ render text: I18n.t("reshares.create.error"), status: 422
end
end
+
+ def index
+ @reshares = target.reshares.includes(author: :profile)
+ render json: @reshares.as_api_response(:backbone)
+ end
+
+ private
+
+ def target
+ @target ||= current_user.find_visible_shareable_by_id(Post, params[:post_id]) ||
+ raise(ActiveRecord::RecordNotFound.new)
+ end
end
diff --git a/app/controllers/share_visibilities_controller.rb b/app/controllers/share_visibilities_controller.rb
index bbc7bba16..bf1ea1f10 100644
--- a/app/controllers/share_visibilities_controller.rb
+++ b/app/controllers/share_visibilities_controller.rb
@@ -7,17 +7,14 @@ class ShareVisibilitiesController < ApplicationController
before_action :authenticate_user!
def update
- #note :id references a postvisibility
- params[:shareable_id] ||= params[:post_id]
- params[:shareable_type] ||= 'Post'
-
- vis = current_user.toggle_hidden_shareable(accessible_post)
- render :nothing => true, :status => 200
+ post = post_service.find!(params[:post_id])
+ current_user.toggle_hidden_shareable(post)
+ head :ok
end
private
- def accessible_post
- @post ||= params[:shareable_type].constantize.where(:id => params[:post_id]).select("id, guid, author_id, created_at").first
+ def post_service
+ @post_service ||= PostService.new(current_user)
end
end
diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb
index 8e01dff62..958353e28 100644
--- a/app/controllers/users_controller.rb
+++ b/app/controllers/users_controller.rb
@@ -128,6 +128,11 @@ class UsersController < ApplicationController
redirect_to edit_user_path
end
+ def auth_token
+ current_user.ensure_authentication_token!
+ render status: 200, json: {token: current_user.authentication_token}
+ end
+
private
# rubocop:disable Metrics/MethodLength
diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb
index 85e0567fd..6fed2b8b6 100644
--- a/app/helpers/application_helper.rb
+++ b/app/helpers/application_helper.rb
@@ -12,6 +12,8 @@ module ApplicationHelper
end
def changelog_url
+ return AppConfig.settings.changelog_url.get if AppConfig.settings.changelog_url.present?
+
url = "https://github.com/diaspora/diaspora/blob/master/Changelog.md"
url.sub!('/master/', "/#{AppConfig.git_revision}/") if AppConfig.git_revision.present?
url
@@ -31,14 +33,6 @@ module ApplicationHelper
"bookmarklet('#{bookmarklet_url}', #{width}, #{height});"
end
- def contacts_link
- if current_user.contacts.size > 0
- contacts_path
- else
- community_spotlight_path
- end
- end
-
def all_services_connected?
current_user.services.size == AppConfig.configured_services.size
end
diff --git a/app/helpers/layout_helper.rb b/app/helpers/layout_helper.rb
index 7de3ad913..23be964ec 100644
--- a/app/helpers/layout_helper.rb
+++ b/app/helpers/layout_helper.rb
@@ -33,7 +33,7 @@ module LayoutHelper
def current_user_atom_tag
return unless @person.present?
content_tag(:link, "", rel: "alternate", href: @person.atom_url, type: "application/atom+xml",
- title: t(".public_feed", name: @person.name))
+ title: t("layouts.application.public_feed", name: @person.name))
end
def translation_missing_warnings
diff --git a/app/helpers/sessions_helper.rb b/app/helpers/sessions_helper.rb
index 65a9bdaf4..716b12fed 100644
--- a/app/helpers/sessions_helper.rb
+++ b/app/helpers/sessions_helper.rb
@@ -13,7 +13,7 @@ module SessionsHelper
end
def display_password_reset_link?
- devise_mapping.recoverable? && controller_name != "passwords"
+ AppConfig.mail.enable? && devise_mapping.recoverable? && controller_name != "passwords"
end
def flash_class(name)
diff --git a/app/helpers/stream_helper.rb b/app/helpers/stream_helper.rb
index 73e23d25c..fc30a0457 100644
--- a/app/helpers/stream_helper.rb
+++ b/app/helpers/stream_helper.rb
@@ -30,6 +30,10 @@ module StreamHelper
aspects_stream_path(max_time: time_for_scroll(@stream), a_ids: session[:a_ids])
elsif current_page?(:public_stream)
public_stream_path(max_time: time_for_scroll(@stream))
+ elsif current_page?(:commented_stream)
+ commented_stream_path(max_time: time_for_scroll(@stream))
+ elsif current_page?(:liked_stream)
+ liked_stream_path(max_time: time_for_scroll(@stream))
elsif current_page?(:mentioned_stream)
mentioned_stream_path(max_time: time_for_scroll(@stream))
elsif current_page?(:followed_tags_stream)
diff --git a/app/models/person.rb b/app/models/person.rb
index 35673144b..8e0d5b6e2 100644
--- a/app/models/person.rb
+++ b/app/models/person.rb
@@ -145,7 +145,7 @@ class Person < ActiveRecord::Base
[where_clause, q_tokens]
end
- def self.search(search_str, user, only_contacts: false)
+ def self.search(search_str, user, only_contacts: false, mutual: false)
search_str.strip!
return none if search_str.blank? || search_str.size < 2
@@ -159,6 +159,8 @@ class Person < ActiveRecord::Base
).searchable(user)
end
+ query = query.where(contacts: {sharing: true, receiving: true}) if mutual
+
query.where(closed_account: false)
.where(sql, *tokens)
.includes(:profile)
diff --git a/app/models/pod.rb b/app/models/pod.rb
index a961353d6..dde1e28f1 100644
--- a/app/models/pod.rb
+++ b/app/models/pod.rb
@@ -61,6 +61,10 @@ class Pod < ActiveRecord::Base
def check_all!
Pod.find_in_batches(batch_size: 20) {|batch| batch.each(&:test_connection!) }
end
+
+ def check_scheduled!
+ Pod.where(scheduled_check: true).find_each(&:test_connection!)
+ end
end
def offline?
@@ -76,6 +80,10 @@ class Pod < ActiveRecord::Base
"#{id}:#{host}"
end
+ def schedule_check_if_needed
+ update_column(:scheduled_check, true) if offline? && !scheduled_check
+ end
+
def test_connection!
result = ConnectionTester.check uri.to_s
logger.debug "tested pod: '#{uri}' - #{result.inspect}"
@@ -108,6 +116,7 @@ class Pod < ActiveRecord::Base
attributes_from_result(result)
touch(:checked_at)
+ self.scheduled_check = false
save
end
diff --git a/app/models/reshare.rb b/app/models/reshare.rb
index bb914d401..a88208248 100644
--- a/app/models/reshare.rb
+++ b/app/models/reshare.rb
@@ -21,6 +21,14 @@ class Reshare < Post
self.root.update_reshares_counter if self.root.present?
end
+ acts_as_api
+ api_accessible :backbone do |t|
+ t.add :id
+ t.add :guid
+ t.add :author
+ t.add :created_at
+ end
+
def root_diaspora_id
root.try(:author).try(:diaspora_handle)
end
diff --git a/app/models/user.rb b/app/models/user.rb
index 77cdd8d21..e8a09a322 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -3,6 +3,7 @@
# the COPYRIGHT file.
class User < ActiveRecord::Base
+ include AuthenticationToken
include Connecting
include Querying
include SocialActions
@@ -16,7 +17,7 @@ class User < ActiveRecord::Base
scope :halfyear_actives, ->(time = Time.now) { logged_in_since(time - 6.month) }
scope :active, -> { joins(:person).where(people: {closed_account: false}) }
- devise :token_authenticatable, :database_authenticatable, :registerable,
+ devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable,
:lockable, :lastseenable, :lock_strategy => :none, :unlock_strategy => :none
diff --git a/app/models/user/authentication_token.rb b/app/models/user/authentication_token.rb
new file mode 100644
index 000000000..ca72950b4
--- /dev/null
+++ b/app/models/user/authentication_token.rb
@@ -0,0 +1,26 @@
+class User
+ module AuthenticationToken
+ extend ActiveSupport::Concern
+
+ # Generate new authentication token and save the record.
+ def reset_authentication_token!
+ self.authentication_token = self.class.authentication_token
+ save(validate: false)
+ end
+
+ # Generate authentication token unless already exists and save the record.
+ def ensure_authentication_token!
+ reset_authentication_token! if authentication_token.blank?
+ end
+
+ module ClassMethods
+ # Generate a token checking if one does not already exist in the database.
+ def authentication_token
+ loop do
+ token = Devise.friendly_token(30)
+ break token unless User.exists?(authentication_token: token)
+ end
+ end
+ end
+ end
+end
diff --git a/app/presenters/post_presenter.rb b/app/presenters/post_presenter.rb
index ba1609c8a..86064fbf9 100644
--- a/app/presenters/post_presenter.rb
+++ b/app/presenters/post_presenter.rb
@@ -104,7 +104,7 @@ class PostPresenter < BasePresenter
end
def user_reshare
- @post.reshare_for(current_user)
+ @post.reshare_for(current_user).try(:as_api_response, :backbone)
end
def already_participated_in_poll
diff --git a/app/views/application/_head.haml b/app/views/application/_head.haml
new file mode 100644
index 000000000..497277976
--- /dev/null
+++ b/app/views/application/_head.haml
@@ -0,0 +1,30 @@
+%title
+ = page_title yield(:page_title)
+
+%meta{charset: "utf-8"}/
+= content_for?(:meta_data) ? yield(:meta_data) : metas_tags
+
+/ favicon
+/ For Apple devices
+%link{rel: "apple-touch-icon", href: image_path("apple-touch-icon.png")}
+/ For Nokia devices
+%link{rel: "shortcut icon", href: image_path("apple-touch-icon.png")}
+/ All others
+%link{rel: "shortcut icon", href: image_path("favicon.png")}
+
+- if rtl?
+ = stylesheet_link_tag :rtl, media: "all"
+
+- if Rails.env.test?
+ = stylesheet_link_tag :poltergeist_disable_transition, media: "all"
+
+= jquery_include_tag
+= include_gon(camel_case: true, nonce: content_security_policy_nonce(:script))
+= yield(:javascript)
+
+= chartbeat_head_block
+= csrf_meta_tag
+= current_user_atom_tag
+= include_mixpanel
+
+= yield(:head)
diff --git a/app/views/contacts/index.html.haml b/app/views/contacts/index.html.haml
index dffe8db21..a4fc8da4e 100644
--- a/app/views/contacts/index.html.haml
+++ b/app/views/contacts/index.html.haml
@@ -1,5 +1,5 @@
- content_for :page_title do
- = t('.title')
+ = t(".title")
.container-fluid#contacts_container
.row
@@ -9,33 +9,34 @@
.col-md-9
.stream.contacts.framed-content#people_stream
- = render 'contacts/header'
+ = render "contacts/header"
- if @contacts_size > 0
- if @aspect && @aspect.contacts.length == 0
.well
- = t('.no_contacts_in_aspect')
+ = t(".no_contacts_in_aspect")
#contact_stream
-# JS
- else
.no_contacts
%h3
- = t('.no_contacts')
+ = t(".no_contacts")
+ - if AppConfig.settings.community_spotlight.enable?
+ %p
+ != t(".no_contacts_message",
+ community_spotlight: link_to(t(".community_spotlight"), community_spotlight_path))
%p
- != t('.no_contacts_message',
- :community_spotlight => link_to(t('.community_spotlight'), community_spotlight_path))
- %p
- .btn.btn-link{ 'data-toggle' => 'modal' }
- = t('invitations.new.invite_someone_to_join')
+ .btn.btn-link{"data-toggle" => "modal"}
+ = t("invitations.new.invite_someone_to_join")
#paginate
.loader.hidden
.spinner
-if @aspect
- #new_conversation_pane
- = render 'shared/modal',
- :path => new_conversation_path(:aspect_id => @aspect.id, :name => @aspect.name, :modal => true),
- :title => t('conversations.index.new_conversation'),
- :id => 'conversationModal'
+ .conversations-form-container#new_conversation_pane
+ = render "shared/modal",
+ path: new_conversation_path(aspect_id: @aspect.id, name: @aspect.name, modal: true),
+ title: t("conversations.index.new_conversation"),
+ id: "conversationModal"
diff --git a/app/views/conversations/_new.haml b/app/views/conversations/_new.haml
index 41fb777aa..c84a6b95a 100644
--- a/app/views/conversations/_new.haml
+++ b/app/views/conversations/_new.haml
@@ -2,9 +2,13 @@
= form_for Conversation.new, html: {id: "new-conversation",
class: "new-conversation form-horizontal"}, remote: true do |conversation|
.form-group
- %label#toLabel{for: "contact_ids"}
- = t(".to")
- = text_field_tag "contact_autocomplete", nil, id: "contact-autocomplete", class: "form-control"
+ %label#to-label{for: "contacts-search-input"}= t(".to")
+ .recipients-tag-list.clearfix#recipients-tag-list
+ = text_field_tag "contact_autocomplete", nil, id: "contacts-search-input", class: "form-control"
+ - unless defined?(mobile) && mobile
+ = text_field_tag "person_ids", nil, id: "contact-ids", type: "hidden",
+ aria: {labelledby: "to-label"}
+
.form-group
%label#subject-label{for: "conversation-subject"}
= t(".subject")
@@ -14,12 +18,14 @@
aria: {labelledby: "subject-label"},
value: "",
placeholder: t("conversations.new.subject_default")
+
.form-group
- %label.sr-only#message-label{for: "new-message-text"} = t(".message")
+ %label.sr-only#message-label{for: "new-message-text"}= t(".message")
= text_area_tag "conversation[text]", "",
rows: 5,
id: "new-message-text",
class: "conversation-message-text input-block-level form-control",
aria: {labelledby: "message-label"}
+
.form-group
= conversation.submit t(".send"), "data-disable-with" => t(".sending"), :class => "btn btn-primary pull-right"
diff --git a/app/views/conversations/_show.haml b/app/views/conversations/_show.haml
index 3611d6613..5efbb8029 100644
--- a/app/views/conversations/_show.haml
+++ b/app/views/conversations/_show.haml
@@ -25,5 +25,4 @@
- for participant in conversation.participants
= person_image_link(participant, :size => :thumb_small)
-.stream
- = render partial: 'messages', locals: { conversation: conversation }
+= render partial: "messages", locals: {conversation: conversation}
diff --git a/app/views/conversations/new.html.haml b/app/views/conversations/new.html.haml
index 1acbba809..e66a929dd 100644
--- a/app/views/conversations/new.html.haml
+++ b/app/views/conversations/new.html.haml
@@ -1,12 +1,2 @@
-:javascript
- $(document).ready(function () {
- var data = $.parseJSON( "#{escape_javascript(@contacts_json)}" );
- new app.views.ConversationsForm({
- el: $("form#new-conversation").parent(),
- contacts: data,
- prefillName: "#{h params[:name]}",
- prefillValue: "#{@contact_ids}"
- });
- });
-
+= include_gon camel_case: true
= render 'conversations/new'
diff --git a/app/views/conversations/new.mobile.haml b/app/views/conversations/new.mobile.haml
index ba78c558f..1da58fcfa 100644
--- a/app/views/conversations/new.mobile.haml
+++ b/app/views/conversations/new.mobile.haml
@@ -6,7 +6,7 @@
:plain
$(document).ready(function () {
var data = $.parseJSON( "#{escape_javascript(@contacts_json).html_safe}" ),
- autocompleteInput = $("#contact-autocomplete");
+ autocompleteInput = $("#contacts-search-input");
autocompleteInput.autoSuggest(data, {
selectedItemProp: "name",
@@ -15,7 +15,7 @@
retrieveLimit: 10,
minChars: 1,
keyDelay: 0,
- startText: '',
+ startText: "",
emptyText: "#{t("no_results")}",
preFill: [{name : "#{h params[:name]}",
value : "#{@contact_ids}"}]
@@ -27,6 +27,6 @@
#flash-messages
.container-fluid.row
%h3
- = t('conversations.index.new_conversation')
+ = t("conversations.index.new_conversation")
- = render 'conversations/new'
+ = render "conversations/new", mobile: true
diff --git a/app/views/devise/shared/_links.haml b/app/views/devise/shared/_links.haml
index 4c37c1ed5..7f3649484 100644
--- a/app/views/devise/shared/_links.haml
+++ b/app/views/devise/shared/_links.haml
@@ -1,13 +1,13 @@
- if controller_name != 'sessions'
= link_to t('.sign_in'), new_session_path(resource_name)
%br/
-- if AppConfig.settings.enable_registrations? && devise_mapping.registerable? && controller_name != 'registrations'
+- if display_registration_link?
= link_to t('.sign_up'), new_registration_path(resource_name)
%br/
- else
%b= t('.sign_up_closed')
%br/
-- if devise_mapping.recoverable? && controller_name != 'passwords'
+- if display_password_reset_link?
= link_to t('.forgot_your_password'), new_password_path(resource_name)
%br/
- if devise_mapping.confirmable? && controller_name != 'confirmations'
diff --git a/app/views/invitations/new.html.haml b/app/views/invitations/new.html.haml
index 187a6fa12..8952aead9 100644
--- a/app/views/invitations/new.html.haml
+++ b/app/views/invitations/new.html.haml
@@ -1,32 +1,33 @@
#paste_link
- = t('.paste_link')
+ = t(".paste_link")
%span#codes_left
= "(" + t(".codes_left", count: @invite_code.count) + ")" unless AppConfig.settings.enable_registrations?
.form-horizontal
.control-group
= invite_link(@invite_code)
-#email_invitation
- = form_tag new_user_invitation_path, class: 'form-horizontal' do
+- if AppConfig.mail.enable?
+ #email_invitation
+ = form_tag new_user_invitation_path, class: "form-horizontal" do
- .form-group
- %label.col-sm-2.control-label{ for: 'email_inviter_emails' }
- = t('email')
- .col-sm-10
- = text_field_tag 'email_inviter[emails]', @invalid_emails, title: t('.comma_separated_plz'),
- placeholder: 'foo@bar.com, max@foo.com...', class: "form-control"
- #already_sent
- = t("invitations.create.note_already_sent", emails: @valid_emails) unless @valid_emails.empty?
+ .form-group
+ %label.col-sm-2.control-label{for: "email_inviter_emails"}
+ = t("email")
+ .col-sm-10
+ = text_field_tag "email_inviter[emails]", @invalid_emails, title: t(".comma_separated_plz"),
+ placeholder: "foo@bar.com, max@foo.com...", class: "form-control"
+ #already_sent
+ = t("invitations.create.note_already_sent", emails: @valid_emails) unless @valid_emails.empty?
- .form-group
- %label.col-sm-2.control-label{ for: 'email_inviter_locale' }
- = t('.language')
- .col-sm-10
- = select_tag 'email_inviter[locale]', options_from_collection_for_select(available_language_options,
- "second", "first", selected: current_user.language), class: "form-control"
+ .form-group
+ %label.col-sm-2.control-label{for: "email_inviter_locale"}
+ = t(".language")
+ .col-sm-10
+ = select_tag "email_inviter[locale]", options_from_collection_for_select(available_language_options,
+ "second", "first", selected: current_user.language), class: "form-control"
- .form-group
- .pull-right.col-md-12
- = submit_tag t('.send_an_invitation'), class: 'btn btn-primary pull-right',
- data: {disable_with: t('.sending_invitation')}
- .clearfix
+ .form-group
+ .pull-right.col-md-12
+ = submit_tag t(".send_an_invitation"), class: "btn btn-primary pull-right",
+ data: {disable_with: t(".sending_invitation")}
+ .clearfix
diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml
index 7903dd88b..8b4099a8f 100644
--- a/app/views/layouts/application.html.haml
+++ b/app/views/layouts/application.html.haml
@@ -3,47 +3,25 @@
-# the COPYRIGHT file.
!!!
-%html{lang: I18n.locale.to_s, dir: (rtl?) ? 'rtl' : 'ltr'}
+%html{lang: I18n.locale.to_s, dir: (rtl? ? "rtl" : "ltr")}
%head{prefix: og_prefix}
- %title
- = page_title yield(:page_title)
+ %meta{name: "viewport", content: "width=device-width, initial-scale=1"}/
- %meta{charset: 'utf-8'}/
- %meta{name: "viewport", content: "width=device-width, initial-scale=1"}/
- = content_for?(:meta_data) ? yield(:meta_data) : metas_tags
+ - content_for :javascript do
+ = old_browser_js_support
- %link{rel: 'shortcut icon', href: "#{image_path('favicon.png')}" }
+ <!--[if IE]>
+ = javascript_include_tag :ie
+ <![endif]-->
- = chartbeat_head_block
- = include_mixpanel
+ = javascript_include_tag :main, :templates
+ = load_javascript_locales
+ = render "head"
= include_color_theme
-
- - if rtl?
- = stylesheet_link_tag :rtl, media: 'all'
-
- - if Rails.env.test?
- = stylesheet_link_tag :poltergeist_disable_transition, media: "all"
-
- = old_browser_js_support
- <!--[if IE]>
- = javascript_include_tag :ie
- <![endif]-->
-
- = jquery_include_tag
- = javascript_include_tag :main, :templates
- = load_javascript_locales
-
= translation_missing_warnings
- = current_user_atom_tag
-
- = yield(:head)
- = csrf_meta_tag
-
-
- = include_gon(camel_case: true, nonce: content_security_policy_nonce(:script))
- %body{ class: "page-#{controller_name} action-#{action_name}" }
+ %body{class: "page-#{controller_name} action-#{action_name}"}
= yield :before_content
%noscript
diff --git a/app/views/layouts/application.mobile.haml b/app/views/layouts/application.mobile.haml
index 819a215b2..618327572 100644
--- a/app/views/layouts/application.mobile.haml
+++ b/app/views/layouts/application.mobile.haml
@@ -3,56 +3,25 @@
-# the COPYRIGHT file.
!!!
-%html{:lang => I18n.locale.to_s, :dir => (rtl?) ? 'rtl' : 'ltr'}
- %head
- %title
- = pod_name
+%html{lang: I18n.locale.to_s, dir: (rtl? ? "rtl" : "ltr")}
+ %head{prefix: og_prefix}
+ - content_for :javascript do
+ = javascript_include_tag "mobile/mobile"
+ = load_javascript_locales
- %meta{:name => "description", :content => "diaspora* mobile"}/
- %meta{:name => "author", :content => "Diaspora, Inc."}/
- %meta{:charset => 'utf-8'}/
-
- / Viewport scale
- %meta{:name =>'viewport', :content => "width=device-width, minimum-scale=1 maximum-scale=1"}/
- %meta{:name => "HandheldFriendly", :content => "True"}/
- %meta{:name => "MobileOptimized", :content => "320"}/
- / Force cleartype on WP7
- %meta{'http-equiv' => "cleartype", :content => 'on'}/
+ = render "head"
+ = include_color_theme "mobile"
- / Home screen icon (sized for retina displays)
- %link{rel: "apple-touch-icon", href: image_path("apple-touch-icon.png")}
- / For Nokia devices
- %link{rel: "shortcut icon", href: image_path("apple-touch-icon.png")}
- / For desktop
- %link{rel: 'shortcut icon', href: image_path("favicon.png")}
+ %meta{name: "viewport", content: "width=device-width, minimum-scale=1 maximum-scale=1"}/
+ %meta{name: "HandheldFriendly", content: "True"}/
+ %meta{name: "MobileOptimized", content: "320"}/
+ %meta{"http-equiv" => "cleartype", :content => "on"}/
/ iOS mobile web app indicator
/ NOTE(we will enable these once we don't have to rely on back/forward buttons anymore)
/%meta{:name => "apple-mobile-web-app-capable", :content => "yes"}
/%link{:rel => "apple-touch-startup-image", :href => "/images/apple-splash.png"}
- = yield :meta_data
-
- = chartbeat_head_block
-
- / Stylesheets
-
- = include_color_theme "mobile"
- = yield(:custom_css)
-
-
- = csrf_meta_tag
-
- - if rtl?
- = stylesheet_link_tag :rtl, :media => 'all'
-
- - if Rails.env.test?
- = stylesheet_link_tag :poltergeist_disable_transition, media: "all"
-
- = jquery_include_tag
-
- = yield(:head)
- = include_gon(camel_case: true, nonce: content_security_policy_nonce(:script))
%body
#app
= render "layouts/header"
@@ -62,10 +31,8 @@
#main{:role => "main"}
- if current_page?(:activity_stream)
%h3
- = t('streams.activity.title')
+ = t("streams.activity.title")
= yield
- / javascripts at the bottom
- = javascript_include_tag "mobile/mobile"
- = load_javascript_locales
= include_chartbeat
+ = include_mixpanel_guid
diff --git a/app/views/notifications/index.html.haml b/app/views/notifications/index.html.haml
index fde543ffc..22e647c05 100644
--- a/app/views/notifications/index.html.haml
+++ b/app/views/notifications/index.html.haml
@@ -7,7 +7,8 @@
= t(".notifications")
.list-group
%a.list-group-item{href: "/notifications" + (params[:show] == "unread" ? "?show=unread" : ""),
- class: ("active" unless params[:type] && @grouped_unread_notification_counts.has_key?(params[:type]))}
+ class: ("active" unless params[:type] && @grouped_unread_notification_counts.has_key?(params[:type])),
+ data: {type: "all"}}
%span.pull-right.badge{class: ("hidden" unless @unread_notification_count > 0)}
= @unread_notification_count
= t(".all_notifications")
diff --git a/app/views/people/show.html.haml b/app/views/people/show.html.haml
index 0eae5e336..60e707010 100644
--- a/app/views/people/show.html.haml
+++ b/app/views/people/show.html.haml
@@ -40,7 +40,7 @@
id: 'mentionModal'
-if @contact
- #new_conversation_pane
+ .conversations-form-container#new_conversation_pane
= render 'shared/modal',
path: new_conversation_path(:contact_id => @contact.id, name: @contact.person.name, modal: true),
title: t('conversations.index.new_conversation'),
diff --git a/app/views/posts/_photo.html.haml b/app/views/posts/_photo.html.haml
deleted file mode 100644
index 851832020..000000000
--- a/app/views/posts/_photo.html.haml
+++ /dev/null
@@ -1,21 +0,0 @@
--# Copyright (c) 2010-2011, Diaspora Inc. This file is
--# licensed under the Affero General Public License version 3 or later. See
--# the COPYRIGHT file.
-
-- content_for :head do
- = javascript_include_tag :photos
-
-#author_info
- = person_image_link(post.author, :size => :thumb_small)
- .from
- %h2
- = post.author_name
-
-#show_photo{:data=>{:guid=>post.id}}
- = image_tag post.url(:scaled_full)
-
- #caption
- = post.text
-
-%br
-= link_to t('photos.show.show_original_post'), post_path(post.status_message)
diff --git a/app/views/shared/_invitations.haml b/app/views/shared/_invitations.haml
index 4c45deee7..b69a18c73 100644
--- a/app/views/shared/_invitations.haml
+++ b/app/views/shared/_invitations.haml
@@ -1,9 +1,12 @@
= t(".share_this")
= invite_link(current_user.invitation_code)
-.invitations-link.btn.btn-link#invitations-button{"data-toggle" => "modal"}
- = t(".by_email")
-= render "shared/modal",
- path: new_user_invitation_path,
- id: "invitationsModal",
- title: t("invitations.new.invite_someone_to_join")
+- if AppConfig.mail.enable?
+ .invitations-link.btn.btn-link#invitations-button{"data-toggle" => "modal"}
+ = t(".by_email")
+
+- content_for :after_content do
+ = render "shared/modal",
+ path: new_user_invitation_path,
+ id: "invitationsModal",
+ title: t("invitations.new.invite_someone_to_join")
diff --git a/app/views/users/_edit.haml b/app/views/users/_edit.haml
index af9aea49b..9a171a923 100644
--- a/app/views/users/_edit.haml
+++ b/app/views/users/_edit.haml
@@ -117,58 +117,59 @@
= render partial: "post_default"
- .row
- .col-md-12
- %h3
- = t(".receive_email_notifications")
- = form_for "user", url: edit_user_path, html: {method: :put} do |f|
- = f.fields_for :email_preferences do |type|
- #email_prefs
- - if current_user.admin?
- = type.label :someone_reported, class: "checkbox-inline" do
- = type.check_box :someone_reported, {checked: @email_prefs["someone_reported"]}, false, true
- = t(".someone_reported")
-
- .small-horizontal-spacer
-
- = type.label :started_sharing, class: "checkbox-inline" do
- = type.check_box :started_sharing, {checked: @email_prefs["started_sharing"]}, false, true
- = t(".started_sharing")
- .small-horizontal-spacer
-
- = type.label :mentioned, class: "checkbox-inline" do
- = type.check_box :mentioned, {checked: @email_prefs["mentioned"]}, false, true
- = t(".mentioned")
- .small-horizontal-spacer
-
- = type.label :liked, class: "checkbox-inline" do
- = type.check_box :liked, {checked: @email_prefs["liked"]}, false, true
- = t(".liked")
- .small-horizontal-spacer
-
- = type.label :reshared, class: "checkbox-inline" do
- = type.check_box :reshared, {checked: @email_prefs["reshared"]}, false, true
- = t(".reshared")
- .small-horizontal-spacer
-
- = type.label :comment_on_post, class: "checkbox-inline" do
- = type.check_box :comment_on_post, {checked: @email_prefs["comment_on_post"]}, false, true
- = t(".comment_on_post")
- .small-horizontal-spacer
-
- = type.label :also_commented, class: "checkbox-inline" do
- = type.check_box :also_commented, {checked: @email_prefs["also_commented"]}, false, true
- = t(".also_commented")
- .small-horizontal-spacer
-
- = type.label :private_message, class: "checkbox-inline" do
- = type.check_box :private_message, {checked: @email_prefs["private_message"]}, false, true
- = t(".private_message")
+ - if AppConfig.mail.enable?
+ .row
+ .col-md-12
+ %h3
+ = t(".receive_email_notifications")
+ = form_for "user", url: edit_user_path, html: {method: :put} do |f|
+ = f.fields_for :email_preferences do |type|
+ #email_prefs
+ - if current_user.admin?
+ = type.label :someone_reported, class: "checkbox-inline" do
+ = type.check_box :someone_reported, {checked: @email_prefs["someone_reported"]}, false, true
+ = t(".someone_reported")
+
+ .small-horizontal-spacer
+
+ = type.label :started_sharing, class: "checkbox-inline" do
+ = type.check_box :started_sharing, {checked: @email_prefs["started_sharing"]}, false, true
+ = t(".started_sharing")
+ .small-horizontal-spacer
+
+ = type.label :mentioned, class: "checkbox-inline" do
+ = type.check_box :mentioned, {checked: @email_prefs["mentioned"]}, false, true
+ = t(".mentioned")
+ .small-horizontal-spacer
+
+ = type.label :liked, class: "checkbox-inline" do
+ = type.check_box :liked, {checked: @email_prefs["liked"]}, false, true
+ = t(".liked")
+ .small-horizontal-spacer
+
+ = type.label :reshared, class: "checkbox-inline" do
+ = type.check_box :reshared, {checked: @email_prefs["reshared"]}, false, true
+ = t(".reshared")
+ .small-horizontal-spacer
+
+ = type.label :comment_on_post, class: "checkbox-inline" do
+ = type.check_box :comment_on_post, {checked: @email_prefs["comment_on_post"]}, false, true
+ = t(".comment_on_post")
+ .small-horizontal-spacer
+
+ = type.label :also_commented, class: "checkbox-inline" do
+ = type.check_box :also_commented, {checked: @email_prefs["also_commented"]}, false, true
+ = t(".also_commented")
+ .small-horizontal-spacer
+
+ = type.label :private_message, class: "checkbox-inline" do
+ = type.check_box :private_message, {checked: @email_prefs["private_message"]}, false, true
+ = t(".private_message")
- .small-horizontal-spacer
+ .small-horizontal-spacer
- .clearfix= f.submit t(".change"), class: "btn btn-primary pull-right", id: "change_email_preferences"
- %hr
+ .clearfix= f.submit t(".change"), class: "btn btn-primary pull-right", id: "change_email_preferences"
+ %hr
.row
.col-md-6#account_data
diff --git a/app/workers/recheck_scheduled_pods.rb b/app/workers/recheck_scheduled_pods.rb
new file mode 100644
index 000000000..8ca2be921
--- /dev/null
+++ b/app/workers/recheck_scheduled_pods.rb
@@ -0,0 +1,9 @@
+module Workers
+ class RecheckScheduledPods < Base
+ sidekiq_options queue: :low
+
+ def perform
+ Pod.check_scheduled!
+ end
+ end
+end
diff --git a/config/color_themes.yml b/config/color_themes.yml
index 6aaa75dfc..896658841 100644
--- a/config/color_themes.yml
+++ b/config/color_themes.yml
@@ -1,6 +1,7 @@
available:
- original: "Original Dark"
+ original: "Original Gray"
original_white: "Original White Background"
dark_green: "Dark Green"
magenta: "Magenta"
egyptian_blue: "Egyptian Blue"
+ dark: "Dark"
diff --git a/config/defaults.yml b/config/defaults.yml
index e1586ff24..1934982ec 100644
--- a/config/defaults.yml
+++ b/config/defaults.yml
@@ -4,7 +4,7 @@
defaults:
version:
- number: "0.6.1.0" # Do not touch unless doing a release, do not backport the version number that's in master
+ number: "0.6.2.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/"
@@ -42,7 +42,7 @@ defaults:
server:
listen: '0.0.0.0:3000'
rails_environment: 'development'
- pid:
+ pid: "tmp/pids/web.pid"
stderr_log:
stdout_log:
unicorn_worker: 2
@@ -144,6 +144,7 @@ defaults:
warn_days: 30
limit_removals_to_per_day: 100
source_url:
+ changelog_url:
default_color_theme: "original"
default_metas:
title: 'diaspora* social network'
diff --git a/config/diaspora.yml.example b/config/diaspora.yml.example
index 25f7291a2..4457d18fe 100644
--- a/config/diaspora.yml.example
+++ b/config/diaspora.yml.example
@@ -177,8 +177,8 @@ configuration: ## Section
#listen: 'unix:/run/diaspora/diaspora.sock'
#listen: '127.0.0.1:3000'
- ## Set the path for the PID file of the unicorn master process (default=none)
- #pid: '/run/diaspora/diaspora.pid'
+ ## Set the path for the PID file of the unicorn master process (default=tmp/pids/web.pid)
+ #pid: 'tmp/pids/web.pid'
## Rails environment (default='development').
## The environment in which the server should be started by default.
@@ -535,6 +535,11 @@ configuration: ## Section
## If not set your pod will provide a downloadable archive.
#source_url: 'https://example.org/username/diaspora'
+ ## Changelog URL
+ ## URL to the changelog of the diaspora-version your pod is currently running.
+ ## If not set an auto-generated url to github is used.
+ #changelog_url: "https://github.com/diaspora/diaspora/blob/master/Changelog.md"
+
## Default color theme
## You can change which color theme is displayed when a user is not signed in
## or has not selected any color theme from the available ones. You simply have
diff --git a/config/eye.rb b/config/eye.rb
index fdfbed198..fbc166709 100644
--- a/config/eye.rb
+++ b/config/eye.rb
@@ -12,10 +12,21 @@ Eye.application("diaspora") do
stderr "log/eye_processes_stderr.log"
process :web do
- start_command "bin/bundle exec unicorn -c config/unicorn.rb"
- daemonize true
- pid_file "tmp/pids/web.pid"
+ unicorn_command = "bin/bundle exec unicorn -c config/unicorn.rb"
+
+ if rails_env == "production"
+ start_command "#{unicorn_command} -D"
+ daemonize false
+ restart_command "kill -USR2 {PID}"
+ restart_grace 10.seconds
+ else
+ start_command unicorn_command
+ daemonize true
+ end
+
+ pid_file AppConfig.server.pid.get
stop_signals [:TERM, 10.seconds]
+
env "PORT" => ENV["PORT"]
monitor_children do
diff --git a/config/initializers/color_themes.rb b/config/initializers/color_themes.rb
index 9c12af8a6..6f76ee51c 100644
--- a/config/initializers/color_themes.rb
+++ b/config/initializers/color_themes.rb
@@ -10,10 +10,10 @@ if color_themes_file.exist?
if color_themes["available"].length > 0
color_themes["available"]
else
- {"original" => "Original Dark"}
+ {"original" => "Original Gray"}
end
else
- AVAILABLE_COLOR_THEMES = {"original" => "Original Dark"}
+ AVAILABLE_COLOR_THEMES = {"original" => "Original Gray"}.freeze
end
# Get all codes from available themes into a separate variable, so that they can be called easier.
AVAILABLE_COLOR_THEME_CODES = AVAILABLE_COLOR_THEMES.keys
diff --git a/config/initializers/diaspora_federation.rb b/config/initializers/diaspora_federation.rb
index 1b549fb17..49ff3da6c 100644
--- a/config/initializers/diaspora_federation.rb
+++ b/config/initializers/diaspora_federation.rb
@@ -93,7 +93,9 @@ DiasporaFederation.configure do |config|
end
end
- on :receive_entity do |entity, _sender, recipient_id|
+ on :receive_entity do |entity, sender, recipient_id|
+ Person.by_account_identifier(sender).pod.try(:schedule_check_if_needed)
+
case entity
when DiasporaFederation::Entities::AccountDeletion
Diaspora::Federation::Receive.account_deletion(entity)
diff --git a/config/locales/devise/devise.cs.yml b/config/locales/devise/devise.cs.yml
index f69a8529a..775bb4368 100644
--- a/config/locales/devise/devise.cs.yml
+++ b/config/locales/devise/devise.cs.yml
@@ -12,9 +12,11 @@ cs:
resend_confirmation: "Zaslat instrukce o potvrzení"
send_instructions: "Během několika minut obdržíte email s instrukcemi k potvrzení vašeho účtu."
failure:
+ already_authenticated: "již jste přihlášen"
inactive: "Váš účet ještě nebyl aktivován."
invalid: "Neplatné uživatelské jméno nebo heslo."
invalid_token: "Neplatný autentizační token."
+ last_attempt: "Máte ještě jeden pokus před uzamčením účtu"
locked: "Váš účet je uzamčen."
not_found_in_database: "Chybný email nebo heslo."
timeout: "Vaše sezení vypršelo, pro pokračování se prosím přihlašte znovu."
@@ -34,6 +36,8 @@ cs:
accept_at: "na %{url}, přijmout pozvání můžete pomocí odkazu níže."
has_invited_you: "%{name}"
have_invited_you: "%{names} vás pozvali, abyste vstoupili do Diaspory"
+ password_change:
+ subject: "Heslo změněno"
reset_password_instructions:
change: "Změnit moje heslo"
ignore: "Pokud nechcete potvrdit pozvání, tento e-mail prosím ignorujte."
@@ -64,6 +68,7 @@ cs:
signed_up: "Úspěšně jste vytvořili účet. Pokud je tak server nastaven, byl vám zaslán potvrzovací email."
updated: "Úspěšně jste upravili svůj účet."
sessions:
+ already_signed_out: "Úspěšně odhlášen."
new:
login: "Přihlásit"
modern_browsers: "podporuje pouze moderní prohlížeče."
@@ -85,9 +90,12 @@ cs:
new:
resend_unlock: "Znovu zaslat instrukce k odemknutí účtu."
send_instructions: "Během několika minut obdržíte email s instrukcemi k odemknutí vašeho účtu."
+ send_paranoid_instructions: "Váš účet již existuje, během několika minut dostanete email s instrukcemi, jak je odemknout"
unlocked: "Váš účet byl úspěšně odemknut. Nyní jste přihlášeni."
errors:
messages:
already_confirmed: "již bylo potvrzeno"
+ confirmation_period_expired: "nutné potvrdit do %{period}, prosím, požádejte znovu"
+ expired: "vypršel, prosím požadujte nový"
not_found: "nenalezeno"
not_locked: "nebylo zamčeno" \ No newline at end of file
diff --git a/config/locales/devise/devise.da.yml b/config/locales/devise/devise.da.yml
index 645d41690..8243f6d7d 100644
--- a/config/locales/devise/devise.da.yml
+++ b/config/locales/devise/devise.da.yml
@@ -7,17 +7,20 @@
da:
devise:
confirmations:
- confirmed: "Din konto er blevet bekræftet. Du er nu logget ind"
+ confirmed: "Din e-mailadresse er blevet bekræftet."
new:
resend_confirmation: "Send bekræftelse igen"
- send_instructions: "Du vil modtage en e-mail med instruktioner om hvordan du bekræfter din konto om et par minutter."
+ send_instructions: "Du vil modtage en e-mail med instruktioner om hvordan du bekræfter din e-mailadresse om et øjeblik."
+ send_paranoid_instructions: "Hvis din e-mailadresse eksisterer i vores database, vil du modtage en e-mail med instruktioner om hvordan du bekræfter din e-mailadresse om et øjeblik."
failure:
- inactive: "Din konto er endnu ikke aktiveret."
+ already_authenticated: "Du er allerede logget ind."
+ inactive: "Din konto er ikke aktiveret endnu."
invalid: "Forkert %{authentication_keys} eller adgangskode."
invalid_token: "Ugyldig autentifikation."
+ last_attempt: "Du har et forsøg mere inden din konto bliver låst."
locked: "Din konto er låst."
- not_found_in_database: "Forkert e-mail eller adgangskode."
- timeout: "Du har været inaktiv for længe. Log ind for at fortsætte."
+ not_found_in_database: "Ugyldig %{authentication_keys} eller adgangskode."
+ timeout: "Du har været inaktiv for længe. Log ind igen for at fortsætte."
unauthenticated: "Du skal logge ind eller oprette en konto for at fortsætte."
unconfirmed: "Du skal bekræfte din e-mailkonto før du fortsætter."
invitations:
@@ -34,6 +37,8 @@ da:
accept_at: "på %{url}, du kan acceptere ved at følge linket nedenunder."
has_invited_you: "%{name}"
have_invited_you: "%{names} har inviteret dig til at deltage i Diaspora."
+ password_change:
+ subject: "Kodeord er blevet ændret"
reset_password_instructions:
change: "Skift min adgangskode"
ignore: "Hvis du ikke har anmodet om dette, bedes du ignorere denne e-mail."
@@ -46,6 +51,9 @@ da:
subject: "Aktiver instruktioner"
unlock: "Aktiver min konto"
welcome: "Velkommen %{email}!"
+ omniauth_callbacks:
+ failure: "Kunne ikke godkende dig fra %{kind} fordi \"%{reason}\"."
+ success: "Godkendelse modtaget fra %{kind} kontoen."
passwords:
edit:
change_password: "skift adgangskode"
@@ -57,13 +65,21 @@ da:
no_account: "Ingen konto med denne email adresse eksisterer."
reset_password: "Nulstil adgangskode"
send_password_instructions: "Send mig instruktioner til nulstilning af adgangskode"
- send_instructions: "Du vil modtage en e-mail med instruktioner om hvordan du kan nulstille din adgangskode om et par minutter."
- updated: "Dit adgangskode er nu ændret. Du er nu logget ind."
+ no_token: "Du kan ikke tilgå denne side uden at komme fra en e-mail med nulstilling af dit kodeord. Hvis du kommer fra sådan en e-mail, undersøg venligst at du har brugt hele den URL der stod i mailen."
+ send_instructions: "Du vil modtage en e-mail med instruktioner om hvordan du kan nulstille din adgangskode om et øjeblik."
+ send_paranoid_instructions: "Hvis din e-mailadresse eksisterer i vores database, vil du modtage et link med en kodeords-nulstilling i din mailboks om et øjeblik."
+ updated: "Dit adgangskode er blevet ændret. Du er nu logget ind."
+ updated_not_active: "Dit kodeord er nu blevet ændret."
registrations:
destroyed: "Farvel! Din konto er nu lukket. Vi håber at se dig igen snart."
signed_up: "Du har nu tilmeldt dig. En bekræftelse er blevet sendt til din e-mail, hvis den er aktiveret."
- updated: "Din konto er nu opdateret."
+ signed_up_but_inactive: "Din registrering er godkendt, men vi kunne ikke logge dig ind da din konto endnu ikke er blevet aktiveret."
+ signed_up_but_locked: "Din registrering er godkendt, men vi kunne ikke logge dig ind da din konto er låst."
+ signed_up_but_unconfirmed: "Der er blevet sendt en besked til din e-mailadresse med et bekræftelses-link. Følg venligst dette link for at aktivere din konto."
+ update_needs_confirmation: "Du har nu opdateret din konto, men vi er nødt bekræfte din nye e-mailadresse. Check din e-mail og følg linket for at bekræfte din nye e-mailadresse."
+ updated: "Din konto er blevet opdateret."
sessions:
+ already_signed_out: "Du er nu logget ud."
new:
login: "Log ind"
modern_browsers: "understøtter kun nyere browsere."
@@ -84,10 +100,16 @@ da:
unlocks:
new:
resend_unlock: "Send vejledningen til aktivering af konto igen"
- send_instructions: "Du vil modtage en e-mail om et par minutter med instruktioner om hvordan du kan låse din konto op."
- unlocked: "Din konto er blevet låst op. Du er nu logget ind."
+ send_instructions: "Du vil modtage en e-mail om et øjeblik med instruktioner om hvordan du kan låse din konto op."
+ send_paranoid_instructions: "Hvis din konto eksisterer, vil du modtage en e-mail med instruktioner om hvordan du læser den op om et øjeblik."
+ unlocked: "Din konto er blevet låst op. Log ind for at fortsætte."
errors:
messages:
already_confirmed: "var allerede bekræftet - prøv at logge ind"
+ confirmation_period_expired: "skal bekræftes indenfor %{period}, bed venligst om en ny"
+ expired: "er udløbet, bed venligst om en ny"
not_found: "ikke fundet"
- not_locked: "blev ikke låst" \ No newline at end of file
+ not_locked: "blev ikke låst"
+ not_saved:
+ one: "En fejl forhindrede denne %{resource} i at blive gemt:"
+ other: "%{count} fejl forhindrede denne %{resource} i at blive gemt:" \ No newline at end of file
diff --git a/config/locales/devise/devise.fr.yml b/config/locales/devise/devise.fr.yml
index a6dd4277f..411852a96 100644
--- a/config/locales/devise/devise.fr.yml
+++ b/config/locales/devise/devise.fr.yml
@@ -15,11 +15,11 @@ fr:
failure:
already_authenticated: "Vous êtes déjà connecté-e"
inactive: "Votre compte n’a pas encore été activé."
- invalid: "Pseudo ou mot de passe invalide."
+ invalid: "%{authentication_keys} ou mot de passe invalide."
invalid_token: "Jeton d’authentification invalide."
last_attempt: "Vous avez encore une tentative avant que votre compte ne soit verrouillé."
locked: "Votre compte est verrouillé."
- not_found_in_database: "Courriel ou mot de passe invalide."
+ not_found_in_database: "%{authentication_keys} ou mot de passe invalide."
timeout: "Votre session a expiré. Veuillez vous connecter de nouveau pour continuer."
unauthenticated: "Vous devez vous connecter ou vous inscrire avant de continuer."
unconfirmed: "Vous devez confirmer votre compte avant de continuer."
diff --git a/config/locales/devise/devise.hu.yml b/config/locales/devise/devise.hu.yml
index c0e6aa96d..ebcbfea97 100644
--- a/config/locales/devise/devise.hu.yml
+++ b/config/locales/devise/devise.hu.yml
@@ -7,7 +7,7 @@
hu:
devise:
confirmations:
- confirmed: "Fiókod megerősítve. Be vagy jelentkezve."
+ confirmed: "Az e-mail címedet sikeresen megerősítetted."
new:
resend_confirmation: "Megerősítési utasítások újraküldése"
send_instructions: "Pár percen belül kapsz egy e-mailt, benne a megerősítéshez szükséges utasításokkal."
@@ -18,12 +18,12 @@ hu:
locked: "A fiókod zárolva van."
not_found_in_database: "Érvénytelen e-mail cím vagy jelszó"
timeout: "A munkamenet lejárt, kérjük jelentkezz be újra."
- unauthenticated: "A továbblépéshez jelentkezz be vagy iratkozz fel."
+ unauthenticated: "A továbblépéshez bejelentkezés vagy regisztráció szükséges."
unconfirmed: "Előbb meg kell erősítened fiókodat."
invitations:
invitation_token_invalid: "Sajnáljuk, de a meghívás nem érvényes."
send_instructions: "A meghívód elküldve."
- updated: "A jelszó módosítva. Be vagy jelentkezve."
+ updated: "A jelszó beállítva. Bejelentkeztél."
mailer:
confirmation_instructions:
confirm: "Fiókom megerősítése"
@@ -56,9 +56,9 @@ hu:
forgot_password: "Elfelejtetted a jelszavad?"
no_account: "Ehhez az e-mail címhez nem tartozik fiók."
reset_password: "Jelszó visszaállítása"
- send_password_instructions: "Küldd el nekem a jelszó alaphelyzetbe állításához szükséges utasításokat"
+ send_password_instructions: "Új jelszót igénylek"
send_instructions: "Néhány perc múlva kapsz egy e-mailt arról, hogyan állíthatod alaphelyzetbe a jelszavadat."
- updated: "A jelszavad megváltozott. Be vagy jelentkezve vele."
+ updated: "A jelszavad megváltozott. Sikeresen bejelentkeztél."
registrations:
destroyed: "Viszlát! A fiókod törölve. Reméljük hamarosan újra látunk. =)"
signed_up: "Sikeresen feliratkoztál. Ha engedélyezve van, akkor egy megerősítő e-mailt küldünk."
@@ -79,13 +79,13 @@ hu:
receive_confirmation: "Nem kaptál megerősítési utasítást?"
receive_unlock: "Nem kaptad meg feloldási utasítást?"
sign_in: "Bejelentkezés"
- sign_up: "Feliratkozás"
- sign_up_closed: "Nincs nyílt feliratkozási lehetőség jelenleg."
+ sign_up: "Fiók létrehozása"
+ sign_up_closed: "A nyílt regisztrálás jelenleg nem hozzáférhető."
unlocks:
new:
resend_unlock: "Feloldási utasítások újraküldése"
send_instructions: "Pár percen belül kapsz egy e-mailt, benne a feloldáshoz szükséges utasításokkal."
- unlocked: "A fiókod sikeresen feloldva. Be vagy jelentkezve."
+ unlocked: "A fiókod sikeresen feloldva. Jelentkezz be a folytatáshoz."
errors:
messages:
already_confirmed: "már megerősítette"
diff --git a/config/locales/devise/devise.hy.yml b/config/locales/devise/devise.hy.yml
index f3213a5d3..7fdc8d1f3 100644
--- a/config/locales/devise/devise.hy.yml
+++ b/config/locales/devise/devise.hy.yml
@@ -13,6 +13,7 @@ hy:
send_instructions: "Րոպեների ընթացքում նամակ կստանաս՝ էլ․հասցեդ հաստատելու ցուցումներով։"
send_paranoid_instructions: "Եթե քո էլ․հասցեն կա մեր տվյալների բազայում, րոպեների ընթացքում նամակ կստանաս՝ էլ․հասցեդ հաստատելու ցուցումներով։"
failure:
+ already_authenticated: "Արդեն մուտք գործած ես։"
inactive: "Քո հաշիվը դեռ ակտիվացված չէ։"
invalid: "Սխալ %{authentication_keys} կամ գաղտնաբառ։"
invalid_token: "Նույնականացման սխալ։"
@@ -99,5 +100,10 @@ hy:
errors:
messages:
already_confirmed: "արդեն հաստատվել է, փորձիր մուտք գործել"
+ confirmation_period_expired: "պետք է հաստատվի %{period}վա ընթացքում, խնդրում ենք նորը հայցիր"
+ expired: "լրացել է, խնդրում ենք նորը հայցիր"
not_found: "չի գտնվել"
- not_locked: "կողպված չէ" \ No newline at end of file
+ not_locked: "արգելափակված չէր"
+ not_saved:
+ one: "1 սխալանք խոչընդոտեց այս %{resource}֊ի պահպանվելուն․"
+ other: "%{count} սխալանք խոչընդոտեցին այս %{resource}֊ի պահպանվելուն․" \ No newline at end of file
diff --git a/config/locales/devise/devise.ia.yml b/config/locales/devise/devise.ia.yml
index 433159229..bde47d17f 100644
--- a/config/locales/devise/devise.ia.yml
+++ b/config/locales/devise/devise.ia.yml
@@ -11,10 +11,13 @@ ia:
new:
resend_confirmation: "Reinviar instructiones pro confirmar"
send_instructions: "Tu recipera in pauc minutas un message de e-mail con instructiones pro confirmar tu conto."
+ send_paranoid_instructions: "Si tu adresse de e-mail existe in nostre base de datos, tu recipera in pauc minutas un e-mail con instructiones pro confirmar tu adresse de e-mail."
failure:
+ already_authenticated: "Tu ha jam aperite session."
inactive: "Tu conto non ha ancora essite activate."
invalid: "Nomine de usator o contrasigno invalide."
invalid_token: "Indicio de authentication invalide."
+ last_attempt: "Tu pote tentar solmente un altere vice ante que le conto es blocate."
locked: "Tu conto es blocate."
not_found_in_database: "E-mail o contrasigno invalide."
timeout: "Le session ha expirate. Per favor aperi session de novo pro continuar."
@@ -34,6 +37,8 @@ ia:
accept_at: "a %{url}, tu pote acceptar lo per le ligamine sequente."
has_invited_you: "%{name}"
have_invited_you: "%{names} te ha invitate a unir te a diaspora*"
+ password_change:
+ subject: "Contrasigno cambiate"
reset_password_instructions:
change: "Cambiar mi contrasigno"
ignore: "Si tu non ha demandate isto, per favor ignora iste message."
@@ -46,6 +51,9 @@ ia:
subject: "Instructiones pro disblocar"
unlock: "Disblocar mi conto"
welcome: "Benvenite, %{email}!"
+ omniauth_callbacks:
+ failure: "Impossibile authenticar te a partir de %{kind} perque \"%{reason}\"."
+ success: "Authentication a partir del conto %{kind} succedite."
passwords:
edit:
change_password: "Cambiar mi contrasigno"
@@ -57,13 +65,21 @@ ia:
no_account: "Nulle conto con iste adresse de e-mail existe."
reset_password: "Reinitialisar contrasigno"
send_password_instructions: "Inviar instructiones pro reinitialisar contrasigno"
+ no_token: "Tu non pote acceder a iste pagina sin venir ab un e-mail pro reinitialisar contrasigno. Si tu de facto veni ab un e-mail pro reinitialisar contrasigno, per favor assecura te de usar le totalitate del URL fornite."
send_instructions: "Tu recipera in pauc minutas un message de e-mail con instructiones pro reinitialisar le contrasigno."
+ send_paranoid_instructions: "Si tu adresse de e-mail existe in nostre base de datos, tu recipera in pauc minutas un e-mail con un ligamine pro recuperar le contrasigno."
updated: "Le contrasigno ha essite cambiate con successo. Tu ha aperite session."
+ updated_not_active: "Tu contrasigno ha essite cambiate."
registrations:
destroyed: "Adeo! Le deletion de tu conto ha succedite. Nos spera revider te bentosto."
signed_up: "Conto create con successo. Si applicabile, un confirmation ha essite inviate a tu adresse de e-mail."
+ signed_up_but_inactive: "Le creation de tu conto ha succedite. Totevia, nos non ha potite aperir tu session perque tu conto non es ancora activate."
+ signed_up_but_locked: "Le creation de tu conto ha succedite. Totevia, nos non ha potite aperir tu session perque tu conto es blocate."
+ signed_up_but_unconfirmed: "Un message con un ligamine de confirmation ha essite inviate a tu adresse de e-mail. Per favor, seque le ligamine pro activar tu conto."
+ update_needs_confirmation: "Tu ha actualisate tu conto, ma nos debe verificar tu nove adresse de e-mail. Per favor, lege tu e-mail e seque le ligamine de confirmation pro confirmar tu nove adresse de e-mail."
updated: "Conto actualisate con successo."
sessions:
+ already_signed_out: "Le session ha essite claudite."
new:
login: "Aperir session"
modern_browsers: "supporta solmente le navigatores moderne."
@@ -85,9 +101,15 @@ ia:
new:
resend_unlock: "Reinviar instructiones pro disblocar"
send_instructions: "Tu recipera in pauc minutas un message de e-mail con instructiones pro disblocar tu conto."
+ send_paranoid_instructions: "Si tu conto existe, tu recipera in pauc minutas un e-mail con instructiones pro disblocar lo."
unlocked: "Conto disblocate con successo. Tu ha aperite session."
errors:
messages:
already_confirmed: "ha jam essite confirmate"
+ confirmation_period_expired: "debe esser confirmate intra %{period}, per favor requesta un altere"
+ expired: "ha expirate, per favor requesta un altere"
not_found: "non trovate"
- not_locked: "non ha essite blocate" \ No newline at end of file
+ not_locked: "non ha essite blocate"
+ not_saved:
+ one: "Un error ha impedite iste %{resource} de esser salveguardate:"
+ other: "%{count} errores ha impedite iste %{resource} de esser salveguardate:" \ No newline at end of file
diff --git a/config/locales/devise/devise.ja.yml b/config/locales/devise/devise.ja.yml
index 7cfff0e10..17bb41697 100644
--- a/config/locales/devise/devise.ja.yml
+++ b/config/locales/devise/devise.ja.yml
@@ -15,12 +15,12 @@ ja:
failure:
already_authenticated: "既にサインイン済みです。"
inactive: "アカウントはまだ有効になっていません。"
- invalid: "ユーザ名またはパスワードが不正です。"
+ invalid: "%{authentication_keys} またはパスワードが不正です。"
invalid_token: "無効な認証トークンです。"
last_attempt: "アカウントがロックされるまでに、まだ複数回試すことができます。"
locked: "アカウントがロックされています。"
- not_found_in_database: "メールアドレスまたはパスワードが無効です。"
- timeout: "セッション切れになりました。続くにはもう一度サインインしてください。"
+ not_found_in_database: "%{authentication_keys}またはパスワードが無効です。"
+ timeout: "セッション切れになりました。もう一度サインインして続行してください。"
unauthenticated: "進むにはサインインまたは新規登録する必要があります。"
unconfirmed: "進にはアカウントを確認する必要があります。"
invitations:
@@ -61,8 +61,8 @@ ja:
new_password: "新しいパスワード"
new:
email: "メールアドレス"
- forgot_password: "パスワードを忘れましたか。"
- no_account: "このメールアドレスに一致するアカウントは存在しません。招待待ちの方は、なるべく早く出せるように努力していますので、もう少々お待ちください。"
+ forgot_password: "パスワードを忘れましたか?"
+ no_account: "このメールアドレスに一致するアカウントは存在しません"
reset_password: "パスワードの再設定"
send_password_instructions: "パスワード再発行の手続きメールを送ってください。"
no_token: "パスワードリセットのメールからではないと、このページにアクセスすることはできません。パスワードリセットのメールから来た場合は、提供された完全なURLを使用していることを確認してください。"
@@ -86,12 +86,12 @@ ja:
password: "パスワード"
remember_me: "ログインしたままにする"
sign_in: "サインイン"
- username: "ユーザ名"
+ username: "ユーザー名"
signed_in: "サインインに成功しました。"
signed_out: "サインアウトに成功しました。"
shared:
links:
- forgot_your_password: "パスワードを忘れましたか。"
+ forgot_your_password: "パスワードを忘れましたか?"
receive_confirmation: "認証手続きメールが届きませんでしたか。"
receive_unlock: "ロック解除の説明が届きませんでしたか。"
sign_in: "サインイン"
diff --git a/config/locales/devise/devise.nl.yml b/config/locales/devise/devise.nl.yml
index 5737adb57..25d2f5c88 100644
--- a/config/locales/devise/devise.nl.yml
+++ b/config/locales/devise/devise.nl.yml
@@ -12,6 +12,7 @@ nl:
resend_confirmation: "Stuur bevestigingsinstructies nogmaals"
send_instructions: "Je ontvangt binnen enkele minuten een e-mail met instructies om je account te activeren."
failure:
+ already_authenticated: "Je bent al ingelogd."
inactive: "Je account is nog niet geactiveerd."
invalid: "Gebruikersnaam of wachtwoord ongeldig."
invalid_token: "Ongeldig authenticatietoken."
@@ -34,6 +35,8 @@ nl:
accept_at: "op %{url}, je kunt deze accepteren via onderstaande link."
has_invited_you: "%{name}"
have_invited_you: "%{names} heeft je uitgenodigd om lid te worden van diaspora*"
+ password_change:
+ subject: "Wachtwoord gewijzigd"
reset_password_instructions:
change: "Wijzig mijn wachtwoord"
ignore: "Als je hier niet om hebt gevraagd kun je deze mail gewoon negeren."
@@ -64,6 +67,7 @@ nl:
signed_up: "Je bent succesvol geregistreerd. Indien aangevinkt is er een bevestiging naar je e-mail gestuurd."
updated: "Je account is succesvol geüpdate."
sessions:
+ already_signed_out: "Succesvol uitgelogd."
new:
login: "Inloggen"
modern_browsers: "ondersteunt alleen moderne browsers."
@@ -89,5 +93,6 @@ nl:
errors:
messages:
already_confirmed: "is al geactiveerd"
+ expired: "is vervallen, vraag een nieuwe aan"
not_found: "niet gevonden"
not_locked: "is niet geblokkeerd" \ No newline at end of file
diff --git a/config/locales/devise/devise.oc.yml b/config/locales/devise/devise.oc.yml
new file mode 100644
index 000000000..2c88afc6f
--- /dev/null
+++ b/config/locales/devise/devise.oc.yml
@@ -0,0 +1,107 @@
+# Copyright (c) 2010-2013, Diaspora Inc. This file is
+# licensed under the Affero General Public License version 3 or later. See
+# the COPYRIGHT file.
+
+
+
+oc:
+ devise:
+ confirmations:
+ confirmed: "Vòstre compte es estat confirmat. Ara, sètz connectat."
+ new:
+ resend_confirmation: "Renviar las instruccions de confirmacion"
+ failure:
+ already_authenticated: "Sètz ja connectat"
+ inactive: "Vòstre compte es pas encara estat activat."
+ invalid: "%{authentication_keys} o senhal invalid."
+ invalid_token: "Geton d'autentificacion invalid."
+ last_attempt: "Avètz encara una tempatativa abans que vòstre compte siá verrolhat."
+ locked: "Vòstre compte es verrolhat."
+ not_found_in_database: "%{authentication_keys} o senhal pas valid."
+ timeout: "Vòstra session a expirat. Connectatz-vos tornamai per contunhar."
+ unauthenticated: "Vos cal vos connectar o vos inscriure abans de contunhar."
+ unconfirmed: "Vos cal confirmar vòstre compte abans de contunhar."
+ invitations:
+ invitation_token_invalid: "O planhèm ! Aqueste convit es pas valid."
+ send_instructions: "Vòstre convit es estat mandat."
+ updated: "Vòstre senhal es estat creat. Ara, sètz connectat."
+ mailer:
+ confirmation_instructions:
+ confirm: "Confirmar mon compte"
+ subject: "Instruccions de confirmacion"
+ you_can_confirm: "Podètz confirmar vòstre compte en clicant sul ligam çaijós :"
+ hello: "Adieusiatz %{email} !"
+ inviter:
+ accept_at: "a %{url}, lo podètz acceptar a travèrs lo ligal çaijós."
+ has_invited_you: "%{name}"
+ have_invited_you: "%{names} vos a convidat a rejónher diaspora*"
+ password_change:
+ subject: "Senhal cambiat"
+ reset_password_instructions:
+ change: "Cambiar mon senhal"
+ ignore: "Se avètz pas demandat aquò, mercé d'ignorar aqueste corrièl."
+ subject: "Instruccions de reïnicializacion del senhal"
+ wont_change: "Vòstre senhal cambiarà pas tant que n'auretz pas creat un novèl en accedissent al ligam çaijós."
+ unlock_instructions:
+ account_locked: "Vòstre compte es estat verrolhat en rason d'un nombre excessiu de temptativas infructuosas de connexion."
+ click_to_unlock: "Clicatz sul ligam çaijós per desblocar vòstre compte :"
+ subject: "Instruccions de desverrolhatge"
+ unlock: "Desverrolhar mon compte"
+ welcome: "Benvenguda %{email} !"
+ omniauth_callbacks:
+ failure: "Impossible de vos indentificar dempuèi %{kind} perque %{reason}"
+ success: "Autentificacion capitada dempuèi lo compte %{kind}."
+ passwords:
+ edit:
+ change_password: "Cambiar mon senhal"
+ confirm_password: "Confirmar la senhal"
+ new_password: "Senhal novèl"
+ new:
+ email: "Adreça de corrièl"
+ forgot_password: "Avètz doblidat vòstre senhal ?"
+ no_account: "Cap de compte es pas associat a aquesta adreça de corrièr electronic."
+ reset_password: "Reïnicializar lo senhal"
+ send_password_instructions: "Mandar las instruccions de reïnicializacion de senhal"
+ updated: "Vòstre senhal es estat modificat. Ara, sètz connectat."
+ updated_not_active: "Vòstre senhal es estat cambiat amb succès."
+ registrations:
+ signed_up: "Vòstra inscripcion es estada efectuada. Se aquesta darrièra es activada, una confirmacion es estada mandada a vòstra adreça de corrièr electronic."
+ signed_up_but_inactive: "Vos sètz inscrit amb succès. Pasmens, vos podètz pas connectar perque vòstre compte es pas encara activat."
+ signed_up_but_locked: "Vos sètz inscrit amb succès. Pasmens, podètz pas vos connectar perque vòstre compte es verrolhat."
+ signed_up_but_unconfirmed: "Un corrièr electronic amb un ligam de confirmacion vos es estat mandat. Seguissètz aqueste ligam per activar vòstre compte."
+ update_needs_confirmation: "Avètz mes a jorn corrèctament vòstre compte mas nos cal verificar vòstra novèla adreça electronica. Consultatz vòstra bóstia de letras e clicatz sul ligam de confirmacion."
+ updated: "Avètz mes a jorn vòstre compte."
+ sessions:
+ already_signed_out: "Desconnexion capitada."
+ new:
+ login: "Connexion"
+ modern_browsers: "supòrta solament de navigadors modèrnes."
+ password: "Senhal"
+ remember_me: "Se remembrar de ieu"
+ sign_in: "Connexion"
+ username: "Nom d'utilizaire"
+ signed_in: "Ara, sètz connectat."
+ signed_out: "Ara, sètz desconnectat."
+ shared:
+ links:
+ forgot_your_password: "Avètz doblidat vòstre senhal ?"
+ receive_confirmation: "Avètz pas recebut las instruccions de confirmacion ?"
+ receive_unlock: "Avètz pas recebut las instruccions de desblocatge ?"
+ sign_in: "Connexion"
+ sign_up: "Crear un compte"
+ sign_up_closed: "Las inscripcions son tampadas pel moment."
+ unlocks:
+ new:
+ resend_unlock: "Renviar las instruccions de desblocatge"
+ send_paranoid_instructions: "Se vòstre compte existís, recebretz un corrièl amb d'instruccions per lo desverrolhar d'aicí qualques minutas."
+ unlocked: "Vòstre compte es estat verrolhat. Ara, sètz connectat."
+ errors:
+ messages:
+ already_confirmed: "es ja estat confirmat"
+ confirmation_period_expired: "auriá degut èsser confirmat dins los %{period}, demandatz un novèl"
+ expired: "a expirat, fasètz una novèla demanda"
+ not_found: "pas trobat"
+ not_locked: "èra pas verrolhat"
+ not_saved:
+ one: "1 error a empachat aqueste %{resource} d'èsser utilizat"
+ other: "%{count} errors an empachat aqueste %{resource} d'èsser utilizat" \ No newline at end of file
diff --git a/config/locales/devise/devise.sv.yml b/config/locales/devise/devise.sv.yml
index 37360dc31..1d61a9201 100644
--- a/config/locales/devise/devise.sv.yml
+++ b/config/locales/devise/devise.sv.yml
@@ -7,19 +7,22 @@
sv:
devise:
confirmations:
- confirmed: "Ditt konto har verifierats och du är inloggad."
+ confirmed: "Din e-postadress har verifierats."
new:
resend_confirmation: "Skicka instruktioner för att bekräfta kontot igen"
- send_instructions: "Du kommer att få ett e-brev med instruktioner för att verifiera ditt konto inom några minuter."
+ send_instructions: "Du kommer inom några minuter att få ett e-brev med instruktioner för att verifiera din e-postadress."
+ send_paranoid_instructions: "Om din e-postadress finns i vår databas, kommer du att få ett brev med instruktioner om hur du på några minuter bekräftar din adress."
failure:
- inactive: "Ditt konto är inte aktiverat."
- invalid: "Fel användarnamn eller lösenord."
+ already_authenticated: "Du är redan inloggad."
+ inactive: "Ditt konto är inte aktiverat ännu."
+ invalid: "Fel %{authentication_keys} eller lösenord."
invalid_token: "Ogiltig identifiering."
+ last_attempt: "Du har ett försök till innan du blir utelåst."
locked: "Ditt konto är låst."
- not_found_in_database: "Ogiltig e-postadress eller ogiltigt lösenord."
- timeout: "Din session är avslutad, var vänlig logga in igen."
+ not_found_in_database: "Ogiltig %{authentication_keys} eller ogiltigt lösenord."
+ timeout: "Din session är avslutad. Vänligen logga in igen för att fortsätta."
unauthenticated: "Du måste logga in innan du kan fortsätta."
- unconfirmed: "Du måste verifiera ditt konto innan du kan fortsätta."
+ unconfirmed: "Du måste verifiera din e-postadress innan du kan fortsätta."
invitations:
invitation_token_invalid: "Vi ber om ursäkt! Den här inbjudan är inte giltig!"
send_instructions: "Din inbjudan är nu skickad."
@@ -34,6 +37,8 @@ sv:
accept_at: "via %{url}. Du accepterar genom att klicka på länken nedan."
has_invited_you: "%{name}"
have_invited_you: "%{names} har bjudit in dig att gå med i Diaspora*"
+ password_change:
+ subject: "Lösenordet är bytt"
reset_password_instructions:
change: "Ändra mitt lösenord"
ignore: "Om det inte är du som vill byta lösenord så kan du ignorera det här mailet."
@@ -46,6 +51,9 @@ sv:
subject: "Upplåsningsinstruktioner"
unlock: "Lås upp mitt konto"
welcome: "Välkommen %{email}!"
+ omniauth_callbacks:
+ failure: "Kunde inte autentisera dig från %{kind} på grund av: %{reason}"
+ success: "Lyckades autentisera från kontot %{kind}."
passwords:
edit:
change_password: "Ändra mitt lösenord"
@@ -57,13 +65,21 @@ sv:
no_account: "Det finns inget konto med den här e-postadressen."
reset_password: "Återställ lösenord"
send_password_instructions: "Skicka information om hur jag återställer lösenordet"
- send_instructions: "Du kommer att få ett e-brev med instruktioner för att återställa lösenordet inom några minuter."
- updated: "Ditt lösenord har ändrats och du är inloggad."
+ no_token: "Du får inte tillgång till den här sidan utan en länk för att ställa in ett nytt lösenord via e-post. Om du kom hit genom en sådan, kontrollera att de använde hela URL:en som angavs."
+ send_instructions: "Du kommer inom några minuter att få ett e-brev med instruktioner för att återställa lösenordet."
+ send_paranoid_instructions: "Om din e-postadress finns i vår databas, kommer du inom några få minuter att få en länk skickad till dig för att kunna återställa ditt lösenord."
+ updated: "Ditt lösenord har ändrats och du är nu inloggad."
+ updated_not_active: "Ditt lösenord är ändrat."
registrations:
destroyed: "Ditt konto är avslutat. På återseende!"
signed_up: "Du har skapat ett konto. Beroende på dina inställningar kan en bekräftelse ha skickats till din e-postadress."
+ signed_up_but_inactive: "Du har nu registrerat dig, men du kommer inte kunna logga in förrän ditt konto är aktiverat."
+ signed_up_but_locked: "Du har nu registrerat dig, men du kan inte logga in medans ditt konto är låst."
+ signed_up_but_unconfirmed: "En bekräftelselänk är du skickad till dig via e-post. Följ den för att aktivera ditt konto."
+ update_needs_confirmation: "Ditt konto har uppdaterats, men vi måste bekräfta din nya e-postadress. Titta i din inkorg och följ länken från oss för att bekräfta din nya adress."
updated: "Ditt konto har uppdateras."
sessions:
+ already_signed_out: "Utloggningen lyckades."
new:
login: "Logga in"
modern_browsers: "stöder endast moderna webbläsare."
@@ -84,10 +100,16 @@ sv:
unlocks:
new:
resend_unlock: "Skicka upplåsningsinstruktioner igen"
- send_instructions: "Du kommer att få ett e-brev med instruktioner för att låsa upp ditt konto inom några minuter."
- unlocked: "Ditt konto har är nu upplåst och du är inloggad"
+ send_instructions: "Du kommer inom några minuter att få ett e-brev med instruktioner för att låsa upp ditt konto."
+ send_paranoid_instructions: "Om ditt konto finns, kommer du inom några minuter att få ett e-brev med instruktioner för hur du låser upp det."
+ unlocked: "Ditt konto har är nu upplåst. Vänligen logga in för att fortsätta."
errors:
messages:
- already_confirmed: "var redan bekräftad"
+ already_confirmed: "var redan bekräftad, prova att logga in"
+ confirmation_period_expired: "behöver bekräftas inom %{period}. Var vänlig ange en ny"
+ expired: "har löpt ut. Var vänlig ange en ny"
not_found: "inte funnet"
- not_locked: "var ej låst" \ No newline at end of file
+ not_locked: "var ej låst"
+ not_saved:
+ one: "1 fel hindrade denna %{resource} från att sparas:"
+ other: "%{count} fel hindrade denna %{resource} från att sparas:" \ No newline at end of file
diff --git a/config/locales/devise/devise.te.yml b/config/locales/devise/devise.te.yml
index 9ef5ada07..86209d875 100644
--- a/config/locales/devise/devise.te.yml
+++ b/config/locales/devise/devise.te.yml
@@ -7,19 +7,19 @@
te:
devise:
confirmations:
- confirmed: "మీ ఖాతా విజయవంతంగా ధృవీకరించబడింది. ఇప్పుడు మీరు ప్రవేశించారు."
+ confirmed: "మీ ఖాతా విజయవంతంగా ధృవీకరించబడింది."
new:
resend_confirmation: "నిర్ధారణ సూచనలను మళ్ళీ పంపించు"
send_instructions: "మీరు కొన్ని నిమిషాల్లో మీ ఖాతాను నిర్ధారించడానికి అవసరమైన సూచనలతో కూడిన ఇమెయిల్ను అందుకుంటారు."
failure:
inactive: "మీ ఖాతా ఇంకా చేతనం కాలేదు."
- invalid: "చెల్లని వాడుకరి పేరు లేదా సంకేతపదం."
+ invalid: "చెల్లని %{authentication_keys} లేదా సంకేతపదం."
invalid_token: "చెల్లని ప్రమాణీకరణ టోకెన్."
locked: "మీ ఖాతా లాక్ చెయ్యబడింది."
- not_found_in_database: "చెల్లని ఈమెయిలు లేదా సంకేతపదం."
+ not_found_in_database: "చెల్లని %{authentication_keys} లేదా సంకేతపదం."
timeout: "మీ సెషన్ గడువు ముగిసింది, కొనసాగించటానికి మళ్ళీ ప్రవేశించండి."
unauthenticated: "మీరు కొనసాగే ముందు లోనికి ప్రవేశించాలి లేదా నమోదుచేసుకోండి."
- unconfirmed: "మీరు కొనసాగించే ముందు మీ ఖాతాను నిర్ధారించండి."
+ unconfirmed: "మీరు కొనసాగించే ముందు మీ ఈమెయిలు చిరునామాను నిర్ధారించాలి."
invitations:
invitation_token_invalid: "అందించబడిన ఆహ్వానాన్ని టోకెన్ చెల్లదు!"
send_instructions: "మీ ఆహ్వానాన్ని పంపించాం."
@@ -88,6 +88,6 @@ te:
unlocked: "మీ ఖాతా విజయవంతంగా అన్లాక్ చేయబడింది. ఇప్పుడు మీరు సైన్ ఇన్ అయ్యారు."
errors:
messages:
- already_confirmed: "ఇప్పటికే నిర్ధారించబడింది"
+ already_confirmed: "ఇప్పటికే నిర్ధారించబడింది, దయచేసి మళ్ళీ ప్రవేశించ ప్రయత్నించండి."
not_found: "దొరకలేదు"
not_locked: "లాక్ కాలేదు" \ No newline at end of file
diff --git a/config/locales/diaspora/ar.yml b/config/locales/diaspora/ar.yml
index fea24a3d7..6ce6fd608 100644
--- a/config/locales/diaspora/ar.yml
+++ b/config/locales/diaspora/ar.yml
@@ -187,9 +187,6 @@ ar:
posts_and_posting:
character_limit_a: "65535 محرفًا. هذا أكبر بِـ 65395 محرفًا الذي تحصل عليها في تويتر! ؛)"
invitations:
- a_facebook_user: "مستخدم فايسبوك"
- check_token:
- not_found: "الدعوة الرمزية غير موجودة"
create:
no_more: "لم يتبقى لك أية دعوات"
rejected: "واجه هذا البريد الإلكتروني مشاكلا: "
@@ -395,14 +392,8 @@ ar:
type_error: "فشل رفع الصورة، أواثقٌ أن صورة ما قد أُضيفَت؟"
destroy:
notice: "حُذِفَت الصورة."
- new_photo:
- empty: "{file} فارغ، رجاءًا أَعِد تحديد الملفات دونه."
- invalid_ext: "{file} له صيغة غير صالحة. {extensions} هي الصيغ الوحيدة المسموح بها."
- size_error: "{file} ذو حجم كبير جدا, {sizeLimit} هو الحجم الأقصى المسموح به."
new_profile_photo:
upload: "ارْفَع صورةً شخصيةً جديدة"
- show:
- show_original_post: "إِعرِضْ المشاركة الأصلية"
posts:
presenter:
title: "مشاركة من %{name}"
diff --git a/config/locales/diaspora/bg.yml b/config/locales/diaspora/bg.yml
index 5b049ed14..c088e17fb 100644
--- a/config/locales/diaspora/bg.yml
+++ b/config/locales/diaspora/bg.yml
@@ -150,9 +150,6 @@ bg:
fill_me_out: "Попълнете ме"
find_people: "Намерете хора или #марки"
invitations:
- a_facebook_user: "Потребител на Facebook"
- check_token:
- not_found: "Данните за поканата не са намерени"
create:
no_more: "Не разполагате с повече покани."
rejected: "Възникна проблем със следната ел. поща: "
@@ -293,14 +290,8 @@ bg:
type_error: "Снимката не бе качена. Сигурни ли сте, че е добавено изображение?"
destroy:
notice: "Снимката е изтрита."
- new_photo:
- empty: "{file} е празен. Моля, изберете наново файловете без празния."
- invalid_ext: "{file} е с невалидно разширение. Позволени са само: {extensions}."
- size_error: "{file} е твърде голям. Максималният разрешен размер е {sizeLimit}."
new_profile_photo:
upload: "Качете нова снимка за профила!"
- show:
- show_original_post: "Оригиналната публикация"
posts:
show:
photos_by:
diff --git a/config/locales/diaspora/br.yml b/config/locales/diaspora/br.yml
index 2b515ef6e..ba230564e 100644
--- a/config/locales/diaspora/br.yml
+++ b/config/locales/diaspora/br.yml
@@ -201,7 +201,6 @@ br:
conversations:
create:
fail: "kemennadenn direizh"
- no_contact: "Alato, ezhomm ho peus ouzhpennañ an darempred da gentañ !"
sent: "Kemennadenn bet kaset"
index:
conversations_inbox: "Kaozeadennoù – Boest degemer"
@@ -314,9 +313,6 @@ br:
tutorials: "kelennskridoù"
wiki: "wiki"
invitations:
- a_facebook_user: "Un implijer eus Facebook"
- check_token:
- not_found: "N'eo ket bet kaset ar bilhed-pediñ"
create:
empty: "Merkit da nebeutañ ur chomlec'h postel."
no_more: "N'ho 'peus pedadenn ebet ken."
@@ -493,14 +489,8 @@ br:
type_error: "C'hwitet war kargadenn ar skeudenn. Sur oc'h bezañ bet ouzhpennet ur skeudenn ?"
destroy:
notice: "Dilamet eo bet ar skeudenn"
- new_photo:
- empty: "{file} a zo goulo, diuzit ar restroù en-dro heptañ mar plij."
- invalid_ext: "Ar restr {file} en deus ur astenn direizh. N'eus nemet {extensions} hag a zo asantet."
- size_error: "Re vras eo {file}, {sizeLimit} eo ar ar vrasañ posupl."
new_profile_photo:
upload: "Kargit ur poltred nevez evit ho aelad !"
- show:
- show_original_post: "Diskouez an embannadenn orin"
posts:
presenter:
title: "Un embannadenn a-berzh %{name}"
diff --git a/config/locales/diaspora/bs.yml b/config/locales/diaspora/bs.yml
index b61e05996..fa30b4d4a 100644
--- a/config/locales/diaspora/bs.yml
+++ b/config/locales/diaspora/bs.yml
@@ -201,7 +201,6 @@ bs:
conversations:
create:
fail: "Nevažeća poruka"
- no_contact: "Hej, morate prvo dodati kontakt!"
sent: "Poruka poslata"
index:
inbox: "Pošta"
@@ -285,9 +284,6 @@ bs:
tutorials: "tutorijali"
wiki: "wiki"
invitations:
- a_facebook_user: "Facebook korisnik"
- check_token:
- not_found: "Znakovi pozivnice nisu pronađeni"
create:
empty: "Molimo unesite najmanje jednu email adresu."
no_more: "Nemate više pozivnica."
@@ -477,14 +473,8 @@ bs:
type_error: "Objavljivanje fotografije neuspješno. Jeste li sigurni da je slika dodana?"
destroy:
notice: "Fotografija izbrisana."
- new_photo:
- empty: "{file} je prazno, molimo izaberite datoteke ponovo bez toga."
- invalid_ext: "{file} ima nevažeću ekstenziju. Samo {extensions} su dozvoljene."
- size_error: "{file} je preveliko, maksimalna veličina datoteke je {sizeLimit}."
new_profile_photo:
upload: "Objavi novu fotografiju profila!"
- show:
- show_original_post: "Pokaži originalnu objavu"
posts:
presenter:
title: "Objava od %{name}"
diff --git a/config/locales/diaspora/cs.yml b/config/locales/diaspora/cs.yml
index 1447a20cc..5165f2fd2 100644
--- a/config/locales/diaspora/cs.yml
+++ b/config/locales/diaspora/cs.yml
@@ -118,6 +118,7 @@ cs:
are_you_sure_unlock_account: "Určitě chcete odemknout teto účet ?"
close_account: "zrušit účet"
email_to: "E-mailová adresa, kterou chcete pozvat"
+ invite: "Pozvat"
lock_account: "Zamknout Účet"
under_13: "Zobrazit uživatele mladší 13 let (COPPA)"
unlock_account: "Odemknout účet"
@@ -149,13 +150,41 @@ cs:
access: "%{name} potřebný přístup do"
approve: "Schválit"
bad_request: "Chybějící ID nebo URI"
+ client_id_not_found: "Nebyl nalezen klient s client_id rovným %{client_id} s přesměrováním na URI %{redirect_uri}"
deny: "zamítnout"
no_requirement: "%{name} Nevyžaduje oprávnění"
redirection_message: "Opravdu chcete dát přístup %{redirect_uri}"
+ error_page:
+ contact_developer: "Můžete kontaktovat vývojáře aplikace a zahrnout následující detailní chybovou hlášku:"
+ could_not_authorize: "Aplikace nemůže být autorizována"
+ login_required: "Pro přístup k aplikaci musíte být autorizován přihlášením."
+ title: "Jejda! Něco se pokazilo :-("
+ scopes:
+ name:
+ name: "jméno"
+ nickname:
+ name: "přezdívka"
+ openid:
+ description: "To umožňuje aplikaci přečíst váš základní profil."
+ name: "základní profil"
+ picture:
+ description: "To zajišťuje omezení práv aplikace k obrázku"
+ name: "Obrázek"
+ profile:
+ description: "To umožňuje aplikaci číst váš rozšířený profil"
+ name: "Rozšířený profil"
+ read:
+ name: "číst profil, stream a konverzace"
+ write:
+ name: "posílat příspěvky, konverzace a reakce"
user_applications:
index:
+ access: "%{name} má přístup k:"
edit_applications: "Aplikace"
+ no_requirement: "%{name} nevyžaduje oprávnění"
title: "Povolené aplikace"
+ no_applications: "Nemáte žádné autorizované aplikace"
+ revoke_autorization: "Odebrat oprávnění"
are_you_sure: "Jste si jisti?"
are_you_sure_delete_account: "Opravdu chcete uzavřít svůj účet? Tuto operaci nelze vrátit!"
aspect_memberships:
@@ -263,7 +292,6 @@ cs:
conversations:
create:
fail: "Neplatná zpráva"
- no_contact: "Hej, musíte kontakt nejdřív přidat!"
sent: "Zpráva byla odeslána"
destroy:
delete_success: "Konverzace byla úspěšně smazána"
@@ -520,12 +548,22 @@ cs:
tutorial: "tutoriál"
tutorials: "tutoriály"
wiki: "wiki"
+ home:
+ default:
+ be_who_you_want_to_be: "Buď, kým chceš být"
+ choose_your_audience: "Vyber si své publikum"
+ headline: "Vítejte v %{pod_name}"
+ own_your_data: "Vlastni svá data"
+ podmin:
+ contact_irc: "kontaktujte nás na IRC"
+ contribute: "Pomoci"
+ create_an_account: "Vytvořit účet"
+ headline: "Vítej, příteli."
+ make_yourself_an_admin: "Vytvořte sebe jako administrátora"
+ update_your_pod_info: "Můžete najít %{update_instructions}."
invitation_codes:
not_valid: "Kód této pozvánky již není platný."
invitations:
- a_facebook_user: "Uživatel Facebooku"
- check_token:
- not_found: "Pozvánka nebyla nalezena"
create:
empty: "Prosíme zadejte alespoň jednu emailovou adresu."
no_more: "Nemáte žádné další pozvánky."
@@ -801,19 +839,20 @@ cs:
type_error: "Nahrání fotky selhalo. Jste si jist, že byl obrázek přidán?"
destroy:
notice: "Fotka smazána."
- new_photo:
- empty: "{file} je prázdný, prosím vyberte soubory znovu bez něho."
- invalid_ext: "{file} má chybnou příponu. Jsou povoleny pouze {extensions}."
- size_error: "{file} je přiliš veliký, maximální velikost je {sizeLimit}."
new_profile_photo:
upload: "Nahrajte novou profilovou fotku!"
- show:
- show_original_post: "Zobrazit původní příspěvek"
+ polls:
+ votes:
+ few: "Zbývá %{count} hlasy"
+ one: "Zbývá %{count} hlas"
+ other: "Zbývá %{count} hlasů"
+ zero: "Zbývá %{count} hlasů"
posts:
presenter:
title: "Příspěvek uživatele %{name}"
show:
forbidden: "Nemáte povolení k této akci."
+ location: "Odesláno z: %{location}"
photos_by:
few: "%{count} fotky uživatele %{author}"
one: "Jedna fotka uživatele %{author}"
@@ -825,11 +864,18 @@ cs:
profiles:
edit:
allow_search: "Umožnit, aby vás lidé mohli najít na Diaspoře"
+ basic: "Můj základní profil"
+ basic_hint: "Každá položka vašeho profilu je volitelné. Váš základní profil bude vždy viditelný veřejně."
+ extended: "Můj rozšířený profil"
+ extended_visibility_text: "Viditelnost vašeho rozšířeného profilu"
first_name: "Jméno"
last_name: "Příjmení"
+ limited: "Omezený"
nsfw_check: "Označit vše, co sdílím, jako citlivý obsah"
nsfw_explanation: "NSFW ('citlivý obsah') je vnitřní standard diaspory* pro obsah, který nemusí být vhodný k prohlížení, když jste v práci. Pokud sdílíte takový obsah často, prosím zatrhněte tuto možnost, čímž budou všechny Vaše příspěvky skryty z uživatelských poudů, dokud se daný uživatel nerozhodne si je prohlédnout."
nsfw_explanation2: "Pokud se rozhodnete tuto možnost nezatrhnout, přidávejte prosím štítek #nsfw pokaždé když sdílíte takový obsah."
+ public: "Veřejné"
+ settings: "Nastavení profilu"
update_profile: "Aktualizovat profil"
your_bio: "Něco o vás"
your_birthday: "Vaše narozeniny"
@@ -874,6 +920,7 @@ cs:
post_label: "<b>Příspěvek</b>: %{title}"
reason_label: "Důvod: %{text}"
reported_label: "<b>Oznámil/а</b> %{person}"
+ reported_user_details: "Detaily reportujícího uživatele"
review_link: "Označit jako zkontrolované"
status:
destroyed: "Příspěvek byl zničen"
@@ -906,6 +953,7 @@ cs:
really_disconnect: "odpojit %{service}?"
services_explanation: "Připojování se k službám vám dá možnost na nich publikovat své příspěvky hned co je napíšete na diaspoře*."
share_to: "Nasdílet %{provider}"
+ title: "Spravovat služby připojení"
provider:
facebook: "Facebook"
tumblr: "Tumblr"
@@ -1040,6 +1088,7 @@ cs:
auto_follow_aspect: "Aspekt, do kterého zařadit automaticky sledované uživatele"
auto_follow_back: "Automaticky sledovat toho, kdo sleduje vás"
change: "Změnit"
+ change_color_theme: "Změnit barevné schéma"
change_email: "Změnit e-mail"
change_language: "Změnit jazyk"
change_password: "Změnit heslo"
@@ -1102,6 +1151,8 @@ cs:
public:
does_not_exist: "Uživatel %{username} neexistuje!"
update:
+ color_theme_changed: "Barevné schéma úspěšně změněno"
+ color_theme_not_changed: "Při změně barevného schema nastala chyba"
email_notifications_changed: "Oznámení e-mailem změněno"
follow_settings_changed: "Následující nastavení se změnila"
follow_settings_not_changed: "Následující nastavení se nepodařilo změnit"
diff --git a/config/locales/diaspora/da.yml b/config/locales/diaspora/da.yml
index 229b78e9e..65480bcbf 100644
--- a/config/locales/diaspora/da.yml
+++ b/config/locales/diaspora/da.yml
@@ -295,7 +295,6 @@ da:
conversations:
create:
fail: "Ugyldig besked"
- no_contact: "Hej, du kan tilføje din første kontaktperson!"
sent: "Besked sendt"
destroy:
delete_success: "Konversationen er blevet slettet"
@@ -561,7 +560,6 @@ da:
own_your_data: "Vær i besiddelse af dine egne data"
own_your_data_info: "Mange sociale netværk tjener penge på dine data ved at analysere din opførsel og derefter bruge informationen til at sælge reklamer. Diaspora bruger ikke dine data til noget, men står til rådighed så du kan kommunikere og dele med andre."
podmin:
- admin_panel: "admin panel"
byline: "Du er i gang med at ændre internettet. Lad os komme i gang."
configuration_info: "Åben %{database_path} og %{diaspora_path} i din favorit editor og gennemgå dem omhyggeligt. De er udførligt kommenteret."
configure_your_pod: "Konfigurer din pod"
@@ -583,11 +581,8 @@ da:
invitation_codes:
not_valid: "Invitationskoden er udløbet."
invitations:
- a_facebook_user: "En Facebook-bruger"
- check_token:
- not_found: "Invitation ikke fundet"
create:
- empty: "Indsæt mindst en e-mailadresse."
+ empty: "Skriv mindst en e-mailadresse."
no_more: "Du har ikke flere invitationer."
note_already_sent: "Der er allerede blevet sendt en invitation til %{emails}"
rejected: "Der var problemer med de følgende e-mail adresser: "
@@ -880,14 +875,8 @@ da:
type_error: "Billed-upload fejlede. Er du sikker på at et billede var tilføjet?"
destroy:
notice: "Billede slettet."
- new_photo:
- empty: "{file} er tom. Vælg venligst filer igen uden {file}."
- invalid_ext: "{file} har en ugyldig filtype. Kun {udvidelser} er tilladt."
- size_error: "{File} er for stor. Maksimal filstørrelse er {sizeLimit}."
new_profile_photo:
upload: "Upload et nyt profilbillede!"
- show:
- show_original_post: "Vis oprindeligt indlæg"
polls:
votes:
one: "%{count} stemme indtil videre"
@@ -949,7 +938,7 @@ da:
invalid_invite: "Det invitations-link som du anvendte er ikke længere gyldigt!"
new:
email: "E-mail"
- enter_email: "Indtast din e-mailadresse"
+ enter_email: "Skriv din e-mailadresse"
enter_password: "Indtast en adgangskode (mindst seks tegn)"
enter_password_again: "Indtast den samme adgangskode som før"
enter_username: "Vælg et brugernavn (kun bogstaver, tal og understreg)"
@@ -1055,7 +1044,7 @@ da:
default: "Den hemmelige kode passede ikke med billedet"
failed: "Den menneskelige kontrol mislykkedes"
user: "Det hemmelige billede og koden var forskellige"
- placeholder: "Indsæt billedværdi"
+ placeholder: "Skriv billedværdien"
statistics:
active_users_halfyear: "Aktive brugere halvårligt"
active_users_monthly: "Aktive brugere månedligt"
@@ -1129,7 +1118,7 @@ da:
success: "Din konto er nu låst. Det kan tage 20 minutter for os at blive færdige med at lukke den helt. Tak fordi du prøvede Diaspora."
wrong_password: "Det indtastede kodeord stemmer ikke overens med dit nuværende kodeord."
edit:
- also_commented: "nogen har kommenteret et indlæg du tidligere har kommenteret."
+ also_commented: "nogen kommenterer et indlæg du tidligere har kommenteret."
auto_follow_aspect: "Aspekt for automatisk tilføjede kontakter:"
auto_follow_back: "Følg automatisk brugere der følger dig"
change: "Skift"
@@ -1147,7 +1136,7 @@ da:
no_turning_back: "Du kan ikke fortryde dette! Hvis du er helt sikker, indtast din adgangskode herunder."
what_we_delete: "Vi sletter alle dine indlæg og profildata så hurtigt som overhovedet muligt. Dine kommentarer til andre folks indlæg vil forblive, men vil vise dit Diaspora-ID og ikke dit navn."
close_account_text: "Luk konto"
- comment_on_post: "... nogen har kommenteret dit indlæg."
+ comment_on_post: "nogen kommenterer dit indlæg."
current_password: "Nuværende adgangskode"
current_password_expl: "det du logger ind med ..."
download_export: "Download min profil"
diff --git a/config/locales/diaspora/de-CH.yml b/config/locales/diaspora/de-CH.yml
new file mode 100644
index 000000000..6d0b3e86a
--- /dev/null
+++ b/config/locales/diaspora/de-CH.yml
@@ -0,0 +1,528 @@
+# Copyright (c) 2010-2013, Diaspora Inc. This file is
+# licensed under the Affero General Public License version 3 or later. See
+# the COPYRIGHT file.
+
+
+
+de-CH:
+ _applications: "Äpp's"
+ _contacts: "Kontäkt"
+ _services: "Dienscht"
+ account: "Konto"
+ activerecord:
+ errors:
+ models:
+ contact:
+ attributes:
+ person_id:
+ taken: "dörf nu eimol vorcho i dem Benutzer sine Kontäkt."
+ person:
+ attributes:
+ diaspora_handle:
+ taken: "isch scho vergeh."
+ request:
+ attributes:
+ from_id:
+ taken: "isch es duplikat vonere scho existierende aafrog."
+ reshare:
+ attributes:
+ root_guid:
+ taken: "So guet, gäll? Du hesch de Biitrag scho wiitergseit!"
+ user:
+ attributes:
+ email:
+ taken: "wird scho benutzt."
+ person:
+ invalid: "isch ungültig."
+ username:
+ invalid: "isch ungültig. Es sind nume Buechstabe, Nummere und Understrich erlaubt."
+ taken: "isch scho vergeh."
+ admins:
+ admin_bar:
+ pages: "Siitä"
+ pod_stats: "Pod Statistik"
+ sidekiq_monitor: "Sidekiq-Monitor"
+ user_search: "Benutzer Suechi"
+ weekly_user_stats: "Wöchentlichi Benutzerstatistik"
+ stats:
+ 2weeks: "2 Wuche"
+ 50_most: "50 meischt-benutzti Tags"
+ current_segment: "S'aktuelle segment het durchschnittlich <b>%{post_yest}</b> biiträg pto Benutzer, sit em <b>%{post_day}</b>"
+ daily: "Täglich"
+ display_results: "Zeig d'ergäbnis usem <b>%{segment}</b> segment"
+ go: "Los!"
+ month: "Monet"
+ tag_name: "Tag Name: <b>%{name_tag}</b> Azahl: <b>%{count_tag}</b>"
+ usage_statistic: "Nutzigs-statistik"
+ week: "Wuche"
+ user_search:
+ add_invites: "IIladige hinzuefüege"
+ email_to: "per email iilade"
+ weekly_user_stats:
+ current_server: "S'Momentane Serverdatum isch %{date}"
+ all_aspects: "Ali Aspekt"
+ are_you_sure: "Bisch sicher?"
+ are_you_sure_delete_account: "Bisch sicher, dass din Account lösche willsch? - da chasch nüm rückgängig mache!"
+ aspect_memberships:
+ destroy:
+ failure: "Person us em Aspekt entferne isch gschiiteret."
+ no_membership: "Die usgwählt Person isch i dem Aspekt nöd gfinde worde."
+ success: "Person erfolgriich us em Aspekt entfernt."
+ aspects:
+ add_to_aspect:
+ failure: "De Kontakt zum Aspekt hinzuefüege isch fehlgschlage."
+ success: "Kontakt erfolgrich zum Aspekt hinzuegfüegt."
+ aspect_listings:
+ add_an_aspect: "+ en Aspekt hinzuefüege"
+ aspect_stream:
+ make_something: "Mach öppis"
+ stay_updated: "Bliib uf em laufende"
+ stay_updated_explanation: "Din Haupt-Stream beinhaltet d'Biiträg vo all dine Kontäkt, vo de Tägs wo du folgsch und vo es paar kreative Mitglied vo de Community"
+ destroy:
+ failure: "%{name} het nöd chönne entfernt werde"
+ success: "%{name} isch erfolgriich entfernt worde."
+ edit:
+ aspect_list_is_not_visible: "Kontäkt i dem Aspekt chönd sich gegesiitig nöd gseh."
+ aspect_list_is_visible: "Kontäkt i dem Aspekt chönd sich gegesiitig gseh."
+ confirm_remove_aspect: "Bisch sicher, das de Aspekt lösche willsch?"
+ rename: "Umbenenne"
+ update: "Ändere"
+ updating: "wird gänderet..."
+ index:
+ donate: "Spende"
+ help:
+ any_problem: "Git's es Problem?"
+ contact_podmin: "Kontaktier de Admin vo dim Pod!"
+ do_you: "Hesch du:"
+ feature_suggestion: "... en Vorschlag für e %{link}?"
+ find_a_bug: "... en %{link} gfunde?"
+ have_a_question: "... en %{link}"
+ here_to_help: "d'diaspora* Community isch do für di!"
+ mail_podmin: "Podmin email"
+ need_help: "Bruchsch Hilf?"
+ tag_bug: "Fähler"
+ tag_feature: "Verbesserig"
+ tag_question: "Frog"
+ introduce_yourself: "Das isch din Stream. Gump ine und stell dich vor."
+ keep_pod_running: "Hilf %{pod} schnell d'sii und finanzier mitere monatliche chliine spend de schuss kafi wo's defür bruuched!"
+ new_here:
+ follow: "Folg %{link} und begrüess neui Benutzer bi diaspora*!"
+ learn_more: "Meh Infos"
+ title: "Begrüess neui Benutzer"
+ services:
+ content: "Du chasch folgendi Dienscht mit diaspora* verbinde:"
+ heading: "Dienscht verbinde"
+ welcome_to_diaspora: "Willkomme bi diaspora*, %{name}!"
+ no_contacts_message:
+ community_spotlight: "Intressanti Lüt"
+ or_spotlight: "Oder du chasch mit %{link} teile"
+ try_adding_some_more_contacts: "Du chasch meh Kontäkt sueche oder %{invite_link}."
+ you_should_add_some_more_contacts: "Du söttsch es paar meh Kontäkt hinzuefüege"
+ seed:
+ acquaintances: "Bekannti"
+ family: "Familie"
+ friends: "Fründe"
+ work: "Arbet"
+ update:
+ failure: "%{name} isch en z'lange name zum chönne gspeicheret werde."
+ success: "Din Aspekt %{name} isch erfolgriich gänderet worde."
+ blocks:
+ create:
+ failure: "Ignoriere vo dem benutzer fehlgschlage"
+ success: "Ok, dä gsesch nüm !"
+ destroy:
+ failure: "Han nöd chönne ufhöhre dä benutzer z'ignoriere."
+ success: "Luegemer mol was die z'sägä hend! #sayhello"
+ bookmarklet:
+ explanation: "Erstell vo überall en Biitrag bi diaspora* i dem du %{link} zu dine Läsezeiche hinzuefüegsch"
+ heading: "Läsezeichä"
+ post_something: "Erstell en Biitrag bi diaspora*"
+ cancel: "Abbreche"
+ comments:
+ new_comment:
+ comment: "Kommentiere"
+ commenting: "Wird kommentiert..."
+ contacts:
+ index:
+ add_a_new_aspect: "en neue Aspekt mache"
+ all_contacts: "Ali Kontäkt"
+ community_spotlight: "Intressanti Lüt"
+ my_contacts: "Mini Kontäkt"
+ no_contacts: "Gseht uus als möstisch es paar Kontäkt hinzuefüege!"
+ no_contacts_message: "Lueg mal di %{community_spotlight} aa"
+ only_sharing_with_me: "Eisiitig mit mir teilendi"
+ start_a_conversation: "Start es Gspröch"
+ title: "Kontäkt"
+ spotlight:
+ community_spotlight: "Intressanti Lüt"
+ suggest_member: "Mitglied vorschloh"
+ conversations:
+ create:
+ fail: "Ungültigi Nochricht"
+ sent: "Nochricht verschickt"
+ index:
+ inbox: "Poschtigang"
+ no_messages: "Kei Nochrichte"
+ new:
+ send: "Abschicke"
+ sending: "Wird gschickt..."
+ subject: "Um was goht's?"
+ to: "Empfänger"
+ show:
+ delete: "Gspröch lösche"
+ last_message: "Letschti Nochricht empfange %{timeago}"
+ reply: "Antworte"
+ replying: "Am Antworte..."
+ date:
+ formats:
+ birthday: "%d. %B"
+ birthday_with_year: "%d. %B %Y"
+ fullmonth_day: "%d. %B"
+ delete: "Lösche"
+ email: "E-Mail"
+ error_messages:
+ helper:
+ correct_the_following_errors_and_try_again: "Korrigier folgendi Fähler und versuechs nomel."
+ fill_me_out: "Füll mi uus"
+ find_people: "Find Mensche oder #Tags"
+ invitations:
+ create:
+ empty: "Bitte mindestens ei email adresse iigä"
+ no_more: "Du hesch kei Iilage meh."
+ note_already_sent: "A %{emails} sind scho e iiladig gschickt worde."
+ rejected: "Bi folgende Adresse het's Problem geh: "
+ sent: "Illadige sind a folgendi Adresse gschickt worde: %{emails}"
+ new:
+ comma_separated_plz: "Du chasch mehreri email adresse iigeh, wenns dur es komma trennsch."
+ invite_someone_to_join: "Lad öpper zu diaspora* ii!"
+ language: "Sproch"
+ paste_link: "Teil de Link mit dine Fründe zum sie zu diaspora* iizlade, oder schick ene de link direkt per E-Mail."
+ send_an_invitation: "En Iiladig verschicke"
+ layouts:
+ application:
+ back_to_top: "Zrugg zum Aafang"
+ powered_by: "Es lauft mit diaspora*"
+ public_feed: "Öffentliche diaspora* Feed vo %{name}"
+ source_package: "Lad S'Quellcode-packet abe"
+ toggle: "Mobiili Aasicht umschalte"
+ whats_new: "Was git's neus?"
+ header:
+ logout: "Abmelde"
+ profile: "Profil"
+ settings: "Iistellige"
+ limited: "Begrenzt"
+ more: "Meh"
+ no_results: "Kei Ergebnis gfunde"
+ notifications:
+ comment_on_post:
+ one: "%{actors} het din Biitrag %{post_link} kommentiert."
+ other: "%{actors} hend din Biitrag %{post_link} kommentiert."
+ zero: "Niemer het din Biitrag %{post_link} kommentiert."
+ index:
+ and: "und"
+ mark_unread: "als gläsä markiere"
+ liked:
+ one: "%{actors} gfallt din Biitrag %{post_link}."
+ other: "%{actors} gfallt din Biitrag %{post_link}."
+ zero: "%{actors} gfallt din Biitrag %{post_link}."
+ mentioned:
+ one: "%{actors} het di im Biitrag %{post_link} erwähnt."
+ other: "%{actors} hend di im Biitrag %{post_link} erwähnt."
+ zero: "%{actors} het di im Biitrag %{post_link} erwähnt."
+ private_message:
+ one: "%{actors} het dir e Nochricht gschickt."
+ other: "%{actors} hend dir e Nochricht gschickt."
+ zero: "%{actors} het dir e Nochricht gschickt."
+ reshared:
+ one: "%{actors} het din Biitrag %{post_link} wiitergseit."
+ other: "%{actors} hend din Biitrag %{post_link} wiitergseit."
+ started_sharing:
+ one: "%{actors} het agfange mit dir z'teile."
+ other: "%{actors} hend agfange mit dir z'teile."
+ zero: "Niemer het agfange mit dir z'teile."
+ notifier:
+ a_post_you_shared: "en Biitrag."
+ click_here: "druck do"
+ comment_on_post:
+ reply: "Schriib en Antwort oder lueg der de Biitrag vo %{name} aa >"
+ confirm_email:
+ click_link: "Klick uf dä Link zum dini neu E-Mail-Adresse %{unconfirmed_email} z'aktiviere:"
+ subject: "Bitte aktivier dini neu E-Mail-Adresse %{unconfirmed_email}"
+ email_sent_by_diaspora: "Das E-Mail isch vo %{pod_name} gschickt worde. Wenn du kei söttigi E-Mails me willsch,"
+ hello: "Hoi %{name}!"
+ invite:
+ message: |-
+ Hallo!
+ du bisch vo %{diaspora_id} iiglade worde diaspora* biizträte.
+
+ Mit dem Link gohts los
+
+ [%{invite_url}][1]
+
+ Oder füeg %{diaspora_id} zu dine Aspekt hinzue, wennd scho es Konto hesch.
+
+ Liebi Grüess
+
+ De diaspora* E-Mail Roboter!
+
+ PS: Für de Fall das do gar nonig weisch was diaspora* isch, [do][2] git's meh Info's.
+
+ [1]: %{invite_url}
+ [2]: %{diasporafoundation_url}
+ invited_you: "%{name} het dich zu diaspora* iiglade"
+ liked:
+ liked: "%{name} gfallt din Biitrag"
+ view_post: "Biitrag aaluege >"
+ mentioned:
+ subject: "%{name} het di uf diaspora* erwähnt"
+ private_message:
+ reply_to_or_view: "Schrib en Antwort oder lueg s'Gspröch aa >"
+ reshared:
+ reshared: "%{name} het din Biitrag wiitergseit"
+ view_post: "Biitrag aaluege >"
+ single_admin:
+ admin: "Din diaspora* Administrator"
+ subject: "E Nochricht über dis diaspora* Konto:"
+ started_sharing:
+ sharing: "het aagfange mit dir z'teile!"
+ subject: "%{name} het uf diaspora* aagfange mit dir z'teile"
+ view_profile: "Lueg s'Profil vo %{name} aa"
+ thanks: "Danke,"
+ to_change_your_notification_settings: "zum dini Benochrichtigungs-Iistellige z'ändere"
+ nsfw: "NSFW"
+ ok: "OK"
+ people:
+ add_contact:
+ invited_by: "Du bisch iglade worde vo"
+ index:
+ looking_for: "Bisch uf de Suech noch mit %{tag_link} täggde Biiträg?"
+ no_one_found: "...und niemer isch gfunde worde."
+ no_results: "Hey! Du muesch noch öppisem sueche."
+ results_for: "Suechergebnis für %{search_term}"
+ searching: "Sueche, bitte bis geduldig..."
+ person:
+ thats_you: "Das bisch du!"
+ profile_sidebar:
+ bio: "Beschriibig"
+ born: "Geburi"
+ gender: "Gschlächt"
+ location: "Ort"
+ show:
+ closed_account: "Dä Konto isch gschlosse worde."
+ does_not_exist: "Die Person existiert nöd!"
+ has_not_shared_with_you_yet: "%{name} het bis etz no kei Biiträg mit dir teilt!"
+ photos:
+ create:
+ integrity_error: "Fotiupload isch fehlgschlage... Bisch sicher das da e Bild gsi isch?"
+ runtime_error: "Fotiupload isch fehlgschlage... Bisch sicher das ali Tasse im Chuchichäschtli sind?"
+ type_error: "Fotiupload isch fehlgschlage... Bisch sicher das e Bild iigfüegt worde isch?"
+ destroy:
+ notice: "Foti glöscht."
+ new_profile_photo:
+ upload: "Lad es neus Profilfoti ue!"
+ posts:
+ presenter:
+ title: "En post vo %{name}"
+ show:
+ reshare_by: "Wiitergseits vo %{author}"
+ privacy: "Privatsphäre"
+ profile: "Profil"
+ profiles:
+ edit:
+ allow_search: "Andere lüüt innerhalb vo diaspora* erlaube noch dir z'sueche"
+ first_name: "Vorname"
+ last_name: "Nochname"
+ update_profile: "Profil aktualisierä"
+ your_bio: "Dini Beschriibig"
+ your_birthday: "Din Geburtstag"
+ your_gender: "Dis Gschlächt"
+ your_location: "Din Ort"
+ your_name: "Din Name"
+ your_photo: "Dis Foti"
+ your_tags: "Beschriib dich i 5 Wörter"
+ your_tags_placeholder: "Zum Biispiil: #diaspora #chuchichäschtli #kreativ #linux #musig"
+ update:
+ failed: "Aktualisierä vom Profil isch fehlgschlage"
+ updated: "Pofil aktualisiert"
+ public: "Öffetlich"
+ reactions:
+ one: "Ei Reaktion"
+ other: "%{count} Reaktione"
+ zero: "Kei Reaktion"
+ registrations:
+ closed: "Uf dem pod isch d'Registrierig deaktiviert"
+ create:
+ success: "Du bisch ez volle Hahne bi diaspora* debii!"
+ invalid_invite: "De iiladigslink wo'd erstellt hesch isch nüme gültig!"
+ new:
+ email: "E-Mail"
+ enter_email: "Gib dini E-Mail-Adresse ii"
+ enter_password: "Passwort iigä (mindestens 6 zeiche)"
+ enter_password_again: "Nomol s'gliich passwort wie vorher iigä"
+ enter_username: "Wähl en Benutzername uus (bestehend usschliesslich us: Buechstabe, Nummere und Understrich)"
+ password: "Passwort"
+ password_confirmation: "Passwort bestätigung"
+ sign_up: "Account mache"
+ username: "Benutzername"
+ reshares:
+ reshare:
+ deleted: "Originalbiitrag isch vom Verfasser glöscht worde."
+ reshare_confirmation: "%{author}'s Biitrag wiitersägä?"
+ reshared_via: "Wiitergseit vo"
+ search: "Sueche"
+ services:
+ create:
+ already_authorized: "En Benutzer mit de diaspora* ID %{diaspora_id} het de %{service_name}-Account scho autorisiert."
+ failure: "Authentifizierig fehlgschlage."
+ success: "Authentifizierig erfolgriich."
+ destroy:
+ success: "Authentifikation erfolgriich glöscht."
+ failure:
+ error: "Bim verbinde zu dem Dienst het's en error geh.."
+ index:
+ disconnect: "Trenne"
+ edit_services: "Dienscht bearbeite"
+ logged_in_as: "Iigloggt als %{nickname}"
+ really_disconnect: "%{service} trenne"
+ settings: "Iistelige"
+ shared:
+ invitations:
+ by_email: "via email"
+ invite_your_friends: "Lad dini Kollege ii"
+ invites: "Iiladige"
+ share_this: "Teil dä Link über email, blog oder soziali Netzwerk!"
+ public_explain:
+ atom_feed: "Atom feed"
+ control_your_audience: "Kontrolier dini Ziilgruppe"
+ logged_in: "Igglogt in %{service}"
+ manage: "Verbundeni dienst verwalte"
+ new_user_welcome_message: "Mach #hashtags zum dini post's z'tägge und lüüt mit ähnliche intresse finde. Erwähn anderi mensche mit @mentions"
+ outside: "Öffentlichi Biiträg sind für's gsamte Internet sichtbar."
+ share: "Teilä"
+ title: "Verbundeni Dienst ufsetzä"
+ visibility_dropdown: "Zum iistelle wär din post gseh dörf benutz s'dropdown menü. (Mer empfehled din erschtä post öffentlich z'mache (wellen susch nemert gseht ^^ ))"
+ publisher:
+ discard_post: "Posting abbreche"
+ new_user_prefill:
+ hello: "Hallo zämä Ich bin %{new_user_tag}. "
+ i_like: "Ich interessier mich für %{tags} "
+ invited_by: "Danke für d'iilagig, "
+ newhere: "neudo"
+ posting: "Am poste..."
+ share: "Teilä"
+ upload_photos: "Fotis Uelade"
+ whats_on_your_mind: "Was lauft?"
+ stream_element:
+ via: "via %{link}"
+ via_mobile: "über's händy"
+ status_messages:
+ create:
+ success: "Erfolgriich erwähnt: %{names}"
+ new:
+ mentioning: "Erwähnt: %{person}"
+ too_long: "Bitte chürz din post uf weniger als %{count} zeichä. Im moment heter %{current_length}."
+ streams:
+ activity:
+ title: "Mini Aktivitätä"
+ aspects:
+ title: "mini Aspekt"
+ aspects_stream: "Aspekt"
+ comment_stream:
+ title: "Kommentierti Post's"
+ community_spotlight_stream: "Kommunity Schiiwörferliecht"
+ followed_tag:
+ add_a_tag: "En tag adde"
+ follow: "Folge"
+ title: "#tags dene du folgsch"
+ followed_tags_stream: "#tags dene du folgsch"
+ like_stream:
+ title: "\"gfallt mer\"-stream"
+ mentioned_stream: "@erwähnige"
+ mentions:
+ title: "@erwähnige"
+ multi:
+ title: "stream"
+ public:
+ title: "Öffentlichi aktivität"
+ tags:
+ title: "Täggti Biiträg: %{tags}"
+ tags:
+ show:
+ follow: "#%{tag} folge"
+ none: "De läär tag existiert nöd!"
+ stop_following: "Ufhöre #%{tag} z'folge"
+ username: "Benutzername"
+ users:
+ confirm_email:
+ email_confirmed: "Email %{email} isch aktiviert"
+ email_not_confirmed: "Email het nöd chönne aktiviert werde. Falsche Link?"
+ destroy:
+ no_password: "Bitte dis aktuelle passwort iigäh zum de account schlüsse."
+ success: "Dis Konto isch gschperrt. Es chan ~ 20 Minute goh bis din Account endgültig gschlosse isch. Danke das du diaspora* uusprobiert hesch."
+ wrong_password: "Das Passwort stimmt nöd mit dim aktuelle passwort überein."
+ edit:
+ also_commented: "öpper en post kommentiert wo du scho kommentiert häsch"
+ auto_follow_aspect: "Apekt für benutzer mit dene du automatisch hesch agfange teile"
+ auto_follow_back: "Automatisch mit benutzer \"zruggteile\" wo agfange hend mit dir z'teile"
+ change: "ändere"
+ change_email: "Email ändere"
+ change_language: "Sproch ändere"
+ change_password: "Passwort ändere"
+ character_minimum_expl: "mues mindestens sächs zeiche ha"
+ close_account:
+ dont_go: "Hey, bitte hau nöd ab!"
+ lock_username: "Din benutzername wird gsperrt. Niemer wird d'möglichkeit ha zum die gliich ID uf dem pod nomol z'registriere."
+ locked_out: "Du wirsch us dim account abgmeldet und usgsperrt bis er glöscht worde isch."
+ make_diaspora_better: "Üs wär's sehr vill lieber du würsch bliibe und mithelfe diaspora* besser z'mache anstatt z'goh. Wenn aber würkli wotsch, das passiert als nöchschts:"
+ mr_wiggles: "Wenn du gosch wird de Mr.Wiggles ganz truurig"
+ no_turning_back: "Es git keis zrugg! Wenn du dir würkli sicher bisch, gib dis passwort une ii."
+ what_we_delete: "Mer lösched all dini Biiträg und Profildate so bald wie möglich. Dini Kommentär wo du under de Biiträg vo andere Lüüt gmacht hesch werdet immerno aazeigt aber si werdet mit dinere diaspora* ID anstatt dim Name verchnüpft."
+ close_account_text: "Account schlüsse"
+ comment_on_post: "öpper en post vo dir kommentiert"
+ current_password: "aktuell's passwort"
+ current_password_expl: "Das mit demm du di aameldisch..."
+ edit_account: "Account bearbeite"
+ email_awaiting_confirmation: "Mer dir en link noch %{unconfirmed_email} gschikt. Bis du de enthalteni link göffnet hesch und so die neu adresse aktiviersch, sendemer wiiterhin a dini alt adresse %{email}"
+ export_data: "Date exportiere"
+ following: "\"Teile\"-Iistelige"
+ liked: "öpper en post vo dir \"mag\""
+ mentioned: "du @erwähnt wirsch"
+ new_password: "Neus Passwort"
+ private_message: "du e privati nochricht überchunsch"
+ receive_email_notifications: "Email-benochritigunge empfange wänn:"
+ reshared: "öpper din post wiiterseit"
+ show_community_spotlight: "Kommunity Schiiwörferliecht im stream aazeige"
+ show_getting_started: "Iistiiger hiiwiis wieder aktivierä"
+ started_sharing: "öpper mit dir aafangt teile"
+ stream_preferences: "Stream Iistellige"
+ your_email: "Dini Email Adresse"
+ your_handle: "Dini diaspora* ID"
+ getting_started:
+ awesome_take_me_to_diaspora: "Grossartig! Bring mi zu diaspora*"
+ community_welcome: "d'diapora*-Mensche sind froh di an Bord z'ha!"
+ hashtag_explanation: "Mit hashtags chasch du über Sache rede und dini Intresse folge. Usserdem eignet si sich hervorragend zum neui lüüt uf diaspora* z'finde."
+ hashtag_suggestions: "Versuech's mal tags wie zb. #kunscht, #film, #chääs etc.."
+ well_hello_there: "Halli Hallo !"
+ what_are_you_in_to: "Was machsch so?"
+ who_are_you: "Wär bisch du?"
+ privacy_settings:
+ ignored_users: "Ignorierti benutzer"
+ stop_ignoring: "Ignoriere ufhebe"
+ title: "Privatsphäre iistelige"
+ public:
+ does_not_exist: "%{username} existiert nöd."
+ update:
+ email_notifications_changed: "Email benochrichtigunge gänderet"
+ follow_settings_changed: "Folge-Iistelige gänderet"
+ follow_settings_not_changed: "Folge-Iistelige änderig fehlgschlage"
+ language_changed: "Sproch gänderet"
+ language_not_changed: "Änderig vo de Sproch isch fehlgschlage"
+ password_changed: "Passwort g'änderet. Du chasch di jetzt mit dim neue Passwort iilogge."
+ password_not_changed: "Passwort änderig fehlgschlage"
+ settings_not_updated: "Änderig vo de Iistellige isch fehlgschlage"
+ settings_updated: "Iistellige aktualisiert"
+ unconfirmed_email_changed: "Email g'änderet. Mue no aktiviert werde"
+ unconfirmed_email_not_changed: "Email änderig fehlgschlage"
+ will_paginate:
+ next_label: "nögscht &raquo;"
+ previous_label: "&laquo; zrugg" \ No newline at end of file
diff --git a/config/locales/diaspora/de.yml b/config/locales/diaspora/de.yml
index 41ec1a54a..24d216e72 100644
--- a/config/locales/diaspora/de.yml
+++ b/config/locales/diaspora/de.yml
@@ -274,6 +274,8 @@ de:
post_something: "Erstelle einen Beitrag in diaspora*"
cancel: "Abbrechen"
comments:
+ create:
+ error: "Konnte nicht kommentieren."
new_comment:
comment: "Kommentieren"
commenting: "Kommentieren …"
@@ -298,7 +300,6 @@ de:
conversations:
create:
fail: "Ungültige Nachricht"
- no_contact: "Hoppla, du musst den Kontakt erst hinzufügen!"
sent: "Nachricht versendet"
destroy:
delete_success: "Das Gespräch wurde erfolgreich gelöscht."
@@ -307,6 +308,7 @@ de:
conversations_inbox: "Konversationen – Posteingang"
inbox: "Eingang"
new_conversation: "Neue Konversation"
+ no_contacts: "Du musst ein paar Kontakte schließen, bevor du eine Unterhaltung anfangen kannst"
no_messages: "Keine Nachrichten"
new:
message: "Nachricht"
@@ -331,6 +333,7 @@ de:
delete: "Löschen"
email: "E-Mail"
error_messages:
+ csrf_token_fail: "Das CSRF-Token ist ungültig. Bitte melde dich an und versuche es noch einmal."
helper:
correct_the_following_errors_and_try_again: "Korrigiere die folgenden Fehler und versuche es erneut."
need_javascript: "Diese Website benötigt Javascript, um richtig zu funktionieren. Falls du Javascript deaktiviert haben solltest, bitte aktiviere es und aktualisiere diese Seite."
@@ -418,7 +421,7 @@ de:
what_is_a_mention_a: "Eine Erwähnung ist ein Link zu der Profilseite einer Person, der in einem Beitrag erscheint. Wenn jemand erwähnt wird, erhält er eine Benachrichtigung, die seine Aufmerksamkeit auf den Beitrag lenkt."
what_is_a_mention_q: "Was ist eine „Erwähnung“?"
miscellaneous:
- back_to_top_a: "Ja. Nachdem du auf einer Seite nach unten gescrollt hast, klicke auf den grauen Pfeil, der in der unteren rechten deines Browserfensters erscheint."
+ back_to_top_a: "Ja. Nachdem du auf einer Seite nach unten gescrollt hast, klicke auf den grauen Pfeil, der unteren rechts im Browserfenster erscheint."
back_to_top_q: "Gibt es eine Möglichkeit, schnell wieder an den Seitenanfang zu kommen?"
diaspora_app_a: "Es gibt einige Android-Apps in einem sehr frühen Entwicklungsstadium. Einige Projekte sind bereits seit langem abgebrochen und funktionieren deshalb nicht richtig mit der aktuellen diaspora*-Version. Erwarte von diesen Apps im Moment nicht allzu viel. Zur Zeit ist die beste Möglichkeit, um auf diaspora* von deinem Mobilgerät zuzugreifen, die Seite in einem Browser aufzurufen, da wir eine mobile Version gestaltet haben, die auf allen Geräten gut funktionieren sollte. Für iOS gibt es im Moment keine Apps. Noch einmal, diaspora* sollte sich gut von deinem Browser aus bedienen lassen."
diaspora_app_q: "Gibt es eine diaspora* App für Android oder iOS?"
@@ -431,7 +434,7 @@ de:
find_people_a: "Lade deine Freunde mit dem E-Mail-Link in der Seitenleiste ein. Folge #Tags, um Andere zu entdecken, die deine Interessen teilen und füge Leute, die Sachen posten, die dich interessieren, zu deinen Aspekten hinzu. Schreibe in einem öffentlichen Post, dass du #NeuHier bist."
find_people_q: "Ich bin gerade erst einem Pod beigetreten, wie finde ich nun Leute zum Teilen?"
title: "Pods"
- use_search_box_a: "Wenn du deren vollständige diaspora* ID (z.B. benutzername@podname.org) kennst, kannst du sie finden, indem du danach suchst. Wenn du dich auf dem selben Pod befindest, reicht es, wenn du nur nach dem Benutzernamen suchst. Als Alternative kannst du auch nach ihrem Profilnamen (dem angezeigten Namen) suchen. Wenn eine Suche beim ersten Mal keine Ergebnisse liefert, dann versuch es nochmal."
+ use_search_box_a: "Kennst du deren vollständige diaspora* ID (z.B. benutzername@podname.org), kannst du sie durch suchen finden. Bist du auf dem selben Pod, kannst du direkt nach dem Benutzernamen suchen. Alternativ kannst du auch nach ihrem Profilnamen (dem angezeigten Namen) suchen. Wenn eine Suche beim ersten Mal keine Ergebnisse liefert, dann versuch es nochmal."
use_search_box_q: "Wie benutze ich das Suchfeld, um bestimmte Personen zu finden?"
what_is_a_pod_a: "Ein Pod ist ein Server, auf dem die diaspora*-Software läuft und der mit dem diaspora*-Netzwerk verbunden ist. „Pod“ ist eine Metapher für Hülsen von Pflanzen, die mehrere Samen enthalten, so wie der Server mehrere Benutzerkonten enthält. Es gibt viele verschiedene Pods. Du kannst Kontakte von anderen Pods hinzufügen und mit ihnen kommunizieren. Du musst nicht Benutzerkonten auf verschiedenen Pods erstellen! (Du kannst dir einen diaspora*-Pod wie einen Mail-Anbieter vorstellen: Es gibt öffentliche Pods, private Pods, und mit ein wenig Aufwand kannst du deinen eigenen betreiben.)"
what_is_a_pod_q: "Was ist ein Pod?"
@@ -481,7 +484,7 @@ de:
who_sees_post_q: "Wenn ich einen Beitrag in einen Aspekt schreibe (privat), wer kann ihn sehen?"
private_profiles:
title: "Private Profile"
- whats_in_profile_a: "Deine Beschreibung, dein Ort, dein Geschlecht und dein Geburtstag. Das sind die Sachen im unteren Bereich der Profileinstellungen. Alle diese Informationen sind freiwillig – Du entscheidest, ob du sie preisgibst. Angemeldete Benutzer, die sich in einem deiner Aspekte befinden, sind die Einzigen, die dein privates Profil sehen können. Sie werden auf deiner Profilseite außerdem neben deinen öffentlichen Beiträgen auch private Beiträge von dir sehen können, die an Aspekte gerichtet sind, in denen sie sich befinden."
+ whats_in_profile_a: "Deine Beschreibung, dein Ort, Geschlecht und Geburtstag. Das sind die Dinge aus dem unteren Bereich der Profileinstellungen. Alle diese Informationen sind freiwillig – Du entscheidest, ob du sie preisgibst. Angemeldete Benutzer, aus deinen Aspekten, sind die Einzigen, die dein privates Profil sehen können. Sie werden auf deiner Profilseite außerdem neben deinen öffentlichen Beiträgen auch private Beiträge von dir sehen können, die an Aspekte gerichtet sind, in denen sie sich befinden."
whats_in_profile_q: "Was ist in meinem privaten Profil zu sehen?"
who_sees_profile_a: "Jeder angemeldete Benutzer, mit dem du teilst (den du zu einem deiner Aspekte hinzugefügt hast). Leute, die dir folgen, denen du aber nicht folgst, werden nur deine öffentlichen Informationen sehen."
who_sees_profile_q: "Wer kann mein privates Profil sehen?"
@@ -564,7 +567,6 @@ de:
own_your_data: "Deine Daten, dein Eigentum"
own_your_data_info: "Viele Netzwerke nutzen deine Daten, um Geld zu verdienen, indem Sie deine Interaktionen auswerten und diese Informationen verwenden, um dir Werbung zu zeigen. diaspora* nutzt deine Daten zu keinem anderen Zweck, als es dir zu ermöglichen, dich mit anderen zu verbinden und mit ihnen zu teilen."
podmin:
- admin_panel: "Administrationsbereich"
byline: "Du bist drauf und dran, das Internet zu ändern. Lass uns gleich alles einrichten, okay?"
configuration_info: "Öffne %{database_path} und %{diaspora_path} in deinem Lieblingstexteditor und sieh sie gründlich durch, sie sind ausführlich kommentiert."
configure_your_pod: "Richte deinen Pod ein"
@@ -578,22 +580,21 @@ de:
getting_help_info: "Wir haben einige %{faq} aufgelistet, einschließlich einiger zusätzlicher Tipps und Tricks und Lösungen für die häufigsten Probleme. Kontaktiere uns gerne auch %{irc}."
headline: "Willkommen, Freund."
make_yourself_an_admin: "Mach dich zum Admin"
- make_yourself_an_admin_info: "Du kannst Anweisungen im %{wiki} finden. Das sollte deinem Benutzermenü in der Kopfleiste einen Link „Admin“ hinzufügen, wenn du angemeldet bist. Er stellt dir Dinge wie Benutzersuche und Statistiken für deinen Pod zur Verfügung. Für ausführliche Angaben über die betriebsbezogenen Aspekte deines Pods, besuche den %{admin_panel}."
+ make_yourself_an_admin_info: "Du kannst Anweisungen im %{wiki} finden. Das sollte deinem Benutzermenü in der Kopfleiste einen Link „%{admin_dashboard}“ hinzufügen, wenn du angemeldet bist. Er stellt dir Dinge wie Benutzersuche und Statistiken für deinen Pod zur Verfügung."
report_bugs: "melde sie"
update_instructions: "Aktualisierungsanweisungen im diaspora*-Wiki"
update_your_pod: "Aktualisiere deinen Pod"
update_your_pod_info: "Du kannst %{update_instructions} finden."
invitation_codes:
+ already_logged_in: "Du bist von %{inviter} eingeladen worden, diesem Pod beizutreten, allerdings bist du schon angemeldet."
not_valid: "Dieser Einladungscode ist nicht mehr gültig"
invitations:
- a_facebook_user: "Ein Facebook-Nutzer"
- check_token:
- not_found: "Einladungstoken nicht gefunden"
create:
+ closed: "Einladungen sind auf diesem diaspora*-Pod im Moment nicht verfügbar."
empty: "Bitte mindestens eine E-Mail-Adresse eingeben."
no_more: "Du hast keine Einladungen mehr."
note_already_sent: "Es wurde bereits eine Einladung an %{emails} gesendet"
- rejected: "Mit diesen E-Mail-Adressen gab es Probleme:"
+ rejected: "Mit diesen E-Mail-Adressen gab es Probleme: %{emails}"
sent: "Einladungen wurden an %{emails} verschickt."
new:
codes_left:
@@ -622,6 +623,9 @@ de:
profile: "Profil"
settings: "Einstellungen"
toggle_navigation: "Navigation umschalten"
+ likes:
+ create:
+ error: "Gefällt mir ist fehlgeschlagen."
limited: "Begrenzt"
more: "Mehr"
no_results: "Keine Ergebnisse gefunden"
@@ -658,7 +662,8 @@ de:
mark_all_shown_as_read: "Alle angezeigten als gelesen markieren"
mark_read: "Als gelesen markieren"
mark_unread: "als ungelesen markieren"
- mentioned: "Erwähnt"
+ mentioned: "In Beitrag erwähnt"
+ mentioned_in_comment: "In Kommentar erwähnt"
no_notifications: "Du hast noch keine Benachrichtigungen."
notifications: "Benachrichtigungen"
reshared: "Weitergesagt"
@@ -677,8 +682,8 @@ de:
two: "%{actors} gefällt dein gelöschter Beitrag."
zero: "Niemandem gefällt dein gelöschter Beitrag."
mentioned:
- one: "%{actors} hat dich in dem Beitrag %{post_link} erwähnt."
- other: "%{actors} haben dich in dem Beitrag %{post_link} erwähnt."
+ one: "%{actors} hat dich im Beitrag %{post_link} erwähnt."
+ other: "%{actors} haben dich im Beitrag %{post_link} erwähnt."
zero: "%{actors} hat dich in dem Beitrag %{post_link} erwähnt."
mentioned_deleted:
few: "%{actors} haben dich in einem gelöschten Beitrag erwähnt."
@@ -687,6 +692,12 @@ de:
other: "%{actors} haben dich in einem gelöschten Beitrag erwähnt."
two: "%{actors} hat dich in einem bereits gelöschten Beitrag erwähnt."
zero: "Niemand hat dich in einem gelöschten Beitrag erwähnt."
+ mentioned_in_comment:
+ one: "%{actors} hat dich in einem <a href='%{comment_path}'>Kommentar</a> zum Beitrag %{post_link} erwähnt."
+ other: "%{actors} haben dich in einem <a href='%{comment_path}'>Kommentar</a> zum Beitrag %{post_link} erwähnt."
+ mentioned_in_comment_deleted:
+ one: "%{actors} hat dich in einem gelöschten Kommentar erwähnt."
+ other: "%{actors} haben dich in einem gelöschten Kommentar erwähnt."
post: "Beitrag"
private_message:
few: "%{actors} haben dir eine Nachricht gesendet."
@@ -726,6 +737,29 @@ de:
confirm_email:
click_link: "Um deine neue E-Mail-Adresse %{unconfirmed_email} zu aktivieren, klicke bitte auf diesen Link:"
subject: "Bitte aktiviere deine neue E-Mail-Adresse %{unconfirmed_email}"
+ csrf_token_fail:
+ body: |-
+ Hallo %{name},
+
+ diaspora* hat einen Versuch, auf dein Konto zuzugreifen, erkannt, der eventuell unbefugt war. Um auszuschließen, dass deine Daten gefährdet werden, bist du abgemeldet worden. Mach dir keine Sorgen; Du kannst dich jetzt wieder sicher anmelden.
+
+ Eine Anfrage ist mit ungültigem oder fehlendem CSRF-Token gesendet worden. Das könnte vollkommen harmlos sein, aber es könnte sich auch auch um einen Cross-Site-Request-Forgery-Angriff (CSRF-Angriff) handeln.
+
+ Das könnte verursacht worden sein von:
+
+ - Einem Add-on, das die Anfrage manipuliert oder Anfragen ohne das Token durchführt;
+ - Einem offen gelassenen Tab aus einer früheren Sitzung;
+ - Einer anderen Website, die mit oder ohne deine Genehmigung Anfragen durchführt;
+ - Verschiedenen anderen externen Werkzeugen;
+ - Schädlichen Code, der versucht, auf deine Daten zuzugreifen.
+
+ Für mehr Informationen zu CSRF, siehe [%{link}](%{link}).
+
+ Falls du diese Nachricht wiederholt siehst, prüfe bitte die oben stehenden Punkte, einschließlich aller Browser-Add-ons.
+
+ Danke,
+ Der diaspora* E-Mail-Roboter!
+ subject: "Wir haben eine unbefugte Anfrage von deinem Konto empfangen, %{name}"
email_sent_by_diaspora: "Diese E-Mail wurde von %{pod_name} verschickt. Falls du solche E-Mails nicht mehr erhalten willst,"
export_email:
body: |-
@@ -797,6 +831,9 @@ de:
mentioned:
limited_post: "Du wurdest in einem begrenzten Beitrag erwähnt."
subject: "%{name} hat dich auf diaspora* erwähnt"
+ mentioned_in_comment:
+ limited_post: "Du wurdest in einem Kommentar zu einem begrenzten Beitrag erwähnt."
+ reply: "Auf diese Unterhaltung antworten oder sie ansehen >"
private_message:
reply_to_or_view: "Antworte oder sieh dir diese Unterhaltung an >"
subject: "Es gibt eine neue private Nachricht für dich"
@@ -882,14 +919,8 @@ de:
type_error: "Hochladen des Fotos fehlgeschlagen. Bist du sicher, dass ein Bild hinzugefügt wurde?"
destroy:
notice: "Foto gelöscht."
- new_photo:
- empty: "{file} ist leer, bitte wähle erneut Dateien aus."
- invalid_ext: "{file} hat keine gültige Erweiterung. Nur {extensions} sind erlaubt."
- size_error: "{file} ist zu groß. Die maximale Dateigröße beträgt {sizeLimit}."
new_profile_photo:
upload: "Ein neues Profilfoto hochladen"
- show:
- show_original_post: "Zeige ursprünglichen Beitrag"
polls:
votes:
one: "Bisher %{count} Stimme"
@@ -960,7 +991,7 @@ de:
enter_username: "Wähle einen Nutzernamen (nur Buchstaben, Nummern und Unterstriche)"
password: "Kennwort"
password_confirmation: "Kennwort bestätigen"
- sign_up: "Konto ersellen"
+ sign_up: "Konto erstellen"
submitting: "Absenden…"
terms: "Indem du ein Konto erstellst, akzeptierst du die %{terms_link}."
terms_link: "Nutzungsbedingungen"
@@ -979,8 +1010,14 @@ de:
destroyed: "Der Beitrag wurde gelöscht"
failed: "Ein Fehler ist aufgetreten"
title: "Meldungsübersicht"
+ unreviewed_reports:
+ one: "Es gibt eine ungeprüfte Meldung."
+ other: "Es gibt %{count} ungeprüfte Meldungen."
+ zero: "Es gibt keine ungeprüften Meldungen."
reshares:
comment_email_subject: "%{resharer}s Version von %{author}s Beitrag"
+ create:
+ error: "Fehler beim Weitersagen."
reshare:
deleted: "Originalbeitrag wurde vom Autor entfernt."
reshare_confirmation: "%{author}s Beitrag weitersagen?"
@@ -1022,7 +1059,7 @@ de:
other: "In %{count} Aspekten"
zero: "In keinem Aspekt"
invitations:
- by_email: "Per E-Mail"
+ by_email: "Lade Leute per E-Mail ein"
invite_your_friends: "Lade deine Freunde ein"
invites: "Einladungen"
share_this: "Teile diesen Link per Email, Blog oder sozialen Netzwerken!"
@@ -1156,6 +1193,7 @@ de:
comment_on_post: "jemand deinen Beitrag kommentiert"
current_password: "Derzeitiges Kennwort"
current_password_expl: "das mit dem Du dich anmeldest..."
+ default_post_visibility: "Zum Teilen vorausgewählte Aspekte"
download_export: "Mein Profil herunterladen"
download_export_photos: "Meine Fotos herunterladen"
edit_account: "Konto bearbeiten"
@@ -1167,6 +1205,7 @@ de:
last_exported_at: "(Zuletzt aktualisiert: %{timestamp})"
liked: "jemandem dein Beitrag gefällt"
mentioned: "du in einem Beitrag erwähnt wirst"
+ mentioned_in_comment: "du bist in einem Kommentar erwähnt"
new_password: "Neues Kennwort"
private_message: "du eine private Nachricht erhältst"
receive_email_notifications: "E-Mail-Benachrichtigungen empfangen, wenn …"
diff --git a/config/locales/diaspora/de_formal.yml b/config/locales/diaspora/de_formal.yml
index 13f66162e..d1c305769 100644
--- a/config/locales/diaspora/de_formal.yml
+++ b/config/locales/diaspora/de_formal.yml
@@ -274,6 +274,8 @@ de_formal:
post_something: "Erstellen Sie einen Beitrag in diaspora*"
cancel: "Abbrechen"
comments:
+ create:
+ error: "Konnte nicht kommentieren."
new_comment:
comment: "Kommentieren"
commenting: "Kommentieren …"
@@ -298,7 +300,6 @@ de_formal:
conversations:
create:
fail: "Ungültige Nachricht"
- no_contact: "Hoppla, Sie müssen den Kontakt erst hinzufügen!"
sent: "Nachricht versendet"
destroy:
delete_success: "Unterhaltung erfolgreich gelöscht"
@@ -307,6 +308,7 @@ de_formal:
conversations_inbox: "Konversationen – Eingang"
inbox: "Eingang"
new_conversation: "Neue Konversation"
+ no_contacts: "Sie müssen einige Kontakte hinzufügen, bevor Sie eine Unterhaltung anfangen können"
no_messages: "Keine Nachrichten"
new:
message: "Nachricht"
@@ -331,6 +333,7 @@ de_formal:
delete: "Löschen"
email: "E-Mail-Adresse"
error_messages:
+ csrf_token_fail: "Das CSRF-Token ist ungültig. Bitte melden Sie sich an und versuchen Sie es erneut."
helper:
correct_the_following_errors_and_try_again: "Korrigieren Sie die folgenden Fehler und versuchen Sie es erneut."
need_javascript: "Diese Webseite benötigt JavaScript, um ordnungsgemäß zu funktionieren. Falls Sie JavaScript deaktiviert haben, aktivieren Sie es bitte und aktualisieren Sie diese Seite."
@@ -564,7 +567,6 @@ de_formal:
own_your_data: "Ihre Daten, Ihr Eigentum"
own_your_data_info: "Viele Netzwerke nutzen Ihre Daten, um Geld zu verdienen, indem Sie Ihre Interaktionen auswerten und diese Informationen verwenden, um Ihnen Werbung zu zeigen. diaspora* nutzt Ihre Daten zu keinem anderen Zweck, als es Ihnen zu ermöglichen, sich mit anderen zu verbinden und mit ihnen zu teilen."
podmin:
- admin_panel: "Administrationsbereich"
byline: "Sie sind im Begriff, das Internet zu ändern. Lassen Sie uns gleich alles einrichten, okay?"
configuration_info: "Öffnen Sie %{database_path} und %{diaspora_path} in Ihrem Lieblingstexteditor und sehen Sie sie gründlich durch, sie sind ausführlich kommentiert."
configure_your_pod: "Richten Sie Ihren Pod ein"
@@ -578,22 +580,21 @@ de_formal:
getting_help_info: "Wir haben einige %{faq} aufgelistet, einschließlich einiger zusätzlicher Tipps und Tricks und Lösungen für die häufigsten Probleme. Kontaktieren Sie uns gerne auch %{irc}."
headline: "Willkommen, Freund."
make_yourself_an_admin: "Machen Sie sich zum Admin"
- make_yourself_an_admin_info: "Sie können Anweisungen im %{wiki} finden. Das sollte Ihrem Benutzermenü in der Kopfleiste einen Link „Admin“ hinzufügen, wenn Sie angemeldet sind. Er stellt Ihnen Dinge wie Benutzersuche und Statistiken für Ihren Pod zur Verfügung. Für ausführliche Angaben über die betriebsbezogenen Aspekte Ihres Pods, besuchen Sie den %{admin_panel}."
+ make_yourself_an_admin_info: "Sie können Anweisungen im %{wiki} finden. Das sollte Ihrem Benutzermenü in der Kopfleiste einen Link „%{admin_dashboard}“ hinzufügen, wenn Sie angemeldet sind. Er stellt Ihnen Dinge wie Benutzersuche und Statistiken für Ihren Pod zur Verfügung."
report_bugs: "melden Sie sie"
update_instructions: "Aktualisierungsanweisungen im diaspora*-Wiki"
update_your_pod: "Aktualisieren Sie Ihren Pod"
update_your_pod_info: "Sie können %{update_instructions} finden."
invitation_codes:
+ already_logged_in: "Sie wurden von %{inviter} eingeladen, diesem Pod beizutreten, jedoch sind Sie bereits angemeldet."
not_valid: "Dieser Einladungscode ist nicht mehr gültig"
invitations:
- a_facebook_user: "Ein Facebook Nutzer"
- check_token:
- not_found: "Einladungstoken nicht gefunden"
create:
+ closed: "Einladungen sind auf diesem diaspora*-Pod derzeit nicht verfügbar."
empty: "Bitte mindestens eine E-Mail-Adresse eingeben."
no_more: "Sie haben keine Einladungen mehr."
note_already_sent: "Es wurde bereits eine Einladung an %{emails} gesendet"
- rejected: "Mit diesen E-Mail-Adressen gab es Probleme: "
+ rejected: "Mit den folgenden E-Mail-Adressen gab es Probleme: %{emails}"
sent: "Einladungen wurden verschickt an: %{emails}"
new:
codes_left:
@@ -622,6 +623,9 @@ de_formal:
profile: "Profil"
settings: "Einstellungen"
toggle_navigation: "Navigation umschalten"
+ likes:
+ create:
+ error: "Gefällt mir ist fehlgeschlagen."
limited: "Begrenzt"
more: "Mehr"
no_results: "Keine Ergebnisse gefunden"
@@ -658,7 +662,8 @@ de_formal:
mark_all_shown_as_read: "Alle angezeigten als gelesen markieren"
mark_read: "Als gelesen markieren"
mark_unread: "als ungelesen markieren"
- mentioned: "Erwähnt"
+ mentioned: "In Beitrag erwähnt"
+ mentioned_in_comment: "In Kommentar erwähnt"
no_notifications: "Sie haben noch keine Benachrichtigungen."
notifications: "Benachrichtigungen"
reshared: "Weitergesagt"
@@ -687,6 +692,12 @@ de_formal:
other: "%{actors} haben Sie in einem gelöschten Beitrag erwähnt."
two: "%{actors} hat Sie in einem bereits gelöschten Beitrag erwähnt."
zero: "Niemand hat Sie in einem gelöschten Beitrag erwähnt."
+ mentioned_in_comment:
+ one: "%{actors} hat Sie in einem <a href='%{comment_path}'>Kommentar</a> zum Beitrag %{post_link} erwähnt."
+ other: "%{actors} haben Sie in einem <a href='%{comment_path}'>Kommentar</a> zum Beitrag %{post_link} erwähnt."
+ mentioned_in_comment_deleted:
+ one: "%{actors} hat Sie in einem gelöschten Kommentar erwähnt."
+ other: "%{actors} haben Sie in einem gelöschten Beitrag erwähnt."
post: "Beitrag"
private_message:
few: "%{actors} haben Ihnen eine Nachricht gesendet."
@@ -700,11 +711,8 @@ de_formal:
other: "%{actors} haben Ihren Beitrag %{post_link} weitergesagt."
zero: "%{actors} haben Ihren Beitrag %{post_link} weitergesagt."
reshared_post_deleted:
- few: "%{actors} haben Ihren gelöschten Beitrag weitergesagt."
- many: "%{actors} haben Ihren gelöschten Beitrag weitergesagt."
one: "%{actors} hat Ihren gelöschten Beitrag weitergesagt."
other: "%{actors} haben Ihren gelöschten Beitrag weitergesagt."
- two: "%{actors} hat Ihren bereits gelöschten Beitrag weitergeleitet."
zero: "%{actors} haben Ihren gelöschten Beitrag weitergesagt."
started_sharing:
few: "%{actors} haben angefangen mit Ihnen zu teilen."
@@ -726,6 +734,29 @@ de_formal:
confirm_email:
click_link: "Um deine neue E-Mail-Adresse %{unconfirmed_email} zu aktivieren, klicken Sie bitte auf diesen Link:"
subject: "Bitte aktivieren Sie Ihre neue E-Mail-Adresse %{unconfirmed_email}"
+ csrf_token_fail:
+ body: |-
+ Hallo %{name},
+
+ diaspora* hat einen Versuch, auf Ihr Konto zuzugreifen, erkannt, der möglicherweise unbefugt war. Um auszuschließen, dass Ihre Daten gefährdet werden, wurden Sie abgemeldet. Machen Sie sich keine Sorgen; Sie können sich nun wieder sicher anmelden.
+
+ Es wurde eine Anfrage mit ungültigem oder fehlendem CSRF-Token gesendet. Dies könnte vollkommen harmlos sein, es könnte sich aber auch um einen Cross-Site-Request-Forgery-Angriff (CSRF-Angriff) handeln.
+
+ Dies könnte verursacht worden sein durch:
+
+ - Ein Add-on, das die Anfrage manipuliert oder Anfragen ohne das Token durchführt;
+ - Einen offen gelassenen Tab aus einer vorherigen Sitzung;
+ - Eine andere Website, die mit oder ohne Ihre Genehmigung Anfragen durchführt;
+ - Verschiedene andere externe Werkzeuge;
+ - Schädlichen Code, der auf Ihre Daten zuzugreifen versucht.
+
+ Für weitere Informationen zu CSRF, siehe [%{link}](%{link}).
+
+ Falls Sie diese Nachricht wiederholt sehen, prüfen Sie bitte die oben stehenden Punkte, einschließlich jeglicher Browser-Add-ons.
+
+ Danke,
+ Der diaspora* E-Mail-Roboter!
+ subject: "Wir haben eine unbefugte Anfrage von Ihrem Konto erhalten, %{name}"
email_sent_by_diaspora: "Diese E-Mail wurde von %{pod_name} verschickt. Falls Sie solche E-Mails nicht mehr erhalten wollen,"
export_email:
body: |-
@@ -797,6 +828,9 @@ de_formal:
mentioned:
limited_post: "Sie wurden in einem begrenzten Beitrag erwähnt."
subject: "%{name} hat Sie auf diaspora* erwähnt"
+ mentioned_in_comment:
+ limited_post: "Sie wurden in einem Kommentar zu einem begrenzten Beitrag erwähnt."
+ reply: "Auf diese Unterhaltung antworten oder sie ansehen >"
private_message:
reply_to_or_view: "Antworten Sie oder sehen Sie sich diese Unterhaltung an >"
subject: "Es gibt eine neue private Nachricht für Sie"
@@ -881,14 +915,8 @@ de_formal:
type_error: "Hochladen des Fotos fehlgeschlagen. Sind Sie sicher, dass ein Bild hinzugefügt wurde?"
destroy:
notice: "Foto gelöscht."
- new_photo:
- empty: "{file} ist leer, bitte wählen Sie erneut Dateien aus."
- invalid_ext: "{file} hat keine gültige Erweiterung. Nur {extensions} sind erlaubt."
- size_error: "{file} ist zu groß. Die maximale Dateigröße beträgt {sizeLimit}."
new_profile_photo:
upload: "Laden Sie ein neues Profilfoto hoch!"
- show:
- show_original_post: "Zeige ursprünglichen Beitrag"
polls:
votes:
one: "Bisher eine Stimme."
@@ -975,8 +1003,14 @@ de_formal:
destroyed: "Der Beitrag wurde gelöscht"
failed: "Ein Fehler ist aufgetreten"
title: "Meldungsübersicht"
+ unreviewed_reports:
+ one: "Es besteht eine ungeprüfte Meldung."
+ other: "Es bestehen %{count} ungeprüfte Meldungen."
+ zero: "Es bestehen keine ungeprüften Meldungen."
reshares:
comment_email_subject: "%{resharer}s Version von %{author}s Beitrag"
+ create:
+ error: "Fehler beim Weitersagen."
reshare:
deleted: "Originalbeitrag wurde vom Autor gelöscht."
reshare_confirmation: "%{author}'s Beitrag weitersagen?"
@@ -1014,14 +1048,10 @@ de_formal:
mobile_row_checked: "%{name} (entfernen)"
mobile_row_unchecked: "%{name} (hinzufügen)"
toggle:
- few: "In %{count} Aspekten"
- many: "In %{count} Aspekten"
one: "In einem Aspekt"
other: "In %{count} Aspekten"
- two: "In %{count} Aspekten"
- zero: "Kontakt hinzufügen"
invitations:
- by_email: "Per E-Mail"
+ by_email: "Lade Leute per E-Mail ein"
invite_your_friends: "Laden Sie Ihre Freunde ein"
invites: "Einladungen"
share_this: "Teilen Sie diesen Link per E-Mail, Blog oder soziale Netzwerke!"
@@ -1155,6 +1185,7 @@ de_formal:
comment_on_post: "jemand Ihren Beitrag kommentiert"
current_password: "Derzeitiges Passwort"
current_password_expl: "das mit dem Sie sich anmelden..."
+ default_post_visibility: "Zum Teilen vorausgewählte Aspekte"
download_export: "Mein Profil herunterladen"
download_export_photos: "Meine Fotos herunterladen"
edit_account: "Konto bearbeiten"
@@ -1166,6 +1197,7 @@ de_formal:
last_exported_at: "(Zuletzt aktualisiert um %{timestamp})"
liked: "wenn jemandem Ihr Beitrag gefällt"
mentioned: "Sie in einem Beitrag erwähnt werden"
+ mentioned_in_comment: "Sie sind in einem Kommentar erwähnt"
new_password: "Neues Passwort"
private_message: "Sie eine private Nachricht erhalten"
receive_email_notifications: "E-Mail-Benachrichtigungen empfangen, wenn:"
diff --git a/config/locales/diaspora/el.yml b/config/locales/diaspora/el.yml
index 381ee15a4..9d69d7cd9 100644
--- a/config/locales/diaspora/el.yml
+++ b/config/locales/diaspora/el.yml
@@ -197,7 +197,6 @@ el:
conversations:
create:
fail: "Μη έγκυρο μήνυμα"
- no_contact: "Πρέπει πρώτα να προσθέσεις μια επαφή!"
sent: "Μήνυμα εστάλη"
index:
inbox: "Εισερχόμενα"
@@ -276,9 +275,6 @@ el:
tutorials: "οδηγοί"
wiki: "wiki"
invitations:
- a_facebook_user: "Ένας χρήστης του Facebook"
- check_token:
- not_found: "Το σύμβολο της πρόσκλησης δεν βρέθηκε"
create:
empty: "Παρακαλώ εισήγαγε τουλάχιστον μία διεύθυνση email."
no_more: "Δεν έχεις άλλες προσκλήσεις."
@@ -451,14 +447,8 @@ el:
type_error: "Η μεταφόρτωση της φωτογραφίας απέτυχε. Σίγουρα προστέθηκε μια εικόνα;"
destroy:
notice: "Η φωτογραφία διαγράφηκε."
- new_photo:
- empty: "{file} είναι κενό, επιλέξτε και πάλι τα αρχεία χωρίς αυτό."
- invalid_ext: "{file} δεν έχει έγκυρη τύπο αρχείου. Μόνο τύποι αρχείου {extensions} επιτρέπονται."
- size_error: "{file} είναι πολύ μεγάλο, το μέγιστο μέγεθος αρχείου είναι {sizeLimit}."
new_profile_photo:
upload: "Ανέβασε μια νέα φωτογραφία προφίλ!"
- show:
- show_original_post: "Προβολή αρχικής ανάρτησης"
posts:
presenter:
title: "Ένα άρθρο από τον/την %{name}"
diff --git a/config/locales/diaspora/en.yml b/config/locales/diaspora/en.yml
index cdff0411b..0022fe545 100644
--- a/config/locales/diaspora/en.yml
+++ b/config/locales/diaspora/en.yml
@@ -240,6 +240,8 @@ en:
explanation: "Post to diaspora* from anywhere by bookmarking this link => %{link}."
comments:
+ create:
+ error: "Failed to comment."
new_comment:
comment: "Comment"
commenting: "Commenting..."
@@ -591,6 +593,10 @@ en:
source_package: "Download the source code package"
be_excellent: "Be excellent to each other! ♥"
+ likes:
+ create:
+ error: "Failed to like."
+
notifications:
started_sharing:
zero: "%{actors} started sharing with you."
@@ -701,12 +707,23 @@ en:
body: |-
Hello %{name},
- We received a request with a wrong/missing CSRF token from your account. To prevent any possible damage you have been logged out.
+ diaspora* has detected an attempt to access your session which might be unauthorised. To avoid any chance of your data being compromised, you have been signed out. Don’t worry; you can safely sign in again now.
+
+ A request has been made using a incorrect or missing CSRF token. This might be completely innocent, but it could be a cross-site request forgery (CSRF) attack.
+
+ This could have been caused by:
+
+ - An add-on manipulating the request or making requests without the token;
+ - A tab left open from a past session;
+ - Another website making requests, with or without your permission;
+ - Various other external tools;
+ - Malicious code trying to access your data.
For more information on CSRF see [%{link}](%{link}).
- Sorry,
+ If you see this message repeatedly, please check the points above, including any browser add-ons.
+ Thank you,
The diaspora* email robot!
report_email:
type:
@@ -892,8 +909,6 @@ en:
invited_by: "You were invited by"
photos:
- show:
- show_original_post: "Show original post"
create:
runtime_error: "Photo upload failed. Are you sure that your seatbelt is fastened?"
integrity_error: "Photo upload failed. Are you sure that was an image?"
@@ -991,6 +1006,8 @@ en:
invalid_invite: "The invite link you provided is no longer valid!"
reshares:
+ create:
+ error: "Failed to reshare."
reshare:
reshared_via: "Reshared via"
reshare_confirmation: "Reshare %{author}’s post?"
diff --git a/config/locales/diaspora/en_1337.yml b/config/locales/diaspora/en_1337.yml
index 0d0abfc32..c2f4b71a8 100644
--- a/config/locales/diaspora/en_1337.yml
+++ b/config/locales/diaspora/en_1337.yml
@@ -129,9 +129,6 @@ en_1337:
fill_me_out: "!npu7 73x7 h3r3"
find_people: "Ctrl+F n0obz, #74g5"
invitations:
- a_facebook_user: "4 F4C3B00K N00B!"
- check_token:
- not_found: "1NV4L1D 1NV174710N 70K3N!"
create:
no_more: "U H4V3 N0 M0R3 1NV174710N5!"
rejected: "7H3 F0LL0W1NG M41L5 H4D PR0BL3M5: "
@@ -296,14 +293,8 @@ en_1337:
type_error: "PR0N UPL04D F41L3D! 4R3 U 5UR3 4N 1M4G3 W45 4DD3D?"
destroy:
notice: "PR0N D3L373D!"
- new_photo:
- empty: "{file} 15 3MP7Y, PLZ 53L3C7 F1L35 4G41N W17H0U7 17!"
- invalid_ext: "{file} H45 1NV4L1D 3X73N510N! 0NLY {extensions} 4R3 4LL0W3D!"
- size_error: "{file} 15 2 L4RG3, M4X1MUM F1L3 51Z3 15 {sizeLimit}."
new_profile_photo:
upload: "UPL04D 4 N3W PR0F1L3 P1C!"
- show:
- show_original_post: "5H0W 0R1G1N4L 5P4M!"
posts:
show:
photos_by:
diff --git a/config/locales/diaspora/en_pirate.yml b/config/locales/diaspora/en_pirate.yml
index 55e69a3ab..5801cdc3d 100644
--- a/config/locales/diaspora/en_pirate.yml
+++ b/config/locales/diaspora/en_pirate.yml
@@ -144,7 +144,6 @@ en_pirate:
fill_me_out: "Fill me out arrr"
find_people: "Scour fer mates or treasures"
invitations:
- a_facebook_user: "A Facebook scallywag"
create:
no_more: "Ye have no more invitations."
rejected: "Yer pigeon can't deliver to the followin' addresses: "
@@ -306,10 +305,6 @@ en_pirate:
type_error: "Portrait hangin' failed. Are ye sure a portrait was added mate?"
destroy:
notice: "Portrait scuttled!"
- new_photo:
- empty: "{file} be empty, choose yer files again without it mate."
- invalid_ext: "{file} not be valid ye scallywag. Only {extensions} be allowed."
- size_error: "{file} be 't large mate, the biggest file size be {sizeLimit}."
new_profile_photo:
upload: "Hang a new portrait in ye ship!"
posts:
diff --git a/config/locales/diaspora/en_shaw.yml b/config/locales/diaspora/en_shaw.yml
index 61c266774..4e834bdc3 100644
--- a/config/locales/diaspora/en_shaw.yml
+++ b/config/locales/diaspora/en_shaw.yml
@@ -119,8 +119,6 @@ en_shaw:
fill_me_out: "𐑓𐑦𐑤 𐑥𐑰 𐑬𐑑"
find_people: "𐑓𐑲𐑯𐑛 𐑐𐑰𐑐𐑩𐑤"
invitations:
- check_token:
- not_found: "𐑦𐑯𐑝𐑦𐑑𐑱𐑖𐑩𐑯 𐑑𐑴𐑒𐑩𐑯 𐑯𐑪𐑑 𐑓𐑬𐑯𐑛"
create:
no_more: "𐑿 𐑣𐑨𐑝 𐑯𐑴 𐑥𐑹 𐑦𐑯𐑝𐑦𐑑𐑱𐑖𐑩𐑯𐑟."
rejected: "𐑞 𐑓𐑪𐑤𐑴𐑦𐑙 𐑦-𐑥𐑱𐑤 𐑩𐑛𐑮𐑧𐑕 𐑣𐑨𐑛 𐑐𐑮𐑪𐑚𐑤𐑩𐑥𐑟: "
@@ -282,10 +280,6 @@ en_shaw:
type_error: "𐑓𐑴𐑑𐑴 𐑩𐑐𐑤𐑴𐑛 𐑓𐑱𐑤𐑛. 𐑸 𐑿 𐑖𐑻 𐑩𐑯 𐑦𐑥𐑩𐑡 𐑢𐑪𐑟 𐑨𐑛𐑩𐑛?"
destroy:
notice: "𐑓𐑴𐑑𐑴 𐑛𐑦𐑤𐑰𐑑𐑩𐑛."
- new_photo:
- empty: "{file} 𐑦𐑟 𐑧𐑥𐑐𐑑𐑦, 𐑐𐑤𐑰𐑟 𐑕𐑩𐑤𐑧𐑒𐑑 𐑓𐑲𐑤𐑟 𐑩𐑜𐑧𐑯 𐑢𐑦𐑞𐑬𐑑 𐑦𐑑."
- invalid_ext: "{file} 𐑣𐑨𐑟 𐑦𐑯𐑝𐑨𐑤𐑦𐑛 𐑧𐑒𐑕𐑑𐑧𐑯𐑖𐑩𐑯. 𐑴𐑯𐑤𐑦 {extensions} 𐑸 𐑩𐑤𐑬𐑛."
- size_error: "{file} 𐑦𐑟 𐑑𐑵 𐑤𐑸𐑡, 𐑥𐑨𐑒𐑕𐑦𐑥𐑩𐑥 𐑓𐑲𐑤 𐑕𐑲𐑟 𐑦𐑟 {sizeLimit}."
new_profile_photo:
upload: "𐑩𐑐𐑤𐑴𐑛 𐑩 𐑯𐑿 𐑐𐑮𐑴𐑓𐑲𐑤 𐑓𐑴𐑑𐑴!"
posts:
diff --git a/config/locales/diaspora/en_valspeak.yml b/config/locales/diaspora/en_valspeak.yml
index bac0391f1..ec4f4a4bf 100644
--- a/config/locales/diaspora/en_valspeak.yml
+++ b/config/locales/diaspora/en_valspeak.yml
@@ -224,7 +224,6 @@ en_valspeak:
conversations:
create:
fail: "bad txt"
- no_contact: "Umm HELLO, u need 2 like, add them first! Duh!"
sent: "txt sent"
destroy:
delete_success: "convo successfully deleted YAAAAY!((:"
@@ -464,9 +463,6 @@ en_valspeak:
tutorials: "tutorialz!!"
wiki: "ZOMG D*'s OWN WIKIPEDIA!! :DDD"
invitations:
- a_facebook_user: "a like... fb usah"
- check_token:
- not_found: "invite token was like... not found :\\"
create:
empty: "Plz enter at least 1 email addy, thx<3"
no_more: "u have like... no moar invites."
@@ -703,14 +699,8 @@ en_valspeak:
type_error: "So like... ur pic wasnt added. r u like... sure u actually like... added it?"
destroy:
notice: "Pic deleted :o"
- new_photo:
- empty: "{file} is like... empty, plz pick the filez again witout that 1. kthx"
- invalid_ext: "{file} is like... not able2 b uploaded cuz like... its not the right kinda file.. only like... these {extensions} r allowed... sry bout tht :\\"
- size_error: "OMG {file} is 2 big!! the biggest i can take is like... {sizeLimit}.(;"
new_profile_photo:
upload: "Upload a new selfie!!! OMG!!"
- show:
- show_original_post: "Show da original postie"
posts:
presenter:
title: "A postie from %{name}"
diff --git a/config/locales/diaspora/eo.yml b/config/locales/diaspora/eo.yml
index d2ae114af..cd0b5b718 100644
--- a/config/locales/diaspora/eo.yml
+++ b/config/locales/diaspora/eo.yml
@@ -42,6 +42,7 @@ eo:
admin_bar:
pages: "Paĝoj"
pod_stats: "Statistiko de 'pod' (Diaspora-servilo)"
+ sidekiq_monitor: "Sidekiq monitoro"
user_search: "Serĉo de uzanto"
weekly_user_stats: "Semajna statistiko de uzanto"
stats:
@@ -88,7 +89,7 @@ eo:
current_server: "Aktuala dato de servilo estas %{date}"
all_aspects: "Ĉiuj aspektoj"
are_you_sure: "Ĉu vi certas?"
- are_you_sure_delete_account: "Ĉu vi certe volas forigi vian konton? Vi ne povas malfari tion!"
+ are_you_sure_delete_account: "Ĉu vi certe volas forigi vian konton? Vi ne povos malfari tion!"
aspect_memberships:
destroy:
failure: "Forigi personon el aspekto malsukcesis"
@@ -111,9 +112,9 @@ eo:
aspect_list_is_not_visible: "la aspekto-listo estas kaŝita al la aliaj en ĉi tiu aspekto"
aspect_list_is_visible: "la aspekto-listo estas montrata al la aliaj en ĉi tiu aspekto"
confirm_remove_aspect: "Ĉu vi certe volas forigi ĉi tiun aspekton?"
- rename: "alinomigi"
+ rename: "Renomigi"
update: "ĝisdatigi"
- updating: "ĝisdatigante"
+ updating: "ĝisdatigado"
index:
donate: "Donaci"
help:
@@ -136,7 +137,7 @@ eo:
new_here:
follow: "Sekvu %{link} kaj bonvenigu novajn uzantojn al Diaspora*!"
learn_more: "Lerni pli"
- title: "Bonvenigu novajn uzantojn"
+ title: "Bonvenu novajn uzantojn"
services:
content: "Vi povas konekti la postajn servojn kun DIASPORA*:"
heading: "Konekti Servojn"
@@ -187,7 +188,6 @@ eo:
conversations:
create:
fail: "Malĝusta mesaĝo"
- no_contact: "Hej, unue devas vi aldoni la kontakton."
sent: "Mesaĝo sendiĝis."
index:
inbox: "Poŝtujo"
@@ -217,9 +217,13 @@ eo:
help:
foundation_website: "Retejo de Fondaĵo Diaspora"
getting_help:
+ get_support_a_irc: "aliĝu al ni en %{irc} (rektbabilejo)"
get_support_a_website: "vizitu nian %{link}"
+ get_support_a_wiki: "serĉi en %{link}"
getting_started_a: "Vi bonŝancas. Provu la %{tutorial_series} en nia projektrejejo. Ĝi enkondukos vin paŝo post paŝo tra la aliĝilon kaj instruos vin ĉiujn bazajn bezonatajn informojn pri la uzado de diaspora*."
getting_started_q: "Help! Mi bezonas bazan helpon por komenci!"
+ title: "Ricevo de helpo"
+ getting_started_tutorial: "\"Instrukcio por komencantoj\""
here: "ĉi tie"
irc: "IRC"
markdown: "Markdown"
@@ -228,9 +232,6 @@ eo:
tutorials: "enkondukoj"
wiki: "vikio"
invitations:
- a_facebook_user: "Facebook-uzanto"
- check_token:
- not_found: "Ne povis trovi invitan ĵetonon"
create:
empty: "Bonvole tajpu almenaŭ unu retpoŝtadreson."
no_more: "Vi ne plu havas invitojn."
@@ -412,14 +413,8 @@ eo:
type_error: "Alŝuti bildon malsukcesis. Ĉu vi certas, ke vi aldonis bildon?"
destroy:
notice: "Bildo forviŝiĝis."
- new_photo:
- empty: "{file} malplenas; bonvolu reelekti dosierojn sen ĝi."
- invalid_ext: "{file} havas malvalidan sufikson. Nur {extensions} estas validaj."
- size_error: "{file} estas tro granda; la maksimuma dosiergrandeco estas {sizeLimit}."
new_profile_photo:
upload: "Alŝutu novan profilbildon!"
- show:
- show_original_post: "Montri originan afiŝon."
posts:
presenter:
title: "Mesaĝo de %{name}"
diff --git a/config/locales/diaspora/es-AR.yml b/config/locales/diaspora/es-AR.yml
index 1d5627a07..fc887d921 100644
--- a/config/locales/diaspora/es-AR.yml
+++ b/config/locales/diaspora/es-AR.yml
@@ -274,6 +274,8 @@ es-AR:
post_something: "Publicar en diaspora*"
cancel: "Cancelar"
comments:
+ create:
+ error: "Hubo un error al comentar."
new_comment:
comment: "Comentar"
commenting: "Comentando..."
@@ -298,7 +300,6 @@ es-AR:
conversations:
create:
fail: "Mensaje inválido"
- no_contact: "¡Primero necesitas agregar al contacto!"
sent: "Mensaje enviado"
destroy:
delete_success: "La conversación ha sido eliminada"
@@ -307,6 +308,7 @@ es-AR:
conversations_inbox: "Conversaciones - Bandeja de entrada"
inbox: "Mensajes"
new_conversation: "Nueva conversación"
+ no_contacts: "Necesitas añadir algunos contactos antes de empezar una conversación"
no_messages: "No hay mensajes"
new:
message: "Mensaje"
@@ -331,6 +333,7 @@ es-AR:
delete: "Eliminar"
email: "Correo electrónico"
error_messages:
+ csrf_token_fail: "El token CSRF es invalido. Por favor volvé a iniciar sesión e intentalo nuevamente."
helper:
correct_the_following_errors_and_try_again: "Corregí los siguientes errores e intentá de nuevo."
need_javascript: "Esta web necesita JavaScript para funcionar correctamente. Si lo desactivaste, por favor actívalo y actualiza la página."
@@ -564,7 +567,6 @@ es-AR:
own_your_data: "Sé el dueño de tus datos"
own_your_data_info: "Muchas redes usan tus datos para hacer dinero analizando tus interacciones y usando esa información para mostrarte anuncios publicitarios. diaspora* no usa tus datos para ningún propósito más que permitirte estar en contacto con otras personas."
podmin:
- admin_panel: "panel de administración"
byline: "Estás a punto de cambiar Internet. Vamos a configurarlo, ¿dale?"
configuration_info: "Abre %{database_path} y %{diaspora_path} en tu editor de texto favorito y revísalos cuidadosamente, están comentados al detalle."
configure_your_pod: "Configura tu pod"
@@ -578,22 +580,21 @@ es-AR:
getting_help_info: "Mostramos algunas %{faq} incluyendo consejos adicionales, trucos y soluciones para los problemas más comunes. También puedes probar el chat %{irc}."
headline: "¡Bienvenido!"
make_yourself_an_admin: "Conviértete en administrador"
- make_yourself_an_admin_info: "Puedes encontrar instrucciones en la %{wiki}. Esto añadirá un enlace de \"Administrador\" a tu menú de usuario en el encabezado cuando inicies sesión. Asimismo, te dará funciones como búsqueda de usuarios y estadísticas de tu pod. Para detalles avanzados en el aspecto operacional, ve al %{admin_panel}."
+ make_yourself_an_admin_info: "Puedes encontrar instrucciones en la %{wiki}. Esto añadirá un enlace de \"Administrador\" a tu menú de usuario en el encabezado cuando inicies sesión. Asimismo, te dará funciones como búsqueda de usuarios y estadísticas de tu pod. Para detalles avanzados en el aspecto operacional, ve al “%{admin_dashboard}”."
report_bugs: "repórtalos"
update_instructions: "instrucciones de actualización en la wiki de diaspora*"
update_your_pod: "Actualiza tu pod"
update_your_pod_info: "Puedes encontrar %{update_instructions}"
invitation_codes:
+ already_logged_in: "Fuiste invitado por %{inviter} para unirte a este pod pero ya tenes una sesión iniciada."
not_valid: "El código de invitación ya no es válido"
invitations:
- a_facebook_user: "Un usuario de Facebook"
- check_token:
- not_found: "No se encontró la udentificación de invitación"
create:
+ closed: "Las invitaciones están desactivadas en este pod de diaspora*."
empty: "Por favor ingresa al menos una dirección de correo electrónico."
no_more: "No tenés más invitaciones."
note_already_sent: "Las invitaciones han sido enviadas a: %{emails}"
- rejected: "Las siguientes direcciones tuvieron problemas: "
+ rejected: "Hubo problemas con las siguientes direcciones de correo electrónico: %{emails}"
sent: "Las invitaciones se han enviado a: %{emails}"
new:
codes_left:
@@ -622,6 +623,9 @@ es-AR:
profile: "Perfil"
settings: "Configuración"
toggle_navigation: "Cambiar navegación"
+ likes:
+ create:
+ error: "¡Falló el 'Me gusta'!"
limited: "Limitado"
more: "Más"
no_results: "No hay resultados"
@@ -659,6 +663,7 @@ es-AR:
mark_read: "Marcar como leído"
mark_unread: "Marcar como no leído"
mentioned: "Mencionados"
+ mentioned_in_comment: "Fuiste mencionado en un comentario"
no_notifications: "Aún no tienes ninguna notificación."
notifications: "Notificaciones"
reshared: "Compartidos"
@@ -687,6 +692,12 @@ es-AR:
other: "%{actors} te mencionaron en una publicación eliminada."
two: "%{actors} te mencionó en un mensaje eliminado."
zero: "%{actors} te mencionó en una publicación eliminada."
+ mentioned_in_comment:
+ one: "%{actors} te mencionó en un <a href='%{comment_path}'>comentario</a> de la publicación %{post_link}"
+ other: "%{actors} te mencionarion en un <a href='%{comment_path}'>comentario</a> de la publicación %{post_link}"
+ mentioned_in_comment_deleted:
+ one: "%{actors} te mencionó en un comentario que fue eliminado."
+ other: "%{actors} te mencionaron en un comentario que fue eliminado."
post: "publicación"
private_message:
few: "%{actors} te enviaron un mensaje."
@@ -723,6 +734,29 @@ es-AR:
confirm_email:
click_link: "Para activar tu nueva dirección de correo %{unconfirmed_email}, por favor seguí este enlace::"
subject: "Por favor, activá tu nueva dirección de correo %{unconfirmed_email}"
+ csrf_token_fail:
+ body: |-
+ Hola %{name},
+
+ diaspora* detecto un intento de acceso no autorizado a tu cuenta. Puede ser totalmente inocente, pero también podría  ser un ataque (CSRF). Para evitar cualquier posibilidad de que tus datos sean robados, cerramos tu sesión.
+
+ Una solicitud hecha con token CSRF vacío o invalido, pude suceder por:
+
+ -Un complemento del navegador que manipula la solicitud o que las hace sin el token;
+ -Una pestaña del navegador abierta con una sesión anterior a la actual;
+ -Otro sitio web haciendo peticiones, con o sin tu permiso;
+ -Varias aplicaciones externas;
+ -Algún código malicioso intentando acceder tus datos.
+
+ Para más información sobre CSRF revisá [%{link}](%{link}).
+
+ No te preocupes, ya mismo podés iniciar sesión de manera segura.
+
+ Si ves este mensaje muy a menudo, por favor verifica los puntos nombrados anteriormente, incluyendo los complementos de tu navegador.
+
+ Gracias,
+ El robot de correos de diaspora*
+ subject: "Recibimos una solicitud no autorizada desde tu cuenta, %{name}"
email_sent_by_diaspora: "Este correo electrónico fue enviado por %{pod_name}. Si quieres dejar de recibir correos como este,"
export_email:
body: |-
@@ -794,6 +828,9 @@ es-AR:
mentioned:
limited_post: "Se te mencionó en una publicación privada."
subject: "%{name} te mencionó en diaspora*"
+ mentioned_in_comment:
+ limited_post: "Fuiste mencionado en un comentario de una publicación limitada."
+ reply: "Contestar o ver esta conversación >"
private_message:
reply_to_or_view: "Responder o ver esta conversación >"
subject: "Tienes un nuevo mensaje privado en diaspora*"
@@ -880,14 +917,8 @@ es-AR:
type_error: "Error subiendo la foto. ¿Estás seguro que agregaste una imagen?"
destroy:
notice: "La foto fue eliminada."
- new_photo:
- empty: "{file} está vacío, por favor seleccioná archivos sin él."
- invalid_ext: "{file} tiene una extensión incorrecta. Sólo se permiten {extensions}."
- size_error: "{file} es demasiado grande, el tamaño máximo de archivo es {sizeLimit}."
new_profile_photo:
upload: "¡Subir una nueva foto de perfil!"
- show:
- show_original_post: "Mostrar la publicación original"
polls:
votes:
one: "%{count} voto hasta ahora"
@@ -974,8 +1005,14 @@ es-AR:
destroyed: "La publicación ha sido eliminada"
failed: "Algo salió mal"
title: "Resumen de reportes"
+ unreviewed_reports:
+ one: "Hay un reporte sin revisar."
+ other: "Hay %{count} reportes sin revisar."
+ zero: "No hay reportes sin revisar."
reshares:
comment_email_subject: "%{resharer} compartió una publicación de %{author}"
+ create:
+ error: "¡Error al compartir!"
reshare:
deleted: "La publicación original fue eliminada por su autor."
reshare_confirmation: "¿Compartir la publicación de %{author}?"
@@ -1017,7 +1054,7 @@ es-AR:
other: "En %{count} aspectos"
zero: "En %{count} aspectos"
invitations:
- by_email: "Vía correo electrónico"
+ by_email: "Invitar a más personas a través de correo electrónico"
invite_your_friends: "Invitá a tus contactos"
invites: "Invitaciones"
share_this: "¡Comparte este enlace a través de correo electrónico, blog o tu red social favorita!"
@@ -1151,6 +1188,7 @@ es-AR:
comment_on_post: "...comentan en una publicación tuya?"
current_password: "Contraseña actual"
current_password_expl: "con la que inicias sesión…"
+ default_post_visibility: "Seleccionado el aspecto por defecto para la publicación"
download_export: "Descargar mi perfil"
download_export_photos: "Descargar mis fotos"
edit_account: "Editar cuenta"
@@ -1162,6 +1200,7 @@ es-AR:
last_exported_at: "(Última actualización en %{timestamp})"
liked: "...a alguien le gusta una publicación tuya?"
mentioned: "...te mencionan en una publicación?"
+ mentioned_in_comment: "te han mencionado en un comentario"
new_password: "Contraseña nueva"
private_message: "...recibís un mensaje privado?"
receive_email_notifications: "¿Recibir notificaciones por correo electrónico cuando..."
diff --git a/config/locales/diaspora/es-CL.yml b/config/locales/diaspora/es-CL.yml
index 5c69fb508..3cd96fdaa 100644
--- a/config/locales/diaspora/es-CL.yml
+++ b/config/locales/diaspora/es-CL.yml
@@ -190,7 +190,6 @@ es-CL:
conversations:
create:
fail: "Mensaje invalido"
- no_contact: "¡Tranquilo, primero tienes que añadir el contacto!"
sent: "Mensaje enviado"
index:
inbox: "Buzón de Entrada"
@@ -369,9 +368,6 @@ es-CL:
tutorials: "tutoriales"
wiki: "Wiki"
invitations:
- a_facebook_user: "Un usuario de Facebook"
- check_token:
- not_found: "Identificación de invitación no encontrada"
create:
empty: "Por favor ingresa al menos una dirección de correo electrónico."
no_more: "No tienes más invitaciones."
@@ -555,14 +551,8 @@ es-CL:
type_error: "Error al subir la foto. ¿Estás seguro que agregaste una imagen?"
destroy:
notice: "Foto eliminada."
- new_photo:
- empty: "{file} está vacío, por favor, seleccione los archivos nuevamente sin éste último"
- invalid_ext: "{file} tiene una extensión no válida. Solo están permitidas {extensions}."
- size_error: "{file} es demasiado grande, el tamaño máximo por archivo es {sizeLimit}."
new_profile_photo:
upload: "¡Sube una nueva foto de perfil!"
- show:
- show_original_post: "Mostrar post original"
posts:
presenter:
title: "Una publicación de %{name}"
diff --git a/config/locales/diaspora/es-CO.yml b/config/locales/diaspora/es-CO.yml
index a2e2c1126..3fb73f80d 100644
--- a/config/locales/diaspora/es-CO.yml
+++ b/config/locales/diaspora/es-CO.yml
@@ -149,9 +149,6 @@ es-CO:
fill_me_out: "Complétame"
find_people: "Encontrar personas o #tags"
invitations:
- a_facebook_user: "Un usuario de Facebook"
- check_token:
- not_found: "No se encontró la identificación de invitación"
create:
no_more: "No tienes más invitaciones."
rejected: "Las siguientes direcciones tuvieron problemas: "
@@ -259,14 +256,8 @@ es-CO:
type_error: "Error al subir la foto. ¿Estás seguro de que agregaste una imagen?"
destroy:
notice: "La foto fue eliminada."
- new_photo:
- empty: "{file} está vacío, por favor omítelo y nuevamente selecciona archivos."
- invalid_ext: "{file} tiene una extensión inválida. Solo se permiten {extensions}."
- size_error: "{file} es demasiado grande, el tamaño máximo de archivo es {sizeLimit}."
new_profile_photo:
upload: "¡Subir una nueva foto de perfil!"
- show:
- show_original_post: "Mostrar publicación original"
privacy: "Privacidad"
profile: "Perfil"
profiles:
diff --git a/config/locales/diaspora/es-MX.yml b/config/locales/diaspora/es-MX.yml
index 3277c4c34..781666478 100644
--- a/config/locales/diaspora/es-MX.yml
+++ b/config/locales/diaspora/es-MX.yml
@@ -189,7 +189,6 @@ es-MX:
conversations:
create:
fail: "Mensaje inválido"
- no_contact: "¡Eh, primero necesitas añadir al contacto!"
sent: "Mensaje enviado"
index:
conversations_inbox: "Conversaciones – Bandeja de entrada"
@@ -391,9 +390,6 @@ es-MX:
tutorials: "tutoriales"
wiki: "wiki"
invitations:
- a_facebook_user: "Un usuario de Facebook"
- check_token:
- not_found: "No se encontró la identificación de invitación"
create:
empty: "Por favor, introduce al menos una dirección de correo electrónico."
no_more: "No tienes más invitaciones."
@@ -557,14 +553,8 @@ es-MX:
type_error: "Error al subir la foto. ¿Estás seguro de que agregaste una imagen?"
destroy:
notice: "La foto fue eliminada."
- new_photo:
- empty: "{file} está vacío, por favor selecciona archivos nuevamente sin este último."
- invalid_ext: "{file} tiene una extensión inválida. Solo se permiten {extensions}."
- size_error: "{file} es demasiado grande, el tamaño máximo de un archivo es de {sizeLimit}."
new_profile_photo:
upload: "¡Subir una nueva foto de perfil!"
- show:
- show_original_post: "Mostrar publicación original"
posts:
presenter:
title: "Una publicación de %{name}"
diff --git a/config/locales/diaspora/es.yml b/config/locales/diaspora/es.yml
index 3409e71e2..b516e2efb 100644
--- a/config/locales/diaspora/es.yml
+++ b/config/locales/diaspora/es.yml
@@ -254,6 +254,8 @@ es:
post_something: "Publica en Diaspora*"
cancel: "Cancelar"
comments:
+ create:
+ error: "Hubo un error al comentar."
new_comment:
comment: "Comentar"
commenting: "Comentando..."
@@ -278,7 +280,6 @@ es:
conversations:
create:
fail: "Mensaje no válido"
- no_contact: "¡Eh, primero tienes que añadir al contacto!"
sent: "Mensaje enviado"
destroy:
delete_success: "Conversación correctamente borrada"
@@ -287,6 +288,7 @@ es:
conversations_inbox: "Conversaciones – Bandeja de entrada"
inbox: "Bandeja de entrada"
new_conversation: "Nueva conversación"
+ no_contacts: "Necesitas añadir algunos contactos antes de empezar una conversación"
no_messages: "Ningún mensaje"
new:
message: "Mensaje"
@@ -544,7 +546,6 @@ es:
own_your_data: "Sé el dueño de tus datos"
own_your_data_info: "Muchas redes usan tus datos para hacer dinero analizando tus interacciones y usando esa información para mostrarte anuncios. diaspora* no usa tus datos para ningún propósito distinto que permitirte estar en contacto con otros."
podmin:
- admin_panel: "panel de administración"
byline: "Estas a punto de cambiar internet. Vamos a configurarlo, ¿de acuerdo?"
configuration_info: "Abre %{database_path} y %{diaspora_path} en tu editor de texto favorito y revisalos cuidadosamente, están comentados al detalle."
configure_your_pod: "Configura tu pod"
@@ -566,10 +567,8 @@ es:
invitation_codes:
not_valid: "Ese código de invitación ya no es válido"
invitations:
- a_facebook_user: "Un usuario de Facebook"
- check_token:
- not_found: "Identificación de invitación no encontrada"
create:
+ closed: "Las invitaciones están desactivadas en este pod de diaspora*."
empty: "Por favor, introduce al menos una dirección de correo electrónico."
no_more: "No tienes más invitaciones."
note_already_sent: "Las invitaciones han sido enviadas a: %{emails}"
@@ -841,14 +840,8 @@ es:
type_error: "Error subiendo la foto. ¿Seguro que añadiste la imagen?"
destroy:
notice: "Foto eliminada."
- new_photo:
- empty: "{file} está vacío, por favor selecciona otros archivos."
- invalid_ext: "{file} tiene una extensión inválida. Sólo {extensions} están permitidas."
- size_error: "{file} es demasiado largo, el tamaño máximo por archivo es de {sizeLimit}."
new_profile_photo:
upload: "¡Sube una foto nueva de perfil!"
- show:
- show_original_post: "Mostrar la publicación original"
polls:
votes:
one: "%{count} voto por ahora"
diff --git a/config/locales/diaspora/eu.yml b/config/locales/diaspora/eu.yml
index a86e80cb7..32f04555b 100644
--- a/config/locales/diaspora/eu.yml
+++ b/config/locales/diaspora/eu.yml
@@ -206,9 +206,6 @@ eu:
fill_me_out: "Bete nazazu"
find_people: "Jendea edo #etiketak aurkitu"
invitations:
- a_facebook_user: "Facebook erabiltzaile bat"
- check_token:
- not_found: "Gonbidapena ez da aurkitu"
create:
no_more: "Ez daukazu gonbidapen gehiago."
rejected: "Hurrengo e-posta hauek arazoak sortu dituzte:"
@@ -404,14 +401,8 @@ eu:
type_error: "Argazki igoerak huts egin du. Ziur al zaude irudia gehitu duzunaz?"
destroy:
notice: "Argazkia ezabatu duzu."
- new_photo:
- empty: "{file} hutsik dago, mesedez aukera itzazu fitxategiak hura kenduta."
- invalid_ext: "{file}(r)en luzapena ez da onartu. {extensions} dira onartuak soilik."
- size_error: "{file} pisutsuegia da, fitxategi baten gehiengo pisua {sizeLimit} da."
new_profile_photo:
upload: "Igo ezazu profil argazki berri bat!"
- show:
- show_original_post: "Jatorrizko mezua erakutsi"
posts:
presenter:
title: ""
diff --git a/config/locales/diaspora/fi.yml b/config/locales/diaspora/fi.yml
index 267982531..daf10767a 100644
--- a/config/locales/diaspora/fi.yml
+++ b/config/locales/diaspora/fi.yml
@@ -229,7 +229,6 @@ fi:
conversations:
create:
fail: "Virheellinen viesti"
- no_contact: "Hei, sinun on ensin lisättävä vastaanottaja!"
sent: "Viesti lähetetty"
destroy:
delete_success: "Keskustelun poistaminen onnistui"
@@ -483,9 +482,6 @@ fi:
invitation_codes:
not_valid: "Kutsukoodi ei ole enää voimassa"
invitations:
- a_facebook_user: "Facebook-käyttäjä"
- check_token:
- not_found: "Kutsun tunnusta ei löytynyt"
create:
empty: "Ole hyvä kirjoita vähintään yksi sähköpostiosoite."
no_more: "Sinulla ei ole enempää kutsuja."
@@ -756,14 +752,8 @@ fi:
type_error: "Kuvan lataus epäonnistui. Lisäsitkö varmasti kuvan?"
destroy:
notice: "Kuva poistettu."
- new_photo:
- empty: "{file} on tyhjä, valitse tiedostot uudelleen ilman kyseistä tiedostoa."
- invalid_ext: "{file} sisältää viallisen tiedostopäätteen. Tuetut muodot ovat {extensions}."
- size_error: "{file} on liian suuri, suurin tiedostokoko on {sizeLimit}."
new_profile_photo:
upload: "Lisää uusi profiilikuva!"
- show:
- show_original_post: "Näytä alkuperäinen julkaisu"
posts:
presenter:
title: "Julkaisu käyttäjältä %{name}"
diff --git a/config/locales/diaspora/fr.yml b/config/locales/diaspora/fr.yml
index 137627b4f..bcb816a69 100644
--- a/config/locales/diaspora/fr.yml
+++ b/config/locales/diaspora/fr.yml
@@ -10,7 +10,7 @@ fr:
_help: "Aide"
_services: "Services"
_statistics: "Statistiques"
- _terms: "conditions d'utilisation"
+ _terms: "Conditions d'utilisation"
account: "Compte"
activerecord:
errors:
@@ -238,7 +238,7 @@ fr:
new_here:
follow: "Suivez %{link} et souhaitez la bienvenue aux nouveaux utilisateurs de diaspora* !"
learn_more: "En savoir plus"
- title: "Accueillir les nouveaux venus"
+ title: "Accueillir les nouveaux"
services:
content: "Vous pouvez connecter les services suivants à diaspora* :"
heading: "Connecter des services"
@@ -270,6 +270,8 @@ fr:
post_something: "Publiez sur diaspora*"
cancel: "Annuler"
comments:
+ create:
+ error: "Impossible de commenter."
new_comment:
comment: "Commenter"
commenting: "Commentaire en cours d'envoi..."
@@ -294,7 +296,6 @@ fr:
conversations:
create:
fail: "Message invalide"
- no_contact: "Hé, vous avez besoin d'ajouter le contact d'abord !"
sent: "Message envoyé"
destroy:
delete_success: "Conversation effacée avec succès"
@@ -303,6 +304,7 @@ fr:
conversations_inbox: "Discussions - Boîte de réception"
inbox: "Boîte de réception"
new_conversation: "Nouvelle discussion"
+ no_contacts: "Vous devez ajouter des contacts avant de pouvoir démarrer une conversation."
no_messages: "Aucun message"
new:
message: "Message"
@@ -327,6 +329,7 @@ fr:
delete: "Supprimer"
email: "Courriel"
error_messages:
+ csrf_token_fail: "Le jeton CSRF est invalide. Veuillez vous connecter et réessayer."
helper:
correct_the_following_errors_and_try_again: "Corrigez les erreurs suivantes, puis réessayez."
need_javascript: "Ce site web nécessite JavaScript pour fonctionner correctement. Si vous avez désactivé JavaScript, veuillez le réactiver et actualiser cette page."
@@ -418,7 +421,7 @@ fr:
miscellaneous:
back_to_top_a: "Oui. Après avoir atteint le bas de page, cliquez sur la flèche grise qui apparaît dans le bouton dans le coin à droite de votre fenêtre de navigation."
back_to_top_q: "Il y a t-il un moyen de rapidement revenir en haut d'une page après avoir atteint le bas de celle-ci ?"
- diaspora_app_a: "Il y a quelques applications Android encore dans les toutes premières phases de développement. Plusieurs sont des projets abandonnés depuis un peu de temps et ne marchent donc pas bien avec la version actuelle de diaspora*. N'en attendez pas trop pour le moment. Actuellement, la meilleure façon accéder à diaspora* à partir d'un téléphone portable est à travers un navigateur web car nous avons créé une version mobile du site qui devrait fonctionner correctement sur tous les appareils. Il n'y a pour l'instant aucune application pour iOS. Encore une fois, diaspora* devrait marcher correctement via votre navigateur web."
+ diaspora_app_a: "Il y a quelques applications Android encore dans les toutes premières phases de développement. Plusieurs sont des projets abandonnés depuis un peu de temps et ne marchent donc pas bien avec la version actuelle de diaspora*. N'en attendez pas trop pour le moment. Actuellement, la meilleure façon pour accéder à diaspora* à partir d'un téléphone portable est à travers un navigateur web car nous avons créé une version mobile du site qui devrait fonctionner correctement sur tous les appareils. Il n'y a pour l'instant aucune application pour iOS. Encore une fois, diaspora* devrait marcher correctement via votre navigateur web."
diaspora_app_q: "Existe t-il une application diaspora* pour Android ou iOS ?"
photo_albums_a: "Non, pas actuellement. Cependant vous pouvez voir l'ensemble des images d'un utilisateur à partir de la section Photos de la barre latérale de son profil."
photo_albums_q: "Il y a t-il des albums photos ou vidéos ?"
@@ -438,7 +441,7 @@ fr:
char_limit_services_q: "Quelle est la limite de caractères pour les messages partagés avec un service connecté qui a une limite de caractères plus petite ?"
character_limit_a: "65,535 caractères. C'est 65,395 caractères de plus que Twitter ! ;)"
character_limit_q: "Quelle est la limite de caractères pour un message ?"
- embed_multimedia_a: "Vous pouvez généralement juste coller l'URL (p. ex. : http://www.youtube.com/watch?v=nnnnnnnnnnn) au sein de votre message et la vidéo ou le contenu audio sera intégré automatiquement. Parmi les supportés, on trouve : Youtube, Vimeo, SoundCloud, Flickr et quelques autres. Diaspora* utilise oEmbed pour cette fonctionnalité. Nous ajoutons constamment le support de nouveaux sites. Souvenez-vous de toujours publier des liens complets et simples : pas de lien raccourci, pas d'opérateur après l'URL de base, et laissez passer un peu de temps avant de rafraîchir la page après avoir publié un message pour voir l'aperçu."
+ embed_multimedia_a: "Vous pouvez généralement juste coller l'URL (p. ex. : http://www.youtube.com/watch?v=nnnnnnnnnnn) au sein de votre message et la vidéo ou le contenu audio sera intégré automatiquement. Les sites supportés sont, entre autres : Youtube, Vimeo, SoundCloud et Flickr. Diaspora* utilise oEmbed pour cette fonctionnalité. De nouveaux sites sont régulièrements ajoutés. Publiez toujours des liens complets et simples : pas de lien raccourci, pas d'opérateur après l'URL de base, et attendez un peu avant de rafraîchir la page pour voir l'aperçu."
embed_multimedia_q: "Comment puis-je intégrer une vidéo, de l'audio, ou tout autre contenu multimédia dans un message ?"
format_text_a: "En utilisant un système simplifié appelé %{markdown}. Vous pouvez trouver la syntaxe complète de Markdown %{here}. Le bouton de prévisualisation est vraiment pratique car vous pourrez voir à quoi votre message va ressembler avant de le publier."
format_text_q: "Comment puis-je formater le texte de mes messages (gras, italique, etc.) ?"
@@ -562,7 +565,6 @@ fr:
own_your_data: "Soyez propriétaire de vos données"
own_your_data_info: "De nombreux réseaux utilisent vos données pour gagner de l'argent en analysant vos interactions et en utilisant ces informations pour vous proposer des publicités ciblées. Vos données sur diaspora* ne servent qu'à vous mettre en relation et à partager avec d'autres personnes."
podmin:
- admin_panel: "panneau d'administrateur"
byline: "Vous êtes sur le point de changer la face d'Internet. Prêt à vous lancer ?"
configuration_info: "Ouvrez %{database_path} et %{diaspora_path} dans votre éditeur de texte favori et relisez-les soigneusement, ils sont abondamment commentés."
configure_your_pod: "Configurez votre pod"
@@ -582,12 +584,11 @@ fr:
update_your_pod: "Maintenez votre pod à jour"
update_your_pod_info: "Vous trouverez %{update_instructions}."
invitation_codes:
+ already_logged_in: "Vous avez été invité par %{inviter} pour rejoindre ce pod mais vous êtes déjà connecté."
not_valid: "Ce code d'invitation n'est plus valide."
invitations:
- a_facebook_user: "Un utilisateur de Facebook"
- check_token:
- not_found: "Jeton d'invitation introuvable"
create:
+ closed: "Les invitations sont fermées sur ce pod diaspora*."
empty: "Veuillez fournir au moins une adresse de courrier électronique."
no_more: "Vous n’avez plus d’invitation."
note_already_sent: "Une invitation a déjà été envoyée aux e-mails %{emails}"
@@ -620,6 +621,9 @@ fr:
profile: "Profil"
settings: "Paramètres"
toggle_navigation: "Afficher/cacher le menu"
+ likes:
+ create:
+ error: "Impossible d'aimer."
limited: "Limité"
more: "Plus"
no_results: "Aucun résultat trouvé"
@@ -629,9 +633,9 @@ fr:
other: "%{actors} ont également commenté sur le message %{post_link} de %{post_author}."
zero: "%{actors} a également commenté sur le message %{post_link} de %{post_author}."
also_commented_deleted:
- one: "%{actors} a commenté votre message supprimé."
- other: "%{actors} ont commenté votre message supprimé."
- zero: "%{actors} a commenté votre message supprimé."
+ one: "%{actors} a commenté un message supprimé."
+ other: "%{actors} ont commenté un message supprimé."
+ zero: "%{actors} a commenté un message supprimé."
comment_on_post:
one: "%{actors} a commenté votre message %{post_link}."
other: "%{actors} ont commenté votre message %{post_link}."
@@ -654,6 +658,7 @@ fr:
mark_read: "Marquer comme lu"
mark_unread: "Marquer comme non lu"
mentioned: "Vous mentionnant"
+ mentioned_in_comment: "Vous mentionnant dans un commentaire"
no_notifications: "Vous n'avez pas encore de notifications."
notifications: "Notifications"
reshared: "Repartagé"
@@ -673,9 +678,15 @@ fr:
other: "%{actors} vous ont mentionné(e) dans le message %{post_link}."
zero: "%{actors} ne vous a mentionné(e) dans le message %{post_link}."
mentioned_deleted:
- one: "%{actors} vous a mentionné-e dans un message supprimé."
- other: "%{actors} vous ont mentionné-e dans un message supprimé."
- zero: "%{actors} a ont mentionné-e dans un message supprimé."
+ one: "%{actors} vous a mentionné dans un message supprimé."
+ other: "%{actors} vous ont mentionné dans un message supprimé."
+ zero: "Personne ne vous a mentionné dans un message supprimé."
+ mentioned_in_comment:
+ one: "%{actors} vous a mentionné dans un <a href=%{comment_path}>commentaire</a> sur le message %{post_link}."
+ other: "%{actors} vous ont mentionné dans un <a href=%{comment_path}>commentaire</a> sur le message %{post_link}."
+ mentioned_in_comment_deleted:
+ one: "%{actors} vous a mentionné sur un commentaire supprimé."
+ other: "%{actors} vous ont mentionné sur un commentaire supprimé."
post: "message"
private_message:
one: "%{actors} vous a envoyé un message."
@@ -706,6 +717,29 @@ fr:
confirm_email:
click_link: "Pour activer votre nouvelle adresse électronique %{unconfirmed_email}, merci de suivre ce lien :"
subject: "Merci d'activer votre nouvelle adresse électronique %{unconfirmed_email}"
+ csrf_token_fail:
+ body: |-
+ Bonjour %{name},
+
+ diaspora* a détecté une tentative d'accès à votre session qui pourrait ne pas être autorisée. Cela est probablement tout à fait anodin, mais peut éventuellement être une attaque cross-site request forgery (CSRF). Pour éviter tout risque que vos données soient compromises, vous avez été déconnecté.
+
+ Une requête faite en utilisant un jeton CSRF incorrect ou manquant peut être due à :
+
+ - une extension manipulant la requête ou créant des requêtes sans le jeton
+ - un ancien onglet resté ouvert
+ - un autre site web faisant des requêtes avec ou sans votre permission
+ - divers autres outils externes
+ - du code malveillant essayant d'accéder à vos données
+
+ Pour plus d'information sur le CSRF, voir [%{link}](%{link}).
+
+ Ne vous inquiétez pas; vous pouvez vous reconnecter maintenant.
+
+ Si vous voyez ce message à plusieurs reprises, merci de vérifier les points ci-dessus, y compris les extensions du navigateur.
+
+ Merci.
+ Le messager automatique de diaspora* !
+ subject: "Nous avons reçu une demande non autorisée de votre compte, %{name}"
email_sent_by_diaspora: "Ce courriel a été envoyé par %{pod_name}. Si vous ne souhaitez plus recevoir des courriels de ce genre,"
export_email:
body: |-
@@ -778,6 +812,9 @@ fr:
mentioned:
limited_post: "Vous avez été mentionné dans une publication restreinte."
subject: "%{name} vous a mentionné(e) sur diaspora*"
+ mentioned_in_comment:
+ limited_post: "Vous avez été mentionné dans un commentaire sur une publication restreinte."
+ reply: "Répondre ou voir cette conversation >"
private_message:
reply_to_or_view: "Répondre ou voir cette conversation >"
subject: "Vous avez un nouveau message privé"
@@ -862,14 +899,8 @@ fr:
type_error: "L'envoi de la photo a échoué. Vérifiez qu'une photo a bien été ajoutée ?"
destroy:
notice: "La photo a été supprimée."
- new_photo:
- empty: "{file} est vide, merci de sélectionner d'autres fichiers."
- invalid_ext: "{file} a une extension invalide. Seules {extensions} sont autorisées."
- size_error: "{file} est trop grand, la taille maximum pour un fichier est {sizeLimit}."
new_profile_photo:
upload: "Mettre une nouvelle photo de profil !"
- show:
- show_original_post: "Montrer le message original"
polls:
votes:
one: "%{count} vote pour l'instant"
@@ -953,8 +984,14 @@ fr:
destroyed: "Le message a été détruit"
failed: "Il y a eu un problème."
title: "Vue d'ensemble des signalements."
+ unreviewed_reports:
+ one: "Il y a %{count} signalement non vérifié."
+ other: "Il y a %{count} signalements non vérifiés."
+ zero: "Il n'y a aucun signalement non vérifié."
reshares:
comment_email_subject: "Partage par %{resharer} d'un message de %{author}"
+ create:
+ error: "Le repartage a échoué."
reshare:
deleted: "Le message original a été supprimé par l'auteur."
reshare_confirmation: "Repartager le message de %{author} ?"
@@ -978,7 +1015,7 @@ fr:
no_services_available: "Il n'y a aucun service disponible sur ce pod."
not_logged_in: "Vous n'êtes pas connecté actuellement."
really_disconnect: "Déconnecter %{service} ?"
- services_explanation: "Se connecter à des services vous donne la possibilité d'y publier vos messages depuis diaspora*."
+ services_explanation: "Se connecter à des services tiers vous donne la possibilité d'y publier vos messages depuis diaspora*."
share_to: "Partager avec %{provider}"
title: "Gérer les services connectés"
provider:
@@ -1107,9 +1144,9 @@ fr:
destroy:
no_password: "Veuillez introduire votre mot de passe actuel pour fermer votre compte."
success: "Votre compte est verrouillé. Cela peut nous prendre jusqu'à vingt minutes pour finaliser sa fermeture. Merci d'avoir essayé diaspora*."
- wrong_password: "Le mot de passe saisi ne correspond pas à votre mot de passe actuel."
+ wrong_password: "Le mot de passe saisi ne correspond pas à votre mot de passe actuel."
edit:
- also_commented: "quelqu'un commente un message que vous avez déjà commenté."
+ also_commented: "…quelqu'un commente un message que vous avez déjà commenté."
auto_follow_aspect: "Aspect pour les utilisateurs que vous suivez automatiquement :"
auto_follow_back: "Suivre automatiquement en retour ceux qui vous suivent"
change: "Modifier"
@@ -1120,7 +1157,7 @@ fr:
character_minimum_expl: "doit comporter au moins six caractères"
close_account:
dont_go: "Hé, s'il vous plaît, ne partez pas !"
- lock_username: "Votre nom d'utilisateur sera bloqué. Vous ne pourrez pas créer un nouveau compte sur ce pod avec le même identifiant."
+ lock_username: "Votre nom d'utilisateur sera bloqué. Vous ne pourrez pas créer un nouveau compte sur ce pod avec le même nom."
locked_out: "Vous serez déconnecté et votre compte sera inaccessible jusqu'à sa suppression."
make_diaspora_better: "Nous aimerions beaucoup que vous restiez pour nous aider à améliorer diaspora* plutôt que de nous quitter. Toutefois, si c'est vraiment ce que vous souhaitez, voilà ce qui va se passer :"
mr_wiggles: "Mr Wiggles sera triste de vous voir partir."
@@ -1130,6 +1167,7 @@ fr:
comment_on_post: "…quelqu'un commente un de vos messages."
current_password: "Mot de passe actuel"
current_password_expl: "Celui avec lequel vous vous connectez ..."
+ default_post_visibility: "Aspects sélectionnés par défaut pour la publication"
download_export: "Télécharger mon profil"
download_export_photos: "Télécharger mes photos"
edit_account: "Modifier le compte"
@@ -1141,6 +1179,7 @@ fr:
last_exported_at: "(Dernière mise à jour à %{timestamp})"
liked: "…quelqu'un a aimé votre message."
mentioned: "…l'on vous mentionne dans un message."
+ mentioned_in_comment: "…vous êtes mentionné dans un commentaire"
new_password: "Nouveau mot de passe"
private_message: "…vous recevez un message privé."
receive_email_notifications: "Recevoir des notifications par courrier électronique lorsque…"
@@ -1151,7 +1190,7 @@ fr:
reshared: "…quelqu'un a repartagé votre message."
show_community_spotlight: "Afficher les actualités de la communauté dans votre flux"
show_getting_started: "Montrer les astuces de découverte"
- someone_reported: "Quelqu'un a signalé un message"
+ someone_reported: "…quelqu'un a signalé un message"
started_sharing: "…quelqu'un commence à partager avec vous."
stream_preferences: "Préférences du flux"
your_email: "Votre adresse électronique"
diff --git a/config/locales/diaspora/fy.yml b/config/locales/diaspora/fy.yml
index bd41dd905..d7fedb053 100644
--- a/config/locales/diaspora/fy.yml
+++ b/config/locales/diaspora/fy.yml
@@ -59,7 +59,6 @@ fy:
email: "E-mail"
find_people: "Minsken of #labels Sykje"
invitations:
- a_facebook_user: "In Facebook brûker"
new:
invite_someone_to_join: "Immen útnoadigje foar Diaspora!"
language: "Taal"
diff --git a/config/locales/diaspora/ga.yml b/config/locales/diaspora/ga.yml
index 175a66f7d..9bee9613e 100644
--- a/config/locales/diaspora/ga.yml
+++ b/config/locales/diaspora/ga.yml
@@ -66,7 +66,6 @@ ga:
email: "Ríomhphoist"
fill_me_out: "Líon amach"
invitations:
- a_facebook_user: "Úsáideoir Facebook"
new:
language: "Teanga"
layouts:
diff --git a/config/locales/diaspora/he.yml b/config/locales/diaspora/he.yml
index dbb57ea34..d8f40e64c 100644
--- a/config/locales/diaspora/he.yml
+++ b/config/locales/diaspora/he.yml
@@ -199,7 +199,6 @@ he:
conversations:
create:
fail: "הודעה שגויה"
- no_contact: "הי, יש להוסיף את איש הקשר קודם!"
sent: "ההודעה נשלחה"
index:
conversations_inbox: "שיחות - דואר נכנס"
@@ -264,9 +263,6 @@ he:
tutorials: "מדריכים"
wiki: "ויקי"
invitations:
- a_facebook_user: "משתמש פייסבוק"
- check_token:
- not_found: "אסימון ההזמנה לא נמצא"
create:
empty: "נא להזין לפחות כתובת דוא\"ל אחת."
no_more: "אין לך עוד הזמנות."
@@ -438,14 +434,8 @@ he:
type_error: "העלאת התמונה נכשלה. האם תמונה אכן נוספה?"
destroy:
notice: "התמונה נמחקה."
- new_photo:
- empty: "הקובץ {file} ריק, נא לבחור קבצים בשנית בלעדיו"
- invalid_ext: "לקובץ {file} יש סיומת לא חוקית. רק הסיומות הבאות מאופשרות: {extensions}."
- size_error: "הקובץ {file} גדול מדי. הגודל המירבי הוא {sizeLimit}."
new_profile_photo:
upload: "העלאת תמונת פרופיל חדשה"
- show:
- show_original_post: "הצגת ההודעה המקורית"
posts:
presenter:
title: "הודעה מאת %{name}"
diff --git a/config/locales/diaspora/hu.yml b/config/locales/diaspora/hu.yml
index 5d45caf8f..d782f3f88 100644
--- a/config/locales/diaspora/hu.yml
+++ b/config/locales/diaspora/hu.yml
@@ -9,6 +9,8 @@ hu:
_contacts: "Ismerősök"
_help: "Súgó"
_services: "Szolgáltatások"
+ _statistics: "Statisztika"
+ _terms: "feltételek"
account: "Felhasználói fiók"
activerecord:
errors:
@@ -49,11 +51,16 @@ hu:
admins:
admin_bar:
pages: "Oldalak"
- pod_stats: "Kiszolgáló statisztika"
+ pod_network: "Pod hálózat"
+ pod_stats: "Pod statisztika"
report: "Jelentések"
sidekiq_monitor: "Sidekiq monitor"
user_search: "Felhasználó keresés"
- weekly_user_stats: "Heti statisztika"
+ weekly_user_stats: "Heti felhasználóstatisztika"
+ dashboard:
+ pod_status: "Pod állapot"
+ pods:
+ pod_network: "Pod hálózat"
stats:
2weeks: "2 hét"
50_most: "50 legnépszerűbb címke"
@@ -89,9 +96,13 @@ hu:
account_closing_scheduled: "%{name} felhasználó fiókjának törlése időzítve. Feldolgozása néhány pillanat múlva megtörténik..."
add_invites: "meghívók hozzáadása"
are_you_sure: "Biztosan törölni szeretnéd ezt a fiókot?"
+ are_you_sure_lock_account: "Biztosan zárolni akarod ezt a fiókot?"
+ are_you_sure_unlock_account: "Biztosan fel akarod oldani a fiók zárolását?"
close_account: "fiók törlése"
email_to: "a meghívandó személy email címe"
+ lock_account: "Fiók zárolása"
under_13: "13 éven aluli felhasználók mutatása (az USA COPPA szabályzata szerint)"
+ unlock_account: "Fiók zárolásának feloldása"
users:
other: "%{count} felhasználó található"
zero: "nem található felhasználó"
@@ -105,13 +116,23 @@ hu:
zero: "az új felhasználók száma ezen a héten: %{count}"
current_server: "A jelenlegi szerverdátum: %{date}"
all_aspects: "Összes csoport"
+ api:
+ openid_connect:
+ authorizations:
+ new:
+ approve: "Elfogadás"
+ deny: "Megtagadás"
+ user_applications:
+ index:
+ edit_applications: "Alkalmazások"
are_you_sure: "Biztos vagy benne?"
are_you_sure_delete_account: "Biztos, hogy törölni akarod a fiókodat? A törlés nem vonható vissza!"
aspect_memberships:
destroy:
- failure: "Személy törlése a csoportból sikertelen"
- no_membership: "Nem található a személy ebben a csoportban"
- success: "Sikeresen törölted a személyt a csoportból"
+ failure: "Személy törlése a csoportból sikertelen."
+ forbidden: "Ezt nincs jogosultságod megtenni."
+ no_membership: "Nem található a kiválasztott személy ebben a csoportban."
+ success: "Sikeresen törölted a személyt a csoportból."
aspects:
add_to_aspect:
failure: "A kapcsolatot nem sikerült felvenni a csoportba."
@@ -123,7 +144,7 @@ hu:
stay_updated: "Légy naprakész!"
stay_updated_explanation: "A Hírfolyamodban megjelennek az ismerőseid bejegyzései, követett címkéid és a Reflektorfényben szereplő személyek bejegyzései."
destroy:
- failure: "%{name} nem üres, így nem lehet törölni."
+ failure: "%{name} nem törölhető."
success: "%{name} csoport sikeresen törölve."
edit:
aspect_list_is_not_visible: "csoportlista rejtett a csoporttagok számára"
@@ -157,10 +178,11 @@ hu:
title: "Sziasztok új felhasználók"
services:
content: "A következő szolgáltatásokhoz tudsz kapcsolódni:"
- heading: "Szolgáltatások összekapcsolása"
+ heading: "Közösségi hálók összekapcsolása"
welcome_to_diaspora: "Üdv a diaspora* közösségi oldalon, %{name}!"
no_contacts_message:
community_spotlight: "a figyelem középpontjában"
+ invite_link_text: "meghívás"
or_spotlight: "Vagy körülnézhetsz a kiemelt tagok között is, lásd: %{link}"
try_adding_some_more_contacts: "Ismerősöket kereshetsz vagy hívhatsz meg."
you_should_add_some_more_contacts: "Adj hozzá még néhány ismerőst."
@@ -207,22 +229,23 @@ hu:
conversations:
create:
fail: "Érvénytelen üzenet"
- no_contact: "Hé, először kapcsolatot kell hozzáadnod!"
sent: "Üzenet elküldve"
index:
conversations_inbox: "Beszélgetések - levelesláda"
inbox: "Bejövő"
new_conversation: "Új beszélgetés"
- no_messages: "nincs üzenet"
+ no_messages: "Nincs üzenet"
new:
+ message: "Üzenet"
send: "Küldés"
sending: "Küldés ..."
subject: "tárgy"
+ subject_default: "Nincs tárgy"
to: "címzett"
new_conversation:
fail: "Érvénytelen üzenet"
show:
- delete: "beszélgetés törlése"
+ delete: "Beszélgetés törlése"
reply: "válasz"
replying: "Válaszolás..."
date:
@@ -257,27 +280,36 @@ hu:
remove_notification_a: "Nem."
remove_notification_q: "Ha valakit eltávolítok egy csoportból, vagy az összes csoportomból, kap róla értesítést?"
rename_aspect_a: "Igen. A csoportjaid listáját a kezdőképernyő bal oldalán éred el. Mozgasd az egérmutatót az átnevezendő csoport fölé. Kattints az ekkor megjelenő ceruza (szerkesztés) ikonra. A felugró ablakban válaszd az átnevezés lehetőséget."
- rename_aspect_q: "Átnevezhetem a csoportokat?"
+ rename_aspect_q: "Hogyan nevezek át egy csoportot?"
restrict_posts_i_see_a: "Igen. Kattints a \"csoportjaim\" feliratra a bal oldalsávon és válaszd ki azokat a csoportokat, amelyeket megjeleníteni vagy elrejteni szeretnél. Csak a kijelölt csoportokhoz tartozó személyek bejegyzései fognak látszódni a hírfolyamodban."
restrict_posts_i_see_q: "Korlátozhatom a megjelenítendő bejegyzéseket csak bizonyos csoportokból származóakra?"
title: "Csoportok"
what_is_an_aspect_a: "A csoport (vagy eredetileg \"aspektus\") az a mód, ahogy a kapcsolataidat rendszerezed a diaspora-n. Különböző arcaidat, oldalaidat különbözőképpen mutathatod meg például a munkatársaid, a családod, netán meghatározott közösséghez tartozó barátaid számára."
what_is_an_aspect_q: "Mit jelent a \"csoport\"?"
who_sees_post_q: "Amikor bejegyzést írok egy csoportba, ki láthatja azt?"
- foundation_website: "a diaspora* alapítvány honlapja"
+ chat:
+ add_contact_roster_q: "Hogyan tudok csevegni valakivel a diasporán*?"
+ title: "Csevegés"
+ faq: "GYIK"
+ foundation_website: "diaspora* alapítvány"
getting_help:
+ get_support_a_faq: "tekintsd meg %{faq} oldalunkat"
get_support_a_hashtag: "kérdezz magyarul a közösségi hálón, nyilvános bejegyzésben a %{question} címke használatával"
- get_support_a_irc: "Kapcsolódj %{irc}-en (élő csevegés)"
- get_support_a_tutorials: "nézd meg az általunk készített %{tutorials}at"
+ get_support_a_irc: "kapcsolódj be %{irc}-en az élő csevegésbe"
+ get_support_a_tutorials: "nézd át az általunk készített %{tutorials}at"
get_support_a_website: "látogasd meg a %{link} honlapját"
get_support_a_wiki: "kutass a %{link} adattárunkban"
get_support_q: "Mit tegyek, ha a kérdésemre itt nem találok választ? Hol kaphatok még felvilágosítást?"
- getting_started_a: "Szerencséd van. Tekintsd át a %{tutorial_series} című angol nyelvű bemutató oldalunkat. Lépésről lépésre végigvezet a feliratkozási eljáráson és megtanítja mindazokat az alapvető dolgokat, amiket tudnod kell a Diaspora* használatához."
+ getting_started_a: "Szerencséd van. %{tutorial_series} nevű bemutató oldalunk lépésről lépésre végigvezet téged a regisztrációs eljáráson és megismerteti a diaspora* használatához szükséges alapvető tudnivalókat."
getting_started_q: "Húha! A kezdéshez elkélne némi alapvető segítség!"
title: "Források a tájékozódáshoz"
getting_started_tutorial: "'Kezdő lépések'"
here: "itt"
irc: "IRC"
+ keyboard_shortcuts:
+ keyboard_shortcuts_a1: "A hírfolyam nézetben a következő billentyűparancsok állnak rendelkezésedre:"
+ keyboard_shortcuts_q: "Milyen billentyűparancsokat használhatok?"
+ title: "Billentyűparancsok"
markdown: "markdown"
mentions:
how_to_mention_a: "Írj le egy \"@\" jelet és kezdd el gépelni az illető nevét. Egy legördülő menü fog megjelenni annak érdekében, hogy könnyebben választhass. Fontos, hogy csak azokat az embereket tudod megemlíteni, akiket hozzáadtál valamely csoporthoz."
@@ -291,12 +323,15 @@ hu:
miscellaneous:
back_to_top_a: "Igen. Miután legörgeted az oldalt, kattints a böngészőablak jobb alsó sarkában megjelenő szürke nyílra."
back_to_top_q: "Van gyors módja annak, hogy visszajussak az oldal elejére miután lejjebb görgettem?"
- diaspora_app_a: "Számos Android alkalmazás van a korai fejlesztés állapotában. Ezek közül többen régóta magára hagyott projektek, így nem működnek jól a Diaspora legújabb változatával. Ne várj túl sokat ezektől az alkalmazásoktól jelenleg. Pillanatnyilag a Diaspora-hoz való hozzáférés legjobb módja, ha a mobil böngésződön keresztül próbálsz csatlakozni, mivel erre optimalizáltuk a rendszert. Aktuálisan nincs iOS alkalmazásunk. Röviden szólva: a Diaspora legjobban a böngésződön keresztül fog működni."
+ diaspora_app_a: "Számos Android alkalmazás van a korai fejlesztés állapotában. Ezek közül többen régóta magára hagyott projektek, így nem működnek jól a diaspora* legújabb változatával. Ne várj túl sokat ezektől az alkalmazásoktól. Pillanatnyilag a diaspora*-hoz való hozzáférés legjobb módja, ha a mobil böngésződön keresztül próbálsz csatlakozni, mivel erre optimalizáltuk a rendszert. Jelenleg nincs iOS alkalmazásunk. Egy szó mint száz: a diaspora* legjobban a böngésződön keresztül működik."
diaspora_app_q: "Létezik Diaspora* alkalmazás Android vagy iOS rendszerre?"
photo_albums_a: "Jelenleg nem. Mindazonáltal a feltöltött képek folyamát megtekintheted az adatlapok oldalsávjának fényképek részlegén."
- photo_albums_q: "Támogatottak a kép- vagy videó gyűjtemények?"
+ photo_albums_q: "Támogatottak a kép- vagy videógyűjtemények?"
subscribe_feed_q: "Feliratkozhatok valakinek a nyilvános bejegyzéseire hírfolyam (RSS) olvasóval?"
title: "Egyebek"
+ pods:
+ title: "Podok"
+ what_is_a_pod_q: "Mit jelent a pod?"
posts_and_posting:
char_limit_services_a: "Ebben az esetben a bejegyzésed legfeljebb annyi leütésből állhat, ahányat az adott szolgáltató engedélyez (ami 140 a Twitter és 1000 a Tumblr esetében). A még felhasználható karakterek számát az adott szolgáltató ikonjánál láthatod. Küldhetsz ennél hosszabb bejegyzéseket is, de akkor a szöveg fennmaradó részét levágják az említett szolgáltatók."
char_limit_services_q: "Legfeljebb hány leütésből állhat a bejegyzésem, ha olyan összekapcsolt szolgáltatáson keresztül küldöm el, ahol csak kevés karakter engedélyezett?"
@@ -308,7 +343,7 @@ hu:
image_text: "kép szövege"
image_url: "kép url"
insert_images_a: "Kattints a kis fényképezőgép jelére, ha képet szeretnél beszúrni a bejegyzésedbe. Nyomd meg az ikont ismételten, ha újabbat is szeretnél hozzáadni. Lehetőséged van több képet is egyszerre kiválasztani."
- insert_images_comments_a1: "A következő markdown kód"
+ insert_images_comments_a1: "Nem tudsz képeket feltölteni hozzászólásokba, de a következő markdown kód"
insert_images_comments_a2: "használható a világhálóról származó képek bejegyzésekbe és hozzászólásokba való beillesztéséhez"
insert_images_comments_q: "Beilleszthetek képeket a hozzászólásaimba?"
insert_images_q: "Hogyan helyezhetek el képeket a bejegyzésemben?"
@@ -370,13 +405,19 @@ hu:
title: "Címkék"
what_are_tags_for_q: "Mire valók a címkék?"
third_party_tools: "külsős fejlesztőeszközök"
+ title_header: "Súgó"
tutorial: "útmutató"
tutorials: "útmutatók"
wiki: "wiki"
+ home:
+ default:
+ be_who_you_want_to_be: "Legyél, aki szeretnél lenni!"
+ be_who_you_want_to_be_info: "Sok közösségi hálózat ragaszkodik ahhoz, hogy a valódi identitásod használd. A diaspora* nem. Itt az lehetsz, aki csak akarsz, és te döntöd el, hogy mennyi információt osztasz meg magadról. Itt tényleg rajtad áll a döntés, hogyan lépsz kapcsolatba másokkal."
+ byline: "Az online közösség, ahol tiéd az irányítás."
+ choose_your_audience: "Válaszd meg közönséged"
+ invitation_codes:
+ not_valid: "Ez a meghívó kód már nem érvényes"
invitations:
- a_facebook_user: "Egy Facebook felhazsnáló"
- check_token:
- not_found: "Meghívó azonosító nem található"
create:
empty: "Kérlek adj meg legalább egy e-mail címet."
no_more: "Nincs több felkérésed."
@@ -390,17 +431,19 @@ hu:
comma_separated_plz: "Megadhatsz több e-mail címet is vesszővel elválasztva."
invite_someone_to_join: "Hívj meg valakit, hogy csatlakozzon a diaspora*-hoz!"
language: "Nyelv"
- paste_link: "Ha szeretnéd meghívni a barátaidat a Diaspora-ra, oszd meg velük ezt a hivatkozást vagy küldd el nekik közvetlenül levélben."
+ paste_link: "Ha szeretnéd meghívni a barátaidat a diaspora*-ra, oszd meg velük ezt a hivatkozást vagy küldd el nekik közvetlenül levélben."
send_an_invitation: "Küldj egy meghívót"
sending_invitation: "Meghívó küldése folyamatban..."
layouts:
application:
back_to_top: "Vissza az elejére"
+ be_excellent: "Legyetek mindig jók egymáshoz! ♥"
powered_by: "diaspora* - fordította adamex & danielwine"
public_feed: "%{name} nyilvános diaspora* hírfolyama"
source_package: "forráskódcsomag letöltése"
+ statistics_link: "pod statisztika"
toggle: "mobil változat"
- whats_new: "Mik az újdonságok?"
+ whats_new: "mik az újdonságok?"
header:
code: "kód"
logout: "Kijelentkezés"
@@ -408,7 +451,7 @@ hu:
settings: "Beállítások"
limited: "Korlátozott"
more: "Bővebben"
- no_results: "Nincs eredmény"
+ no_results: "Nincs találat"
notifications:
also_commented:
few: "%{actors} is hozzászólt %{post_author} bejegyzéséhez: %{post_link}."
@@ -588,7 +631,7 @@ hu:
no_results: "Hé! Valamit keresned kell."
results_for: "A keresési szűrőnek (%{search_term}) megfelelt felhasználók"
search_handle: "Hogy biztosan megtaláld a barátaidat, használd a diaspora azonosítójukat (felhasználónév@pod.tld)."
- searching: "keresés folyamatban, légy türelmes..."
+ searching: "Keresés folyamatban, türelem..."
send_invite: "Még mindig semmi? Küldj meghívót!"
person:
thats_you: "Ez vagy Te!"
@@ -608,18 +651,13 @@ hu:
type_error: "Kép feltöltése nem sikerült. Biztos vagy benne, hogy jelöltél ki képet?"
destroy:
notice: "Kép törölve."
- new_photo:
- empty: "{file} egy üres fájl, válaszd ki újra a fájlokat {file} kivételéve!"
- invalid_ext: "{file} érvénytelen kiterjesztés. Csak {extensions} kiterjesztések megengedettek."
- size_error: "{file} túl nagy, maximum fájlméret {sizeLimit}."
new_profile_photo:
upload: "Tölts fel új önarcképet!"
- show:
- show_original_post: "Eredeti bejegyzés megtekintése"
posts:
presenter:
title: "%{name} bejegyzése"
show:
+ forbidden: "Ezt nincs jogosultságod megtenni"
photos_by:
few: "%{count} fénykép tőle: %{author}"
many: "%{count} fénykép tőle: %{author}"
@@ -633,11 +671,17 @@ hu:
profiles:
edit:
allow_search: "megtalálható legyek a diaspora* keresőben"
+ basic: "Alapvető adatlapom"
+ extended: "Kibővített adatlapom"
+ extended_visibility_text: "Kibővített adatlapod láthatósága:"
first_name: "Keresztnév"
last_name: "Vezetéknév"
+ limited: "Korlátozott"
nsfw_check: "Minden megosztásom megjelölése NSFW tartalomként"
nsfw_explanation: "Az NSFW (munkahelyen nem illő tartalom) a diaspora* közösségének saját szabványa azokra a tartalmakra vonatkozólag, melyek nem illdomosak munkahelyen történő megtekintésre. Ha ilyen jellegű anyagot gyakran szeretnél küldeni, kérlek jelöld be ezt a lehetőséget, hogy csak azok a személyek láthassák, akik úgy döntöttek, szeretnék ha megjelenne a hírfolyamukban hasonló tartalom."
nsfw_explanation2: "Ha nem választod ezt a lehetőséget, kérünk, hogy minden ilyen típusú tartalmadat bejegyzésenként külön jelöld meg az #nsfw címkével."
+ public: "Nyilvános"
+ settings: "Adatlap beállításai"
update_profile: "Adatlap frissítése"
your_bio: "Írj pár sort magadról"
your_birthday: "Születésnapod"
@@ -655,23 +699,23 @@ hu:
other: "%{count} visszajelzés"
zero: "nincs visszajelzés"
registrations:
- closed: "A feliratkozási lehetőség zárolva van ezen a diaspora* kiszolgálón."
+ closed: "A regisztrációs lehetőség zárolva van ezen a diaspora* kiszolgálón."
create:
success: "Csatlakoztál a diaspora* közösségi oldalra!"
invalid_invite: "Ez a meghívó többé nem érvényes!"
new:
- email: "E-MAIL"
- enter_email: "Írd be az e-mail címed"
+ email: "E-mail"
+ enter_email: "Add meg az e-mail címed"
enter_password: "Adj meg egy jelszót (legalább hat karakterből álljon)"
- enter_password_again: "Ugyanazt a jelszót írd amit az előbb"
+ enter_password_again: "Ugyanazt a jelszót add meg, amit a fenti mezőben"
enter_username: "Válassz egy felhasználónevet (csak angol betű, szám és aláhúzás megengedett)"
- password: "JELSZÓ"
+ password: "Jelszó"
password_confirmation: "Jelszó megerősítése"
- sign_up: "Feliratkozás"
+ sign_up: "Fiók létrehozása"
submitting: "Feldolgozás folyamatban..."
terms: "A fiók létrehozásával elfogadod a %{terms_link}."
terms_link: "felhasználási feltételeket"
- username: "AZONOSÍTÓ"
+ username: "Azonosító"
report:
comment_label: "<b>Hozzászólás</b>:<br>%{data}"
confirm_deletion: "Biztosan törölni akarod ezt az elemet?"
@@ -704,12 +748,17 @@ hu:
error: "Hiba történt a szolgáltatáshoz való kapcsolódás során"
index:
connect: "Kapcsolódás"
- disconnect: "megszakít"
+ disconnect: "Leválasztás"
edit_services: "Szolgáltatások szerkesztése"
logged_in_as: "- bejelentkeztél ezen a néven:"
not_logged_in: "Jelenleg nem vagy bejelentkezve."
- really_disconnect: "Megszakítod a kapcsolatot ezzel: %{service}?"
+ really_disconnect: "%{service} kapcsolat leválasztása?"
services_explanation: "Ha kapcsolódsz más szolgáltatásokhoz, lehetőséged lesz bejegyzéseket küldeni a felületükre, amint azokat a diaspora* rendszerén belül megírod."
+ provider:
+ facebook: "Facebook"
+ tumblr: "Tumblr"
+ twitter: "Twitter"
+ wordpress: "WordPress"
settings: "Beállítások"
shared:
aspect_dropdown:
@@ -729,7 +778,7 @@ hu:
atom_feed: "Atom hírfolyamod (feed)"
control_your_audience: "Válassz célközönséget!"
logged_in: "bejelentkezve ide: %{service}"
- manage: "kapcsolódó szolgáltatások kezelése"
+ manage: "Kapcsolódó szolgáltatások kezelése"
new_user_welcome_message: |-
Használj kettőskeresztet(#), hogy felcímkézd a bejegyzésedet. Címkék alapján találhatsz veled azonos érdeklődésű embereket.
A kukac(@) jellel pedig személyeket említhetsz meg a bejegyzésedben.
@@ -763,6 +812,21 @@ hu:
failed: "Ellenőrzés sikertelen"
user: "A titkos kép és jel különbözőek voltak"
placeholder: "Írd ide a látott számot"
+ statistics:
+ active_users_halfyear: "aktív felhasználók az elmúlt fél évben"
+ active_users_monthly: "aktív felhasználók havonta"
+ closed: "zárt"
+ disabled: "nem hozzáférhető"
+ enabled: "hozzáférhető"
+ local_comments: "helyi hozzászólások"
+ local_posts: "helyi bejegyzések"
+ name: "név"
+ network: "hálózat"
+ open: "nyílt"
+ registrations: "regisztráció"
+ services: "szolgáltatások"
+ total_users: "összes felhasználó"
+ version: "változat"
status_messages:
create:
success: "Megemlítetted: %{names}"
@@ -779,7 +843,7 @@ hu:
title: "Csoportjaim"
aspects_stream: "Csoportok"
comment_stream:
- title: "Hozzászólt bejegyzések"
+ title: "Kommentált bejegyzések"
community_spotlight_stream: "A figyelem középpontjában"
followed_tag:
add_a_tag: "Címke hozzáadása"
@@ -797,6 +861,10 @@ hu:
title: "Nyilvános tevékenység"
tags:
title: "Bejegyzés megjelölve: %{tags}"
+ tag_followings:
+ manage:
+ no_tags: "Nem követsz egyetlen címkét sem."
+ title: "Követett címkék kezelése"
tags:
show:
follow: "Címke követése"
@@ -810,12 +878,13 @@ hu:
destroy:
no_password: "Add meg a jelszavad, hogy megszüntesd a fiókod."
success: "A fiókodat lezártuk. Húsz percbe is beletelhet, mire befejezzük a fiókod törlését. Köszönjük, hogy kipróbáltad a diaspora* közösségi oldalt."
- wrong_password: "A megadott jelszó nem felel meg."
+ wrong_password: "A megadott jelszó nem egyezik meg az érvényben lévővel."
edit:
- also_commented: "más is hozzászólt az ismerősöd bejegyzéséhez?"
+ also_commented: "más is hozzászólt egy általad kommentált bejegyzéshez?"
auto_follow_aspect: "Csoport az automatikusan követett felhasználóknak:"
auto_follow_back: "Automatikusan megosztod valakivel a tartalmaidat, ha a másik is elkezdett megosztani veled"
change: "Módosítás"
+ change_color_theme: "Színséma megváltoztatása"
change_email: "Email megváltoztatása"
change_language: "Nyelv megváltoztatása"
change_password: "Jelszó módosítása"
@@ -824,7 +893,7 @@ hu:
dont_go: "Hé, kérlek ne menj!"
lock_username: "A felhasználóneved foglalt marad. Nem lesz lehetőséged ezen a kiszolgálón új fiókot létrehozni ugyanezzel a névvel."
locked_out: "Ki fogunk léptetni és kizárunk a fiókodból, amíg végleg el nem távolítjuk."
- make_diaspora_better: "Azt szeretnénk, ha segítenél, hogy jobbá tehessük a diaspora*-t. A távozásod helyett ezért szívesebben vennénk, ha közreműködnél. Ám ha úgy döntesz, hogy elhagyod az oldalt, a következő fog történni:"
+ make_diaspora_better: "Szeretnénk, ha segítenél jobbá tenni a diaspora*-t. Távozásod helyett ezért szívesebben vennénk, ha közreműködnél. Ám ha úgy döntesz, hogy elhagyod az oldalt, a következő fog történni:"
mr_wiggles: "Vuk szomorú lesz, ha távozni lát."
no_turning_back: "Nincs visszaút! Ha teljesen biztos vagy benne, add meg a jelszavadat a lenti mezőben."
what_we_delete: "Töröljük az összes bejegyzésedet és adatodat amint tudjuk. A mások bejegyzéseihez írt hozzászólásaid megmaradnak, de a neved helyett csak a diaspora* azonosítód lesz látható mellettük."
@@ -835,7 +904,8 @@ hu:
download_export_photos: "Képeim letöltése"
edit_account: "Fiók szerkesztése"
email_awaiting_confirmation: "Aktivációs link elküldve ide: %{unconfirmed_email}. Amíg nem erősíted meg az új címed, addig a régit használjuk: %{email}."
- export_data: "Adatok kivitele"
+ export_data: "Adatok letöltése"
+ export_in_progress: "Az adataid feldolgozása folyamatban van. Kérlek nézz vissza pár perc múlva."
export_photos_in_progress: "Jelenleg folyamatban van a képeid feldolgozása. Kérlek nézz vissza később."
following: "Követési beállítások"
liked: "valakinek tetszik a bejegyzésed?"
@@ -843,14 +913,18 @@ hu:
new_password: "Új jelszó"
private_message: "személyes üzenetet kaptál?"
receive_email_notifications: "Szeretnél értesítést kapni levélben, ha:"
+ request_export: "Profiladataim igénylése"
+ request_export_photos: "Képeim igénylése"
request_export_photos_update: "Képeim frissítése"
+ request_export_update: "Profiladataim frissítése"
reshared: "valaki újraosztotta a bejegyzésedet?"
show_community_spotlight: "A \"figyelem középpontjában\" lévő tartalmak megjelenítése a hírfolyamban"
- show_getting_started: "\"Kezdő lépések\" újra engedélyezése"
+ show_getting_started: "\"Kezdő lépések\" újbóli megjelenítése"
someone_reported: "valaki jelentést küldött"
started_sharing: "valaki elkezd megosztani veled?"
stream_preferences: "Hírfolyam tulajdonságai"
your_email: "E-mail címed"
+ your_email_private: "Az emailedet sosem látja más"
your_handle: "diaspora* azonosítód"
getting_started:
awesome_take_me_to_diaspora: "Remek! Irány a Diaspora*"
@@ -870,6 +944,8 @@ hu:
public:
does_not_exist: "%{username} nem létezik!"
update:
+ color_theme_changed: "Színséma sikeresen megváltozott."
+ color_theme_not_changed: "Hiba lépett fel a színséma megváltoztatása során."
email_notifications_changed: "E-mail értesítések módosítva"
follow_settings_changed: "Követési beállítások megváltoztak"
follow_settings_not_changed: "Követési beállítások megváltoztatása sikertelen."
diff --git a/config/locales/diaspora/hy.yml b/config/locales/diaspora/hy.yml
index c307fa3f6..d4b6400be 100644
--- a/config/locales/diaspora/hy.yml
+++ b/config/locales/diaspora/hy.yml
@@ -148,12 +148,30 @@ hy:
contact_developer: "Պետք է հավելվածը մշակողին ուղարկես հետեւյալ սխալի մանրամասն հաղորդագրությունը`"
title: "Օհ, ինչ-որ բան սխալ գնաց ։Չ"
scopes:
+ aud:
+ description: "Սա aud թույլատվություն է տալիս ծրագրին"
+ name: "aud"
+ name:
+ description: "Սա անվան թույլտվություն է տալիս ծրագրին"
+ name: "անուն"
+ nickname:
+ description: "Սա մականվան թույլտվություն է տալիս ծրագրին"
+ name: "մականուն"
openid:
description: "Սա կթողնի հավելվածին կարդալ քո հիմնական էջը"
name: "հիմնական էջը"
+ picture:
+ description: "Սա նկարի թույլտվություն է տալիս ծրագրին"
+ name: "նկար"
+ profile:
+ description: "Սա կթողնի հավելվածին կարդալ քո ընդլայնված էջը"
+ name: "ընդլայնված էջ"
read:
description: "Սա կթողնի հավելվածին կարդալ քո լրահոսը, քո զրույցները ու քո ամբողջական էջը"
name: "կարդալ անձնական էջը, լրահոսն ու զրույցները"
+ sub:
+ description: "Սա sub թույլատվություն է տալիս ծրագրին"
+ name: "sub"
write:
description: "Սա կթողնի հավելվածին ուղարկել նոր գրառումները, ստեղծել նոր զրույցներ ու ուղարկել արձագանքները"
name: "ուղարկել գրառումները, զրույցներն ու արձագանքները"
@@ -222,7 +240,7 @@ hy:
title: "Ողջունի՛ր նորեկներին"
services:
content: "Կարող ես միացնել հետևյալ ծառայությունները դիասպորա*յին՝"
- heading: "Միացնել ծառայությունները"
+ heading: "Ծառայություններ միացնել"
welcome_to_diaspora: "Բարի գալուստ դիասպորա*, %{name} ջան։"
no_contacts_message:
community_spotlight: "համայնքի ակնառու օգտատերերի"
@@ -274,7 +292,6 @@ hy:
conversations:
create:
fail: "Անվավեր հաղորդագրություն։"
- no_contact: "Հեյ, բա հասցեատե՞րը։"
sent: "Հաղորդագրությունն ուղարկված է։"
destroy:
delete_success: "Խոսակցությունը հաջողությամբ ջնջվեց։"
@@ -546,7 +563,6 @@ hy:
own_your_data: "Եղի՛ր քո տվյալների տերը"
own_your_data_info: "Շատ ցանցեր օգտագործում են քո տվյալները գումար վաստակելու նպատակով՝ վերլուծելով քո փոխազդեծություններն ու այդ տեղեկատվության հիման վրա քեզ իրեր գովազդելով։ դիասպորա*ն չի օգտագործում քո տվյալները որեւէ նպատակի համար, բացի քեզ հնարավորություն տալուց՝ կապ հաստատել ու կիսվել ուրիշների հետ։"
podmin:
- admin_panel: "ադմինի վահանակ"
byline: "Դու մոտ ես Համացանցը փոխելուն։ Արի, նախապատրաստենք քեզ, հը՞մ։"
configuration_info: "Բացիր %{database_path} ու %{diaspora_path} քո նախընտրած տեքստային խմբագրիչի մեջ ու ուշադիր ուսումնասիրիր այն։ Դրանք մանրամասն մեկնաբանված են։"
configure_your_pod: "Կարգավորի՛ր քո փոդը"
@@ -560,7 +576,7 @@ hy:
getting_help_info: "Մենք %{faq} ենք կազմել՝ ներառյալ որոշ լրացուցիչ խորհուրդներ, հնարքներ ու լուծումներ ամենահաճախակի հանդիպող խնդիրների համար։ Նաեւ քեզ ազատ զգա՝ %{irc}։"
headline: "Բարի գալո՜ւստ, ընկեր։"
make_yourself_an_admin: "Քեզ ադմի՛ն դարձրու"
- make_yourself_an_admin_info: "Ցուցումները կարող ես գտնել %{wiki}ում։ Սրա արդյունքում «Ադմին» հղում կավելանա քո օգտատիրոջ մենյուում, երբ մուտք գործած լինես։ Դա քեզ մի շարք հնարավորություններ կտա, ինչպես օրինակ՝ օգտատերերի որոնում կամ քո փոդի վիճակագրությունը։ Քո փոդի գործման կողմերի վերաբերյալ առավել շատ մանրամասների համար անցիր %{admin_panel}։"
+ make_yourself_an_admin_info: "Ցուցումները կարող ես գտնել %{wiki}ում։ Սրա արդյունքում «%{admin_dashboard}» հղում կավելանա քո օգտատիրոջ մենյուում, երբ մուտք գործած լինես։ Դա քեզ մի շարք հնարավորություններ կտա, ինչպես օրինակ՝ օգտատերերի որոնում կամ քո փոդի վիճակագրությունը։"
report_bugs: "տեղեկացրու դրանց մասին"
update_instructions: "դիասպորա*յի վիքիում"
update_your_pod: "Թարմացրո՛ւ քո փոդը"
@@ -568,14 +584,11 @@ hy:
invitation_codes:
not_valid: "Հրավերի այս կոդն այլեւս անվավեր է"
invitations:
- a_facebook_user: "Ֆեյսբուքյան օգտատեր"
- check_token:
- not_found: "Հրավերի կոդանշանը չգտնվեց։"
create:
empty: "Պետք է առնվազն մեկ էլ․հասցե նշես։"
no_more: "Այլևս հրավեր ուղարկելու իրավունք չունես։"
note_already_sent: "Հրավերները արդեն ուղարկվել են հետևյալ հասցեներին՝ %{emails}"
- rejected: "Հետևյալ էլ.հասցեների հետ կապված խնդիրներ կան՝ "
+ rejected: "Հետևյալ էլ.հասցեների հետ կապված խնդիրներ կան՝ %{emails}"
sent: "Հրավերները ուղարկվեցին հետևյալ հասցեներով՝ %{emails}"
new:
codes_left:
@@ -591,7 +604,7 @@ hy:
layouts:
application:
back_to_top: "Թռնել վերև"
- be_excellent: "Հարգե՜նք զմիմյանս ♥"
+ be_excellent: "Հարգալից եղեք միմյանց նկատմամբ ♥"
powered_by: "Գործում է դիասպորա*յի օգնությամբ"
public_feed: "%{name}-ի` դիասպորա*յի հրապարակային հոսքը"
source_package: "Ներբեռնել սկզբնական կոդի փաթեթը"
@@ -630,10 +643,11 @@ hy:
comment_on_post: "Մեկնաբանել են գրառումը"
liked: "Հավանել են"
mark_all_as_read: "Նշել ամբողջը որպես ընթերցված"
- mark_all_shown_as_read: "Նշել բոլոր ցուցադրվածները որպես կարդացված։"
+ mark_all_shown_as_read: "Նշել բոլոր ցուցադրվածները որպես կարդացված"
mark_read: "Նշել որպես նայած"
mark_unread: "Նշել որպես չկարդացված"
- mentioned: "Նշել են"
+ mentioned: "Նշել են գրառման մեջ"
+ mentioned_in_comment: "Նշել են մեկնաբանության մեջ"
no_notifications: "Դեռ ոչ մի ծանուցում չունես։"
notifications: "Ծանուցումներ"
reshared: "Տարածել են"
@@ -656,6 +670,12 @@ hy:
one: "%{actors} նշել է քեզ ջնջված գրառման մեջ։"
other: "%{actors} նշել են քեզ ջնջված գրառման մեջ։"
zero: "%{actors} նշել է քեզ ջնջված գրառման մեջ։"
+ mentioned_in_comment:
+ one: "%{actors} նշել է քեզ %{post_link} գրառման <a href='%{comment_path}'>մեկնաբանության</a> մեջ։"
+ other: "%{actors} նշել են քեզ %{post_link} գռարռման <a href='%{comment_path}'>մեկնաբանության</a> մեջ։"
+ mentioned_in_comment_deleted:
+ one: "%{actors} նշել է քեզ ջնջված մեկնաբանության մեջ։"
+ other: "%{actors} նշել են քեզ ջնջված մեկնաբանության մեջ։"
post: "գրառում"
private_message:
one: "%{actors} քեզ հաղորդագրություն է ուղարկել։"
@@ -756,6 +776,7 @@ hy:
subject: "%{name} նշել է քեզ գրառման մեջ դիասպորա*յում"
private_message:
reply_to_or_view: "Պատասխանիր կամ տես այս խոսակցությունը >"
+ subject: "Նոր անձնական նամակ ունես"
remove_old_user:
body: |-
Ողջույն։
@@ -819,7 +840,7 @@ hy:
searching: "Փնտրվում է, խնդրում ենք լինել համբերատար..."
send_invite: "Ոչ մի արդյո՞ւնք։ Հրավե՛ր ուղարկիր։"
person:
- thats_you: "Դա դու՛ ես։"
+ thats_you: "սա դու ես"
profile_sidebar:
bio: "Կենսագրություն"
born: "Ծննդյան ամսաթիվ"
@@ -836,14 +857,8 @@ hy:
type_error: "Նկար վերբեռնելը տապալվեց։  Համոզված ե՞ս, որ հենց նկար էիր ավելացրել։"
destroy:
notice: "Նկարը ջնջված է։"
- new_photo:
- empty: "{file}-ը դատարկ է, կրկին ընտրիր ֆայլերը առանց դրա։"
- invalid_ext: "{file}-ը անհամապատասխան ընդլայնման է։ Միայն {extensions} են թույլատրվում։"
- size_error: "{file}-ը չափից դուրս մեծ է, առավելագույն չափն է՝ {sizeLimit}։"
new_profile_photo:
upload: "Նո՜րը վերբեռնել"
- show:
- show_original_post: "Ցույց տալ սկզբնական գրառումը"
polls:
votes:
one: "առայժմ %{count} ձայն"
@@ -971,7 +986,7 @@ hy:
other: "%{count} խմբում"
zero: "Ավելացնել "
invitations:
- by_email: "Էլ.հասցեով"
+ by_email: "Հրավիրիր մարդկանց էլ.հասցեով"
invite_your_friends: "Կանչի՛ր ընկերներիդ"
invites: "Հրավերներ"
share_this: "Ուղարկիր այս հղումը էլ.փոստի, բլոգի կամ այլ սոցիալական ցանցերի միջոցով։"
diff --git a/config/locales/diaspora/ia.yml b/config/locales/diaspora/ia.yml
index 998d20ba0..48fba4a45 100644
--- a/config/locales/diaspora/ia.yml
+++ b/config/locales/diaspora/ia.yml
@@ -53,7 +53,7 @@ ia:
dashboard: "Pannello de instrumentos"
pages: "Paginas"
pod_network: "Rete de pods"
- pod_stats: "Statisticas de pod"
+ pod_stats: "Statisticas del pod"
report: "Reportos"
sidekiq_monitor: "Monitor Sidekiq"
user_search: "Recerca de usatores"
@@ -64,12 +64,12 @@ ia:
pods:
pod_network: "Rete de pods"
stats:
- 2weeks: "2 Septimana"
+ 2weeks: "2 septimanas"
50_most: "Le 50 etiquettas le plus popular"
current_segment: "Le segmento actual ha un media de <b>%{post_yest}</b> entratas per usator, a partir de <b>%{post_day}</b>"
daily: "Quotidian"
display_results: "Resultatos del segmento <b>%{segment}</b>"
- go: "va"
+ go: "Va"
month: "Mense"
tag_name: "Nomine del etiquetta: <b>%{name_tag}</b> Occurrentias: <b>%{count_tag}</b>"
usage_statistic: "Statisticas de uso"
@@ -80,6 +80,7 @@ ia:
email: "E-mail"
guid: "GUID"
id: "ID"
+ invite_token: "Indicio de invitation"
last_seen: "ultime visita"
? "no"
: "no"
@@ -91,20 +92,21 @@ ia:
account_closing_scheduled: "Le conto de %{name} es planate a esser claudite. Illo essera processate in alcun momentos…"
account_locking_scheduled: "Le conto de %{name} es planate a esser blocate. Illo essera processate in alcun momentos…"
account_unlocking_scheduled: "Le conto de %{name} es planate a esser disblocate. Illo essera processate in alcun momentos…"
- add_invites: "adder invitationes"
+ add_invites: "Adder invitationes"
are_you_sure: "Es tu secur de voler clauder iste conto?"
are_you_sure_lock_account: "Es tu secur de voler blocar iste conto?"
are_you_sure_unlock_account: "Es tu secur de voler disblocar iste conto?"
close_account: "clauder conto"
email_to: "Adresse de e-mail a invitar"
+ invite: "Invitar"
lock_account: "Blocar conto"
under_13: "Monstrar usatores con minus de 13 annos (COPPA)"
unlock_account: "Disblocar conto"
view_profile: "vider profilo"
you_currently:
- one: "il te resta un invitation %{link}"
- other: "il te resta %{count} invitationes %{link}"
- zero: "il non te resta invitationes %{link}"
+ one: "Il te resta un invitation %{link}"
+ other: "Il te resta %{count} invitationes %{link}"
+ zero: "Il non te resta invitationes %{link}"
weekly_user_stats:
amount_of:
one: "Numero de nove usatores iste septimana: %{count}"
@@ -131,12 +133,30 @@ ia:
login_required: "Tu debe aperir session ante de poter autorisar iste application"
title: "Un problema ha occurrite."
scopes:
+ aud:
+ description: "Isto concede permissiones \"aud\" al application"
+ name: "aud"
+ name:
+ description: "Isto concede permissiones \"name\" al application"
+ name: "nomine"
+ nickname:
+ description: "Isto concede permissiones \"nickname\" al application"
+ name: "pseudonymo"
openid:
description: "Isto permitte que le application lege tu profilo basic"
name: "profilo basic"
+ picture:
+ description: "Isto concede permissiones \"picture\" al application"
+ name: "imagine"
+ profile:
+ description: "Isto permitte que le application lege tu profilo extendite"
+ name: "profilo extendite"
read:
description: "Isto permitte que le application lege tu fluxo, tu conversationes e tu profilo complete"
name: "leger profilo, fluxo e conversationes"
+ sub:
+ description: "Isto concede permissiones \"sub\" al application"
+ name: "sub"
write:
description: "Isto permitte que le application publica nove entratas, scribe conversationes e invia reactiones"
name: "inviar entratas, conversationes e reactiones"
@@ -154,11 +174,11 @@ ia:
are_you_sure_delete_account: "Es tu secur de voler clauder tu conto? Isto non pote esser disfacite!"
aspect_memberships:
destroy:
- failure: "Le remotion del persona del aspecto ha fallite"
+ failure: "Le remotion del persona del aspecto ha fallite."
forbidden: "Tu non ha le permission de facer isto."
invalid_statement: "Elemento duple rejectate."
- no_membership: "Impossibile trovar le persona seligite in ille aspecto"
- success: "Persona removite del aspecto con successo"
+ no_membership: "Le persona seligite non se trova in ille aspecto."
+ success: "Persona removite del aspecto con successo."
aspects:
add_to_aspect:
failure: "Le addition del contacto al aspecto ha fallite."
@@ -167,19 +187,19 @@ ia:
add_an_aspect: "+ Adder un aspecto"
aspect_stream:
make_something: "Crea qualcosa"
- stay_updated: "Tene te al currente"
+ stay_updated: "Mantene te al currente"
stay_updated_explanation: "Le fluxo principal es plenate con tote le contactos tue, le etiquettas que tu seque, e messages de alcun membros creative del communitate."
destroy:
- failure: "%{name} non es vacue e non pote esser removite."
+ failure: "%{name} non pote esser removite."
success: "%{name} ha essite removite con successo."
success_auto_follow_back: "%{name} ha essite removite con successo. Tu ha usate iste aspecto pro automaticamente sequer le usatores que te seque. Verifica tu configuration de usator pro seliger un nove aspecto pro reciprocation automatic de sequimento."
edit:
aspect_list_is_not_visible: "Le contactos in iste aspecto non pote vider le un le altere."
aspect_list_is_visible: "Le contactos in iste aspecto pote vider le un le altere."
confirm_remove_aspect: "Es tu secur de voler deler iste aspecto?"
- rename: "renominar"
- update: "actualisar"
- updating: "actualisation in curso"
+ rename: "Renominar"
+ update: "Actualisar"
+ updating: "Actualisation in curso"
index:
donate: "Donar"
help:
@@ -196,7 +216,7 @@ ia:
tag_feature: "functionalitate"
tag_question: "question"
tutorial_link_text: "Tutoriales"
- tutorials_and_wiki: "%{faq}, %{tutorial} & %{wiki}: Adjuta pro le prime passos."
+ tutorials_and_wiki: "%{faq}, %{tutorial} & %{wiki}: adjuta pro le prime passos."
introduce_yourself: "Iste fluxo es le tue. Non hesita… presenta te!"
keep_pod_running: "Adjuta al mantenentia e melioration de %{pod} (e al caffeination de su gerentes) con un donation mensual!"
new_here:
@@ -208,10 +228,10 @@ ia:
heading: "Connecter servicios"
welcome_to_diaspora: "Benvenite a diaspora*, %{name}!"
no_contacts_message:
- community_spotlight: "usatores in evidentia"
+ community_spotlight: "Usatores in evidentia"
invite_link_text: "invitar"
or_spotlight: "O tu pote divider con %{link}"
- try_adding_some_more_contacts: "Tu pote cercar o invitar plus contactos."
+ try_adding_some_more_contacts: "Tu pote cercar o %{invite_link} plus contactos."
you_should_add_some_more_contacts: "Tu deberea adder plus contactos!"
seed:
acquaintances: "Cognoscitos"
@@ -223,10 +243,10 @@ ia:
success: "Tu aspecto, %{name}, ha essite modificate con successo."
blocks:
create:
- failure: "Io non poteva ignorar iste usator. #evasion"
- success: "Ben, tu non plus videra iste usator in tu fluxo. #silentio!"
+ failure: "Un error ha impedite de ignorar iste usator. #evasion"
+ success: "In ordine, tu non plus videra iste usator in tu fluxo. #silentio!"
destroy:
- failure: "Io non poteva cessar de ignorar iste usator. #evasion"
+ failure: "Impossibile cessar de ignorar iste usator a causa de un error. #evasion"
success: "Vamos vider lo que iste usator ha a dicer! #salutes"
bookmarklet:
explanation: "Invia cosas a diaspora* ab ubique con iste ligamine: %{link}"
@@ -234,6 +254,8 @@ ia:
post_something: "Inviar a diaspora*"
cancel: "Cancellar"
comments:
+ create:
+ error: "Commento fallite."
new_comment:
comment: "Commentar"
commenting: "Commenta…"
@@ -253,11 +275,11 @@ ia:
user_search: "Recerca de usatores"
spotlight:
community_spotlight: "Usatores in evidentia"
+ no_members: "Il non ha ancora membros."
suggest_member: "Suggerer un membro"
conversations:
create:
fail: "Message non valide"
- no_contact: "Tu debe adder le contacto primo."
sent: "Message inviate"
destroy:
delete_success: "Le conversation ha essite delite"
@@ -266,21 +288,22 @@ ia:
conversations_inbox: "Conversationes – Cassa de entrata"
inbox: "Cassa de entrata"
new_conversation: "Nove conversation"
- no_messages: "nulle message"
+ no_contacts: "Es necessari adder alcun contactos ante de poter initiar un conversation"
+ no_messages: "Nulle message"
new:
message: "Message"
send: "Inviar"
sending: "Invia…"
- subject: "subjecto"
+ subject: "Subjecto"
subject_default: "Sin subjecto"
- to: "a"
+ to: "A"
new_conversation:
fail: "Message non valide"
show:
- delete: "deler e blocar conversation"
+ delete: "Deler conversation"
hide: "celar e silentiar conversation"
last_message: "Ultime message recipite %{timeago}"
- reply: "responder"
+ reply: "Responder"
replying: "Responde…"
date:
formats:
@@ -290,6 +313,7 @@ ia:
delete: "Deler"
email: "E-mail"
error_messages:
+ csrf_token_fail: "Le indicio CSRF non es valide. Per favor, aperi session e reproba."
helper:
correct_the_following_errors_and_try_again: "Corrige le sequente errores e proba de novo."
need_javascript: "Iste sito web require JavaScript pro poter functionar. Si tu ha disactivate JavaScript, per favor reactiva lo e recarga iste pagina."
@@ -297,13 +321,13 @@ ia:
find_people: "Cercar personas o #etiquettas"
help:
account_and_data_management:
- close_account_a: "Va al fin de tu pagina de configuration e clicca sur le button \"Clauder conto\"."
+ close_account_a: "Vade al fin de tu pagina de configuration e clicca sur le button \"Clauder conto\". Le systema te demandara de entrar tu contrasigno pro completar le processo. Non oblida que, si tu claude tu conto, tu <strong>nunquam</strong> potera re-inscriber tu nomine de usator in le mesme pod."
close_account_q: "Como pote io deler mi conto?"
- data_other_podmins_a: "Un vice que tu divide cosas con un persona in un altere pod, omne articulos que tu divide con illa e un copia del datos de tu profilo es immagazinate (in cache) in le pod de illa, e es accessibile al administrator del base de datos de iste pod. Quando tu dele un entrata o datos de profilo, illo es delite de tu pod e de omne altere pods ubi illo es immagazinate."
+ data_other_podmins_a: "Un vice que tu divide cosas con un persona in un altere pod, omne entratas que tu divide con illa e un copia del datos de tu profilo es immagazinate (in cache) in le pod de illa, e es accessibile al administrator del base de datos de iste pod. Quando tu dele un entrata o datos de profilo, illo es delite de tu pod e un requesta de deletion es inviate a omne altere pods ubi illo es immagazinate. Tu imagines nunquam es immagazinate in un altere pod que le tue; solmente ligamines a illos es transmittite a altere pods."
data_other_podmins_q: "Esque le administratores de altere pods pote vider mi information?"
- data_visible_to_podmin_a: "Le communication *inter* pods es sempre cryptate (con SSL e le cryptation de transporto proprie de diaspora*), ma le immagazinage de datos in pods non es cryptate. Le administrator del base de datos de tu pod (generalmente le persona qui gere le pod) pote acceder a tote le datos de tu profilo e tote lo que tu invia (isto es le caso pro le majoritate del sitos web que immagazina datos de usator). Gerer tu proprie pod fornirea un melior protection del vita private perque tu haberea le controlo super le accesso al base de datos."
+ data_visible_to_podmin_a: "In breve: toto. Le communication inter pods es sempre cryptate (con SSL e le cryptation de transporto proprie de diaspora*), ma le immagazinage de datos in pods non es cryptate. Si ille vole, le administrator del base de datos de tu pod (generalmente le persona qui gere le pod) poterea acceder a tote le datos de tu profilo e tote le entratas que tu invia (como es le caso pro le majoritate del sitos web que immagazina datos de usator). Es pro isto que tu ha le selection del pod in le qual crear tu conto, de maniera que tu pote seliger un pod gerite per un persona in que tu ha confidentia. Gerer tu proprie pod forni un melior protection del vita private perque tu controla alora le accesso al base de datos."
data_visible_to_podmin_q: "Quante information mie pote le administrator de mi pod vider?"
- download_data_a: "Si. Al fundo del scheda Conto in tu pagina de configuration il ha duo buttones pro discargar tu datos."
+ download_data_a: "Si. Al fundo del scheda Conto in tu pagina de configuration il ha duo buttones: un pro discargar tu datos e un pro discargar tu photos."
download_data_q: "Pote io discargar un copia de tote le datos continite in mi conto?"
move_pods_a: "In le futuro tu potera exportar tu conto de un pod e importar lo in un altere, ma pro le momento isto non es possibile. Tu pote sempre aperir un nove conto e adder tu contactos in aspectos in le nove conto, e demandar les de adder tu nove conto a lor aspectos."
move_pods_q: "Como displaciar mi conto de un pod a un altere?"
@@ -313,24 +337,24 @@ ia:
change_aspect_of_post_q: "Un vice que io ha inviate qualcosa, pote io cambiar le aspecto(s) que pote vider le entrata?"
contacts_know_aspect_a: "No. Ille non pote vider le nomine del aspecto in alcun maniera."
contacts_know_aspect_q: "Esque mi contactos sapera in qual aspectos io les mitte?"
- contacts_visible_a: "Si tu marca iste option, le contactos de ille aspecto potera vider le lista de altere personas includite in illo, a partir de tu pagina de profilo sub tu imagine. Es melior seliger iste option solmente si tote le contactos in iste aspecto se cognosce. Illes totevia non potera vider le nomine del aspecto."
+ contacts_visible_a: "Si tu marca iste option, le contactos de ille aspecto potera vider le lista de altere personas includite in illo, a partir del scheda \"Contactos\" in tu pagina de profilo. Es melior seliger iste option solmente si tote le personas in iste aspecto se cognosce, per exemplo si le aspecto es pro un club o societate de que tu es membro. Illes totevia non potera vider le nomine del aspecto."
contacts_visible_q: "Que significa \"render le contactos in iste aspecto visibile le un al alteres\"?"
- delete_aspect_a: "In tu lista de aspectos al latere sinistre del pagina, puncta le mouse verso le aspecto que tu vole deler. Clicca sur le micre stilo 'modificar' que appare al dextra. Clicca sur le button Deler in le quadro que appare."
+ delete_aspect_a: "Clicca sur \"Mi aspectos\" in le barra lateral a partir de un vista de fluxo e clicca sur le micre stilo de graphite presso le aspecto que tu vole deler, o vade a tu pagina Contactos e selige le aspecto in question. Postea clicca sur le icone de corbe a papiro in cyma al dextra del pagina."
delete_aspect_q: "Como deler un aspecto?"
- person_multiple_aspects_a: "Si. Vade a tu pagina de contactos e clicca sur Mi contactos. Pro cata contacto tu pote usar le menu al dextra pro adder la a omne aspectos que tu vole, o remover la de illos. O tu pote adder la a un nove aspecto (o remover la de un aspecto) per cliccar sur le button selector de aspectos in su pagina de profilo. O mesmo tu pote simplemente punctar le mouse verso su nomine quando tu lo vide in le fluxo, e un 'carta' de information apparera, in que tu pote cambiar le aspectos in que illa es."
+ person_multiple_aspects_a: "Si. Vade a tu pagina de contactos e clicca sur \"Mi contactos\". Pro cata contacto tu pote usar le menu al dextra pro adder la a omne aspectos que tu vole, o remover la de illos. O tu pote adder la a un nove aspecto (o remover la de un aspecto) per cliccar sur le button selector de aspectos in su pagina de profilo. O mesmo tu pote simplemente punctar le mouse verso su nomine quando tu lo vide in le fluxo, e un 'carta' de information apparera, in que tu pote cambiar le aspectos in que illa es."
person_multiple_aspects_q: "Pote io adder un persona a plure aspectos?"
- post_multiple_aspects_a: "Si. Quando tu scribe un entrata, usa le button selector de aspectos pro marcar o dismarcar aspectos. Le entrata essera visibile a tote le aspectos que tu marca. Tu pote anque seliger le aspectos al quales tu vole inviar lo in le barra lateral. Quando tu invia le entrata, le aspecto(s) que tu ha seligite in le lista al sinistra es memorate e essera seligite automaticamente quando tu comencia a facer un nove entrata."
+ post_multiple_aspects_a: "Si. Quando tu scribe un entrata, usa le button selector de aspectos pro marcar o dismarcar aspectos. \"Tote le aspectos\" es le option predefinite. Le entrata essera visibile a tote le aspectos que tu marca. Tu pote anque seliger le aspectos al quales tu vole inviar lo in le barra lateral. Quando tu invia le entrata, le aspecto(s) que tu ha seligite in le lista al sinistra es memorate e essera seligite automaticamente in le selector de aspectos quando tu comencia a facer un nove entrata."
post_multiple_aspects_q: "Pote io inviar un entrata a plure aspectos insimul?"
- remove_notification_a: "No."
+ remove_notification_a: "No. In ultra, illa non essera notificate si tu la adde a altere aspectos quando tu jam divide con illa."
remove_notification_q: "Si io remove qualcuno de un aspecto, o de tote mi aspectos, esque ille recipera notification de isto?"
- rename_aspect_a: "Si. In tu lista de aspectos al latere sinistre del pagina principal, puncta le mouse verso le aspecto que tu vole renominar. Clicca sur le micre stilo de graphite (con subtitulo 'modificar') que appare al dextra. Clicca sur 'renominar' in le quadro que appare."
- rename_aspect_q: "Pote io renominar un aspecto?"
+ rename_aspect_a: "Clicca sur \"Mi aspectos\" in le barra lateral a partir de un vista de fluxo e clicca sur le micre stilo de graphite presso le aspecto que tu vole renominar, o vade a tu pagina Contactos e selige le aspecto in question. Postea clicca sur le icone de modification al latere del nomine del aspecto in cyma de iste pagina, cambia le nomine e clicca sur \"Actualisar\"."
+ rename_aspect_q: "Como renomina io un aspecto?"
restrict_posts_i_see_a: "Si. Clicca sur \"Mi aspectos\" in le barra lateral e postea clicca sur individual aspectos in le lista pro marcar o dismarcar los. Solmente le entratas scribite per personas in le aspectos marcate apparera in tu fluxo."
- restrict_posts_i_see_q: "Pote io limitar le entratas que io vide de sorta que solmente illos de certe aspectos es monstrate?"
+ restrict_posts_i_see_q: "Pote io limitar le entratas in mi fluxo solmente illos de certe aspectos?"
title: "Aspectos"
what_is_an_aspect_a: "Aspectos es le maniera de gruppar tu contactos in diaspora*. Cata aspecto es un del facies que tu monstra al mundo. Un aspecto poterea representar te a tu collegas, o a tu familia, o a tu amicos in un club de que tu es membro."
what_is_an_aspect_q: "Que es un aspecto?"
- who_sees_post_a: "Si tu scribe un entrata limitate, illo essera visibile solmente al personas que tu ha mittite in ille aspecto (o in ille aspectos, si tu lo ha inviate a plure aspectos). Tu contactos que non es in le aspecto non potera vider le entrata si tu non lo ha rendite public. Solmente le entratas public es visibile a personas que tu non ha includite in un de tu aspectos."
+ who_sees_post_a: "Si tu scribe un entrata limitate, illo essera visibile solmente pro le personas que tu ha mittite in ille aspecto (o in ille aspectos, si tu lo ha inviate a plure aspectos) ante de publicar le entrata. Tu contactos que non es in le aspecto non potera vider le entrata. Entratas limitate nunquam essera visibile pro alcun persona que tu non ha mittite in un de tu aspectos."
who_sees_post_q: "Quando io invia qualcosa a un aspecto, qui lo videra?"
chat:
add_contact_roster_a: "Primo tu debe activar le chat pro un del aspectos in le quales iste persona es presente. Pro facer isto, va al %{contacts_page}, selige le aspecto que tu vole e clicca sur le icone de chat pro activar le chat pro ille aspecto. %{toggle_privilege} Alternativemente, tu pote crear un aspecto special nominate 'Chat' e adder a ille aspecto le personas con qui tu vole chattar. Un vice que tu ha facite isto, aperi le interfacie de chat e selige le persona con qui tu vole chattar."
@@ -338,19 +362,19 @@ ia:
contacts_page: "pagina de contactos"
title: "Chat"
faq: "FAQ"
- foundation_website: "le sito web del fundation diaspora"
+ foundation_website: "le sito web del fundation diaspora*"
getting_help:
get_support_a_faq: "Lege nostre pagina de %{faq} sur le wiki"
- get_support_a_hashtag: "pone le question in un entrata public de diaspora* adjungente le etiquetta %{question}"
- get_support_a_irc: "veni a nos in %{irc} (conversation in directo)"
- get_support_a_tutorials: "lege nostre %{tutorials}"
- get_support_a_website: "visita nostre %{link}"
- get_support_a_wiki: "cerca in le %{link}"
+ get_support_a_hashtag: "Pone le question in un entrata public de diaspora* adjungente le etiquetta %{question}"
+ get_support_a_irc: "Visita nos in %{irc} (conversation in directo)"
+ get_support_a_tutorials: "Lege nostre %{tutorials}"
+ get_support_a_website: "Visita nostre %{link}"
+ get_support_a_wiki: "Cerca in le %{link}"
get_support_q: "E si le FAQ non ha un responsa a mi question, ubi pote io trovar adjuta?"
getting_started_a: "Fortunatemente, le %{tutorial_series} in nostre sito es a tu disposition. Illo te guidara passo post passo per le processo de inscription e te inseniara le aspectos fundamental de usar diaspora*."
getting_started_q: "Succurso! Io ha besonio de adjuta pro comenciar!"
title: "Obtener adjuta"
- getting_started_tutorial: "Serie de tutoriales 'Prime passos'"
+ getting_started_tutorial: "Serie de tutoriales \"Prime passos\""
here: "hic"
irc: "IRC"
keyboard_shortcuts:
@@ -367,11 +391,11 @@ ia:
title: "Claves accelerator"
markdown: "Markdown"
mentions:
- how_to_mention_a: "Dactylographa le signo \"@\" e comencia a dactylographar su nomine. Un menu disrolante deberea apparer que permitte seliger le nomine plus facilemente. Nota ben que il es solmente possibile mentionar personas que tu ha addite a un aspecto."
+ how_to_mention_a: "Scribe le signo \"@\" e comencia a scriber su nomine. Un menu disrolante deberea apparer que permitte seliger le nomine plus facilemente. Nota ben que il es solmente possibile mentionar personas que tu ha addite a un aspecto."
how_to_mention_q: "Como mentionar un persona quando io scribe un entrata?"
mention_in_comment_a: "No, actualmente non."
mention_in_comment_q: "Pote io mentionar qualcuno in un commento?"
- see_mentions_a: "Si, clicca sur \"Mentiones\" in le columna sinistre in tu pagina principal."
+ see_mentions_a: "Si, clicca sur \"@Mentiones\" in le columna sinistre in tu pagina principal."
see_mentions_q: "Existe un maniera de vider le entratas in que on me ha mentionate?"
title: "Mentiones"
what_is_a_mention_a: "Un mention es un ligamine al pagina de profilo de un persona que appare in un entrata. Quando un persona es mentionate, illa recipe un notification que dirige su attention verso le entrata."
@@ -453,7 +477,7 @@ ia:
deselect_aspect_posting_q: "Que eveni quando io dismarca un o plus aspectos quando io face un entrata public?"
find_public_post_a: "Tu entratas public apparera in le fluxos de omnes qui te seque. Si tu include #etiquettas in tu message public, omnes qui seque iste etiquettas trovara tu entrata in lor fluxos. Cata entrata public anque ha un adresse URL specific al qual omnes pote acceder, mesmo sin aperir session; assi, es possibile mitter ligamines a entratas public directemente in Twitter, blogs, etc. Le entratas public pote anque esser includite in le indices del motores de recerca del web."
find_public_post_q: "Como pote altere personas trovar mi entrata public?"
- see_comment_reshare_like_a: "Omne usator de diaspora* e omne alteres connectite a internet. Le commentos, appreciationes e repetitiones de entratas public es etiam public."
+ see_comment_reshare_like_a: "Le commentos, appreciationes e repetitiones de entratas public es etiam public. Omne usator de diaspora* e omne alteres sur internet pote vider tu interactiones con un entrata public."
see_comment_reshare_like_q: "Quando io commenta, repete o apprecia un entrata public, qui pote vider lo?"
title: "Entratas public"
who_sees_post_a: "Omne usator de internet pote vider un entrata que tu marca como public, dunque, sia secur que tu vole vermente que tu message es public. Isto es un optime modo de attinger tote le mundo."
@@ -507,7 +531,7 @@ ia:
title: "Etiquettas"
what_are_tags_for_a: "Etiquettas servi a categorisar un entrata, normalmente per topico. Si tu cerca un etiquetta, es monstrate tote le entratas visibile pro te (public e private) con iste etiquetta. Isto permitte al personas interessate in un certe topico cercar le entratas public concernente lo."
what_are_tags_for_q: "A que servi etiquettas?"
- third_party_tools: "instrumentos de tertie personas"
+ third_party_tools: "Instrumentos de tertios"
title_header: "Adjuta"
tutorial: "tutorial"
tutorials: "tutoriales"
@@ -523,18 +547,34 @@ ia:
own_your_data: "Possede tu proprie datos"
own_your_data_info: "Multe retes usa tu datos pro ganiar moneta analysante tu interactiones e usante iste information pro diriger publicitate a te. diaspora* non usa tu datos pro alcun scopo, salvo illo de permitter te de connecter e divider cosas con altere personas."
podmin:
+ byline: "Tu es sur le puncto de cambiar le facie de Internet. Preste a comenciar?"
+ configuration_info: "Aperi %{database_path} e %{diaspora_path} in tu editor de texto preferite e revide los meticulosemente; illos ha commentos extense."
+ configure_your_pod: "Configurar tu pod"
+ contact_irc: "contacta nos sur IRC"
+ contribute: "Contribuer"
+ contribute_info: "Adjuta a meliorar diaspora*! Si tu trova errores, per favor %{report_bugs}."
+ create_an_account: "Crear un conto"
+ create_an_account_info: "%{sign_up_link} pro un nove conto."
+ faq_for_podmins: "FAQ pro gestores de pod in nostre wiki"
+ getting_help: "Obtener adjuta"
+ getting_help_info: "Nos ha enumerate alcun %{faq} con avisos e consilios extra e solutiones de problemas commun. Alternativemente, %{irc}."
headline: "Benvenite, amico."
+ make_yourself_an_admin: "Facer te administrator"
+ make_yourself_an_admin_info: "Instructiones se trova in le %{wiki}. Iste function insere un ligamine “%{admin_dashboard}” in tu menu personal in cyma del pagina durante que tu es in session aperte. Illo permitte cercar usatores e forni statisticas pro tu pod, inter altere cosas."
+ report_bugs: "reporta los"
+ update_instructions: "instructiones pro le actualisation in le wiki de diaspora*"
+ update_your_pod: "Actualisar tu pod"
+ update_your_pod_info: "Tu pote trovar %{update_instructions}."
invitation_codes:
+ already_logged_in: "%{inviter} te ha invitate a unir te a iste pod, ma tu ha jam aperite session."
not_valid: "Iste codice de invitation non plus es valide"
invitations:
- a_facebook_user: "Un usator de Facebook"
- check_token:
- not_found: "Indicio de invitation non trovate"
create:
+ closed: "Le invitationes es claudite sur iste pod de diaspora*."
empty: "Per favor, specifica al minus un adresse de e-mail."
no_more: "Tu non ha altere invitationes."
note_already_sent: "Invitationes ha jam essite inviate a: %{emails}"
- rejected: "Le sequente adresses de e-mail habeva problemas: "
+ rejected: "Le sequente adresses de e-mail habeva problemas: %{emails}"
sent: "Le sequente adresses ha recipite un invitation: %{emails}"
new:
comma_separated_plz: "Tu pote entrar plure adresses de e-mail separante los per commas."
@@ -546,26 +586,30 @@ ia:
layouts:
application:
back_to_top: "Retornar al cyma"
+ be_excellent: "Sia benevolente le un verso le altere! ♥"
powered_by: "Actionate per diaspora*"
public_feed: "Fluxo public de diaspora* pro %{name}"
- source_package: "discargar le pacchetto con le codice-fonte"
+ source_package: "Discargar le pacchetto con le codice-fonte"
statistics_link: "Statisticas del pod"
- toggle: "(dis)activar mobile"
- whats_new: "que es nove?"
+ toggle: "(Dis)activar mobile"
+ whats_new: "Que es nove?"
header:
- code: "codice"
+ code: "Codice"
logout: "Clauder session"
profile: "Profilo"
settings: "Configuration"
toggle_navigation: "Alternar navigation"
+ likes:
+ create:
+ error: "Appreciation fallite."
limited: "Limitate"
more: "Plus"
no_results: "Nulle resultato trovate"
notifications:
also_commented:
- one: "%{actors} anque commentava le entrata de %{post_author}, %{post_link}."
- other: "%{actors} anque commentava le entrata de %{post_author}, %{post_link}."
- zero: "%{actors} anque commentava le entrata de %{post_author}, %{post_link}."
+ one: "%{actors} etiam commentava le entrata %{post_link} de %{post_author}."
+ other: "%{actors} etiam commentava le entrata %{post_link} de %{post_author}."
+ zero: "Nemo altere commentava le entrata %{post_link} de %{post_author}."
comment_on_post:
one: "%{actors} commentava tu entrata %{post_link}."
other: "%{actors} commentava tu entrata %{post_link}."
@@ -581,6 +625,7 @@ ia:
mark_read: "Marcar como legite"
mark_unread: "Marcar como non legite"
mentioned: "Mentionate"
+ mentioned_in_comment: "Mentionate in commento"
no_notifications: "Tu non ha ancora notificationes."
notifications: "Notificationes"
reshared: "Repetite"
@@ -595,6 +640,15 @@ ia:
one: "%{actors} te ha mentionate in le entrata %{post_link}."
other: "%{actors} te ha mentionate in le entrata %{post_link}."
zero: "%{actors} te ha mentionate in le entrata %{post_link}."
+ mentioned_deleted:
+ one: "%{actors} te ha mentionate in un entrata delite."
+ other: "%{actors} te ha mentionate in un entrata delite."
+ mentioned_in_comment:
+ one: "%{actors} te ha mentionate in un <a href='%{comment_path}'>commento</a> sur le entrata %{post_link}."
+ other: "%{actors} te ha mentionate in un <a href='%{comment_path}'>commento</a> sur le entrata %{post_link}."
+ mentioned_in_comment_deleted:
+ one: "%{actors} te ha mentionate in un commento delite."
+ other: "%{actors} te ha mentionate in un commento delite."
post: "entrata"
private_message:
one: "%{actors} te ha inviate un message."
@@ -614,13 +668,36 @@ ia:
a_private_message: "Il ha un nove message private pro te in diaspora*."
also_commented:
limited_subject: "Il ha un nove commento sur un entrata que tu ha commentate"
- click_here: "clicca hic"
+ click_here: "Clicca hic"
comment_on_post:
limited_subject: "Il ha un nove commento sur un de tu entratas"
- reply: "Responde o lege le message de %{name} >"
+ reply: "Responder o leger le message de %{name} >"
confirm_email:
click_link: "Pro activar tu nove adresse de e-mail %{unconfirmed_email}, seque iste ligamine:"
subject: "Per favor activa tu nove adresse de e-mail %{unconfirmed_email}"
+ csrf_token_fail:
+ body: |-
+ Salute %{name},
+
+ diaspora* ha detegite un tentativa de acceder a tu session le qual pote esser non autorisate. Pro evitar omne possibilitate que tu datos sia compromittite, nos ha claudite tu session. Non te preoccupa; es secur reaperir session ora.
+
+ Un requesta ha essite inviate con un indicio CSRF incorrecte o mancante. Isto poterea esser totalmente innocente, o poterea esser un attacco de requesta falsificate trans sitos (CSRF).
+
+ Le causa poterea esser:
+
+ - Un add-on manipulante le requesta o effectuante requestas sin indicio;
+ - Un scheda lassate aperte de un session passate;
+ - Un altere sito web faciente requestas, con o sin tu permission;
+ - Varie altere instrumentos externe;
+ - Codice malitiose tentante acceder a tu datos.
+
+ Pro plus information sur CSRF, vide [%{link}](%{link}).
+
+ Si tu vide iste message plure vices, per favor verifica le punctos precedente, incluse omne add-ons o extensiones del navigator.
+
+ Gratias,
+ Le robot messagero de disapora*!
+ subject: "Nos ha recipite un requesta non autorisate de tu conto, %{name}"
email_sent_by_diaspora: "Iste message ha essite inviate per %{pod_name}. Si tu non vole reciper altere e-mail como iste,"
export_email:
body: |-
@@ -667,20 +744,25 @@ ia:
hello: "Salute %{name}!"
invite:
message: |-
- Hallo,
+ Salute!
- Tu ha essite invitate a unir te a diaspora*!
+ %{diaspora_id} te ha invitate a unir te a diaspora*!
Clicca sur iste ligamine pro comenciar:
[%{invite_url}][1]
+ O, si tu ha jam un conto, tu pote adder %{diaspora_id} a tu contactos.
+
Cordialmente,
- Le messagero robotic de diaspora*
+ Le robot messagero de diaspora*
+
+ P.S.: Si tu non sape (ancora) lo que es diaspora*, le responsa es [hic][2]!
[1]: %{invite_url}
+ [2]: %{diasporafoundation_url}
invited_you: "%{name} te ha invitate a diaspora*"
liked:
liked: "%{name} apprecia tu entrata"
@@ -689,6 +771,9 @@ ia:
mentioned:
limited_post: "Tu ha essite mentionate in un entrata limitate."
subject: "%{name} te ha mentionate in diaspora*"
+ mentioned_in_comment:
+ limited_post: "Tu ha essite mentionate in un commento sur un entrata limitate."
+ reply: "Responder o leger iste conversation >"
private_message:
reply_to_or_view: "Responde o lege iste conversation >"
subject: "Il ha un nove message private pro te"
@@ -744,7 +829,7 @@ ia:
ok: "OK"
people:
add_contact:
- invited_by: "tu ha essite inviate per"
+ invited_by: "Tu ha essite invitate per"
index:
couldnt_find_them: "Non trovate?"
looking_for: "Cercar entratas con le etiquetta %{tag_link}?"
@@ -752,7 +837,7 @@ ia:
no_results: "Pro cercar, primo scribe alcun parolas."
results_for: "Usatores correspondente a %{search_term}"
search_handle: "Usa lor ID de diaspora* (p.ex. nominedeusator@pod.tld) pro cercar tu amicos."
- searching: "recerca in curso, un momento per favor..."
+ searching: "Recerca in curso, un momento per favor..."
send_invite: "Ancora nihil? Invia un invitation!"
person:
thats_you: "Es tu!"
@@ -772,14 +857,13 @@ ia:
type_error: "Le incargamento del photo ha fallite. Es tu secur que un imagine ha essite addite?"
destroy:
notice: "Photo delite."
- new_photo:
- empty: "{file} es vacue. Per favor re-selige le files sin iste."
- invalid_ext: "{file} ha un extension inadmissibile. Solmente {extensions} es permittite."
- size_error: "{file} es troppo grande. Le dimension maxime es {sizeLimit}."
new_profile_photo:
upload: "Incargar un nove photo de profilo!"
- show:
- show_original_post: "Monstrar entrata original"
+ polls:
+ votes:
+ one: "%{count} voto usque ora"
+ other: "%{count} votos usque ora"
+ zero: "%{count} votos usque ora"
posts:
presenter:
title: "Un entrata de %{name}"
@@ -813,29 +897,33 @@ ia:
your_name: "Tu nomine"
your_photo: "Tu photo"
your_tags: "Describe te in 5 parolas"
- your_tags_placeholder: "p.ex. #films #cattones #viages #docente #interlingua"
+ your_tags_placeholder: "P.ex. #films #cattones #viages #docente #interlingua"
update:
failed: "Le actualisation del profilo ha fallite"
updated: "Profilo actualisate"
public: "Public"
+ reactions:
+ one: "1 reaction"
+ other: "%{count} reactiones"
+ zero: "Nulle reaction"
registrations:
closed: "Le creation de contos es claudite in iste pod de diaspora*."
create:
success: "Tu ha adherite a diaspora*!"
invalid_invite: "Le ligamine de invitation que tu ha fornite non plus es valide."
new:
- email: "E-MAIL"
- enter_email: "Specifica adresse de e-mail"
+ email: "E-mail"
+ enter_email: "Scribe tu adresse de e-mail"
enter_password: "Elige un contrasigno (de sex characteres al minimo)"
enter_password_again: "Repete le contrasigno"
enter_username: "Elige un nomine de usator (usa solmente litteras, numeros e tractos de sublineamento)"
- password: "CONTRASIGNO"
- password_confirmation: "CONFIRMA CONTRASIGNO"
- sign_up: "CREAR CONTO"
+ password: "Contrasigno"
+ password_confirmation: "Confirma contrasigno"
+ sign_up: "Crear conto"
submitting: "Submitte…"
terms: "Per crear un conto tu accepta le %{terms_link}."
terms_link: "conditiones de servicio"
- username: "NOMINE DE USATOR"
+ username: "Nomine de usator"
report:
comment_label: "<b>Commento</b>:<br>%{data}"
confirm_deletion: "Es tu secur de voler deler le elemento?"
@@ -850,12 +938,18 @@ ia:
destroyed: "Le entrata ha essite destruite"
failed: "Qualcosa ha errate"
title: "Summario de reportos"
+ unreviewed_reports:
+ one: "Il ha un reporto non revidite."
+ other: "Il ha %{count} reportos non revidite."
+ zero: "Il non ha reportos non revidite."
reshares:
comment_email_subject: "Repetition de %{resharer} del entrata de %{author}"
+ create:
+ error: "Repetition fallite."
reshare:
deleted: "Le entrata original ha essite delite per le autor."
- reshare_confirmation: "Repeter iste entrata de %{author}?"
- reshared_via: "repetite via"
+ reshare_confirmation: "Repeter le entrata de %{author}?"
+ reshared_via: "Repetite via"
search: "Cercar"
services:
create:
@@ -866,16 +960,17 @@ ia:
destroy:
success: "Authentication delite con successo."
failure:
- error: "un error occurreva durante le connexion a iste servicio"
+ error: "Un error occurreva durante le connexion a iste servicio"
index:
connect: "Connecter"
- disconnect: "disconnecter"
+ disconnect: "Disconnecter"
edit_services: "Modificar servicios"
- logged_in_as: "identificate como"
+ logged_in_as: "In session como %{nickname}."
no_services_available: "Il non ha servicios disponibile in iste pod."
not_logged_in: "Nulle session aperte in iste momento."
- really_disconnect: "disconnecter %{service}?"
- services_explanation: "Le connexion a servicios da le possibilitate de publicar tu messages anque in illos si tu los scribe in diaspora*."
+ really_disconnect: "Disconnecter %{service}?"
+ services_explanation: "Le connexion a altere servicios da le possibilitate de publicar tu messages anque in illos quando tu los scribe in diaspora*."
+ share_to: "Divider sur %{provider}"
title: "Gerer servicios connectite"
provider:
facebook: "Facebook"
@@ -887,15 +982,18 @@ ia:
aspect_dropdown:
mobile_row_checked: "%{name} (remover)"
mobile_row_unchecked: "%{name} (adder)"
+ toggle:
+ one: "In %{count} aspecto"
+ other: "In %{count} aspectos"
invitations:
- by_email: "Per e-mail"
+ by_email: "Invitar personas per e-mail"
invite_your_friends: "Invitar tu amicos"
invites: "Invitationes"
share_this: "Divide iste ligamine per e-mail, blog o rete social!"
public_explain:
atom_feed: "Syndication Atom"
control_your_audience: "Controlar tu audientia"
- logged_in: "identificate in %{service}"
+ logged_in: "Session aperite in %{service}"
manage: "Gerer servicios connectite"
new_user_welcome_message: "Usa #etiquettas pro classificar tu messages e trovar personas con interesses in commun. Commenda personas extraordinari con @Mentiones."
outside: "Le messages public essera visibile pro altere personas foras de diaspora*."
@@ -919,8 +1017,8 @@ ia:
upload_photos: "Incargar photos"
whats_on_your_mind: "De que pensa tu?"
stream_element:
- via: "via %{link}"
- via_mobile: "via mobile"
+ via: "Via %{link}"
+ via_mobile: "Per mobile"
simple_captcha:
label: "Scribe le codice in le quadro:"
message:
@@ -967,7 +1065,7 @@ ia:
title: "#Etiquettas sequite"
followed_tags_stream: "#Etiquettas sequite"
like_stream:
- title: "Fluxo de appreciationes"
+ title: "Fluxo de entratas appreciate"
mentioned_stream: "@Mentiones"
mentions:
title: "@Mentiones"
@@ -1002,7 +1100,7 @@ ia:
wrong_password: "Le contrasigno entrate non corresponde a tu contrasigno actual."
edit:
also_commented: "un persona commenta un entrata que tu ha commentate"
- auto_follow_aspect: "Aspecto pro contactos automaticamente addite:"
+ auto_follow_aspect: "Aspecto pro usatores con que tu divide automaticamente:"
auto_follow_back: "Divider automaticamente con omne persona qui comencia a divider con te"
change: "Cambiar"
change_color_theme: "Cambiar thema de colores"
@@ -1012,16 +1110,17 @@ ia:
character_minimum_expl: "al minus 6 characteres"
close_account:
dont_go: "Per favor, non parti!"
- lock_username: "Isto reserva tu nomine de usator in caso que tu decide de re-crear tu conto."
- locked_out: "Tu session essera claudite e tu essera excludite de tu conto."
- make_diaspora_better: "Nos ha besonio de adjuta pro meliorar diaspora*, dunque, per favor contribue in loco de quitar. Si tu vermente vole quitar, nos vole informar te de lo que evenira."
+ lock_username: "Tu nomine de usator essera blocate. Tu non potera crear un nove conto sur iste pod con le mesme ID."
+ locked_out: "Le session essera claudite e tu essera excludite del conto usque illo habera essite delite."
+ make_diaspora_better: "Nos amarea si tu remane e adjuta nos a meliorar diaspora* in vice de quitar. Nonobstante, si tu vermente vole quitar, ecce lo que evenira:"
mr_wiggles: "Sr. Wiggles essera triste de vider te partir"
- no_turning_back: "Tu ha arrivate al puncto de non retorno."
- what_we_delete: "Nos va deler, le plus tosto possibile, tote le entratas e datos de profilo pertinente a te. Tu commentos remanera, ma essera associate con tu ID de diaspora* in loco de tu nomine."
+ no_turning_back: "Tu ha arrivate al puncto de non retorno! Si tu es vermente secur, scribe hic infra tu contrasigno."
+ what_we_delete: "Nos va deler, le plus tosto possibile, tote le entratas e datos de profilo pertinente a te. Tu commentos sur le entratas de altere personas remanera, ma essera associate con tu ID de diaspora* in loco de tu nomine."
close_account_text: "Clauder conto"
comment_on_post: "un persona commenta un entrata tue"
current_password: "Contrasigno actual"
current_password_expl: "illo con que tu aperi session..."
+ default_post_visibility: "Aspectos pre-seligite pro publicar entratas"
download_export: "Discargar mi profilo"
download_export_photos: "Discargar mi photos"
edit_account: "Modificar conto"
@@ -1033,6 +1132,7 @@ ia:
last_exported_at: "(Ultime actualisation: %{timestamp})"
liked: "un persona apprecia un entrata tue"
mentioned: "un persona te mentiona in un entrata sue"
+ mentioned_in_comment: "tu es mentionate in un commento"
new_password: "Contrasigno nove"
private_message: "tu recipe un message private"
receive_email_notifications: "Reciper notificationes per e-mail quando:"
@@ -1043,7 +1143,7 @@ ia:
reshared: "un persona repete un entrata tue"
show_community_spotlight: "Monstrar \"Usatores in evidentia\" in fluxo"
show_getting_started: "Monstrar le avisos \"Como initiar\""
- someone_reported: "alcuno ha inviate un reporto"
+ someone_reported: "alcuno invia un reporto"
started_sharing: "un persona comencia a divider con te"
stream_preferences: "Preferentias de fluxo"
your_email: "Tu adresse de e-mail"
@@ -1053,7 +1153,7 @@ ia:
awesome_take_me_to_diaspora: "Superbe! Conduce me a diaspora*"
community_welcome: "Le communitate de diaspora* es felice de accolliger te!"
connect_to_facebook: "Nos pote accelerar le cosas un poco per %{link} a diaspora*. Isto insere automaticamente tu nomine e photo, e permitte inviar entratas a ambe sitos."
- connect_to_facebook_link: "connecter tu conto de Facebook"
+ connect_to_facebook_link: "Connecter tu conto de Facebook"
hashtag_explanation: "Le #etiquettas permitte discuter e sequer tu interesses. Illos anque es un bon maniera de trovar nove personas in diaspora*."
hashtag_suggestions: "Tenta sequer etiquettas como #arte, #films, #gif, etc."
well_hello_there: "Salutationes a te!"
@@ -1062,7 +1162,7 @@ ia:
privacy_settings:
ignored_users: "Usatores ignorate"
no_user_ignored_message: "Tu non ignora usatores in iste momento."
- stop_ignoring: "Cessar de ignorar"
+ stop_ignoring: "Non plus ignorar"
strip_exif: "Remover le metadatos, p.ex. localitate, autor, modello de camera, de imagines incargate (recommendate)"
title: "Configuration de confidentialitate"
public:
diff --git a/config/locales/diaspora/id.yml b/config/locales/diaspora/id.yml
index 983e1daa1..3450de145 100644
--- a/config/locales/diaspora/id.yml
+++ b/config/locales/diaspora/id.yml
@@ -153,9 +153,6 @@ id:
invitation_codes:
not_valid: "Kode undangan sudah tidak valid."
invitations:
- a_facebook_user: "Seorang pengguna Facebook"
- check_token:
- not_found: "Token undangan tidak ditemukan"
create:
no_more: "Anda tidak dapat memberikan undangan lagi."
rejected: "Alamat email berikut bermasalah dengan: "
@@ -323,12 +320,6 @@ id:
type_error: "Pengunggahan foto gagal. Kamu yakin sudah menambahkan gambar?"
destroy:
notice: "Foto dihapus."
- new_photo:
- empty: "{file} kosong, mohon pilih berkas lagi tanpanya."
- invalid_ext: "ekstensi {file} tak valid. Hanya {extensions} yang diperbolehkan."
- size_error: "{file} terlalu besar, ukuran maksimal berkas adalah {sizeLimit}"
- show:
- show_original_post: "Perlihatkan kiriman asli"
posts:
show:
forbidden: "Kamu tidak boleh melakukannya"
diff --git a/config/locales/diaspora/is.yml b/config/locales/diaspora/is.yml
index 1944f1a7d..2fba0ed09 100644
--- a/config/locales/diaspora/is.yml
+++ b/config/locales/diaspora/is.yml
@@ -189,7 +189,6 @@ is:
private_profiles:
whats_in_profile_a: "Ferilskráin, staðsetning, kyn og fæðingardagur. Þetta eru allt hlutir sem eru neðst á Síðunni Þinni. Þú ræður hvort þú setur upplýsingar þar inn. Eingöngu einstaklingar sem þú hefur bætt í eina af þínum sýnum, og eru skráðir inn, geta séð þessar upplýsingar. Þegar þeir fara á síðuna þína geta þeir séð þau skeyti sem þú hefur deilt með öllum, sem og þau skeyti sem þú hefur valið að deila með sýnum sem þeir eru í."
invitations:
- a_facebook_user: "Facebook-notandi"
create:
no_more: "Ekki eru til fleiri boðsmiðar."
rejected: "Eftirfarandi netföng ollu vandræðum: "
@@ -360,14 +359,8 @@ is:
type_error: "Innsending á mynd mistókst. Ertu viss um að mynd hafi verið bætt við?"
destroy:
notice: "Mynd var eytt."
- new_photo:
- empty: "{file} skráin er tóm, veldu skrárnar aftur en slepptu þessari skrá."
- invalid_ext: "{file} er með ógilda skráarendingu. Aðeins {extensions} eru leyfðar."
- size_error: "{file} skráin er of stór, hámarksstærð er {sizeLimit}."
new_profile_photo:
upload: "Senda inn nýja forsíðumynd!"
- show:
- show_original_post: "Birta upprunalega færslu"
posts:
show:
photos_by:
diff --git a/config/locales/diaspora/it.yml b/config/locales/diaspora/it.yml
index afe098311..dd8c14359 100644
--- a/config/locales/diaspora/it.yml
+++ b/config/locales/diaspora/it.yml
@@ -197,7 +197,6 @@ it:
conversations:
create:
fail: "Messaggio non valido"
- no_contact: "Hey, devi prima aggiungere un contatto!"
sent: "Messaggio inviato"
index:
inbox: "In arrivo"
@@ -412,9 +411,6 @@ it:
tutorials: "Guide"
wiki: "wiki"
invitations:
- a_facebook_user: "Un utente Facebook"
- check_token:
- not_found: "Token di invito non trovato"
create:
empty: "Perfavore inserire almeno un indirizzo email."
no_more: "Non hai più inviti a disposizione"
@@ -607,14 +603,8 @@ it:
type_error: "Il caricamento della foto non è riuscito. Sei sicuro che fosse un'immagine?"
destroy:
notice: "Foto eliminata."
- new_photo:
- empty: "{file} è vuoto, per favore seleziona di nuovo i file senza includerlo."
- invalid_ext: "{file} ha un'estensione non valida. Sono permesse soltanto {extensions}."
- size_error: "{file} è troppo grande, la dimensione massima è {sizeLimit}."
new_profile_photo:
upload: "Carica una nuova foto nel profilo!"
- show:
- show_original_post: "Mostra il post originale"
posts:
presenter:
title: "Un post di %{name}"
diff --git a/config/locales/diaspora/ja.yml b/config/locales/diaspora/ja.yml
index 69442e62a..83dcb3aaf 100644
--- a/config/locales/diaspora/ja.yml
+++ b/config/locales/diaspora/ja.yml
@@ -10,7 +10,7 @@ ja:
_help: "ヘルプ"
_services: "サービス"
_statistics: "統計"
- _terms: "条件"
+ _terms: "規約"
account: "アカウント"
activerecord:
errors:
@@ -18,7 +18,7 @@ ja:
contact:
attributes:
person_id:
- taken: "このユーザの他の連絡先と重複してはいけません。"
+ taken: "このユーザーの他の連絡先と重複してはいけません。"
person:
attributes:
diaspora_handle:
@@ -38,7 +38,7 @@ ja:
reshare:
attributes:
root_guid:
- taken: "えっ? すでにこの投稿を共有しています!"
+ taken: "えっ? すでにこの投稿をシェアしています!"
user:
attributes:
email:
@@ -78,8 +78,8 @@ ja:
other: "%{count} 投稿"
zero: "投稿なし"
shares:
- other: "%{count} 共有"
- zero: "共有なし"
+ other: "%{count} シェア"
+ zero: "%{count} シェア"
tag_name: "タグ名: <b>%{name_tag}</b> 件数: <b>%{count_tag}</b>"
usage_statistic: "利用統計"
users:
@@ -243,7 +243,7 @@ ja:
no_contacts_message:
community_spotlight: "コミュニティスポットライト"
invite_link_text: "招待"
- or_spotlight: "または%{link}に共有することができます"
+ or_spotlight: "または%{link}にシェアすることができます"
try_adding_some_more_contacts: "もっと連絡先を検索または%{invite_link}できます。"
you_should_add_some_more_contacts: "もっと連絡先を追加しましょう!"
seed:
@@ -267,6 +267,8 @@ ja:
post_something: "ダイアスポラに投稿"
cancel: "取消"
comments:
+ create:
+ error: "コメントに失敗しました。"
new_comment:
comment: "コメント"
commenting: "コメント投稿中…"
@@ -280,7 +282,7 @@ ja:
no_contacts: "連絡先を追加する必要があるようです!"
no_contacts_in_aspect: "まだこのアスペクトに連絡先はありません。以下は、このアスペクトに追加することができる、既存の連絡先のリストです。"
no_contacts_message: "%{community_spotlight}をチェックアウトする"
- only_sharing_with_me: "自分だけに共有"
+ only_sharing_with_me: "自分だけにシェア"
start_a_conversation: "会話を開始する"
title: "連絡先"
user_search: "連絡先検索"
@@ -291,7 +293,6 @@ ja:
conversations:
create:
fail: "無効なメッセージです。"
- no_contact: "最初に連絡先を追加する必要があります!"
sent: "メッセージを送信しました"
destroy:
delete_success: "会話を正常に削除しました"
@@ -300,6 +301,7 @@ ja:
conversations_inbox: "会話 – 受信トレイ"
inbox: "受信トレイ"
new_conversation: "新しい会話"
+ no_contacts: "会話を開始する前に、連絡先を追加する必要があります"
no_messages: "メッセージがありません"
new:
message: "メッセージ"
@@ -324,16 +326,17 @@ ja:
delete: "削除"
email: "メール"
error_messages:
+ csrf_token_fail: "CSRFトークンが無効です。 サインインしてもう一度やり直してください。"
helper:
correct_the_following_errors_and_try_again: "次の問題を解決してからやり直してください。"
need_javascript: "このウェブサイトは正常に機能するためにJavaScriptが必要です。 JavaScriptを無効にした場合は、有効にしてこのページを更新してください。"
- fill_me_out: "記入して"
+ fill_me_out: "記入してください"
find_people: "人や #タグ を探す"
help:
account_and_data_management:
close_account_a: "設定ページの一番下に移動し、「アカウントを閉じる」ボタンをクリックします。手続きを完了するために、パスワードを入力するように求められます。覚えておいてください、アカウントを閉じた場合、そのポッドにあなたのユーザー名で再登録することは<strong>できません</strong>。"
close_account_q: "私の種子 (アカウント) を削除する方法は?"
- data_other_podmins_a: "あなたが別のポッドの誰かと共有されると、あなたが彼らと共有した投稿や、あなたのプロフィールデータのコピーがそのポッドにに保存 (キャッシュ) され、そのポッドのデータベース管理者にアクセス可能になります。あなたが投稿やプロフィールデータを削除すると、それはあなたのポッドから削除され、それが以前に保存されていた他のポッドに削除要求が送信されます。あなたの画像は、あなた自身のポッドを除き、保存されることはありません。そのリンクのみが、他のポッドに送信されます。"
+ data_other_podmins_a: "あなたが別のポッドの誰かとシェアされると、あなたが彼らとシェアした投稿や、あなたのプロフィールデータのコピーがそのポッドにに保存 (キャッシュ) され、そのポッドのデータベース管理者にアクセス可能になります。あなたが投稿やプロフィールデータを削除すると、それはあなたのポッドから削除され、それが以前に保存されていた他のポッドに削除要求が送信されます。あなたの画像は、あなた自身のポッドを除き、保存されることはありません。そのリンクのみが、他のポッドに送信されます。"
data_other_podmins_q: "他のポッドの管理者は、私の情報を見ることができますか?"
data_visible_to_podmin_a: "一言でいえば: すべて。ポッド間の通信は、常に (SSLとダイアスポラ*独自の転送の暗号化を使用して) 暗号化されていますが、ポッド上のストレージのデータは暗号化されていません。彼らが望めば、あなたのポッドのデータベース管理者 (通常、ポッドを実行している人) は、(ユーザーデータを格納するほとんどのウェブサイトのように) すべてのプロフィールデータとあなたが投稿したすべてにアクセスすることができます。あなたのデータを預けても十分に信頼できる管理者のポッドを選ぶことができるように、あなたがサインアップするポッドに選択肢を与えているのはこのためです。あなた独自のポッドを実行すると、データベースへのアクセスを制御することができるため、より高いプライバシーを提供します。"
data_visible_to_podmin_q: "私のポッド管理者はどのくらい私の情報を見ることができますか?"
@@ -355,7 +358,7 @@ ja:
person_multiple_aspects_q: "複数のアスペクトに人を追加することはできますか?"
post_multiple_aspects_a: "はい。投稿を作成しているときに、アスペクトセレクターボタンを使用して、アスペクトを選択または選択を解除します。 「全てのアスペクト」がデフォルトの設定です。あなたの投稿は、選択したすべてのアスペクトに表示されます。また、サイドバーで投稿したいアスペクトを選択することもできます。投稿するときに左側のリストで選択したアスペクトは、新しい投稿の作成を始めるとき、自動的にアスペクトセレクターで選択されます。"
post_multiple_aspects_q: "一度に複数のアスペクトに対してコンテンツを投稿することができますか?"
- remove_notification_a: "いいえ。すでに彼らと共有しているとき、さらに多くのアスペクトに彼らを追加する場合も通知されません。"
+ remove_notification_a: "いいえ。すでに彼らとシェアしているとき、さらに多くのアスペクトに彼らを追加する場合も通知されません。"
remove_notification_q: "誰かをあるアスペクトから、またはすべてのマイ アスペクトから削除した場合、これは彼らに通知されますか?"
rename_aspect_a: "ストリームビューからサイドバーにある「マイ アスペクト」をクリックして、名前を変更したいアスペクトの横にある鉛筆アイコンをクリックするるか、連絡先のページに移動し、関連するアスペクトを選択します。次に、このページの一番上にあるアスペクト名の横にある編集アイコンをクリックして、名前を変更して「更新」を押します。"
rename_aspect_q: "アスペクトの名前を変更する方法は?"
@@ -393,7 +396,7 @@ ja:
keyboard_shortcuts_li2: "k – 前の投稿へジャンプ"
keyboard_shortcuts_li3: "c – 現在の投稿にコメント"
keyboard_shortcuts_li4: "l – 現在の投稿にいいね!"
- keyboard_shortcuts_li5: "r – 現在の投稿を再共有"
+ keyboard_shortcuts_li5: "r – 現在の投稿をリシェア"
keyboard_shortcuts_li6: "m – 現在の投稿を展開"
keyboard_shortcuts_li7: "o – 現在の投稿内の最初のリンクを開く"
keyboard_shortcuts_li8: "Ctrl+Enter – 書いているメッセージを送信"
@@ -421,8 +424,8 @@ ja:
subscribe_feed_q: "誰かの公開の投稿をフィードリーダーで購読することはできますか?"
title: "その他"
pods:
- find_people_a: "友達をダイアスポラ*に参加するように招待したい場合は、サイドバーの招待リンクまたはメールリンクを使用します。#タグ をフォローして、あなたが興味のあるものを共有する他の人を発見して 、アスペクトにその興味があるものの投稿者を追加します。公開の投稿で #初めて と叫んでください。"
- find_people_q: "ポッドに参加したばかりです。どのように共有する人を見つけることができますか?"
+ find_people_a: "友達をダイアスポラ*に参加するように招待したい場合は、サイドバーの招待リンクまたはメールリンクを使用します。#タグ をフォローして、あなたが興味のあるものをシェアする他の人を発見して 、アスペクトにその興味があるものの投稿者を追加します。公開の投稿で #初めて と叫んでください。"
+ find_people_q: "ポッドに参加したばかりです。どのようにシェアする人を見つけることができますか?"
title: "ポッド"
use_search_box_a: "あなたが彼らの完全なダイアスポラ* ID (例 username@podname.org) を知っている場合は、それを検索して見つけることができます。あなたが同じポッド上にいる場合は、ユーザー名だけで検索することができます。別の方法としては、彼らのプロフィール名 (画面上に表示される名前) によって検索することができます。検索が最初に動作しない場合は、もう一度やり直してください。"
use_search_box_q: "検索ボックスを使用して特定の個人を見つける方法は?"
@@ -430,12 +433,12 @@ ja:
what_is_a_pod_q: "ポッドとは何ですか?"
posts_and_posting:
char_limit_services_a: "投稿を少ない文字数に制限する必要がある場合 (Twitter の場合は 140、Tumblr の場合は 1000)、およびそのサービスのアイコンがハイライトされているときには、使用するために残っている文字数が表示されます。投稿がその制限よりも長い場合でも、そのサービスに投稿することはできますが、それらのサービスとダイアスポラ*上の投稿へのリンクでテキストは切り捨てられます。"
- char_limit_services_q: "少ない文字数の提携サービスで投稿を共有している場合は?"
+ char_limit_services_q: "少ない文字数の提携サービスで投稿をシェアしている場合は?"
character_limit_a: "65,535文字。Twitter よりも 65,395 文字以上多いです! ;)"
character_limit_q: "投稿の文字数制限はいくつですか?"
embed_multimedia_a: "投稿の中に、普通に URL (例. http://www.youtube.com/watch?v=nnnnnnnnnnn ) を貼り付けるだけで、ビデオやオーディオが自動的に埋め込まれます。サポートされているサイトは次のようなものがあります: YouTube、Vimeo、SoundCloud、Flickr、など。ダイアスポラ*は、この機能のためにoEmbedを使用しています。私たちは、常により多くのメディアソースをサポートしています。常に、シンプルに、完全なリンクで投稿することを忘れないでください - 短縮リンクではなく、ベースURLの後のオペレーターでもなく - プレビューを見るため、投稿後にページを更新する前に少し時間を置きます。"
embed_multimedia_q: "投稿にビデオ、オーディオ、または他のマルチメディアコンテンツを埋め込む方法は?"
- format_text_a: "%{markdown} と呼ばれる簡略化したシステムを使用することによって。全てのマークダウン構文を %{here} で参照することができます。共有する前に、あなたのメッセージがどのように見えるかを参照することができるので、プレビューボタンはここでは本当に役に立ちます。"
+ format_text_a: "%{markdown} と呼ばれる簡略化したシステムを使用することによって。全てのマークダウン構文を %{here} で参照することができます。シェアする前に、あなたのメッセージがどのように見えるかを参照することができるので、プレビューボタンはここでは本当に役に立ちます。"
format_text_q: "自分の投稿内のテキストの書式 (太字、斜体など) を設定する方法は?"
hide_posts_a: "投稿の先頭にマウスを移動すると、X が右側に表示されます。それをクリックすると、投稿を非表示にして、それに関する通知をミュートします。それを投稿した人のプロフィールページを訪問すると、まだ投稿を見ることができます。"
hide_posts_q: "投稿を非表示にする方法は?"
@@ -457,38 +460,38 @@ ja:
size_of_images_a: "いいえ。ストリームまたはシングルポストビューに合わせて画像は自動的にリサイズされます。 マークダウン記法は、画像のサイズを指定するためのコードを持っていません。"
size_of_images_q: "投稿やコメント内の画像のサイズをカスタマイズすることはできますか?"
stream_full_of_posts_a1: "あなたのストリームは、3 種類の投稿で構成されています:"
- stream_full_of_posts_li1: "あなたと共有している人々による投稿は 2 種類あります: 公開の投稿と、あなたが含まれるアスペクトと共有した限定公開の投稿。これらの投稿をあなたのストリームから削除するには、単にその人との共有を止めます。"
+ stream_full_of_posts_li1: "あなたとシェアしている人々による投稿は 2 種類あります: 公開の投稿と、あなたが含まれるアスペクトとシェアした限定公開の投稿。これらの投稿をあなたのストリームから削除するには、単にその人とのシェアを止めます。"
stream_full_of_posts_li2: "あなたがフォローしているタグを含む公開の投稿。これらを削除するには、そのタグのフォローを止めます。"
stream_full_of_posts_li3: "コミュニティスポットライトに記載されている人々による公開の投稿。これらは設定のアカウントタブで、オプション「ストリームにコミュニティスポットライトを表示?」のチェックをオフにすることによって除外することができます。"
- stream_full_of_posts_q: "なぜ私のストリームが、知らない人や共有していない人からの投稿でいっぱいなのですか?"
+ stream_full_of_posts_q: "なぜ私のストリームが、知らない人やシェアしていない人からの投稿でいっぱいなのですか?"
title: "投稿"
private_posts:
can_comment_a: "非公開の投稿を行う前にそのアスペクトに配置されていた、ログインしているダイアスポラ*ユーザーのみがそれにコメントまたはいいね!することができます。"
can_comment_q: "非公開の投稿に、誰がコメントまたはいいね!することができますか?"
- can_reshare_a: "誰もいません。非公開の投稿は再共有できません。しかし、そのアスペクト内のログインしているダイアスポラ*ユーザーは、潜在的にコピーおよび貼り付けることができます。それらの人々を信頼するかどうかはあなた次第です!"
- can_reshare_q: "誰が私の非公開の投稿を再共有することができますか?"
- see_comment_a: "投稿を共有された人 (元の投稿者によって選択されたアスペクトにいる人) のみ、そのコメントやいいね!を見ることができます。 "
+ can_reshare_a: "誰もいません。非公開の投稿はリシェアできません。しかし、そのアスペクト内のログインしているダイアスポラ*ユーザーは、潜在的にコピーおよび貼り付けることができます。それらの人々を信頼するかどうかはあなた次第です!"
+ can_reshare_q: "誰が私の非公開の投稿をリシェアすることができますか?"
+ see_comment_a: "投稿をシェアされた人 (元の投稿者によって選択されたアスペクトにいる人) のみ、そのコメントやいいね!を見ることができます。 "
see_comment_q: "私が非公開の投稿にコメントまたはいいね!したとき、誰がそれを見ることができますか?"
title: "非公開の投稿"
who_sees_post_a: "非公開の投稿を行う前にそのアスペクトに配置されていた、ログインしているダイアスポラ*ユーザーのみがそれを見ることができます。"
who_sees_post_q: "アスペクトにメッセージを投稿すると (例 非公開の投稿)、誰がそれを見ることができますか?"
private_profiles:
title: "非公開プロフィール"
- whats_in_profile_a: "すべてのセクションを完了している場合、あなたの非公開プロフィールには、略歴、場所、性別、誕生日が含まれています。この情報はすべてオプションです - それを提供するかどうかはあなた次第です。あなたのアスペクトに追加したログインユーザーだけが、あなたの非公開プロフィールを見ることができます。彼らがあなたのプロフィールページにアクセスすると、彼らが含まれているアスペクトに対して行われた非公開の投稿も、あなたの公開の投稿に混じって表示されます。"
+ whats_in_profile_a: "すべてのセクションを完了している場合、あなたの非公開プロフィールには、略歴、所在地、性別、誕生日が含まれています。この情報はすべてオプションです - それを提供するかどうかはあなた次第です。あなたのアスペクトに追加したログインユーザーだけが、あなたの非公開プロフィールを見ることができます。彼らがあなたのプロフィールページにアクセスすると、彼らが含まれているアスペクトに対して行われた非公開の投稿も、あなたの公開の投稿に混じって表示されます。"
whats_in_profile_q: "私の非公開プロフィールには何がありますか?"
- who_sees_profile_a: "あなたと共有しているすべてのログインしたユーザー (あなたのアスペクトの一つに彼らを追加しているという意味)。しかし、あなたをフォローしていても、あなたがフォローしていない人は、あなたの公開情報が表示されるだけです。"
+ who_sees_profile_a: "あなたとシェアしているすべてのログインしたユーザー (あなたのアスペクトの一つに彼らを追加しているという意味)。しかし、あなたをフォローしていても、あなたがフォローしていない人は、あなたの公開情報が表示されるだけです。"
who_sees_profile_q: "誰が私の非公開プロフィールを見ますか?"
who_sees_updates_a: "あなたのアスペクトにいる誰もが、あなたの非公開プロフィールへの変更を見ています。 "
who_sees_updates_q: "私の非公開プロフィールへの更新を誰が見ますか?"
public_posts:
- can_comment_reshare_like_a: "すべてのログインしているダイアスポラ*ユーザーがコメントしたり、再共有したり、いいね!をすることができます。"
- can_comment_reshare_like_q: "誰が、私の公開の投稿をコメントしたり、再共有、いいね!することができますか?"
+ can_comment_reshare_like_a: "すべてのログインしているダイアスポラ*ユーザーがコメントしたり、リシェアしたり、いいね!をすることができます。"
+ can_comment_reshare_like_q: "誰が、私の公開の投稿をコメントしたり、リシェア、いいね!することができますか?"
deselect_aspect_posting_a: "アスペクトの選択を解除しても、公開の投稿には影響を与えません。公開されて、あなたの連絡先のすべてのストリームに表示されます。特定のアスペクトにのみ投稿が見えるようにするには、公開者の下のアスペクトセレクターからそのアスペクトを選択する必要があります。"
deselect_aspect_posting_q: "公開の投稿を行うときに、1 つまたは複数のアスペクトの選択を解除した場合はどうなりますか?"
find_public_post_a: "あなたの公開の投稿は、あなたをフォローしている誰かのストリームに表示されます。あなたが公開の投稿に #タグ を含めた場合、そのタグをフォローしているすべての人が自分のストリームであなたの投稿を見つけます。すべての公開の投稿は、ログインしていない場合でも、誰でも閲覧することができる特定の URL も持っています - そのため、公開の投稿は Twitter、ブログ、などから直接リンクすることができます。公開の投稿は、検索エンジンにインデックスされることもできます。"
find_public_post_q: "私の公開の投稿を他の人はどのように見つけますか?"
- see_comment_reshare_like_a: "公開の投稿のコメント、いいね!、および再共有もまた、公開されます。すべてのログインしているダイアスポラ*ユーザーと、インターネット上の誰でも公開の投稿とあなたのやり取りを見ることができます。"
- see_comment_reshare_like_q: "私が公開の投稿にコメントしたり、再共有、いいね!したとき、誰がそれを見ることができますか?"
+ see_comment_reshare_like_a: "公開の投稿のコメント、いいね!、およびリシェアもまた、公開されます。すべてのログインしているダイアスポラ*ユーザーと、インターネット上の誰でも公開の投稿とあなたのやり取りを見ることができます。"
+ see_comment_reshare_like_q: "私が公開の投稿にコメントしたり、リシェア、いいね!したとき、誰がそれを見ることができますか?"
title: "公開の投稿"
who_sees_post_a: "インターネットを使っている誰もがあなたが公開としてマークした投稿を参照する可能性があるので、あなたの投稿を本当に公開にしたいかを確認してください。世界に手を差し伸べる素晴らしい方法です。"
who_sees_post_q: "公開で何かを投稿すると、誰がそれを見ることができますか?"
@@ -503,32 +506,32 @@ ja:
who_sees_updates_a: "あなたのプロフィールページにアクセスすると、誰でも更新を見ることができます。"
who_sees_updates_q: "誰が私の公開プロフィールへの更新を見ていますか?"
resharing_posts:
- reshare_private_post_aspects_a: "いいえ。非公開の投稿を再共有することはできません。これが、特定のグループの人々とのみそれを共有した、元の投稿者の意向を尊重することです。"
- reshare_private_post_aspects_q: "非公開の投稿を、選択したアスペクトに再共有することはできますか?"
- reshare_public_post_aspects_a: "いいえ。公開の投稿を再共有すると、それは自動的にあなたの公開の投稿の一つになります。 それを特定のアスペクトと共有するには、新しい限定公開の投稿に投稿の内容をコピーおよび貼り付けします。"
- reshare_public_post_aspects_q: "公開の投稿を、選択したアスペクトに再共有することはできますか?"
- title: "投稿の再共有"
+ reshare_private_post_aspects_a: "いいえ。非公開の投稿をリシェアすることはできません。これが、特定のグループの人々とのみそれをシェアした、元の投稿者の意向を尊重することです。"
+ reshare_private_post_aspects_q: "非公開の投稿を、選択したアスペクトにリシェアすることはできますか?"
+ reshare_public_post_aspects_a: "いいえ。公開の投稿をリシェアすると、それは自動的にあなたの公開の投稿の一つになります。 それを特定のアスペクトとシェアするには、新しい限定公開の投稿に投稿の内容をコピーおよび貼り付けします。"
+ reshare_public_post_aspects_q: "公開の投稿を、選択したアスペクトにリシェアすることはできますか?"
+ title: "投稿のリシェア"
sharing:
add_to_aspect_a1: "エイミーがベンをアスペクトに追加し、ベンは (まだ) エイミーをアスペクトに追加していないとしましょう:"
- add_to_aspect_a2: "これは非対称の共有として知られています。もし、ベンもまた、アスペクトにエイミーを追加すると、お互いのストリームにエイミーとベンの両方公開の投稿や関連する非公開の投稿が表示され、相互共有になるでしょう。そして、エイミーはベンの非公開プロフィールを表示することができるでしょう。そして、彼らはお互いに非公開メッセージを送信することができるでしょう。"
- add_to_aspect_li1: "ベンは、エイミーがベンと「共有を開始した」という通知を受け取ります。"
+ add_to_aspect_a2: "これは非対称のシェアとして知られています。もし、ベンもまた、アスペクトにエイミーを追加すると、お互いのストリームにエイミーとベンの両方公開の投稿や関連する非公開の投稿が表示され、相互シェアになるでしょう。そして、エイミーはベンの非公開プロフィールを表示することができるでしょう。そして、彼らはお互いに非公開メッセージを送信することができるでしょう。"
+ add_to_aspect_li1: "ベンは、エイミーがベンと「シェアを開始した」という通知を受け取ります。"
add_to_aspect_li2: "エイミーは彼女のストリームに、ベンの公開の投稿の表示が始まります。"
add_to_aspect_li3: "エイミーは、ベンの非公開の投稿は表示されません。"
add_to_aspect_li4: "ベンは、彼のストリームにエイミーの公開または非公開の投稿は表示されません。"
add_to_aspect_li5: "ベンがエイミーのプロフィールページに移動した場合、彼には、エイミーが彼を配置しているアスペクトに行った非公開の投稿 (と同様に、誰でも見ることができる彼女の公開の投稿) が表示されます。"
- add_to_aspect_li6: "ベンはエイミーの非公開プロフィール (略歴、場所、性別、誕生日) を見ることができます。"
- add_to_aspect_li7: "エイミーは、ベンの連絡先ページの「自分だけに共有」の下に表示されます。"
+ add_to_aspect_li6: "ベンはエイミーの非公開プロフィール (略歴、所在地、性別、誕生日) を見ることができます。"
+ add_to_aspect_li7: "エイミーは、ベンの連絡先ページの「自分だけにシェア」の下に表示されます。"
add_to_aspect_li8: "エイミーもベンを@メンションすることができるようになります。"
add_to_aspect_q: "私のアスペクトの一つに誰かを追加すると、または誰かが彼らのアスペクトの一つに私を追加すると、どうなりますか?"
- list_not_sharing_a: "いいえ。しかし、彼らのプロフィールページを訪問して、その人があなたと共有しているかどうかを確認することができます。その場合、彼らが配置したアスペクトを示すボタンが緑色になり、ない場合は、それが灰色になるでしょう。"
+ list_not_sharing_a: "いいえ。しかし、彼らのプロフィールページを訪問して、その人があなたとシェアしているかどうかを確認することができます。その場合、彼らが配置したアスペクトを示すボタンが緑色になり、ない場合は、それが灰色になるでしょう。"
list_not_sharing_q: "私のアスペクトの一つに追加した人で、その人のアスペクトに私を追加していない人のリストはありますか?"
- only_sharing_a: "これらは、自分のアスペクトの一つにあなたを追加した人ですが、あなたのアスペクトのいずれにも (まだ) いない人です。言い換えれば、彼らはあなたと共有していますが、あなたは彼らと共有していません: 彼らを、あなたを「フォローしている」人と考えることができます。あなたがアスペクトに彼らを追加した場合、その後、「自分だけに共有」ではなくアスペクトの下に表示されます。上記を参照してください。"
- only_sharing_q: "私の連絡先ページの「自分だけに共有」の下にリストされている人は誰ですか?"
+ only_sharing_a: "これらは、自分のアスペクトの一つにあなたを追加した人ですが、あなたのアスペクトのいずれにも (まだ) いない人です。言い換えれば、彼らはあなたとシェアしていますが、あなたは彼らとシェアしていません: 彼らを、あなたを「フォローしている」人と考えることができます。あなたがアスペクトに彼らを追加した場合、その後、「自分だけにシェア」ではなくアスペクトの下に表示されます。上記を参照してください。"
+ only_sharing_q: "私の連絡先ページの「自分だけにシェア」の下にリストされている人は誰ですか?"
see_old_posts_a: "いいえ。彼らは、そのアスペクトへの新しい投稿のみを見ることができます。彼ら (および他の誰でも) あなたのプロフィールページであなたの古い公開の投稿を見ることができ、また、彼らのストリームでもそれらを見ることができます。"
see_old_posts_q: "私が誰かをアスペクトに追加すると、彼らは私がすでにそのアスペクトに投稿している古い投稿を見ることができますか?"
- sharing_notification_a: "誰かがあなたと共有を始めるたびに、あなたは通知を受信するはずです。"
- sharing_notification_q: "誰かが私と共有を始めたとき、どのように私がそれを知りますか?"
- title: "共有"
+ sharing_notification_a: "誰かがあなたとシェアを始めるたびに、あなたは通知を受信するはずです。"
+ sharing_notification_q: "誰かが私とシェアを始めたとき、どのように私がそれを知りますか?"
+ title: "シェア"
tags:
filter_tags_a: "これは、まだ直接ダイアスポラ*を通して利用できませんが、いくつかの %{third_party_tools} がこれを提供するために作成されています。"
filter_tags_q: "私のストリームからいくつかのタグをフィルター/除外することはできますか?"
@@ -549,15 +552,14 @@ ja:
home:
default:
be_who_you_want_to_be: "あなたがなりたい人になる"
- be_who_you_want_to_be_info: "多くのネットワークは、あなたが実名を使用することを主張しています。ダイアスポラ*はそうではありません。ここでは、あなたがなりたい人を選んで、自分自身についてたくさん、あるいは少しだけ、あなたが望むように共有することができます。あなたが他の人と対話する方法は、本当にあなた次第です。"
+ be_who_you_want_to_be_info: "多くのネットワークは、あなたが実名を使用することを主張しています。ダイアスポラ*はそうではありません。ここでは、あなたがなりたい人を選んで、自分自身についてたくさん、あるいは少しだけ、あなたが望むようにシェアすることができます。あなたが他の人と対話する方法は、本当にあなた次第です。"
byline: "あなたがコントロールしているオンラインソーシャルの世界"
choose_your_audience: "観客を選択"
- choose_your_audience_info: "ダイアスポラ*のアスペクトは、あなたが希望する人たちとだけ共有することができます。あなたが好きなように公開にも非公開にもすることができます。世界中と面白い写真を、または親しい友人とだけ深い秘密を共有します。あなたがコントロールします。"
+ choose_your_audience_info: "ダイアスポラ*のアスペクトは、あなたが希望する人たちとだけシェアすることができます。あなたが好きなように公開にも非公開にもすることができます。世界中と面白い写真を、または親しい友人とだけ深い秘密をシェアします。あなたがコントロールします。"
headline: "%{pod_name}にようこそ"
own_your_data: "あなた自身のデータを所有する"
- own_your_data_info: "多くのネットワークはあなたのデータを使用して、あなたのやり取りを分析することでお金を稼ぎます。そして、この情報を使用して、物を宣伝します。ダイアスポラ*は、あなたが他のユーザーと接続して、共有することを可能にする以外の目的のために、あなたのデータを使用しません。"
+ own_your_data_info: "多くのネットワークはあなたのデータを使用して、あなたのやり取りを分析することでお金を稼ぎます。そして、この情報を使用して、物を宣伝します。ダイアスポラ*は、あなたが他のユーザーと接続して、シェアすることを可能にする以外の目的のために、あなたのデータを使用しません。"
podmin:
- admin_panel: "管理者用パネル"
byline: "インターネットを変更しようとしています。セットアップを始めますか?"
configuration_info: "お好みのテキストエディタで %{database_path} と %{diaspora_path} を開いて、慎重にレビューしてください。広範囲にコメントしています。"
configure_your_pod: "あなたのポッドを設定"
@@ -577,12 +579,11 @@ ja:
update_your_pod: "ポッドを更新"
update_your_pod_info: "%{update_instructions}を見つけることができます。"
invitation_codes:
+ already_logged_in: "あなたは%{inviter}によってこのポッドに参加するように招待されましたが、すでにログインしています。"
not_valid: "その招待コードは、もはや有効ではありません"
invitations:
- a_facebook_user: "Facebookユーザー"
- check_token:
- not_found: "招待トークンが見つかりません。"
create:
+ closed: "このダイアスポラ* ポッドへの招待を締め切らせて頂いています。"
empty: "少なくとも1つのEメールアドレスを入力してください。"
no_more: "招待権がもう残っていません。"
note_already_sent: "招待状はすでにに送信しました: %{emails}"
@@ -595,7 +596,7 @@ ja:
comma_separated_plz: "コンマ区切りで複数のメールアドレスを入力できます。"
invite_someone_to_join: "知り合いをダイアスポラ*に招待しましょう!"
language: "言語"
- paste_link: "友達とこのリンクを共有してダイアスポラ*に招待するか、直接リンクをメールで送ります。"
+ paste_link: "友達とこのリンクをシェアしてダイアスポラ*に招待するか、直接リンクをメールで送ります。"
send_an_invitation: "招待を送信する"
sending_invitation: "招待を送信中..."
layouts:
@@ -614,112 +615,72 @@ ja:
profile: "プロフィール"
settings: "設定"
toggle_navigation: "ナビゲーションの切り替え"
+ likes:
+ create:
+ error: "いいね!に失敗しました。"
limited: "限定公開"
more: "続き"
no_results: "結果が見つかりません"
notifications:
also_commented:
- few: "%{actors} also commented on %{post_author}'s %{post_link}."
- many: "%{actors} also commented on %{post_author}'s %{post_link}."
- one: "%{actors} also commented on %{post_author}'s %{post_link}."
other: "%{actors}さんは%{post_author}さんの投稿%{post_link}もコメントしました。"
- two: "%{actors} also commented on %{post_author}'s %{post_link}."
zero: "%{actors}さんは%{post_author}さんの投稿%{post_link}もコメントしました。"
also_commented_deleted:
- few: "%{actors} commented on a deleted post."
- many: "%{actors} commented on a deleted post."
- one: "%{actors} commented on a deleted post."
other: "%{actors}さんが削除された投稿にコメントしました。"
- two: "%{actors} commented on a deleted post."
zero: "%{actors}さんが削除された投稿にコメントしました。"
comment_on_post:
- few: "%{actors} commented on your %{post_link}."
- many: "%{actors} commented on your %{post_link}."
- one: "%{actors} commented on your %{post_link}."
other: "%{actors}さんが投稿%{post_link}にコメントしました。"
- two: "%{actors} commented on your %{post_link}."
zero: "%{actors}さんが投稿%{post_link}にコメントしました。"
index:
all_notifications: "すべての通知"
also_commented: "コメントも"
- and: "又は"
+ and: "および"
and_others:
- few: "and %{count} others"
- many: "and %{count} others"
- one: "and one more"
other: "そして他に %{count} 人"
- two: "and %{count} others"
zero: "そして他にはいません"
comment_on_post: "投稿にコメント"
liked: "いいね!しました"
- mark_all_as_read: "全件を既読にする"
+ mark_all_as_read: "すべて既読にする"
mark_all_shown_as_read: "表示をすべて既読としてマーク"
mark_read: "既読にする"
mark_unread: "未読にする"
mentioned: "メンションされました"
+ mentioned_in_comment: "コメントでメンションしました"
no_notifications: "まだ通知は何もありません"
notifications: "通知"
- reshared: "再共有しました"
- show_all: "全件表示"
+ reshared: "リシェアしました"
+ show_all: "すべて表示"
show_unread: "未開封メッセージを表示"
- started_sharing: "共有を開始しました"
+ started_sharing: "シェアを開始しました"
liked:
- few: "%{actors} has just liked your %{post_link}."
- many: "%{actors} has just liked your %{post_link}."
- one: "%{actors} has just liked your %{post_link}."
other: "%{actors}さんが投稿%{post_link}にいいね!しました。"
- two: "%{actors} has just liked your %{post_link}."
zero: "%{actors}さんが投稿%{post_link}にいいね!しました。"
liked_post_deleted:
- few: "%{actors} liked your deleted post."
- many: "%{actors} liked your deleted post."
- one: "%{actors} liked your deleted post."
other: "%{actors}さんが削除された投稿にいいね!しました。"
- two: "%{actors} liked your deleted post."
zero: "%{actors}さんが削除された投稿にいいね!しました。"
mentioned:
- few: "%{actors} has mentioned you in a %{post_link}."
- many: "%{actors} has mentioned you in a %{post_link}."
- one: "%{actors} has mentioned you in a %{post_link}."
other: "%{actors}さんが%{post_link}であなたにメンションしました。"
- two: "%{actors} has mentioned you in a %{post_link}."
zero: "%{actors}さんが%{post_link}であなたにメンションしました。"
mentioned_deleted:
- few: "%{actors} mentioned you in a deleted post."
- many: "%{actors} mentioned you in a deleted post."
- one: "%{actors} mentioned you in a deleted post."
other: "%{actors}さんが削除された投稿であなたにメンションしました。"
- two: "%{actors} mentioned you in a deleted post."
zero: "%{actors}さんが削除された投稿であなたにメンションしました。"
+ mentioned_in_comment:
+ other: "%{actors} が、投稿 %{post_link} に <a href='%{comment_path}'>コメント</a> でメンションしました。"
+ mentioned_in_comment_deleted:
+ other: "%{actors} が、削除したコメントでメンションしました。"
post: "(投稿で)"
private_message:
- few: "%{actors} sent you a message."
- many: "%{actors} sent you a message."
- one: "%{actors} sent you a message."
other: "%{actors}さんが、あなたにメッセージを送信しました。"
- two: "%{actors} sent you a message."
zero: "%{actors}さんが、あなたにメッセージを送信しました。"
reshared:
- few: "%{actors} has reshared your %{post_link}."
- many: "%{actors} has reshared your %{post_link}."
- one: "%{actors} has reshared your %{post_link}."
- other: "%{actors}さんが投稿%{post_link}を再共有しました。"
- two: "%{actors} has reshared your %{post_link}."
- zero: "%{actors}さんが投稿%{post_link}を再共有しました。"
+ other: "%{actors}さんが投稿%{post_link}をリシェアしました。"
+ zero: "%{actors}さんが投稿%{post_link}をリシェアしました。"
reshared_post_deleted:
- few: "%{actors} reshared your deleted post."
- many: "%{actors} reshared your deleted post."
- one: "%{actors} reshared your deleted post."
- other: "%{actors}さんが削除された投稿を再共有しました。"
- two: "%{actors} reshared your deleted post."
- zero: "%{actors}さんが削除された投稿を再共有しました。"
+ other: "%{actors}さんが削除された投稿をリシェアしました。"
+ zero: "%{actors}さんが削除された投稿をリシェアしました。"
started_sharing:
- few: "%{actors} started sharing with you."
- many: "%{actors} started sharing with you."
- one: "%{actors} started sharing with you."
- other: "%{actors}さんが、あなたと共有を始めました。"
- two: "%{actors} started sharing with you."
- zero: "%{actors}さんが、あなたと共有を始めました。"
+ other: "%{actors}さんが、あなたとシェアを始めました。"
+ zero: "%{actors}さんが、あなたとシェアを始めました。"
notifier:
a_limited_post_comment: "あなたが確認する、ダイアスポラ*の制限公開の投稿に新しいコメントがあります。"
a_post_you_shared: "投稿"
@@ -733,6 +694,29 @@ ja:
confirm_email:
click_link: "新しいメールアドレス %{unconfirmed_email} を有効にするために、このリンクをクリックしてください:"
subject: "新しいメールアドレス %{unconfirmed_email} を有効にしてください"
+ csrf_token_fail:
+ body: |-
+ %{name} さん、こんにちは
+
+ ダイアスポラ* が、あなたのセッションへのアクセスを検知しましたが、これは不正な可能性があります。 これは完全に無実かもしれませんが、クロスサイトリクエストフォージェリ (CSRF) の可能性があります。 データが侵害される可能性を避けるために、あなたはログアウトしています。
+
+ 不適切または欠落しているCSRFトークンを使用して行われたリクエストは、以下のような原因が考えられます:
+
+ - リクエストを操作するか、トークンなしでリクエストを行うアドオン。
+ - 過去のセッションで開いたタブ。
+ - あなたの許可の有無にかかわらず、リクエストを行う別のウェブサイト。
+ - さまざまな他の外部ツール。
+ - あなたのデータにアクセスしようとしている悪質なコード。
+
+ CSRFの詳細については、 [%{link}](%{link}) を参照してください。
+
+ 心配しないでください。 今すぐもう一度安全にサインインすることができます。
+
+ このメッセージが繰り返し表示される場合は、ブラウザのアドオンを含め、上記の点を確認してください。
+
+ ありがとうございました、
+ ダイアスポラ* メールロボット!
+ subject: "あなたのアカウント %{name} から、不正なリクエストを受け取りました。"
email_sent_by_diaspora: "このEメールは%{pod_name}から送信されました。もしこのようなEメールの受信を拒否したい場合は、"
export_email:
body: |-
@@ -804,6 +788,9 @@ ja:
mentioned:
limited_post: "あなたは限定公開の投稿でメンションされました。"
subject: "%{name}さんはダイアスポラ*であなたをメンションしました。"
+ mentioned_in_comment:
+ limited_post: "限定公開の投稿にコメントでメンションされました。"
+ reply: "この会話に返信、または表示 >"
private_message:
reply_to_or_view: "この会話に返信、または表示 >"
subject: "あなたに新しい非公開メッセージがあります"
@@ -846,14 +833,14 @@ ja:
comment: "コメント"
post: "投稿"
reshared:
- reshared: "%{name}さんがあなたの投稿を再共有しました"
+ reshared: "%{name}さんがあなたの投稿をリシェアしました"
view_post: "投稿を見る >"
single_admin:
admin: "ダイアスポラ*管理者"
subject: "ダイアスポラ*アカウントの重要なお知らせ:"
started_sharing:
- sharing: "あなたへの共有を開始しています!"
- subject: "%{name}さんがダイアスポラ*であなたと共有を始めました"
+ sharing: "あなたへのシェアを開始しています!"
+ subject: "%{name}さんがダイアスポラ*であなたとシェアを始めました"
view_profile: "%{name}さんのプロフィールを見る"
thanks: "ありがとうございます。"
to_change_your_notification_settings: "通知設定を変更します"
@@ -867,7 +854,7 @@ ja:
looking_for: "タグ%{tag_link}の付いた投稿をお探しですか?"
no_one_found: "…1人も見つかりませんでした。"
no_results: "何かを検索しないといけません。"
- results_for: "検索結果:"
+ results_for: "%{search_term} に一致するユーザー"
search_handle: "友達を見つけるために彼らのダイアスポラ* ID (username@pod.tld) を使用していることを確認してください。"
searching: "検索中です。もうしばらくお待ちください..."
send_invite: "まだ見つかりませんか?招待を送信しましょう!"
@@ -881,7 +868,7 @@ ja:
show:
closed_account: "このアカウントは削除されています"
does_not_exist: "存在しない連絡先です!"
- has_not_shared_with_you_yet: "%{name}さんはまだあなたにどの投稿も共有していません!"
+ has_not_shared_with_you_yet: "%{name}さんはまだあなたにどの投稿もシェアしていません!"
photos:
create:
integrity_error: "写真のアップロードに失敗しました。確かに画像ファイルだったのでしょうか。"
@@ -889,14 +876,8 @@ ja:
type_error: "写真のアップロードに失敗しました。確かに画像ファイルを添付しましたか。"
destroy:
notice: "写真を削除しました。"
- new_photo:
- empty: "{file}は空です。取り除いてファイルを選択しなおしてください。"
- invalid_ext: "{file}のファイル名は不正です。{extensions}以外の拡張子は使えません。"
- size_error: "{file}は大きすぎます。ファイルサイズの上限は{sizeLimit}です。"
new_profile_photo:
- upload: "新しいプロフィール写真をアップロードする!"
- show:
- show_original_post: "元の投稿を表示する"
+ upload: "新しいプロフィール写真をアップロードしてください!"
polls:
votes:
other: "これまで %{count} の投票"
@@ -908,31 +889,27 @@ ja:
forbidden: "この操作は許可されていません"
location: "%{location} から投稿"
photos_by:
- few: "%{count} photos by %{author}"
- many: "%{count} photos by %{author}"
- one: "One photo by %{author}"
other: "%{author}さんの写真%{count}枚"
- two: "Two photos by %{author}"
zero: "%{author}さんの写真はありません"
- reshare_by: "%{author}さんが再共有"
+ reshare_by: "%{author}さんがリシェア"
privacy: "プライバシー"
profile: "プロフィール"
profiles:
edit:
- allow_search: "ダイアスポラ内の検索を許可します"
- basic: "私の基本プロフィール"
+ allow_search: "ダイアスポラ*内の検索を許可する"
+ basic: "自分の基本プロフィール"
basic_hint: "あなたのプロフィール内のすべての項目は省略可能です。あなたの基本的なプロフィールは、常に公開されます。"
- extended: "私の拡張プロフィール"
- extended_hint: "スイッチをクリックして、あなたの拡張プロフィールデータの表示を設定します。公開は、インターネットに表示されることを意味します。限定公開は、あなたと共有する人だけにこの情報が表示されることを意味します。"
- extended_visibility_text: "あなたの拡張プロフィールの表示:"
+ extended: "自分の拡張プロフィール"
+ extended_hint: "スイッチをクリックして、あなたの拡張プロフィールデータの表示を設定します。公開は、インターネットに表示されることを意味します。限定公開は、あなたとシェアする人だけにこの情報が表示されることを意味します。"
+ extended_visibility_text: "拡張プロフィールを表示:"
first_name: "名"
last_name: "姓"
limited: "限定公開"
- nsfw_check: "私が共有するすべてのものを NSFW としてマーク"
- nsfw_explanation: "NSFW (「閲覧注意」) は、仕事中に見るのに適しない可能性があるコンテンツの、ダイアスポラ*自主管理コミュニティ標準です。頻繁にこのような素材を共有する場合、それらを表示することを選択しない限り、あなたが共有するすべてのものが人々のストリームから表示されないように、このオプションをチェックしてください。"
- nsfw_explanation2: "このオプションを選択しない場合、このような素材を共有するたびに #nsfw タグを追加してください。"
+ nsfw_check: "私がシェアするすべてのものを NSFW としてマーク"
+ nsfw_explanation: "NSFW (「閲覧注意」) は、仕事中に見るのに適しない可能性があるコンテンツの、ダイアスポラ*自主管理コミュニティ標準です。頻繁にこのような素材をシェアする場合、それらを表示することを選択しない限り、あなたがシェアするすべてのものが人々のストリームから表示されないように、このオプションをチェックしてください。"
+ nsfw_explanation2: "このオプションを選択しない場合、このような素材をシェアするたびに #nsfw タグを追加してください。"
public: "公開"
- settings: "プロフィールの設定"
+ settings: "プロフィール設定"
update_profile: "プロフィール更新"
your_bio: "略歴"
your_birthday: "誕生日"
@@ -947,11 +924,7 @@ ja:
updated: "プロフィールを更新しました"
public: "公開"
reactions:
- few: "%{count} reactions"
- many: "%{count} reactions"
- one: "1 reaction"
other: "%{count} リアクション"
- two: "%{count} reactions"
zero: "0 リアクション"
registrations:
closed: "このダイアスポラ*ポッドでは新規登録を受け付けていません。"
@@ -963,14 +936,14 @@ ja:
enter_email: "メールアドレスを入力してください。"
enter_password: "パスワードを入力してください。"
enter_password_again: "もう一度同じパスワードを入力してください。"
- enter_username: "ユーザ名を選択してください。(半角英数字とアンダーバーのみ)"
+ enter_username: "ユーザー名を選択してください。 (半角英数字とアンダーバーのみ)"
password: "パスワード"
password_confirmation: "パスワードの確認"
sign_up: "登録"
submitting: "送信中..."
terms: "アカウントを作成することによって、あなたは%{terms_link}に同意します。"
terms_link: "利用規約"
- username: "ユーザ名"
+ username: "ユーザー名"
report:
comment_label: "<b>コメント</b>:<br>%{data}"
confirm_deletion: "項目を削除してもよろしいですか?"
@@ -985,12 +958,17 @@ ja:
destroyed: "投稿が破壊されました"
failed: "何か問題があります"
title: "報告の概要"
+ unreviewed_reports:
+ other: "%{count} 件の未確認の報告があります。"
+ zero: "未確認の報告はありません。"
reshares:
- comment_email_subject: "%{author}の投稿の%{resharer}の再共有"
+ comment_email_subject: "%{author}の投稿の%{resharer}のリシェア"
+ create:
+ error: "リシェアに失敗しました。"
reshare:
deleted: "元の投稿は作者によって削除されました。"
- reshare_confirmation: "%{author}さんの投稿を再共有しますか?"
- reshared_via: "...で再共有"
+ reshare_confirmation: "%{author}さんの投稿をリシェアしますか?"
+ reshared_via: "リシェア..."
search: "検索"
services:
create:
@@ -1006,12 +984,12 @@ ja:
connect: "接続"
disconnect: "切断"
edit_services: "サービスを編集する"
- logged_in_as: "ログイン済みユーザ名:"
+ logged_in_as: "%{nickname}としてログインしています。"
no_services_available: "このポッドで利用可能なサービスはありません。"
not_logged_in: "現在ログインしていません。"
- really_disconnect: "%{service}から切断しますか。"
- services_explanation: "サードパーティの共有サービスに接続すると、ダイアスポラ*に書きながらそれらに投稿を公開することができます。"
- share_to: "%{provider}に共有"
+ really_disconnect: "%{service}から切断しますか?"
+ services_explanation: "サードパーティのシェアサービスに接続すると、ダイアスポラ*に書きながらそれらに投稿を公開することができます。"
+ share_to: "%{provider}にシェア"
title: "提携サービスを管理する"
provider:
facebook: "Facebook"
@@ -1024,25 +1002,21 @@ ja:
mobile_row_checked: "%{name} (削除)"
mobile_row_unchecked: "%{name} (追加)"
toggle:
- few: "In %{count} aspects"
- many: "In %{count} aspects"
- one: "In %{count} aspect"
other: "%{count} のアスペクトで"
- two: "In %{count} aspects"
zero: "%{count} のアスペクトで"
invitations:
by_email: "メールで"
- invite_your_friends: "知り合いを検索する"
+ invite_your_friends: "友達を招待する"
invites: "招待"
- share_this: "このリンクをメールやブログ、お気に入りのSNSで共有しましょう!"
+ share_this: "このリンクをメールやブログ、お気に入りのSNSでシェアしましょう!"
public_explain:
atom_feed: "Atom フィード"
control_your_audience: "観客をコントロール"
logged_in: "%{service}へログインしました。"
manage: "提携サービスを管理する"
- new_user_welcome_message: "あなたの投稿を分類し、あなたが興味があるものを共有する人を見つけるために、#ハッシュタグ を使用します。 @メンション で素晴らしい人々を呼び出します"
+ new_user_welcome_message: "あなたの投稿を分類し、あなたが興味があるものをシェアする人を見つけるために、#ハッシュタグ を使用します。 @メンション で素晴らしい人々に呼びかけます"
outside: "公開投稿はダイアスポラ外の人にも表示されます。"
- share: "共有"
+ share: "シェア"
title: "提携サービスを設定する"
visibility_dropdown: "このドロップダウンを使用して、投稿の表示を変更します。 (この最初の1つを公開することをご提案します。)"
publisher:
@@ -1057,8 +1031,8 @@ ja:
poll:
add_a_poll: "投票を追加"
posting: "投稿中"
- remove_location: "場所を削除"
- share: "共有"
+ remove_location: "所在地を削除"
+ share: "シェア"
upload_photos: "写真をアップロード"
whats_on_your_mind: "いま何を考えている?"
stream_element:
@@ -1135,7 +1109,7 @@ ja:
tagged_people:
other: "%{count} 人が %{tag} でタグ付けしています"
zero: "誰も %{tag} でタグ付けしていません"
- username: "ユーザ名"
+ username: "ユーザー名"
users:
confirm_email:
email_confirmed: "メール %{email} を有効にしました"
@@ -1146,14 +1120,14 @@ ja:
wrong_password: "パスワードが一致しません。"
edit:
also_commented: "他の人も連絡先の投稿にコメントしたとき"
- auto_follow_aspect: "あなたが自動的に共有するユーザーのアスペクト:"
- auto_follow_back: "あなたと共有を始めたユーザーと、自動的に共有"
+ auto_follow_aspect: "あなたが自動的にシェアするユーザーのアスペクト:"
+ auto_follow_back: "あなたとシェアを始めたユーザーと、自動的にシェア"
change: "変更"
change_color_theme: "色のテーマを変更"
- change_email: "Change E-Mail"
+ change_email: "メールを変更"
change_language: "言語変更"
change_password: "パスワード変更"
- character_minimum_expl: "少なくとも6字以上でなければいけません。"
+ character_minimum_expl: "6字以上にする必要があります。"
close_account:
dont_go: "行かないでください!"
lock_username: "ユーザー名はロックされます。このポッド上で、同じIDのアカウントを作ることはできません。"
@@ -1166,6 +1140,7 @@ ja:
comment_on_post: "自分の投稿にコメントがあったとき"
current_password: "現在のパスワード"
current_password_expl: "サインインしているもの..."
+ default_post_visibility: "投稿のために選択されるデフォルトのアスペクト"
download_export: "マイ プロフィールをダウンロード"
download_export_photos: "写真をダウンロードする"
edit_account: "アカウント編集"
@@ -1175,8 +1150,9 @@ ja:
export_photos_in_progress: "現在、写真を処理しています。しばらくしてから、戻って確認してください。"
following: "フォロー設定"
last_exported_at: "(最終更新 %{timestamp})"
- liked: "誰かがあなたの投稿をいいね!しました"
+ liked: "あなたの投稿をいいね!したとき"
mentioned: "投稿に自分がメンションされたとき"
+ mentioned_in_comment: "コメントでメンションされました"
new_password: "新しいパスワード"
private_message: "非公開メッセージが届いたとき"
receive_email_notifications: "通知メールの送信設定"
@@ -1184,15 +1160,15 @@ ja:
request_export_photos: "写真をリクエスト"
request_export_photos_update: "写真を更新"
request_export_update: "マイ プロフィールのデータを更新"
- reshared: "誰かがあなたの投稿を再共有しました"
+ reshared: "あなたの投稿をリシェアしたとき"
show_community_spotlight: "ストリームに「コミュニティスポットライト」を表示"
show_getting_started: "「はじめに」のヒントを表示"
someone_reported: "誰かが報告を送信"
- started_sharing: "誰かがあなたと共有を始めました"
+ started_sharing: "あなたとシェアを始めたとき"
stream_preferences: "ストリーム設定"
your_email: "メールアドレス"
your_email_private: "あなたのメールアドレスは、他のユーザーが見ることはありません"
- your_handle: "ダイアスポラのユーザ名"
+ your_handle: "ダイアスポラ* ID"
getting_started:
awesome_take_me_to_diaspora: "素晴らしい!私をダイアスポラ*に連れてって"
community_welcome: "あなたに加わっていただいて、ダイアスポラ*のコミュニティは幸せです!"
@@ -1210,7 +1186,7 @@ ja:
strip_exif: "アップロードした画像から場所、作成者、カメラモデルなどのメタデータを除去する (推奨)"
title: "プライバシー設定"
public:
- does_not_exist: "ユーザ名「%{username}」は存在しません。"
+ does_not_exist: "ユーザー %{username} は存在しません!"
update:
color_theme_changed: "色のテーマを正常に変更しました。"
color_theme_not_changed: "色のテーマを変更中にエラーが発生しました。"
diff --git a/config/locales/diaspora/ka.yml b/config/locales/diaspora/ka.yml
index ad0f02224..d1caa470a 100644
--- a/config/locales/diaspora/ka.yml
+++ b/config/locales/diaspora/ka.yml
@@ -156,9 +156,6 @@ ka:
fill_me_out: "შევსება"
find_people: "იპოვეთ ადამიანები ან #ტეგები"
invitations:
- a_facebook_user: "Facebook-ის მომხმარებელი"
- check_token:
- not_found: "მოწვევა არ არის ნაპოვნი"
create:
no_more: "თქვენ ამოგეწურათ მოსაწვევები."
rejected: "შემდეგ ელ-ფოსტებს აქვთ პრობლემა: "
@@ -327,14 +324,8 @@ ka:
type_error: "ფოტოს ატვირთვა ვერ მოხერხდა. დარწმუნებული ხარ რომ სურათი დაამატე?"
destroy:
notice: "სურათი წაშლილია."
- new_photo:
- empty: "{file} არის ცარიელი, გთხოვთ აირჩიოთ ფაილები მის გარეშე"
- invalid_ext: "{file} აქვს არასწორი გაფართოება. მხოლოდ {extensions} გაფართოებები არის დაშვებული."
- size_error: "{file} ზომაზე დიდია, მაქსიმალური ზომა არის {sizeLimit}."
new_profile_photo:
upload: "ახალი პროფილის ფოტოს ატვირთვა!"
- show:
- show_original_post: "ორიგინალი პოსტის ჩვენება"
posts:
show:
photos_by:
diff --git a/config/locales/diaspora/ko.yml b/config/locales/diaspora/ko.yml
index b39326bef..759972cad 100644
--- a/config/locales/diaspora/ko.yml
+++ b/config/locales/diaspora/ko.yml
@@ -182,7 +182,6 @@ ko:
conversations:
create:
fail: "유효하지 않은 쪽지"
- no_contact: "컨택부터 추가하세요!"
sent: "쪽지를 보냈습니다"
index:
conversations_inbox: "대화 - 수신함"
@@ -241,9 +240,6 @@ ko:
tutorials: "간단 설명서"
wiki: "위키"
invitations:
- a_facebook_user: "페이스북 사욤자"
- check_token:
- not_found: "초대장 토큰을 찾을 수 없습니다"
create:
empty: "이메일 주소를 한 개 이상 입력해주세요."
no_more: "가진 초대장이 없습니다."
@@ -422,14 +418,8 @@ ko:
type_error: "사진 업로드 실패. 이미지를 추가하지 않았습니다."
destroy:
notice: "사진을 지웠습니다."
- new_photo:
- empty: "{file} 파일은 빈 파일입니다. 이 파일만 빼고 다시 시도하세요."
- invalid_ext: "{file} 파일은 유효하지 않은 형식입니다. {extensions} 형식의 파일을 올려주세요."
- size_error: "{file} 파일이 {sizeLimit} 보다 큽니다"
new_profile_photo:
upload: "새 프로필 사진 업로드하기!"
- show:
- show_original_post: "원래 게시물 보기"
posts:
presenter:
title: "%{name}님의 게시물"
diff --git a/config/locales/diaspora/lt.yml b/config/locales/diaspora/lt.yml
index 8d56031ce..2a26ff209 100644
--- a/config/locales/diaspora/lt.yml
+++ b/config/locales/diaspora/lt.yml
@@ -148,9 +148,6 @@ lt:
fill_me_out: "Užpildykite"
find_people: "Rasti žmones arba žymes"
invitations:
- a_facebook_user: "Facebook vartotojas"
- check_token:
- not_found: "Pakvietimo raktas nerastas"
create:
no_more: "Daugiau pakvietimų neturi."
rejected: "Šie el. pašto adresai neveikė: "
@@ -287,10 +284,6 @@ lt:
photos:
destroy:
notice: "Nuotrauka pašalinta."
- new_photo:
- empty: "{file} yra tuščias, pasirink failus iš naujo."
- invalid_ext: "{file} turi neteisingą galūnę. Yra leidžiamos tik {extensions}."
- size_error: "{file} yra per didelis, maksimalus failo dydis yra {sizeLimit}."
posts:
show:
photos_by:
diff --git a/config/locales/diaspora/mk.yml b/config/locales/diaspora/mk.yml
index 7dfd8096d..06cf1ce6e 100644
--- a/config/locales/diaspora/mk.yml
+++ b/config/locales/diaspora/mk.yml
@@ -101,9 +101,6 @@ mk:
fill_me_out: "Пополни ме"
find_people: "Пронајди пријатели или #тагови"
invitations:
- a_facebook_user: "Facebook корисник"
- check_token:
- not_found: "Токенот за поканата не е пронајден"
create:
no_more: "Немате повеќе покани."
rejected: "Следните е-маил адреси имаа проблем:"
@@ -238,10 +235,6 @@ mk:
photos:
destroy:
notice: "Сликата е избришана."
- new_photo:
- empty: "{file} е празен, изберете датотеки без него."
- invalid_ext: "{file} има невалидна екстензија. Само овие {extensions} се дозволени."
- size_error: "{file} е премногу голема, максимална големина на датотека е {sizeLimit}."
posts:
show:
photos_by:
diff --git a/config/locales/diaspora/ml.yml b/config/locales/diaspora/ml.yml
index fa2cfae70..16ee66b36 100644
--- a/config/locales/diaspora/ml.yml
+++ b/config/locales/diaspora/ml.yml
@@ -189,7 +189,6 @@ ml:
conversations:
create:
fail: "സാധുവല്ലാത്ത സന്ദേശം"
- no_contact: "നമസ്കാരം, താങ്കൾ ആദ്യം ഒരു ബന്ധം ചേർക്കണം!"
sent: "സന്ദേശം അയച്ചു."
index:
inbox: "ഇന്‍ബോക്സ്"
@@ -348,9 +347,6 @@ ml:
tutorials: "പഠനോപകരണങ്ങള്‍"
wiki: "വിക്കി"
invitations:
- a_facebook_user: "ഒരു ഫേസ്ബുക്ക് ഉപയോക്താവ്"
- check_token:
- not_found: "ക്ഷണത്തിന്റെ ടോക്കണ്‍ കാണുന്നില്ല"
create:
empty: "ദയവായി കുറഞ്ഞത് ഒരു ഈമെയിൽ വിലാസമെങ്കിലും നൽകുക"
no_more: "താങ്കള്‍ക്ക് ഇനി ക്ഷണങ്ങളൊന്നും ബാക്കിയില്ല."
@@ -530,14 +526,8 @@ ml:
type_error: "ചിത്രം അപ്‌ലോഡ് പരാജയപ്പെട്ടു.. താങ്കള്‍ ഒരു ചിത്രം അപ്‌ലോഡ് ചെയ്യാന്‍ തിരഞ്ഞെടുത്തിരുന്നോ?"
destroy:
notice: "ചിത്രം നീക്കം ചെയ്തു."
- new_photo:
- empty: "{file} ശൂന്യമാണ്, അതല്ലാത്ത ഫയലുകള്‍ ദയവായി വീണ്ടും തെരഞ്ഞെടുക്കുക."
- invalid_ext: "{file} ന് തെറ്റായ extension ആണ്. {extensions} മാത്രം അനുവദിച്ചിരിക്കുന്നു."
- size_error: "{file} വളരെ വലുതാണ്, കൂടിയ ഫയല്‍ വലിപ്പം {sizeLimit} ആകുന്നു."
new_profile_photo:
upload: "പുതിയ പ്രൊഫൈല്‍ ചിത്രം ചേര്‍ക്കുക!"
- show:
- show_original_post: "Show original post"
posts:
presenter:
title: "%{name}ല്‍ നിന്നുള്ള കുറിപ്പ്"
diff --git a/config/locales/diaspora/nb.yml b/config/locales/diaspora/nb.yml
index 9c84061f6..9b100a47f 100644
--- a/config/locales/diaspora/nb.yml
+++ b/config/locales/diaspora/nb.yml
@@ -229,7 +229,6 @@ nb:
conversations:
create:
fail: "Ugyldig melding"
- no_contact: "Heisann, du må legge til kontakten først."
sent: "Melding sendt"
destroy:
delete_success: "Samtalen ble slettet suksessfullt"
@@ -484,9 +483,6 @@ nb:
invitation_codes:
not_valid: "Den invitasjonskoden er ikke lenger gyldig"
invitations:
- a_facebook_user: "En Facebook-bruker"
- check_token:
- not_found: "Invitasjonsnøkkelen finnes ikke"
create:
empty: "Vennligst angi i hvertfall en e-post adresse"
no_more: "Du har ikke flere invitasjoner."
@@ -774,14 +770,8 @@ nb:
type_error: "Bildeopplastning mislyktes. ER du sikker på at et bilde ble lagt til?"
destroy:
notice: "Bildet er sletta."
- new_photo:
- empty: "{file} er tom, vennligst velg filer igjen uten den"
- invalid_ext: "{file} er en ugyldig filtype. Bare {extensions} er tillatt."
- size_error: "{file} er for stor, maks filstørrelse er {sizeLimit}."
new_profile_photo:
upload: "Last opp et nytt profilbilde!"
- show:
- show_original_post: "Vis originalpost"
posts:
presenter:
title: "En post fra %{name}"
diff --git a/config/locales/diaspora/nds.yml b/config/locales/diaspora/nds.yml
index fdd8336c6..937f04a3f 100644
--- a/config/locales/diaspora/nds.yml
+++ b/config/locales/diaspora/nds.yml
@@ -216,7 +216,6 @@ nds:
conversations:
create:
fail: "Ungültige Noricht"
- no_contact: "He, du muss erst Kontakt schluten!"
sent: "Noricht afschickt"
destroy:
delete_success: "Schnack erfolgriek löscht"
@@ -389,9 +388,6 @@ nds:
tutorials: "Anleidungen"
wiki: "Wiki"
invitations:
- a_facebook_user: "Een Facebook-Bruker"
- check_token:
- not_found: "Inlodungstoken nich funnen"
create:
empty: "Bidde geev minstens eene E-Mail-Adress in."
no_more: "Du kannst keene Inlodungen mehr schicken."
@@ -580,14 +576,8 @@ nds:
type_error: "Hoochloden von dat Bild fehlschloon. Bist du di sicher, dat du een Bild dortaudoon hest?"
destroy:
notice: "Bild löscht."
- new_photo:
- empty: "{file} is leer, bidde wähl de Dateien noch mol ohne er ut."
- invalid_ext: "{file} het een ungültiges Enn. Nur {extensions} sind erlaubt."
- size_error: "{file} is to groot, Dateien dröfft höchstens {sizeLimit} groot ween."
new_profile_photo:
upload: "Nee’es Profilbild hoochloden!"
- show:
- show_original_post: "Originalbidrag anzeigen"
posts:
presenter:
title: "Een Bidrag von %{name}"
diff --git a/config/locales/diaspora/ne.yml b/config/locales/diaspora/ne.yml
index 93d9f1203..dfdd3b822 100644
--- a/config/locales/diaspora/ne.yml
+++ b/config/locales/diaspora/ne.yml
@@ -23,7 +23,6 @@ ne:
delete: "मेट्नुहोस्"
email: "ईमेल"
invitations:
- a_facebook_user: "फेसबुक प्रयोगकर्ता"
new:
language: "भाषा"
notifications:
diff --git a/config/locales/diaspora/nl.yml b/config/locales/diaspora/nl.yml
index af552a81d..e1f585c73 100644
--- a/config/locales/diaspora/nl.yml
+++ b/config/locales/diaspora/nl.yml
@@ -274,6 +274,8 @@ nl:
post_something: "Publiceer op diaspora*"
cancel: "Annuleren"
comments:
+ create:
+ error: "Reageren mislukt."
new_comment:
comment: "Reactie"
commenting: "Reageren..."
@@ -293,11 +295,11 @@ nl:
user_search: "Zoek gebruiker"
spotlight:
community_spotlight: "Community aanrader"
+ no_members: "Er zijn nog geen leden"
suggest_member: "Suggereer een lid"
conversations:
create:
fail: "Ongeldig bericht"
- no_contact: "Hallo, je moet wel eerst een contactpersoon toevoegen!"
sent: "Privébericht verzonden"
destroy:
delete_success: "De conversatie is verwijderd"
@@ -306,6 +308,7 @@ nl:
conversations_inbox: "Conversaties - inbakje"
inbox: "Postvak In"
new_conversation: "Nieuwe conversatie"
+ no_contacts: "Je moet een paar contactpersonen toevoegen om een conversatie te starten"
no_messages: "Geen privéberichten"
new:
message: "Bericht"
@@ -330,6 +333,7 @@ nl:
delete: "Verwijderen"
email: "E-mail"
error_messages:
+ csrf_token_fail: "Het CSRF token is ongeldig. Log opnieuw in en probeer het nog eens."
helper:
correct_the_following_errors_and_try_again: "Corrigeer de volgende fouten en probeer opnieuw."
need_javascript: "Deze website vereist JavaScript om goed te kunnen werken. Als je JavaScript hebt uitgeschakeld, adviseren we om het te activeren en deze pagina te herladen."
@@ -567,7 +571,6 @@ nl:
own_your_data: "Beschik over je eigen gegevens"
own_your_data_info: "Veel netwerken verdienen hun geld door jouw gedrag en interacties vanuit jouw gegevens te analyseren om 'op maat gesneden' advertenties te serveren. diaspora* gebruikt je data alleen om je in de gelegenheid te stellen te communiceren en te delen met anderen."
podmin:
- admin_panel: "beheerscherm"
byline: "Je staat op het punt om het internet te veranderen. Zullen we daar maar eens mee beginnen?"
configuration_info: "Open %{database_path} en %{diaspora_path} in je voorkeurs teksteditor en bestudeer ze grondig. Ze zijn rijkelijk voorzien van commentaar."
configure_your_pod: "Configureer je pod"
@@ -587,12 +590,11 @@ nl:
update_your_pod: "Update je pod"
update_your_pod_info: "Je vind %{update_instructions}"
invitation_codes:
+ already_logged_in: "Je bent door %{inviter} uitgenodigd om lid te worden van deze pod, maar je bent al ingelogd."
not_valid: "Deze uitnodigingscode is niet langer geldig"
invitations:
- a_facebook_user: "Een Facebook gebruiker"
- check_token:
- not_found: "Uitnodigingstoken niet gevonden"
create:
+ closed: "Uitnodigingen zijn gesloten op deze diaspora* pod"
empty: "Gelieve minstens 1 e-mailadres toe te voegen."
no_more: "Je hebt geen uitnodigingen meer."
note_already_sent: "Er zijn al uitnodigingen verstuurd naar: %{emails}"
@@ -612,6 +614,7 @@ nl:
layouts:
application:
back_to_top: "Terug naar top"
+ be_excellent: "Wees uitmuntend voor elkaar! ♥"
powered_by: "Powered by diaspora*"
public_feed: "Publieke diaspora* kanaal van %{name}"
source_package: "Download het broncode pakket"
@@ -624,6 +627,9 @@ nl:
profile: "Profiel"
settings: "Instellingen"
toggle_navigation: "Switchen navigatie"
+ likes:
+ create:
+ error: "Leuk vinden mislukt"
limited: "Beperkt"
more: "Meer"
no_results: "Geen resultaten gevonden"
@@ -874,14 +880,8 @@ nl:
type_error: "Foto uploaden mislukt. Weet je zeker dat je een afbeelding toegevoegd hebt?"
destroy:
notice: "Foto verwijderd."
- new_photo:
- empty: "{file} is leeg, selecteer de bestanden opnieuw zonder deze."
- invalid_ext: "{file} heeft een ongeldige extensie. Alleen {extensions} zijn toegestaan."
- size_error: "{file} is te groot, de maximale bestandsgrootte is {sizeLimit}."
new_profile_photo:
upload: "Upload een nieuwe profielfoto!"
- show:
- show_original_post: "Toon origineel bericht"
polls:
votes:
one: "%{count} stem tot nu"
@@ -968,8 +968,14 @@ nl:
destroyed: "Het bericht is vernietigd"
failed: "Er ging iets verkeerd"
title: "Meldingenoverzicht"
+ unreviewed_reports:
+ one: "Er is %{count} onbeoordeelde melding."
+ other: "Er zijn %{count} onbeoordeelde meldingen."
+ zero: "Er zijn geen onbeoordeelde meldingen."
reshares:
comment_email_subject: "%{resharer}'s doorgifte van %{author}'s post"
+ create:
+ error: "Doordelen mislukt."
reshare:
deleted: "Het originele bericht is verwijderd door de auteur."
reshare_confirmation: "%{author}'s bericht doorgeven?"
diff --git a/config/locales/diaspora/nn.yml b/config/locales/diaspora/nn.yml
index 2a6b074df..0184b8224 100644
--- a/config/locales/diaspora/nn.yml
+++ b/config/locales/diaspora/nn.yml
@@ -189,7 +189,6 @@ nn:
conversations:
create:
fail: "Ugyldig melding"
- no_contact: "Hei, du må leggje til kontakten først!"
sent: "Meldinga er sendt"
index:
inbox: "Innkorg"
@@ -228,9 +227,6 @@ nn:
tutorials: "innføringar"
wiki: "wiki"
invitations:
- a_facebook_user: "Ein Facebook-brukar"
- check_token:
- not_found: "Fann ikkje invitasjonskoda"
create:
empty: "Skriv inn minst ei e-post-adresse."
no_more: "Du har ingen fleire invitasjonar."
@@ -420,14 +416,8 @@ nn:
type_error: "Klarte ikkje å lasta opp biletet. Er du sikker på at du la til eit bilete?"
destroy:
notice: "Biletet er sletta."
- new_photo:
- empty: "{file} er tom, vel filer utan å ta ho med."
- invalid_ext: "{file} har ein ugyldig filtype. Berre {extensions} er tillatne."
- size_error: "{file} er for stor, kan ikkje vera større enn {sizeLimit}."
new_profile_photo:
upload: "Last opp eit nytt profilbilete."
- show:
- show_original_post: "Syn den opphavlege meldinga"
posts:
presenter:
title: "Eit innlegg av %{name}"
diff --git a/config/locales/diaspora/oc.yml b/config/locales/diaspora/oc.yml
new file mode 100644
index 000000000..1396b96ae
--- /dev/null
+++ b/config/locales/diaspora/oc.yml
@@ -0,0 +1,1113 @@
+# Copyright (c) 2010-2013, Diaspora Inc. This file is
+# licensed under the Affero General Public License version 3 or later. See
+# the COPYRIGHT file.
+
+
+
+oc:
+ _applications: "Aplicacions"
+ _contacts: "Contactes"
+ _help: "Ajuda"
+ _services: "Servicis"
+ _statistics: "Estatisticas"
+ _terms: "Condicions d'utilizacion"
+ account: "Compte"
+ activerecord:
+ errors:
+ models:
+ contact:
+ attributes:
+ person_id:
+ taken: "deu èsser unic entre los contactes d'aqueste utilizaire."
+ person:
+ attributes:
+ diaspora_handle:
+ taken: "es ja pres."
+ poll:
+ attributes:
+ poll_answers:
+ not_enough_poll_answers: "I a pas pro de causidas possiblas"
+ poll_participation:
+ attributes:
+ poll:
+ already_participated: "Avètz ja paticipat a aquel sondatge !"
+ request:
+ attributes:
+ from_id:
+ taken: "es un doblon d'una requèsta qu'existís ja."
+ reshare:
+ attributes:
+ root_guid:
+ taken: "Es tròp crane non ? Avètz ja partejat aquesta publicacion !"
+ user:
+ attributes:
+ email:
+ taken: "es ja utilizat."
+ person:
+ invalid: "es invalid."
+ username:
+ invalid: "es invalid. Autorizam pas que las letras, chifras e caractèrs de soslinhament."
+ taken: "es ja pres."
+ admins:
+ admin_bar:
+ dashboard: "Tablèu de bòrd"
+ pages: "Paginas"
+ pod_network: "Ret del pod"
+ pod_stats: "Estats del Pod"
+ report: "Senhalaments"
+ sidekiq_monitor: "Monitor Sidekiq"
+ user_search: "Cercar un utilizaire"
+ weekly_user_stats: "Estatisticas d'utilizaire setmanièras"
+ dashboard:
+ fetching_diaspora_version: "A determinar la darrièra version de diaspora*..."
+ pod_status: "Estat del pod"
+ pods:
+ pod_network: "Ret del pod"
+ stats:
+ 2weeks: "2 setmanas"
+ 50_most: "Las 50 etiquetas mai popularas"
+ comments:
+ one: "%{count} comentari"
+ other: "%{count} comentaris"
+ zero: "Pas cap de comentari"
+ current_segment: "La categoria considerada a una mejana de <b>%{post_yest}</b> messatges per utilizaire, dempuèi <b>%{post_day}</b>"
+ daily: "Quotidiana"
+ display_results: "Afichatge dels resultats pel periòde <b>%{segment}</b>"
+ go: "Executar"
+ month: "Mes"
+ posts:
+ one: "%{count} publicacion"
+ other: "%{count} publicacions"
+ zero: "Pas cap de publicacion"
+ shares:
+ one: "%{count} partiment"
+ other: "%{count} partiments"
+ zero: "Pas cap de partiment"
+ tag_name: "Nom del tag : <b>%{name_tag}</b> Nombre : <b>%{count_tag}</b>"
+ usage_statistic: "Estatisticas d'utilizacion"
+ users:
+ one: "%{count} utilizaire"
+ other: "%{count} utilizaires"
+ zero: "Pas cap d'utilizaire"
+ week: "Setmana"
+ user_entry:
+ account_closed: "Compte tampat"
+ diaspora_handle: "identificant diaspora*"
+ email: "E-mail"
+ guid: "GUID"
+ id: "ID"
+ invite_token: "Geton de convit"
+ last_seen: "Darrièra connexion"
+ ? "no"
+ : Non
+ nsfw: "#nsfw"
+ unknown: "Desconegut"
+ ? "yes"
+ : Òc
+ user_search:
+ account_closing_scheduled: "La tampadura del compte %{name} es planificada. Serà efectuada dins gaire de temps."
+ account_locking_scheduled: "Lo compte de %{name} va èsser verrolhat dins un momenton"
+ account_unlocking_scheduled: "Lo compte de %{name} va èsser desverrolhat dins un momenton."
+ add_invites: "Apondre de convits"
+ are_you_sure: "Sètz segur que volètz tampar aqueste compte ?"
+ are_you_sure_lock_account: "Sètz segur que volètz verrolhar aqueste compte ?"
+ are_you_sure_unlock_account: "Sètz segur que volètz desverrolhar aqueste compte ?"
+ close_account: "Tampar aqueste compte"
+ email_to: "Adreça electronica de la persona de convidar"
+ invite: "Convidar"
+ lock_account: "Verrolhar lo compte"
+ under_13: "Mostrar los utilizaires qu'an mens de 13 ans (COPPA)"
+ unlock_account: "Desverrolhar lo compte"
+ users:
+ one: "%{count} utilizaire trobat"
+ other: "%{count} utilizaires trobats"
+ zero: "Cap d'utilizaire pas trobat"
+ view_profile: "Afichar lo perfil"
+ you_currently:
+ one: "Vos demòra actualament un convit %{link}"
+ other: "Vos demòran actualament %{count} convits %{link}"
+ zero: "Vos demòra pas mai de convit %{link} actualament"
+ weekly_user_stats:
+ amount_of:
+ one: "%{count} novèl utilizaire aquesta setmana"
+ other: "Nombre de novèls utilizaires aquesta setmana : %{count}"
+ zero: "Pas cap de novèl utilizaire aquesta setmana "
+ current_server: "La data actuala del servidor es %{date}"
+ all_aspects: "Totes los aspèctes"
+ api:
+ openid_connect:
+ authorizations:
+ destroy:
+ fail: "La temptativa de revocacion de l'autorizacion amb ID %{id} a fracassat"
+ new:
+ access: "%{name} a besonh d'accedir a :"
+ approve: "Aprovar"
+ bad_request: "ID client mancant o URL de redireccion"
+ client_id_not_found: "Pas de client amb client_id %{client_id} amb URL de redireccion %{redirect_uri} pas trobat"
+ deny: "Regetar"
+ no_requirement: "%{name} a pas besonh de permissions"
+ redirection_message: "Sètz segur que volètz donar accès a %{redirect_uri} ?"
+ error_page:
+ contact_developer: "Deuriatz contactar lo desvolopaire de l'aplicacion e inclure lo messatge d'error detalhat seguent :"
+ could_not_authorize: "L'aplicacion a pas pugut èsser autorizada"
+ login_required: "D'en primièr, vos cal vos connectar per fin de poder autorizar aquesta aplicacion"
+ title: "Ops ! Quicòm a trucat :("
+ scopes:
+ name:
+ name: "nom"
+ nickname:
+ description: "Aquò dina las permissions ligadas a l'escais a l'aplicacion"
+ name: "Escais"
+ openid:
+ description: "Aquò permet a l'aplicacion de veire vòstre perfil basic"
+ name: "perfil basic"
+ picture:
+ description: "Aquò dona las permissions ligadas als imatges a l'aplicacion"
+ name: "imatge"
+ profile:
+ description: "Aquò autpriza l'aplicacion a legir vòstre perfil complet"
+ name: "perfil complet"
+ read:
+ name: "veire perfil, flux e conversacions"
+ sub:
+ description: "Aquò autreja de sospermissions a l'aplicacion"
+ name: "jos"
+ write:
+ description: "Aquò permet a l'aplicacion de mandar de publicacions novèlas, escriure de conversacions e publicar de reaccions."
+ name: "mandar publicacions, conversacions e reaccions"
+ user_applications:
+ index:
+ access: "%{name} a accès a :"
+ edit_applications: "Aplicacions"
+ no_requirement: "%{name} as pas besonh d'autorizacions."
+ title: "Aplicacions autorizadas"
+ no_applications: "Avètz pas d'aplicacions autorizadas"
+ policy: "Veire la politica de confidencialitat de l'aplicacion"
+ revoke_autorization: "Revocar"
+ tos: "Veire las condicions d'utilizacion de l'aplicacion"
+ are_you_sure: "Sètz segur ?"
+ are_you_sure_delete_account: "Sètz segur que volètz tampar vòstre compte ? Aquò se pòt pas anullar !"
+ aspect_memberships:
+ destroy:
+ failure: "La persona a pas pogut èsser levada de l'aspècte amb succès."
+ forbidden: "Sètz pas autorizat a far aquò"
+ invalid_statement: "Impossible de duplicar l'enregistrament."
+ no_membership: "Se pòt pas trobar la persona seleccionada dins aqueste aspècte."
+ success: "La persona es estada levada de l'aspècte amb succès."
+ aspects:
+ add_to_aspect:
+ failure: "Fracàs de l'apondon del contacte a l'aspècte."
+ success: "Lo contacte es ben estat apondut a l'aspècte."
+ aspect_listings:
+ add_an_aspect: "+ Apondre un aspècte"
+ aspect_stream:
+ make_something: "Fasètz quicòm"
+ stay_updated: "Demoratz al fial"
+ stay_updated_explanation: "Vòstre flux principal conten totes vòstres contactes, etiquetas seguidas, e publicacions de qualques sòcis creatius de la comunautat."
+ destroy:
+ failure: "%{name} a pas pogut èsser suprimit."
+ success: "%{name} es ben estat levat."
+ edit:
+ aspect_list_is_not_visible: "Los contactes dins aqueste aspècte se pòdon veire entre eles."
+ aspect_list_is_visible: "Los contactes dins aqueste aspècte se pòdon veire entre eles."
+ confirm_remove_aspect: "Sètz segur de volètz suprimir aqueste aspècte ?"
+ rename: "Renomenar"
+ update: "Metre a jorn"
+ updating: "En cors de mesa a jorn"
+ index:
+ donate: "Far un don"
+ help:
+ any_problem: "Avètz agut un problèma ?"
+ contact_podmin: "Contactar ladministrator de vòstre pod !"
+ do_you: "Volètz :"
+ feature_suggestion: "... aver una suggestion de %{link} ?"
+ find_a_bug: "... trobar %{link} ?"
+ have_a_question: "... aver una %{link} ?"
+ here_to_help: "La comunautat diaspora* es aquí !"
+ mail_podmin: "Corrièl del podmin"
+ need_help: "Besonh d'ajuda ?"
+ tag_bug: "bug"
+ tag_feature: "suggestion"
+ tag_question: "question"
+ tutorial_link_text: "Tutorials"
+ tutorials_and_wiki: "%{faq}, %{tutorial} e %{wiki} : vos ajudan per vòstres primièrs passes."
+ introduce_yourself: "Es vòstre flux. Rejonhètz-nos e presentatz-vos."
+ keep_pod_running: "Permetètz a %{pod} de foncionar rapidament e ofrissètz una dòsi de cafè mesadièra a nòstres servidors !"
+ new_here:
+ follow: "Seguissètz %{link} e aculhissètz los novèls utilizaires de diaspora* !"
+ learn_more: "Ne saber mai"
+ title: "Aculhir los novèls venguts"
+ services:
+ content: "Podètz connectar aqueles servicis a diaspora* :"
+ heading: "Connectar de servicis"
+ welcome_to_diaspora: "Benvenguda dins diaspora*, %{name} !"
+ no_contacts_message:
+ community_spotlight: "Actualitat de la comunautat"
+ invite_link_text: "convidar"
+ or_spotlight: "O podètz partejar amb %{link}"
+ try_adding_some_more_contacts: "Podètz recercar o %{invite_link} mai de contactes."
+ you_should_add_some_more_contacts: "Vos cal apondre un pauc mai de contactes !"
+ seed:
+ acquaintances: "Coneissenças"
+ family: "Familha"
+ friends: "Amics"
+ work: "Trabalh"
+ update:
+ failure: "Lo nom del vòstre aspecte, %{name}, es tròp long, enregistrament impossible."
+ success: "La modificacion de vòstre aspècte %{name}, a capitat."
+ blocks:
+ create:
+ failure: "Ai pas pogut ignorar aqueste utilizaire. #evasion"
+ success: "D'acòrdi, tornaretz pas veire aqueste utilizaire dins vòstre flux. #silenci !"
+ destroy:
+ failure: "Ai pas pogut quitar d'ignorar aqueste utilizaire. #evasion"
+ success: "Vejam çò qu'an a dire ! #digatzbonjorn"
+ bookmarklet:
+ explanation: "Publicatz sus diaspora* dempuèi oont que siá en apondent %{link} a vòstres marcapaginas."
+ heading: "Publicacion rapida"
+ post_something: "Publicatz sus diaspora*"
+ cancel: "Anullar"
+ comments:
+ new_comment:
+ comment: "Comentar"
+ commenting: "Comentari en cors de mandadís..."
+ contacts:
+ index:
+ add_a_new_aspect: "Apondre un aspècte novèl"
+ add_contact: "Apondre un contacte"
+ all_contacts: "Totes los contactes"
+ community_spotlight: "Actualitat de la comunautat"
+ my_contacts: "Mos contactes"
+ no_contacts: "Sembla que vos cal apondre mai de contactes !"
+ no_contacts_message: "Consultatz %{community_spotlight}"
+ only_sharing_with_me: "Solament partejat amb ieu"
+ start_a_conversation: "Començar una conversacion"
+ title: "Contactes"
+ user_search: "Cercar un contacte"
+ spotlight:
+ community_spotlight: "Actualitat de la comunitat"
+ no_members: "I a pas encara cap de membre."
+ suggest_member: "Suggerir un membre"
+ conversations:
+ create:
+ fail: "Messatge invalid"
+ sent: "Messatge mandat"
+ destroy:
+ delete_success: "Conversacion escafada amb succès"
+ hide_success: "Conversacion amagada amb succès"
+ index:
+ conversations_inbox: "Discussions - Bóstia de recepcion"
+ inbox: "Bóstia de recepcion"
+ new_conversation: "Novèla conversacion"
+ no_messages: "Pas cap de messatges"
+ new:
+ message: "Messatge"
+ send: "Mandar"
+ sending: "Mandadís..."
+ subject: "Subjècte"
+ subject_default: "Pas de subjècte"
+ to: "Per"
+ new_conversation:
+ fail: "Messatge invalid"
+ show:
+ delete: "Suprimir la conversacion"
+ hide: "amagar e metre en mut la conversacion"
+ last_message: "Darrièr messatge recebut %{timeago}"
+ reply: "Respondre"
+ replying: "Responsa..."
+ date:
+ formats:
+ birthday: "%d de %B"
+ birthday_with_year: "%d de %B de %Y"
+ fullmonth_day: "%d de %B"
+ delete: "Suprimir"
+ email: "Corrièl"
+ error_messages:
+ helper:
+ correct_the_following_errors_and_try_again: "Corregissètz las errors seguentas, e tornatz ensajar."
+ fill_me_out: "Escriure aicí"
+ find_people: "Recercar de personas o de #tags"
+ help:
+ account_and_data_management:
+ close_account_a: "Rensètz-vos en bas de la pagina e clicatz sul boton \"Clausurar lo compte\". Vòstre senhal vos serà demandat per acabar lo processus. Vos rapelam que se tampatz vòstre compte, ne poiretz pas mai tornar crear sus aqueste pod amb aqueste nom d'utilizaire."
+ close_account_q: "Cossí pòdi suprimir mon compte ?"
+ data_other_podmins_q: "Los administrators dels autres pods pòdon veire mas informacions ?"
+ data_visible_to_podmin_q: "Quina quantitat de mas informacions l'administrator del pod pòt veire ?"
+ download_data_a: "Òc. En dejòs de los paramètres de Compte trobaretz dos botons : un per telecargar vòstras donadas e un per telecargar vòstras fotos."
+ download_data_q: "Pòdi telecargar una còpia de totas las donadas contengudas dins mon compte ?"
+ move_pods_a: "Dins lo futur poiretz exportar vòstra grana - seed - dempuèi un pod e l'importar dins un autre, mai pel moment es pas possible. Podètz totjorn dubrir un nòu compte e ajustar vòstres contactes sus aquela nòva grana, e lor demandar de vos ajustar sus lors aspèctes amb vòstra nòva grana."
+ move_pods_q: "Cossí desplaçar mon compte d'un pod a un autre ?"
+ title: "Gestion del compte e de las donadas"
+ aspects:
+ change_aspect_of_post_a: "Non, mas podètz totjorn crear una nòva publicacion amb lo meteis contengut e o publicar sus un autre aspècte."
+ change_aspect_of_post_q: "Un còp qu'ai publiat quicòm, pòdi cambiar los aspècte(s) qu'o pòdon veire ?"
+ contacts_know_aspect_a: "Non pas. Pòdon pas veire lo nom de l'aspècte qualqu'arribe."
+ contacts_know_aspect_q: "Mos contactes pòdon saber sus quin aspècte los ai mes ?"
+ contacts_visible_q: "Qué significa « rendre los contactes dins aqueste aspècte visibles entre eles » ?"
+ delete_aspect_q: "Cossí pòdi suprimir un aspècte ?"
+ person_multiple_aspects_q: "Pòdi apondre una persona a mantun aspècte ?"
+ post_multiple_aspects_a: "Òc. Quand publicatz una publicacion, utilizatz lo boton per causir los aspèctes. \"Totes los aspèctes\" es la causida per defaut dins los paramaètres. Podètz tanben causir los aspèctes dins la barra de menú. Quand publicactz, lo(s) aspèctes qu'avètz causits dins la lista a man esquèrra seràn automaticament seleccionats per las publicacions venentas."
+ post_multiple_aspects_q: "Pòdi mandar un messatge a mantun aspècte a l'encòp ?"
+ remove_notification_a: "Non. Tanpauc seràn pas avisat se los ajustatz dins mai aspèctes, del moment que ja partejatz amb eles."
+ remove_notification_q: "Se suprimissi qualqu'un d'un de mos aspèctes, o totas las personas d'un aspècte, son prevengudas ?"
+ rename_aspect_a: "Clicatz \"Mos aspèctes\" sul costat esquèrra de la pagina de flux e clicatz sul gredonèl \"editar\" sus la dreita de l'aspècte de renomenar. Podètz tanben anar sus la pagina \"Contactes\" e seleccionar l'aspècte concernit. Clicatz alara sus l'icòna \"editar\" al costat del nom amont de la pagina, cambiatz lo nom e clicatz \"Metre a jorn\"."
+ rename_aspect_q: "Pòdi tornar nommar un aspècte ?"
+ restrict_posts_i_see_q: "Pòdi afichar unicament los messatges de certans aspèctes ?"
+ title: "Aspèctes"
+ what_is_an_aspect_q: "De qué es un aspècte ?"
+ who_sees_post_q: "Quand publiqui sus un aspècte, qual pòt o veire ?"
+ chat:
+ add_contact_roster_q: "Cossí discutir amb qialqu'un dins diaspora* ?"
+ contacts_page: "pagina dels contactes"
+ title: "Chat"
+ faq: "FAQ"
+ foundation_website: "site internet de la fondacion diaspora*"
+ getting_help:
+ get_support_a_faq: "Legir la pagina %{faq} de nòstre wiki"
+ get_support_a_hashtag: "Pausatz una question dins un messatge public sus diaspora* en utilizant l'hashtag %{question}"
+ get_support_a_irc: "Rejonhètz-nos sus %{irc} (Chat instantanèu)"
+ get_support_a_tutorials: "Referissètz-vos a nòstres %{tutorials}"
+ get_support_a_website: "Visitatz nòstre %{link}"
+ get_support_a_wiki: "Recercatz dins lo %{link}"
+ get_support_q: "De qué far se ma question a pas de responsa dins la FAQ ? A quines autres endreits pòdi obténer de documentcion ?"
+ getting_started_a: "Sètz astruc. Ensajatz las %{tutorial_series} sul site de nòstre projècte. Vos ajudarà pas a pas dempuèi l'inscripcion cap a las causas basicas que vos cal saber per utilizar diaspora*."
+ getting_started_q: "Ajudatz-me ! Ai besonh d'ajuda per debutar !"
+ title: "Obténer d'ajuda"
+ getting_started_tutorial: "Seria de tutorials \"Mos primièrs passes\""
+ here: "aicí"
+ irc: "IRC"
+ keyboard_shortcuts:
+ keyboard_shortcuts_a1: "Dins lo flux, podètz utilizar los acorchis de clavièr seguents :"
+ keyboard_shortcuts_li1: "j - Anar al messatge seguent"
+ keyboard_shortcuts_li2: "k - Anar al messatge precedent"
+ keyboard_shortcuts_li3: "c - Comentar lo messatge corrent"
+ keyboard_shortcuts_li4: "l - Marcat lo messatge corrent coma m'agradant"
+ keyboard_shortcuts_li5: "r - Repartejar aqueste messatge"
+ keyboard_shortcuts_li6: "m - Afichar l'ensemble del messatge"
+ keyboard_shortcuts_li7: "o - Dobrir lo primièr ligam d'aqueste messatge"
+ keyboard_shortcuts_li8: "ctrl + entrada - Mandar lo messatge en cors de redaccion"
+ keyboard_shortcuts_q: "Quines son los acorchis de clavièr existents ?"
+ title: "Acorchis de clavièr"
+ markdown: "Markdown"
+ mentions:
+ how_to_mention_q: "Cossí pòdi mencionar qualqu'un quand escrivi un messatge ?"
+ mention_in_comment_a: "Non pas, pel moment."
+ mention_in_comment_q: "Pòdi mencionar qualqu'un dins un comentari ?"
+ see_mentions_a: "Òc, clicatz sus \"@Mencions\" dins la colomna d'esquèrra de vòstra pagina d'acuèlh"
+ see_mentions_q: "I a un biais de veire las publicacions que soi mencionat dedins ?"
+ title: "Mencions"
+ what_is_a_mention_a: "Una mencion es un ligam cap al perfil d'una persona qu'apareis sus una publicacion. Quand qualqu'un es mencionat, receb una notificacion per atirar lor atencion sus la publicacion."
+ what_is_a_mention_q: "De qué es una “mencion” ?"
+ miscellaneous:
+ diaspora_app_q: "Existís una aplicacion diaspora* per Android o iOS ?"
+ photo_albums_q: "I a d'albums de fòtos o de vidèos ?"
+ subscribe_feed_q: "Me pòdi inscriure als messatges publics d'una persona amb un lector de fluxes ?"
+ title: "Divèrs"
+ pods:
+ find_people_q: "Veni de rejónher un pod, cossí pòdi trobar de monde per partejar amb eles ?"
+ title: "Pods"
+ use_search_box_q: "Cossí me cal utilizar lo camp de recèrca per trobar qualqu'un en particular ?"
+ what_is_a_pod_q: "Qu'es aquò un pod ?"
+ posts_and_posting:
+ char_limit_services_q: "Quin es lo limit de caractèrs pels messatges partejats amb un servici qu'a un limit de caractèrs mai pichon ?"
+ character_limit_a: "65 535 caractèrs. Son 65 395 caractèrs de mai que Twitter ! :)"
+ character_limit_q: "Qual es lo limit de caractèrs per las publicacions ?"
+ embed_multimedia_q: "Cossí pòdi inserir un contengut vidèo, àudio, o multimèdia dins una publicacion ?"
+ format_text_q: "Cossí pòdi formatar lo tèxte dins as publicacions (gras, italic, etc.) ?"
+ hide_posts_q: "Cossí escondi una publicacion ?"
+ image_text: "tèxte de l'imatge"
+ image_url: "url de l'imatge"
+ insert_images_comments_a1: "Podètz pas mandar d'imatges dins los comentaris mas lo còdi Markdown seguent"
+ insert_images_comments_a2: "aquò pòt èsser utiizat per inserir d'imatges a partir del web dins los comentaris o los messatges."
+ insert_images_comments_q: "Pòdi inserir d'imatges dins un comentari ?"
+ insert_images_q: "Cossí pòdi inserir d'imatges dins un messatge ?"
+ post_location_q: "Cossí pòdi apondre ma posicion a un messatge ?"
+ post_notification_q: "Cossí pòdi activar o desactivar las notificacions per un messatge ?"
+ post_poll_q: "Cossí pòdi apondre un sondatge a mon messatge ?"
+ post_report_q: "Cossí pòdi senhalar un messatge ofensant ?"
+ size_of_images_q: "Pòdi melhorar la talha dels imatges dins los messatges o los comentaris ?"
+ stream_full_of_posts_a1: "Vòstre flux es condtituit de tres tipes de messatges :"
+ stream_full_of_posts_li2: "Los messatges publics contenon un dels tags que seguissètz. Per los suprimir, daissatz de seguir lo tag."
+ stream_full_of_posts_q: "Perqué mon flux es plen de messatges que provenon de monde que coneissi pas e amb las qualas partegi pas ?"
+ title: "Publicacions e publicar"
+ private_posts:
+ can_comment_q: "Qual pòt comentar o a qual pòt agradar un messatge privat ?"
+ can_reshare_q: "Qual pòt repartejar mos messatges privats ?"
+ see_comment_q: "Quand comenti un messatge privat o que marqui que m'agrada , qual o pòt veire ?"
+ title: "Publicacions privadas"
+ who_sees_post_q: "Quand mandi un messatge a un aspècte (es a dire un messatge privat), qual o pòt veire ?"
+ private_profiles:
+ title: "Perfils privats"
+ whats_in_profile_q: "Qu'es aquò mon perfil privat ?"
+ who_sees_profile_q: "Qual pòt veire mon perfil privat ?"
+ who_sees_updates_a: "Qual que siá dins vòstres aspèctes pòt veire las modificacions de vòstre perdil privat."
+ who_sees_updates_q: "Qual pòt veire las mesas a jorn de mon perfil privat ?"
+ public_posts:
+ can_comment_reshare_like_a: "Quin utilizaire connectat a diaspora* que siá, pòt comentar, repartejar vòstre messatge public o marcar que li agrada."
+ can_comment_reshare_like_q: "Qual pòt comentar, repartejar, o marcar que li agrada mon messatge public ?"
+ find_public_post_q: "Cossí las autras personas pòdon trobar mos messatges publics ?"
+ see_comment_reshare_like_q: "Quand comenti, tòrni partejar, o aimi una publicacion publica, qual pòt o veire ?"
+ title: "Publicacions publicas"
+ who_sees_post_q: "Quand publiqui quicòm publicament, qual pòt veire ?"
+ public_profiles:
+ title: "Perfils publics"
+ what_do_tags_do_q: "De qué fan los tags sus mon perfil public ?"
+ whats_in_profile_q: "Qué i a sul meu perfil public ?"
+ who_sees_profile_q: "Qual vei mon perfil public ?"
+ who_sees_updates_a: "Qual que siá pòt veire aqueles cambiaments en visitant vòstra pagina de perfil."
+ who_sees_updates_q: "Qual pòt veire las mesas a jorn de mon perfil public ?"
+ resharing_posts:
+ reshare_private_post_aspects_q: "Pòdi repartejar un messatge privat unicament amb certans aspèctes ?"
+ reshare_public_post_aspects_q: "Pòdi repartejar un messatge public unicament amb certans aspèctes ?"
+ title: "Repartejar los messatges."
+ sharing:
+ add_to_aspect_li2: "Amy començara de veire los messatges publics de Ben dins son flux."
+ add_to_aspect_li3: "Amy veirà pas cap dels messatges privats de Ben."
+ add_to_aspect_li6: "Ben serà autorizat a veire lo perfil privat d'Amy (bio, localizacion, sèxe, anniversari)."
+ add_to_aspect_li8: "Amy serà tanben capabla de @mencionar Ben dins un messatge."
+ sharing_notification_a: "Deuriatz recebre una notificacion a cada còp que qualqu'un comença de partejar amb vos."
+ sharing_notification_q: "Cossí pòdi saber quand qualqu'un comença de partejar amb ieu ?"
+ title: "Partiment"
+ tags:
+ filter_tags_q: "Cossí pòdi filtrar/exclure certans tags de mon flux ?"
+ followed_tags_q: "De qué son los \"#Tags Seguits\" e cossí pòdi seguir un tag ?"
+ people_tag_page_a: "I a monde qu'an listat aqueste tag per se descriure eles-meteisses dins lor perfil public."
+ people_tag_page_q: "Qualas son las personas listadas sus la partida d'esquèrra d'una pagina de tag ?"
+ tags_in_comments_q: "Pòdi inserir de tags dins un comentari o sonque dins de messatges ?"
+ title: "Etiquetas"
+ what_are_tags_for_q: "A qué servisson las etiquetas ?"
+ third_party_tools: "Aisinas tèrças"
+ title_header: "Ajuda"
+ tutorial: "tutorial"
+ tutorials: "tutorials"
+ wiki: "wiki"
+ home:
+ default:
+ be_who_you_want_to_be: "Siatz lo que volètz èsser"
+ byline: "La ret sociala ont gardatz lo contraròtle."
+ choose_your_audience: "Causissètz vòstre public"
+ headline: "Benvenguda sus %{pod_name}"
+ own_your_data: "Siatz proprietari de vòstras donadas"
+ podmin:
+ byline: "Sètz a mand de cambiar la fàcia d'internet. Prèst a vos lançar ?"
+ configuration_info: "Dobrissètz %{database_path} e %{diaspora_path} dins vòstre editor de tèxte favorit e relegissètz-los menimosament, son comentats abondament."
+ configure_your_pod: "Configuratz vòstre pod"
+ contact_irc: "nos contactar sus IRC"
+ contribute: "Contribuissètz"
+ contribute_info: "Rendètz diaspora* encara melhor ! Se rencontratz de bugs, %{report_bugs} se vos plai."
+ create_an_account: "Creatz un compte"
+ create_an_account_info: "%{sign_up_link} per un novèl compte"
+ faq_for_podmins: "FAQ pels podmins sus nòstre wiki"
+ getting_help: "Obtenètz d'ajuda"
+ headline: "Benvenguda, l'amic."
+ make_yourself_an_admin: "Venètz administrator"
+ report_bugs: "raportatz-los"
+ update_instructions: "d'instruccions de mesa a jorn sul wiki de diaspora*"
+ update_your_pod: "Mantenètz vòstre pod a jorn"
+ update_your_pod_info: "Trobaretz %{update_instructions}."
+ invitation_codes:
+ not_valid: "Aqueste còdi es pas pus valid."
+ invitations:
+ create:
+ empty: "Mercés de picar almens una adreça de corrièl."
+ no_more: "Avètz pas mai de convits."
+ note_already_sent: "Las invitacions son ja estadas mandadas a : %{emails}"
+ rejected: "Las adreças de corrièr electronic seguentas an rencontrat un problèma : "
+ sent: "Los convits son estats mandats a %{emails}"
+ new:
+ codes_left:
+ one: "Pas mai qu'un convit de disponible amb aqueste còdi."
+ other: "Encara %{count} convits de disponibles amb aqueste còdi."
+ zero: "Pas mai de convit de disponible amb aqueste còdi."
+ comma_separated_plz: "Podètz entrar mantuna adreça de corrièl separadas per de virgulas."
+ invite_someone_to_join: "Convidar qualqu'un a rejónher diaspora* !"
+ language: "Lenga"
+ paste_link: "Partejatz aqueste ligam amb vòstres amics per los convidar dins diaspora*, o mandatz-lor aqueste ligam dirèctament per corrièl."
+ send_an_invitation: "Mandar un convit"
+ sending_invitation: "Mandadís del convit..."
+ layouts:
+ application:
+ back_to_top: "Tornar amont"
+ be_excellent: "Siatz benvolent amb cadun !"
+ powered_by: "Propulsat per dispora*"
+ public_feed: "Flux diaspora* public per %{name}"
+ source_package: "Telecargatz lo còdi font"
+ statistics_link: "Estatisticas del pod"
+ toggle: "Activar/desactivar la version mobila"
+ whats_new: "Qué de nòu ?"
+ header:
+ code: "Còdi"
+ logout: "Desconnexion"
+ profile: "Perfil"
+ settings: "Paramètres"
+ toggle_navigation: "Afichar/amagar lo menú"
+ likes:
+ create:
+ error: "Fracàs al moment d'aimar."
+ limited: "Limitat"
+ more: "Mai"
+ no_results: "Cap de resultat pas trobat"
+ notifications:
+ also_commented:
+ one: "%{actors} a tanben comentat %{post_link} de %{post_author}."
+ other: "%{actors} an tanben comentat %{post_link} de %{post_author}."
+ zero: "%{actors} a tanben comentat %{post_link} de %{post_author}."
+ also_commented_deleted:
+ one: "%{actors} a comentat una publicacion suprimida."
+ other: "%{actors} an comentat una publicacion suprimida."
+ zero: "%{actors} a comentat una publicacion suprimida."
+ comment_on_post:
+ one: "%{actors} a comentat vòstra publicacion %{post_link}."
+ other: "%{actors} an comentat vòstra publicacion %{post_link}."
+ zero: "%{actors} a comentat vòstra publicacion %{post_link}."
+ index:
+ all_notifications: "Totas las notificacions"
+ also_commented: "Tanben comentat"
+ and: "e"
+ and_others:
+ one: "e una persona mai"
+ other: "e %{count} personas mai"
+ zero: "e degun mai"
+ comment_on_post: "Comentari sus un de vòstres messatges"
+ liked: "Que m'agrada"
+ mark_all_as_read: "Tot marcar coma legit"
+ mark_all_shown_as_read: "Marcar tot coma legit"
+ mark_read: "Marcar coma legit"
+ mark_unread: "Marcar coma pas legit"
+ mentioned: "Mencionat"
+ mentioned_in_comment: "Mencionat dins un comentari"
+ no_notifications: "Avètz pas encara cap de notificacion."
+ notifications: "Notificacions"
+ reshared: "Repartejat"
+ show_all: "afichar tot"
+ show_unread: "afichar los que son pas legits"
+ started_sharing: "A començat de partejar"
+ liked:
+ one: "Vòstra publicacion %{post_link} agrada a %{actors} persona."
+ other: "Vòstra publicacion %{post_link} agrada a %{actors} personas."
+ zero: "Vòstra publicacion %{post_link} agrada a %{actors} persona."
+ liked_post_deleted:
+ one: "Vòstra publicacion suprimida a pas agradat %{actors} persona."
+ other: "Vòstra publicacion suprimida a pas agradat %{actors} personas."
+ zero: "Vòstra publicacion suprimida a pas agradat %{actors} persona."
+ mentioned:
+ one: "%{actors} vos a mencionat dins la publicacion %{post_link}."
+ other: "%{actors} vos an mencionat dins la publicacion %{post_link}."
+ zero: "%{actors} vos a mencionat dins la publicacion %{post_link}."
+ mentioned_deleted:
+ one: "%{actors} vos a mencionat sus una publicacion suprimida."
+ other: "%{actors} vos an mencionat sus una publicacion suprimida."
+ zero: "%{actors} vos a mencionat sus una publicacion suprimida."
+ post: "publicacion"
+ private_message:
+ one: "%{actors} vos a mandat un messatge."
+ other: "%{actors} vos an mandat un messatge."
+ zero: "%{actors} vos a mandat un messatge."
+ reshared:
+ one: "%{actors} a repartejat vòstra publicacion %{post_link}."
+ other: "%{actors} an repartejat vòstra publicacion %{post_link}."
+ zero: "%{actors} a repartejat vòstra publicacion %{post_link}."
+ reshared_post_deleted:
+ one: "%{actors} a tornat partejar vòstra publicacion suprimida."
+ other: "%{actors} an tornat partejar vòstra publicacion suprimida."
+ zero: "%{actors} a tornat partejar vòstra publicacion suprimida."
+ started_sharing:
+ one: "%{actors} a començat de partejar amb vos."
+ other: "%{actors} an començat de partejar amb vos."
+ zero: "%{actors} a començat de partejar amb vos."
+ notifier:
+ a_limited_post_comment: "Avètz un comentari novèl sus un messatge amb visibilitat limitada."
+ a_post_you_shared: "una publicacion."
+ also_commented:
+ limited_subject: "I a un comentari novèl sus un messatge qu'avètz comentat"
+ click_here: "Clicatz aicí"
+ comment_on_post:
+ limited_subject: "I a un comentari novèl sus una publicacion qu'avètz comentada"
+ reply: "Respondre o veire lo messatge de %{name} >"
+ confirm_email:
+ click_link: "Per activar vòstre novèla adreça de corrièl %{unconfirmed_email}, seguissètz aqueste ligam :"
+ subject: "Mercés d'activar vòstre novèl corrièl %{unconfirmed_email}"
+ csrf_token_fail:
+ subject: "Avèm recebut una demanda sens autorizacion dempuèi vòstre compte, %{name}"
+ email_sent_by_diaspora: "Aqueste corrièl es estat mandaat per %{pod_name}. Se volètz pas mai de corrièls atal,"
+ export_email:
+ body: |-
+ Bonjorn %{name},
+
+ Vòstras donadas personalas son estadas tractadas e ara, las podètz telecargar en clicant sus [aqueste ligam](%{url}).
+
+ Coralament,
+
+ Lo messatgièr automatic de diaspora*
+ subject: "Vòstras donadas personalas son prèstas a èsser telecargadas, %{name}"
+ export_failure_email:
+ body: |-
+ Bonjorn %{name},
+
+ I a agut un problèma al moment del tractament de vòstras donadas personalas en vista d'un telecargament.
+ Mercé de tornar ensajar.
+
+ O planhèm sincèrament.
+
+ Lo messatgièr automatic de diaspora*
+ subject: "I a agut un problèma amb vòstras donadas, %{name}"
+ export_photos_email:
+ body: |-
+ Bonjorn %{name},
+
+ Vòstras fòtos son estadas preparadas e son prèstas a èsser telecargadas en seguissent sus [aqueste ligam](%{url}).
+
+ Coralament,
+
+ Lo messatgièr automatic de diaspora*
+ subject: "%{name}, vòstras fòtos son prèstas per èsser telecargadas."
+ export_photos_failure_email:
+ body: |-
+ Bonjorn %{name},
+
+ I a agut un problèma al moment del tractament de vòstras fòtos personalas en vista d'un telecargament.
+ Mercé de tornar ensajar.
+
+ O planhèm sincèrament.
+
+ Lo messatgièr automatic de diaspora*
+ subject: "I a agut un problèma amb vòstras fòtos, %{name}"
+ hello: "Adiu %{name} !"
+ invite:
+ message: |-
+ Bonjorn !
+
+ %{diaspora_id} vos a convidat a rejónher diaspora* !
+
+ Clicatz sul ligam per començar
+
+ %{invite_url}[1]
+
+ O podètz apondre %{diaspora_id} amb vòstres contactes se avètz ja un compte.
+
+ Amistats,
+
+ Lo messatgièr automatic de diaspora* !
+
+ P.S : En cas que coneisseriatz pas (encara) çò qu'es diapora*, aicí[2] i a la responsa !
+
+ [1] : %{invite_url}
+ [2] : %{diasporafoundation_url}
+ invited_you: "%{name} vos a convidat sus diaspora*"
+ liked:
+ liked: "a %{name}, li a agradat vòstra publicacion"
+ limited_post: "A %{name}, li a agradat vòstra publicacion restrenta"
+ view_post: "Veire la publicacion >"
+ mentioned:
+ limited_post: "Sètz estat mencionat dins una publicacion restenta."
+ subject: "%{name} vos a mencionat sus diaspora*"
+ mentioned_in_comment:
+ limited_post: "Sètz mencionat dins un comentari al accès limitat."
+ reply: "Respondre o veire la conversacion >"
+ private_message:
+ reply_to_or_view: "Respondre o afichar aquela conversacion >"
+ subject: "Avètz un novèl messatge privat"
+ remove_old_user:
+ body: |-
+ Bonjorn,
+
+ En rason de l'inactivitat de vòstre compte diaspora* %{pod_url}, planhèm de vos informar que lo sistèma l'a identificat coma devent èsser suprimit automaticament. Aquesta procedura se desenclava aprèp un periòde d'inactivitat superior a %{after_days} jorns.
+
+ Podètz evitar la pèrda de vòstre compte en vos connectant a aqueste abans %{remove_after}, dins aqueste cas la procedura de supression serà automaticament anullada.
+
+ Aquesta mantenença es efectuada per assegurar als utilizaires actius lo mehor foncionament possible d'aquesta instància de diaspora*. Vos mercejam de vòstra compreneson.
+
+ Se volètz conservar vòstre compte, identificatz-vos aicí :
+ %{login_url}
+
+ Esperam vos reveire lèu !
+
+ Lo messatgièr automatic de diaspora*
+ subject: "Vòstre compte diaspora* es estat senhalat coma devent èsser suprimit en rason de son inactivitat"
+ report_email:
+ body: |-
+ Bonjorn,
+
+ lo %{type} amb l'identificant %{id} es estat marcat coma ofensant.
+
+ [%{url}][1]
+
+ Mercé de lo verificar tre que possible !
+
+
+ Coralament,
+
+ Lo messatgièr automatic de diaspora*
+
+ [1]: %{url}
+ subject: "Un novèl %{type} es estat marcat coma ofensant"
+ type:
+ comment: "comentari"
+ post: "messatge"
+ reshared:
+ reshared: "%{name} a tornat partejar vòstra publicacion"
+ view_post: "Veire la publicacion >"
+ single_admin:
+ admin: "Vòstre administrator diaspora*"
+ subject: "Un messatge subre vòstre compte diaspora*"
+ started_sharing:
+ sharing: "a començat a partejar amb vos !"
+ subject: "%{name} a començat a partejar amb vos sus diaspora*"
+ view_profile: "Veire lo perfil de %{name}"
+ thanks: "Mercé,"
+ to_change_your_notification_settings: "per cambiar vòstres reglatges de notificacion"
+ nsfw: "NSFW"
+ ok: "D'acòrdi"
+ people:
+ add_contact:
+ invited_by: "Sètz estat convidat per"
+ index:
+ couldnt_find_them: "Los trobatz pas ?"
+ looking_for: "Recercar publicacions marcadas %{tag_link}"
+ no_one_found: "... e pas cap trobat."
+ no_results: "E ben ! Vos cal cercar quicòm."
+ results_for: "Utilizaires que correspondon a %{search_term}"
+ searching: "Recèrca en cors, mercés d'esperar..."
+ send_invite: "Pas res encara ? Mandatz-lor un convit !"
+ person:
+ thats_you: "Sètz vosautres !"
+ profile_sidebar:
+ bio: "Biografia"
+ born: "Anniversari"
+ gender: "Sèxe"
+ location: "Localizacion"
+ show:
+ closed_account: "Aqueste compte es estat tampat"
+ does_not_exist: "Aquesta persona existís pas !"
+ has_not_shared_with_you_yet: "%{name} a pas encara partejar cap de publicacions amb vos !"
+ photos:
+ create:
+ integrity_error: "Fracàs al moment de mandar l'imatge.  Sètz segur qu'èra un imatge ?"
+ runtime_error: "Fracàs al moment de mandar l'imatge.  Sètz segur que vòstre cinta de seguretat es estacada ?"
+ type_error: "Fracàs al moment de mandar l'imatge.  Sètz segur qu'un imatge es estat apondut ?"
+ destroy:
+ notice: "Fòto suprimida"
+ new_profile_photo:
+ upload: "Mandatz una novèla fòto de perfil !"
+ polls:
+ votes:
+ one: "%{count} vòte pel moment"
+ other: "%{count} vòtes pel moment"
+ zero: "%{count} vòte pel moment"
+ posts:
+ presenter:
+ title: "Una publicacion de %{name}"
+ show:
+ forbidden: "Sètz pas autorizat a far aquò"
+ location: "Publicat dempuèi : %{location}"
+ photos_by:
+ one: "Una fòto per %{author}"
+ other: "%{author} fòtos per %{count}"
+ zero: "Pas cap de fòto per %{author}"
+ reshare_by: "Repartejat per %{author}"
+ privacy: "Vida privada"
+ profile: "Perfil"
+ profiles:
+ edit:
+ allow_search: "Autorizar lo monde a vos recercar dins diaspora*"
+ basic: "Mon perfil basic"
+ basic_hint: "Totes los elements de vòstre perfil son opcionals. Vòstre perfil basic serà totjorn visible publicament."
+ extended: "Mon perfil espandit"
+ extended_visibility_text: "Visibilitat de vòstre perfil complet."
+ first_name: "Pichon nom"
+ last_name: "Nom d'ostal"
+ limited: "Limitat"
+ nsfw_check: "Amagar tot çò que pòsti coma #NSFW"
+ public: "Public"
+ settings: "Paramètres del perfil"
+ update_profile: "Actualizar lo perfil"
+ your_bio: "Vòstra biografia"
+ your_birthday: "Vòstre anniversari"
+ your_gender: "Vòstre sèxe"
+ your_location: "Vòstra localizacion"
+ your_name: "Vòstre nom"
+ your_photo: "Vòstra fòto"
+ your_tags: "Descrivètz-vos en 5 mots"
+ your_tags_placeholder: "Per exemple #filme #catons #viatjar #professor #tolosa"
+ update:
+ failed: "Fracàs de l'actualizacion del perfil"
+ updated: "Perfil a jorn"
+ public: "Public"
+ reactions:
+ one: "1 reaccion"
+ other: "%{count} reaccions"
+ zero: "Pas de reaccion"
+ registrations:
+ closed: "Las inscripcions son tampadas sus aqueste pod diaspora*."
+ create:
+ success: "Avètz rejunt diaspora*!"
+ invalid_invite: "Lo ligam de convit donat es pas mai valid !"
+ new:
+ email: "Adreça electronica"
+ enter_email: "Picatz vòstra adreça de corrièl"
+ enter_password: "Picatz un senhal (sièis caractèrs minimum)"
+ enter_password_again: "Picatz lo meteis senhal coma de per abans"
+ enter_username: "Picatz un escais (sonque letras, chifras e jonhent bas _)"
+ password: "Senhal"
+ password_confirmation: "Confirmacion del senhal"
+ sign_up: "Marcatz-vos"
+ submitting: "Mandadís en cors..."
+ terms: "En creant un compte, acceptatz los %{terms_link}"
+ terms_link: "condicions d'utilizacion"
+ username: "Nom d'utilizaire"
+ report:
+ comment_label: "<b>Comentari</b>:<br>%{data}"
+ confirm_deletion: "Sètz segur que volètz suprimir aqueste element ?"
+ delete_link: "Suprimir l'element"
+ post_label: "<b>Publicacion</b>: %{title}"
+ reason_label: "Rason: %{text}"
+ reported_label: "<b>Senhalat per</b> %{person}"
+ reported_user_details: "Detalhs sus l'utilizaire senhalat"
+ review_link: "Marcat coma revist."
+ status:
+ destroyed: "Lo messatge es estat destruit"
+ failed: "I a agut un problèma."
+ title: "Vista d'ensemble dels senhalaments"
+ reshares:
+ comment_email_subject: "Partiment per %{resharer} d'un messatge de %{author}"
+ create:
+ error: "Fracàs al moment de tornar partejar."
+ reshare:
+ deleted: "La publicacion originala foguèt suprimida per son autor."
+ reshare_confirmation: "Volètz tornar partejar la publicacion de %{author} ?"
+ reshared_via: "Repartejat per"
+ search: "Recercar"
+ services:
+ create:
+ already_authorized: "Un utilizaire que l'identificant diaspora*%{service_name} es %{diaspora_id} a ja autorizat aqueste compte %{service_name}."
+ failure: "Fracàs de l'autentificacion."
+ read_only_access: "Accès en lectura sola, ensajatz tornamai d'autorizar pus tard"
+ success: "Autentificacion capitada"
+ destroy:
+ success: "Autentificacion suprimida."
+ failure:
+ error: "Una error s'est produita al moment de la connexion amb aqueste servici"
+ index:
+ connect: "Connectar"
+ disconnect: "Se desconnectar"
+ edit_services: "Modificar los servicis"
+ logged_in_as: "Connectat coma %{nickname}."
+ no_services_available: "I a pas cap de servici de disponible sus aqueste pod."
+ not_logged_in: "Actualament, sètz pas connectat."
+ really_disconnect: "Se desconnectar de %{service}"
+ services_explanation: "Se connectar a de servicis tèrç vos permet de publicar vòstras publicacions suls aqueles servicis quand n'escrivètz sus diaspora*."
+ share_to: "Partejar amb %{provider}"
+ title: "Geir los servicis connectats"
+ provider:
+ facebook: "Facebook"
+ tumblr: "Tumblr"
+ twitter: "Twitter"
+ wordpress: "WordPress"
+ settings: "Paramètres"
+ shared:
+ aspect_dropdown:
+ mobile_row_checked: "%{name} (suprimir)"
+ mobile_row_unchecked: "%{name} (apondre)"
+ toggle:
+ one: "Dins %{count} aspècte"
+ other: "Dins %{count} aspècte"
+ zero: "Apondre lo contacte"
+ invitations:
+ by_email: "Per corrièl"
+ invite_your_friends: "Convidatz vòstres amics"
+ invites: "Convits"
+ share_this: "Partejatz aqueste ligam via corrièl, blog, o malhums socials !"
+ public_explain:
+ atom_feed: "Flux Atom"
+ control_your_audience: "Contrarotlatz vòstra audiéncia"
+ logged_in: "Connectat a %{service}"
+ manage: "Gerir los servicis connectats"
+ new_user_welcome_message: "Utilizatz las #etiquetas per triar vòstras publicacions e per trobar de monde que partejan vòstres interèsses. Interpellatz de personas genialas amb las @Mencions"
+ outside: "Los messatges publics poiràn èsser vistes per totes, quitament en defòra de diaspora*."
+ share: "Partejatz"
+ title: "Metre en plaça de servicis connectats"
+ visibility_dropdown: "Utilizatz aqueste menú per cambiar la visibilitat de vòstra publicacion  (Vos recomandam de marcar la primièra coma publica)"
+ publisher:
+ discard_post: "Suprimir la publicacion"
+ formatWithMarkdown: "Utilizatz la sintaxi %{markdown_link} per metre en forma vòstre messatge"
+ get_location: "Apondre vòstra localizacion"
+ new_user_prefill:
+ hello: "Adiu mond, soi %{new_user_tag}. "
+ i_like: "M'interèssa %{tags}. "
+ invited_by: "Mercé pel convit, "
+ newhere: "novèlaicí"
+ poll:
+ add_a_poll: "Apondre un sondatge"
+ posting: "Publicacion..."
+ remove_location: "Suprimir l'emplaçament"
+ share: "Partejar"
+ upload_photos: "Mandar de fòtos"
+ whats_on_your_mind: "A qué pensatz ?"
+ stream_element:
+ via: "Via %{link}"
+ via_mobile: "Mandat dempuèi un mobil"
+ simple_captcha:
+ label: "Entratz lo còdi dins lo camp"
+ message:
+ default: "Lo còdi provesit correspond pas a l'imatge"
+ failed: "La verificacion antirobòt a fracassat"
+ user: "L'imatge e lo còdi son diferents"
+ placeholder: "Sasissètz lo contengut de l'imatge"
+ statistics:
+ active_users_halfyear: "Utilizaires actius aqueste semèstre"
+ active_users_monthly: "Utilizaires actius per mes"
+ closed: "Tampat"
+ disabled: "Indisponible"
+ enabled: "Disponible"
+ local_comments: "Comentaris locals"
+ local_posts: "Messatges locals"
+ name: "Nom"
+ network: "Ret"
+ open: "Dobrir"
+ registrations: "Enregistraments"
+ services: "Servicis"
+ total_users: "Total d'utilizaires"
+ version: "Version"
+ status_messages:
+ create:
+ success: "Mencion de : %{names}"
+ new:
+ mentioning: "Menciona : %{person}"
+ too_long: "Avisatz-vos d'escriure un messatge d'estatut de %{count} caractèrs maximum. Compta actualament %{current_length} caractèrs."
+ stream_helper:
+ no_more_posts: "Avètz atent la fin d'aqueste flux."
+ no_posts_yet: "I a pas encara cap de messatge aicí."
+ streams:
+ activity:
+ title: "Mon activitat"
+ aspects:
+ title: "Mos aspèctes"
+ aspects_stream: "Aspèctes"
+ comment_stream:
+ title: "Publicacions comentadas"
+ community_spotlight_stream: "Actualitat de la comunitat"
+ followed_tag:
+ add_a_tag: "Apondre una etiqueta"
+ follow: "Seguir"
+ title: "#Tags seguits"
+ followed_tags_stream: "#Tags seguits"
+ like_stream:
+ title: "Flux dels elements qu'agradan"
+ mentioned_stream: "@Mencions"
+ mentions:
+ title: "@Mencions"
+ multi:
+ title: "Flux"
+ public:
+ title: "Activitat publica"
+ tags:
+ title: "Messatges tagats : %{tags}"
+ tag_followings:
+ manage:
+ no_tags: "Seguissètz pas cap de tag."
+ title: "Gerir los tags seguits."
+ tags:
+ name_too_long: "Vòstre tag deu far mens de %{count} caractèrs ( actualament, %{current_length})"
+ show:
+ follow: "Seguir #%{tag}"
+ none: "L'etiqueta voida existís pas !"
+ stop_following: "Arrectar de seguir #%{tag}"
+ tagged_people:
+ one: "1 persona marcada amb %{tag}"
+ other: "%{count} personas marcadas amb %{tag}"
+ zero: "Degun es pas marcat amb %{tag}"
+ username: "Nom d'utilizaire"
+ users:
+ confirm_email:
+ email_confirmed: "Corrièl %{email} activat"
+ email_not_confirmed: "Es possible que lo corrièl no siá activat. Marrit ligam ?"
+ destroy:
+ no_password: "Mercé de picar vòstre sehnal actual per tampar lo vòstre compte."
+ success: "Vòstre compte es estat verrolhat. Pòt prene vint minuta per ne finalizar la tampadura. Mercés d'aver ensajat diaspora*."
+ wrong_password: "Lo senhal dintrat correpond pas amb lo senhal actual."
+ edit:
+ also_commented: "qualqu'un a comentat una publicacion qu'avètz comentada"
+ auto_follow_aspect: "Aspècte pels utilizaires seguts automaticament :"
+ auto_follow_back: "Automaticament partejar amb los utilizaires que partejan amb vos"
+ change: "Modificar"
+ change_color_theme: "Cambiar lo tèma de color"
+ change_email: "Cambiar de corrièl"
+ change_language: "Cambiar de lenga"
+ change_password: "Cambiar lo senhal"
+ character_minimum_expl: "deu conténer sièis caractèrs al minim"
+ close_account:
+ dont_go: "E, se vos plai, patiscatz pas !"
+ lock_username: "Vòstre nom d'utilizaire serà verrolhat. Poiretz pas crear un novèl compte sus aqueste pod amb lo meteis ID."
+ locked_out: "Seretz desconnectat e vòstre compte serà inaccessible fins a sa supression."
+ make_diaspora_better: "Nos agradariá fòrça que demorèssetz e nos ajudèssetz a far un melhor diaspora* puslèu que de nos daissar. Se volètz vertadièrament partir, pasmens, vaquí çò que se va passar :"
+ mr_wiggles: "Mossur Wiggles serà triste de vos veire partir."
+ no_turning_back: "Es pas possible de tornar en arrièr ! Se sètz segur de vos, sasissètz vòstre senhal çaijós."
+ what_we_delete: "Suprimirem totas vòstras publicacions e informacions de perfil tre que possible. Vòstres comentaris sus la publicacion del mond desapareisseràn, mai seràn associats a vòstre ID diaspora* al lòc de vòstre nom."
+ close_account_text: "Tampar lo compte"
+ comment_on_post: "qualqu'un comenta vòstra publicacion"
+ current_password: "Senhal actual"
+ current_password_expl: "Lo senhal que causissètz..."
+ default_post_visibility: "Aspèctes per defaut seleccionats per las publicacions"
+ download_export: "Telecargar mon perfil"
+ download_export_photos: "Telecargar mas fòtos"
+ edit_account: "Modificar lo compte"
+ email_awaiting_confirmation: "Vos avèm mandat un ligam d'activacion a l'adreça %{unconfirmed_email}. Fins al moment qu'auretz sul ligam e activetz la novèla adreça, anam contunhar d'utilizar vòstra adreça d'origina %{email}."
+ export_data: "Exportar de donadas"
+ export_in_progress: "Sèm a tractar vòstras donadas. Verificatz tornamai l'avançament dins un moment."
+ export_photos_in_progress: "Sèm a tractar vòstras fòtos. Tornatz aicí dins un momenton."
+ following: "Paramètres de partiment"
+ last_exported_at: "(Darrièra mesa a jorn a %{timestamp})"
+ liked: "a qualqu'un li a agradat vòstra publicacion"
+ mentioned: "...se vos menciona dins un messatge."
+ mentioned_in_comment: "sètz mencionat dins un comentari"
+ new_password: "Senhal novèl"
+ private_message: "Avètz recebut un messatge privat."
+ receive_email_notifications: "Recebre una notificacion per corrièl quand :"
+ request_export: "Demandar mas donadas de perfil"
+ request_export_photos: "Demandar mas fòtos"
+ request_export_photos_update: "Refrescar mas fòtos."
+ request_export_update: "Refrescar mas donadas de perfil"
+ reshared: "qualqu'un a tornat partejar vòstra publicacion"
+ show_community_spotlight: "Mostrar l'actualitat de la comunitat dins lo flux"
+ show_getting_started: "Mostrar las astúcias de descoberta"
+ someone_reported: "Qualqu'un a senhalat un messatge"
+ started_sharing: "qualqu'un a començat a partejar amb vos"
+ stream_preferences: "Preferéncias del flux"
+ your_email: "Vòstre corrièl"
+ your_email_private: "Vòstre email serà pas jamai vist per d'autres utilizaires"
+ your_handle: "Vòstre ID diaspora*"
+ getting_started:
+ awesome_take_me_to_diaspora: "Òsca ! Mena-me cap a diaspora*"
+ community_welcome: "La comunautat diaspora* es contenta de vos aver a bòrd."
+ connect_to_facebook: "Podèm accelerar un pauc las causas de %{link} sus diaspora*. Aquò botarà vòstre nom e foto, e activar la publicacion multiplataforma."
+ connect_to_facebook_link: "Connexion amb vòtre compte Facebook en cors"
+ hashtag_explanation: "Las etiquetas vos permeton de charrar e seguir vòstres interèsses. Son tanben una bona manièra de trobar de mond novèl sus diaspora*."
+ hashtag_suggestions: "Ensejatz etiquetas coma aquestas #art #filmes #gif, etc."
+ well_hello_there: "E ben, adiu monde !"
+ what_are_you_in_to: "Qué vos interèssa ?"
+ who_are_you: "Qual sètz ?"
+ privacy_settings:
+ ignored_users: "Utilizaires ignorats"
+ no_user_ignored_message: "Actualament, ignoratz pas cap d'utilizaire"
+ stop_ignoring: "Arrestar d'ignorar"
+ strip_exif: "Levar dels imatges mandats las metadonadas talas coma luòc de presa, autor o modèl d'aparelh fòto (recomandat)"
+ title: "Reglatges de confidencialitat"
+ public:
+ does_not_exist: "L'utilizaire %{username} existís pas !"
+ update:
+ color_theme_changed: "Tèma de color cambiat."
+ color_theme_not_changed: "Una error s'es produita pendent lo cambiament de tèma de color."
+ email_notifications_changed: "Notificacions corrièl cambiadas"
+ follow_settings_changed: "Reglatges cambiats pel seguiment"
+ follow_settings_not_changed: "Cambiament dels reglatges pel seguiment fracassat."
+ language_changed: "Lenga cambiada"
+ language_not_changed: "Cambiament de lenga fracassat"
+ password_changed: "Senhal cambiat.  Ara, vos podètz connectar amb lo senhal novèl."
+ password_not_changed: "Cambiament de senhal mancat"
+ settings_not_updated: "Mesa a jorn fracassada"
+ settings_updated: "Reglatges mes a jorn"
+ unconfirmed_email_changed: "Corrièl cambiat. Cal far una activacion."
+ unconfirmed_email_not_changed: "Cambiament de corrièl mancat"
+ will_paginate:
+ next_label: "seguent &raquo;"
+ previous_label: "&laquo; precedent" \ No newline at end of file
diff --git a/config/locales/diaspora/pl.yml b/config/locales/diaspora/pl.yml
index c664c3714..248dbd440 100644
--- a/config/locales/diaspora/pl.yml
+++ b/config/locales/diaspora/pl.yml
@@ -276,7 +276,6 @@ pl:
conversations:
create:
fail: "Nieprawidłowa wiadomość"
- no_contact: "Hej! Najpierw należy dodać kontakt!"
sent: "Wiadomość została wysłana"
destroy:
delete_success: "Rozmowa usunięta"
@@ -531,9 +530,6 @@ pl:
tutorials: "samouczki"
wiki: "wiki"
invitations:
- a_facebook_user: "Użytkownik Facebooka"
- check_token:
- not_found: "Nie odnaleziono identyfikatora zaproszenia"
create:
empty: "Podaj przynajmniej jeden adres e-mail."
no_more: "Nie masz więcej zaproszeń."
@@ -826,14 +822,8 @@ pl:
type_error: "Nie udało się przesłać zdjęcia. Czy na pewno doda@{m:łeś|f:łaś|n:no} obraz?"
destroy:
notice: "Usunięto zdjęcie."
- new_photo:
- empty: "Plik {file} jest pusty. Wybierz proszę jeszcze raz odpowiednie pliki, pomijając ten."
- invalid_ext: "Plik {file} ma niewłaściwe rozszerzenie. Akceptowane rozszerzenia: {extensions}"
- size_error: "Plik {file} jest zbyt duży, maksymalny rozmiar to {sizeLimit}."
new_profile_photo:
upload: "Prześlij nowe zdjęcie profilowe!"
- show:
- show_original_post: "Wyświetl oryginalny wpis"
posts:
presenter:
title: "Wpis od %{name}"
diff --git a/config/locales/diaspora/pt-BR.yml b/config/locales/diaspora/pt-BR.yml
index 6aa04fa4b..7e2d70bee 100644
--- a/config/locales/diaspora/pt-BR.yml
+++ b/config/locales/diaspora/pt-BR.yml
@@ -268,6 +268,8 @@ pt-BR:
post_something: "Publicar em diaspora*"
cancel: "Cancelar"
comments:
+ create:
+ error: "Falha ao comentar."
new_comment:
comment: "Comentar"
commenting: "Comentando..."
@@ -292,7 +294,6 @@ pt-BR:
conversations:
create:
fail: "Mensagem inválida"
- no_contact: "Cuidado, você precisa adicionar o contato primeiro!"
sent: "Mensagem enviada"
destroy:
delete_success: "Conversa excluída com sucesso"
@@ -301,6 +302,7 @@ pt-BR:
conversations_inbox: "Conversas – Caixa de Entrada"
inbox: "Entrada"
new_conversation: "Nova conversa"
+ no_contacts: "Você precisa adicionar contatos antes de começar uma conversa."
no_messages: "Não há mensagens"
new:
message: "Mensagem"
@@ -325,6 +327,7 @@ pt-BR:
delete: "Apagar"
email: "E-mail"
error_messages:
+ csrf_token_fail: "O código CSRF é inválido. Por favor, entre no sistema e tente de novo."
helper:
correct_the_following_errors_and_try_again: "Corrija os erros a seguir e tente novamente."
need_javascript: "Este site precisa de JavaScript para funcionar corretamente. Se você desabilitou o Javascript, habilite-o e atualize esta página."
@@ -558,7 +561,6 @@ pt-BR:
own_your_data: "Os seus dados são seus"
own_your_data_info: "Várias redes lucram com seus dados, analisando as suas interações e usando as informações obtidas para fazer publicidade. A diaspora* não usa seus dados para nada além de possibilitar que você se conecte e compartilhe com outras pessoas."
podmin:
- admin_panel: "painel de administração"
byline: "Você está prestes a revolucionar a internet. Vamos começar?"
configuration_info: "Abra %{database_path} e %{diaspora_path} no seu editor de texto favorito e revise-os cuidadosamente, estão minuciosamente comentados."
configure_your_pod: "Configure seu servidor"
@@ -572,22 +574,21 @@ pt-BR:
getting_help_info: "Nós listamos %{faq}, inclusive dicas, macetes e soluções para os problemas mais comuns. Sinta-se livre, também, para %{irc}."
headline: "Olá, colega."
make_yourself_an_admin: "Assuma a administração"
- make_yourself_an_admin_info: "Você pode encontrar instruções na %{wiki}. Quando você entrar no sistema, haverá um link \"Admin\" no seu menu de usuário, no cabeçalho. Você poderá buscar usuários e ver as estatísticas do seu servidor. Para detalhes sobre os aspectos operacionais do seu servidor, vá para o %{admin_panel}."
+ make_yourself_an_admin_info: "Você pode encontrar instruções na %{wiki}. Isso vai adicionar um link \"%{admin_dashboard}\", visível quando você entrar no sistema, ao seu menu de usuário, no cabeçalho. Você poderá buscar usuários e ver as estatísticas do seu servidor."
report_bugs: "reporte-o"
update_instructions: "instruções para atualizar na wiki da diaspora*"
update_your_pod: "Atualize seu servidor"
update_your_pod_info: "Você pode encontrar %{update_instructions}."
invitation_codes:
+ already_logged_in: "%{inviter} te convidou para se juntar a este servidor, mas você já fez login."
not_valid: "Esse código de convite expirou"
invitations:
- a_facebook_user: "Um usuário do Facebook"
- check_token:
- not_found: "Convite não encontrado."
create:
+ closed: "Convites estão desativados neste servidor diaspora*."
empty: "Por favor, insira ao menos um endereço de email."
no_more: "Você não possui mais convites."
note_already_sent: "Convites já foram enviados para: %{emails}"
- rejected: "Houve problemas com os seguintes endereços de e-mail: "
+ rejected: "Os seguintes endereços de e-mail tiveram problemas: %{emails}"
sent: "Convites enviados para: %{emails}"
new:
codes_left:
@@ -616,6 +617,9 @@ pt-BR:
profile: "Perfil"
settings: "Configurações"
toggle_navigation: "Alternar navegação"
+ likes:
+ create:
+ error: "Falha ao curtir."
limited: "Limitado"
more: "Mais"
no_results: "Nenhum resultado encontrado"
@@ -669,9 +673,15 @@ pt-BR:
other: "%{actors} mencionaram você na publicação %{post_link}."
zero: "%{actors} mencionou você na publicação %{post_link}."
mentioned_deleted:
- one: "%{actors} mencionou você em uma publicação apagada."
- other: "%{actors} mencionaram você em uma publicação apagada."
+ one: "%{actors} mencionou você em uma publicação deletada."
+ other: "%{actors} mencionaram você em uma publicação deletada."
zero: "%{actors} mencionou você em uma publicação apagada."
+ mentioned_in_comment:
+ one: "%{actors} mencionou você em um <a href='%{comment_path}'> à publicação %{post_link}."
+ other: "%{actors} mencionaram você em um <a href='%{comment_path}'> à publicação %{post_link}."
+ mentioned_in_comment_deleted:
+ one: "%{actors} mencionou você em um comentário deletado."
+ other: "%{actors} mencionaram você em um comentário deletado."
post: "publicação"
private_message:
one: "%{actors} te enviou uma mensagem."
@@ -702,6 +712,29 @@ pt-BR:
confirm_email:
click_link: "Para confirmar o seu novo endereço de email %{unconfirmed_email}, por favor clique neste link:"
subject: "Por favor, ative o seu novo endereço de email %{unconfirmed_email}"
+ csrf_token_fail:
+ body: |-
+ Olá, %{name},
+
+ A diaspora* detectou uma tentativa de acessar a sua sessão que talvez não tenha sido autorizada. Para não arriscar comprometer os seus dados, encerramos sua sessão no sistema. Não se preocupe, você pode entrar com segurança agora.
+
+ Uma solicitação foi feita usando um código CSRF incorreto ou inexistente. Pode não ser nada, mas também pode ser uma tentativa de falsificação de solicitação entre sites (CSRF, do inglês _cross-site request forgery_).
+
+ Isso pode ter sido causado por:
+
+   - Um complemento manipulando o pedido ou fazendo pedidos sem o código;
+   - Uma aba com uma sessão anterior deixada aberta;
+ - Outro site fazendo pedidos, com ou sem a sua permissão;
+ - Várias outras ferramentas externas;
+ - Código malicioso tentando acessar os seus dados.
+
+ Para saber mais sobre falsificação de solicitação entre sites, veja [%{link}](%{link}).
+
+ Se você receber essa mensagem várias vezes, por favor, verifique os itens acima, inclusive os complementos do navegador.
+
+ Nossa equipe agradece.
+ diaspora*
+ subject: "Recebemos um pedido não autorizado da sua conta, %{name}"
email_sent_by_diaspora: "Este email foi enviado por %{pod_name}. Se você deseja parar de receber emails como este,"
export_email:
body: |-
@@ -771,6 +804,9 @@ pt-BR:
mentioned:
limited_post: "Você foi mencionado em uma publicação privada."
subject: "%{name} mencionou você em Diaspora*"
+ mentioned_in_comment:
+ limited_post: "Mencionaram você em um comentário a uma publicação limitada."
+ reply: "Responder ou ver esta conversa >"
private_message:
reply_to_or_view: "Responder ou visualizar esta conversa >"
subject: "Há uma nova mensagem privada para você"
@@ -856,14 +892,8 @@ pt-BR:
type_error: "O envio da foto falhou. Tem certeza que a imagem é válida?"
destroy:
notice: "Foto apagada."
- new_photo:
- empty: "{file} está vazio, por favor, selecione os arquivos novamente."
- invalid_ext: "{file} possui uma extensão inválida. Somente {extensions} são permitidos."
- size_error: "{file} é muito grande, o tamanho máximo para arquivos é {sizeLimit}."
new_profile_photo:
upload: "Envie uma foto nova para o perfil!"
- show:
- show_original_post: "Ver publicação original"
polls:
votes:
one: "Um voto até agora"
@@ -947,8 +977,14 @@ pt-BR:
destroyed: "A publicação foi destruída"
failed: "Alguma coisa deu errado"
title: "Visão Geral de Relatos"
+ unreviewed_reports:
+ one: "Há um relatório sem revisar."
+ other: "Há %{count} relatórios sem revisar."
+ zero: "Não há relatórios sem revisar."
reshares:
comment_email_subject: "publicação de %{author} recompartilhada por %{resharer}"
+ create:
+ error: "Falha ao recompartilhar."
reshare:
deleted: "A publicação original foi apagada pelo autor."
reshare_confirmation: "Recompartilhar publicação de %{author}?"
@@ -989,7 +1025,7 @@ pt-BR:
one: "Em %{count} aspecto"
other: "Em %{count} aspectos"
invitations:
- by_email: "Por email"
+ by_email: "Convidar pessoas por e-mail"
invite_your_friends: "Convide seus Amigos"
invites: "Convites"
share_this: "Compartilhe este link via email, blog, ou redes sociais!"
@@ -1123,6 +1159,7 @@ pt-BR:
comment_on_post: "alguém comentar uma publicação sua"
current_password: "Senha atual"
current_password_expl: "o que você usa atualmente..."
+ default_post_visibility: "Aspectos selecionados para publicar por padrão"
download_export: "Baixar o meu perfil"
download_export_photos: "Baixar minhas fotos"
edit_account: "Editar Conta"
diff --git a/config/locales/diaspora/pt-PT.yml b/config/locales/diaspora/pt-PT.yml
index da2cfbc4e..a0b2699cc 100644
--- a/config/locales/diaspora/pt-PT.yml
+++ b/config/locales/diaspora/pt-PT.yml
@@ -191,7 +191,6 @@ pt-PT:
conversations:
create:
fail: "Mensagem inválida"
- no_contact: "Cuidado, tem de adicionar primeiro um contacto!"
sent: "A mensagem foi enviada"
index:
inbox: "Caixa de entrada"
@@ -367,9 +366,6 @@ pt-PT:
tutorials: "tutoriais"
wiki: "wiki"
invitations:
- a_facebook_user: "Um utilizador do Facebook"
- check_token:
- not_found: "Código de convite não encontrado"
create:
empty: "Por favor insira pelo menos um endereço de email."
no_more: "Não tem mais convites."
@@ -546,14 +542,8 @@ pt-PT:
type_error: "O envio da fotografia falhou. Tem a certeza que uma imagem foi adicionada?"
destroy:
notice: "Fotografia apagada."
- new_photo:
- empty: "{file} está vazio, por favor seleccione de novo os ficheiros sem este último."
- invalid_ext: "{file} tem uma extensão inválida. Apenas são permitidas as extensões {extensions}."
- size_error: "{file} é demasiado grande, o tamanho máximo é {sizeLimit}."
new_profile_photo:
upload: "Envie uma fotografia de perfil nova!"
- show:
- show_original_post: "Mostrar publicação original"
posts:
presenter:
title: "Uma publicação de %{name}"
diff --git a/config/locales/diaspora/ro.yml b/config/locales/diaspora/ro.yml
index 06eedbab0..77303dc02 100644
--- a/config/locales/diaspora/ro.yml
+++ b/config/locales/diaspora/ro.yml
@@ -173,16 +173,12 @@ ro:
be_who_you_want_to_be: "Fii cine vrei să fii"
own_your_data: "Fii tu însăşi proprietarul datelor tale"
podmin:
- admin_panel: "panoul de administrator"
contact_irc: "contactează-ne pe IRC"
contribute: "Contribuie"
create_an_account: "Crează-ţi contul."
headline: "Bine ai venit, prietene."
make_yourself_an_admin: "Devino administrator"
invitations:
- a_facebook_user: "Un utilizator Facebook"
- check_token:
- not_found: "Invitaţia nu a fost găsită"
create:
no_more: "Nu mai dispui de invitaţii."
rejected: "Urmatoarele adrese de email au prezentat probleme:"
@@ -346,14 +342,8 @@ ro:
type_error: "Imaginea nu s-a incarcat cu succes. Sunteti sigur ca era o imagine?"
destroy:
notice: "Fotografie eliminată."
- new_photo:
- empty: "{file} este gol, incearcă să selectezi fişiere din nou fără acest fişier."
- invalid_ext: "{file} are o extensie invalidă. Doar extensiile {extensions} sunt permise."
- size_error: "{file} este prea mare, mărimea maximă a unui fişier este {sizeLimit}."
new_profile_photo:
upload: "Încarcă o fotografie de profil nouă!"
- show:
- show_original_post: "Afişează publicaţia originală"
posts:
presenter:
title: "Un articol de la %{name}"
diff --git a/config/locales/diaspora/ru.yml b/config/locales/diaspora/ru.yml
index f56854595..35403ac23 100644
--- a/config/locales/diaspora/ru.yml
+++ b/config/locales/diaspora/ru.yml
@@ -260,7 +260,6 @@ ru:
conversations:
create:
fail: "Неверное сообщение"
- no_contact: "Эй, вам нужно сначала добавить контакт!"
sent: "Сообщение отправлено"
destroy:
delete_success: "Диалог успешно удален"
@@ -526,7 +525,6 @@ ru:
own_your_data: "Владелец ваших данных - вы"
own_your_data_info: "Многие социальные сети используют ваши данные, чтобы делать деньги, анализируя ваши интересы и используя их для рекламирования вам вещей. диаспора* использует ваши данные только в той мере, в которой это необходимо для организации подключения и общения с другими людьми."
podmin:
- admin_panel: "административной панелью"
byline: "Ты скоро изменишь Интернет. Давай подготовим тебя?"
configuration_info: "Откройте %{database_path} и %{diaspora_path} в любимом текстовом редакторе и внимательно изучите. Они подробно прокомментированы."
configure_your_pod: "Настроить ваш под"
@@ -542,9 +540,6 @@ ru:
invitation_codes:
not_valid: "Код для приглашения уже не активен"
invitations:
- a_facebook_user: "Пользователь Facebook"
- check_token:
- not_found: "Код приглашения не найден"
create:
empty: "Пожалуйста введите хотя бы один адрес электронной почты."
no_more: "У вас закончились приглашения."
@@ -761,15 +756,13 @@ ru:
body: |-
Привет,
- Всвязи с неактивностью вашей учётной записи diaspora* на %{pod_url}, мы вынуждеы сообщить вам, что система отметила вашу учётную запись к автоматизированному удалению. Это происходит автоматически по прошествию периода неактивности более %{after_days} дней.
+ Похоже, Вы расхотели пользоваться учётной записью %{pod_url}, Вы не использовали её уже %{after_days} дней! Чтобы обеспечить активных пользователей нашего сервера максимальной производительностью, мы время от времени ищем и удаляем из нашей базы данных учётные записи, которые более не нужны своим владельцам. К сожалению, Ваша учётная запись попала в кандидаты на удаление.
- Вы можете избежать потери учётной записи, зайдя в нее до %{remove_after}, в случае чего удаление будет автоматически отменено.
+ Однако, мы с удовольствием оставим Вашу учётную запись за Вами и не будем удалять её, если вы дадите знать нам об этом, просто зайдя к нам до %{remove_after}. А когда заглянете, заодно ещё разок осмотритесь - с Вашего последнего посещения у нас тут наверняка случилось немало интересного! А ещё можно осмотреть, что другие люди помечали #хэштэгами, которые встречаются в записях интересных Вам людей.
- Эта техническая операция выполняется с целью убедиться в том, что активные пользователи получают большую часть ресурсов данной инстанции diaspora* . Благодарим за понимание.
+ Для Вашего удобства, вот ссылка на страницу входа: %{login_url}. Если Вы забыли свои реквизиты для входа, Вы можете восстановить их на этой странице.
- Если вы хотите сохранить ваш аккаунт, пожалуйста, войдите в него здесь: %{login_url}
-
- В надежде увидеть вас снова,
+ В надежде увидеть Вас снова,
Почтовый робот diaspora*!
subject: "Ваша учётная запись помечена на удаление по причине неактивности"
report_email:
@@ -835,14 +828,8 @@ ru:
type_error: "Сбой при загрузке фототрафии. Вы уверены, что добавили фотографию?"
destroy:
notice: "Фотография удалена."
- new_photo:
- empty: "{file} пуст, выберите пожалуйста файлы без него."
- invalid_ext: "{file} имеет недопустимое расширение. Разрешены только {extensions}."
- size_error: "{file} слишком большой, максимальный размер файла {sizeLimit}."
new_profile_photo:
upload: "Загрузить новое фото для профиля!"
- show:
- show_original_post: "Показать исходную запись"
posts:
presenter:
title: "Запись %{name}"
diff --git a/config/locales/diaspora/si.yml b/config/locales/diaspora/si.yml
index 398ff4552..ea94d53e7 100644
--- a/config/locales/diaspora/si.yml
+++ b/config/locales/diaspora/si.yml
@@ -91,7 +91,6 @@ si:
email: "විද්‍යුත් තැපෑල"
find_people: "පුද්ගයින් සෙවීම හෝ #tags"
invitations:
- a_facebook_user: "Facebook පරිශීලකයෙක්"
create:
no_more: "ඔබ සතුව තවත් අරාධනාවන් නැත."
new:
diff --git a/config/locales/diaspora/sk.yml b/config/locales/diaspora/sk.yml
index 9394322d1..aaceadb94 100644
--- a/config/locales/diaspora/sk.yml
+++ b/config/locales/diaspora/sk.yml
@@ -198,7 +198,6 @@ sk:
conversations:
create:
fail: "Neplatná správa"
- no_contact: "Pozor, najprv treba pridať kontakt!"
sent: "Správa odoslaná"
index:
conversations_inbox: "Rozhovory – Poštová schránka"
@@ -318,9 +317,6 @@ sk:
tutorials: "návody"
wiki: "wiki"
invitations:
- a_facebook_user: "Používateľ(ka) Facebooku"
- check_token:
- not_found: "Číslo pozvánky sa nenašlo"
create:
empty: "Zadajte, prosím, aspoň jednu e-mailovú adresu."
no_more: "Nemáš žiadne nové pozvánky."
@@ -505,14 +501,8 @@ sk:
type_error: "Nepodarilo sa nahrať fotku. Určite si pridal(a) obrázok?"
destroy:
notice: "Fotka zmazaná."
- new_photo:
- empty: "Súbor {file} je prázdny; vyber, prosím, znova všetky súbory okrem tohto."
- invalid_ext: "Súbor {file} má neplatnú príponu. Povolené sú len prípony {extensions}."
- size_error: "Súbor {file} je príliš veľký, maximálna povolená veľkosť je {sizeLimit}."
new_profile_photo:
upload: "Nahrať novú profilovú fotku!"
- show:
- show_original_post: "Zobraziť pôvodný príspevok"
posts:
presenter:
title: "Príspevok, ktorý napísal(a) %{name}"
diff --git a/config/locales/diaspora/sl.yml b/config/locales/diaspora/sl.yml
index 9f3de5e90..037411fdf 100644
--- a/config/locales/diaspora/sl.yml
+++ b/config/locales/diaspora/sl.yml
@@ -200,7 +200,6 @@ sl:
conversations:
create:
fail: "Neveljavno sporočilo"
- no_contact: "Hej, najprej moraš dodati stike!"
sent: "Sporočilo poslano"
index:
inbox: "Prejeto"
@@ -227,9 +226,6 @@ sl:
fill_me_out: "Izpolni me"
find_people: "Poišči ljudi ali #zaznamke"
invitations:
- a_facebook_user: "Facebook uporabnik"
- check_token:
- not_found: "Povabilo ni bilo najdeno"
create:
empty: "Prosim vnesite vsaj en elektronski poštni naslov."
no_more: "Nimate več povabil."
@@ -420,14 +416,8 @@ sl:
type_error: "Nalaganje slike ni uspelo. Ste prepričani, da je bila dodana slika?"
destroy:
notice: "Slika izbrisana."
- new_photo:
- empty: "Datoteka {file} je prazna, prosimo ponovno izberite datoteke brez nje."
- invalid_ext: "Datoteka {file} ni veljavna. Dovoljene so samo naslednje vrste datotek {extensions}."
- size_error: "Datoteka {file} je prevelika, največja dovoljena velikost je {sizeLimit}."
new_profile_photo:
upload: "Naloži novo sliko profila!"
- show:
- show_original_post: "Prikaži originalno objavo"
posts:
presenter:
title: "Objava osebe %{name}"
diff --git a/config/locales/diaspora/sr.yml b/config/locales/diaspora/sr.yml
index 685fb44a5..c1d622a8b 100644
--- a/config/locales/diaspora/sr.yml
+++ b/config/locales/diaspora/sr.yml
@@ -139,9 +139,6 @@ sr:
fill_me_out: "Испуни ме"
find_people: "Тражи људе или #тагове"
invitations:
- a_facebook_user: "Фејсбук корисник"
- check_token:
- not_found: "Токен позивнице није пронађен"
create:
no_more: "Немате више позивница."
rejected: "Ове email адресе имају проблеме: "
@@ -210,8 +207,6 @@ sr:
notice: "Слика обрисана"
new_profile_photo:
upload: "Додајте нову профилну слику!"
- show:
- show_original_post: "Прикажи оригиналну објаву"
privacy: "Приватност"
profile: "Профил"
profiles:
diff --git a/config/locales/diaspora/sv.yml b/config/locales/diaspora/sv.yml
index da01b223e..6d4e4c3a4 100644
--- a/config/locales/diaspora/sv.yml
+++ b/config/locales/diaspora/sv.yml
@@ -274,6 +274,8 @@ sv:
post_something: "Dela på Diaspora*"
cancel: "Avbryt"
comments:
+ create:
+ error: "Lyckades inte kommentera."
new_comment:
comment: "Kommentera"
commenting: "Kommenterar..."
@@ -293,11 +295,11 @@ sv:
user_search: "Användarsökning"
spotlight:
community_spotlight: "Gemenskapens rampljus"
+ no_members: "Det finns inga medlemmar än."
suggest_member: "Föreslå en medlem"
conversations:
create:
fail: "Ogiltigt meddelande"
- no_contact: "Hallå där! Du måste först lägga till kontakten."
sent: "Meddelandet har skickats"
destroy:
delete_success: "Konversationen har tagits bort"
@@ -306,6 +308,7 @@ sv:
conversations_inbox: "Konversationer – Inkorg"
inbox: "Inkorg"
new_conversation: "Ny konversation"
+ no_contacts: "Du behöver lägga till några kontakter innan du kan konversera."
no_messages: "Inga meddelanden"
new:
message: "Meddelande"
@@ -330,6 +333,7 @@ sv:
delete: "Ta bort"
email: "E-post"
error_messages:
+ csrf_token_fail: "Ogiltigt CSRF-insegel. Vanligen logga in och försök igen."
helper:
correct_the_following_errors_and_try_again: "Rätta till följande fel och försök igen."
need_javascript: "Denna webbplats behöver JavaScript för att fungera ordentligt. Har du inaktiverat JavaScript, får du vara så snäll att aktivera det och ladda om sidan."
@@ -563,7 +567,6 @@ sv:
own_your_data: "Du äger din data"
own_your_data_info: "Många nätverk använder din data för att tjäna pengar genom att analysera dig och använda din data för att sälja reklam riktad mot dig. Diaspora* använder inte din data för något annat än att låta dig kommunicera med andra."
podmin:
- admin_panel: "administratörspanel"
byline: "Du är just på väg att förändra Internet. Är du redo för att komma igång?"
configuration_info: "Öppna %{database_path} och %{diaspora_path} i en textredigerare och gå igenom dem noggrant. De är fyllda med kommentarer."
configure_your_pod: "Konfigurera din pod"
@@ -577,22 +580,21 @@ sv:
getting_help_info: "Vi har listat några %{faq} med ytterligare råd och problemlösningar för de främsta problemen. Du är även välkommen på %{irc}."
headline: "Välkommen, vän."
make_yourself_an_admin: "Gör dig till administratör"
- make_yourself_an_admin_info: "Du hittar instruktioner på %{wiki}. Detta skapar en administratörslänk i din användarmeny när du har loggat in. Där ges du verktyg för att söka och finna statistik för din pod. För fler detaljer om driftaspekterna för din pod, gå till %{admin_panel}."
+ make_yourself_an_admin_info: "Du hittar instruktioner på %{wiki}. Detta ger en %{admin_dashboard}-länk i din användarmeny efter att du har loggat in. Via den kommer du till verktyg för att söka och finna statistik för din pod."
report_bugs: "rapportera dem"
update_instructions: "uppdateringsinstruktioner från Diasporawikin."
update_your_pod: "Uppdatera din pod"
update_your_pod_info: "Du finner %{update_instructions}"
invitation_codes:
+ already_logged_in: "Du är inbjuden att gå med denna pod av %{inviter}, men det tycks som att du redan är inloggad."
not_valid: "Inbjudningskoden är inte längre giltig."
invitations:
- a_facebook_user: "En Facebookanvändare"
- check_token:
- not_found: "Inbjudan kan inte hittas"
create:
+ closed: "Inbjudningar är inte längre möjliga till denna Diaspora*-pod."
empty: "Var snäll och ange minst en e-postadress."
no_more: "Du har inga fler inbjudningar."
note_already_sent: "Inbjudningar har redan skickats till: %{emails}"
- rejected: "Det är problem med följande e-postadresser: "
+ rejected: "Det är problem med följande e-postadresser: %{emails}"
sent: "Inbjudningarna har skickats till: %{emails}"
new:
codes_left:
@@ -621,6 +623,9 @@ sv:
profile: "Profil"
settings: "Inställningar"
toggle_navigation: "Skifta navigation"
+ likes:
+ create:
+ error: "Lyckades inte gilla."
limited: "Begränsad"
more: "Mer"
no_results: "Inga sökresultat"
@@ -654,7 +659,7 @@ sv:
mark_all_shown_as_read: "Märk allt som läst"
mark_read: "Lästmärk"
mark_unread: "Markera som oläst"
- mentioned: "Omnämnd"
+ mentioned: "Omnämnd i inlägg"
no_notifications: "Du har inga notifikationer än."
notifications: "Notiser"
reshared: "Återdelad"
@@ -676,7 +681,7 @@ sv:
mentioned_deleted:
one: "%{actors} har nämnt dig i ett raderat inlägg."
other: "%{actors} har nämnt dig i ett raderat inlägg."
- zero: "Ingen inlägg där du är nämnd har raderats."
+ zero: "inga inlägg där du är nämnd har raderats."
post: "inlägg"
private_message:
one: "%{actors} har skickat dig ett meddelande."
@@ -707,6 +712,27 @@ sv:
confirm_email:
click_link: "För att aktivera din nya e-postadress %{unconfirmed_email}, klicka här:"
subject: "Var vänlig och aktivera din nya e-postadress %{unconfirmed_email}"
+ csrf_token_fail:
+ body: |-
+ Hej, %{name}.
+
+ Diaspora* har märkt av ett potentiellt oauktoriserat försökt tilla tt komma åt din session. För att undkomma att din data själs, har du loggats ut. Räds icke; du kan nu logga in säkert igen.
+
+ En förfrågan med ogiltigt eller helt saknar CSRF-insegel. Det skulle kunna vara helt oskyldigt, men det skulle kunna vara ett försökt av en sida att låtsas vara en annan sida (s.k. "cross-site request forgery", CSRF). En sådan kan vara orsakat av:
+
+ - Ett tillägg som manipulerar förfrågningar eller gör förfrågningar utan insegel;
+ - En flik från tidigare session finns kvar i webbläsaren;
+ - En annan hemsida gör en förfrågan, med eller utan din tillåtelse;
+ - Diverse externa verktyg;
+ - Försmädlig kod som vill komma åt din data.
+
+ För mer information om CSRF: [%{link}](%{link}).
+
+ Om du får detta meddelande fler gånger, får du se över om det kan vara orsakat av någon av punkterna ovanför.
+
+ Tack ska du ha!
+ Med vänlig hälsning, Diasporas e-postrobot.
+ subject: "Vi har fått en oauktoriserad förfrågan från ditt konto, %{name}."
email_sent_by_diaspora: "Detta e-brev har skickats av %{pod_name}. Vill du inte få några fler liknade e-brev,"
export_email:
body: |-
@@ -864,14 +890,8 @@ sv:
type_error: "Fotouppladdning misslyckades. Är du säker på att en bild blev tillagd?"
destroy:
notice: "Fotot är borttaget."
- new_photo:
- empty: "{file} är tom, välj om filerna utan att välja denna."
- invalid_ext: "{file} har en ogiltig filändelse. Endast {extensions} är tillåtna."
- size_error: "{file} är för stor, maximal tillåten filstorlek är {sizeLimit}."
new_profile_photo:
upload: "Ladda upp en ny profilbild!"
- show:
- show_original_post: "Visa det ursprungliga inlägget"
polls:
votes:
one: "En röst än så länge."
@@ -958,8 +978,14 @@ sv:
destroyed: "Inlägget har förintats"
failed: "Någonting gick snett"
title: "Översikt av anmälningar"
+ unreviewed_reports:
+ one: "Det finns en rapport att gå igenom."
+ other: "Det finns %{count} rapporter att gå igenom."
+ zero: "Det finns inga rapporter att gå igenom."
reshares:
comment_email_subject: "%{resharer} har delat vidare ett inlägg av %{author}"
+ create:
+ error: "Lyckades inte dela vidare."
reshare:
deleted: "Det ursprungliga inlägget är raderat."
reshare_confirmation: "Vill du dela vidare %{author}s inlägg?"
@@ -997,14 +1023,10 @@ sv:
mobile_row_checked: "%{name} (ta bort)"
mobile_row_unchecked: "%{name} (lägg till)"
toggle:
- few: "I %{count} aspekter"
- many: "I %{count} aspekter"
one: "I %{count} aspekt"
other: "I %{count} aspekter"
- two: "I %{count} aspekter"
- zero: "Lägg till kontakt"
invitations:
- by_email: "Via e-post"
+ by_email: "Bjud in personer via e-post"
invite_your_friends: "Bjud in dina vänner"
invites: "Inbjudningar"
share_this: "Dela med dig av länken via e-post, din blog eller de sociala nätverken!"
@@ -1138,6 +1160,7 @@ sv:
comment_on_post: "någon kommenterar dina inlägg"
current_password: "Nuvarande lösenord"
current_password_expl: "den som du loggar in med..."
+ default_post_visibility: "Standardaspekt vald för inlägg."
download_export: "Ladda ned min profil"
download_export_photos: "Ladda ned mina bilder"
edit_account: "Ändra konto"
diff --git a/config/locales/diaspora/te.yml b/config/locales/diaspora/te.yml
index 2bd38f1a1..b937a69ce 100644
--- a/config/locales/diaspora/te.yml
+++ b/config/locales/diaspora/te.yml
@@ -208,7 +208,6 @@ te:
conversations:
create:
fail: "చెల్లని సందేశం"
- no_contact: "ఓయ్, ముందుగా మీరు పరిచయాన్ని జతచేసుకోవాలి!"
sent: "సందేశం పంపబడింది"
destroy:
delete_success: "సంభాషణ విజయవంతంగా తొలగించబడింది"
@@ -269,6 +268,7 @@ te:
get_support_a_irc: "%{irc} (ప్రత్యక్ష సంభాషణ) లో మాతో చేరండి"
get_support_a_tutorials: "మా %{tutorials}ను సందర్శించండి"
get_support_a_website: "మా %{link}ను సందర్శించండి"
+ get_support_a_wiki: "%{link} ను వెతకండి"
get_support_q: "నా ప్రశ్నకు ఈ ఎఫ్ఎక్యూలో సమాధానం లేకపోతే ఏంచేయాలి? ఇంకా ఎక్కడక్కడ నేను తోడ్పాటు పొందగలను?"
getting_started_q: "సహాయం! ప్రారంభించడానికి నాకు కొంత ప్రాథమిక సహాయం కావాలి!"
title: "సహాయం పొందడం"
@@ -329,6 +329,7 @@ te:
sharing:
title: "పంచుకోవడం"
tags:
+ followed_tags_q: "“#అనుసరించే కొసలు” అంటే ఏమిటి మరియు కొసను అనుసరించడం ఎలా?"
title: "కొసలు"
what_are_tags_for_q: "కొసలు ఎందుకోసం?"
third_party_tools: "తృతీయ-పక్ష పనిముట్లు"
@@ -337,9 +338,6 @@ te:
tutorials: "ఉపశిక్షణ"
wiki: "వికీ"
invitations:
- a_facebook_user: "ఫేస్‌బుక్ వాడుకరి"
- check_token:
- not_found: "ఆహ్వాన టోకెన్ కనపడలేదు"
create:
empty: "దయచేసి ఒక్క ఈమెయిలు చిరునామానైనా ఇవ్వండి."
no_more: "మీకు ఆహ్వానాలేమీ లేవు."
@@ -458,13 +456,15 @@ te:
message: |-
హలో! 
 
- మీరు డయాస్పోరా*లో చేరుటకు ఆహ్వానించబడ్డారు! 
+ మీరు డయాస్పోరా*లో చేరుటకు %{diaspora_id} చే ఆహ్వానించబడ్డారు! 
 
ప్రారంభించుటకు ఈ లంకెను నొక్కండి 
 
[%{invite_url}][1] 
 
-  
+  లేదా %{diaspora_id} ను మీ పరిచయాలకు చేర్చుకోవచ్చు ఒకవేళ మీకు ఇదివరకే ఖాతా ఉండుంటే.
+
+
ప్రేమతో, 
 
డయాస్పోరా* ఈమెయిలు యంత్రికుడు!
@@ -491,6 +491,8 @@ te:
%{id}తో ఉన్న %{type} ప్రమాదకరమైందిగా గుర్తించబడింది.
+ కారణం: %{reason}
+
[%{url}][1]
దయచేసి ఎంత త్వరగా వీలైతే అంత తొందరగా సమీక్షించండి!
@@ -498,7 +500,7 @@ te:
సంతోషంతో,
- డయాస్పోరా* ఈమెయిలు రోబోట్!
+ డయాస్పోరా* ఈమెయిలు యంత్రుడు!
[1]: %{url}
type:
@@ -548,14 +550,8 @@ te:
type_error: "ఛాయాచిత్ర ఎక్కింపు విఫలమైంది. మీరు ఖచ్ఛితంగా బొమ్మనే జోడించారా?"
destroy:
notice: "ఛాయాచిత్రం తొలగించబడింది"
- new_photo:
- empty: "{file} ఖాళీగావుంది, దయచేసి అదికాకుండా వేరే దస్త్రాలను ఎంచుకోండి."
- invalid_ext: "{file} చెల్లని పొడిగింతను కలిగివుంది. కేవలం {extensions} మాత్రమే అనుమతించబడును."
- size_error: "{file} చాలా పెద్దగావుంది, గరిష్ట దస్త్ర పరిమాణం {sizeLimit}."
new_profile_photo:
upload: "ఒక కొత్త ప్రవర ఛాయాచిత్రాన్ని ఎక్కించండి!"
- show:
- show_original_post: "అసలు టపాని చూపించు"
posts:
presenter:
title: "%{name} నుండి ఒక టపా"
@@ -790,7 +786,7 @@ te:
request_export_photos_update: "నా ఛాయాచిత్రాలను తాజాపరుచు"
request_export_update: "నా ప్రవర దత్తాంశాన్ని తాజాపరుచు"
reshared: "ఎవరో మీ టపాను మరలా పంచుకున్నారు"
- show_community_spotlight: "ప్రవాహంలో సంఘపు స్పాట్‌లైట్‌ను చూపించు"
+ show_community_spotlight: "ప్రవాహంలో \"సంఘపు స్పాట్‌లైట్‌ను\" చూపించు"
show_getting_started: "“ఆరంభించు” సూచనలను చూపించు"
someone_reported: "ఎవరో ఒకరు నివేదిక పంపారు"
started_sharing: "ఎవరో మీతో పంచుకోవడం మొదలుపెట్టారు"
diff --git a/config/locales/diaspora/tr.yml b/config/locales/diaspora/tr.yml
index bcb9ef223..eb469b976 100644
--- a/config/locales/diaspora/tr.yml
+++ b/config/locales/diaspora/tr.yml
@@ -195,7 +195,6 @@ tr:
conversations:
create:
fail: "Geçersiz mesaj"
- no_contact: "Hey, önce bir bağlantı ekleyin!"
sent: "Mesaj gönderildi"
index:
conversations_inbox: "Yazışmalar — Gelen kutusu"
@@ -288,6 +287,8 @@ tr:
title: "Anılmalar"
what_is_a_mention_q: "\"Birisini anmak\" nedir?"
miscellaneous:
+ diaspora_app_a: "Toplıluk üyelerince çeşitli Android uygulamaları geliştirilmektedir. Bazıları çoktan terk edlimiş ve mevcut diaspora* yazılımına uygun değildir. Bunlardan çok bir şey beklemeyin. Şu an için bir iOS uygulaması yok. diaspora*ya mobilden erişmenin en iyi yolu bir tarayıcı, çünkü mobil siteyi tüm cihazlarda, işlevselliği henüz tam olmamakla birlikte, düzgün çalışacak şekilde tasarladık."
+ diaspora_app_q: "Android ve iOS için diaspora* uygulamaları var mı?"
title: "Çeşitli"
pods:
find_people_a: "Kenar çubuğundaki e-mektup bağlantısına tıklayın. İlgi alanlarınızı paylaşan kişileri #etiketler ile takip edin, ve onlardan ilgilendiğiniz şeyler gönderenleri bir bakışa ekleyin. Genel bir gönderide #buradayeniyim diye bağırın."
@@ -327,6 +328,8 @@ tr:
private_profiles:
title: "Özel profiller"
whats_in_profile_q: "Ne benim özel profil var?"
+ who_sees_profile_a: "Paylaşımda bulunduğunuz (bakışlarınızdan birinde olan) her hangi kullanıcı, adıyla girdiğinde görebilir. Ancak sizin takip etmediğiniz takipçiler, ancak herkese açık bilgilerinizi görür."
+ who_sees_profile_q: "Özel profilimi kimler görür?"
who_sees_updates_a: "Bakışlarınızdaki herkes özel profilinizdeki değişiklikleri görebilir. "
who_sees_updates_q: "Özel profilimin güncelllemelerini kim görebilir?"
public_posts:
@@ -348,13 +351,11 @@ tr:
what_are_tags_for_a: "Etiketler gönderileri, genellikle konularına göre, sınıflandırmanın bir yoludur. Bir etiketi aratarak onu içeren tüm görebileceğiniz gönderileri (genel ve özel) bulabilirsiniz. Bu belli bir konu ile ilgilenenlerin onunla ilgili genel gönderileri bulabilmesini sağlar."
what_are_tags_for_q: "Etiketler ne işe yarar?"
third_party_tools: "üçüncü taraf araçları"
+ title_header: "Yardım"
tutorial: "öğretici"
tutorials: "öğreticiler"
wiki: "wiki"
invitations:
- a_facebook_user: "Bir Facebook kullanıcısı"
- check_token:
- not_found: "Davetiye bulunamadı."
create:
empty: "En az bir e-posta adresi girin."
no_more: "Başka davetiyeniz yok."
@@ -402,6 +403,8 @@ tr:
other: "%{actors} %{post_link} gönderinizi yorumladı."
zero: "%{actors} %{post_link} gönderinizi yorumladı."
index:
+ all_notifications: "Tüm bildirimler"
+ also_commented: "Bunlar da yorumladı"
and: "ve"
and_others:
other: "ve %{count} diğer kişi"
@@ -411,6 +414,8 @@ tr:
mark_read: "Okundu"
mark_unread: "Okunmadı olarak işaretle"
notifications: "Bildirimler"
+ show_all: "Tümünü göster"
+ show_unread: "Okunmamışları göster"
liked:
other: "%{actors} senin %{post_link} gönderini beğendi."
zero: "%{actors} senin %{post_link} gönderini beğendi."
@@ -491,6 +496,10 @@ tr:
diaspora* elektronik mektup robotu
[1]: %{url}
+ subject: "Yeni %{type} ağır dil olarak işaretlendi"
+ type:
+ comment: "yorum"
+ post: "gönderi"
reshared:
reshared: "%{name} gönderini tekrar paylaştı"
view_post: "Gönderiyi görüntüle>"
@@ -509,6 +518,7 @@ tr:
add_contact:
invited_by: "tarafından davet edildin"
index:
+ couldnt_find_them: "Aradığını bulamadın mı?"
looking_for: "%{tag_link} ile etiketlenmiş gönderileri mi arıyorsun?"
no_one_found: "...ve hiç kimse bulunamadı."
no_results: "Hey! Bir şeyi araman lazım."
@@ -534,14 +544,8 @@ tr:
type_error: "Fotoğraf yüklemesi başarısız oldu. Bir görüntünün eklendiğinden emin misin?"
destroy:
notice: "Fotoğraf silindi."
- new_photo:
- empty: "{file} boş bir dosya, bu olmadan dosyaları tekrar seçin."
- invalid_ext: "{file} geçersiz uzantıya sahip. sadece {extensions} uzantılarına izin verilir."
- size_error: "{file} çok büyük, en büyük dosya boyutu {sizeLimit}."
new_profile_photo:
upload: "Yeni bir profil fotoğrafı yükle!"
- show:
- show_original_post: "Orijinal gönderiyi göster"
posts:
presenter:
title: "%{name} 'den bir gönderi"
@@ -594,6 +598,12 @@ tr:
terms: "Bir hesap oluşturarak %{terms_link}'teki koşulları kabul etmiş sayılırsınız."
terms_link: "hizmet koşulları"
username: "KULLANICI ADI"
+ report:
+ comment_label: "<b>Yorum</b>:<br>%{data}"
+ post_label: "<b>Gönderi</b>: %{title}"
+ reason_label: "Sebep: %{text}"
+ reported_label: "%{person} <b>raporladı</b>"
+ title: "Raporlara bakış"
reshares:
comment_email_subject: "%{resharer}, %{author} kişisinin gönderisini tekrar paylaştı"
reshare:
@@ -647,6 +657,8 @@ tr:
i_like: "İlgimi çeken şunlardır: %{tags}."
invited_by: "Davet için teşekkürler, "
newhere: "YeniyimBurada"
+ poll:
+ add_a_poll: "Oylama ekle"
posting: "Gönderiliyor..."
share: "Paylaş"
upload_photos: "Fotoğraf yükle"
diff --git a/config/locales/diaspora/uk.yml b/config/locales/diaspora/uk.yml
index 980cbd7e7..a4c8562b2 100644
--- a/config/locales/diaspora/uk.yml
+++ b/config/locales/diaspora/uk.yml
@@ -240,7 +240,6 @@ uk:
conversations:
create:
fail: "Неправильне повідомлення"
- no_contact: "Ей, вам потрібно спочатку додати контакт!"
sent: "Повідомлення відправлене"
destroy:
delete_success: "Діалог успішно видалений"
@@ -481,9 +480,6 @@ uk:
tutorials: "настанови"
wiki: "вікі"
invitations:
- a_facebook_user: "Користувач Facebook"
- check_token:
- not_found: "Код запрошення не знайдений"
create:
empty: "Будь-ласка, введіть хоча б одну електронну пошту."
no_more: "У вас закінчилися запрошення."
@@ -760,14 +756,8 @@ uk:
type_error: "Збій при завантаженні світлини. Ви впевнені, що додали графічний файл?"
destroy:
notice: "Фотографію вилучено."
- new_photo:
- empty: "{file} порожній, будь ласка, виберіть файли ще раз, але без нього."
- invalid_ext: "{file} має неприпустиме розширення. Дозволені тільки {extensions}."
- size_error: "{file} занадто великий, максимальний розмір файлу: {sizeLimit}."
new_profile_photo:
upload: "Завантажити нове фото для профілю!"
- show:
- show_original_post: "Показати початковий запис"
posts:
presenter:
title: "Запис %{name}"
diff --git a/config/locales/diaspora/vi.yml b/config/locales/diaspora/vi.yml
index 610d783f5..ebb1e2a7b 100644
--- a/config/locales/diaspora/vi.yml
+++ b/config/locales/diaspora/vi.yml
@@ -176,7 +176,6 @@ vi:
conversations:
create:
fail: "Tin nhắn không hợp lệ"
- no_contact: "Bạn cần phải thêm liên lạc trước đã!"
sent: "Đã gửi tin nhắn"
index:
inbox: "Hộp thư đến"
@@ -211,9 +210,6 @@ vi:
tutorials: "hướng dẫn"
wiki: "wiki"
invitations:
- a_facebook_user: "Người dùng Facebook"
- check_token:
- not_found: "Không tìm thấy khoá mời"
create:
empty: "Nhập ít nhất một địa chỉ thư điện tử."
no_more: "Bạn đã hết thư mời."
@@ -371,14 +367,8 @@ vi:
type_error: "Tải ảnh lên thất bại, Bạn có chắc ảnh đã được thêm?"
destroy:
notice: "Đã xóa ảnh."
- new_photo:
- empty: "{file} rỗng, chọn lại tập tin."
- invalid_ext: "{file} có phần mở rộng không hợp lệ. Chỉ chấp nhận phần mở rộng {extensions}."
- size_error: "{file} quá to, dung lượng tối đa cho phép là {sizeLimit}."
new_profile_photo:
upload: "Tải lên ảnh mới"
- show:
- show_original_post: "Xem bài đăng gốc"
posts:
presenter:
title: "Một bài đăng từ %{name}"
diff --git a/config/locales/diaspora/wo.yml b/config/locales/diaspora/wo.yml
index 20f4ee371..c5733f30d 100644
--- a/config/locales/diaspora/wo.yml
+++ b/config/locales/diaspora/wo.yml
@@ -44,7 +44,6 @@ wo:
to: "ci"
email: "Email"
invitations:
- a_facebook_user: "Facebooku jëfandikukat"
new:
language: "Làkk"
layouts:
diff --git a/config/locales/diaspora/zh-CN.yml b/config/locales/diaspora/zh-CN.yml
index 00266f409..de8ef9955 100644
--- a/config/locales/diaspora/zh-CN.yml
+++ b/config/locales/diaspora/zh-CN.yml
@@ -200,9 +200,6 @@ zh-CN:
fill_me_out: "补全信息"
find_people: "找人或#标签"
invitations:
- a_facebook_user: "Facebook 用户"
- check_token:
- not_found: "找不到该邀请码"
create:
empty: "请至少填写一个邮箱"
no_more: "您暂无邀请函。"
@@ -350,14 +347,8 @@ zh-CN:
type_error: "照片上传失败。您确定有选择任何图片吗?"
destroy:
notice: "照片删除成功。"
- new_photo:
- empty: "文件 {file} 是空的,请重新选择文件,并且不要选中它。"
- invalid_ext: "不支持文件 {file} 的格式。只接受 {extensions}。"
- size_error: "文件 {file} 太大了,上限是 {sizeLimit}。"
new_profile_photo:
upload: "上传新的头像!"
- show:
- show_original_post: "显示原文"
posts:
presenter:
title: "来自 %{name} 的内容"
diff --git a/config/locales/diaspora/zh-TW.yml b/config/locales/diaspora/zh-TW.yml
index 292a4ca6c..949386af9 100644
--- a/config/locales/diaspora/zh-TW.yml
+++ b/config/locales/diaspora/zh-TW.yml
@@ -267,6 +267,8 @@ zh-TW:
post_something: "貼到 diaspora*"
cancel: "取消"
comments:
+ create:
+ error: "發表意見失敗。"
new_comment:
comment: "留言"
commenting: "發表留言中..."
@@ -291,7 +293,6 @@ zh-TW:
conversations:
create:
fail: "無效的訊息"
- no_contact: "喂,你要先加聯絡人才行!"
sent: "訊息送出去了"
destroy:
delete_success: "對話成功刪掉了"
@@ -300,6 +301,7 @@ zh-TW:
conversations_inbox: "對話 - 收訊匣"
inbox: "收訊匣"
new_conversation: "開始對話"
+ no_contacts: "開始對話前必須先加一些聯絡人"
no_messages: "沒有訊息"
new:
message: "訊息"
@@ -324,6 +326,7 @@ zh-TW:
delete: "刪除"
email: "電子信箱"
error_messages:
+ csrf_token_fail: "CSRF 信物不正確。請重新登入後再重試一次。"
helper:
correct_the_following_errors_and_try_again: "請修正以下錯誤後再試一次。"
need_javascript: "這個網站需要 JavaScript 功能才能正常運作。如果你關掉了 JavaScript 的話,請打開它後重新載入網頁來使用。"
@@ -557,7 +560,6 @@ zh-TW:
own_your_data: "控制自己的資料"
own_your_data_info: "很多社群網路用你的資料來賺錢,像是分析使用行為,然後用這些資訊來對你做廣告推銷。diaspora* 只會用你的資料來讓你和別人聯繫和分享,不會拿來做其他用途。"
podmin:
- admin_panel: "管理面板"
byline: "準備來改變網際網路了。我們來幫你準備就緒,好嗎?"
configuration_info: "請用你慣用的編輯器,打開設定檔 %{database_path} 以及 %{diaspora_path},仔細檢查並修改它們,裡面有很詳細的註解。"
configure_your_pod: "設定豆莢"
@@ -571,22 +573,21 @@ zh-TW:
getting_help_info: "我們在維基上整理了%{faq},包含一些訣竅、花招、以及常見問題的解法。同時也歡迎%{irc}。"
headline: "歡迎你來,朋友。"
make_yourself_an_admin: "成為管理員"
- make_yourself_an_admin_info: "%{wiki}裡面有步驟說明。做完之後,在你登入時頂部的使用者功能表應該就會多一個「管理」項目。這個功能可以讓你搜尋豆莢裡的使用者、檢視統計資料等等。更深度的豆莢維運項目請用%{admin_panel}。"
+ make_yourself_an_admin_info: "%{wiki}裡面有步驟說明。設定完成之後,在你登入時頂部的使用者功能表應該就會多一個「%{admin_dashboard}」項目。這個功能可以讓你搜尋豆莢裡的使用者、檢視統計資料等等。"
report_bugs: "回報"
update_instructions: "在 diaspora* 維基上的更新步驟說明"
update_your_pod: "更新豆莢"
update_your_pod_info: "這是%{update_instructions}。"
invitation_codes:
+ already_logged_in: "%{inviter}邀請你加入這個豆莢,不過其實你已經加入且登入了。"
not_valid: "邀請碼已經失效了"
invitations:
- a_facebook_user: "Facebook 使用者"
- check_token:
- not_found: "找不到該邀請信物"
create:
+ closed: "這個 diaspora* 豆莢目前不開放邀請。"
empty: "請輸入至少一個電子信箱"
no_more: "你沒有邀請卡了。"
note_already_sent: "邀請卡已經寄到這些信箱了:%{emails}"
- rejected: "以下的電子信箱有問題:"
+ rejected: "以下的電子信箱有問題:%{emails}"
sent: "邀請卡已經寄到這些信箱了:%{emails}"
new:
codes_left:
@@ -614,6 +615,9 @@ zh-TW:
profile: "個人檔案"
settings: "設定"
toggle_navigation: "瀏覽模式切換"
+ likes:
+ create:
+ error: "按讚失敗。"
limited: "受限"
more: "更多"
no_results: "搜尋沒有結果"
@@ -689,6 +693,26 @@ zh-TW:
confirm_email:
click_link: "請點以下連結,來開通你新的電子信箱 %{unconfirmed_email}:"
subject: "請開通你新的電子信箱 %{unconfirmed_email}"
+ csrf_token_fail:
+ body: |-
+ %{name}你好,
+
+ diaspora* 偵測到可能是未經授權而試圖存取你的登入狀態的行為。雖然這有可能無害,但也有可能是跨網站的偽造請求(cross-site request forgery; CSRF)。為了防止你的資料可能會外洩,我們就將你登出了。
+
+ 造成資料請求中沒有 CSRF 信物,或是該信物不正確的情形可能有:
+ - 有瀏覽器附加元件修改了資料請求,或是發出了沒有該信物的請求;
+ - 有之前登入的分頁或是視窗沒有關閉;
+ - 有其他網站發出了資料請求,不論是否經過你的同意;
+ - 其他外部工具造成;
+ - 有惡意程式試圖要存取你的資料;
+ 有關 CSRF 的更多資訊請見[%{link}](%{link})。
+
+ 不用擔心,現在你還是可以安全地重新登入。
+ 但是如果你持續收到這個訊息,請檢查以上因素,包含你所使用的瀏覽器附加元件。
+
+ 謝謝。
+ diaspora* 電郵機器人
+ subject: "%{name},我們偵測到你的帳號有未授權的請求"
email_sent_by_diaspora: "這封電子郵件是從 %{pod_name} 寄出。如果你不想再收到這類的信件,"
export_email:
body: |-
@@ -830,14 +854,8 @@ zh-TW:
type_error: "相片上傳失敗。你確定有加入任何圖片嗎?"
destroy:
notice: "相片刪掉了。"
- new_photo:
- empty: "檔案 {file} 是空的,請重新挑選檔案,且不要再選它。"
- invalid_ext: "檔案 {file} 的副檔名不合格。只接受{extensions}。"
- size_error: "檔案 {file} 太大了,上限是{sizeLimit}。"
new_profile_photo:
upload: "上傳新的個人照!"
- show:
- show_original_post: "顯示原文"
polls:
votes:
other: "目前為止有%{count}個人投票"
@@ -918,8 +936,13 @@ zh-TW:
destroyed: "貼文已經被銷毀了"
failed: "發生問題了"
title: "回報總覽"
+ unreviewed_reports:
+ other: "有%{count}份還沒看過的回報。"
+ zero: "沒有還沒看過的回報。"
reshares:
comment_email_subject: "%{resharer} 轉貼了 %{author} 的貼文"
+ create:
+ error: "轉貼失敗。"
reshare:
deleted: "原貼文已經被作者刪除了。"
reshare_confirmation: "要轉貼 %{author} 的貼文嗎?"
@@ -960,7 +983,7 @@ zh-TW:
other: "在%{count}個社交面中"
zero: "加聯絡人"
invitations:
- by_email: "用電子郵件"
+ by_email: "寄電子郵件邀請"
invite_your_friends: "邀請你的朋友"
invites: "邀請"
share_this: "將這個連結透過電子郵件、部落格,或其他社交網站分享出去!"
@@ -1093,6 +1116,7 @@ zh-TW:
comment_on_post: "有人留言在你的貼文"
current_password: "目前密碼"
current_password_expl: "登入時那一個..."
+ default_post_visibility: "預設貼文發表的社交面"
download_export: "下載個人檔案"
download_export_photos: "下載相片"
edit_account: "編輯帳號"
diff --git a/config/locales/javascript/javascript.ar.yml b/config/locales/javascript/javascript.ar.yml
index e332f0387..df5fe3c59 100644
--- a/config/locales/javascript/javascript.ar.yml
+++ b/config/locales/javascript/javascript.ar.yml
@@ -32,9 +32,7 @@ ar:
contacts:
search_no_results: "لم يُعثر على متراسلين"
delete: "احذف"
- failed_to_like: "فشل في [أعجبني]"
failed_to_post_message: "فشل في نشر رسالة!"
- failed_to_reshare: "فشلت إعادة المشاركة!"
getting_started:
alright_ill_wait: "حسناً ، سأنتظر."
hey: "انتبه <%= name %>"
@@ -63,8 +61,6 @@ ar:
limited: "محدودة - مشاركتك ستكون متاحة لجهات إتصالك فقط"
public: "عام - مشاركتك ستكون متاحة للجميع ومفهرسة في محركات البحث"
remove_post: "أأزيل هذه التدوينة؟"
- reshares:
- duplicate: "رائع، أليس كذلك؟ أعدت نشر هذه المشاركة مسبقا"
show_more: "المزيد"
stream:
comment: "تعليق"
diff --git a/config/locales/javascript/javascript.bg.yml b/config/locales/javascript/javascript.bg.yml
index 53d1e1c8c..eacbf1d02 100644
--- a/config/locales/javascript/javascript.bg.yml
+++ b/config/locales/javascript/javascript.bg.yml
@@ -26,7 +26,6 @@ bg:
show: "показване на коментарите"
confirm_dialog: "Сигурни ли сте?"
delete: "Изтриване"
- failed_to_like: "Публикацията не бе харесана!"
failed_to_post_message: "Съобщението не бе публикувано!"
getting_started:
alright_ill_wait: "Добре, ще изчакам."
@@ -52,8 +51,6 @@ bg:
publisher:
limited: "Ограничено - публикацията ще бъде видима само за хората, с които я споделите"
public: "Публично - публикацията ще бъде видима за всеки, а съдържанието ѝ ще бъде налично за търсещите машини"
- reshares:
- duplicate: "Вече сте споделили публикацията!"
show_more: "покажи още"
stream:
comment: "Коментиране"
diff --git a/config/locales/javascript/javascript.br.yml b/config/locales/javascript/javascript.br.yml
index 1cee93040..304b3b67a 100644
--- a/config/locales/javascript/javascript.br.yml
+++ b/config/locales/javascript/javascript.br.yml
@@ -32,7 +32,6 @@ br:
confirm_dialog: "Ha sur oc'h ?"
delete: "Diverkañ"
edit: "Kemmañ"
- failed_to_like: "C'hwitet merkañ plijus !"
failed_to_post_message: "N'eus ket bet gallet embann ar gemennadenn !"
failed_to_remove: "N'eus ket bet gallet lemel en enmont kuit !"
getting_started:
@@ -97,7 +96,6 @@ br:
option: "Dibarzh <%= nr %>"
question: "Goulenn"
reshares:
- duplicate: "Kaset eo bet an destenn-mañ pelloc'h ganeoc'h c'hoazh !"
post: "Rannañ pelloc'h embannadenn <%= name %> ?"
successful: "Rannet pelloc'h eo bet an embannadenn ervat !"
show_more: "Gwelet muioc'h"
diff --git a/config/locales/javascript/javascript.bs.yml b/config/locales/javascript/javascript.bs.yml
index 543188d27..00545875f 100644
--- a/config/locales/javascript/javascript.bs.yml
+++ b/config/locales/javascript/javascript.bs.yml
@@ -34,7 +34,6 @@ bs:
confirm_dialog: "Jeste sigurni?"
delete: "Izbriši"
edit: "Uredi"
- failed_to_like: "Neuspješno sviđanje"
failed_to_post_message: "Neuspješno objavljivanje poruke!"
getting_started:
alright_ill_wait: "Dobro, čekat ću."
@@ -72,7 +71,6 @@ bs:
near_from: "Objavljeno sa: <%= location %>"
public: "Javno - vaša objava će biti vidljiva svima i može biti pronađena od pretraživača"
reshares:
- duplicate: "Tako dobro, ha? Već ste ponovo dijelili tu objavu!"
post: "Ponovo dijeli objavu od <%= name %>?"
successful: "Objava je uspješno ponovo dijeljenja!"
show_more: "pokaži više"
diff --git a/config/locales/javascript/javascript.cs.yml b/config/locales/javascript/javascript.cs.yml
index ad78ec149..03849bf46 100644
--- a/config/locales/javascript/javascript.cs.yml
+++ b/config/locales/javascript/javascript.cs.yml
@@ -8,11 +8,45 @@ cs:
javascripts:
admin:
pods:
+ actions: "Akce"
+ added: "Přidáno"
+ check: "Provést test spojení"
+ follow_link: "otevřít odkaz v prohlížeči"
+ last_check: "poslední kontrola:"
+ more_info: "Zobrazit více informací"
+ ms:
+ few: "<%= count %>ms"
+ one: "<%= count %>ms"
+ other: "<%= count %>ms"
+ no_info: "Nyní nejsou dostupné žádné další informace"
+ not_available: "Není k dispozici"
+ offline_since: "Odpojený od doby:"
+ recheck:
+ failure: "Kontrola nebyla provedena"
+ response_time: "Doba odezvy:"
+ server_software: "Software serveru:"
+ ssl: "SSL"
+ ssl_disabled: "SSL vypnuto"
+ ssl_enabled: "SSL zapnuté"
+ states:
+ dns_failed: "Selhalo rozpoznání jména (DNS)"
+ http_failed: "Selhalo spojení HTTP"
+ net_failed: "Pokus o spojení selhal"
+ no_errors: "Budiž"
+ ssl_failed: "Selhalo bezpečné spojení (SSL)"
+ unchecked: "Neoznačené"
+ unknown_error: "Během kontroly se objevila nespecifikovaná chyba"
+ version_failed: "Nebylo možné zjistit verzi software"
+ status: "Stav"
+ unknown: "Neznámý"
version_failed:
few: "<%= count %> pody nemají verzi (staré pody, žádné NodeInfo)"
one: "Jeden pod nemá verzi (starý pod, žádné NodeInfo)."
other: "<%= count %> podů nemá verzi (staré pody, žádné NodeInfo)"
zero: "Není pod, který by neměl verzi."
+ admins:
+ dashboard:
+ error: "Není možné zjistit poslední verzi diaspora*."
and: "a"
aspect_dropdown:
add_to_aspect: "Přidat kontakt"
@@ -68,10 +102,8 @@ cs:
create: "Vytvořit"
delete: "Odstranit"
edit: "Upravit"
- failed_to_like: "Oblíbení se nezdařilo!"
failed_to_post_message: "Odeslání příspěvku se nezdařilo!"
failed_to_remove: "Odstranění záznamu selhalo!"
- failed_to_reshare: "Znovusdílení selhalo"
getting_started:
alright_ill_wait: "Dobrá, počkám."
hey: "Ahoj, <%= name %>!"
@@ -92,6 +124,8 @@ cs:
recent_notifications: "Poslední oznámení"
search: "Hledat"
settings: "Nastavení"
+ toggle_mobile: "Vybrat mobil"
+ toggle_navigation: "Vybrat navigaci"
view_all: "Zobrazit vše"
hide_post: "Skrýt tento příspěvek"
hide_post_failed: "Není možné tento příspěvek skrýt"
@@ -122,6 +156,11 @@ cs:
looking_good: "Tedy, vypadáte úžasně!"
size_error: "{file} je přiliš veliký, maximální velikost je {sizeLimit}."
poll:
+ answer_count:
+ few: "<%=count%> hlasů"
+ one: "1 hlas"
+ other: "<%=count%> hlasů"
+ zero: "0 hlasů"
close_result: "Skrýt výsledky"
count:
few: "zatím <%=count%> hlasy"
@@ -146,6 +185,34 @@ cs:
publisher:
add_option: "Přidejte odpověď"
limited: "Omezený — váš příspěvek bude přístupný pouze lidem, se kterými sdílíte"
+ markdown_editor:
+ preview: "Náhled"
+ texts:
+ code: "zde kód"
+ heading: "text záhlaví"
+ insert_image_description_text: "zde popište obrázek"
+ insert_image_help_text: "zde vložte odkaz na obrázek"
+ insert_image_title: "vložte titulek k obrázku"
+ insert_link_description_text: "zde popište odkaz"
+ insert_link_help_text: "zde vložte odkaz"
+ italic: "text kurzívou"
+ list: "zde textový seznam"
+ quote: "zde text v uvozovkách"
+ strong: "tučný text"
+ tooltips:
+ bold: "Tučně"
+ cancel: "Zrušit zprávu"
+ code: "Vložit kód"
+ heading: "Záhlaví"
+ insert_image: "Vložit obrázek"
+ insert_link: "Vložit odkaz"
+ insert_ordered_list: "Vložit tříděný seznam"
+ insert_unordered_list: "Vložit netříděný seznam"
+ italic: "Kurzíva"
+ preview: "Náhled zprávy"
+ quote: "Vložit uvozovky"
+ write: "Upravit zprávu"
+ write: "Zápis"
near_from: "Odesláno z: <%= location %>"
option: "Odpověď"
public: "Veřejný — váš příspěvek si bude moci přečíst kdokoliv a může být nalezen vyhledávači"
@@ -159,7 +226,6 @@ cs:
created: "Zpráva byla úspěšně založena"
exists: "Zpráva již existuje"
reshares:
- duplicate: "Tento příspěvek už sdílíte!"
post: "Sdílet příspěvek uživatele <%= name %>?"
successful: "Příspěvek je sdílen!"
show_more: "zobrazit více"
@@ -187,7 +253,12 @@ cs:
other: "Zobrazit <%= count %> dalších komentářů"
zero: "Zobrazit <%= count %> dalších komentářů"
original_post_deleted: "Původní příspěvek byl odstraněn svým autorem."
+ permalink: "trvalý odkaz"
public: "Veřejný"
+ reactions:
+ few: "<%= count%> reakcí"
+ one: "<%= count%> reakce"
+ other: "<%= count%> reakcí"
reshare: "Sdílet"
reshares:
few: "<%= count %> uživatelé to sdíleli"
@@ -215,6 +286,7 @@ cs:
hour: "hodinou"
hours:
other: "%d hodinami"
+ inPast: "Jakýkoli moment"
minute: "minutou"
minutes:
other: "%d minutami"
diff --git a/config/locales/javascript/javascript.cy.yml b/config/locales/javascript/javascript.cy.yml
index 4481192eb..a680b3f73 100644
--- a/config/locales/javascript/javascript.cy.yml
+++ b/config/locales/javascript/javascript.cy.yml
@@ -27,7 +27,6 @@ cy:
hide: "cuddio sylwadau"
show: "ddangos sylwadau i gŷd"
confirm_dialog: "Chi'n siwr?"
- failed_to_like: "Wedi methu i hoffi!"
failed_to_post_message: "Methwyd i bostio neges!"
getting_started:
alright_ill_wait: "O'r gorau - 'dwi'n aros..."
@@ -38,8 +37,6 @@ cy:
search: "Find people or #tags"
photo_uploader:
looking_good: "OMG, rydych chi'n ymddangos yn neis iawn!"
- reshares:
- duplicate: "Mae hynny'n dda, eh? Rydych chi wedi rhannu'r bost eisoes!"
show_more: "dangos mwy"
stream:
likes:
diff --git a/config/locales/javascript/javascript.da.yml b/config/locales/javascript/javascript.da.yml
index 6dc090be8..d33d27aa4 100644
--- a/config/locales/javascript/javascript.da.yml
+++ b/config/locales/javascript/javascript.da.yml
@@ -110,11 +110,8 @@ da:
create: "Opret"
delete: "Slet"
edit: "Rediger"
- failed_to_comment: "Din kommentar blev ikke lagt op. Måske ignorerer indlæggets ophavsmand dig?"
- failed_to_like: "Kunne ikke synes om! Måske ignorere ophavsmanden dig?"
failed_to_post_message: "Kunne ikke indsende besked!"
failed_to_remove: "Det lykkedes ikke at fjerne indlægget!"
- failed_to_reshare: "Kunne ikke dele indlægget!"
getting_started:
alright_ill_wait: "Okay, jeg venter."
hey: "Hej <%= name %>!"
@@ -197,10 +194,16 @@ da:
markdown_editor:
preview: "Forhåndsvisning"
texts:
+ code: "kode her"
heading: "Overskriftstekst"
+ insert_image_description_text: "skriv billedbeskrivelse her"
+ insert_image_help_text: "indsæt billed-link her"
+ insert_image_title: "skriv billedtitel her"
insert_link_description_text: "skriv link-beskrivelse her"
insert_link_help_text: "Indsæt link her"
italic: "tekst i kursiv"
+ list: "listetekst her"
+ quote: "citattekst her"
strong: "fed tekst"
tooltips:
bold: "Fed"
@@ -229,7 +232,6 @@ da:
created: "Der blev lavet en rapport"
exists: "Der eksisterer allerede en rapport"
reshares:
- duplicate: "Du har allerede delt indlægget!"
post: "Videredel <%= name %>s indlæg?"
successful: "Indlægget er blevet videredelt!"
show_more: "Vis mere"
diff --git a/config/locales/javascript/javascript.de-CH.yml b/config/locales/javascript/javascript.de-CH.yml
new file mode 100644
index 000000000..829a7a4ec
--- /dev/null
+++ b/config/locales/javascript/javascript.de-CH.yml
@@ -0,0 +1,36 @@
+# Copyright (c) 2010-2013, Diaspora Inc. This file is
+# licensed under the Affero General Public License version 3 or later. See
+# the COPYRIGHT file.
+
+
+
+de-CH:
+ javascripts:
+ timeago:
+ day: "eim Tag"
+ days:
+ one: "eim Tag"
+ other: "%d Täg"
+ hour: "öpe einere Stund"
+ hours:
+ one: "öpe einere Stund"
+ other: "öpe %d Stunde"
+ inPast: "jede Moment"
+ minute: "öpe einere Minute"
+ minutes:
+ one: "einere Minute"
+ other: "%d Minute"
+ month: "öpe eim Monet"
+ months:
+ one: "eim Monet"
+ other: "%d Mönet"
+ prefixAgo: "vor"
+ prefixFromNow: "i"
+ seconds: "weniger als einere Minute"
+ suffixAgo: ""
+ suffixFromNow: "ab jetzt"
+ wordSeparator: " "
+ year: "öpe eim Johr"
+ years:
+ one: "eim Johr"
+ other: "%d Johr" \ No newline at end of file
diff --git a/config/locales/javascript/javascript.de.yml b/config/locales/javascript/javascript.de.yml
index f37afc57a..2629178ae 100644
--- a/config/locales/javascript/javascript.de.yml
+++ b/config/locales/javascript/javascript.de.yml
@@ -106,16 +106,17 @@ de:
remove_contact: "Kontakt entfernen"
search_no_results: "Keine Kontakte gefunden"
conversation:
+ create:
+ no_recipient: "Hey, du musst erst einen Empfänger hinzufügen!"
new:
no_contacts: "Du musst einige Kontakte hinzufügen, bevor du eine Konversation anfangen kannst."
create: "Erstellen"
delete: "Löschen"
edit: "Bearbeiten"
- failed_to_comment: "Konnte nicht kommentieren. Vielleicht ignoriert dich der Autor?"
- failed_to_like: "Gefällt mir ist fehlgeschlagen. Vielleicht ignoriert dich der Autor?"
+ errors:
+ connection: "Konnte keine Verbindung mit dem Server aufbauen."
failed_to_post_message: "Konnte Beitrag nicht senden!"
failed_to_remove: "Fehler beim Entfernen des Beitrags!"
- failed_to_reshare: "Fehler beim Weitersagen!"
getting_started:
alright_ill_wait: "Alles klar, ich warte."
hey: "Hey, <%= name %>!"
@@ -151,6 +152,9 @@ de:
notifications:
mark_read: "Als gelesen markieren"
mark_unread: "Als ungelesen markieren"
+ new_notifications:
+ one: "Du hast <%= count %> ungelesene Benachrichtigung"
+ other: "Du hast <%= count %> ungelesene Benachrichtigungen"
people:
edit_my_profile: "Mein Profil bearbeiten"
helper:
@@ -236,7 +240,6 @@ de:
created: "Die Meldung wurde erfolgreich erstellt"
exists: "Die Meldung existiert bereits"
reshares:
- duplicate: "Du hast diesen Beitrag bereits weitergesagt!"
post: "<%= name %>s Beitrag weitersagen?"
successful: "Der Beitrag wurde erfolgreich weitergesagt!"
show_more: "Mehr zeigen"
diff --git a/config/locales/javascript/javascript.de_formal.yml b/config/locales/javascript/javascript.de_formal.yml
index ab64ce0f5..5fb62d5ef 100644
--- a/config/locales/javascript/javascript.de_formal.yml
+++ b/config/locales/javascript/javascript.de_formal.yml
@@ -69,7 +69,6 @@ de_formal:
toggle:
one: "In <%= count %> Aspekt"
other: "In <%= count %> Aspekten"
- zero: "Aspekt auswählen"
updating: "aktualisiere..."
aspect_navigation:
add_an_aspect: "+ Aspekt hinzufügen"
@@ -106,16 +105,17 @@ de_formal:
remove_contact: "Kontakt entfernen"
search_no_results: "Keine Kontakte gefunden"
conversation:
+ create:
+ no_recipient: "Hey, Sie müssen erst einen Empfänger angeben!"
new:
no_contacts: "Sie müssen einige Kontakte hinzufügen, bevor Sie eine Konversation anfangen können."
create: "Erstellen"
delete: "Löschen"
edit: "Bearbeiten"
- failed_to_comment: "Konnte nicht kommentieren. Vielleicht ignoriert Sie der Autor?"
- failed_to_like: "Gefällt mir ist fehlgeschlagen. Vielleicht ignoriert Sie der Autor?"
+ errors:
+ connection: "Konnte keine Verbindung mit dem Server aufbauen."
failed_to_post_message: "Konnte Beitrag nicht senden!"
failed_to_remove: "Fehler beim Entfernen des Beitrags!"
- failed_to_reshare: "Fehler beim Weitersagen!"
getting_started:
alright_ill_wait: "Alles klar, ich warte."
hey: "Hey, <%= name %>!"
@@ -151,6 +151,9 @@ de_formal:
notifications:
mark_read: "Als gelesen markieren"
mark_unread: "Als ungelesen markieren"
+ new_notifications:
+ one: "Sie haben <%= count %> ungelesene Benachrichtigung"
+ other: "Sie haben <%= count %> ungelesene Benachrichtigungen"
people:
edit_my_profile: "Mein Profil bearbeiten"
helper:
@@ -236,7 +239,6 @@ de_formal:
created: "Die Meldung ist erfolgreich erstellt worden"
exists: "Die Meldung existiert bereits"
reshares:
- duplicate: "Sie haben diesen Beitrag bereits weitergesagt!"
post: "<%= name %>s Beitrag weitersagen?"
successful: "Der Beitrag wurde erfolgreich weitergesagt!"
show_more: "Mehr zeigen"
diff --git a/config/locales/javascript/javascript.el.yml b/config/locales/javascript/javascript.el.yml
index 36675af68..ec682cfac 100644
--- a/config/locales/javascript/javascript.el.yml
+++ b/config/locales/javascript/javascript.el.yml
@@ -35,7 +35,6 @@ el:
remove_contact: "Διαγραφή επαφής"
delete: "Διαγραφή"
edit: "Επεξεργασία"
- failed_to_like: "Αποτυχία!"
failed_to_post_message: "Αποτυχία δημοσίευσης μηνύματος!"
getting_started:
alright_ill_wait: "Εντάξει, θα περιμένω."
@@ -92,7 +91,6 @@ el:
report:
name: "Αναφορά"
reshares:
- duplicate: "Αυτό είναι τόσο καλό ε; Έχετε ήδη κοινοποιήσει αυτή τη δημοσίευση!"
post: "Κοινοποίηση της ανάρτησης του <%= name %>;"
successful: "Η ανάρτηση κοινοποιήθηκε επιτυχώς!"
show_more: "Προβολή περισσότερων"
diff --git a/config/locales/javascript/javascript.en.yml b/config/locales/javascript/javascript.en.yml
index 2f1f7362c..a4583ee4f 100644
--- a/config/locales/javascript/javascript.en.yml
+++ b/config/locales/javascript/javascript.en.yml
@@ -87,6 +87,9 @@ en:
success: "Your new aspect <%= name %> was created"
failure: "Aspect creation failed."
+ errors:
+ connection: "Unable to connect to the server."
+
timeago:
prefixAgo: ""
prefixFromNow: ""
@@ -186,9 +189,6 @@ en:
one: "In <%= count %> aspect"
other: "In <%= count %> aspects"
show_more: "Show more"
- failed_to_like: "Failed to like. Maybe the author is ignoring you?"
- failed_to_reshare: "Failed to reshare!"
- failed_to_comment: "Failed to comment. Maybe the author is ignoring you?"
failed_to_post_message: "Failed to post message!"
failed_to_remove: "Failed to remove the entry!"
comments:
@@ -196,7 +196,6 @@ en:
hide: "Hide comments"
no_comments: "There are no comments yet."
reshares:
- duplicate: "That good, eh? You’ve already reshared that post!"
successful: "The post was successfully reshared!"
post: "Reshare <%= name %>’s post?"
aspect_navigation:
@@ -248,6 +247,9 @@ en:
notifications:
mark_read: "Mark read"
mark_unread: "Mark unread"
+ new_notifications:
+ one: "You have <%= count %> unread notification"
+ other: "You have <%= count %> unread notifications"
stream:
hide: "Hide"
diff --git a/config/locales/javascript/javascript.en_1337.yml b/config/locales/javascript/javascript.en_1337.yml
index 8d3382c01..81e7f3397 100644
--- a/config/locales/javascript/javascript.en_1337.yml
+++ b/config/locales/javascript/javascript.en_1337.yml
@@ -24,7 +24,6 @@ en_1337:
hide: "H1D3 5P4M5!"
show: "5H0W 4LL 5P4M5!"
confirm_dialog: "5UR3?"
- failed_to_like: "F41L3D 2 <3!"
failed_to_post_message: "F41L3D 2 53ND 5P4M!"
getting_started:
hey: "H3Y, <%= name %>!"
@@ -34,8 +33,6 @@ en_1337:
publisher:
limited: "L1M173D - Y0UR 5P4M W1LL 0NLY B3 533N BY N00B5 U 4R3 5H4R1NG W17H!"
public: "PUBL1C - Y0UR 5P4M W1LL B3 V151BL3 2 3V3RY0N3 4ND F0UND BY S34RCH 3NG1N35!"
- reshares:
- duplicate: "U H4V3 4LR34DY R35P4MM3D 7HI5!"
show_more: "5H0W M0R3!"
stream:
likes:
diff --git a/config/locales/javascript/javascript.en_pirate.yml b/config/locales/javascript/javascript.en_pirate.yml
index c0573f0cd..6afef4962 100644
--- a/config/locales/javascript/javascript.en_pirate.yml
+++ b/config/locales/javascript/javascript.en_pirate.yml
@@ -20,8 +20,6 @@ en_pirate:
preparing_your_stream: "Preparing your personialized stream..."
header:
search: "Find people or #tags"
- reshares:
- duplicate: "You've already reshared that post!"
stream:
likes:
few: "<%= count %> Likes"
diff --git a/config/locales/javascript/javascript.en_shaw.yml b/config/locales/javascript/javascript.en_shaw.yml
index 27259dbc2..e10137b24 100644
--- a/config/locales/javascript/javascript.en_shaw.yml
+++ b/config/locales/javascript/javascript.en_shaw.yml
@@ -19,15 +19,12 @@ en_shaw:
hide: "𐑣𐑲𐑛 𐑒𐑪𐑥𐑩𐑯𐑑𐑕"
show: "𐑖𐑴 𐑷𐑤 𐑒𐑪𐑥𐑩𐑯𐑑𐑕"
confirm_dialog: "𐑸 𐑿 𐑖𐑻?"
- failed_to_like: "𐑓𐑱𐑤𐑛 𐑑 𐑤𐑲𐑒!"
failed_to_post_message: "𐑓𐑱𐑤𐑛 𐑑 𐑐𐑴𐑕𐑑 𐑥𐑧𐑕𐑩𐑡!"
getting_started:
hey: "Hey, <%= name %>!"
preparing_your_stream: "Preparing your personialized stream..."
header:
search: "Find people or #tags"
- reshares:
- duplicate: "𐑿𐑝 𐑷𐑤𐑮𐑧𐑛𐑦 𐑮𐑦𐑖𐑺𐑛 𐑞𐑨𐑑 𐑐𐑴𐑕𐑑!"
show_more: "𐑖𐑴 𐑥𐑹"
stream:
likes:
diff --git a/config/locales/javascript/javascript.en_valspeak.yml b/config/locales/javascript/javascript.en_valspeak.yml
index b8fc63771..a8c663acd 100644
--- a/config/locales/javascript/javascript.en_valspeak.yml
+++ b/config/locales/javascript/javascript.en_valspeak.yml
@@ -51,7 +51,6 @@ en_valspeak:
no_contacts: "So like, u got to add some ppl before u can start a convo..."
delete: "Trash"
edit: "Edit!"
- failed_to_like: "Ur <3 didnt work :("
failed_to_post_message: "so like, i couldnt post txt... sry bout tht... :\\"
failed_to_remove: "So like, there was an issue when removin the entry... sry bout that :\\"
getting_started:
@@ -138,7 +137,6 @@ en_valspeak:
created: "The report was like, created. Yay."
exists: "The report like, already existz..."
reshares:
- duplicate: "OMG that gr8t eh? uve like, already reshared tht postie!! :P"
post: "do u wanna like, reshare <%= name %>'s postie?"
successful: "The postie was reshared!!! :D"
show_more: "show moar"
diff --git a/config/locales/javascript/javascript.eo.yml b/config/locales/javascript/javascript.eo.yml
index 439f2c33f..cf0061d19 100644
--- a/config/locales/javascript/javascript.eo.yml
+++ b/config/locales/javascript/javascript.eo.yml
@@ -35,7 +35,6 @@ eo:
confirm_dialog: "Ĉu vi certas?"
delete: "Forviŝi"
edit: "Redakti"
- failed_to_like: "Ne povis ŝati!"
failed_to_post_message: "Ne povis afiŝi mesaĝon!"
getting_started:
alright_ill_wait: "En ordo, mi atendos."
@@ -68,7 +67,6 @@ eo:
limited: "Malpublika - via afiŝo nur videblos de homoj, al kiuj vi konigas aferojn"
public: "Publika - via afiŝo videblos al ĉiuj kaj troveblos de retserĉprogramoj."
reshares:
- duplicate: "Nu, ĉu tiel bone? Vi jam rekonigis tiun afiŝon!"
post: "Ĉu vi deziras rekonigi la mesaĝon de <%= name %>?"
successful: "La afiŝo estis sukcese rekonigita!"
show_more: "vidi plu"
diff --git a/config/locales/javascript/javascript.es-AR.yml b/config/locales/javascript/javascript.es-AR.yml
index 1f9a13293..bcb038f0c 100644
--- a/config/locales/javascript/javascript.es-AR.yml
+++ b/config/locales/javascript/javascript.es-AR.yml
@@ -106,16 +106,17 @@ es-AR:
remove_contact: "Eliminar contacto"
search_no_results: "No se han encontrado contactos con ese nombre."
conversation:
+ create:
+ no_recipient: "¡Hey! primero tenes que agregar un destinatario"
new:
no_contacts: "Necesitas agregar algunos contactos antes de iniciar una conversación."
create: "Crear"
delete: "Borrar"
edit: "Editar"
- failed_to_comment: "Error al comentar. ¿Puede ser que el autor te esté ignorando?"
- failed_to_like: "¡No pudo marcarse como \"Me gusta\"! ¿Tal vez el autor de la publicación te está ignorando?"
+ errors:
+ connection: "No es posible conectarse al servidor."
failed_to_post_message: "¡No pudo publicarse el mensaje!"
failed_to_remove: "Fallo al eliminar la entrada!"
- failed_to_reshare: "Error al volver a compartir"
getting_started:
alright_ill_wait: "Todo bien, voy a esperar."
hey: "¡Hola, <%= name %>!"
@@ -151,6 +152,9 @@ es-AR:
notifications:
mark_read: "Marcar como leído"
mark_unread: "Marcar como no leído"
+ new_notifications:
+ one: "Tenés una notificación sin leer"
+ other: "Tenés <%= count %> notificaciones sin leer"
people:
edit_my_profile: "Editar mi perfil"
helper:
@@ -236,7 +240,6 @@ es-AR:
created: "El reporte se ha creado exitosamente"
exists: "El reporte ya existe"
reshares:
- duplicate: "¿Te gustó eh? ¡Ya habías compartido esa publicación!"
post: "¿Compartir la publicación de <%= name %>?"
successful: "¡La publicación se compartió correctamente!"
show_more: "Mostrar más"
diff --git a/config/locales/javascript/javascript.es-CL.yml b/config/locales/javascript/javascript.es-CL.yml
index ab15420fa..1c04a3676 100644
--- a/config/locales/javascript/javascript.es-CL.yml
+++ b/config/locales/javascript/javascript.es-CL.yml
@@ -26,7 +26,6 @@ es-CL:
show: "mostrar todos los comentarios"
confirm_dialog: "¿Estás seguro/a?"
delete: "Eliminar"
- failed_to_like: "¡Falló el 'Me gusta'!"
failed_to_post_message: "¡Falló la publicación del mensaje!"
getting_started:
alright_ill_wait: "Está bien, esperaré."
@@ -57,7 +56,6 @@ es-CL:
limited: "Limitada - tu publicación sólo será visto por gente con la que compartes"
public: "Público - tu post será visible para todos y encontrado por mecanismos de búsqueda"
reshares:
- duplicate: "¿Es genial, cierto?  ¡Ya has compartido esa publicación!"
successful: "¡La publicación se compartió correctamente!"
show_more: "mostrar más"
stream:
diff --git a/config/locales/javascript/javascript.es-MX.yml b/config/locales/javascript/javascript.es-MX.yml
index a840ed04c..dddbdef48 100644
--- a/config/locales/javascript/javascript.es-MX.yml
+++ b/config/locales/javascript/javascript.es-MX.yml
@@ -32,7 +32,6 @@ es-MX:
confirm_dialog: "¿Estás seguro?"
delete: "Borrar"
edit: "Editar"
- failed_to_like: "¡No se pudo marcar como «Me gusta»!"
failed_to_post_message: "¡No se pudo publicar el mensaje!"
failed_to_remove: "¡Se produjo un error al eliminar la entrada!"
getting_started:
@@ -73,7 +72,6 @@ es-MX:
near_from: "Publicado desde: <%= location %>"
public: "Público – tu publicación será visible para todos, y encontrada por buscadores"
reshares:
- duplicate: "Qué bien, ¿eh? ¡Ya has compartido esa publicación!"
post: "¿Compartir la publicación de <%= name %>?"
successful: "¡La publicación se compartió exitosamente!"
show_more: "mostrar más"
diff --git a/config/locales/javascript/javascript.es.yml b/config/locales/javascript/javascript.es.yml
index 3e037b986..ef7cd6d7a 100644
--- a/config/locales/javascript/javascript.es.yml
+++ b/config/locales/javascript/javascript.es.yml
@@ -109,11 +109,8 @@ es:
create: "Crear"
delete: "Eliminar"
edit: "Editar"
- failed_to_comment: "Error al comentar. ¿Puede ser que el autor te esté ignorando?"
- failed_to_like: "\"Me gusta\" no ha funcionado."
failed_to_post_message: "¡Error al publicar el mensaje!"
failed_to_remove: "¡Se produjo un error al eliminar la entrada!"
- failed_to_reshare: "¡Error al compartir!"
getting_started:
alright_ill_wait: "Está bien, esperaré."
hey: "¡Hola, <%= name %>!"
@@ -234,7 +231,6 @@ es:
created: "El informe fue creado correctamente"
exists: "El informe ya existe"
reshares:
- duplicate: "¿Verdad que te ha gustado? Pero ya has esa publicación."
post: "¿Compartir la publicación de <%= name %>?"
successful: "¡Publicación compartida con éxito!"
show_more: "mostrar más"
diff --git a/config/locales/javascript/javascript.eu.yml b/config/locales/javascript/javascript.eu.yml
index bf98ebbd9..00f348ada 100644
--- a/config/locales/javascript/javascript.eu.yml
+++ b/config/locales/javascript/javascript.eu.yml
@@ -26,7 +26,6 @@ eu:
show: "iruzkin guztiak erakutsi"
confirm_dialog: "Ziur al zaude?"
delete: "Ezabatu"
- failed_to_like: "Huts gustoko egitean!"
failed_to_post_message: "Huts egin du mezuaren bidalketak!"
getting_started:
alright_ill_wait: "Beno, itxarongo dut."
@@ -57,7 +56,6 @@ eu:
limited: "Mugatua - zure mezua aukeratu duzun jendeak bakarrik ikusiko du"
public: "Publikoa - zure mezua edonork ikusi ahalko du, bai eta bilaketa zerbitzuetan agertu ere"
reshares:
- duplicate: "Oso ona, e? Dagoeneko birpartekatu duzu mezu hori!"
post: "Birpartekatu nahi al duzu <%= name %>(r)en mezua?"
successful: "Mezua arrakastaz birpartekatu da!"
show_more: "erakutsi gehiago"
diff --git a/config/locales/javascript/javascript.fi.yml b/config/locales/javascript/javascript.fi.yml
index 3720953e3..c8a0bac34 100644
--- a/config/locales/javascript/javascript.fi.yml
+++ b/config/locales/javascript/javascript.fi.yml
@@ -63,10 +63,8 @@ fi:
create: "Luo"
delete: "Poista"
edit: "Muokkaa"
- failed_to_like: "Tykkääminen epäonnistui!"
failed_to_post_message: "Viestin lähetys epäonnistui!"
failed_to_remove: "Lisäyksen poistaminen epäonnistui!"
- failed_to_reshare: "Uudelleen jakaminen epäonnistui!"
getting_started:
alright_ill_wait: "Okei, minä odotan."
hey: "Hei <%= name %>!"
@@ -153,7 +151,6 @@ fi:
created: "Ilmoitus luotiin onnistuneesti"
exists: "Ilmoitus on jo olemassa"
reshares:
- duplicate: "Olet jo uudelleenjakanut tämän julkaisun!"
post: "Jaa käyttäjän <%= name %> julkaisu?"
successful: "Julkaisu jaettiin onnistuneesti!"
show_more: "Näytä lisää"
diff --git a/config/locales/javascript/javascript.fr.yml b/config/locales/javascript/javascript.fr.yml
index a9aba7533..e3ccd91ac 100644
--- a/config/locales/javascript/javascript.fr.yml
+++ b/config/locales/javascript/javascript.fr.yml
@@ -106,16 +106,17 @@ fr:
remove_contact: "Retirer ce contact"
search_no_results: "Aucun contact trouvé"
conversation:
+ create:
+ no_recipient: "Vous avez d'abord besoin d'ajouter un destinataire."
new:
no_contacts: "Vous devez ajouter des contacts avant de pouvoir démarrer une conversation."
create: "Créer"
delete: "Effacer"
edit: "Éditer"
- failed_to_comment: "Impossible de commenter. Peut-être que l'auteur vous ignore ?"
- failed_to_like: "Impossible d'aimer !"
+ errors:
+ connection: "Impossible de se connecter au serveur."
failed_to_post_message: "Impossible de partager le message !"
failed_to_remove: "L'entrée n'a pu être supprimée"
- failed_to_reshare: "Échec du repartage"
getting_started:
alright_ill_wait: "Bon, je vais attendre."
hey: "Hey, <%= name %> !"
@@ -151,6 +152,9 @@ fr:
notifications:
mark_read: "Marquer comme lu"
mark_unread: "Marquer comme non lu"
+ new_notifications:
+ one: "Vous avez une notification non lue."
+ other: "Vous avez <%= count %> notifications non lues."
people:
edit_my_profile: "Modifier mon profil"
helper:
@@ -237,7 +241,6 @@ fr:
created: "Le signalement a été crée avec succès."
exists: "Le signalement existe déjà"
reshares:
- duplicate: "C'est si bien que ça ? Vous avez déjà repartagé ce message !"
post: "Repartager le message de <%= name %> ?"
successful: "Le message a été repartagé !"
show_more: "Voir plus"
diff --git a/config/locales/javascript/javascript.he.yml b/config/locales/javascript/javascript.he.yml
index 5f5a8d4d5..379e2f447 100644
--- a/config/locales/javascript/javascript.he.yml
+++ b/config/locales/javascript/javascript.he.yml
@@ -32,7 +32,6 @@ he:
confirm_dialog: "האם אתם בטוחים?"
delete: "מחיקה"
edit: "עריכה"
- failed_to_like: "הסימון ב'אהבתי' נכשל!"
failed_to_post_message: "פרסום ההודעה נכשל!"
failed_to_remove: "הנסיון להסיר את הערך נכשל!"
getting_started:
@@ -88,7 +87,6 @@ he:
public: "ציבורי - הודעתך תהיה גלויה לכולם וניתן יהיה למצוא אותה במנועי חיפוש"
question: "שאלה"
reshares:
- duplicate: "כבר שיתפת מחדש את ההודעה הזו."
post: "האם לשתף מחדש את ההודעה של <%= name %>?"
successful: "ההודעה שותפה מחדש בהצלחה!"
show_more: "הצגת עוד"
diff --git a/config/locales/javascript/javascript.hu.yml b/config/locales/javascript/javascript.hu.yml
index d868bc858..b998dd286 100644
--- a/config/locales/javascript/javascript.hu.yml
+++ b/config/locales/javascript/javascript.hu.yml
@@ -22,6 +22,7 @@ hu:
other: "<%= count %> csoportban"
two: "<%= count %> csoportban"
zero: "Csoportok kiválasztása"
+ updating: "frissítés..."
aspect_navigation:
add_an_aspect: "+ Új csoport"
deselect_all: "Összes kijelölés megszüntetése"
@@ -31,6 +32,7 @@ hu:
post_something: "Hozz létre bejegyzést"
post_submit: "Bejegyzés közzététele..."
post_success: "Közzétéve! A felugró ablak bezáródik..."
+ cancel: "Mégsem"
comma: ","
comments:
hide: "hozzászólások elrejtése"
@@ -42,9 +44,10 @@ hu:
aspect_list_is_not_visible: "A csoport tagjai nem láthatják egymást."
aspect_list_is_visible: "A csoport tagjai láthatják egymást."
remove_contact: "Ismerős eltávolítása"
+ search_no_results: "Nincsenek kapcsolatok"
+ create: "Létrehozás"
delete: "Töröl"
edit: "Szerkesztés"
- failed_to_like: "Hiba"
failed_to_post_message: "Üzenet elküldése sikertelen!"
failed_to_remove: "Nem sikerült eltávolítani az elemet!"
getting_started:
@@ -67,6 +70,8 @@ hu:
search: "Keresés"
settings: "Beállítások"
view_all: "Összes"
+ hide_post: "Bejegyzés elrejetése?"
+ hide_post_failed: "Bejegyzés elrejtése nem lehetséges"
ignore: "Mellőzés"
ignore_failed: "Nem sikerült mellőzni ezt a felhasználót"
ignore_user: "Felhasználó mellőzése?"
@@ -94,6 +99,7 @@ hu:
close_result: "Eredmény rejtése"
count:
other: "<%=count%> szavazat eddig"
+ original_post: "eredeti bejegyzés"
result: "Eredmény"
show_result: "Eredmény mutatása"
vote: "Szavazás"
@@ -110,11 +116,18 @@ hu:
you_have_no_tags: "nincsenek címkéid!"
publisher:
add_option: "Válasz hozzáadása"
- limited: "Korlátozott - csak az ismerőseid láthatják ezt a bejegyzést"
+ limited: "Korlátozott: csak azok láthatják, akikkel megosztasz tartalmakat"
+ markdown_editor:
+ preview: "Előnézet"
+ tooltips:
+ insert_image: "Kép beillesztése"
+ insert_link: "Hivatkozás beillesztése"
+ write: "Szöveg"
near_from: "<%= location %> közelében"
option: "Válasz"
- public: "Nyilvános - ezt a bejegyzést bárki láthatja az interneten."
+ public: "Nyilvános: bárki láthatja és keresőrobotok is megtalálhatják"
question: "Kérdés"
+ remove_post: "Bejegyzés törlése?"
report:
name: "Jelentés"
prompt: "Kérünk adj meg egy indokot:"
@@ -123,7 +136,6 @@ hu:
created: "A jelentés sikeresen létrehozva"
exists: "A jelentés már létezik"
reshares:
- duplicate: "Jó mi? De már egyszer megosztottad ezt a bejegyzést!"
post: "Szeretnéd újra megosztani <%= name %> bejegyzését?"
successful: "A bejegyzés újraosztása sikeres!"
show_more: "tovább"
diff --git a/config/locales/javascript/javascript.hy.yml b/config/locales/javascript/javascript.hy.yml
index 47b217e42..df61d6df7 100644
--- a/config/locales/javascript/javascript.hy.yml
+++ b/config/locales/javascript/javascript.hy.yml
@@ -107,11 +107,8 @@ hy:
create: "Ստեղծել"
delete: "Ջնջել"
edit: "Փոփոխել"
- failed_to_comment: "Չստացվեց մեկնաբանել։ Գուցե հեղինակն արհամարհո՞ւմ է քեզ։"
- failed_to_like: "Չհաջողվեց հավանել։ Գուցե հեղինակն արհամարհո՞ւմ է քեզ։"
failed_to_post_message: "Չհաջողվեց գրառում կատարել։"
failed_to_remove: "Չստացվեց ջնջել մուտքագրածը։"
- failed_to_reshare: "Չստացվեց տարածել։"
getting_started:
alright_ill_wait: "Դե լավ, ես կսպասեմ։"
hey: "Հե՜յ, <%= name %>։"
@@ -189,6 +186,34 @@ hy:
publisher:
add_option: "Պատասխան ավելացնել"
limited: "Փակ. սա նշանակում է, որ գրառումդ տեսանելի է լինելու միայն այն մարդկանց, ում հետ կիսվում ես։"
+ markdown_editor:
+ preview: "Նախադիտել"
+ texts:
+ code: "կոդն այստեղ"
+ heading: "վերնագրի տեքստը"
+ insert_image_description_text: "նկարի նկարագրությունն այստեղ"
+ insert_image_help_text: "Տեղադրիր նկարի հղումն այստեղ՝"
+ insert_image_title: "նկարի անունն այստեղ"
+ insert_link_description_text: "հղման նկարագրությունն այստեղ"
+ insert_link_help_text: "Տեղադրիր հղումն այստեղ՝"
+ italic: "շեղատառ տեքստ"
+ list: "լցրու ցուցակն այստեղ"
+ quote: "մեջբերիր այստեղ"
+ strong: "թավատառ տեքստ"
+ tooltips:
+ bold: "Թավ"
+ cancel: "Չեղարկել"
+ code: "Կոդ ներմուծել"
+ heading: "Վերնագիր"
+ insert_image: "Նկար տեղադրել"
+ insert_link: "Հղում տեղադրել"
+ insert_ordered_list: "Կանոնավոր ցուցակ ներմուծել"
+ insert_unordered_list: "Անկանոն ցուցակ ներմուծել"
+ italic: "Շեղ"
+ preview: "Նախադիտել գրառումը"
+ quote: "Մեջբերում անել"
+ write: "Խմբագրել գրառումը"
+ write: "Շարադրել"
near_from: "Գրառված է <%= location %>ից"
option: "Պատասխան"
public: "Հրապարակային. սա նշանակում է, որ գրառումդ տեսանելի է լինելու բոլորին և հասանելի կլինի փնտրող համակարգերի համար"
@@ -202,7 +227,6 @@ hy:
created: "Բողոքը հաջողությամբ ստեղծվեց"
exists: "Բողոքը արդեն ստեղծված է"
reshares:
- duplicate: "Էդքան լա՞վն ա։ Արդեն տարածել ես այս գրառումը։"
post: "Տարածե՞լ <%= name %>-ի գրառումը։"
successful: "Գրառումը հաջողությամբ տարածվեց։"
show_more: "Ցույց տալ ավելին"
diff --git a/config/locales/javascript/javascript.ia.yml b/config/locales/javascript/javascript.ia.yml
index c59ff4789..bcfda0267 100644
--- a/config/locales/javascript/javascript.ia.yml
+++ b/config/locales/javascript/javascript.ia.yml
@@ -46,6 +46,9 @@ ia:
one: "Il ha ancora un pod non verificate."
other: "Il ha ancora <%= count %> pods non verificate."
unknown: "incognite"
+ version_failed:
+ one: "Il ha un pod que non ha version (pod ancian sin NodeInfo)."
+ other: "Il ha <%= count %> pods que non ha version (pods ancian sin NodeInfo)."
admins:
dashboard:
compare_versions: "Le ultime version de diaspora* es <%= latestVersion %>; iste pod executa <%= podVersion %>."
@@ -90,6 +93,8 @@ ia:
confirm_unload: "Per favor, confirma que tu vole quitar iste pagina. Le datos que tu ha inserite non essera salveguardate."
contacts:
add_contact: "Adder contacto"
+ aspect_chat_is_enabled: "Le contactos in iste aspecto pote chattar con te."
+ aspect_chat_is_not_enabled: "Le contactos in iste aspecto non pote chattar con te."
aspect_list_is_not_visible: "Le contactos in iste aspecto non pote vider le un le altere."
aspect_list_is_visible: "Le contactos in iste aspecto pote vider le un le altere."
error_add: "Non poteva adder <%= name %> al aspecto."
@@ -97,16 +102,17 @@ ia:
remove_contact: "Remover contacto"
search_no_results: "Nulle contacto trovate"
conversation:
+ create:
+ no_recipient: "Es necessari adder un destinatario primo."
new:
no_contacts: "Es necessari adder alcun contactos ante de poter initiar un conversation."
create: "Crear"
delete: "Deler"
edit: "Modificar"
- failed_to_comment: "Commento fallite. Es possibile que le autor te ignora."
- failed_to_like: "Appreciation fallite!"
+ errors:
+ connection: "Impossibile connecter al servitor."
failed_to_post_message: "Publication del entrata fallite!"
failed_to_remove: "Le remotion del entrata ha fallite."
- failed_to_reshare: "Repetition fallite!"
getting_started:
alright_ill_wait: "Ben, io attendera."
hey: "Hallo, <%= name %>!"
@@ -142,6 +148,9 @@ ia:
notifications:
mark_read: "Marcar como legite"
mark_unread: "Marcar como non legite"
+ new_notifications:
+ one: "Tu ha <%= count %> notification non legite"
+ other: "Tu ha <%= count %> notificationes non legite"
people:
edit_my_profile: "Modificar mi profilo"
helper:
@@ -186,20 +195,47 @@ ia:
publisher:
add_option: "Adder un responsa"
limited: "Limitate: le message es visibile solmente pro le personas con qui tu lo divide"
+ markdown_editor:
+ preview: "Previsualisar"
+ texts:
+ code: "scribe hic le codice"
+ heading: "texto de titulo"
+ insert_image_description_text: "describe hic le imagine"
+ insert_image_help_text: "Inserer hic un ligamine a un imagine"
+ insert_image_title: "scribe hic le titulo del imagine"
+ insert_link_description_text: "describe hic le ligamine"
+ insert_link_help_text: "Inserer ligamine hic"
+ italic: "texto italic"
+ list: "scribe hic le texto del lista"
+ quote: "scribe hic le texto del citation"
+ strong: "texto forte"
+ tooltips:
+ bold: "Grasse"
+ cancel: "Cancellar message"
+ code: "Inserer codice"
+ heading: "Titulo"
+ insert_image: "Inserer imagine"
+ insert_link: "Inserer ligamine"
+ insert_ordered_list: "Inserer lista ordinate"
+ insert_unordered_list: "Inserer lista non ordinate"
+ italic: "Italic"
+ preview: "Previsualisar message"
+ quote: "Inserer citation"
+ write: "Modificar message"
+ write: "Scriber"
near_from: "Inviate ab: <%= location %>"
option: "Responsa"
public: "Public: le message es visibile pro tote le mundo e trovabile pro motores de recerca"
question: "Question"
remove_post: "Remover iste entrata?"
report:
- name: "Reporto"
+ name: "Reportar"
prompt: "Specifica un motivo:"
prompt_default: "contento offensive"
status:
created: "Le creation del reporto ha succedite"
exists: "Le reporto jam existe"
reshares:
- duplicate: "Tu ha jam repetite iste entrata."
post: "Repeter le entrata de <%= name %>?"
successful: "Le entrata ha essite repetite con successo."
show_more: "monstrar plus"
@@ -216,6 +252,7 @@ ia:
hide_nsfw_posts: "Celar entratas #nsfw (improprie pro le travalio)"
like: "Appreciar"
limited: "Limitate"
+ no_posts_yet: "Il non ha ancora entratas a monstrar hic."
original_post_deleted: "Le entrata original ha essite delite per le autor."
permalink: "Permaligamine"
public: "Public"
@@ -245,6 +282,7 @@ ia:
hour: "circa un hora"
hours:
other: "circa %d horas"
+ inPast: "a qualcunque momento"
minute: "circa un minuta"
minutes:
other: "%d minutas"
diff --git a/config/locales/javascript/javascript.id.yml b/config/locales/javascript/javascript.id.yml
index 73326f6da..a803cf236 100644
--- a/config/locales/javascript/javascript.id.yml
+++ b/config/locales/javascript/javascript.id.yml
@@ -25,7 +25,6 @@ id:
show: "tampilkan semua komentar"
confirm_dialog: "Anda yakin ?"
delete: "Menghapus"
- failed_to_like: "Gagal untuk 'like'!"
failed_to_post_message: "Gagal memposting pesan!"
getting_started:
alright_ill_wait: "Baiklah, Saya akan menunggu"
@@ -42,8 +41,6 @@ id:
publisher:
limited: "Di Limitasi - Apa yang anda publikasi hanya dapat di lihat oleh orang-orang yang berbagi dengan anda."
public: "Publik - Apa yang anda publikasi dapat di lihat oleh siapa saja dan dapat di temukan oleh mesin pencari."
- reshares:
- duplicate: "Menarik ? Anda telah membagikan ulang posting tersebut!"
show_more: "Tampilkan lebih banyak lagi"
stream:
comment: "Komentar"
diff --git a/config/locales/javascript/javascript.is.yml b/config/locales/javascript/javascript.is.yml
index 74f241949..5dca7fb38 100644
--- a/config/locales/javascript/javascript.is.yml
+++ b/config/locales/javascript/javascript.is.yml
@@ -32,7 +32,6 @@ is:
confirm_dialog: "Ertu viss?"
delete: "Eyða"
edit: "Breyta"
- failed_to_like: "Tókst ekki að líka við. Ætli höfundurinn sé að hunsa þig?"
failed_to_post_message: "Tókst ekki að senda skeytið!"
getting_started:
alright_ill_wait: "Ekkert mál, ég get beðið."
@@ -75,7 +74,6 @@ is:
near_from: "Sennt inn nálægt: <%= location %>"
public: "Opinbert - skeytið verður sýnilegt öllum, leitarvélar geta einnig fundið póstinn"
reshares:
- duplicate: "Þetta gott, ha? Þú ert þegar búinn að endurdeila þessari færslu!"
post: "Deila áfram færslu frá <%= name %>?"
successful: "Tókst að deila þessu skeyti áfram!"
show_more: "Sýna meira"
diff --git a/config/locales/javascript/javascript.it.yml b/config/locales/javascript/javascript.it.yml
index 8fdec11a9..706cde2c0 100644
--- a/config/locales/javascript/javascript.it.yml
+++ b/config/locales/javascript/javascript.it.yml
@@ -35,7 +35,6 @@ it:
confirm_dialog: "Sei sicuro?"
delete: "Elimina"
edit: "Modifica"
- failed_to_like: "Errore, il \"mi piace\" non è stato inviato!"
failed_to_post_message: "Invio messaggio fallito!"
getting_started:
alright_ill_wait: "Perfetto, aspetterò."
@@ -75,7 +74,6 @@ it:
near_from: "Vicino a: <%= location %>"
public: "Pubblico - il tuo post sarà visibile a tutti, inclusi i motori di ricerca"
reshares:
- duplicate: "Bello eh? Ma hai già condiviso quel post!"
post: "Vuoi condividere il post di <%= name %>?"
successful: "Il post è stato condiviso!"
show_more: "continua..."
diff --git a/config/locales/javascript/javascript.ja.yml b/config/locales/javascript/javascript.ja.yml
index e7897d2ea..cba79d345 100644
--- a/config/locales/javascript/javascript.ja.yml
+++ b/config/locales/javascript/javascript.ja.yml
@@ -55,7 +55,7 @@ ja:
aspect_dropdown:
add_to_aspect: "Add to aspect"
all_aspects: "全てのアスペクト"
- error: "<%= name %>さんと共有を始めることができません。 無視しますか?"
+ error: "<%= name %>さんとシェアを始めることができません。 無視しますか?"
error_remove: "アスペクトから<%= name %>さんを削除できませんでした :("
mobile_row_checked: "<%= name %> (削除)"
mobile_row_unchecked: "<%= name %> (追加)"
@@ -101,16 +101,17 @@ ja:
remove_contact: "連絡先を削除"
search_no_results: "連絡先が見つかりません"
conversation:
+ create:
+ no_recipient: "最初に受信者を追加する必要があります!"
new:
no_contacts: "会話を開始する前に、連絡先を追加する必要があります。"
create: "作成"
delete: "削除"
edit: "編集"
- failed_to_comment: "コメントに失敗しました。おそらく作者があなたを無視していませんか?"
- failed_to_like: "いいね!に失敗しました。おそらく作者があなたを無視していませんか?"
+ errors:
+ connection: "サーバーに接続できません。"
failed_to_post_message: "メッセージの投稿に失敗しました!"
failed_to_remove: "エントリーの削除に失敗しました!"
- failed_to_reshare: "再共有に失敗しました!"
getting_started:
alright_ill_wait: "OK、私は待ちます。"
hey: "Hey, <%= name %>!"
@@ -146,11 +147,13 @@ ja:
notifications:
mark_read: "既読にする"
mark_unread: "未読にする"
+ new_notifications:
+ other: "<%= count %> 件、未読の通知があります"
people:
edit_my_profile: "マイ プロフィールを編集する"
helper:
- is_not_sharing: "<%= name %>さんはあなたと共有していません"
- is_sharing: "<%= name %>さんはあなたと共有しています"
+ is_not_sharing: "<%= name %>さんはあなたとシェアしていません"
+ is_sharing: "<%= name %>さんはあなたとシェアしています"
mention: "メンション"
message: "メッセージ"
not_found: "…1人も見つかりませんでした"
@@ -180,13 +183,13 @@ ja:
contacts: "連絡先"
edit: "編集"
gender: "性別"
- location: "場所"
+ location: "所在地"
photos: "写真"
posts: "投稿"
you_have_no_tags: "タグがありません!"
publisher:
add_option: "回答を追加"
- limited: "限定公開 - 投稿はあなたが共有している人だけが見られるようになります"
+ limited: "限定公開 - 投稿はあなたがシェアしている人だけが見られるようになります"
markdown_editor:
preview: "プレビュー"
texts:
@@ -228,9 +231,8 @@ ja:
created: "報告を正常に作成しました"
exists: "報告はすでに存在します"
reshares:
- duplicate: "えっ?すでにこの投稿を共有しています!"
- post: "<%= name %>さんの投稿を再共有しますか?"
- successful: "投稿は正常に再共有されました!"
+ post: "<%= name %>さんの投稿をリシェアしますか?"
+ successful: "投稿は正常にリシェアされました!"
show_more: "さらに表示する"
stream:
comment: "コメント"
@@ -245,19 +247,11 @@ ja:
hide_nsfw_posts: "#nsfwの投稿を隠す"
like: "いいね!"
likes:
- few: "<%= count %> Likes"
- many: "<%= count %> Likes"
- one: "<%= count %> Like"
other: "<%= count %> いいね!"
- two: "<%= count %> Likes"
zero: "<%= count %> いいね!"
limited: "限定公開"
more_comments:
- few: "Show <%= count %> more comments"
- many: "Show <%= count %> more comments"
- one: "Show <%= count %> more comment"
other: "さらに <%= count %> のコメントを表示"
- two: "Show <%= count %> more comments"
zero: "さらに <%= count %> のコメントを表示"
no_posts_yet: "まだここに表示する投稿はありません。"
original_post_deleted: "元の投稿は作者によって削除されました"
@@ -266,14 +260,10 @@ ja:
reactions:
other: "<%= count%> リアクション"
zero: "<%= count%> リアクション"
- reshare: "再共有"
+ reshare: "リシェア"
reshares:
- few: "<%= count %> Reshares"
- many: "<%= count %> Reshares"
- one: "<%= count %> Reshare"
- other: "<%= count %> 再共有"
- two: "<%= count %> Reshares"
- zero: "<%= count %> 再共有"
+ other: "<%= count %> リシェア"
+ zero: "<%= count %> リシェア"
show_nsfw_post: "投稿を表示する"
show_nsfw_posts: "全て表示"
tags:
@@ -292,14 +282,14 @@ ja:
day: "1日"
days:
other: "%d日"
- hour: "大体1時間"
+ hour: "約1時間"
hours:
- other: "大体%d時間"
+ other: "約%d時間"
inPast: "今さっき"
minute: "約1分"
minutes:
other: "%d分"
- month: "大体1ヶ月"
+ month: "約1ヶ月"
months:
other: "%dヶ月"
prefixAgo: ""
@@ -308,9 +298,9 @@ ja:
suffixAgo: "前"
suffixFromNow: "後"
wordSeparator: " "
- year: "大体1年"
+ year: "約1年"
years:
other: "%d年"
unblock_failed: "このユーザーのブロック解除に失敗しました"
viewer:
- reshared: "再共有しました" \ No newline at end of file
+ reshared: "リシェアしました" \ No newline at end of file
diff --git a/config/locales/javascript/javascript.ka.yml b/config/locales/javascript/javascript.ka.yml
index 79e4f018d..0460662bd 100644
--- a/config/locales/javascript/javascript.ka.yml
+++ b/config/locales/javascript/javascript.ka.yml
@@ -25,7 +25,6 @@ ka:
show: "ყველა კომენტარის ჩვენება"
confirm_dialog: "დარწმუნებული ხართ?"
delete: "წაშლა"
- failed_to_like: "მოწონება ვერ მოხერხდა!"
failed_to_post_message: "შეტყობინების გამოქვეყნება ვერ მოხერხდა!"
getting_started:
alright_ill_wait: "კარგი, მოვიცდი."
@@ -52,8 +51,6 @@ ka:
publisher:
limited: "შეზღუდული - თქვენს პოსტს დაინახავს მხოლოდ ის ხალხი რომელთაც გაუზიარებთ"
public: "საჯარო - თქვენს პოსტს დაინახავს ყველა და ის გამოჩნდება საძიებო სისტემაში"
- reshares:
- duplicate: "ასეთი მაგარია? თქვენ უკვე გააზიარეთ ეს პოსტი!"
show_more: "მეტის ჩვენება"
stream:
comment: "კომენტარი"
diff --git a/config/locales/javascript/javascript.ko.yml b/config/locales/javascript/javascript.ko.yml
index 8f9378a59..73abde04a 100644
--- a/config/locales/javascript/javascript.ko.yml
+++ b/config/locales/javascript/javascript.ko.yml
@@ -33,7 +33,6 @@ ko:
confirm_dialog: "확실합니까?"
delete: "지우기"
edit: "고치기"
- failed_to_like: "좋아요를 실패했습니다!"
failed_to_post_message: "메시지 게시를 실패하였습니다!"
getting_started:
alright_ill_wait: "기다릴게요."
@@ -78,7 +77,6 @@ ko:
public: "공개 - 내 게시물을 누구나 볼 수 있고 검색 엔진으로 찾을 수 있습니다"
question: "질문"
reshares:
- duplicate: "이미 재공유된 게시물입니다!"
post: "<%= name %>님의 게시물을 재공유할까요?"
successful: "해당 게시물이 성공적으로 재공유되었습니다!"
show_more: "더 보기"
diff --git a/config/locales/javascript/javascript.lt.yml b/config/locales/javascript/javascript.lt.yml
index 33a7d0366..3e211df37 100644
--- a/config/locales/javascript/javascript.lt.yml
+++ b/config/locales/javascript/javascript.lt.yml
@@ -27,7 +27,6 @@ lt:
show: "Rodyti visus komentarus"
confirm_dialog: "Ar Jūs tuo įsitikinęs?"
delete: "Ištrinti"
- failed_to_like: "Nepavyko pamėgti!"
failed_to_post_message: "Nepavyko išsiųsti žinutės!"
getting_started:
alright_ill_wait: "Suprantama, aš galiu palaukti!"
@@ -54,8 +53,6 @@ lt:
publisher:
limited: "Ribotas - Jūsų įrašą galės peržiūrėti tik žmonės, su kuriais Jūs dalijatės"
public: "Viešas - Jūsų įrašus galės peržiūrėti visi, taip pat jie bus randami paieškos sistemose."
- reshares:
- duplicate: "Šitas geras, ne? Jūs jau dalijotės šiuo įrašu!"
show_more: "Rodyti daugiau"
stream:
comment: "Komentuoti"
diff --git a/config/locales/javascript/javascript.ml.yml b/config/locales/javascript/javascript.ml.yml
index 4110513dd..37c9d4762 100644
--- a/config/locales/javascript/javascript.ml.yml
+++ b/config/locales/javascript/javascript.ml.yml
@@ -32,7 +32,6 @@ ml:
confirm_dialog: "താങ്കള്‍ക്ക് ഉറപ്പാണോ?"
delete: "മായ്ക്കുക"
edit: "തിരുത്തുക"
- failed_to_like: "ഇഷ്ടപെടാൻ സാധിച്ചില്ല"
failed_to_post_message: "സന്ദേശം ഇടാൻ സാധിച്ചില്ല"
getting_started:
alright_ill_wait: "ശരി, ഞാൻ കാത്തിരിക്കാം"
@@ -71,7 +70,6 @@ ml:
near_from: "<%= location %>ല്‍ നിന്നും അയച്ചത്"
public: "പൊതുവായത് - താങ്കളുടെ കുറിപ്പ് എല്ലാവർക്കും കാണാൻ സാധിക്കും. കൂടാതെ തിരച്ചിൽ യന്ത്രങ്ങളാൽ കണ്ടുപിടിക്കപ്പെടുകയും ചെയ്യും"
reshares:
- duplicate: "അത്ര നല്ലതാണോ? താങ്കൾ ആ കുറിപ്പ് മുൻപേ തന്നെ വീണ്ടും പങ്കിട്ടിട്ടുണ്ട്"
post: "<%= name %>ന്റെ കുറിപ്പ് വീണ്ടും പങ്കിടണോ?"
successful: "ഈ കുറിപ്പ് വിജയകരമായി വീണ്ടും പങ്കുവെയ്ക്കപ്പെട്ടു!"
show_more: "കൂടുതല്‍ കാണിക്കുക"
diff --git a/config/locales/javascript/javascript.ms.yml b/config/locales/javascript/javascript.ms.yml
index 08538a490..fc0fb6290 100644
--- a/config/locales/javascript/javascript.ms.yml
+++ b/config/locales/javascript/javascript.ms.yml
@@ -42,7 +42,6 @@ ms:
error_remove: "Tidak dapat membuang <%= name %> dari aspek :("
remove_contact: "Buang kenalan"
edit: "Edit"
- failed_to_like: "Gagal untuk suka!"
failed_to_post_message: "Gagal untuk pos mesej!"
failed_to_remove: "Gagal membuang catatan!"
getting_started:
@@ -112,7 +111,6 @@ ms:
created: "Laporan itu sudah wujud"
exists: "Laporan itu sudah wujud"
reshares:
- duplicate: "Yang baik, kan? Anda telah berkongsi semula pos itu!"
post: "Kongsi semula catatan <%= name %>?"
successful: "Catatan berjaya dikongsi semula!"
show_more: "tunjuk lagi"
diff --git a/config/locales/javascript/javascript.nb.yml b/config/locales/javascript/javascript.nb.yml
index 6367edcd9..a31618ca0 100644
--- a/config/locales/javascript/javascript.nb.yml
+++ b/config/locales/javascript/javascript.nb.yml
@@ -60,10 +60,8 @@ nb:
create: "Lag"
delete: "Slett"
edit: "Rediger"
- failed_to_like: "Klarte ikke å like!"
failed_to_post_message: "Klarte ikke å publisere post!"
failed_to_remove: "Noe gikk galt i forsøket på å fjerne innlegget!"
- failed_to_reshare: "Kunne ikke videredele"
getting_started:
alright_ill_wait: "Greit, jeg venter."
hey: "Hei, <%= name %>!"
@@ -138,6 +136,33 @@ nb:
publisher:
add_option: "Legg til valg"
limited: "Begrenset - posten din vil bare være synlig for de du deler med"
+ markdown_editor:
+ preview: "Forhåndsvis"
+ texts:
+ code: "kode her"
+ heading: "Tekst for overskrift"
+ insert_image_description_text: "legg til bildebeskrivelse her"
+ insert_image_help_text: "Sett inn bildelink her"
+ insert_image_title: "legg til bildetittel her"
+ insert_link_description_text: "legg til lenkebeskrivelse her"
+ insert_link_help_text: "sett inn lenke her"
+ italic: "Kursiv tekst"
+ quote: "sitert tekst her"
+ strong: "Uthevet tekst"
+ tooltips:
+ bold: "Fet skrift"
+ cancel: "Avbryt melding"
+ code: "Sett inn kode"
+ heading: "Overskrift"
+ insert_image: "Sett inn bilde"
+ insert_link: "Sett inn link"
+ insert_ordered_list: "Sett inn kronologisk liste"
+ insert_unordered_list: "Sett inn uordnet liste"
+ italic: "Kursiv"
+ preview: "Forhåndsvis melding"
+ quote: "Sett inn sitat"
+ write: "Rediger melding"
+ write: "Skriv"
near_from: "Publisert fra: <%= location %>"
option: "Valg <%= nr %>"
public: "Offentlig - posten din vil være synlig for alle og kan bli funnet av søkemotorer"
@@ -151,7 +176,6 @@ nb:
created: "Rapporten er opprettet"
exists: "Rapporten eksisterer allerede"
reshares:
- duplicate: "du har allerede delt denne posten!"
post: "Videredel <%= name %> sitt innhold?"
successful: "Dette innholdet ble videredelt"
show_more: "vis mer"
@@ -176,6 +200,7 @@ nb:
one: "Vis <%= count %> kommentar til"
other: "Vis <%= count %> komentarer til"
zero: "Ikke flere kommentarer"
+ no_posts_yet: "Det er ingen poster å vise her ennå"
original_post_deleted: "Den opprinnelige posten er slettet av forfatteren."
public: "Offentlig"
reshare: "Del"
diff --git a/config/locales/javascript/javascript.nl.yml b/config/locales/javascript/javascript.nl.yml
index b0c929669..168bfc232 100644
--- a/config/locales/javascript/javascript.nl.yml
+++ b/config/locales/javascript/javascript.nl.yml
@@ -114,11 +114,8 @@ nl:
create: "Creëren"
delete: "Verwijder"
edit: "Bewerken"
- failed_to_comment: "Reageren mislukt. Misschien negeert de schrijver jou?"
- failed_to_like: "Leuk vinden mislukt. Misschien negeert de auteur jou?"
failed_to_post_message: "Bericht plaatsen mislukt!"
failed_to_remove: "Kon het bericht niet verwijderen!"
- failed_to_reshare: "Doorgeven mislukt!"
getting_started:
alright_ill_wait: "Prima, ik wacht wel."
hey: "Hallo, <%= name %>!"
@@ -154,6 +151,9 @@ nl:
notifications:
mark_read: "Markeren als gelezen"
mark_unread: "Markeren als ongelezen"
+ new_notifications:
+ one: "Je hebt <%= count %> ongelezen melding"
+ other: "Je hebt <%= count %> ongelezen meldingen"
people:
edit_my_profile: "Bewerk mijn profiel"
helper:
@@ -198,6 +198,30 @@ nl:
publisher:
add_option: "Keuzemogelijkheid toevoegen"
limited: "Gelimiteerd - je bericht is alleen zichtbaar voor de mensen waarmee je hem deelt"
+ markdown_editor:
+ preview: "Voorbeeld"
+ texts:
+ code: "code hier"
+ heading: "Koptekst"
+ insert_image_title: "voeg hier afbeeldingstekst in"
+ italic: "Cursieve tekst"
+ list: "lijst tekst hier"
+ quote: "quote hier"
+ strong: "Benadrukte tekst"
+ tooltips:
+ bold: "Vet"
+ cancel: "Annuleren bericht"
+ code: "Invoegen code"
+ heading: "Koptekst"
+ insert_image: "Invoegen afbeelding"
+ insert_link: "Invoegen link"
+ insert_ordered_list: "Invoegen genummerde lijst"
+ insert_unordered_list: "Invoegen ongenummerde lijst"
+ italic: "Cursief"
+ preview: "Voorbeeld bericht"
+ quote: "Invoegen quote"
+ write: "Bewerk bericht"
+ write: "Schrijven"
near_from: "Geplaatst vanaf: <%= location %>"
option: "Keuze <%= nr %>"
public: "Openbaar - je bericht is zichtbaar voor iedereen en kan gevonden worden door zoekmachines"
@@ -211,7 +235,6 @@ nl:
created: "Het is succesvol gemeld"
exists: "De melding bestaat al"
reshares:
- duplicate: "Je hebt dit bericht al doorgegeven! Is het echt zo goed?"
post: "Doorgeven <%= name %>'s bericht?"
successful: "Het bericht is gedeeld!"
show_more: "Laat meer zien"
diff --git a/config/locales/javascript/javascript.nn.yml b/config/locales/javascript/javascript.nn.yml
index 708e558b0..4e042f80f 100644
--- a/config/locales/javascript/javascript.nn.yml
+++ b/config/locales/javascript/javascript.nn.yml
@@ -31,7 +31,6 @@ nn:
confirm_dialog: "Er du sikker?"
delete: "Slett"
edit: "Endra"
- failed_to_like: "Like-funksjonen feila."
failed_to_post_message: "Klarte ikkje å senda meldinga."
getting_started:
alright_ill_wait: "Greitt, eg ventar."
@@ -65,7 +64,6 @@ nn:
limited: "Avgrensa - berre personar du deler med vil kunna sjå meldinga"
public: "Offentleg - alle kan sjå meldinga di og ho kan bli funnen av søkjemotorar"
reshares:
- duplicate: "Så bra, altså? Men du har allereie delt meldinga :-)"
post: "Vil du dele <%= name %> sin post?"
successful: "Hurra, posten vart delt!"
show_more: "syn meir"
diff --git a/config/locales/javascript/javascript.oc.yml b/config/locales/javascript/javascript.oc.yml
new file mode 100644
index 000000000..c5dc05786
--- /dev/null
+++ b/config/locales/javascript/javascript.oc.yml
@@ -0,0 +1,316 @@
+# Copyright (c) 2010-2013, Diaspora Inc. This file is
+# licensed under the Affero General Public License version 3 or later. See
+# the COPYRIGHT file.
+
+
+
+oc:
+ javascripts:
+ admin:
+ pods:
+ actions: "Accions"
+ added: "Apondut"
+ check: "executar un tèst de connexion"
+ errors:
+ one: "Lo tèst de connexion rapòrta una error per un pod."
+ other: "Lo tèst de connexion rapòrta una error per <%= count %> pods."
+ follow_link: "dobrir lo ligam dins lo navigador"
+ last_check: "darrièra verificacion :"
+ more_info: "mostrar mai d'informacion"
+ ms:
+ one: "<%= count %>&nbsp;ms"
+ other: "<%= count %>&nbsp;ms"
+ no_info: "Pas d informacion suplementària de disponibla pel moment."
+ not_available: "pas disponible"
+ offline_since: "fòra linha dempuèi :"
+ pod: "Pod"
+ recheck:
+ failure: "La verificacion es pas estada executada."
+ success: "Lo pod ven d'èsser verificat tornamai."
+ response_time: "Temps de responsa :"
+ server_software: "Logicial del servidor :"
+ ssl: "SSL"
+ ssl_disabled: "SSL desactivada"
+ ssl_enabled: "SSL activada"
+ states:
+ dns_failed: "La resolucion del nom (DNS) a fracassat"
+ http_failed: "La connexion HTTP a fracassat"
+ net_failed: "La tempativa de connexion a fracassat"
+ no_errors: "D'acòrdi"
+ ssl_failed: "La connexion securizada (SSL) a fracassat"
+ unchecked: "Pas verificat"
+ unknown_error: "Una error desconeguda s'es produita pendent la verificacion"
+ version_failed: "Impossible de determinar la version del programa"
+ status: "Estat"
+ unchecked:
+ one: "Demòra un pod qu'es pas brica estat verificat."
+ other: "Demòra <%= count %> pods que son pas brica estat verificats."
+ unknown: "desconegut"
+ version_failed:
+ one: "I a un pod que sa version es desconeguda (un ancian pod, pas de NodeInfo)."
+ other: "I a <%= count %> pods que lor versions son desconegudas (d'ancians pods, pas de NodeInfo)."
+ admins:
+ dashboard:
+ compare_versions: "La darrièra version de diaspora* es <%= latestVersion %>, vòstre pod vira jos la version <%= podVersion %>."
+ error: "Impossible de determinar la darrièra version de diaspora*."
+ outdated: "Vòstre pod es pas a jorn."
+ up_to_date: "Vòstre pod es a jorn !"
+ and: "e"
+ aspect_dropdown:
+ add_to_aspect: "Apondre un contacte"
+ all_aspects: "Totes los aspèctes"
+ error: "Impossible de partejar amb <%= name %>. Ignoratz aquesta persona ?"
+ error_remove: "Pòt pas suprimir <%= name %> de l'aspècte :("
+ mobile_row_checked: "<%= name %> (suprimir)"
+ mobile_row_unchecked: "<%= name %> (apondre)"
+ select_aspects: "Seleccionar los aspèctes"
+ started_sharing_with: "Avètz començat de partejar amb <%= name %>."
+ stopped_sharing_with: "Avètz arrestat de partejar amb <%= name %>."
+ toggle:
+ one: "Dins <%= count %> aspècte"
+ other: "Dins <%= count %> aspèctes"
+ zero: "Dins <%= count %> aspècte"
+ updating: "mesa a jorn..."
+ aspect_navigation:
+ add_an_aspect: "+ Apondre un aspècte"
+ deselect_all: "Deseleccionat tot"
+ no_aspects: "Cap d'aspècte pas seleccionat"
+ select_all: "Seleccionar tot"
+ aspects:
+ create:
+ add_a_new_aspect: "Apondre un aspècte novèl"
+ failure: "La creacion de l'aspècte a fracassat."
+ success: "Vòstre novèl aspècte <%= name %> es estat creat"
+ make_aspect_list_visible: "Permetre als contactes d'aqueste aspècte de se veire entre eles ?"
+ name: "Nom"
+ bookmarklet:
+ post_something: "Publicar sus diaspora*"
+ post_submit: "Messatge en cors de publicacion..."
+ post_success: "Publicat ! Tampadura de la fenèstra popup..."
+ cancel: "Anullar"
+ comma: ","
+ comments:
+ hide: "Amagar los comentaris"
+ no_comments: "I a pas encara cap de comentari."
+ show: "Afichar totes los comentaris"
+ confirm_dialog: "Sètz segur ?"
+ confirm_unload: "Mercé de confirmar que volètz quitar aquesta pagina — las donadas sasidas seràn pas salvadas."
+ contacts:
+ add_contact: "Apondre aqueste contacte"
+ aspect_chat_is_enabled: "Los contactes d'aqueste aspècte pòdon discutir amb vos."
+ aspect_chat_is_not_enabled: "Los contactes d'aqueste aspècte pòdon pas discutir amb vos."
+ aspect_list_is_not_visible: "Los contactes d'aquesta facieta se pòdon pas veire entre eles."
+ aspect_list_is_visible: "Los contactes d'aqueste aspècte se pòdon veire entre eles."
+ error_add: "Impossible d'apondre <%= name %> a aquesta facieta :("
+ error_remove: "Impossible de levar <%= name %> a aquesta facieta :("
+ remove_contact: "Levar aqueste contacte"
+ search_no_results: "Cap de contact pas trobat"
+ conversation:
+ new:
+ no_contacts: "Vos cal apondre de contactes abans de poder aviar una conversacion."
+ create: "Crear"
+ delete: "Suprimir"
+ edit: "Editar"
+ failed_to_post_message: "Impossible de partejar lo messatge !"
+ failed_to_remove: "L'entrada a pas pogut èsser suprimida"
+ getting_started:
+ alright_ill_wait: "Bon, vau esperar."
+ hey: "Adiu, <%= name %>"
+ no_tags: "È, seguissètz pas cap de tag ! Contunar malgrat tot ?"
+ preparing_your_stream: "Preparacion de vòstre flux personalizat..."
+ header:
+ admin: "Administracion"
+ close: "Tampar"
+ contacts: "Contactes"
+ conversations: "Discussions"
+ help: "Ajuda"
+ home: "Acuèlh"
+ log_out: "Desconnexion"
+ mark_all_as_read: "Tot marcar coma legit"
+ moderator: "Moderator"
+ notifications: "Notificacions"
+ profile: "Perfil"
+ recent_notifications: "Administracion"
+ search: "Recercar"
+ settings: "Paramètres"
+ toggle_mobile: "Activar/desactivar la version mobila"
+ toggle_navigation: "Afichar/amagar lo menú"
+ view_all: "Afichar tot"
+ hide_post: "Amagar aquesta publicacion ?"
+ hide_post_failed: "Impossible d'amagar aqueste messatge"
+ ignore: "Ignorar"
+ ignore_failed: "Impossible d'ignorar aqueste utilizaire"
+ ignore_user: "Ignorar aqueste utilizaire ?"
+ my_activity: "Mon activitat"
+ my_aspects: "Mos aspèctes"
+ my_stream: "Flux"
+ no_results: "Pas cap de resultat"
+ notifications:
+ mark_read: "Marcar coma legit"
+ mark_unread: "Marcar coma pas legit"
+ people:
+ edit_my_profile: "Modificar mon perfil"
+ helper:
+ is_not_sharing: "<%= name %> parteja pas amb vos"
+ is_sharing: "<%= name %> parteja amb vos"
+ mention: "Mencion"
+ message: "Messatge"
+ not_found: "E degun es pas estat trobat..."
+ stop_ignoring: "Ignorar pas mai"
+ photo_uploader:
+ completed: "<%= file %> completat"
+ empty: "{file} es void, mercé de seleccionar d'autres fichièrs."
+ error: "Un problèma s'es produit pendent lo mandadís del fichièr <%= file %>"
+ invalid_ext: "{file} a una extension invalida, Solas {extensions} son permesas."
+ looking_good: "Impressionant, avètz un super look !"
+ size_error: "{file} es tròp gròs, la talha maximala es de {sizeLimit}."
+ poll:
+ answer_count:
+ one: "1 vòte"
+ other: "<%=count%> vòtes"
+ zero: "0 vòte"
+ close_result: "Amagar lo resultat"
+ count:
+ one: "<%=count%> vòte pel moment"
+ other: "<%=count%> vòtes pel moment"
+ zero: "Pas cap de vòte pel moment"
+ go_to_original_post: "Podètz participar a aqueste sondatge sul <%= original_post_link %>."
+ original_post: "messatge inicial"
+ result: "Resultat"
+ show_result: "Afichar lo resultat"
+ vote: "Vòte"
+ profile:
+ add_some: "apondre"
+ bio: "Biografia"
+ born: "Anniversari"
+ contacts: "Contactes"
+ edit: "Modificar"
+ gender: "Sèxe"
+ location: "Localizacion"
+ photos: "Fòtos"
+ posts: "Publicacions"
+ you_have_no_tags: "avètz pas de tag !"
+ publisher:
+ add_option: "Apondre una responsa"
+ markdown_editor:
+ preview: "Apercebut"
+ texts:
+ code: "còdi aicí"
+ heading: "Entèsta"
+ insert_image_description_text: "Entrar una descripcion per l'imatge aicí"
+ insert_image_help_text: "Inserir un ligam cap a un imatge aicí"
+ insert_image_title: "Entrar un intitulat aicí"
+ insert_link_description_text: "Entrar la descripcion del ligam aicí"
+ insert_link_help_text: "Inserir un ligam aicí"
+ italic: "Tèxte en italica"
+ list: "tèxte de lista aicí"
+ quote: "tèxte de citacion aicí"
+ strong: "Enfasi"
+ tooltips:
+ bold: "Gras"
+ cancel: "Anullar lo messatge"
+ code: "Inserir un còdi"
+ heading: "Títol"
+ insert_image: "Inserir un imatge"
+ insert_link: "Inserir un ligam"
+ insert_ordered_list: "Inserir una lista triada"
+ insert_unordered_list: "Inserir una lista de piuses"
+ italic: "Italica"
+ preview: "Apercebut del messatge"
+ quote: "Inserir una citacion"
+ write: "Modificar lo messatge"
+ write: "Escriure"
+ near_from: "Postat a : <%= location %>"
+ option: "Responsa"
+ public: "Public - vòstre messatge serà visible de totes e trobat pels motors de recèrca"
+ question: "Question"
+ remove_post: "Suprimir aqueste messatge ?"
+ report:
+ name: "Senhalar"
+ prompt: "Mercé de sasir un motiu :"
+ prompt_default: "Contengut ofensant"
+ status:
+ created: "Lo senhalament es estat creat amb succès."
+ exists: "Lo senhalament existís ja"
+ reshares:
+ post: "Repartejar lo messatge de <%= name %> ?"
+ successful: "Lo messatge es estat repartejat !"
+ show_more: "N'afichar mai"
+ stream:
+ comment: "Comentari"
+ disable_post_notifications: "Desactivar las notificacions per aqueste messatge"
+ enable_post_notifications: "Activar las notificacions per aqueste messatge"
+ follow: "Seguir"
+ followed_tag:
+ add_a_tag: "Apondre una etiqueta"
+ follow: "Seguir"
+ title: "#tags seguits"
+ hide: "Amagar"
+ hide_nsfw_posts: "Amagar los messatges #nsfw"
+ like: "M'agrada"
+ likes:
+ one: "agrada a <%= count %> persona"
+ other: "agrada a <%= count %> personas"
+ zero: "agrada a <%= count %> persona"
+ limited: "Limitat"
+ more_comments:
+ one: "Afichar <%= count %> comentari suplementari"
+ other: "Afichar <%= count %> comentaris suplementaris"
+ zero: "Afichar <%= count %> comentari suplementari"
+ no_posts_yet: "I a pas cap de messatge a afichar pel moment."
+ original_post_deleted: "Lo messatge original es estat escafat per son autor."
+ permalink: "Permaligam"
+ public: "Public"
+ reactions:
+ one: "<%= count%> reaccion"
+ other: "<%= count%> reaccions"
+ zero: "<%= count%> reaccion"
+ reshare: "Repartejat"
+ reshares:
+ one: "<%= count %> repartiment"
+ other: "<%= count %> repartiments"
+ zero: "<%= count %> repartiment"
+ show_nsfw_post: "Mostrar lo messatge"
+ show_nsfw_posts: "Afichar tot"
+ tags:
+ follow: "Seguir #<%= tag %>"
+ follow_error: "Impossible de seguir <%= tag %> :("
+ following: "Seguiment de #<%= tag %>"
+ stop_following: "Arrestar de seguir <%= tag %>"
+ stop_following_confirm: "Arrestar de seguir <%= tag %> ?"
+ stop_following_error: "Impossible d'arrestar de seguir <%= tag %> :("
+ unfollow: "Seguir pas mai"
+ unlike: "M'agrada pas mai"
+ via: "via <%= provider %>"
+ tags:
+ wasnt_that_interesting: "D'acòrdi, supausi que #<%= tagName %> es pas la sola causa que vos interèssa..."
+ timeago:
+ day: "un jorn"
+ days:
+ one: "1 jorn"
+ other: "%d jorns"
+ hour: "environ una ora"
+ hours:
+ one: "environ 1 ora"
+ other: "environ %d oras"
+ inPast: "lèu lèu"
+ minute: "environ una minuta"
+ minutes:
+ one: "1 minuta"
+ other: "%d minutas"
+ month: "environ un mes"
+ months:
+ one: "1 mes"
+ other: "%d meses"
+ prefixAgo: "i a"
+ prefixFromNow: "d'aicí"
+ seconds: "mens d'una minuta"
+ suffixAgo: ""
+ suffixFromNow: "ara"
+ year: "environ un an"
+ years:
+ one: "1 an"
+ other: "%d ans"
+ unblock_failed: "Impossible de desblocar aqueste utilizaire"
+ viewer:
+ reshared: "Repartejat" \ No newline at end of file
diff --git a/config/locales/javascript/javascript.pl.yml b/config/locales/javascript/javascript.pl.yml
index 1f746a939..77e8edbe2 100644
--- a/config/locales/javascript/javascript.pl.yml
+++ b/config/locales/javascript/javascript.pl.yml
@@ -63,10 +63,8 @@ pl:
create: "Utwórz"
delete: "Usuń"
edit: "Edycja"
- failed_to_like: "Nie udało się pulubić!"
failed_to_post_message: "Nie można wysłać wiadomości!"
failed_to_remove: "Nie udało się usunąć wartości!"
- failed_to_reshare: "Nie udało się przekazać dalej!"
getting_started:
alright_ill_wait: "Dobrze, poczekam."
hey: "Hej, <%= name %>!"
@@ -155,7 +153,6 @@ pl:
created: "Zgłoszenie zostało pomyślnie utworzone"
exists: "Zgłoszenie już istnieje"
reshares:
- duplicate: "Już przekaza@{m:łeś|f:łaś|n:no} dalej ten wpis!"
post: "Przesłać dalej wpis użytkownika <%= name %>?"
successful: "Wpis został pomyślnie przesłany dalej!"
show_more: "wyświetl więcej"
diff --git a/config/locales/javascript/javascript.pt-BR.yml b/config/locales/javascript/javascript.pt-BR.yml
index 824bfd304..0c6a840ec 100644
--- a/config/locales/javascript/javascript.pt-BR.yml
+++ b/config/locales/javascript/javascript.pt-BR.yml
@@ -107,16 +107,17 @@ pt-BR:
remove_contact: "Remover contato"
search_no_results: "Nenhum contato encontrado"
conversation:
+ create:
+ no_recipient: "Ei, primeiro você precisa adicionar um destinatário!"
new:
no_contacts: "Você precisa adicionar contatos antes de começar uma conversa."
create: "Criar"
delete: "Apagar"
edit: "Editar"
- failed_to_comment: "Falha ao comentar. Será que estão ignorando você?"
- failed_to_like: "Falha ao curtir. Será que o autor está ignorando você?"
+ errors:
+ connection: "Não foi possível conectar ao servidor."
failed_to_post_message: "Falha na publicação da mensagem!"
failed_to_remove: "Falha ao remover a entrada!"
- failed_to_reshare: "Falha ao recompartilhar!"
getting_started:
alright_ill_wait: "Tudo bem, vou esperar."
hey: "Ei, <%= name %>!"
@@ -152,6 +153,9 @@ pt-BR:
notifications:
mark_read: "Marcar como lida"
mark_unread: "Marcar como não lida"
+ new_notifications:
+ one: "Você tem <%= count %> notificação não lida"
+ other: "Você tem <%= count %> notificações não lidas"
people:
edit_my_profile: "Editar meu perfil"
helper:
@@ -237,7 +241,6 @@ pt-BR:
created: "O relato foi criado com sucesso"
exists: "O relato já existe"
reshares:
- duplicate: "Que bom, hein? Você já recompartilhou essa publicação!"
post: "Recompartilhar a publicação de <%= name %>?"
successful: "A publicação foi recompartilhada com sucesso!"
show_more: "Mostrar mais"
diff --git a/config/locales/javascript/javascript.pt-PT.yml b/config/locales/javascript/javascript.pt-PT.yml
index cf25549dc..61fa78fcb 100644
--- a/config/locales/javascript/javascript.pt-PT.yml
+++ b/config/locales/javascript/javascript.pt-PT.yml
@@ -31,7 +31,6 @@ pt-PT:
confirm_dialog: "Tem a certeza?"
delete: "Eliminar"
edit: "Editar"
- failed_to_like: "Falhou em gostar!"
failed_to_post_message: "Falhou ao publicar a mensagem!"
getting_started:
alright_ill_wait: "Tudo bem, eu esperarei."
@@ -69,7 +68,6 @@ pt-PT:
near_from: "Publicado em: <%= location %>"
public: "Público - A sua publicação será visível para todos e encontrada por motores de busca"
reshares:
- duplicate: "Que bom, hein? Você já republicou essa mensagem!"
post: "Repartilhar a publicação de <%= name %>?"
successful: "A publicação foi repartilhada com sucesso!"
show_more: "mostrar mais"
diff --git a/config/locales/javascript/javascript.ro.yml b/config/locales/javascript/javascript.ro.yml
index 5737916c4..97357603b 100644
--- a/config/locales/javascript/javascript.ro.yml
+++ b/config/locales/javascript/javascript.ro.yml
@@ -31,7 +31,6 @@ ro:
confirm_dialog: "Sunteţi sigur?"
delete: "Şterge"
edit: "Modifică"
- failed_to_like: "Nu sa reusit operatia de \"imi place\"!"
failed_to_post_message: "Nu sa reusit trimiterea mesajului!"
getting_started:
alright_ill_wait: "In regulă, o să aștept."
@@ -65,8 +64,6 @@ ro:
limited: "Limitat - publicatia va fi vazuta doar de catre persoanele cu care imparti publicatii"
near_from: "Publicat din <%= location %>"
public: "Public - articolul tău va fi vizibil tuturor şi va fi accesibilă prin motoarele de căutare"
- reshares:
- duplicate: "E chiar asa de tare, hmm? Ati mai raspandit o data aceasta publicatie!"
show_more: "arată mai mult"
stream:
comment: "Comentariu"
diff --git a/config/locales/javascript/javascript.ru.yml b/config/locales/javascript/javascript.ru.yml
index 2fd45487a..af924673b 100644
--- a/config/locales/javascript/javascript.ru.yml
+++ b/config/locales/javascript/javascript.ru.yml
@@ -73,10 +73,8 @@ ru:
create: "Создать"
delete: "Удалить"
edit: "Изменить"
- failed_to_like: "Не удалось!"
failed_to_post_message: "Не удалось отправить сообщение!"
failed_to_remove: "Удаление не завершено!"
- failed_to_reshare: "Не удалось поделиться!"
getting_started:
alright_ill_wait: "Хорошо, я подожду."
hey: "Привет, <%= name %>!"
@@ -193,7 +191,6 @@ ru:
created: "Донос успешно отправлен"
exists: "Донос уже отправлен"
reshares:
- duplicate: "Здорово, да? Вы уже поделились этой записью!"
post: "Поделиться записью пользователя <%= name %>?"
successful: "Вы успешно поделились записью!"
show_more: "показать больше"
diff --git a/config/locales/javascript/javascript.sk.yml b/config/locales/javascript/javascript.sk.yml
index 1bf7feea8..cb66d1313 100644
--- a/config/locales/javascript/javascript.sk.yml
+++ b/config/locales/javascript/javascript.sk.yml
@@ -37,7 +37,6 @@ sk:
confirm_dialog: "Určite?"
delete: "Odstrániť"
edit: "Upraviť"
- failed_to_like: "Nepodarilo sa označiť, že sa ti to páči!"
failed_to_post_message: "Správu sa nepodarilo poslať!"
getting_started:
alright_ill_wait: "V poriadku, počkám."
@@ -99,7 +98,6 @@ sk:
created: "Úspešne si vytvoril(a) správu"
exists: "Správa už existuje"
reshares:
- duplicate: "Je to dobré, čo? O tento príspevok si sa už raz znova podelil(a)!"
post: "Znova ukázať priateľom príspevok, ktorý napísal(a) <%= name %>?"
successful: "Tento príspevok si úspešne znova ukázal(a) priateľom!"
show_more: "Zobraziť viac"
diff --git a/config/locales/javascript/javascript.sl.yml b/config/locales/javascript/javascript.sl.yml
index 00e783156..74ede6004 100644
--- a/config/locales/javascript/javascript.sl.yml
+++ b/config/locales/javascript/javascript.sl.yml
@@ -28,7 +28,6 @@ sl:
show: "prikaži vse komentarje"
confirm_dialog: "Ste prepričani"
delete: "Izbriši"
- failed_to_like: "Označevanje ni uspelo!"
failed_to_post_message: "Objava ni uspela!"
getting_started:
alright_ill_wait: "V redu, bom počakal."
@@ -59,7 +58,6 @@ sl:
limited: "Omejeno - Vaša objava bo vidna le ljudem, s katerimi delite"
public: "Javno - Vaša objava bo vidna vsem, prikazana bo tudi v spletnih iskalnikih"
reshares:
- duplicate: "To objavo ste že ponovno delili"
post: "Ponovno deli objavo osebe <%= name %>?"
successful: "Objavo ste uspešno ponovno delili!"
show_more: "pokaži več"
diff --git a/config/locales/javascript/javascript.sr.yml b/config/locales/javascript/javascript.sr.yml
index d4ff3fb71..f6a9aa96c 100644
--- a/config/locales/javascript/javascript.sr.yml
+++ b/config/locales/javascript/javascript.sr.yml
@@ -28,7 +28,6 @@ sr:
show: "прикажи све коментаре"
confirm_dialog: "Јесте ли сигурни?"
delete: "Уклони"
- failed_to_like: "Свиђање није успело!"
failed_to_post_message: "Слање поруке није успело!"
getting_started:
alright_ill_wait: "Важи, сачекаћу."
@@ -55,8 +54,6 @@ sr:
publisher:
limited: "Ограничено - твоју објаву ће видети само људи са којима је делиш"
public: "Јавно - твоју објаву ће видети сви и биће је могуће тражити путем претраживача"
- reshares:
- duplicate: "Добро је, а? Већ сте објавили ово!"
show_more: "прикажи још"
stream:
comment: "Коментариши"
diff --git a/config/locales/javascript/javascript.sv.yml b/config/locales/javascript/javascript.sv.yml
index 47aa80569..ea420eeae 100644
--- a/config/locales/javascript/javascript.sv.yml
+++ b/config/locales/javascript/javascript.sv.yml
@@ -68,12 +68,8 @@ sv:
started_sharing_with: "Du har börjat dela med <%= name %>!"
stopped_sharing_with: "Du har slutat dela med <%= name %>."
toggle:
- few: "I <%= count %> aspekter"
- many: "I <%= count %> aspekter"
one: "I <%= count %> aspekt"
other: "I <%= count %> aspekter"
- two: "I <%= count %> aspekter"
- zero: "Välj aspekter"
updating: "uppdaterar..."
aspect_navigation:
add_an_aspect: "+ Lägg till en aspekt"
@@ -110,16 +106,17 @@ sv:
remove_contact: "Ta bort kontakt"
search_no_results: "Inga kontakter hittade"
conversation:
+ create:
+ no_recipient: "Hörru! Du måste lägga till en mottagare först."
new:
no_contacts: "Du behöver några kontakter innan du kan påbörja konversationer."
create: "Skapa"
delete: "Radera"
edit: "Ändra"
- failed_to_comment: "Lyckades inte kommentera. Författaren kanske ignorerar dig."
- failed_to_like: "Misslyckades att gilla. Kanske är du inte önskvärd av författaren."
+ errors:
+ connection: "Kunde inte ansluta till servern."
failed_to_post_message: "Misslyckades att posta meddelande!"
failed_to_remove: "Misslyckades med att borttaga inlägget!"
- failed_to_reshare: "Kunde inte dela vidare!"
getting_started:
alright_ill_wait: "Okej, jag väntar."
hey: "Hej, <%= name %>!"
@@ -155,6 +152,10 @@ sv:
notifications:
mark_read: "Lästmärk"
mark_unread: "Olästmarkera"
+ new_notifications:
+ one: "Du har en oläst notifikation"
+ other: "Du har <%= count %> olästa notifikationer"
+ zero: "Du har inga olästa notifikationer"
people:
edit_my_profile: "Ändra min profil"
helper:
@@ -199,6 +200,34 @@ sv:
publisher:
add_option: "Lägg till alternativ"
limited: "Begränsat: ditt inlägg visas endast för personer som du delar med"
+ markdown_editor:
+ preview: "Förhandsgranska"
+ texts:
+ code: "kod här"
+ heading: "rubriktext"
+ insert_image_description_text: "fyll i bildbeskrivning här"
+ insert_image_help_text: "Fyll i bildlänk här"
+ insert_image_title: "fyll i bildrubrik här"
+ insert_link_description_text: "fyll i länkbeskrivning här"
+ insert_link_help_text: "Fyll i länk här"
+ italic: "kursiv text"
+ list: "lista text här"
+ quote: "citerad text här"
+ strong: "fet text"
+ tooltips:
+ bold: "Fet"
+ cancel: "Avbryt meddelande"
+ code: "Infoga kod"
+ heading: "Rubrik"
+ insert_image: "Infoga bild"
+ insert_link: "Infoga länk"
+ insert_ordered_list: "Lägg till sorterad lista"
+ insert_unordered_list: "Lägg till osorterad lista"
+ italic: "Kursiv"
+ preview: "Förhandsgranska meddelande"
+ quote: "Infoga citat"
+ write: "Ändra meddelande"
+ write: "Skriv"
near_from: "Sänt från: <%= location %>"
option: "Alternativ"
public: "Publikt: ditt inlägg visas för alla och i söktjänster"
@@ -212,7 +241,6 @@ sv:
created: "Anmälan skapad"
exists: "Anmälan finns redan"
reshares:
- duplicate: "Du gillar detta va? Du har nämligen redan delat vidare detta inlägg!"
post: "Vill du dela vidare inlägget av <%= name %>?"
successful: "Lyckades med att dela vidare inlägget."
show_more: "Visa mer"
@@ -237,6 +265,7 @@ sv:
one: "Visa en kommentar till"
other: "Visa <%= count %> kommentarer till"
zero: "Visa inga fler kommentarer"
+ no_posts_yet: "Det finns inga inlägg än."
original_post_deleted: "Det ursprungliga inlägget har blivit borttaget av författaren."
permalink: "Permanent länk"
public: "Publik"
@@ -266,16 +295,20 @@ sv:
timeago:
day: "en dag"
days:
+ one: "1 dag"
other: "%d dagar"
hour: "ungefär en timme"
hours:
+ one: "ungefär 1 timme"
other: "ungefär %d timmar"
inPast: "när som helst nu"
minute: "ungefär en minut"
minutes:
+ one: "1 minut"
other: "%d minuter"
month: "ungefär en månad"
months:
+ one: "1 månad"
other: "%d månader"
prefixAgo: "för"
prefixFromNow: "om"
@@ -285,6 +318,7 @@ sv:
wordSeparator: " "
year: "ungefär ett år"
years:
+ one: "1 år"
other: "%d år"
unblock_failed: "Misslyckades med att häva blockeringen"
viewer:
diff --git a/config/locales/javascript/javascript.te.yml b/config/locales/javascript/javascript.te.yml
index 5c38cdfce..fe23b3881 100644
--- a/config/locales/javascript/javascript.te.yml
+++ b/config/locales/javascript/javascript.te.yml
@@ -50,10 +50,8 @@ te:
create: "సృష్టించు"
delete: "తొలగించు"
edit: "సవరించు"
- failed_to_like: "ఇష్టపడుటలో విఫలమైంది!"
failed_to_post_message: "సందేశాన్ని పోస్టుచేయుటలో విఫలమైంది!"
failed_to_remove: "ప్రవేశాన్ని తొలగించుటలో విఫలమైంది!"
- failed_to_reshare: "మళ్ళీ పంచుకోవడంలో విఫలమైంది!"
getting_started:
alright_ill_wait: "పరవాలేదు, నేను వేచివుంటాను."
hey: "ఓయ్, <%= name %>!"
@@ -130,8 +128,6 @@ te:
status:
created: "ఫిర్యాదు విజయవంతంగా సృష్టించబడింది"
exists: "ఫిర్యాదు ఇదివరకే ఉంది"
- reshares:
- duplicate: "అంత బాగుందా? ఆ టపాని మీరు ఇప్పటికే పంచుకున్నారు!"
show_more: "ఇంకా చూపించు"
stream:
comment: "వ్యాఖ్య"
@@ -169,16 +165,20 @@ te:
timeago:
day: "ఒక రోజు"
days:
- other: "%d రోజుల"
+ one: "1 రోజు"
+ other: "%d రోజులు"
hour: "దాదాపు గంట"
hours:
- other: "దాదాపు %d గంటల"
+ one: "దాదాపు 1 గంట"
+ other: "దాదాపు %d గంటలు"
minute: "దాదాపు నిమిషం"
minutes:
- other: "%d నిమిషాల"
+ one: "1 నిమిషం"
+ other: "%d నిమిషాలు"
month: "దాదాపు నెల"
months:
- other: "%d నెలల"
+ one: "1 నెల"
+ other: "%d నెలలు"
prefixAgo: " "
prefixFromNow: ""
seconds: "కొన్ని క్షణాల"
@@ -186,4 +186,5 @@ te:
suffixFromNow: "ఇప్పటి నుండి"
year: "దాదాపు సంవత్సరం"
years:
- other: "%d సంవత్సరాల" \ No newline at end of file
+ one: "1 సంవత్సరం"
+ other: "%d సంవత్సరాలు" \ No newline at end of file
diff --git a/config/locales/javascript/javascript.tr.yml b/config/locales/javascript/javascript.tr.yml
index a0756bd68..097c138a2 100644
--- a/config/locales/javascript/javascript.tr.yml
+++ b/config/locales/javascript/javascript.tr.yml
@@ -25,7 +25,6 @@ tr:
show: "tüm yorumları görüntüle"
confirm_dialog: "Emin misiniz?"
delete: "Sil"
- failed_to_like: "Beğenme başarısız oldu!"
failed_to_post_message: "Gönderi başarısız oldu!"
getting_started:
alright_ill_wait: "Tamam, ben bekleyeceğim."
@@ -85,7 +84,6 @@ tr:
write: "yazma"
public: "Genel - gönderi herkes tarafından görünür ve arama motorları tarafından bulunur olacak"
reshares:
- duplicate: "Bu iyi, değil mi? Zaten bu gönderiyi tekrar paylaştın!"
post: "<%= name %> kişisinin gönderisini yeniden paylaşamak istiyor musun?"
successful: "Gönderi başarıyla yeniden paylaşıldı!"
show_more: "daha fazlasını göster"
diff --git a/config/locales/javascript/javascript.uk.yml b/config/locales/javascript/javascript.uk.yml
index 93ddca011..98f72502e 100644
--- a/config/locales/javascript/javascript.uk.yml
+++ b/config/locales/javascript/javascript.uk.yml
@@ -53,10 +53,8 @@ uk:
no_contacts: "Перш ніж розпочати розмову, треба мати хоча б один контакт."
delete: "Вилучити"
edit: "Змінити"
- failed_to_like: "Не вдалося!"
failed_to_post_message: "Не вдалося надіслати повідомлення!"
failed_to_remove: "Видалення не завершено!"
- failed_to_reshare: "Не вдалося поділитись!"
getting_started:
alright_ill_wait: "Добре, я почекаю."
hey: "Привіт, <%= name %>!"
@@ -143,7 +141,6 @@ uk:
created: "Донос успішно відправлений"
exists: "Донос вже відправлений"
reshares:
- duplicate: "Настільки круто, так? Ви вже поділилися цим записом!"
post: "Поширити допис <%= name %>?"
successful: "Ви успішно поділилися записом!"
show_more: "показати більше"
diff --git a/config/locales/javascript/javascript.vi.yml b/config/locales/javascript/javascript.vi.yml
index 3ce23e061..3813bf02c 100644
--- a/config/locales/javascript/javascript.vi.yml
+++ b/config/locales/javascript/javascript.vi.yml
@@ -30,7 +30,6 @@ vi:
confirm_dialog: "Bạn có chắc không?"
delete: "Xoá"
edit: "Chỉnh sửa"
- failed_to_like: "Không thích được!"
failed_to_post_message: "Đăng tin thất bại!"
getting_started:
alright_ill_wait: "Được rồi, tôi sẽ chờ."
@@ -68,7 +67,6 @@ vi:
near_from: "Gửi từ: <%= location %>"
public: "Công khai - bài đăng của bạn được mọi người và máy tìm kiếm nhìn thấy"
reshares:
- duplicate: "Bạn đã chia sẻ lại tin đó!"
post: "Chia sẻ lại bài đăng của <%= name %>?"
successful: "Đã chia sẻ lại bài đăng!"
show_more: "hiện thêm"
diff --git a/config/locales/javascript/javascript.zh-CN.yml b/config/locales/javascript/javascript.zh-CN.yml
index 46bca1ae5..47ff47727 100644
--- a/config/locales/javascript/javascript.zh-CN.yml
+++ b/config/locales/javascript/javascript.zh-CN.yml
@@ -25,7 +25,6 @@ zh-CN:
show: "显示所有评论"
confirm_dialog: "您确定吗?"
delete: "删除"
- failed_to_like: "赞失败"
failed_to_post_message: "发布消息失败!"
getting_started:
alright_ill_wait: "以后再说"
@@ -57,7 +56,6 @@ zh-CN:
limited: "限制 - 只有您想分享的人才看得到您的内容"
public: "公开 - 所有人都能看到您的内容,包括搜索引擎"
reshares:
- duplicate: "您已经转发过了。"
post: "要转发 <%= name %> 的内容吗?"
successful: "转发成功"
show_more: "查看更多"
diff --git a/config/locales/javascript/javascript.zh-TW.yml b/config/locales/javascript/javascript.zh-TW.yml
index a5665a620..6df1cfe44 100644
--- a/config/locales/javascript/javascript.zh-TW.yml
+++ b/config/locales/javascript/javascript.zh-TW.yml
@@ -101,16 +101,17 @@ zh-TW:
remove_contact: "刪聯絡人"
search_no_results: "沒找到聯絡人"
conversation:
+ create:
+ no_recipient: "欸,必須要有收訊人 !"
new:
no_contacts: "\x1f開始對話前你必須先加一些聯絡人"
create: "建立"
delete: "刪除"
edit: "編輯"
- failed_to_comment: "發表意見失敗。作者可能正在忽視你。"
- failed_to_like: "說讚失敗。也許是因為作者正在忽視你。"
+ errors:
+ connection: "沒辦法跟伺服器連線。"
failed_to_post_message: "貼文失敗!"
failed_to_remove: "刪掉這個項目的動作失敗了!"
- failed_to_reshare: "轉貼失敗!"
getting_started:
alright_ill_wait: "好,再說吧。"
hey: "嗨,<%= name %>!"
@@ -146,6 +147,8 @@ zh-TW:
notifications:
mark_read: "標示為看過了"
mark_unread: "標示為沒看過"
+ new_notifications:
+ other: "有<%= count %>則還沒看過的通知"
people:
edit_my_profile: "編輯自己的個人檔案"
helper:
@@ -229,7 +232,6 @@ zh-TW:
created: "成功產生回報了"
exists: "已經有這筆回報了"
reshares:
- duplicate: "很棒對吧?你已經轉貼過該篇貼文了!"
post: "要轉貼 <%= name %> 的貼文嗎?"
successful: "貼文轉貼成功!"
show_more: "顯示更多"
diff --git a/config/routes.rb b/config/routes.rb
index 4e7b9d498..288733244 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -38,6 +38,7 @@ Diaspora::Application.routes.draw do
resources :poll_participations, only: :create
resources :likes, only: %i(create destroy index)
resources :comments, only: %i(new create destroy index)
+ resources :reshares, only: :index
end
get 'p/:id' => 'posts#show', :as => 'short_post'
@@ -101,11 +102,11 @@ Diaspora::Application.routes.draw do
resource :user, only: %i(edit destroy), shallow: true do
put :edit, action: :update
- get :getting_started_completed
post :export_profile
get :download_profile
post :export_photos
get :download_photos
+ post :auth_token
end
controller :users do
@@ -184,12 +185,6 @@ Diaspora::Application.routes.draw do
end
end
- namespace :api do
- namespace :v1 do
- resources :tokens, :only => [:create, :destroy]
- end
- end
-
get 'community_spotlight' => "contacts#spotlight", :as => 'community_spotlight'
# Mobile site
diff --git a/config/schedule.yml b/config/schedule.yml
index 5ba7e5cd6..0d179a75b 100644
--- a/config/schedule.yml
+++ b/config/schedule.yml
@@ -9,3 +9,7 @@ queue_users_for_removal:
recurring_pod_check:
cron: "0 0 * * *"
class: "Workers::RecurringPodCheck"
+
+recheck_scheduled_pods:
+ cron: "*/30 * * * *"
+ class: "Workers::RecheckScheduledPods"
diff --git a/config/unicorn.rb b/config/unicorn.rb
index 3877630cf..078797201 100644
--- a/config/unicorn.rb
+++ b/config/unicorn.rb
@@ -4,7 +4,7 @@ port = ENV["PORT"]
port = port && !port.empty? ? port.to_i : nil
listen port || AppConfig.server.listen.get unless RACKUP[:set_listener]
-pid AppConfig.server.pid.get if AppConfig.server.pid?
+pid AppConfig.server.pid.get
worker_processes AppConfig.server.unicorn_worker.to_i
timeout AppConfig.server.unicorn_timeout.to_i
stderr_path AppConfig.server.stderr_log.get if AppConfig.server.stderr_log?
@@ -26,11 +26,25 @@ before_fork do |_server, _worker|
end
end
-after_fork do |_server, _worker|
+after_fork do |server, worker|
Logging.reopen # reopen logfiles to obtain a new file descriptor
ActiveRecord::Base.establish_connection # preloading app in master, so reconnect to DB
# We don't generate uuids in the frontend, but let's be on the safe side
UUID.generator.next_sequence
+
+ # Check for an old master process from a graceful restart
+ old_pid = "#{AppConfig.server.pid.get}.oldbin"
+
+ if File.exist?(old_pid) && server.pid != old_pid
+ begin
+ # Remove a worker from the old master when we fork a new one (TTOU)
+ # Except for the last worker forked by this server, which kills the old master (QUIT)
+ signal = (worker.nr + 1) >= server.worker_processes ? :QUIT : :TTOU
+ Process.kill(signal, File.read(old_pid).to_i)
+ rescue Errno::ENOENT, Errno::ESRCH
+ # someone else did our job for us
+ end
+ end
end
diff --git a/db/migrate/20161024231443_add_scheduled_check_to_pod.rb b/db/migrate/20161024231443_add_scheduled_check_to_pod.rb
new file mode 100644
index 000000000..6d18ba228
--- /dev/null
+++ b/db/migrate/20161024231443_add_scheduled_check_to_pod.rb
@@ -0,0 +1,5 @@
+class AddScheduledCheckToPod < ActiveRecord::Migration
+ def change
+ add_column :pods, :scheduled_check, :boolean, default: false, null: false
+ end
+end
diff --git a/db/schema.rb b/db/schema.rb
index c8f63ceb5..402f53db2 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -11,7 +11,7 @@
#
# It's strongly recommended that you check this file into your version control system.
-ActiveRecord::Schema.define(version: 20161015174300) do
+ActiveRecord::Schema.define(version: 20161024231443) do
create_table "account_deletions", force: :cascade do |t|
t.string "diaspora_handle", limit: 255
@@ -358,18 +358,19 @@ ActiveRecord::Schema.define(version: 20161015174300) do
add_index "photos", ["status_message_guid"], name: "index_photos_on_status_message_guid", length: {"status_message_guid"=>191}, using: :btree
create_table "pods", force: :cascade do |t|
- t.string "host", limit: 255, null: false
+ t.string "host", limit: 255, null: false
t.boolean "ssl"
- t.datetime "created_at", null: false
- t.datetime "updated_at", null: false
- t.integer "status", limit: 4, default: 0
- t.datetime "checked_at", default: '1970-01-01 00:00:00'
+ t.datetime "created_at", null: false
+ t.datetime "updated_at", null: false
+ t.integer "status", limit: 4, default: 0
+ t.datetime "checked_at", default: '1970-01-01 00:00:00'
t.datetime "offline_since"
- t.integer "response_time", limit: 4, default: -1
- t.string "software", limit: 255
- t.string "error", limit: 255
- t.integer "port", limit: 4
- t.boolean "blocked", default: false
+ t.integer "response_time", limit: 4, default: -1
+ t.string "software", limit: 255
+ t.string "error", limit: 255
+ t.integer "port", limit: 4
+ t.boolean "blocked", default: false
+ t.boolean "scheduled_check", default: false, null: false
end
add_index "pods", ["checked_at"], name: "index_pods_on_checked_at", using: :btree
diff --git a/features/desktop/comments.feature b/features/desktop/comments.feature
index 3b9fb1aa2..0ef2ca6c8 100644
--- a/features/desktop/comments.feature
+++ b/features/desktop/comments.feature
@@ -73,3 +73,16 @@ Feature: commenting
When I follow "less than a minute ago" within ".comments .comment:last-child"
Then I should see "I think that’s a cat" within ".comments .comment .highlighted"
And I should have scrolled down
+
+ Scenario: Show more comments after loading likes
+ When "alice@alice.alice" has commented a lot on "Look at this dog"
+ And "alice@alice.alice" has liked the post "Look at this dog"
+ And I am on "alice@alice.alice"'s page
+ Then I should see "Look at this dog"
+ And I should not see "Comment 2"
+
+ When I follow "1 Like"
+ Then I should not see "1 Like"
+
+ When I click on selector ".toggle_post_comments"
+ Then I should see "Comment 2"
diff --git a/features/desktop/help.feature b/features/desktop/help.feature
new file mode 100644
index 000000000..cd44eec9d
--- /dev/null
+++ b/features/desktop/help.feature
@@ -0,0 +1,8 @@
+@javascript
+Feature: Getting help
+
+ Scenario: Visit help page
+ When I am on the help page
+ Then I should see "diaspora* FAQ"
+ When I follow "Mentions"
+ Then I should see "What is a “mention”?" within ".faq_question_mentions .question"
diff --git a/features/desktop/invitations.feature b/features/desktop/invitations.feature
index 5aafd11df..0e9e09a61 100644
--- a/features/desktop/invitations.feature
+++ b/features/desktop/invitations.feature
@@ -39,7 +39,7 @@ Feature: Invitations
And I click on selector "#invitations-button"
Then I should see one less invite
- Scenario: sends an invitation
+ Scenario: sends an invitation from the sidebar
When I sign in as "alice@alice.alice"
And I click on "Invite your friends" navbar title
And I click on selector "#invitations-button"
@@ -49,6 +49,15 @@ Feature: Invitations
Then I should have 1 Devise email delivery
And I should not see "change your notification settings" in the last sent email
+ Scenario: sends an invitation from the stream
+ When I sign in as "alice@alice.alice"
+ And I press the first "a.invitations-link" within "#no_contacts"
+ And I fill in the following:
+ | email_inviter_emails | alex@example.com |
+ And I press "Send an invitation"
+ Then I should have 1 Devise email delivery
+ And I should not see "change your notification settings" in the last sent email
+
Scenario: sends an invitation from the people search page
When I sign in as "alice@alice.alice"
And I search for "test"
diff --git a/features/desktop/manages_aspects.feature b/features/desktop/manages_aspects.feature
index 30770b668..2cc05e46e 100644
--- a/features/desktop/manages_aspects.feature
+++ b/features/desktop/manages_aspects.feature
@@ -61,20 +61,6 @@ Feature: User manages contacts
And I press "Update"
Then I should see "Unicorn People" within "#aspect_name"
- Scenario: clicking on the contacts link in the header with zero contacts directs a user to the featured users page
- Given I am signed in
- And I have 0 contacts
- And I click on my name in the header
- When I follow "Contacts"
- Then I should see "Community spotlight" within ".col-md-9"
-
- Scenario: clicking on the contacts link in the header with contacts does not send a user to the featured users page
- Given I am signed in
- And I have 2 contacts
- And I click on my name in the header
- When I follow "Contacts"
- Then I should not see "Community spotlight" within ".col-md-9"
-
Scenario: sorting the aspects
Given I am signed in
And I have an aspect called "People"
diff --git a/features/desktop/notifications.feature b/features/desktop/notifications.feature
index 70a454d61..2dd5eaee4 100644
--- a/features/desktop/notifications.feature
+++ b/features/desktop/notifications.feature
@@ -112,7 +112,7 @@ Feature: Notifications
When I filter notifications by mentions
Then I should see "mentioned you in the post"
- Scenario: show aspect dropdown in user hovercard
+ Scenario: show hovercard in notification dropdown from the profile edit page
When I sign in as "bob@bob.bob"
And I am on "alice@alice.alice"'s page
And I add the person to my "Besties" aspect
@@ -120,11 +120,13 @@ Feature: Notifications
When I sign in as "alice@alice.alice"
And I go to the edit profile page
And I follow "Notifications" in the header
- And I activate the first hovercard after loading the notifications page
- When I press the aspect dropdown
+ Then the notification dropdown should be visible
+ When I wait for notifications to load
+ And I activate the first hovercard in the notification dropdown
+ And I press the aspect dropdown
Then the aspect dropdown should be visible
- Scenario: show hovercard in notification dropdown
+ Scenario: show hovercard in notification dropdown from the stream
When I sign in as "bob@bob.bob"
And I am on "alice@alice.alice"'s page
And I add the person to my "Besties" aspect
@@ -132,7 +134,8 @@ Feature: Notifications
When I sign in as "alice@alice.alice"
And I follow "Notifications" in the header
Then the notification dropdown should be visible
- When I activate the first hovercard after loading the notifications page
+ When I wait for notifications to load
+ And I activate the first hovercard in the notification dropdown
And I press the aspect dropdown
Then the aspect dropdown should be visible
@@ -151,8 +154,9 @@ Feature: Notifications
And I follow "Notifications" in the header
Then the notification dropdown should be visible
Then the notification dropdown scrollbar should be visible
+ When I wait for notifications to load
Then there should be 10 notifications loaded
When I scroll down on the notifications dropdown
- Then I should have scrolled down on the notification dropdown
- And I wait for notifications to load
+ Then the notification dropdown should load more notifications
+ When I wait for notifications to load
Then there should be 15 notifications loaded
diff --git a/features/desktop/reshare.feature b/features/desktop/reshare.feature
index 9c56da684..6afe52fb0 100644
--- a/features/desktop/reshare.feature
+++ b/features/desktop/reshare.feature
@@ -42,11 +42,25 @@ Feature: public repost
And I sign in as "bob@bob.bob"
Then I should see "Original post deleted by author" within ".reshare"
- # should be covered in rspec, so testing that the post is added to
- # app.stream in jasmine should be enough coverage
- Scenario: When I reshare, it shows up on my profile page
- Given I sign in as "alice@alice.alice"
- And I confirm the alert after I follow "Reshare"
+ Scenario: Reshare a post from the stream
+ When I sign in as "alice@alice.alice"
+ Then I should see a ".reshare" within ".feedback"
+ When I confirm the alert after I follow "Reshare"
+ Then I should see a flash message indicating success
+ And I should see a flash message containing "successfully"
+ And I should not see a ".reshare" within ".feedback"
+
+ Scenario: Reshare a post from another user's profile
+ When I sign in as "alice@alice.alice"
+ And I am on "bob@bob.bob"'s page
+ Then I should see a ".reshare" within ".feedback"
+ When I confirm the alert after I follow "Reshare"
Then I should see a flash message indicating success
And I should see a flash message containing "successfully"
And I should not see a ".reshare" within ".feedback"
+
+ Scenario: Try to reshare an already reshared post from another user's profile
+ Given the post with text "reshare this!" is reshared by "alice@alice.alice"
+ When I sign in as "alice@alice.alice"
+ And I am on "bob@bob.bob"'s page
+ Then I should not see a ".reshare" within ".feedback"
diff --git a/features/step_definitions/aspects_steps.rb b/features/step_definitions/aspects_steps.rb
index bcfa6b37c..8881cd946 100644
--- a/features/step_definitions/aspects_steps.rb
+++ b/features/step_definitions/aspects_steps.rb
@@ -21,7 +21,7 @@ module AspectCukeHelpers
aspect = find(".aspect_membership_dropdown.open .dropdown-menu li", text: aspect_name)
aspect_selected = aspect["class"].include? "selected"
aspect.trigger "click"
- aspect.parent.should have_no_css(".loading")
+ expect(find(".aspect_membership_dropdown .dropdown-menu", visible: false)).to have_no_css(".loading")
# close dropdown
page.should have_no_css('#profile.loading')
diff --git a/features/step_definitions/conversations_steps.rb b/features/step_definitions/conversations_steps.rb
index 1e7bace8b..ea076b30e 100644
--- a/features/step_definitions/conversations_steps.rb
+++ b/features/step_definitions/conversations_steps.rb
@@ -15,8 +15,8 @@ end
Then /^I send a message with subject "([^"]*)" and text "([^"]*)" to "([^"]*)"$/ do |subject, text, person|
step %(I am on the conversations page)
within("#new-conversation", match: :first) do
- step %(I fill in "contact_autocomplete" with "#{person}")
- step %(I press the first ".as-result-item" within ".as-results")
+ find("#contacts-search-input").native.send_key(person.to_s)
+ step %(I press the first ".tt-suggestion" within ".twitter-typeahead")
step %(I fill in "conversation-subject" with "#{subject}")
step %(I fill in "new-message-text" with "#{text}")
step %(I press "Send")
@@ -26,8 +26,8 @@ end
Then /^I send a message with subject "([^"]*)" and text "([^"]*)" to "([^"]*)" using keyboard shortcuts$/ do |subject, text, person|
step %(I am on the conversations page)
within("#new-conversation", match: :first) do
- step %(I fill in "contact_autocomplete" with "#{person}")
- step %(I press the first ".as-result-item" within ".as-results")
+ find("#contacts-search-input").native.send_key(person.to_s)
+ step %(I press the first ".tt-suggestion" within ".twitter-typeahead")
step %(I fill in "conversation-subject" with "#{subject}")
step %(I fill in "new-message-text" with "#{text}")
find("#new-message-text").native.send_key %i(Ctrl Return)
diff --git a/features/step_definitions/custom_web_steps.rb b/features/step_definitions/custom_web_steps.rb
index 97a8e1035..a84f2d337 100644
--- a/features/step_definitions/custom_web_steps.rb
+++ b/features/step_definitions/custom_web_steps.rb
@@ -210,36 +210,11 @@ end
And /^I scroll down$/ do
page.execute_script("window.scrollBy(0,3000000)")
end
-And /^I scroll down on the notifications dropdown$/ do
- page.execute_script("$('.notifications').scrollTop(350)")
-end
Then /^I should have scrolled down$/ do
expect(page.evaluate_script("window.pageYOffset")).to be > 0
end
-Then /^I should have scrolled down on the notification dropdown$/ do
- expect(page.evaluate_script("$('.notifications').scrollTop()")).to be > 0
-end
-
-
-Then /^the notification dropdown should be visible$/ do
- expect(find(:css, "#notification-dropdown")).to be_visible
-end
-
-Then /^the notification dropdown scrollbar should be visible$/ do
- find(:css, ".ps-active-y").should be_visible
-end
-
-Then /^there should be (\d+) notifications loaded$/ do |n|
- result = page.evaluate_script("$('.media.stream-element').length")
- result.should == n.to_i
-end
-
-And "I wait for notifications to load" do
- page.should_not have_selector(".loading")
-end
-
When /^I resize my window to 800x600$/ do
page.driver.resize(800, 600)
end
@@ -321,8 +296,3 @@ end
Then(/^I should have a validation error on "(.*?)"$/) do |field_list|
check_fields_validation_error field_list
end
-
-And /^I activate the first hovercard after loading the notifications page$/ do
- page.should have_css '.notifications .hovercardable'
- first('.notifications .hovercardable').hover
-end
diff --git a/features/step_definitions/like_steps.rb b/features/step_definitions/like_steps.rb
new file mode 100644
index 000000000..e0670e7c8
--- /dev/null
+++ b/features/step_definitions/like_steps.rb
@@ -0,0 +1,5 @@
+Given /^"([^"]*)" has liked the post "([^"]*)"$/ do |email, post_text|
+ user = User.find_by(email: email)
+ post = StatusMessage.find_by(text: post_text)
+ user.like!(post)
+end
diff --git a/features/step_definitions/notifications_steps.rb b/features/step_definitions/notifications_steps.rb
index c7852edce..87c27ceff 100644
--- a/features/step_definitions/notifications_steps.rb
+++ b/features/step_definitions/notifications_steps.rb
@@ -1,8 +1,8 @@
-When /^I filter notifications by likes$/ do
+When "I filter notifications by likes" do
step %(I follow "Liked" within "#notifications_container .list-group")
end
-When /^I filter notifications by mentions$/ do
+When "I filter notifications by mentions" do
step %(I follow "Mentioned" within "#notifications_container .list-group")
end
@@ -16,3 +16,32 @@ Then /^I should( not)? have activated notifications for the post( in the single
expect(find(selector, match: :first)).to have_no_css(".create_participation", visible: false)
end
end
+
+And "I wait for notifications to load" do
+ expect(find("#notification-dropdown")).to have_no_css(".loading")
+end
+
+And "I scroll down on the notifications dropdown" do
+ page.execute_script("$('.notifications').scrollTop(350)")
+end
+
+Then "the notification dropdown should load more notifications" do
+ expect(find("#notification-dropdown")).to have_css(".loading")
+end
+
+Then "the notification dropdown should be visible" do
+ expect(find(:css, "#notification-dropdown")).to be_visible
+end
+
+Then "the notification dropdown scrollbar should be visible" do
+ expect(find(:css, ".ps-active-y")).to be_visible
+end
+
+Then /^there should be (\d+) notifications loaded$/ do |n|
+ expect(page).to have_css("#notification-dropdown .media.stream-element", count: n)
+end
+
+When "I activate the first hovercard in the notification dropdown" do
+ expect(page).to have_css("#notification-dropdown .hovercardable")
+ first("#notification-dropdown .hovercardable").hover
+end
diff --git a/lib/direction_detector.rb b/lib/direction_detector.rb
index 9724c80c8..c7ffd055a 100644
--- a/lib/direction_detector.rb
+++ b/lib/direction_detector.rb
@@ -2,36 +2,16 @@
# Copyright (c) 2010-2011, Diaspora Inc. This file is
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-# Deeply inspired by https://gitorious.org/statusnet/mainline/blobs/master/plugins/DirectionDetector/DirectionDetectorPlugin.php
class String
- RTL_RANGES = [
- [1536, 1791], # arabic, persian, urdu, kurdish, ...
- [65136, 65279], # arabic peresent 2
- [64336, 65023], # arabic peresent 1
- [1424, 1535], # hebrew
- [64256, 64335], # hebrew peresent
- [1792, 1871], # syriac
- [1920, 1983], # thaana
- [1984, 2047], # nko
- [11568, 11647] # tifinagh
- ]
RTL_CLEANER_REGEXES = [ /@[^ ]+|#[^ ]+/u, # mention, tag
/^RT[: ]{1}| RT | RT: |[♺♻:]/u # retweet
]
def is_rtl?
return false if self.strip.empty?
- count = 0
- self.split(" ").each do |word|
- if starts_with_rtl_char?(word)
- count += 1
- else
- count -= 1
- end
- end
- return true if count > 0 # more than half of the words are rtl words
- return starts_with_rtl_char?(self) # otherwise let the first word decide
+ detector = StringDirection::Detector.new(:dominant)
+ detector.rtl? self
end
# Diaspora specific
@@ -42,14 +22,4 @@ class String
end
string.is_rtl?
end
-
- def starts_with_rtl_char?(string = self)
- stripped = string.strip
- return false if stripped.empty?
- char = stripped.unpack('U*').first
- RTL_RANGES.each do |limit|
- return true if char >= limit[0] && char <= limit[1]
- end
- return false
- end
end
diff --git a/lib/stream/aspect.rb b/lib/stream/aspect.rb
index bdfe6c084..0891ebde1 100644
--- a/lib/stream/aspect.rb
+++ b/lib/stream/aspect.rb
@@ -85,18 +85,6 @@ class Stream::Aspect < Stream::Base
@all_aspects ||= aspect_ids.length == user.aspects.size
end
- # Provides a link to the user to the contacts page that corresponds with
- # the stream's active aspects.
- #
- # @return [String] Link to contacts
- def contacts_link
- if for_all_aspects? || aspect_ids.size > 1
- Rails.application.routes.url_helpers.contacts_path
- else
- Rails.application.routes.url_helpers.contacts_path(:a_id => aspect.id)
- end
- end
-
# This is perfomance optimization, as everyone in your aspect stream you have
# a contact.
#
diff --git a/lib/stream/base.rb b/lib/stream/base.rb
index 0d705469f..72dad18d2 100644
--- a/lib/stream/base.rb
+++ b/lib/stream/base.rb
@@ -49,11 +49,6 @@ class Stream::Base
includes(:profile)
end
- # @return [String]
- def contacts_link
- Rails.application.routes.url_helpers.contacts_path
- end
-
# @return [Boolean]
def for_all_aspects?
true
diff --git a/spec/configuration_methods_spec.rb b/spec/configuration_methods_spec.rb
index a0d4e5d8f..f3b4595cf 100644
--- a/spec/configuration_methods_spec.rb
+++ b/spec/configuration_methods_spec.rb
@@ -1,5 +1,3 @@
-require "spec_helper"
-
describe "ensure configuration effects" do
it "sets the captcha length as required" do
expect(SimpleCaptcha.length).to eq(AppConfig.settings.captcha.captcha_length.to_i)
diff --git a/spec/controllers/admin/pods_controller_spec.rb b/spec/controllers/admin/pods_controller_spec.rb
index cd4e198b3..9244351ee 100644
--- a/spec/controllers/admin/pods_controller_spec.rb
+++ b/spec/controllers/admin/pods_controller_spec.rb
@@ -1,6 +1,3 @@
-
-require "spec_helper"
-
describe Admin::PodsController, type: :controller do
before do
@user = FactoryGirl.create :user
diff --git a/spec/controllers/admin/users_controller_spec.rb b/spec/controllers/admin/users_controller_spec.rb
index d9f9dd911..e96fa750e 100644
--- a/spec/controllers/admin/users_controller_spec.rb
+++ b/spec/controllers/admin/users_controller_spec.rb
@@ -1,6 +1,3 @@
-
-require 'spec_helper'
-
describe Admin::UsersController, :type => :controller do
before do
@user = FactoryGirl.create :user
diff --git a/spec/controllers/admins_controller_spec.rb b/spec/controllers/admins_controller_spec.rb
index bf4763a47..8d617d7c9 100644
--- a/spec/controllers/admins_controller_spec.rb
+++ b/spec/controllers/admins_controller_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require 'spec_helper'
-
describe AdminsController, :type => :controller do
before do
@user = FactoryGirl.create :user
diff --git a/spec/controllers/api/openid_connect/authorizations_controller_spec.rb b/spec/controllers/api/openid_connect/authorizations_controller_spec.rb
index 9a0631e63..f32ae0957 100644
--- a/spec/controllers/api/openid_connect/authorizations_controller_spec.rb
+++ b/spec/controllers/api/openid_connect/authorizations_controller_spec.rb
@@ -1,6 +1,4 @@
-require "spec_helper"
-
-describe Api::OpenidConnect::AuthorizationsController, type: :controller do
+describe Api::OpenidConnect::AuthorizationsController, type: :request do
let!(:client) { FactoryGirl.create(:o_auth_application) }
let!(:client_with_xss) { FactoryGirl.create(:o_auth_application_with_xss) }
let!(:client_with_multiple_redirects) { FactoryGirl.create(:o_auth_application_with_multiple_redirects) }
@@ -12,10 +10,10 @@ describe Api::OpenidConnect::AuthorizationsController, type: :controller do
describe "#new" do
context "when not yet authorized" do
context "when valid parameters are passed" do
- render_views
context "as GET request" do
it "should return a form page" do
- get :new, client_id: client.client_id, redirect_uri: "http://localhost:3000/", response_type: "id_token",
+ get new_api_openid_connect_authorization_path, client_id: client.client_id,
+ redirect_uri: "http://localhost:3000/", response_type: "id_token",
scope: "openid", nonce: SecureRandom.hex(16), state: SecureRandom.hex(16)
expect(response.body).to match("Diaspora Test Client")
end
@@ -23,7 +21,8 @@ describe Api::OpenidConnect::AuthorizationsController, type: :controller do
context "using claims" do
it "should return a form page" do
- get :new, client_id: client.client_id, redirect_uri: "http://localhost:3000/", response_type: "id_token",
+ get new_api_openid_connect_authorization_path, client_id: client.client_id,
+ redirect_uri: "http://localhost:3000/", response_type: "id_token",
scope: "openid", claims: "{\"userinfo\": {\"name\": {\"essential\": true}}}",
nonce: SecureRandom.hex(16), state: SecureRandom.hex(16)
expect(response.body).to match("Diaspora Test Client")
@@ -38,7 +37,8 @@ describe Api::OpenidConnect::AuthorizationsController, type: :controller do
claims: {userinfo: {name: {essential: true}}}}
payload = JWT.encoded_payload(JSON.parse(payload_hash.to_json))
request_object = header + "." + payload + "."
- get :new, client_id: client.client_id, redirect_uri: "http://localhost:3000/", response_type: "id_token",
+ get new_api_openid_connect_authorization_path, client_id: client.client_id,
+ redirect_uri: "http://localhost:3000/", response_type: "id_token",
scope: "openid", nonce: "hello", state: "hello", request: request_object
expect(response.body).to match("Diaspora Test Client")
end
@@ -51,7 +51,8 @@ describe Api::OpenidConnect::AuthorizationsController, type: :controller do
response_type: "id_token", scope: "openid", nonce: "hello", state: "hello"}
payload = JWT.encoded_payload(JSON.parse(payload_hash.to_json))
request_object = header + "." + payload + "."
- get :new, client_id: client.client_id, redirect_uri: "http://localhost:3000/", response_type: "id_token",
+ get new_api_openid_connect_authorization_path, client_id: client.client_id,
+ redirect_uri: "http://localhost:3000/", response_type: "id_token",
scope: "openid", nonce: "hello", state: "hello", request: request_object
expect(response.body).to match("Diaspora Test Client")
end
@@ -59,7 +60,8 @@ describe Api::OpenidConnect::AuthorizationsController, type: :controller do
context "as POST request" do
it "should return a form page" do
- post :new, client_id: client.client_id, redirect_uri: "http://localhost:3000/", response_type: "id_token",
+ post api_openid_connect_authorizations_new_path, client_id: client.client_id,
+ redirect_uri: "http://localhost:3000/", response_type: "id_token",
scope: "openid", nonce: SecureRandom.hex(16), state: SecureRandom.hex(16)
expect(response.body).to match("Diaspora Test Client")
end
@@ -68,7 +70,8 @@ describe Api::OpenidConnect::AuthorizationsController, type: :controller do
context "when client id is missing" do
it "should return an bad request error" do
- post :new, redirect_uri: "http://localhost:3000/", response_type: "id_token",
+ post api_openid_connect_authorizations_new_path,
+ redirect_uri: "http://localhost:3000/", response_type: "id_token",
scope: "openid", nonce: SecureRandom.hex(16), state: SecureRandom.hex(16)
expect(response.body).to include("The request was malformed")
end
@@ -81,7 +84,7 @@ describe Api::OpenidConnect::AuthorizationsController, type: :controller do
# When client has only one redirect uri registered, only that redirect uri can be used. Hence,
# we should implicitly assume the client wants to use that registered URI.
# See https://github.com/nov/rack-oauth2/blob/master/lib/rack/oauth2/server/authorize.rb#L63
- post :new, client_id: client.client_id, response_type: "id_token",
+ post api_openid_connect_authorizations_new_path, client_id: client.client_id, response_type: "id_token",
scope: "openid", nonce: SecureRandom.hex(16), state: SecureRandom.hex(16)
expect(response.body).to match("Diaspora Test Client")
end
@@ -90,7 +93,8 @@ describe Api::OpenidConnect::AuthorizationsController, type: :controller do
context "when multiple redirect URLs are pre-registered" do
it "should return an invalid request error" do
- post :new, client_id: client_with_multiple_redirects.client_id, response_type: "id_token",
+ post api_openid_connect_authorizations_new_path, client_id: client_with_multiple_redirects.client_id,
+ response_type: "id_token",
scope: "openid", nonce: SecureRandom.hex(16), state: SecureRandom.hex(16)
expect(response.body).to include("The request was malformed")
end
@@ -98,7 +102,8 @@ describe Api::OpenidConnect::AuthorizationsController, type: :controller do
context "when redirect URI does not match pre-registered URIs" do
it "should return an invalid request error" do
- post :new, client_id: client.client_id, redirect_uri: "http://localhost:2000/",
+ post api_openid_connect_authorizations_new_path, client_id: client.client_id,
+ redirect_uri: "http://localhost:2000/",
response_type: "id_token", scope: "openid", nonce: SecureRandom.hex(16)
expect(response.body).to include("Invalid client id or redirect uri")
end
@@ -106,7 +111,8 @@ describe Api::OpenidConnect::AuthorizationsController, type: :controller do
context "when an unsupported scope is passed in" do
it "should return an invalid scope error" do
- post :new, client_id: client.client_id, redirect_uri: "http://localhost:3000/", response_type: "id_token",
+ post api_openid_connect_authorizations_new_path, client_id: client.client_id,
+ redirect_uri: "http://localhost:3000/", response_type: "id_token",
scope: "random", nonce: SecureRandom.hex(16), state: SecureRandom.hex(16)
expect(response.body).to match("error=invalid_scope")
end
@@ -114,7 +120,8 @@ describe Api::OpenidConnect::AuthorizationsController, type: :controller do
context "when nonce is missing" do
it "should return an invalid request error" do
- post :new, client_id: client.client_id, redirect_uri: "http://localhost:3000/",
+ post api_openid_connect_authorizations_new_path, client_id: client.client_id,
+ redirect_uri: "http://localhost:3000/",
response_type: "id_token", scope: "openid", state: SecureRandom.hex(16)
expect(response.location).to match("error=invalid_request")
end
@@ -122,7 +129,8 @@ describe Api::OpenidConnect::AuthorizationsController, type: :controller do
context "when prompt is none" do
it "should return an interaction required error" do
- post :new, client_id: client.client_id, redirect_uri: "http://localhost:3000/",
+ post api_openid_connect_authorizations_new_path, client_id: client.client_id,
+ redirect_uri: "http://localhost:3000/",
response_type: "id_token", scope: "openid", state: 1234, display: "page", prompt: "none"
expect(response.body).to include("User must already be authorized when `prompt` is `none`")
end
@@ -134,7 +142,8 @@ describe Api::OpenidConnect::AuthorizationsController, type: :controller do
end
it "should return an interaction required error" do
- post :new, client_id: client.client_id, redirect_uri: "http://localhost:3000/",
+ post api_openid_connect_authorizations_new_path, client_id: client.client_id,
+ redirect_uri: "http://localhost:3000/",
response_type: "id_token", scope: "openid", state: 1234, display: "page", prompt: "none"
expect(response.body).to include("User must already be logged in when `prompt` is `none`")
end
@@ -142,7 +151,8 @@ describe Api::OpenidConnect::AuthorizationsController, type: :controller do
context "when prompt is none and consent" do
it "should return an interaction required error" do
- post :new, client_id: client.client_id, redirect_uri: "http://localhost:3000/",
+ post api_openid_connect_authorizations_new_path, client_id: client.client_id,
+ redirect_uri: "http://localhost:3000/",
response_type: "id_token", scope: "openid", state: 1234, display: "page", prompt: "none consent"
expect(response.location).to match("error=invalid_request")
end
@@ -150,7 +160,8 @@ describe Api::OpenidConnect::AuthorizationsController, type: :controller do
context "when prompt is select_account" do
it "should return an account_selection_required error" do
- post :new, client_id: client.client_id, redirect_uri: "http://localhost:3000/",
+ post api_openid_connect_authorizations_new_path, client_id: client.client_id,
+ redirect_uri: "http://localhost:3000/",
response_type: "id_token", scope: "openid", state: 1234, display: "page", prompt: "select_account"
expect(response.location).to match("error=account_selection_required")
expect(response.location).to match("state=1234")
@@ -159,7 +170,7 @@ describe Api::OpenidConnect::AuthorizationsController, type: :controller do
context "when prompt is none and client ID is invalid" do
it "should return an account_selection_required error" do
- post :new, client_id: "random", redirect_uri: "http://localhost:3000/",
+ post api_openid_connect_authorizations_new_path, client_id: "random", redirect_uri: "http://localhost:3000/",
response_type: "id_token", scope: "openid", state: 1234, display: "page", prompt: "none"
expect(response.body).to include("Invalid client id or redirect uri")
end
@@ -167,7 +178,8 @@ describe Api::OpenidConnect::AuthorizationsController, type: :controller do
context "when prompt is none and redirect URI does not match pre-registered URIs" do
it "should return an account_selection_required error" do
- post :new, client_id: client.client_id, redirect_uri: "http://randomuri:3000/",
+ post api_openid_connect_authorizations_new_path, client_id: client.client_id,
+ redirect_uri: "http://randomuri:3000/",
response_type: "id_token", scope: "openid", state: 1234, display: "page", prompt: "none"
expect(response.body).to include("Invalid client id or redirect uri")
end
@@ -175,7 +187,8 @@ describe Api::OpenidConnect::AuthorizationsController, type: :controller do
context "when XSS script is passed as name" do
it "should escape html" do
- post :new, client_id: client_with_xss.client_id, redirect_uri: "http://localhost:3000/",
+ post api_openid_connect_authorizations_new_path, client_id: client_with_xss.client_id,
+ redirect_uri: "http://localhost:3000/",
response_type: "id_token", scope: "openid", nonce: SecureRandom.hex(16), state: SecureRandom.hex(16)
expect(response.body).to_not include("<script>alert(0);</script>")
end
@@ -190,12 +203,13 @@ describe Api::OpenidConnect::AuthorizationsController, type: :controller do
context "when valid parameters are passed" do
before do
- get :new, client_id: client.client_id, redirect_uri: "http://localhost:3000/", response_type: "id_token",
+ get new_api_openid_connect_authorization_path, client_id: client.client_id,
+ redirect_uri: "http://localhost:3000/", response_type: "id_token",
scope: "openid", nonce: 413_093_098_3, state: 413_093_098_3
end
it "should return the id token in a fragment" do
- expect(response.location).to have_content("id_token=")
+ expect(response.location).to include("id_token=")
encoded_id_token = response.location[/(?<=id_token=)[^&]+/]
decoded_token = OpenIDConnect::ResponseObject::IdToken.decode encoded_id_token,
Api::OpenidConnect::IdTokenConfig::PUBLIC_KEY
@@ -204,16 +218,17 @@ describe Api::OpenidConnect::AuthorizationsController, type: :controller do
end
it "should return the passed in state" do
- expect(response.location).to have_content("state=4130930983")
+ expect(response.location).to include("state=4130930983")
end
end
context "when prompt is none" do
it "should return the id token in a fragment" do
- post :new, client_id: client.client_id, redirect_uri: "http://localhost:3000/",
+ post api_openid_connect_authorizations_new_path, client_id: client.client_id,
+ redirect_uri: "http://localhost:3000/",
response_type: "id_token", scope: "openid", nonce: 413_093_098_3, state: 413_093_098_3,
display: "page", prompt: "none"
- expect(response.location).to have_content("id_token=")
+ expect(response.location).to include("id_token=")
encoded_id_token = response.location[/(?<=id_token=)[^&]+/]
decoded_token = OpenIDConnect::ResponseObject::IdToken.decode encoded_id_token,
Api::OpenidConnect::IdTokenConfig::PUBLIC_KEY
@@ -224,7 +239,8 @@ describe Api::OpenidConnect::AuthorizationsController, type: :controller do
context "when prompt contains consent" do
it "should return a consent form page" do
- get :new, client_id: client.client_id, redirect_uri: "http://localhost:3000/",
+ get new_api_openid_connect_authorization_path, client_id: client.client_id,
+ redirect_uri: "http://localhost:3000/",
response_type: "id_token", scope: "openid", nonce: 413_093_098_3, state: 413_093_098_3,
display: "page", prompt: "consent"
expect(response.body).to match("Diaspora Test Client")
@@ -233,7 +249,8 @@ describe Api::OpenidConnect::AuthorizationsController, type: :controller do
context "when scopes are escalated" do
before do
- get :new, client_id: client.client_id, redirect_uri: "http://localhost:3000/", response_type: "id_token",
+ get new_api_openid_connect_authorization_path, client_id: client.client_id,
+ redirect_uri: "http://localhost:3000/", response_type: "id_token",
scope: "openid read", nonce: 413_093_098_3, state: 413_093_098_3
end
@@ -242,7 +259,7 @@ describe Api::OpenidConnect::AuthorizationsController, type: :controller do
end
it "should overwrite old authorization scope after approval" do
- post :create, approve: "true"
+ post api_openid_connect_authorizations_path, approve: "true"
authorization_with_old_scope =
Api::OpenidConnect::Authorization.find_by_client_id_user_and_scopes(client.client_id, alice, ["openid"])
expect(authorization_with_old_scope).to be_nil
@@ -254,13 +271,14 @@ describe Api::OpenidConnect::AuthorizationsController, type: :controller do
describe "#create" do
context "when id_token token" do
before do
- get :new, client_id: client.client_id, redirect_uri: "http://localhost:3000/", response_type: "id_token token",
+ get new_api_openid_connect_authorization_path, client_id: client.client_id,
+ redirect_uri: "http://localhost:3000/", response_type: "id_token token",
scope: "openid", nonce: 418_093_098_3, state: 418_093_098_3
end
context "when authorization is approved" do
before do
- post :create, approve: "true"
+ post api_openid_connect_authorizations_path, approve: "true"
end
it "should return the id token in a fragment" do
@@ -284,17 +302,18 @@ describe Api::OpenidConnect::AuthorizationsController, type: :controller do
context "when id_token" do
before do
- get :new, client_id: client.client_id, redirect_uri: "http://localhost:3000/", response_type: "id_token",
+ get new_api_openid_connect_authorization_path, client_id: client.client_id,
+ redirect_uri: "http://localhost:3000/", response_type: "id_token",
scope: "openid", nonce: 418_093_098_3, state: 418_093_098_3
end
context "when authorization is approved" do
before do
- post :create, approve: "true"
+ post api_openid_connect_authorizations_path, approve: "true"
end
it "should return the id token in a fragment" do
- expect(response.location).to have_content("id_token=")
+ expect(response.location).to include("id_token=")
encoded_id_token = response.location[/(?<=id_token=)[^&]+/]
decoded_token = OpenIDConnect::ResponseObject::IdToken.decode encoded_id_token,
Api::OpenidConnect::IdTokenConfig::PUBLIC_KEY
@@ -303,56 +322,57 @@ describe Api::OpenidConnect::AuthorizationsController, type: :controller do
end
it "should return the passed in state" do
- expect(response.location).to have_content("state=4180930983")
+ expect(response.location).to include("state=4180930983")
end
end
context "when authorization is denied" do
before do
- post :create, approve: "false"
+ post api_openid_connect_authorizations_path, approve: "false"
end
it "should return an error in the fragment" do
- expect(response.location).to have_content("error=")
+ expect(response.location).to include("error=")
end
it "should NOT contain a id token in the fragment" do
- expect(response.location).to_not have_content("id_token=")
+ expect(response.location).to_not include("id_token=")
end
end
end
context "when code" do
before do
- get :new, client_id: client.client_id, redirect_uri: "http://localhost:3000/", response_type: "code",
+ get new_api_openid_connect_authorization_path, client_id: client.client_id,
+ redirect_uri: "http://localhost:3000/", response_type: "code",
scope: "openid", nonce: 418_093_098_3, state: 418_093_098_3
end
context "when authorization is approved" do
before do
- post :create, approve: "true"
+ post api_openid_connect_authorizations_path, approve: "true"
end
it "should return the code" do
- expect(response.location).to have_content("code")
+ expect(response.location).to include("code")
end
it "should return the passed in state" do
- expect(response.location).to have_content("state=4180930983")
+ expect(response.location).to include("state=4180930983")
end
end
context "when authorization is denied" do
before do
- post :create, approve: "false"
+ post api_openid_connect_authorizations_path, approve: "false"
end
it "should return an error" do
- expect(response.location).to have_content("error")
+ expect(response.location).to include("error")
end
it "should NOT contain code" do
- expect(response.location).to_not have_content("code")
+ expect(response.location).to_not include("code")
end
end
end
@@ -363,7 +383,7 @@ describe Api::OpenidConnect::AuthorizationsController, type: :controller do
context "with existent authorization" do
before do
- delete :destroy, id: auth_with_read.id
+ delete api_openid_connect_authorization_path(auth_with_read.id)
end
it "removes the authorization" do
@@ -373,7 +393,7 @@ describe Api::OpenidConnect::AuthorizationsController, type: :controller do
context "with non-existent authorization" do
it "raises an error" do
- delete :destroy, id: 123_456_789
+ delete api_openid_connect_authorization_path(123_456_789)
expect(response).to redirect_to(api_openid_connect_user_applications_url)
expect(flash[:error]).to eq("The attempt to revoke the authorization with ID 123456789 failed")
end
diff --git a/spec/controllers/api/openid_connect/clients_controller_spec.rb b/spec/controllers/api/openid_connect/clients_controller_spec.rb
index 6ac6bc60d..5477d2fa3 100644
--- a/spec/controllers/api/openid_connect/clients_controller_spec.rb
+++ b/spec/controllers/api/openid_connect/clients_controller_spec.rb
@@ -1,5 +1,3 @@
-require "spec_helper"
-
describe Api::OpenidConnect::ClientsController, type: :controller, suppress_csrf_verification: :none do
describe "#create" do
context "when valid parameters are passed" do
diff --git a/spec/controllers/api/openid_connect/discovery_controller_spec.rb b/spec/controllers/api/openid_connect/discovery_controller_spec.rb
index 19b90d6c5..9d2ff4526 100644
--- a/spec/controllers/api/openid_connect/discovery_controller_spec.rb
+++ b/spec/controllers/api/openid_connect/discovery_controller_spec.rb
@@ -1,5 +1,3 @@
-require "spec_helper"
-
describe Api::OpenidConnect::DiscoveryController, type: :controller do
describe "#webfinger" do
before do
diff --git a/spec/controllers/api/openid_connect/id_tokens_controller_spec.rb b/spec/controllers/api/openid_connect/id_tokens_controller_spec.rb
index ec8ab8643..eb7bccefa 100644
--- a/spec/controllers/api/openid_connect/id_tokens_controller_spec.rb
+++ b/spec/controllers/api/openid_connect/id_tokens_controller_spec.rb
@@ -1,5 +1,3 @@
-require "spec_helper"
-
describe Api::OpenidConnect::IdTokensController, type: :controller do
describe "#jwks" do
before do
diff --git a/spec/controllers/api/openid_connect/token_endpoint_controller_spec.rb b/spec/controllers/api/openid_connect/token_endpoint_controller_spec.rb
index e1aa5a3eb..c3a484085 100644
--- a/spec/controllers/api/openid_connect/token_endpoint_controller_spec.rb
+++ b/spec/controllers/api/openid_connect/token_endpoint_controller_spec.rb
@@ -1,5 +1,3 @@
-require "spec_helper"
-
describe Api::OpenidConnect::TokenEndpointController, type: :controller, suppress_csrf_verification: :none do
let(:auth) { FactoryGirl.create(:auth_with_read) }
diff --git a/spec/controllers/api/openid_connect/user_applications_spec.rb b/spec/controllers/api/openid_connect/user_applications_spec.rb
index 588384159..3a94d830e 100644
--- a/spec/controllers/api/openid_connect/user_applications_spec.rb
+++ b/spec/controllers/api/openid_connect/user_applications_spec.rb
@@ -1,5 +1,3 @@
-require "spec_helper"
-
describe Api::OpenidConnect::UserApplicationsController, type: :controller do
before do
@app = FactoryGirl.create(:o_auth_application_with_xss)
diff --git a/spec/controllers/application_controller_spec.rb b/spec/controllers/application_controller_spec.rb
index d9501a19c..faacf265f 100644
--- a/spec/controllers/application_controller_spec.rb
+++ b/spec/controllers/application_controller_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require 'spec_helper'
-
describe ApplicationController, :type => :controller do
controller do
def index
diff --git a/spec/controllers/aspect_memberships_controller_spec.rb b/spec/controllers/aspect_memberships_controller_spec.rb
index a0a418061..90e706e29 100644
--- a/spec/controllers/aspect_memberships_controller_spec.rb
+++ b/spec/controllers/aspect_memberships_controller_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require "spec_helper"
-
describe AspectMembershipsController, type: :controller do
before do
@aspect0 = alice.aspects.first
diff --git a/spec/controllers/aspects_controller_spec.rb b/spec/controllers/aspects_controller_spec.rb
index c8f971ae1..4278b078d 100644
--- a/spec/controllers/aspects_controller_spec.rb
+++ b/spec/controllers/aspects_controller_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require 'spec_helper'
-
describe AspectsController, :type => :controller do
before do
alice.getting_started = false
diff --git a/spec/controllers/blocks_controller_spec.rb b/spec/controllers/blocks_controller_spec.rb
index 1937c1e2d..de16662ea 100644
--- a/spec/controllers/blocks_controller_spec.rb
+++ b/spec/controllers/blocks_controller_spec.rb
@@ -1,5 +1,3 @@
-require 'spec_helper'
-
describe BlocksController, :type => :controller do
before do
sign_in alice
diff --git a/spec/controllers/comments_controller_spec.rb b/spec/controllers/comments_controller_spec.rb
index 39492d191..a155cf531 100644
--- a/spec/controllers/comments_controller_spec.rb
+++ b/spec/controllers/comments_controller_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require 'spec_helper'
-
describe CommentsController, :type => :controller do
before do
allow(@controller).to receive(:current_user).and_return(alice)
@@ -67,6 +65,7 @@ describe CommentsController, :type => :controller do
expect(alice).not_to receive(:comment)
post :create, comment_hash
expect(response.code).to eq("404")
+ expect(response.body).to eq(I18n.t("comments.create.error"))
end
end
diff --git a/spec/controllers/contacts_controller_spec.rb b/spec/controllers/contacts_controller_spec.rb
index 7a8ab7a13..e12a97c3f 100644
--- a/spec/controllers/contacts_controller_spec.rb
+++ b/spec/controllers/contacts_controller_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require 'spec_helper'
-
describe ContactsController, :type => :controller do
before do
sign_in bob, scope: :user
@@ -37,6 +35,8 @@ describe ContactsController, :type => :controller do
@person1 = FactoryGirl.create(:person)
bob.share_with(@person1, bob.aspects.first)
@person2 = FactoryGirl.create(:person)
+ @person3 = FactoryGirl.create(:person)
+ bob.contacts.create(person: @person3, aspects: [bob.aspects.first], receiving: true, sharing: true)
end
it "succeeds" do
@@ -53,6 +53,15 @@ describe ContactsController, :type => :controller do
get :index, q: @person2.first_name, format: "json"
expect(response.body).to eq([].to_json)
end
+
+ it "only returns mutual contacts when mutual parameter is true" do
+ get :index, q: @person1.first_name, mutual: true, format: "json"
+ expect(response.body).to eq([].to_json)
+ get :index, q: @person2.first_name, mutual: true, format: "json"
+ expect(response.body).to eq([].to_json)
+ get :index, q: @person3.first_name, mutual: true, format: "json"
+ expect(response.body).to eq([@person3].to_json)
+ end
end
context "for pagination on the contacts page" do
diff --git a/spec/controllers/conversation_visibilities_controller_spec.rb b/spec/controllers/conversation_visibilities_controller_spec.rb
index f9dc655bd..5b8893c1e 100644
--- a/spec/controllers/conversation_visibilities_controller_spec.rb
+++ b/spec/controllers/conversation_visibilities_controller_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require 'spec_helper'
-
describe ConversationVisibilitiesController, :type => :controller do
before do
@user1 = alice
diff --git a/spec/controllers/conversations_controller_spec.rb b/spec/controllers/conversations_controller_spec.rb
index 0002468de..9bf0c6cc1 100644
--- a/spec/controllers/conversations_controller_spec.rb
+++ b/spec/controllers/conversations_controller_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require 'spec_helper'
-
describe ConversationsController, :type => :controller do
before do
sign_in alice, scope: :user
@@ -16,48 +14,57 @@ describe ConversationsController, :type => :controller do
end
end
- describe '#new modal' do
- it 'succeeds' do
- get :new, :modal => true
- expect(response).to be_success
- end
+ describe "#new modal" do
+ context "desktop" do
+ it "succeeds" do
+ get :new, modal: true
+ expect(response).to be_success
+ end
- it "assigns a json list of contacts that are sharing with the person" do
- sharing_user = FactoryGirl.create(:user_with_aspect)
- sharing_user.share_with(alice.person, sharing_user.aspects.first)
- get :new, :modal => true
- expect(assigns(:contacts_json)).to include(alice.contacts.where(sharing: true, receiving: true).first.person.name)
- alice.contacts << Contact.new(:person_id => eve.person.id, :user_id => alice.id, :sharing => false, :receiving => true)
- expect(assigns(:contacts_json)).not_to include(alice.contacts.where(sharing: false).first.person.name)
- expect(assigns(:contacts_json)).not_to include(alice.contacts.where(receiving: false).first.person.name)
- end
+ it "assigns a contact if passed a contact id" do
+ get :new, contact_id: alice.contacts.first.id, modal: true
+ expect(controller.gon.conversation_prefill).to eq([alice.contacts.first.person.as_json])
+ end
- it "assigns a contact if passed a contact id" do
- get :new, :contact_id => alice.contacts.first.id, :modal => true
- expect(assigns(:contact_ids)).to eq(alice.contacts.first.id)
+ it "assigns a set of contacts if passed an aspect id" do
+ get :new, aspect_id: alice.aspects.first.id, modal: true
+ expect(controller.gon.conversation_prefill).to eq(alice.aspects.first.contacts.map {|c| c.person.as_json })
+ end
end
- it "assigns a set of contacts if passed an aspect id" do
- get :new, :aspect_id => alice.aspects.first.id, :modal => true
- expect(assigns(:contact_ids)).to eq(alice.aspects.first.contacts.map(&:id).join(','))
- end
+ context "mobile" do
+ before do
+ controller.session[:mobile_view] = true
+ end
- it "does not allow XSS via the name parameter" do
- ["</script><script>alert(1);</script>",
- '"}]});alert(1);(function f() {var foo = [{b:"'].each do |xss|
- get :new, :modal => true, name: xss
- expect(response.body).not_to include xss
+ it "assigns a json list of contacts that are sharing with the person" do
+ sharing_user = FactoryGirl.create(:user_with_aspect)
+ sharing_user.share_with(alice.person, sharing_user.aspects.first)
+ get :new, modal: true
+ expect(assigns(:contacts_json))
+ .to include(alice.contacts.where(sharing: true, receiving: true).first.person.name)
+ alice.contacts << Contact.new(person_id: eve.person.id, user_id: alice.id, sharing: false, receiving: true)
+ expect(assigns(:contacts_json)).not_to include(alice.contacts.where(sharing: false).first.person.name)
+ expect(assigns(:contacts_json)).not_to include(alice.contacts.where(receiving: false).first.person.name)
end
- end
- it "does not allow XSS via the profile name" do
- xss = "<script>alert(0);</script>"
- contact = alice.contacts.first
- contact.person.profile.update_attribute(:first_name, xss)
- get :new, :modal => true
- json = JSON.parse(assigns(:contacts_json)).first
- expect(json['value'].to_s).to eq(contact.id.to_s)
- expect(json['name']).to_not include(xss)
+ it "does not allow XSS via the name parameter" do
+ ["</script><script>alert(1);</script>",
+ '"}]});alert(1);(function f() {var foo = [{b:"'].each do |xss|
+ get :new, modal: true, name: xss
+ expect(response.body).not_to include xss
+ end
+ end
+
+ it "does not allow XSS via the profile name" do
+ xss = "<script>alert(0);</script>"
+ contact = alice.contacts.first
+ contact.person.profile.update_attribute(:first_name, xss)
+ get :new, modal: true
+ json = JSON.parse(assigns(:contacts_json)).first
+ expect(json["value"].to_s).to eq(contact.id.to_s)
+ expect(json["name"]).to_not include(xss)
+ end
end
end
@@ -115,203 +122,360 @@ describe ConversationsController, :type => :controller do
end
end
- describe '#create' do
- context 'with a valid conversation' do
- before do
- @hash = {
- :format => :js,
- :conversation => {
- :subject => "secret stuff",
- :text => 'text debug'
- },
- :contact_ids => [alice.contacts.first.id]
- }
- end
+ describe "#create" do
+ context "desktop" do
+ context "with a valid conversation" do
+ before do
+ @hash = {
+ format: :js,
+ conversation: {subject: "secret stuff", text: "text debug"},
+ person_ids: alice.contacts.first.person.id.to_s
+ }
+ end
- it 'creates a conversation' do
- expect {
+ it "creates a conversation" do
+ expect { post :create, @hash }.to change(Conversation, :count).by(1)
+ end
+
+ it "creates a message" do
+ expect { post :create, @hash }.to change(Message, :count).by(1)
+ end
+
+ it "responds with the conversation id as JSON" do
post :create, @hash
- }.to change(Conversation, :count).by(1)
- end
+ expect(response).to be_success
+ expect(JSON.parse(response.body)["id"]).to eq(Conversation.first.id)
+ end
- it 'creates a message' do
- expect {
+ it "sets the author to the current_user" do
+ @hash[:author] = FactoryGirl.create(:user)
post :create, @hash
- }.to change(Message, :count).by(1)
- end
+ expect(Message.first.author).to eq(alice.person)
+ expect(Conversation.first.author).to eq(alice.person)
+ end
- it "responds with the conversation id as JSON" do
- post :create, @hash
- expect(response).to be_success
- expect(JSON.parse(response.body)["id"]).to eq(Conversation.first.id)
- end
+ it "dispatches the conversation" do
+ Conversation.create(author: alice.person, participant_ids: [alice.contacts.first.person.id, alice.person.id],
+ subject: "not spam", messages_attributes: [{author: alice.person, text: "cool stuff"}])
- it 'sets the author to the current_user' do
- @hash[:author] = FactoryGirl.create(:user)
- post :create, @hash
- expect(Message.first.author).to eq(alice.person)
- expect(Conversation.first.author).to eq(alice.person)
+ expect(Diaspora::Federation::Dispatcher).to receive(:defer_dispatch)
+ post :create, @hash
+ end
end
- it 'dispatches the conversation' do
- cnv = Conversation.create(
- {
- :author => alice.person,
- :participant_ids => [alice.contacts.first.person.id, alice.person.id],
- :subject => 'not spam',
- :messages_attributes => [ {:author => alice.person, :text => 'cool stuff'} ]
+ context "with empty subject" do
+ before do
+ @hash = {
+ format: :js,
+ conversation: {subject: " ", text: "text debug"},
+ person_ids: alice.contacts.first.person.id.to_s
}
- )
+ end
- expect(Diaspora::Federation::Dispatcher).to receive(:defer_dispatch)
- post :create, @hash
- end
- end
+ it "creates a conversation" do
+ expect { post :create, @hash }.to change(Conversation, :count).by(1)
+ end
- context 'with empty subject' do
- before do
- @hash = {
- :format => :js,
- :conversation => {
- :subject => ' ',
- :text => 'text debug'
- },
- :contact_ids => [alice.contacts.first.id]
- }
- end
+ it "creates a message" do
+ expect { post :create, @hash }.to change(Message, :count).by(1)
+ end
- it 'creates a conversation' do
- expect {
+ it "responds with the conversation id as JSON" do
post :create, @hash
- }.to change(Conversation, :count).by(1)
+ expect(response).to be_success
+ expect(JSON.parse(response.body)["id"]).to eq(Conversation.first.id)
+ end
end
- it 'creates a message' do
- expect {
+ context "with empty text" do
+ before do
+ @hash = {
+ format: :js,
+ conversation: {subject: "secret stuff", text: " "},
+ person_ids: alice.contacts.first.person.id.to_s
+ }
+ end
+
+ it "does not create a conversation" do
+ expect { post :create, @hash }.not_to change(Conversation, :count)
+ end
+
+ it "does not create a message" do
+ expect { post :create, @hash }.not_to change(Message, :count)
+ end
+
+ it "responds with an error message" do
post :create, @hash
- }.to change(Message, :count).by(1)
+ expect(response).not_to be_success
+ expect(response.body).to eq(I18n.t("conversations.create.fail"))
+ end
end
- it "responds with the conversation id as JSON" do
- post :create, @hash
- expect(response).to be_success
- expect(JSON.parse(response.body)["id"]).to eq(Conversation.first.id)
- end
- end
+ context "with empty contact" do
+ before do
+ @hash = {
+ format: :js,
+ conversation: {subject: "secret stuff", text: "text debug"},
+ person_ids: " "
+ }
+ end
- context 'with empty text' do
- before do
- @hash = {
- :format => :js,
- :conversation => {
- :subject => 'secret stuff',
- :text => ' '
- },
- :contact_ids => [alice.contacts.first.id]
- }
- end
+ it "does not create a conversation" do
+ expect { post :create, @hash }.not_to change(Conversation, :count)
+ end
- it 'does not create a conversation' do
- count = Conversation.count
- post :create, @hash
- expect(Conversation.count).to eq(count)
+ it "does not create a message" do
+ expect { post :create, @hash }.not_to change(Message, :count)
+ end
+
+ it "responds with an error message" do
+ post :create, @hash
+ expect(response).not_to be_success
+ expect(response.body).to eq(I18n.t("javascripts.conversation.create.no_recipient"))
+ end
end
- it 'does not create a message' do
- count = Message.count
- post :create, @hash
- expect(Message.count).to eq(count)
+ context "with nil contact" do
+ before do
+ @hash = {
+ format: :js,
+ conversation: {subject: "secret stuff", text: "text debug"},
+ person_ids: nil
+ }
+ end
+
+ it "does not create a conversation" do
+ expect { post :create, @hash }.not_to change(Conversation, :count)
+ end
+
+ it "does not create a message" do
+ expect { post :create, @hash }.not_to change(Message, :count)
+ end
+
+ it "responds with an error message" do
+ post :create, @hash
+ expect(response).not_to be_success
+ expect(response.body).to eq(I18n.t("javascripts.conversation.create.no_recipient"))
+ end
end
- it "responds with an error message" do
- post :create, @hash
- expect(response).not_to be_success
- expect(response.body).to eq(I18n.t("conversations.create.fail"))
+ context "with non-mutual contact" do
+ before do
+ @person1 = FactoryGirl.create(:person)
+ @person2 = FactoryGirl.create(:person)
+ alice.contacts.create!(receiving: false, sharing: true, person: @person2)
+ @person3 = FactoryGirl.create(:person)
+ alice.contacts.create!(receiving: true, sharing: false, person: @person3)
+ @hash = {
+ format: :js,
+ conversation: {subject: "secret stuff", text: "text debug"},
+ person_ids: [@person1.id, @person2.id, @person3.id].join(",")
+ }
+ end
+
+ it "does not create a conversation" do
+ expect { post :create, @hash }.not_to change(Conversation, :count)
+ end
+
+ it "does not create a message" do
+ expect { post :create, @hash }.not_to change(Message, :count)
+ end
+
+ it "responds with an error message" do
+ post :create, @hash
+ expect(response).not_to be_success
+ expect(response.body).to eq(I18n.t("javascripts.conversation.create.no_recipient"))
+ end
end
end
- context 'with empty contact' do
+ context "mobile" do
before do
- @hash = {
- :format => :js,
- :conversation => {
- :subject => 'secret stuff',
- :text => 'text debug'
- },
- :contact_ids => ' '
- }
+ controller.session[:mobile_view] = true
end
- it 'does not create a conversation' do
- count = Conversation.count
- post :create, @hash
- expect(Conversation.count).to eq(count)
- end
+ context "with a valid conversation" do
+ before do
+ @hash = {
+ format: :js,
+ conversation: {subject: "secret stuff", text: "text debug"},
+ contact_ids: alice.contacts.first.id.to_s
+ }
+ end
+
+ it "creates a conversation" do
+ expect { post :create, @hash }.to change(Conversation, :count).by(1)
+ end
+
+ it "creates a message" do
+ expect { post :create, @hash }.to change(Message, :count).by(1)
+ end
+
+ it "responds with the conversation id as JSON" do
+ post :create, @hash
+ expect(response).to be_success
+ expect(JSON.parse(response.body)["id"]).to eq(Conversation.first.id)
+ end
+
+ it "sets the author to the current_user" do
+ @hash[:author] = FactoryGirl.create(:user)
+ post :create, @hash
+ expect(Message.first.author).to eq(alice.person)
+ expect(Conversation.first.author).to eq(alice.person)
+ end
- it 'does not create a message' do
- count = Message.count
- post :create, @hash
- expect(Message.count).to eq(count)
+ it "dispatches the conversation" do
+ Conversation.create(author: alice.person, participant_ids: [alice.contacts.first.person.id, alice.person.id],
+ subject: "not spam", messages_attributes: [{author: alice.person, text: "cool stuff"}])
+
+ expect(Diaspora::Federation::Dispatcher).to receive(:defer_dispatch)
+ post :create, @hash
+ end
end
- it "responds with an error message" do
- post :create, @hash
- expect(response).not_to be_success
- expect(response.body).to eq(I18n.t("javascripts.conversation.create.no_recipient"))
+ context "with empty subject" do
+ before do
+ @hash = {
+ format: :js,
+ conversation: {subject: " ", text: "text debug"},
+ contact_ids: alice.contacts.first.id.to_s
+ }
+ end
+
+ it "creates a conversation" do
+ expect { post :create, @hash }.to change(Conversation, :count).by(1)
+ end
+
+ it "creates a message" do
+ expect { post :create, @hash }.to change(Message, :count).by(1)
+ end
+
+ it "responds with the conversation id as JSON" do
+ post :create, @hash
+ expect(response).to be_success
+ expect(JSON.parse(response.body)["id"]).to eq(Conversation.first.id)
+ end
end
- end
- context 'with nil contact' do
- before do
- @hash = {
- :format => :js,
- :conversation => {
- :subject => 'secret stuff',
- :text => 'text debug'
- },
- :contact_ids => nil
- }
+ context "with empty text" do
+ before do
+ @hash = {
+ format: :js,
+ conversation: {subject: "secret stuff", text: " "},
+ contact_ids: alice.contacts.first.id.to_s
+ }
+ end
+
+ it "does not create a conversation" do
+ expect { post :create, @hash }.not_to change(Conversation, :count)
+ end
+
+ it "does not create a message" do
+ expect { post :create, @hash }.not_to change(Message, :count)
+ end
+
+ it "responds with an error message" do
+ post :create, @hash
+ expect(response).not_to be_success
+ expect(response.body).to eq(I18n.t("conversations.create.fail"))
+ end
end
- it 'does not create a conversation' do
- count = Conversation.count
- post :create, @hash
- expect(Conversation.count).to eq(count)
+ context "with empty contact" do
+ before do
+ @hash = {
+ format: :js,
+ conversation: {subject: "secret stuff", text: "text debug"},
+ contact_ids: " "
+ }
+ end
+
+ it "does not create a conversation" do
+ expect { post :create, @hash }.not_to change(Conversation, :count)
+ end
+
+ it "does not create a message" do
+ expect { post :create, @hash }.not_to change(Message, :count)
+ end
+
+ it "responds with an error message" do
+ post :create, @hash
+ expect(response).not_to be_success
+ expect(response.body).to eq(I18n.t("javascripts.conversation.create.no_recipient"))
+ end
end
- it 'does not create a message' do
- count = Message.count
- post :create, @hash
- expect(Message.count).to eq(count)
+ context "with nil contact" do
+ before do
+ @hash = {
+ format: :js,
+ conversation: {subject: "secret stuff", text: "text debug"},
+ contact_ids: nil
+ }
+ end
+
+ it "does not create a conversation" do
+ expect { post :create, @hash }.not_to change(Conversation, :count)
+ end
+
+ it "does not create a message" do
+ expect { post :create, @hash }.not_to change(Message, :count)
+ end
+
+ it "responds with an error message" do
+ post :create, @hash
+ expect(response).not_to be_success
+ expect(response.body).to eq(I18n.t("javascripts.conversation.create.no_recipient"))
+ end
end
- it "responds with an error message" do
- post :create, @hash
- expect(response).not_to be_success
- expect(response.body).to eq(I18n.t("javascripts.conversation.create.no_recipient"))
+ context "with non-mutual contact" do
+ before do
+ @contact1 = alice.contacts.create(receiving: false, sharing: true, person: FactoryGirl.create(:person))
+ @contact2 = alice.contacts.create(receiving: true, sharing: false, person: FactoryGirl.create(:person))
+ @hash = {
+ format: :js,
+ conversation: {subject: "secret stuff", text: "text debug"},
+ person_ids: [@contact1.id, @contact2.id].join(",")
+ }
+ end
+
+ it "does not create a conversation" do
+ expect { post :create, @hash }.not_to change(Conversation, :count)
+ end
+
+ it "does not create a message" do
+ expect { post :create, @hash }.not_to change(Message, :count)
+ end
+
+ it "responds with an error message" do
+ post :create, @hash
+ expect(response).not_to be_success
+ expect(response.body).to eq(I18n.t("javascripts.conversation.create.no_recipient"))
+ end
end
end
end
- describe '#show' do
+ describe "#show" do
before do
hash = {
- :author => alice.person,
- :participant_ids => [alice.contacts.first.person.id, alice.person.id],
- :subject => 'not spam',
- :messages_attributes => [ {:author => alice.person, :text => 'cool stuff'} ]
+ author: alice.person,
+ participant_ids: [alice.contacts.first.person.id, alice.person.id],
+ subject: "not spam",
+ messages_attributes: [{author: alice.person, text: "cool stuff"}]
}
@conversation = Conversation.create(hash)
end
- it 'succeeds with json' do
+ it "succeeds with json" do
get :show, :id => @conversation.id, :format => :json
expect(response).to be_success
expect(assigns[:conversation]).to eq(@conversation)
expect(response.body).to include @conversation.guid
end
- it 'redirects to index' do
+ it "redirects to index" do
get :show, :id => @conversation.id
expect(response).to redirect_to(conversations_path(:conversation_id => @conversation.id))
end
diff --git a/spec/controllers/help_controller_spec.rb b/spec/controllers/help_controller_spec.rb
index 4d012e4eb..b40bcbbaa 100644
--- a/spec/controllers/help_controller_spec.rb
+++ b/spec/controllers/help_controller_spec.rb
@@ -1,5 +1,3 @@
-require "spec_helper"
-
describe HelpController, type: :controller do
describe "#faq" do
it "succeeds" do
diff --git a/spec/controllers/home_controller_spec.rb b/spec/controllers/home_controller_spec.rb
index 95cc5c40d..80b9bc023 100644
--- a/spec/controllers/home_controller_spec.rb
+++ b/spec/controllers/home_controller_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require "spec_helper"
-
describe HomeController, type: :controller do
describe "#show" do
it "does not redirect for :html if there are at least 2 users and an admin" do
diff --git a/spec/controllers/invitation_codes_controller_spec.rb b/spec/controllers/invitation_codes_controller_spec.rb
index 36d72f13b..90864fefc 100644
--- a/spec/controllers/invitation_codes_controller_spec.rb
+++ b/spec/controllers/invitation_codes_controller_spec.rb
@@ -1,5 +1,3 @@
-require "spec_helper"
-
describe InvitationCodesController, type: :controller do
describe "#show" do
it "redirects to the root page if the invitation code is invalid" do
diff --git a/spec/controllers/invitations_controller_spec.rb b/spec/controllers/invitations_controller_spec.rb
index 00e6b2e8c..7fb2b03fb 100644
--- a/spec/controllers/invitations_controller_spec.rb
+++ b/spec/controllers/invitations_controller_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require "spec_helper"
-
describe InvitationsController, type: :controller do
describe "#create" do
let(:referer) { "http://test.host/cats/foo" }
diff --git a/spec/controllers/jasmine_fixtures/admins_spec.rb b/spec/controllers/jasmine_fixtures/admins_spec.rb
index af4784d22..23a448ed8 100644
--- a/spec/controllers/jasmine_fixtures/admins_spec.rb
+++ b/spec/controllers/jasmine_fixtures/admins_spec.rb
@@ -1,5 +1,3 @@
-require "spec_helper"
-
describe AdminsController, type: :controller do
describe "#dashboard" do
before do
diff --git a/spec/controllers/jasmine_fixtures/aspects_spec.rb b/spec/controllers/jasmine_fixtures/aspects_spec.rb
index f3ea2b5ba..e2adf493d 100644
--- a/spec/controllers/jasmine_fixtures/aspects_spec.rb
+++ b/spec/controllers/jasmine_fixtures/aspects_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require 'spec_helper'
-
describe StreamsController, :type => :controller do
describe '#aspects' do
before do
diff --git a/spec/controllers/jasmine_fixtures/contacts_spec.rb b/spec/controllers/jasmine_fixtures/contacts_spec.rb
index 3e6cb3c85..127f9be2a 100644
--- a/spec/controllers/jasmine_fixtures/contacts_spec.rb
+++ b/spec/controllers/jasmine_fixtures/contacts_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require 'spec_helper'
-
describe ContactsController, :type => :controller do
describe '#index' do
before do
diff --git a/spec/controllers/jasmine_fixtures/conversations_spec.rb b/spec/controllers/jasmine_fixtures/conversations_spec.rb
index c07360d69..cfba3708b 100644
--- a/spec/controllers/jasmine_fixtures/conversations_spec.rb
+++ b/spec/controllers/jasmine_fixtures/conversations_spec.rb
@@ -1,5 +1,3 @@
-require 'spec_helper'
-
describe ConversationsController, :type => :controller do
describe '#index' do
before do
diff --git a/spec/controllers/jasmine_fixtures/notifications_spec.rb b/spec/controllers/jasmine_fixtures/notifications_spec.rb
index 75f95bc80..687bc2523 100644
--- a/spec/controllers/jasmine_fixtures/notifications_spec.rb
+++ b/spec/controllers/jasmine_fixtures/notifications_spec.rb
@@ -1,5 +1,3 @@
-require 'spec_helper'
-
describe NotificationsController, :type => :controller do
describe '#index' do
before do
@@ -14,6 +12,8 @@ describe NotificationsController, :type => :controller do
it "generates a jasmine fixture", :fixture => true do
get :index
save_fixture(html_for("body"), "notifications")
+ get :index, format: :json
+ save_fixture(response.body, "notifications_collection")
end
end
end
diff --git a/spec/controllers/jasmine_fixtures/people_spec.rb b/spec/controllers/jasmine_fixtures/people_spec.rb
index eb387f06e..432ff5d5c 100644
--- a/spec/controllers/jasmine_fixtures/people_spec.rb
+++ b/spec/controllers/jasmine_fixtures/people_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require 'spec_helper'
-
describe PeopleController, :type => :controller do
describe '#index' do
before do
diff --git a/spec/controllers/jasmine_fixtures/photos_spec.rb b/spec/controllers/jasmine_fixtures/photos_spec.rb
index cde36c7b2..fd62b21a6 100644
--- a/spec/controllers/jasmine_fixtures/photos_spec.rb
+++ b/spec/controllers/jasmine_fixtures/photos_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require 'spec_helper'
-
describe PhotosController, :type => :controller do
before do
@alices_photo = alice.post(:photo, :user_file => uploaded_photo, :to => alice.aspects.first.id, :public => false)
diff --git a/spec/controllers/jasmine_fixtures/status_messages_spec.rb b/spec/controllers/jasmine_fixtures/status_messages_spec.rb
index 0787327ff..905a5137c 100644
--- a/spec/controllers/jasmine_fixtures/status_messages_spec.rb
+++ b/spec/controllers/jasmine_fixtures/status_messages_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require 'spec_helper'
-
describe StatusMessagesController, :type => :controller do
describe '#bookmarklet' do
before do
diff --git a/spec/controllers/jasmine_fixtures/streams_spec.rb b/spec/controllers/jasmine_fixtures/streams_spec.rb
index 485343c18..5447a5420 100644
--- a/spec/controllers/jasmine_fixtures/streams_spec.rb
+++ b/spec/controllers/jasmine_fixtures/streams_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require 'spec_helper'
-
describe StreamsController, :type => :controller do
describe '#multi' do
before do
diff --git a/spec/controllers/jasmine_fixtures/users_spec.rb b/spec/controllers/jasmine_fixtures/users_spec.rb
index 9eb2e17b9..54d624a77 100644
--- a/spec/controllers/jasmine_fixtures/users_spec.rb
+++ b/spec/controllers/jasmine_fixtures/users_spec.rb
@@ -1,5 +1,3 @@
-require "spec_helper"
-
describe UsersController, type: :controller do
before do
sign_in alice, scope: :user
diff --git a/spec/controllers/likes_controller_spec.rb b/spec/controllers/likes_controller_spec.rb
index 066bdc01a..2aa04680e 100644
--- a/spec/controllers/likes_controller_spec.rb
+++ b/spec/controllers/likes_controller_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require 'spec_helper'
-
describe LikesController, :type => :controller do
before do
@alices_aspect = alice.aspects.where(:name => "generic").first
@@ -101,12 +99,6 @@ describe LikesController, :type => :controller do
@message = alice.comment!(@message, "hey") if class_const == Comment
end
- it 'generates a jasmine fixture', :fixture => true do
- get :index, id_field => @message.id
-
- save_fixture(response.body, "ajax_likes_on_#{class_const.to_s.underscore}")
- end
-
it 'returns a 404 for a post not visible to the user' do
sign_in eve
expect{get :index, id_field => @message.id}.to raise_error(ActiveRecord::RecordNotFound)
diff --git a/spec/controllers/messages_controller_spec.rb b/spec/controllers/messages_controller_spec.rb
index 27e8bfe4f..7e753c4f0 100644
--- a/spec/controllers/messages_controller_spec.rb
+++ b/spec/controllers/messages_controller_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require 'spec_helper'
-
describe MessagesController, :type => :controller do
before do
sign_in(alice, scope: :user)
diff --git a/spec/controllers/node_info_controller_spec.rb b/spec/controllers/node_info_controller_spec.rb
index 106a5a1c8..be7ca72a5 100644
--- a/spec/controllers/node_info_controller_spec.rb
+++ b/spec/controllers/node_info_controller_spec.rb
@@ -1,5 +1,3 @@
-require "spec_helper"
-
describe NodeInfoController do
describe "#jrd" do
it "responds to JSON" do
diff --git a/spec/controllers/notifications_controller_spec.rb b/spec/controllers/notifications_controller_spec.rb
index b5e32bb9e..e64b45bb4 100644
--- a/spec/controllers/notifications_controller_spec.rb
+++ b/spec/controllers/notifications_controller_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require 'spec_helper'
-
describe NotificationsController, :type => :controller do
before do
sign_in alice, scope: :user
@@ -68,15 +66,24 @@ describe NotificationsController, :type => :controller do
expect(assigns[:notifications].count).to eq(1)
end
- it 'succeeds for notification dropdown' do
+ it "succeeds for notification dropdown" do
Timecop.travel(6.seconds.ago) do
@notification.touch
end
- get :index, :format => :json
+ 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)
+ response_json = JSON.parse(response.body)
+ note_html = Nokogiri::HTML(response_json["notification_list"][0]["also_commented"]["note_html"])
timeago_content = note_html.css("time")[0]["data-time-ago"]
+ expect(response_json["unread_count"]).to be(1)
+ expect(response_json["unread_count_by_type"]).to eq(
+ "also_commented" => 1,
+ "comment_on_post" => 0,
+ "liked" => 0,
+ "mentioned" => 0,
+ "reshared" => 0,
+ "started_sharing" => 0
+ )
expect(timeago_content).to include(@notification.updated_at.iso8601)
expect(response.body).to match(/note_html/)
end
diff --git a/spec/controllers/participations_controller_spec.rb b/spec/controllers/participations_controller_spec.rb
index 576c66a7c..f557188f1 100644
--- a/spec/controllers/participations_controller_spec.rb
+++ b/spec/controllers/participations_controller_spec.rb
@@ -1,5 +1,3 @@
-require 'spec_helper'
-
describe ParticipationsController, :type => :controller do
before do
allow(@controller).to receive(:current_user).and_return(alice)
diff --git a/spec/controllers/passwords_controller_spec.rb b/spec/controllers/passwords_controller_spec.rb
index 45a55e28b..31c3d3e73 100644
--- a/spec/controllers/passwords_controller_spec.rb
+++ b/spec/controllers/passwords_controller_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require "spec_helper"
-
describe Devise::PasswordsController, type: :controller do
before do
@request.env["devise.mapping"] = Devise.mappings[:user]
diff --git a/spec/controllers/people_controller_spec.rb b/spec/controllers/people_controller_spec.rb
index c35a6ce23..846244927 100644
--- a/spec/controllers/people_controller_spec.rb
+++ b/spec/controllers/people_controller_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require 'spec_helper'
-
describe PeopleController, :type => :controller do
include_context :gon
diff --git a/spec/controllers/photos_controller_spec.rb b/spec/controllers/photos_controller_spec.rb
index 5cad2566b..9b76fffe5 100644
--- a/spec/controllers/photos_controller_spec.rb
+++ b/spec/controllers/photos_controller_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require 'spec_helper'
-
describe PhotosController, :type => :controller do
before do
@alices_photo = alice.post(:photo, :user_file => uploaded_photo, :to => alice.aspects.first.id, :public => false)
diff --git a/spec/controllers/posts_controller_spec.rb b/spec/controllers/posts_controller_spec.rb
index 82464ad3a..7f2d9c9fb 100644
--- a/spec/controllers/posts_controller_spec.rb
+++ b/spec/controllers/posts_controller_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require "spec_helper"
-
describe PostsController, type: :controller do
let(:post) { alice.post(:status_message, text: "ohai", to: alice.aspects.first) }
diff --git a/spec/controllers/profiles_controller_spec.rb b/spec/controllers/profiles_controller_spec.rb
index 88b082d23..9a6a47e8e 100644
--- a/spec/controllers/profiles_controller_spec.rb
+++ b/spec/controllers/profiles_controller_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require 'spec_helper'
-
describe ProfilesController, :type => :controller do
before do
sign_in eve, scope: :user
diff --git a/spec/controllers/registrations_controller_spec.rb b/spec/controllers/registrations_controller_spec.rb
index 49e07fa19..d39edb683 100644
--- a/spec/controllers/registrations_controller_spec.rb
+++ b/spec/controllers/registrations_controller_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require "spec_helper"
-
describe RegistrationsController, type: :controller do
before do
request.env["devise.mapping"] = Devise.mappings[:user]
diff --git a/spec/controllers/report_controller_spec.rb b/spec/controllers/report_controller_spec.rb
index fc64d36dd..bb049243c 100644
--- a/spec/controllers/report_controller_spec.rb
+++ b/spec/controllers/report_controller_spec.rb
@@ -1,10 +1,7 @@
-
# 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 ReportController, type: :controller do
before do
sign_in alice
diff --git a/spec/controllers/reshares_controller_spec.rb b/spec/controllers/reshares_controller_spec.rb
index cc4b7e9ec..2dc48daca 100644
--- a/spec/controllers/reshares_controller_spec.rb
+++ b/spec/controllers/reshares_controller_spec.rb
@@ -1,5 +1,3 @@
-require 'spec_helper'
-
describe ResharesController, :type => :controller do
describe '#create' do
let(:post_request!) {
@@ -46,7 +44,7 @@ describe ResharesController, :type => :controller do
it 'doesn\'t allow the user to reshare the post again' do
post_request!
expect(response.code).to eq('422')
- expect(response.body.strip).to be_empty
+ expect(response.body).to eq(I18n.t("reshares.create.error"))
end
end
@@ -64,4 +62,44 @@ describe ResharesController, :type => :controller do
end
end
end
+
+ describe "#index" do
+ context "with a private post" do
+ before do
+ @alices_aspect = alice.aspects.where(name: "generic").first
+ @post = alice.post(:status_message, text: "hey", to: @alices_aspect.id)
+ end
+
+ it "returns a 404 for a post not visible to the user" do
+ sign_in(eve, scope: :user)
+ expect {
+ get :index, post_id: @post.id, format: :json
+ }.to raise_error(ActiveRecord::RecordNotFound)
+ end
+
+ it "returns an empty array for a post visible to the user" do
+ sign_in(bob, scope: :user)
+ get :index, post_id: @post.id, format: :json
+ expect(JSON.parse(response.body)).to eq([])
+ end
+ end
+
+ context "with a public post" do
+ before do
+ sign_in(alice, scope: :user)
+ @post = alice.post(:status_message, text: "hey", public: true)
+ end
+
+ it "returns an array of reshares for a post" do
+ bob.reshare!(@post)
+ get :index, post_id: @post.id, format: :json
+ expect(JSON.parse(response.body).map {|h| h["id"] }).to eq(@post.reshares.map(&:id))
+ end
+
+ it "returns an empty array for a post with no reshares" do
+ get :index, post_id: @post.id, format: :json
+ expect(JSON.parse(response.body)).to eq([])
+ end
+ end
+ end
end
diff --git a/spec/controllers/search_controller_spec.rb b/spec/controllers/search_controller_spec.rb
index 58a62ba71..ab90b253b 100644
--- a/spec/controllers/search_controller_spec.rb
+++ b/spec/controllers/search_controller_spec.rb
@@ -1,5 +1,3 @@
-require 'spec_helper'
-
describe SearchController, :type => :controller do
before do
@user = alice
@@ -8,9 +6,6 @@ describe SearchController, :type => :controller do
end
describe 'query is a person' do
- @lola = FactoryGirl.create(:person, :diaspora_handle => "lola@example.org",
- :profile => FactoryGirl.build(:profile, :first_name => "Lola",
- :last_name => "w", :searchable => false))
it 'goes to people index page' do
get :search, :q => 'eugene'
expect(response).to be_redirect
diff --git a/spec/controllers/services_controller_spec.rb b/spec/controllers/services_controller_spec.rb
index 5c0c2f51f..75cff3391 100644
--- a/spec/controllers/services_controller_spec.rb
+++ b/spec/controllers/services_controller_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require 'spec_helper'
-
describe ServicesController, :type => :controller do
let(:omniauth_auth) do
{ 'provider' => 'facebook',
diff --git a/spec/controllers/sessions_controller_spec.rb b/spec/controllers/sessions_controller_spec.rb
index 51e736183..55ae17bae 100644
--- a/spec/controllers/sessions_controller_spec.rb
+++ b/spec/controllers/sessions_controller_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require "spec_helper"
-
describe SessionsController, type: :controller do
let(:mock_access_token) { Object.new }
diff --git a/spec/controllers/share_visibilities_controller_spec.rb b/spec/controllers/share_visibilities_controller_spec.rb
index 6215de699..30c0151e9 100644
--- a/spec/controllers/share_visibilities_controller_spec.rb
+++ b/spec/controllers/share_visibilities_controller_spec.rb
@@ -2,37 +2,45 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require 'spec_helper'
-
describe ShareVisibilitiesController, :type => :controller do
before do
@status = alice.post(:status_message, :text => "hello", :to => alice.aspects.first)
- sign_in(bob, scope: :user)
end
describe '#update' do
context "on a post you can see" do
+ before do
+ sign_in(bob, scope: :user)
+ end
+
it 'succeeds' do
put :update, :format => :js, :id => 42, :post_id => @status.id
expect(response).to be_success
end
it 'it calls toggle_hidden_shareable' do
- expect(@controller.current_user).to receive(:toggle_hidden_shareable).with(an_instance_of(Post))
+ expect(@controller.current_user).to receive(:toggle_hidden_shareable).with(an_instance_of(StatusMessage))
put :update, :format => :js, :id => 42, :post_id => @status.id
end
end
- end
-
- describe "#accessible_post" do
- it "memoizes a query for a post given a post_id param" do
- id = 1
- @controller.params[:post_id] = id
- @controller.params[:shareable_type] = 'Post'
- expect(Post).to receive(:where).with(hash_including(:id => id)).once.and_return(double.as_null_object)
- 2.times do |n|
- @controller.send(:accessible_post)
+ context "on a post you can't see" do
+ before do
+ sign_in(eve, scope: :user)
+ end
+
+ it "raises an error" do
+ expect {
+ put :update, format: :js, id: 42, post_id: @status.id
+ }.to raise_error ActiveRecord::RecordNotFound
+ end
+
+ it "it doesn't call toggle_hidden_shareable" do
+ expect(@controller.current_user).not_to receive(:toggle_hidden_shareable).with(an_instance_of(StatusMessage))
+ begin
+ put :update, format: :js, id: 42, post_id: @status.id
+ rescue ActiveRecord::RecordNotFound
+ end
end
end
end
diff --git a/spec/controllers/social_relay_controller_spec.rb b/spec/controllers/social_relay_controller_spec.rb
index 9b2f10be7..1949eb0c7 100644
--- a/spec/controllers/social_relay_controller_spec.rb
+++ b/spec/controllers/social_relay_controller_spec.rb
@@ -1,5 +1,3 @@
-require "spec_helper"
-
describe SocialRelayController, type: :controller do
describe "#well_known" do
it "responds to format json" do
diff --git a/spec/controllers/status_messages_controller_spec.rb b/spec/controllers/status_messages_controller_spec.rb
index 0c5ad604e..62fba474c 100644
--- a/spec/controllers/status_messages_controller_spec.rb
+++ b/spec/controllers/status_messages_controller_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require 'spec_helper'
-
describe StatusMessagesController, :type => :controller do
before do
@aspect1 = alice.aspects.first
diff --git a/spec/controllers/streams_controller_spec.rb b/spec/controllers/streams_controller_spec.rb
index 9aeb5f319..e7114cb1f 100644
--- a/spec/controllers/streams_controller_spec.rb
+++ b/spec/controllers/streams_controller_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require 'spec_helper'
-
describe StreamsController, :type => :controller do
before do
sign_in alice
diff --git a/spec/controllers/tag_followings_controller_spec.rb b/spec/controllers/tag_followings_controller_spec.rb
index 46546dd22..6ee1b138b 100644
--- a/spec/controllers/tag_followings_controller_spec.rb
+++ b/spec/controllers/tag_followings_controller_spec.rb
@@ -1,5 +1,3 @@
-require "spec_helper"
-
describe TagFollowingsController, type: :controller do
describe "#manage" do
context "not signed in" do
diff --git a/spec/controllers/tags_controller_spec.rb b/spec/controllers/tags_controller_spec.rb
index 3d60feb2e..3b49bccbc 100644
--- a/spec/controllers/tags_controller_spec.rb
+++ b/spec/controllers/tags_controller_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require 'spec_helper'
-
describe TagsController, :type => :controller do
describe '#index (search)' do
before do
diff --git a/spec/controllers/terms_controller_spec.rb b/spec/controllers/terms_controller_spec.rb
index 78eb0f048..ea948a153 100644
--- a/spec/controllers/terms_controller_spec.rb
+++ b/spec/controllers/terms_controller_spec.rb
@@ -1,5 +1,3 @@
-require "spec_helper"
-
describe TermsController, type: :controller do
describe "#index" do
it "succeeds" do
diff --git a/spec/controllers/users_controller_spec.rb b/spec/controllers/users_controller_spec.rb
index c73872d10..a80f9f37e 100644
--- a/spec/controllers/users_controller_spec.rb
+++ b/spec/controllers/users_controller_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require 'spec_helper'
-
describe UsersController, :type => :controller do
include_context :gon
@@ -242,11 +240,11 @@ describe UsersController, :type => :controller do
expect(assigns[:email_prefs]['mentioned']).to be false
end
- it 'does allow token auth' do
+ it "does not allow token auth" do
sign_out :user
bob.reset_authentication_token!
get :edit, :auth_token => bob.authentication_token
- expect(response.status).to eq(200)
+ expect(response).to redirect_to new_user_session_path
end
end
diff --git a/spec/federation_callbacks_spec.rb b/spec/federation_callbacks_spec.rb
index 349492713..253484ded 100644
--- a/spec/federation_callbacks_spec.rb
+++ b/spec/federation_callbacks_spec.rb
@@ -1,4 +1,3 @@
-require "spec_helper"
require "diaspora_federation/test"
describe "diaspora federation callbacks" do
@@ -338,7 +337,7 @@ describe "diaspora federation callbacks" do
describe ":receive_entity" do
it "receives an AccountDeletion" do
- account_deletion = FactoryGirl.build(:account_deletion_entity)
+ account_deletion = FactoryGirl.build(:account_deletion_entity, author: remote_person.diaspora_handle)
expect(Diaspora::Federation::Receive).to receive(:account_deletion).with(account_deletion)
expect(Workers::ReceiveLocal).not_to receive(:perform_async)
@@ -347,7 +346,7 @@ describe "diaspora federation callbacks" do
end
it "receives a Retraction" do
- retraction = FactoryGirl.build(:retraction_entity)
+ retraction = FactoryGirl.build(:retraction_entity, author: remote_person.diaspora_handle)
expect(Diaspora::Federation::Receive).to receive(:retraction).with(retraction, 42)
expect(Workers::ReceiveLocal).not_to receive(:perform_async)
@@ -356,7 +355,7 @@ describe "diaspora federation callbacks" do
end
it "receives a entity" do
- received = FactoryGirl.build(:status_message_entity)
+ received = FactoryGirl.build(:status_message_entity, author: remote_person.diaspora_handle)
persisted = FactoryGirl.create(:status_message)
expect(Diaspora::Federation::Receive).to receive(:perform).with(received).and_return(persisted)
@@ -365,8 +364,20 @@ describe "diaspora federation callbacks" do
DiasporaFederation.callbacks.trigger(:receive_entity, received, received.author, nil)
end
+ it "calls schedule_check_if_needed on the senders pod" do
+ received = FactoryGirl.build(:status_message_entity, author: remote_person.diaspora_handle)
+ persisted = FactoryGirl.create(:status_message)
+
+ expect(Person).to receive(:by_account_identifier).with(received.author).and_return(remote_person)
+ expect(remote_person.pod).to receive(:schedule_check_if_needed)
+ expect(Diaspora::Federation::Receive).to receive(:perform).with(received).and_return(persisted)
+ expect(Workers::ReceiveLocal).to receive(:perform_async).with(persisted.class.to_s, persisted.id, [])
+
+ DiasporaFederation.callbacks.trigger(:receive_entity, received, received.author, nil)
+ end
+
it "receives a entity for a recipient" do
- received = FactoryGirl.build(:status_message_entity)
+ received = FactoryGirl.build(:status_message_entity, author: remote_person.diaspora_handle)
persisted = FactoryGirl.create(:status_message)
expect(Diaspora::Federation::Receive).to receive(:perform).with(received).and_return(persisted)
@@ -376,7 +387,7 @@ describe "diaspora federation callbacks" do
end
it "does not trigger a ReceiveLocal job if Receive.perform returned nil" do
- received = FactoryGirl.build(:status_message_entity)
+ received = FactoryGirl.build(:status_message_entity, author: remote_person.diaspora_handle)
expect(Diaspora::Federation::Receive).to receive(:perform).with(received).and_return(nil)
expect(Workers::ReceiveLocal).not_to receive(:perform_async)
diff --git a/spec/helpers/application_helper_spec.rb b/spec/helpers/application_helper_spec.rb
index 4c3ec1023..84bc7cc35 100644
--- a/spec/helpers/application_helper_spec.rb
+++ b/spec/helpers/application_helper_spec.rb
@@ -2,32 +2,12 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require 'spec_helper'
-
describe ApplicationHelper, :type => :helper do
before do
@user = alice
@person = FactoryGirl.create(:person)
end
- describe "#contacts_link" do
- before do
- def current_user
- @current_user
- end
- end
-
- it 'links to community spotlight' do
- @current_user = FactoryGirl.create(:user)
- expect(contacts_link).to eq(community_spotlight_path)
- end
-
- it 'links to contacts#index' do
- @current_user = alice
- expect(contacts_link).to eq(contacts_path)
- end
- end
-
describe "#all_services_connected?" do
before do
AppConfig.configured_services = [1, 2, 3]
@@ -89,15 +69,29 @@ describe ApplicationHelper, :type => :helper do
end
describe "#changelog_url" do
+ let(:changelog_url_setting) {
+ double.tap {|double| allow(AppConfig).to receive(:settings).and_return(double(changelog_url: double)) }
+ }
+
it "defaults to master branch changleog" do
+ expect(changelog_url_setting).to receive(:present?).and_return(false)
expect(AppConfig).to receive(:git_revision).and_return(nil)
expect(changelog_url).to eq("https://github.com/diaspora/diaspora/blob/master/Changelog.md")
end
it "displays the changelog for the current git revision if set" do
+ expect(changelog_url_setting).to receive(:present?).and_return(false)
expect(AppConfig).to receive(:git_revision).twice.and_return("123")
expect(changelog_url).to eq("https://github.com/diaspora/diaspora/blob/123/Changelog.md")
end
+
+ it "displays the configured changelog url if set" do
+ expect(changelog_url_setting).to receive(:present?).and_return(true)
+ expect(changelog_url_setting).to receive(:get)
+ .and_return("https://github.com/diaspora/diaspora/blob/develop/Changelog.md")
+ expect(AppConfig).not_to receive(:git_revision)
+ expect(changelog_url).to eq("https://github.com/diaspora/diaspora/blob/develop/Changelog.md")
+ end
end
describe '#pod_name' do
diff --git a/spec/helpers/conversations_helper_spec.rb b/spec/helpers/conversations_helper_spec.rb
index fafde29bf..24768fe7a 100644
--- a/spec/helpers/conversations_helper_spec.rb
+++ b/spec/helpers/conversations_helper_spec.rb
@@ -1,5 +1,3 @@
-require 'spec_helper'
-
describe ConversationsHelper, :type => :helper do
before do
@conversation = FactoryGirl.create(:conversation)
diff --git a/spec/helpers/getting_started_helper_spec.rb b/spec/helpers/getting_started_helper_spec.rb
index fea1fcf89..7b89fbe24 100644
--- a/spec/helpers/getting_started_helper_spec.rb
+++ b/spec/helpers/getting_started_helper_spec.rb
@@ -1,7 +1,6 @@
# 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 GettingStartedHelper, :type => :helper do
before do
diff --git a/spec/helpers/gon_helper_spec.rb b/spec/helpers/gon_helper_spec.rb
index c449c9126..e09712242 100644
--- a/spec/helpers/gon_helper_spec.rb
+++ b/spec/helpers/gon_helper_spec.rb
@@ -1,5 +1,3 @@
-require "spec_helper"
-
describe GonHelper, type: :helper do
include_context :gon
diff --git a/spec/helpers/interim_stream_hackiness_helper_spec.rb b/spec/helpers/interim_stream_hackiness_helper_spec.rb
index 31fcfc2e9..fe6b787b2 100644
--- a/spec/helpers/interim_stream_hackiness_helper_spec.rb
+++ b/spec/helpers/interim_stream_hackiness_helper_spec.rb
@@ -1,5 +1,3 @@
-require 'spec_helper'
-
describe InterimStreamHackinessHelper, type: :helper do
describe "commenting_disabled?" do
include Devise::Test::ControllerHelpers
diff --git a/spec/helpers/jsxc_helper_spec.rb b/spec/helpers/jsxc_helper_spec.rb
index abbf5e0b3..18bdb4daa 100644
--- a/spec/helpers/jsxc_helper_spec.rb
+++ b/spec/helpers/jsxc_helper_spec.rb
@@ -1,5 +1,3 @@
-require 'spec_helper'
-
describe JsxcHelper, :type => :helper do
before do
AppConfig.chat.server.bosh.port = 1234
diff --git a/spec/helpers/language_helper_spec.rb b/spec/helpers/language_helper_spec.rb
index 73d4df5f8..3b0e9431a 100644
--- a/spec/helpers/language_helper_spec.rb
+++ b/spec/helpers/language_helper_spec.rb
@@ -1,5 +1,3 @@
-require "spec_helper"
-
describe LanguageHelper, type: :helper do
describe "#get_javascript_strings_for" do
it "generates a jasmine fixture", fixture: true do
diff --git a/spec/helpers/layout_helper_spec.rb b/spec/helpers/layout_helper_spec.rb
index 8810e9ee3..153797769 100644
--- a/spec/helpers/layout_helper_spec.rb
+++ b/spec/helpers/layout_helper_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require 'spec_helper'
-
describe LayoutHelper, :type => :helper do
describe "#page_title" do
context "passed blank text" do
diff --git a/spec/helpers/meta_data_helper_spec.rb b/spec/helpers/meta_data_helper_spec.rb
index 7564dd04a..998d35721 100644
--- a/spec/helpers/meta_data_helper_spec.rb
+++ b/spec/helpers/meta_data_helper_spec.rb
@@ -1,5 +1,3 @@
-require "spec_helper"
-
describe MetaDataHelper, type: :helper do
describe "#meta_tag" do
it "returns an empty string if passed an empty hash" do
diff --git a/spec/helpers/notifications_helper_spec.rb b/spec/helpers/notifications_helper_spec.rb
index daf579b3c..7f5f2e601 100644
--- a/spec/helpers/notifications_helper_spec.rb
+++ b/spec/helpers/notifications_helper_spec.rb
@@ -1,5 +1,3 @@
-require "spec_helper"
-
describe NotificationsHelper, type: :helper do
include ApplicationHelper
diff --git a/spec/helpers/notifier_helper_spec.rb b/spec/helpers/notifier_helper_spec.rb
index 0ff872da2..ca8a31934 100644
--- a/spec/helpers/notifier_helper_spec.rb
+++ b/spec/helpers/notifier_helper_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require 'spec_helper'
-
describe NotifierHelper, :type => :helper do
describe '#post_message' do
before do
diff --git a/spec/helpers/o_embed_helper_spec.rb b/spec/helpers/o_embed_helper_spec.rb
index 306860ebf..c36759026 100644
--- a/spec/helpers/o_embed_helper_spec.rb
+++ b/spec/helpers/o_embed_helper_spec.rb
@@ -1,5 +1,3 @@
-require 'spec_helper'
-
describe OEmbedHelper, :type => :helper do
describe 'o_embed_html' do
scenarios = {
diff --git a/spec/helpers/open_graph_helper_spec.rb b/spec/helpers/open_graph_helper_spec.rb
index f72796151..7962781e7 100644
--- a/spec/helpers/open_graph_helper_spec.rb
+++ b/spec/helpers/open_graph_helper_spec.rb
@@ -1,5 +1,3 @@
-require 'spec_helper'
-
describe OpenGraphHelper, :type => :helper do
describe 'og_html' do
diff --git a/spec/helpers/people_helper_spec.rb b/spec/helpers/people_helper_spec.rb
index d650a8714..866b56fd0 100644
--- a/spec/helpers/people_helper_spec.rb
+++ b/spec/helpers/people_helper_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require 'spec_helper'
-
describe PeopleHelper, :type => :helper do
before do
@user = alice
diff --git a/spec/helpers/posts_helper_spec.rb b/spec/helpers/posts_helper_spec.rb
index a6ca72c07..d10e529e4 100644
--- a/spec/helpers/posts_helper_spec.rb
+++ b/spec/helpers/posts_helper_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require 'spec_helper'
-
describe PostsHelper, :type => :helper do
describe '#post_page_title' do
diff --git a/spec/helpers/report_helper_spec.rb b/spec/helpers/report_helper_spec.rb
index 0eb854639..f044c0364 100644
--- a/spec/helpers/report_helper_spec.rb
+++ b/spec/helpers/report_helper_spec.rb
@@ -1,5 +1,3 @@
-require "spec_helper"
-
describe ReportHelper, type: :helper do
before do
@user = bob
diff --git a/spec/helpers/stream_helper_spec.rb b/spec/helpers/stream_helper_spec.rb
index 7705409b3..05d975321 100644
--- a/spec/helpers/stream_helper_spec.rb
+++ b/spec/helpers/stream_helper_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require "spec_helper"
-
describe StreamHelper, type: :helper do
describe "next_page_path" do
def build_controller controller_class
@@ -41,6 +39,20 @@ describe StreamHelper, type: :helper do
expect(helper.next_page_path).to include activity_stream_path
end
+ it "works for commented page when current page is commented stream" do
+ allow(helper).to receive(:current_page?).and_return(false)
+ expect(helper).to receive(:current_page?).with(:commented_stream).and_return(true)
+ allow(helper).to receive(:controller).and_return(build_controller(StreamsController))
+ expect(helper.next_page_path).to include commented_stream_path
+ end
+
+ it "works for liked page when current page is liked stream" do
+ allow(helper).to receive(:current_page?).and_return(false)
+ expect(helper).to receive(:current_page?).with(:liked_stream).and_return(true)
+ allow(helper).to receive(:controller).and_return(build_controller(StreamsController))
+ expect(helper.next_page_path).to include liked_stream_path
+ end
+
it "works for mentioned page when current page is mentioned stream" do
allow(helper).to receive(:current_page?).and_return(false)
expect(helper).to receive(:current_page?).with(:mentioned_stream).and_return(true)
diff --git a/spec/helpers/tags_helper_spec.rb b/spec/helpers/tags_helper_spec.rb
index 748d591d8..7667ea1bf 100644
--- a/spec/helpers/tags_helper_spec.rb
+++ b/spec/helpers/tags_helper_spec.rb
@@ -1,5 +1,3 @@
-require 'spec_helper'
-
describe TagsHelper, :type => :helper do
describe '#looking_for_tag_link' do
it 'returns nil if there is a @ in the query' do
diff --git a/spec/helpers/users_helper_spec.rb b/spec/helpers/users_helper_spec.rb
index c67789bf6..aa5a83a5f 100644
--- a/spec/helpers/users_helper_spec.rb
+++ b/spec/helpers/users_helper_spec.rb
@@ -1,5 +1,3 @@
-require "spec_helper"
-
describe UsersHelper, type: :helper do
include Devise::Test::ControllerHelpers
diff --git a/spec/integration/account_deletion_spec.rb b/spec/integration/account_deletion_spec.rb
index abe3c4db2..dfe3ee7c0 100644
--- a/spec/integration/account_deletion_spec.rb
+++ b/spec/integration/account_deletion_spec.rb
@@ -1,5 +1,3 @@
-require "spec_helper"
-
describe "deleteing your account", type: :request do
context "user" do
before do
diff --git a/spec/integration/api/user_info_controller_spec.rb b/spec/integration/api/user_info_controller_spec.rb
index 1f237a172..eaff50459 100644
--- a/spec/integration/api/user_info_controller_spec.rb
+++ b/spec/integration/api/user_info_controller_spec.rb
@@ -1,4 +1,3 @@
-require "spec_helper"
describe Api::OpenidConnect::UserInfoController do
let!(:auth_with_read_and_ppid) { FactoryGirl.create(:auth_with_read_and_ppid) }
let!(:access_token_with_read) { auth_with_read_and_ppid.create_access_token.to_s }
diff --git a/spec/integration/application_spec.rb b/spec/integration/application_spec.rb
index 7f5527896..39c6c0d67 100644
--- a/spec/integration/application_spec.rb
+++ b/spec/integration/application_spec.rb
@@ -1,5 +1,3 @@
-require "spec_helper"
-
describe ApplicationController, type: :request do
describe "csrf token validation" do
context "without a current user" do
diff --git a/spec/integration/contact_deleting_spec.rb b/spec/integration/contact_deleting_spec.rb
index 255680d08..a08ead841 100644
--- a/spec/integration/contact_deleting_spec.rb
+++ b/spec/integration/contact_deleting_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require 'spec_helper'
-
describe 'disconnecting a contact', :type => :request do
it 'removes the aspect membership' do
@user = alice
diff --git a/spec/integration/contacts_spec.rb b/spec/integration/contacts_spec.rb
new file mode 100644
index 000000000..1af6ae508
--- /dev/null
+++ b/spec/integration/contacts_spec.rb
@@ -0,0 +1,73 @@
+describe ContactsController, type: :request do
+ describe "/contacts" do
+ context "user is signed in" do
+ before do
+ sign_in user
+ end
+
+ shared_examples_for "community spotlight information is not present on the page" do
+ it "does not display a community spotlight link" do
+ get "/contacts"
+
+ expect(response.status).to eq(200)
+ expect(response.body).to_not match(/a href="#{community_spotlight_path}"/)
+ end
+ end
+
+ context "user has no contacts" do
+ let!(:user) { FactoryGirl.create(:user) }
+
+ before do
+ expect(user.contacts.size).to eq(0)
+ end
+
+ context "community spotlight is enabled" do
+ before do
+ AppConfig.settings.community_spotlight.enable = true
+ end
+
+ it "displays a community spotlight link" do
+ get "/contacts"
+
+ expect(response.status).to eq(200)
+ expect(response.body).to match(/a href="#{community_spotlight_path}"/)
+ end
+ end
+
+ context "community spotlight is disabled" do
+ before do
+ AppConfig.settings.community_spotlight.enable = false
+ end
+
+ it_behaves_like "community spotlight information is not present on the page"
+ end
+ end
+
+ context "user has contacts" do
+ let!(:user) { FactoryGirl.create(:user) }
+
+ before do
+ FactoryGirl.create(:contact, person: alice.person, user: user)
+ FactoryGirl.create(:contact, person: bob.person, user: user)
+ expect(user.reload.contacts.size).to eq(2)
+ end
+
+ context "community spotlight is enabled" do
+ before do
+ AppConfig.settings.community_spotlight.enable = true
+ end
+
+ it_behaves_like "community spotlight information is not present on the page"
+ end
+
+ context "community spotlight is disabled" do
+ before do
+ AppConfig.settings.community_spotlight.enable = false
+ end
+
+ it_behaves_like "community spotlight information is not present on the page"
+ end
+ end
+ end
+ end
+end
diff --git a/spec/integration/dispatching_spec.rb b/spec/integration/dispatching_spec.rb
index 2a18e8e09..58124de3a 100644
--- a/spec/integration/dispatching_spec.rb
+++ b/spec/integration/dispatching_spec.rb
@@ -1,5 +1,3 @@
-require "spec_helper"
-
describe "Dispatching", type: :request do
context "a comment retraction on a public post" do
it "triggers a public dispatch" do
diff --git a/spec/integration/federation/attack_vectors_spec.rb b/spec/integration/federation/attack_vectors_spec.rb
index 541de7de5..e345420ef 100644
--- a/spec/integration/federation/attack_vectors_spec.rb
+++ b/spec/integration/federation/attack_vectors_spec.rb
@@ -2,7 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require "spec_helper"
require "integration/federation/federation_helper"
describe "attack vectors", type: :request do
diff --git a/spec/integration/federation/receive_federation_messages_spec.rb b/spec/integration/federation/receive_federation_messages_spec.rb
index b0139b8d8..85a2b142d 100644
--- a/spec/integration/federation/receive_federation_messages_spec.rb
+++ b/spec/integration/federation/receive_federation_messages_spec.rb
@@ -1,4 +1,3 @@
-require "spec_helper"
require "integration/federation/federation_helper"
require "integration/federation/shared_receive_relayable"
require "integration/federation/shared_receive_retraction"
diff --git a/spec/integration/mentioning_spec.rb b/spec/integration/mentioning_spec.rb
index 78ee92404..8b8af8d0b 100644
--- a/spec/integration/mentioning_spec.rb
+++ b/spec/integration/mentioning_spec.rb
@@ -1,5 +1,3 @@
-require "spec_helper"
-
module MentioningSpecHelpers
def default_aspect
@user1.aspects.where(name: "generic").first
diff --git a/spec/integration/mobile_posts_spec.rb b/spec/integration/mobile_posts_spec.rb
index 54cc2e60c..1ffd10a79 100644
--- a/spec/integration/mobile_posts_spec.rb
+++ b/spec/integration/mobile_posts_spec.rb
@@ -1,5 +1,3 @@
-require "spec_helper"
-
describe PostsController, type: :request do
context "with a poll" do
let(:sm) { FactoryGirl.build(:status_message_with_poll, public: true) }
diff --git a/spec/integration/profile_spec.rb b/spec/integration/profile_spec.rb
index 1e61cdb12..36be045d6 100644
--- a/spec/integration/profile_spec.rb
+++ b/spec/integration/profile_spec.rb
@@ -1,5 +1,3 @@
-require "spec_helper"
-
describe PeopleController, type: :request do
context "for the current user" do
before do
diff --git a/spec/integration/receiving_spec.rb b/spec/integration/receiving_spec.rb
index c07a6d509..faa8ffb20 100644
--- a/spec/integration/receiving_spec.rb
+++ b/spec/integration/receiving_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require 'spec_helper'
-
describe 'a user receives a post', :type => :request do
before do
@alices_aspect = alice.aspects.where(:name => "generic").first
diff --git a/spec/integration/tag_people_spec.rb b/spec/integration/tag_people_spec.rb
index 9dc6db029..336b7acf0 100644
--- a/spec/integration/tag_people_spec.rb
+++ b/spec/integration/tag_people_spec.rb
@@ -1,5 +1,3 @@
-require 'spec_helper'
-
describe TagsController, :type => :request do
describe 'will_paginate people on the tag page' do
let(:people) { (1..2).map { FactoryGirl.create(:person) } }
diff --git a/spec/javascripts/app/app_spec.js b/spec/javascripts/app/app_spec.js
index 06f9a14b0..a1c987596 100644
--- a/spec/javascripts/app/app_spec.js
+++ b/spec/javascripts/app/app_spec.js
@@ -96,4 +96,39 @@ describe("app", function() {
expect(app._changeLocation).toHaveBeenCalledWith("/users/sign_in");
});
});
+
+ describe("setupBackboneLinks", function() {
+ it("calls Backbone.history.start", function() {
+ spyOn(Backbone.history, "start");
+ app.setupBackboneLinks();
+ expect(Backbone.history.start).toHaveBeenCalledWith({pushState: true});
+ });
+
+ context("when clicking a backbone link", function() {
+ beforeEach(function() {
+ app.stream = {basePath: function() { return "/stream"; }};
+ app.notificationsCollection = {fetch: $.noop};
+ spyOn(Backbone.history, "start");
+ this.link = $("<a href='/backbone-link' rel='backbone'>");
+ spec.content().append(this.link);
+ app.setupBackboneLinks();
+ });
+
+ afterEach(function() {
+ app.stream = undefined;
+ });
+
+ it("calls Backbone.history.navigate", function() {
+ spyOn(Backbone.history, "navigate");
+ this.link.click();
+ expect(Backbone.history.navigate).toHaveBeenCalledWith("backbone-link", true);
+ });
+
+ it("fetches new notifications", function() {
+ spyOn(app.notificationsCollection, "fetch");
+ this.link.click();
+ expect(app.notificationsCollection.fetch).toHaveBeenCalled();
+ });
+ });
+ });
});
diff --git a/spec/javascripts/app/collections/notifications_collection_spec.js b/spec/javascripts/app/collections/notifications_collection_spec.js
new file mode 100644
index 000000000..c6c8eeb7a
--- /dev/null
+++ b/spec/javascripts/app/collections/notifications_collection_spec.js
@@ -0,0 +1,251 @@
+describe("app.collections.Notifications", function() {
+ describe("initialize", function() {
+ it("calls fetch", function() {
+ spyOn(app.collections.Notifications.prototype, "fetch");
+ new app.collections.Notifications();
+ expect(app.collections.Notifications.prototype.fetch).toHaveBeenCalled();
+ });
+
+ it("calls Diaspora.BrowserNotification.requestPermission", function() {
+ spyOn(Diaspora.BrowserNotification, "requestPermission");
+ new app.collections.Notifications();
+ expect(Diaspora.BrowserNotification.requestPermission).toHaveBeenCalled();
+ });
+
+ it("initializes attributes", function() {
+ var target = new app.collections.Notifications();
+ expect(target.model).toBe(app.models.Notification);
+ /* eslint-disable camelcase */
+ expect(target.url).toBe(Routes.notifications({per_page: 10, page: 1}));
+ /* eslint-enable camelcase */
+ expect(target.page).toBe(2);
+ expect(target.perPage).toBe(5);
+ expect(target.unreadCount).toBe(0);
+ expect(target.unreadCountByType).toEqual({});
+ });
+
+ it("repeatedly calls pollNotifications", function() {
+ spyOn(app.collections.Notifications.prototype, "pollNotifications").and.callThrough();
+ var collection = new app.collections.Notifications();
+ expect(app.collections.Notifications.prototype.pollNotifications).not.toHaveBeenCalled();
+ jasmine.clock().tick(collection.timeout);
+ expect(app.collections.Notifications.prototype.pollNotifications).toHaveBeenCalledTimes(1);
+ jasmine.clock().tick(collection.timeout);
+ expect(app.collections.Notifications.prototype.pollNotifications).toHaveBeenCalledTimes(2);
+ });
+ });
+
+ describe("pollNotifications", function() {
+ beforeEach(function() {
+ this.target = new app.collections.Notifications();
+ });
+
+ it("calls fetch", function() {
+ spyOn(this.target, "fetch");
+ this.target.pollNotifications();
+ expect(this.target.fetch).toHaveBeenCalled();
+ });
+
+ it("doesn't call Diaspora.BrowserNotification.spawnNotification when there are no new notifications", function() {
+ spyOn(Diaspora.BrowserNotification, "spawnNotification");
+ this.target.pollNotifications();
+ this.target.trigger("finishedLoading");
+ expect(Diaspora.BrowserNotification.spawnNotification).not.toHaveBeenCalled();
+ });
+
+ it("calls Diaspora.BrowserNotification.spawnNotification when there are new notifications", function() {
+ spyOn(Diaspora.BrowserNotification, "spawnNotification");
+ spyOn(app.collections.Notifications.prototype, "fetch").and.callFake(function() {
+ this.target.unreadCount++;
+ }.bind(this));
+ this.target.pollNotifications();
+ this.target.trigger("finishedLoading");
+ expect(Diaspora.BrowserNotification.spawnNotification).toHaveBeenCalled();
+ });
+ });
+
+ describe("fetch", function() {
+ it("calls Backbone.Collection.prototype.fetch with correct parameters", function() {
+ var target = new app.collections.Notifications();
+ spyOn(Backbone.Collection.prototype, "fetch");
+ target.fetch({foo: "bar", remove: "bar", merge: "bar", parse: "bar"});
+ expect(Backbone.Collection.prototype.fetch.calls.mostRecent().args).toEqual([{
+ foo: "bar",
+ remove: false,
+ merge: true,
+ parse: true
+ }]);
+ });
+ });
+
+ describe("fetchMore", function() {
+ beforeEach(function() {
+ this.target = new app.collections.Notifications();
+ spyOn(app.collections.Notifications.prototype, "fetch");
+ });
+
+ it("fetches notifications when there are more notifications to be fetched", function() {
+ this.target.length = 15;
+ this.target.fetchMore();
+ /* eslint-disable camelcase */
+ var route = Routes.notifications({per_page: 5, page: 3});
+ /* eslint-enable camelcase */
+ expect(app.collections.Notifications.prototype.fetch).toHaveBeenCalledWith({url: route, pushBack: true});
+ expect(this.target.page).toBe(3);
+ });
+
+ it("doesn't fetch notifications when there are no more notifications to be fetched", function() {
+ this.target.length = 0;
+ this.target.fetchMore();
+ expect(app.collections.Notifications.prototype.fetch).not.toHaveBeenCalled();
+ expect(this.target.page).toBe(2);
+ });
+ });
+
+ describe("set", function() {
+ beforeEach(function() {
+ this.target = new app.collections.Notifications();
+ });
+
+ context("calls to Backbone.Collection.prototype.set", function() {
+ beforeEach(function() {
+ spyOn(Backbone.Collection.prototype, "set");
+ });
+
+ it("calls app.collections.Notifications.prototype.set", function() {
+ this.target.set([]);
+ expect(Backbone.Collection.prototype.set).toHaveBeenCalledWith([], {at: 0});
+ });
+
+ it("inserts the items at the beginning of the collection if option 'pushBack' is false", function() {
+ this.target.length = 15;
+ this.target.set([], {pushBack: false});
+ expect(Backbone.Collection.prototype.set).toHaveBeenCalledWith([], {pushBack: false, at: 0});
+ });
+
+ it("inserts the items at the end of the collection if option 'pushBack' is true", function() {
+ this.target.length = 15;
+ this.target.set([], {pushBack: true});
+ expect(Backbone.Collection.prototype.set).toHaveBeenCalledWith([], {pushBack: true, at: 15});
+ });
+ });
+
+ context("events", function() {
+ beforeEach(function() {
+ spyOn(Backbone.Collection.prototype, "set").and.callThrough();
+ spyOn(app.collections.Notifications.prototype, "trigger").and.callThrough();
+ this.model1 = new app.models.Notification({"reshared": {id: 1}, "type": "reshared"});
+ this.model2 = new app.models.Notification({"reshared": {id: 2}, "type": "reshared"});
+ this.model3 = new app.models.Notification({"reshared": {id: 3}, "type": "reshared"});
+ this.model4 = new app.models.Notification({"reshared": {id: 4}, "type": "reshared"});
+ });
+
+ it("triggers a 'pushFront' event for each model in reverse order when option 'pushBack' is false", function() {
+ this.target.set([this.model1, this.model2, this.model3, this.model4], {pushBack: false});
+
+ var calls = app.collections.Notifications.prototype.trigger.calls;
+
+ var index = calls.count() - 5;
+ expect(calls.argsFor(index)).toEqual(["pushFront", this.model4]);
+ expect(calls.argsFor(index + 1)).toEqual(["pushFront", this.model3]);
+ expect(calls.argsFor(index + 2)).toEqual(["pushFront", this.model2]);
+ expect(calls.argsFor(index + 3)).toEqual(["pushFront", this.model1]);
+ });
+
+ it("triggers a 'pushBack' event for each model in normal order when option 'pushBack' is true", function() {
+ this.target.set([this.model1, this.model2, this.model3, this.model4], {pushBack: true});
+
+ var calls = app.collections.Notifications.prototype.trigger.calls;
+
+ var index = calls.count() - 5;
+ expect(calls.argsFor(index)).toEqual(["pushBack", this.model1]);
+ expect(calls.argsFor(index + 1)).toEqual(["pushBack", this.model2]);
+ expect(calls.argsFor(index + 2)).toEqual(["pushBack", this.model3]);
+ expect(calls.argsFor(index + 3)).toEqual(["pushBack", this.model4]);
+ });
+
+ it("triggers a 'finishedLoading' event at the end of the process", function() {
+ this.target.set([]);
+ expect(app.collections.Notifications.prototype.trigger).toHaveBeenCalledWith("finishedLoading");
+ });
+ });
+ });
+
+ describe("parse", function() {
+ beforeEach(function() {
+ this.target = new app.collections.Notifications();
+ });
+
+ it("sets the unreadCount and unreadCountByType attributes", function() {
+ expect(this.target.unreadCount).toBe(0);
+ expect(this.target.unreadCountByType).toEqual({});
+
+ /* eslint-disable camelcase */
+ this.target.parse({
+ unread_count: 15,
+ unread_count_by_type: {reshared: 6},
+ notification_list: []
+ });
+ /* eslint-enable camelcase */
+
+ expect(this.target.unreadCount).toBe(15);
+ expect(this.target.unreadCountByType).toEqual({reshared: 6});
+ });
+
+ it("correctly parses the result", function() {
+ /* eslint-disable camelcase */
+ var parsed = this.target.parse({
+ unread_count: 15,
+ unread_count_by_type: {reshared: 6},
+ notification_list: [{"reshared": {id: 1}, "type": "reshared"}]
+ });
+ /* eslint-enable camelcase */
+
+ expect(parsed.length).toEqual(1);
+ });
+
+ it("correctly binds the change:unread event", function() {
+ spyOn(app.collections.Notifications.prototype, "onChangedUnreadStatus");
+
+ /* eslint-disable camelcase */
+ var parsed = this.target.parse({
+ unread_count: 15,
+ unread_count_by_type: {reshared: 6},
+ notification_list: [{"reshared": {id: 1}, "type": "reshared"}]
+ });
+ /* eslint-enable camelcase */
+
+ parsed[0].set("unread", true);
+
+ expect(app.collections.Notifications.prototype.onChangedUnreadStatus).toHaveBeenCalled();
+ });
+ });
+
+ describe("onChangedUnreadStatus", function() {
+ it("increases the unread counts when model's unread attribute is true", function() {
+ var target = new app.collections.Notifications();
+ var model = new app.models.Notification({"reshared": {id: 1, unread: true}, "type": "reshared"});
+
+ target.unreadCount = 15;
+ target.unreadCountByType.reshared = 6;
+
+ target.onChangedUnreadStatus(model);
+
+ expect(target.unreadCount).toBe(16);
+ expect(target.unreadCountByType.reshared).toBe(7);
+ });
+
+ it("decreases the unread counts when model's unread attribute is false", function() {
+ var target = new app.collections.Notifications();
+ var model = new app.models.Notification({"reshared": {id: 1, unread: false}, "type": "reshared"});
+
+ target.unreadCount = 15;
+ target.unreadCountByType.reshared = 6;
+
+ target.onChangedUnreadStatus(model);
+
+ expect(target.unreadCount).toBe(14);
+ expect(target.unreadCountByType.reshared).toBe(5);
+ });
+ });
+});
diff --git a/spec/javascripts/app/models/notification_spec.js b/spec/javascripts/app/models/notification_spec.js
new file mode 100644
index 000000000..d405c34ec
--- /dev/null
+++ b/spec/javascripts/app/models/notification_spec.js
@@ -0,0 +1,85 @@
+describe("app.models.Notification", function() {
+ beforeEach(function() {
+ this.model = new app.models.Notification({
+ "reshared": {},
+ "type": "reshared"
+ });
+ });
+
+ describe("constructor", function() {
+ it("calls parent constructor with the correct parameters", function() {
+ spyOn(Backbone, "Model").and.callThrough();
+ new app.models.Notification({attribute: "attribute"}, {option: "option"});
+ expect(Backbone.Model).toHaveBeenCalledWith(
+ {attribute: "attribute"},
+ {option: "option", parse: true}
+ );
+ });
+ });
+
+ describe("parse", function() {
+ it("correctly parses the object", function() {
+ var parsed = this.model.parse({
+ "reshared": {
+ "id": 45,
+ "target_type": "Post",
+ "target_id": 11,
+ "recipient_id": 1,
+ "unread": true,
+ "created_at": "2015-10-27T19:56:30.000Z",
+ "updated_at": "2015-10-27T19:56:30.000Z",
+ "note_html": "<html/>"
+ },
+ "type": "reshared"
+ });
+
+ expect(parsed).toEqual({
+ "type": "reshared",
+ "id": 45,
+ "target_type": "Post",
+ "target_id": 11,
+ "recipient_id": 1,
+ "unread": true,
+ "created_at": "2015-10-27T19:56:30.000Z",
+ "updated_at": "2015-10-27T19:56:30.000Z",
+ "note_html": "<html/>"
+ });
+ });
+ });
+
+ describe("setRead", function() {
+ it("calls setUnreadStatus with 'false'", function() {
+ spyOn(app.models.Notification.prototype, "setUnreadStatus");
+ new app.models.Notification({"reshared": {}, "type": "reshared"}).setRead();
+ expect(app.models.Notification.prototype.setUnreadStatus).toHaveBeenCalledWith(false);
+ });
+ });
+
+ describe("setUnread", function() {
+ it("calls setUnreadStatus with 'true'", function() {
+ spyOn(app.models.Notification.prototype, "setUnreadStatus");
+ new app.models.Notification({"reshared": {}, "type": "reshared"}).setUnread();
+ expect(app.models.Notification.prototype.setUnreadStatus).toHaveBeenCalledWith(true);
+ });
+ });
+
+ describe("setUnreadStatus", function() {
+ beforeEach(function() {
+ this.target = new app.models.Notification({"reshared": {id: 16}, "type": "reshared"});
+ spyOn(app.models.Notification.prototype, "set").and.callThrough();
+ });
+
+ it("calls calls ajax with correct parameters and sets 'unread' attribute", function() {
+ this.target.setUnreadStatus(true);
+ jasmine.Ajax.requests.mostRecent().respondWith({status: 200, responseText: '{"guid": 16, "unread": true}'});
+ var call = jasmine.Ajax.requests.mostRecent();
+
+ expect(call.url).toBe("/notifications/16");
+ /* eslint-disable camelcase */
+ expect(call.params).toEqual("set_unread=true");
+ /* eslint-enable camelcase */
+ expect(call.method).toEqual("PUT");
+ expect(app.models.Notification.prototype.set).toHaveBeenCalledWith("unread", true);
+ });
+ });
+});
diff --git a/spec/javascripts/app/models/post/interacations_spec.js b/spec/javascripts/app/models/post/interacations_spec.js
index 6b2b66e37..019ca307a 100644
--- a/spec/javascripts/app/models/post/interacations_spec.js
+++ b/spec/javascripts/app/models/post/interacations_spec.js
@@ -6,6 +6,8 @@ describe("app.models.Post.Interactions", function(){
this.interactions = this.post.interactions;
this.author = factory.author({guid: "loggedInAsARockstar"});
loginAs({guid: "loggedInAsARockstar"});
+ spec.content().append($("<div id='flash-container'>"));
+ app.flashMessages = new app.views.FlashMessages({el: spec.content().find("#flash-container")});
this.userLike = new app.models.Like({author : this.author});
});
@@ -40,6 +42,23 @@ describe("app.models.Post.Interactions", function(){
jasmine.Ajax.requests.mostRecent().respondWith(ajaxSuccess);
expect(this.post.get("participation")).toBeTruthy();
});
+
+ it("triggers a change on the likes collection", function() {
+ spyOn(this.interactions.likes, "trigger");
+ this.interactions.like();
+ jasmine.Ajax.requests.mostRecent().respondWith(ajaxSuccess);
+ expect(this.interactions.likes.trigger).toHaveBeenCalledWith("change");
+ });
+
+ it("displays a flash message on errors", function() {
+ spyOn(app.flashMessages, "handleAjaxError").and.callThrough();
+ this.interactions.like();
+ jasmine.Ajax.requests.mostRecent().respondWith({status: 400, responseText: "error message"});
+
+ expect(app.flashMessages.handleAjaxError).toHaveBeenCalled();
+ expect(app.flashMessages.handleAjaxError.calls.argsFor(0)[0].responseText).toBe("error message");
+ expect(spec.content().find(".flash-message")).toBeErrorFlashMessage("error message");
+ });
});
describe("unlike", function(){
@@ -56,7 +75,7 @@ describe("app.models.Post.Interactions", function(){
this.reshare = this.interactions.post.reshare();
});
- it("triggers a change on the model", function() {
+ it("triggers a change on the interactions model", function() {
spyOn(this.interactions, "trigger");
this.interactions.reshare();
@@ -65,6 +84,13 @@ describe("app.models.Post.Interactions", function(){
expect(this.interactions.trigger).toHaveBeenCalledWith("change");
});
+ it("triggers a change on the reshares collection", function() {
+ spyOn(this.interactions.reshares, "trigger");
+ this.interactions.reshare();
+ jasmine.Ajax.requests.mostRecent().respondWith(ajaxSuccess);
+ expect(this.interactions.reshares.trigger).toHaveBeenCalledWith("change");
+ });
+
it("adds the reshare to the default, activity and aspects stream", function() {
app.stream = { addNow: $.noop };
spyOn(app.stream, "addNow");
@@ -96,6 +122,16 @@ describe("app.models.Post.Interactions", function(){
jasmine.Ajax.requests.mostRecent().respondWith(ajaxSuccess);
expect(this.post.get("participation")).toBeTruthy();
});
+
+ it("displays a flash message on errors", function() {
+ spyOn(app.flashMessages, "handleAjaxError").and.callThrough();
+ this.interactions.reshare();
+ jasmine.Ajax.requests.mostRecent().respondWith({status: 400, responseText: "error message"});
+
+ expect(app.flashMessages.handleAjaxError).toHaveBeenCalled();
+ expect(app.flashMessages.handleAjaxError.calls.argsFor(0)[0].responseText).toBe("error message");
+ expect(spec.content().find(".flash-message")).toBeErrorFlashMessage("error message");
+ });
});
describe("userLike", function(){
@@ -184,4 +220,82 @@ describe("app.models.Post.Interactions", function(){
expect(this.interactions.userReshare()).toBeTruthy();
});
});
+
+ describe("comment", function() {
+ it("calls make on the comments collection", function() {
+ spyOn(this.interactions.comments, "make").and.callThrough();
+ this.interactions.comment("text");
+ expect(this.interactions.comments.make).toHaveBeenCalledWith("text");
+ });
+
+ context("on success", function() {
+ it("sets the participation flag for the post", function() {
+ expect(this.post.get("participation")).toBeFalsy();
+ this.interactions.comment("text");
+ jasmine.Ajax.requests.mostRecent().respondWith(ajaxSuccess);
+ expect(this.post.get("participation")).toBeTruthy();
+ });
+
+ it("increases the comments count", function() {
+ var commentsCount = this.interactions.get("comments_count");
+ this.interactions.comment("text");
+ jasmine.Ajax.requests.mostRecent().respondWith(ajaxSuccess);
+ expect(this.interactions.get("comments_count")).toBe(commentsCount + 1);
+ });
+
+ it("triggers a change on the model", function() {
+ spyOn(this.interactions, "trigger");
+ this.interactions.comment("text");
+ jasmine.Ajax.requests.mostRecent().respondWith(ajaxSuccess);
+ expect(this.interactions.trigger).toHaveBeenCalledWith("change");
+ });
+
+ it("calls the success function if one is given", function() {
+ var success = jasmine.createSpy();
+ this.interactions.comment("text", {success: success});
+ jasmine.Ajax.requests.mostRecent().respondWith(ajaxSuccess);
+ expect(success).toHaveBeenCalled();
+ });
+ });
+
+ context("on error", function() {
+ it("doesn't set the participation flag for the post", function() {
+ expect(this.post.get("participation")).toBeFalsy();
+ this.interactions.comment("text");
+ jasmine.Ajax.requests.mostRecent().respondWith({status: 400});
+ expect(this.post.get("participation")).toBeFalsy();
+ });
+
+ it("doesn't increase the comments count", function() {
+ var commentsCount = this.interactions.get("comments_count");
+ this.interactions.comment("text");
+ jasmine.Ajax.requests.mostRecent().respondWith({status: 400});
+ expect(this.interactions.get("comments_count")).toBe(commentsCount);
+ });
+
+ it("doesn't trigger a change on the model", function() {
+ spyOn(this.interactions, "trigger");
+ this.interactions.comment("text");
+ jasmine.Ajax.requests.mostRecent().respondWith({status: 400});
+ expect(this.interactions.trigger).not.toHaveBeenCalledWith("change");
+ });
+
+ it("calls the error function if one is given", function() {
+ var error = jasmine.createSpy();
+ this.interactions.comment("text", {error: error});
+ jasmine.Ajax.requests.mostRecent().respondWith({status: 400});
+ expect(error).toHaveBeenCalled();
+ });
+
+ it("displays a flash message", function() {
+ spyOn(app.flashMessages, "handleAjaxError").and.callThrough();
+ this.interactions.comment("text");
+ jasmine.Ajax.requests.mostRecent().respondWith({status: 400, responseText: "error message"});
+
+ expect(app.flashMessages.handleAjaxError).toHaveBeenCalled();
+ expect(app.flashMessages.handleAjaxError.calls.argsFor(0)[0].responseText).toBe("error message");
+ expect(spec.content().find(".flash-message")).toBeErrorFlashMessage("error message");
+ });
+ });
+ });
});
diff --git a/spec/javascripts/app/pages/contacts_spec.js b/spec/javascripts/app/pages/contacts_spec.js
index a40b899d2..a1be4be48 100644
--- a/spec/javascripts/app/pages/contacts_spec.js
+++ b/spec/javascripts/app/pages/contacts_spec.js
@@ -277,4 +277,30 @@ describe("app.pages.Contacts", function(){
});
});
});
+
+ describe("showMessageModal", function() {
+ beforeEach(function() {
+ spec.content().append("<div id='conversationModal'/>");
+ });
+
+ it("calls app.helpers.showModal", function() {
+ spyOn(app.helpers, "showModal");
+ this.view.showMessageModal();
+ expect(app.helpers.showModal).toHaveBeenCalled();
+ });
+
+ it("initializes app.views.ConversationsForm with correct parameters when modal is loaded", function() {
+ gon.conversationPrefill = [
+ {id: 1, name: "diaspora user", handle: "diaspora-user@pod.tld"},
+ {id: 2, name: "other diaspora user", handle: "other-diaspora-user@pod.tld"},
+ {id: 3, name: "user@pod.tld", handle: "user@pod.tld"}
+ ];
+
+ spyOn(app.views.ConversationsForm.prototype, "initialize");
+ this.view.showMessageModal();
+ $("#conversationModal").trigger("modal:loaded");
+ expect(app.views.ConversationsForm.prototype.initialize)
+ .toHaveBeenCalledWith({prefill: gon.conversationPrefill});
+ });
+ });
});
diff --git a/spec/javascripts/app/views/aspect_membership_view_spec.js b/spec/javascripts/app/views/aspect_membership_view_spec.js
index 23766c7ab..db671ce6b 100644
--- a/spec/javascripts/app/views/aspect_membership_view_spec.js
+++ b/spec/javascripts/app/views/aspect_membership_view_spec.js
@@ -55,11 +55,13 @@ describe("app.views.AspectMembership", function(){
});
it('displays an error when it fails', function() {
+ spyOn(app.flashMessages, "handleAjaxError").and.callThrough();
this.newAspect.trigger('click');
jasmine.Ajax.requests.mostRecent().respondWith(resp_fail);
+ expect(app.flashMessages.handleAjaxError).toHaveBeenCalled();
+ expect(app.flashMessages.handleAjaxError.calls.argsFor(0)[0].responseText).toBe("error message");
expect(spec.content().find(".flash-message")).toBeErrorFlashMessage("error message");
- );
});
});
@@ -96,9 +98,12 @@ describe("app.views.AspectMembership", function(){
});
it('displays an error when it fails', function() {
+ spyOn(app.flashMessages, "handleAjaxError").and.callThrough();
this.oldAspect.trigger('click');
jasmine.Ajax.requests.mostRecent().respondWith(resp_fail);
+ expect(app.flashMessages.handleAjaxError).toHaveBeenCalled();
+ expect(app.flashMessages.handleAjaxError.calls.argsFor(0)[0].responseText).toBe("error message");
expect(spec.content().find(".flash-message")).toBeErrorFlashMessage("error message");
});
});
diff --git a/spec/javascripts/app/views/comment_stream_view_spec.js b/spec/javascripts/app/views/comment_stream_view_spec.js
index 0317f7f0b..ecac07333 100644
--- a/spec/javascripts/app/views/comment_stream_view_spec.js
+++ b/spec/javascripts/app/views/comment_stream_view_spec.js
@@ -21,6 +21,37 @@ describe("app.views.CommentStream", function(){
});
});
+ describe("postRenderTemplate", function() {
+ beforeEach(function() {
+ this.view.render();
+ });
+
+ it("calls appendComment for all comments in the collection", function() {
+ this.view.model.comments.push(factory.comment({id: 1}));
+ this.view.model.comments.push(factory.comment({id: 27}));
+ this.view.model.comments.push(factory.comment({id: 3}));
+ spyOn(this.view, "appendComment");
+ this.view.postRenderTemplate();
+ expect(this.view.appendComment.calls.allArgs().map(function(args) {
+ return args[0].get("id");
+ })).toEqual([1, 27, 3]);
+ });
+
+ it("sets commentBox", function() {
+ this.view.commentBox = undefined;
+ this.view.postRenderTemplate();
+ expect(this.view.commentBox).toBeDefined();
+ expect(this.view.commentBox).toEqual(this.view.$(".comment_box"));
+ });
+
+ it("sets commentSubmitButton", function() {
+ this.view.commentSubmitButton = undefined;
+ this.view.postRenderTemplate();
+ expect(this.view.commentSubmitButton).toBeDefined();
+ expect(this.view.commentSubmitButton).toEqual(this.view.$("input[name='commit']"));
+ });
+ });
+
describe("createComment", function() {
beforeEach(function() {
this.view.render();
@@ -29,6 +60,20 @@ describe("app.views.CommentStream", function(){
this.view.expandComments();
});
+ it("doesn't fire an AJAX request when there are only spaces in the comment box", function() {
+ this.view.commentBox.val(" ");
+ jasmine.Ajax.requests.reset();
+ this.view.createComment();
+ expect(jasmine.Ajax.requests.count()).toBe(0);
+ });
+
+ it("calls disableCommentBox", function() {
+ spyOn(this.view, "disableCommentBox");
+ this.view.commentBox.val("text");
+ this.view.createComment();
+ expect(this.view.disableCommentBox).toHaveBeenCalled();
+ });
+
context("submission", function() {
beforeEach(function() {
this.view.$(".comment_box").val('a new comment');
@@ -43,31 +88,83 @@ describe("app.views.CommentStream", function(){
expect(params.text).toEqual("a new comment");
});
- it("adds the comment to the view", function() {
- this.request.respondWith({status: 200, responseText: '[]'});
- expect(this.view.$(".comment-content p").text()).toEqual("a new comment");
+ context("on success", function() {
+ it("adds the comment to the view", function() {
+ this.request.respondWith({status: 200, responseText: "[]"});
+ expect(this.view.$(".comment-content p").text()).toEqual("a new comment");
+ });
+
+ it("resets the comment box value", function() {
+ this.request.respondWith({status: 200, responseText: "[]"});
+ expect(this.view.commentBox.val()).toBe("");
+ });
+
+ it("calls enableCommentBox", function() {
+ spyOn(this.view, "enableCommentBox");
+ this.request.respondWith({status: 200, responseText: "[]"});
+ expect(this.view.enableCommentBox).toHaveBeenCalled();
+ });
+
+ it("calls autosize.update for the commentBox", function() {
+ spyOn(autosize, "update");
+ this.request.respondWith({status: 200, responseText: "[]"});
+ expect(autosize.update).toHaveBeenCalledWith(this.view.commentBox);
+ });
});
- it("doesn't add the comment to the view, when the request fails", function(){
- this.request.respondWith({status: 500});
-
- expect(this.view.$(".comment-content p").text()).not.toEqual("a new comment");
- expect(this.view.$(".flash-message")).toBeErrorFlashMessage(
- "Failed to comment. Maybe the author is ignoring you?"
- );
+ context("on error", function() {
+ it("doesn't add the comment to the view", function() {
+ this.request.respondWith({status: 500});
+ expect(this.view.$(".comment-content p").text()).not.toEqual("a new comment");
+ });
+
+ it("doesn't reset the comment box value", function() {
+ this.request.respondWith({status: 500});
+ expect(this.view.commentBox.val()).toBe("a new comment");
+ });
+
+ it("calls enableCommentBox", function() {
+ spyOn(this.view, "enableCommentBox");
+ this.request.respondWith({status: 500});
+ expect(this.view.enableCommentBox).toHaveBeenCalled();
+ });
});
});
+ });
- it("clears the comment box when there are only spaces", function() {
- this.view.$(".comment_box").val(' ');
- this.view.createComment();
- expect(this.view.$(".comment_box").val()).toEqual("");
+ describe("disableCommentBox", function() {
+ beforeEach(function() {
+ this.view.render();
});
- it("resets comment box height", function() {
- this.view.$(".comment_box").val('a new comment');
- this.view.createComment();
- expect(this.view.$(".comment_box").attr("style")).not.toContain("height");
+ it("disables the comment box", function() {
+ this.view.commentBox.removeAttr("disabled");
+ this.view.disableCommentBox();
+ expect(this.view.commentBox.prop("disabled")).toBeTruthy();
+ });
+
+ it("disables the comment submit button", function() {
+ this.view.commentSubmitButton.removeAttr("disabled");
+ this.view.disableCommentBox();
+ expect(this.view.commentSubmitButton.prop("disabled")).toBeTruthy();
+ });
+ });
+
+ describe("enableCommentBox", function() {
+ beforeEach(function() {
+ this.view.render();
+ });
+
+ it("removes the 'disabled' attribute from the comment box", function() {
+ this.view.commentBox.prop("disabled", true);
+ this.view.enableCommentBox();
+ expect(this.view.commentBox.prop("disabled")).toBeFalsy();
+ });
+
+ it("removes the 'disabled' attribute from the comment submit button", function() {
+ this.view.commentSubmitButton.prop("disabled", true);
+ this.view.enableCommentBox();
+ expect(this.view.commentSubmitButton.prop("disabled")).toBeFalsy();
});
});
@@ -164,6 +261,19 @@ describe("app.views.CommentStream", function(){
}).join("")
);
});
+
+ it("shows the spinner when loading comments and removes it on success", function() {
+ this.view.render();
+ expect(this.view.$(".loading-comments")).toHaveClass("hidden");
+
+ this.view.expandComments();
+ expect(this.view.$(".loading-comments")).not.toHaveClass("hidden");
+
+ jasmine.Ajax.requests.mostRecent().respondWith({
+ status: 200, responseText: JSON.stringify([])
+ });
+ expect(this.view.$(".loading-comments")).toHaveClass("hidden");
+ });
});
describe("pressing a key when typing on the new comment box", function(){
diff --git a/spec/javascripts/app/views/conversations_form_view_spec.js b/spec/javascripts/app/views/conversations_form_view_spec.js
index 989469670..46c170f3a 100644
--- a/spec/javascripts/app/views/conversations_form_view_spec.js
+++ b/spec/javascripts/app/views/conversations_form_view_spec.js
@@ -1,12 +1,133 @@
describe("app.views.ConversationsForm", function() {
beforeEach(function() {
spec.loadFixture("conversations_read");
+ this.target = new app.views.ConversationsForm();
+ });
+
+ describe("initialize", function() {
+ it("initializes the conversation participants list", function() {
+ expect(this.target.conversationRecipients).toEqual([]);
+ });
+
+ it("initializes the search view", function() {
+ spyOn(app.views.SearchBase.prototype, "initialize");
+ this.target.initialize();
+ expect(app.views.SearchBase.prototype.initialize).toHaveBeenCalled();
+ expect(app.views.SearchBase.prototype.initialize.calls.argsFor(0)[0].customSearch).toBe(true);
+ expect(app.views.SearchBase.prototype.initialize.calls.argsFor(0)[0].autoselect).toBe(true);
+ expect(app.views.SearchBase.prototype.initialize.calls.argsFor(0)[0].remoteRoute).toEqual({
+ url: "/contacts",
+ extraParameters: "mutual=true"
+ });
+ expect(this.target.search).toBeDefined();
+ });
+
+ it("calls bindTypeaheadEvents", function() {
+ spyOn(app.views.ConversationsForm.prototype, "bindTypeaheadEvents");
+ this.target.initialize();
+ expect(app.views.ConversationsForm.prototype.bindTypeaheadEvents).toHaveBeenCalled();
+ });
+
+ it("calls prefill correctly", function() {
+ spyOn(app.views.ConversationsForm.prototype, "prefill");
+ this.target.initialize();
+ expect(app.views.ConversationsForm.prototype.prefill).not.toHaveBeenCalled();
+ this.target.initialize({prefill: {}});
+ expect(app.views.ConversationsForm.prototype.prefill).toHaveBeenCalledWith({});
+ });
+ });
+
+ describe("addRecipient", function() {
+ beforeEach(function() {
+ $("#conversation-new").removeClass("hidden");
+ $("#conversation-show").addClass("hidden");
+ });
+
+ it("adds the participant", function() {
+ expect(this.target.conversationRecipients).toEqual([]);
+ this.target.addRecipient({name: "diaspora user", handle: "diaspora-user@pod.tld"});
+ expect(this.target.conversationRecipients).toEqual([{name: "diaspora user", handle: "diaspora-user@pod.tld"}]);
+ });
+
+ it("calls updateContactIdsListInput", function() {
+ spyOn(app.views.ConversationsForm.prototype, "updateContactIdsListInput");
+ this.target.addRecipient({name: "diaspora user", handle: "diaspora-user@pod.tld"});
+ expect(app.views.ConversationsForm.prototype.updateContactIdsListInput).toHaveBeenCalled();
+ });
+
+ it("adds a recipient tag", function() {
+ expect($(".conversation-recipient-tag").length).toBe(0);
+ this.target.addRecipient({name: "diaspora user", handle: "diaspora-user@pod.tld"});
+ expect($(".conversation-recipient-tag").length).toBe(1);
+ });
+ });
+
+ describe("prefill", function() {
+ beforeEach(function() {
+ this.prefills = [{name: "diaspora user"}, {name: "other diaspora user"}, {name: "user"}];
+ });
+
+ it("calls addRecipient for each prefilled participant", function() {
+ spyOn(app.views.ConversationsForm.prototype, "addRecipient");
+ this.target.prefill(this.prefills);
+ expect(app.views.ConversationsForm.prototype.addRecipient).toHaveBeenCalledTimes(this.prefills.length);
+ var allArgsFlattened = app.views.ConversationsForm.prototype.addRecipient.calls.allArgs().map(function(arg) {
+ return arg[0];
+ });
+ expect(allArgsFlattened).toEqual(this.prefills);
+ });
+ });
+
+ describe("updateContactIdsListInput", function() {
+ beforeEach(function() {
+ this.target.conversationRecipients.push({id: 1, name: "diaspora user", handle: "diaspora-user@pod.tld"});
+ this.target.conversationRecipients
+ .push({id: 2, name: "other diaspora user", handle: "other-diaspora-user@pod.tld"});
+ this.target.conversationRecipients.push({id: 3, name: "user@pod.tld", handle: "user@pod.tld"});
+ });
+
+ it("updates hidden input value", function() {
+ this.target.updateContactIdsListInput();
+ expect(this.target.contactsIdsListInput.val()).toBe("1,2,3");
+ });
+
+ it("calls app.views.SearchBase.ignorePersonForSuggestions() for each participant", function() {
+ spyOn(app.views.SearchBase.prototype, "ignorePersonForSuggestions");
+ this.target.updateContactIdsListInput();
+ expect(app.views.SearchBase.prototype.ignorePersonForSuggestions).toHaveBeenCalledTimes(3);
+ expect(app.views.SearchBase.prototype.ignorePersonForSuggestions.calls.argsFor(0)[0])
+ .toEqual({id: 1, name: "diaspora user", handle: "diaspora-user@pod.tld"});
+ expect(app.views.SearchBase.prototype.ignorePersonForSuggestions.calls.argsFor(1)[0])
+ .toEqual({id: 2, name: "other diaspora user", handle: "other-diaspora-user@pod.tld"});
+ expect(app.views.SearchBase.prototype.ignorePersonForSuggestions.calls.argsFor(2)[0])
+ .toEqual({id: 3, name: "user@pod.tld", handle: "user@pod.tld"});
+ });
+ });
+
+ describe("bindTypeaheadEvents", function() {
+ it("calls onSuggestionSelection() when clicking on a result", function() {
+ spyOn(app.views.ConversationsForm.prototype, "onSuggestionSelection");
+ var event = $.Event("typeahead:select");
+ var person = {name: "diaspora user"};
+ this.target.typeaheadElement.trigger(event, [person]);
+ expect(app.views.ConversationsForm.prototype.onSuggestionSelection).toHaveBeenCalledWith(person);
+ });
+ });
+
+ describe("onSuggestionSelection", function() {
+ it("calls addRecipient and $.fn.typeahead", function() {
+ spyOn(app.views.ConversationsForm.prototype, "addRecipient");
+ spyOn($.fn, "typeahead");
+ var person = {name: "diaspora user"};
+ this.target.onSuggestionSelection(person);
+ expect(app.views.ConversationsForm.prototype.addRecipient).toHaveBeenCalledWith(person);
+ expect($.fn.typeahead).toHaveBeenCalledWith("val", "");
+ });
});
describe("keyDown", function() {
beforeEach(function() {
this.submitCallback = jasmine.createSpy().and.returnValue(false);
- new app.views.ConversationsForm();
});
context("on new message form", function() {
@@ -52,6 +173,59 @@ describe("app.views.ConversationsForm", function() {
});
});
+ describe("removeRecipient", function() {
+ beforeEach(function() {
+ this.target.addRecipient({id: 1, name: "diaspora user", handle: "diaspora-user@pod.tld"});
+ this.target.addRecipient({id: 2, name: "other diaspora user", handle: "other-diaspora-user@pod.tld"});
+ this.target.addRecipient({id: 3, name: "user@pod.tld", handle: "user@pod.tld"});
+ });
+
+ it("removes the user from conversation recipients when clicking the tag's remove button", function() {
+ expect(this.target.conversationRecipients).toEqual([
+ {id: 1, name: "diaspora user", handle: "diaspora-user@pod.tld"},
+ {id: 2, name: "other diaspora user", handle: "other-diaspora-user@pod.tld"},
+ {id: 3, name: "user@pod.tld", handle: "user@pod.tld"}
+ ]);
+
+ $("[data-diaspora-handle='diaspora-user@pod.tld'] .remove").click();
+
+ expect(this.target.conversationRecipients).toEqual([
+ {id: 2, name: "other diaspora user", handle: "other-diaspora-user@pod.tld"},
+ {id: 3, name: "user@pod.tld", handle: "user@pod.tld"}
+ ]);
+
+ $("[data-diaspora-handle='other-diaspora-user@pod.tld'] .remove").click();
+
+ expect(this.target.conversationRecipients).toEqual([
+ {id: 3, name: "user@pod.tld", handle: "user@pod.tld"}
+ ]);
+
+ $("[data-diaspora-handle='user@pod.tld'] .remove").click();
+
+ expect(this.target.conversationRecipients).toEqual([]);
+ });
+
+ it("removes the tag element when clicking the tag's remove button", function() {
+ expect($("[data-diaspora-handle='diaspora-user@pod.tld']").length).toBe(1);
+ $("[data-diaspora-handle='diaspora-user@pod.tld'] .remove").click();
+ expect($("[data-diaspora-handle='diaspora-user@pod.tld']").length).toBe(0);
+
+ expect($("[data-diaspora-handle='other-diaspora-user@pod.tld']").length).toBe(1);
+ $("[data-diaspora-handle='other-diaspora-user@pod.tld'] .remove").click();
+ expect($("[data-diaspora-handle='other-diaspora-user@pod.tld']").length).toBe(0);
+
+ expect($("[data-diaspora-handle='user@pod.tld']").length).toBe(1);
+ $("[data-diaspora-handle='user@pod.tld'] .remove").click();
+ expect($("[data-diaspora-handle='user@pod.tld']").length).toBe(0);
+ });
+
+ it("calls updateContactIdsListInput", function() {
+ spyOn(app.views.ConversationsForm.prototype, "updateContactIdsListInput");
+ $("[data-diaspora-handle='diaspora-user@pod.tld'] .remove").click();
+ expect(app.views.ConversationsForm.prototype.updateContactIdsListInput).toHaveBeenCalled();
+ });
+ });
+
describe("conversationCreateSuccess", function() {
it("is called when there was a successful ajax request for the conversation form", function() {
spyOn(app.views.ConversationsForm.prototype, "conversationCreateSuccess");
diff --git a/spec/javascripts/app/views/flash_messages_view-spec.js b/spec/javascripts/app/views/flash_messages_view-spec.js
index bcae20b2c..ad4b40ec6 100644
--- a/spec/javascripts/app/views/flash_messages_view-spec.js
+++ b/spec/javascripts/app/views/flash_messages_view-spec.js
@@ -30,4 +30,18 @@ describe("app.views.FlashMessages", function(){
expect($(".flash-message").text().trim()).toBe("error!");
});
});
+
+ describe("handleAjaxError", function() {
+ it("shows a generic error if the connection failed", function() {
+ spyOn(flashMessages, "error");
+ flashMessages.handleAjaxError({status: 0});
+ expect(flashMessages.error).toHaveBeenCalledWith(Diaspora.I18n.t("errors.connection"));
+ });
+
+ it("shows the error given in the responseText otherwise", function() {
+ spyOn(flashMessages, "error");
+ flashMessages.handleAjaxError({status: 400, responseText: "some specific ajax error"});
+ expect(flashMessages.error).toHaveBeenCalledWith("some specific ajax error");
+ });
+ });
});
diff --git a/spec/javascripts/app/views/header_view_spec.js b/spec/javascripts/app/views/header_view_spec.js
index 0850935e8..3bf13978f 100644
--- a/spec/javascripts/app/views/header_view_spec.js
+++ b/spec/javascripts/app/views/header_view_spec.js
@@ -6,6 +6,7 @@ describe("app.views.Header", function() {
spec.loadFixture("aspects_index");
gon.appConfig = {settings: {podname: "MyPod"}};
+ app.notificationsCollection = new app.collections.Notifications();
this.view = new app.views.Header().render();
});
diff --git a/spec/javascripts/app/views/help_view_spec.js b/spec/javascripts/app/views/help_view_spec.js
index 098e7dfcc..38717a620 100644
--- a/spec/javascripts/app/views/help_view_spec.js
+++ b/spec/javascripts/app/views/help_view_spec.js
@@ -2,11 +2,17 @@ describe("app.views.Help", function(){
beforeEach(function(){
gon.appConfig = {chat: {enabled: false}};
this.locale = JSON.parse(spec.readFixture("locale_en_help_json"));
+ Diaspora.I18n.reset();
Diaspora.I18n.load(this.locale, "en");
this.view = new app.views.Help();
Diaspora.Page = "HelpFaq";
});
+ afterEach(function() {
+ Diaspora.I18n.reset();
+ Diaspora.I18n.load(spec.defaultLocale);
+ });
+
describe("render", function(){
beforeEach(function(){
this.view.render();
diff --git a/spec/javascripts/app/views/likes_info_view_spec.js b/spec/javascripts/app/views/likes_info_view_spec.js
index f0848675d..6166bfc82 100644
--- a/spec/javascripts/app/views/likes_info_view_spec.js
+++ b/spec/javascripts/app/views/likes_info_view_spec.js
@@ -21,19 +21,23 @@ describe("app.views.LikesInfo", function(){
it("fires on a model change", function(){
spyOn(this.view, "postRenderTemplate");
- this.view.model.interactions.trigger('change');
+ this.view.model.interactions.likes.trigger("change");
expect(this.view.postRenderTemplate).toHaveBeenCalled();
});
});
describe("showAvatars", function(){
- beforeEach(function(){
- spyOn(this.post.interactions, "fetch").and.callThrough();
+ it("calls fetch on the model's like collection", function() {
+ spyOn(this.post.interactions.likes, "fetch").and.callThrough();
+ this.view.showAvatars();
+ expect(this.post.interactions.likes.fetch).toHaveBeenCalled();
});
- it("calls fetch on the model's like collection", function(){
+ it("triggers 'change' on the likes collection", function() {
+ spyOn(this.post.interactions.likes, "trigger");
this.view.showAvatars();
- expect(this.post.interactions.fetch).toHaveBeenCalled();
+ jasmine.Ajax.requests.mostRecent().respondWith({status: 200, responseText: "{\"id\": 1}"});
+ expect(this.post.interactions.likes.trigger).toHaveBeenCalledWith("change");
});
it("sets 'displayAvatars' to true", function(){
diff --git a/spec/javascripts/app/views/notification_dropdown_view_spec.js b/spec/javascripts/app/views/notification_dropdown_view_spec.js
index 891023032..69dcb4a56 100644
--- a/spec/javascripts/app/views/notification_dropdown_view_spec.js
+++ b/spec/javascripts/app/views/notification_dropdown_view_spec.js
@@ -1,125 +1,74 @@
describe("app.views.NotificationDropdown", function() {
- beforeEach(function (){
+ beforeEach(function() {
spec.loadFixture("notifications");
gon.appConfig = {settings: {podname: "MyPod"}};
this.header = new app.views.Header();
$("header").prepend(this.header.el);
loginAs({guid: "foo"});
this.header.render();
- this.view = new app.views.NotificationDropdown({el: "#notification-dropdown"});
+ this.collection = new app.collections.Notifications();
+ this.view = new app.views.NotificationDropdown({el: "#notification-dropdown", collection: this.collection});
});
- context("showDropdown", function(){
- it("Calls resetParam()", function(){
- spyOn(this.view, "resetParams");
- this.view.showDropdown();
- expect(this.view.resetParams).toHaveBeenCalled();
+ describe("bindCollectionEvents", function() {
+ beforeEach(function() {
+ this.view.collection.off("pushFront");
+ this.view.collection.off("pushBack");
+ this.view.collection.off("finishedLoading");
+ spyOn(this.view, "onPushFront");
+ spyOn(this.view, "onPushBack");
+ spyOn(this.view, "finishLoading");
});
- it("Calls updateScrollbar()", function(){
+
+ it("binds collection events", function() {
+ this.view.bindCollectionEvents();
+
+ this.collection.trigger("pushFront");
+ this.collection.trigger("pushBack");
+ this.collection.trigger("finishedLoading");
+
+ expect(this.view.onPushFront).toHaveBeenCalled();
+ expect(this.view.onPushBack).toHaveBeenCalled();
+ expect(this.view.finishLoading).toHaveBeenCalled();
+ });
+ });
+
+ describe("showDropdown", function() {
+ it("Calls updateScrollbar", function() {
spyOn(this.view, "updateScrollbar");
this.view.showDropdown();
expect(this.view.updateScrollbar).toHaveBeenCalled();
});
- it("Changes CSS", function(){
+ it("Changes CSS", function() {
expect($("#notification-dropdown")).not.toHaveClass("dropdown-open");
this.view.showDropdown();
expect($("#notification-dropdown")).toHaveClass("dropdown-open");
});
- it("Calls getNotifications()", function(){
- spyOn(this.view, "getNotifications");
+ it("Calls collection#fetch", function() {
+ spyOn(this.collection, "fetch");
this.view.showDropdown();
- expect(this.view.getNotifications).toHaveBeenCalled();
+ expect(this.collection.fetch).toHaveBeenCalled();
});
});
- context("dropdownScroll", function(){
- it("Calls getNotifications if is at the bottom and has more notifications to load", function(){
- this.view.isBottom = function(){ return true; };
- this.view.hasMoreNotifs = true;
- spyOn(this.view, "getNotifications");
+ describe("dropdownScroll", function() {
+ it("Calls collection#fetchMore if it is at the bottom", function() {
+ this.view.isBottom = function() { return true; };
+ spyOn(this.collection, "fetchMore");
this.view.dropdownScroll();
- expect(this.view.getNotifications).toHaveBeenCalled();
+ expect(this.collection.fetchMore).toHaveBeenCalled();
});
- it("Doesn't call getNotifications if is not at the bottom", function(){
- this.view.isBottom = function(){ return false; };
- this.view.hasMoreNotifs = true;
- spyOn(this.view, "getNotifications");
+ it("Doesn't call collection#fetchMore if it is not at the bottom", function() {
+ this.view.isBottom = function() { return false; };
+ spyOn(this.collection, "fetchMore");
this.view.dropdownScroll();
- expect(this.view.getNotifications).not.toHaveBeenCalled();
- });
-
- it("Doesn't call getNotifications if is not at the bottom", function(){
- this.view.isBottom = function(){ return true; };
- this.view.hasMoreNotifs = false;
- spyOn(this.view, "getNotifications");
- this.view.dropdownScroll();
- expect(this.view.getNotifications).not.toHaveBeenCalled();
- });
- });
-
- context("getNotifications", function(){
- it("Has more notifications", function(){
- var response = ["", "", "", "", ""];
- spyOn($, "getJSON").and.callFake(function(url, callback){ callback(response); });
- this.view.getNotifications();
- expect(this.view.hasMoreNotifs).toBe(true);
- });
- it("Has no more notifications", function(){
- spyOn($, "getJSON").and.callFake(function(url, callback){ callback([]); });
- this.view.getNotifications();
- expect(this.view.hasMoreNotifs).toBe(false);
- });
- it("Correctly sets the next page", function(){
- spyOn($, "getJSON").and.callFake(function(url, callback){ callback([]); });
- expect(typeof this.view.nextPage).toBe("undefined");
- this.view.getNotifications();
- expect(this.view.nextPage).toBe(3);
- });
- it("Increase the page count", function(){
- var response = ["", "", "", "", ""];
- spyOn($, "getJSON").and.callFake(function(url, callback){ callback(response); });
- this.view.getNotifications();
- expect(this.view.nextPage).toBe(3);
- this.view.getNotifications();
- expect(this.view.nextPage).toBe(4);
- });
- it("Calls renderNotifications()", function(){
- spyOn($, "getJSON").and.callFake(function(url, callback){ callback([]); });
- spyOn(this.view, "renderNotifications");
- this.view.getNotifications();
- expect(this.view.renderNotifications).toHaveBeenCalled();
- });
- it("Adds the notifications to this.notifications", function(){
- var response = ["", "", "", "", ""];
- this.view.notifications.length = 0;
- spyOn($, "getJSON").and.callFake(function(url, callback){ callback(response); });
- this.view.getNotifications();
- expect(this.view.notifications).toEqual(response);
- });
- });
-
- context("renderNotifications", function(){
- it("Removes the previous notifications", function(){
- this.view.dropdownNotifications.append("<div class=\"media stream-element\">Notification</div>");
- expect(this.view.dropdownNotifications.find(".media.stream-element").length).toBe(1);
- this.view.renderNotifications();
- expect(this.view.dropdownNotifications.find(".media.stream-element").length).toBe(0);
- });
- it("Calls hideAjaxLoader()", function(){
- spyOn(this.view, "hideAjaxLoader");
- this.view.renderNotifications();
- expect(this.view.hideAjaxLoader).toHaveBeenCalled();
- });
- it("Calls updateScrollbar()", function(){
- spyOn(this.view, "updateScrollbar");
- this.view.renderNotifications();
- expect(this.view.updateScrollbar).toHaveBeenCalled();
+ expect(this.collection.fetchMore).not.toHaveBeenCalled();
});
});
- context("updateScrollbar", function() {
- it("Initializes perfectScrollbar", function(){
+ describe("updateScrollbar", function() {
+ it("Initializes perfectScrollbar", function() {
this.view.perfectScrollbarInitialized = false;
spyOn($.fn, "perfectScrollbar");
this.view.updateScrollbar();
@@ -128,7 +77,7 @@ describe("app.views.NotificationDropdown", function() {
expect(this.view.perfectScrollbarInitialized).toBeTruthy();
});
- it("Updates perfectScrollbar", function(){
+ it("Updates perfectScrollbar", function() {
this.view.perfectScrollbarInitialized = true;
this.view.dropdownNotifications.perfectScrollbar();
spyOn($.fn, "perfectScrollbar");
@@ -139,8 +88,8 @@ describe("app.views.NotificationDropdown", function() {
});
});
- context("destroyScrollbar", function() {
- it("destroys perfectScrollbar", function(){
+ describe("destroyScrollbar", function() {
+ it("destroys perfectScrollbar", function() {
this.view.perfectScrollbarInitialized = true;
this.view.dropdownNotifications.perfectScrollbar();
spyOn($.fn, "perfectScrollbar");
@@ -150,7 +99,7 @@ describe("app.views.NotificationDropdown", function() {
expect(this.view.perfectScrollbarInitialized).toBeFalsy();
});
- it("doesn't destroy perfectScrollbar if it isn't initialized", function(){
+ it("doesn't destroy perfectScrollbar if it isn't initialized", function() {
this.view.perfectScrollbarInitialized = false;
spyOn($.fn, "perfectScrollbar");
this.view.destroyScrollbar();
diff --git a/spec/javascripts/app/views/notifications_view_spec.js b/spec/javascripts/app/views/notifications_view_spec.js
index 94f8a8394..d83770300 100644
--- a/spec/javascripts/app/views/notifications_view_spec.js
+++ b/spec/javascripts/app/views/notifications_view_spec.js
@@ -1,8 +1,36 @@
-describe("app.views.Notifications", function(){
+describe("app.views.Notifications", function() {
+ beforeEach(function() {
+ this.collection = new app.collections.Notifications();
+ this.collection.fetch();
+ jasmine.Ajax.requests.mostRecent().respondWith({
+ status: 200,
+ responseText: spec.readFixture("notifications_collection")
+ });
+ });
+
context("on the notifications page", function() {
beforeEach(function() {
spec.loadFixture("notifications");
- this.view = new app.views.Notifications({el: "#notifications_container"});
+ this.view = new app.views.Notifications({el: "#notifications_container", collection: this.collection});
+ });
+
+ describe("bindCollectionEvents", function() {
+ beforeEach(function() {
+ this.view.collection.off("change");
+ this.view.collection.off("update");
+ spyOn(this.view, "onChangedUnreadStatus");
+ spyOn(this.view, "updateView");
+ });
+
+ it("binds collection events", function() {
+ this.view.bindCollectionEvents();
+
+ this.collection.trigger("change");
+ this.collection.trigger("update");
+
+ expect(this.view.onChangedUnreadStatus).toHaveBeenCalled();
+ expect(this.view.updateView).toHaveBeenCalled();
+ });
});
describe("mark read", function() {
@@ -11,11 +39,11 @@ describe("app.views.Notifications", function(){
this.guid = this.unreadN.data("guid");
});
- it("calls 'setRead'", function() {
- spyOn(this.view, "setRead");
+ it("calls collection's 'setRead'", function() {
+ spyOn(this.collection, "setRead");
this.unreadN.find(".unread-toggle").trigger("click");
- expect(this.view.setRead).toHaveBeenCalledWith(this.guid);
+ expect(this.collection.setRead).toHaveBeenCalledWith(this.guid);
});
});
@@ -25,11 +53,11 @@ describe("app.views.Notifications", function(){
this.guid = this.readN.data("guid");
});
- it("calls 'setUnread'", function() {
- spyOn(this.view, "setUnread");
+ it("calls collection's 'setUnread'", function() {
+ spyOn(this.collection, "setUnread");
this.readN.find(".unread-toggle").trigger("click");
- expect(this.view.setUnread).toHaveBeenCalledWith(this.guid);
+ expect(this.collection.setUnread).toHaveBeenCalledWith(this.guid);
});
});
@@ -40,42 +68,65 @@ describe("app.views.Notifications", function(){
this.type = this.readN.data("type");
});
- it("changes the 'all notifications' count", function() {
+ it("increases the 'all notifications' count", function() {
var badge = $(".list-group > a:eq(0) .badge");
- var count = parseInt(badge.text());
+ expect(parseInt(badge.text(), 10)).toBe(2);
- this.view.updateView(this.guid, this.type, true);
- expect(parseInt(badge.text())).toBe(count + 1);
+ this.collection.unreadCount++;
+ this.view.updateView();
+ expect(parseInt(badge.text(), 10)).toBe(3);
- this.view.updateView(this.guid, this.type, false);
- expect(parseInt(badge.text())).toBe(count);
+ this.view.updateView();
+ expect(parseInt(badge.text(), 10)).toBe(3);
});
- it("changes the notification type count", function() {
+ it("decreases the 'all notifications' count", function() {
+ var badge = $(".list-group > a:eq(0) .badge");
+ expect(parseInt(badge.text(), 10)).toBe(2);
+
+ this.collection.unreadCount--;
+ this.view.updateView();
+ expect(parseInt(badge.text(), 10)).toBe(1);
+
+ this.view.updateView();
+ expect(parseInt(badge.text(), 10)).toBe(1);
+ });
+
+ it("increases the notification type count", function() {
var badge = $(".list-group > a[data-type=" + this.type + "] .badge");
- var count = parseInt(badge.text());
- this.view.updateView(this.guid, this.type, true);
- expect(parseInt(badge.text())).toBe(count + 1);
+ expect(parseInt(badge.text(), 10)).toBe(1);
+
+ this.collection.unreadCountByType[this.type]++;
+ this.view.updateView();
+ expect(parseInt(badge.text(), 10)).toBe(2);
- this.view.updateView(this.guid, this.type, false);
- expect(parseInt(badge.text())).toBe(count);
+ this.view.updateView();
+ expect(parseInt(badge.text(), 10)).toBe(2);
});
- it("toggles the unread class and changes the title", function() {
- this.view.updateView(this.readN.data("guid"), this.readN.data("type"), true);
- expect(this.readN.hasClass("unread")).toBeTruthy();
- expect(this.readN.hasClass("read")).toBeFalsy();
- expect(this.readN.find(".unread-toggle .entypo-eye").attr("data-original-title")).toBe(
- Diaspora.I18n.t("notifications.mark_read")
- );
+ it("decreases the notification type count", function() {
+ var badge = $(".list-group > a[data-type=" + this.type + "] .badge");
- this.view.updateView(this.readN.data("guid"), this.readN.data("type"), false);
- expect(this.readN.hasClass("read")).toBeTruthy();
- expect(this.readN.hasClass("unread")).toBeFalsy();
- expect(this.readN.find(".unread-toggle .entypo-eye").attr("data-original-title")).toBe(
- Diaspora.I18n.t("notifications.mark_unread")
- );
+ expect(parseInt(badge.text(), 10)).toBe(1);
+
+ this.collection.unreadCountByType[this.type]--;
+ this.view.updateView();
+ expect(parseInt(badge.text(), 10)).toBe(0);
+
+ this.view.updateView();
+ expect(parseInt(badge.text(), 10)).toBe(0);
+ });
+
+ it("hides badge count when notification count is zero", function() {
+ Object.keys(this.collection.unreadCountByType).forEach(function(notificationType) {
+ this.collection.unreadCountByType[notificationType] = 0;
+ }.bind(this));
+ this.collection.unreadCount = 0;
+
+ this.view.updateView();
+
+ expect($("a .badge")).toHaveClass("hidden");
});
context("with a header", function() {
@@ -84,6 +135,7 @@ describe("app.views.Notifications", function(){
loginAs({name: "alice", avatar: {small: "http://avatar.com/photo.jpg"}, notifications_count: 2, guid: "foo"});
/* jshint camelcase: true */
gon.appConfig = {settings: {podname: "MyPod"}};
+ app.notificationsCollection = this.collection;
this.header = new app.views.Header();
$("header").prepend(this.header.el);
this.header.render();
@@ -92,30 +144,77 @@ describe("app.views.Notifications", function(){
it("changes the header notifications count", function() {
var badge1 = $(".notifications-link:eq(0) .badge");
var badge2 = $(".notifications-link:eq(1) .badge");
- var count = parseInt(badge1.text(), 10);
- this.view.updateView(this.guid, this.type, true);
- expect(parseInt(badge1.text(), 10)).toBe(count + 1);
+ expect(parseInt(badge1.text(), 10)).toBe(this.collection.unreadCount);
+ expect(parseInt(badge2.text(), 10)).toBe(this.collection.unreadCount);
- this.view.updateView(this.guid, this.type, false);
- expect(parseInt(badge1.text(), 10)).toBe(count);
+ this.collection.unreadCount++;
+ this.view.updateView();
+ expect(parseInt(badge1.text(), 10)).toBe(this.collection.unreadCount);
- this.view.updateView(this.guid, this.type, true);
- expect(parseInt(badge2.text(), 10)).toBe(count + 1);
+ this.view.updateView();
+ expect(parseInt(badge2.text(), 10)).toBe(this.collection.unreadCount);
+ });
- this.view.updateView(this.guid, this.type, false);
- expect(parseInt(badge2.text(), 10)).toBe(count);
+ it("disables the mark-all-read-link button", function() {
+ expect($("a#mark-all-read-link")).not.toHaveClass("disabled");
+ this.collection.unreadCount = 0;
+ this.view.updateView();
+ expect($("a#mark-all-read-link")).toHaveClass("disabled");
});
});
});
describe("markAllRead", function() {
- it("calls setRead for each unread notification", function(){
- spyOn(this.view, "setRead");
+ it("calls collection#setAllRead", function() {
+ spyOn(this.collection, "setAllRead");
this.view.markAllRead();
- expect(this.view.setRead).toHaveBeenCalledWith(this.view.$(".stream-element.unread").eq(0).data("guid"));
- this.view.markAllRead();
- expect(this.view.setRead).toHaveBeenCalledWith(this.view.$(".stream-element.unread").eq(1).data("guid"));
+ expect(this.collection.setAllRead).toHaveBeenCalled();
+ });
+ });
+
+ describe("onChangedUnreadStatus", function() {
+ beforeEach(function() {
+ this.modelRead = new app.models.Notification({});
+ this.modelRead.set("unread", false);
+ this.modelRead.guid = $(".stream-element.unread").first().data("guid");
+ this.modelUnread = new app.models.Notification({});
+ this.modelUnread.set("unread", true);
+ this.modelUnread.guid = $(".stream-element.read").first().data("guid");
+ });
+
+ it("Adds the unread class and changes the title", function() {
+ var unreadEl = $(".stream-element[data-guid=" + this.modelUnread.guid + "]");
+
+ expect(unreadEl.hasClass("read")).toBeTruthy();
+ expect(unreadEl.hasClass("unread")).toBeFalsy();
+ expect(unreadEl.find(".unread-toggle .entypo-eye").attr("data-original-title")).toBe(
+ Diaspora.I18n.t("notifications.mark_unread")
+ );
+
+ this.view.onChangedUnreadStatus(this.modelUnread);
+ expect(unreadEl.hasClass("unread")).toBeTruthy();
+ expect(unreadEl.hasClass("read")).toBeFalsy();
+ expect(unreadEl.find(".unread-toggle .entypo-eye").attr("data-original-title")).toBe(
+ Diaspora.I18n.t("notifications.mark_read")
+ );
+ });
+
+ it("Removes the unread class and changes the title", function() {
+ var readEl = $(".stream-element[data-guid=" + this.modelRead.guid + "]");
+
+ expect(readEl.hasClass("unread")).toBeTruthy();
+ expect(readEl.hasClass("read")).toBeFalsy();
+ expect(readEl.find(".unread-toggle .entypo-eye").attr("data-original-title")).toBe(
+ Diaspora.I18n.t("notifications.mark_read")
+ );
+
+ this.view.onChangedUnreadStatus(this.modelRead);
+ expect(readEl.hasClass("read")).toBeTruthy();
+ expect(readEl.hasClass("unread")).toBeFalsy();
+ expect(readEl.find(".unread-toggle .entypo-eye").attr("data-original-title")).toBe(
+ Diaspora.I18n.t("notifications.mark_unread")
+ );
});
});
});
@@ -123,47 +222,32 @@ describe("app.views.Notifications", function(){
context("on the contacts page", function() {
beforeEach(function() {
spec.loadFixture("aspects_manage");
- this.view = new app.views.Notifications({el: "#notifications_container"});
+ this.view = new app.views.Notifications({el: "#notifications_container", collection: this.collection});
/* jshint camelcase: false */
loginAs({name: "alice", avatar: {small: "http://avatar.com/photo.jpg"}, notifications_count: 2, guid: "foo"});
/* jshint camelcase: true */
gon.appConfig = {settings: {podname: "MyPod"}};
+ app.notificationsCollection = this.collection;
this.header = new app.views.Header();
$("header").prepend(this.header.el);
this.header.render();
});
describe("updateView", function() {
- it("changes the header notifications count", function() {
- var badge1 = $(".notifications-link:eq(0) .badge");
- var badge2 = $(".notifications-link:eq(1) .badge");
- var count = parseInt(badge1.text(), 10);
-
- this.view.updateView(this.guid, this.type, true);
- expect(parseInt(badge1.text(), 10)).toBe(count + 1);
-
- this.view.updateView(this.guid, this.type, false);
- expect(parseInt(badge1.text(), 10)).toBe(count);
-
- this.view.updateView(this.guid, this.type, true);
- expect(parseInt(badge2.text(), 10)).toBe(count + 1);
-
- this.view.updateView(this.guid, this.type, false);
- expect(parseInt(badge2.text(), 10)).toBe(count);
- });
-
it("doesn't change the contacts count", function() {
expect($("#aspect_nav .badge").length).toBeGreaterThan(0);
$("#aspect_nav .badge").each(function(index, el) {
$(el).text(index + 1337);
});
- this.view.updateView(this.guid, this.type, true);
+ this.view.updateView();
$("#aspect_nav .badge").each(function(index, el) {
expect(parseInt($(el).text(), 10)).toBe(index + 1337);
});
- this.view.updateView(this.guid, this.type, false);
+ this.collection.unreadCount++;
+
+ this.view.updateView();
$("#aspect_nav .badge").each(function(index, el) {
expect(parseInt($(el).text(), 10)).toBe(index + 1337);
});
diff --git a/spec/javascripts/app/views/profile_header_view_spec.js b/spec/javascripts/app/views/profile_header_view_spec.js
index 724cc7260..ebd4ecde1 100644
--- a/spec/javascripts/app/views/profile_header_view_spec.js
+++ b/spec/javascripts/app/views/profile_header_view_spec.js
@@ -11,6 +11,34 @@ describe("app.views.ProfileHeader", function() {
loginAs(factory.userAttrs());
});
+ describe("initialize", function() {
+ it("calls #render when the model changes", function() {
+ spyOn(app.views.ProfileHeader.prototype, "render");
+ this.view.initialize();
+ expect(app.views.ProfileHeader.prototype.render).not.toHaveBeenCalled();
+ this.view.model.trigger("change");
+ expect(app.views.ProfileHeader.prototype.render).toHaveBeenCalled();
+ });
+
+ it("calls #mentionModalLoaded on modal:loaded", function() {
+ spec.content().append("<div id='mentionModal'></div>");
+ spyOn(app.views.ProfileHeader.prototype, "mentionModalLoaded");
+ this.view.initialize();
+ expect(app.views.ProfileHeader.prototype.mentionModalLoaded).not.toHaveBeenCalled();
+ $("#mentionModal").trigger("modal:loaded");
+ expect(app.views.ProfileHeader.prototype.mentionModalLoaded).toHaveBeenCalled();
+ });
+
+ it("calls #mentionModalHidden on hidden.bs.modal", function() {
+ spec.content().append("<div id='mentionModal'></div>");
+ spyOn(app.views.ProfileHeader.prototype, "mentionModalHidden");
+ this.view.initialize();
+ expect(app.views.ProfileHeader.prototype.mentionModalHidden).not.toHaveBeenCalled();
+ $("#mentionModal").trigger("hidden.bs.modal");
+ expect(app.views.ProfileHeader.prototype.mentionModalHidden).toHaveBeenCalled();
+ });
+ });
+
context("#presenter", function() {
it("contains necessary elements", function() {
expect(this.view.presenter()).toEqual(jasmine.objectContaining({
@@ -30,4 +58,30 @@ describe("app.views.ProfileHeader", function() {
}));
});
});
+
+ describe("showMessageModal", function() {
+ beforeEach(function() {
+ spec.content().append("<div id='conversationModal'/>");
+ });
+
+ it("calls app.helpers.showModal", function() {
+ spyOn(app.helpers, "showModal");
+ this.view.showMessageModal();
+ expect(app.helpers.showModal).toHaveBeenCalled();
+ });
+
+ it("initializes app.views.ConversationsForm with correct parameters when modal is loaded", function() {
+ gon.conversationPrefill = [
+ {id: 1, name: "diaspora user", handle: "diaspora-user@pod.tld"},
+ {id: 2, name: "other diaspora user", handle: "other-diaspora-user@pod.tld"},
+ {id: 3, name: "user@pod.tld", handle: "user@pod.tld"}
+ ];
+
+ spyOn(app.views.ConversationsForm.prototype, "initialize");
+ this.view.showMessageModal();
+ $("#conversationModal").trigger("modal:loaded");
+ expect(app.views.ConversationsForm.prototype.initialize)
+ .toHaveBeenCalledWith({prefill: gon.conversationPrefill});
+ });
+ });
});
diff --git a/spec/javascripts/app/views/publisher_mention_view_spec.js b/spec/javascripts/app/views/publisher_mention_view_spec.js
index 436e5e674..d4e9417e3 100644
--- a/spec/javascripts/app/views/publisher_mention_view_spec.js
+++ b/spec/javascripts/app/views/publisher_mention_view_spec.js
@@ -19,7 +19,7 @@ describe("app.views.PublisherMention", function() {
expect(call.args[0].typeaheadInput.selector).toBe("#publisher .typeahead-mention-box");
expect(call.args[0].customSearch).toBeTruthy();
expect(call.args[0].autoselect).toBeTruthy();
- expect(call.args[0].remoteRoute).toBe("/contacts");
+ expect(call.args[0].remoteRoute).toEqual({url: "/contacts"});
});
it("calls bindTypeaheadEvents", function() {
diff --git a/spec/javascripts/app/views/reshares_info_view_spec.js b/spec/javascripts/app/views/reshares_info_view_spec.js
index b36853cc0..f5e6bf0db 100644
--- a/spec/javascripts/app/views/reshares_info_view_spec.js
+++ b/spec/javascripts/app/views/reshares_info_view_spec.js
@@ -22,19 +22,23 @@ describe("app.views.ResharesInfo", function(){
it("fires on a model change", function(){
spyOn(this.view, "postRenderTemplate");
- this.view.model.interactions.trigger("change");
+ this.view.model.interactions.reshares.trigger("change");
expect(this.view.postRenderTemplate).toHaveBeenCalled();
});
});
describe("showAvatars", function(){
- beforeEach(function(){
- spyOn(this.post.interactions, "fetch").and.callThrough();
+ it("calls fetch on the model's reshare collection", function() {
+ spyOn(this.post.interactions.reshares, "fetch").and.callThrough();
+ this.view.showAvatars();
+ expect(this.post.interactions.reshares.fetch).toHaveBeenCalled();
});
- it("calls fetch on the model's reshare collection", function(){
+ it("triggers 'change' on the reshares collection", function() {
+ spyOn(this.post.interactions.reshares, "trigger");
this.view.showAvatars();
- expect(this.post.interactions.fetch).toHaveBeenCalled();
+ jasmine.Ajax.requests.mostRecent().respondWith({status: 200, responseText: "{\"id\": 1}"});
+ expect(this.post.interactions.reshares.trigger).toHaveBeenCalledWith("change");
});
it("sets 'displayAvatars' to true", function(){
diff --git a/spec/javascripts/app/views/search_view_spec.js b/spec/javascripts/app/views/search_view_spec.js
index 74e4831eb..ffb652304 100644
--- a/spec/javascripts/app/views/search_view_spec.js
+++ b/spec/javascripts/app/views/search_view_spec.js
@@ -11,7 +11,7 @@ describe("app.views.Search", function() {
this.view = new app.views.Search({el: "#search_people_form"});
var call = app.views.SearchBase.prototype.initialize.calls.mostRecent();
expect(call.args[0].typeaheadInput.selector).toBe("#search_people_form #q");
- expect(call.args[0].remoteRoute).toBe("/search");
+ expect(call.args[0].remoteRoute).toEqual({url: "/search"});
});
it("binds typeahead:select", function() {
diff --git a/spec/javascripts/helpers/i18n_spec.js b/spec/javascripts/helpers/i18n_spec.js
index 79dfabe27..0190a454f 100644
--- a/spec/javascripts/helpers/i18n_spec.js
+++ b/spec/javascripts/helpers/i18n_spec.js
@@ -45,6 +45,28 @@ describe("Diaspora.I18n", function() {
expect(Diaspora.I18n.locale.data).toEqual(extended);
});
+
+ it("overrides existing translations", function() {
+ var oldLocale = {name: "Bob"};
+ var newLocale = {name: "Alice"};
+ Diaspora.I18n.load(oldLocale, "en");
+ expect(Diaspora.I18n.locale.data.name).toBe("Bob");
+ Diaspora.I18n.load(newLocale, "en");
+ expect(Diaspora.I18n.locale.data.name).toBe("Alice");
+
+ Diaspora.I18n.reset(oldLocale);
+ expect(Diaspora.I18n.locale.data.name).toBe("Bob");
+ Diaspora.I18n.load(newLocale, "en");
+ expect(Diaspora.I18n.locale.data.name).toBe("Alice");
+ });
+
+ it("doesn't change locale objects given in ealier calls", function() {
+ var oldLocale = {name: "Bob"};
+ var newLocale = {name: "Alice"};
+ Diaspora.I18n.reset(oldLocale);
+ Diaspora.I18n.load(newLocale, "en");
+ expect(oldLocale.name).toBe("Bob");
+ });
});
describe("::t", function() {
diff --git a/spec/javascripts/mobile/mobile_post_actions_spec.js b/spec/javascripts/mobile/mobile_post_actions_spec.js
index 5cdca9000..80d410ea3 100644
--- a/spec/javascripts/mobile/mobile_post_actions_spec.js
+++ b/spec/javascripts/mobile/mobile_post_actions_spec.js
@@ -223,10 +223,16 @@ describe("Diaspora.Mobile.PostActions", function(){
expect(Diaspora.Mobile.PostActions.toggleActive).toHaveBeenCalledWith(this.reshareLink);
});
- it("pops an alert on error", function(){
+ it("pops an alert on server errors", function() {
this.reshareLink.click();
- jasmine.Ajax.requests.mostRecent().respondWith({status: 400});
- expect(window.alert).toHaveBeenCalledWith(Diaspora.I18n.t("failed_to_reshare"));
+ jasmine.Ajax.requests.mostRecent().respondWith({status: 400, responseText: "reshare failed"});
+ expect(window.alert).toHaveBeenCalledWith("reshare failed");
+ });
+
+ it("pops an alert on network errors", function() {
+ this.reshareLink.click();
+ jasmine.Ajax.requests.mostRecent().abort();
+ expect(window.alert).toHaveBeenCalledWith(Diaspora.I18n.t("errors.connection"));
});
});
});
diff --git a/spec/javascripts/onerror-fail.js b/spec/javascripts/onerror-fail.js
new file mode 100644
index 000000000..21f69b745
--- /dev/null
+++ b/spec/javascripts/onerror-fail.js
@@ -0,0 +1,7 @@
+window.onerror = function(errorMsg, url, lineNumber) {
+ describe("Test suite", function() {
+ it("shouldn't skip tests because of syntax errors", function() {
+ fail(errorMsg + " in file " + url + " in line " + lineNumber);
+ });
+ });
+};
diff --git a/spec/javascripts/support/jasmine.yml b/spec/javascripts/support/jasmine.yml
index 87e516cca..cec433307 100644
--- a/spec/javascripts/support/jasmine.yml
+++ b/spec/javascripts/support/jasmine.yml
@@ -53,6 +53,7 @@ helpers:
# - **/*[sS]pec.js
#
spec_files:
+ - onerror-fail.js
- "**/**/*[sS]pec.js"
# src_dir
diff --git a/spec/lib/account_deleter_spec.rb b/spec/lib/account_deleter_spec.rb
index 8ca011b2b..e67920157 100644
--- a/spec/lib/account_deleter_spec.rb
+++ b/spec/lib/account_deleter_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require 'spec_helper'
-
describe AccountDeleter do
before do
@account_deletion = AccountDeleter.new(bob.person.diaspora_handle)
diff --git a/spec/lib/api/openid_connect/protected_resource_endpoint_spec.rb b/spec/lib/api/openid_connect/protected_resource_endpoint_spec.rb
index 4c9035ece..e93a995ef 100644
--- a/spec/lib/api/openid_connect/protected_resource_endpoint_spec.rb
+++ b/spec/lib/api/openid_connect/protected_resource_endpoint_spec.rb
@@ -1,5 +1,3 @@
-require "spec_helper"
-
describe Api::OpenidConnect::ProtectedResourceEndpoint, type: :request do
let(:auth_with_read) { FactoryGirl.create(:auth_with_read) }
let!(:access_token_with_read) { auth_with_read.create_access_token.to_s }
diff --git a/spec/lib/api/openid_connect/token_endpoint_spec.rb b/spec/lib/api/openid_connect/token_endpoint_spec.rb
index 37eba5380..a455f8ffa 100644
--- a/spec/lib/api/openid_connect/token_endpoint_spec.rb
+++ b/spec/lib/api/openid_connect/token_endpoint_spec.rb
@@ -1,5 +1,3 @@
-require "spec_helper"
-
describe Api::OpenidConnect::TokenEndpoint, type: :request do
let!(:client) { FactoryGirl.create(:o_auth_application_with_ppid) }
let!(:auth) {
diff --git a/spec/lib/configuration_methods_spec.rb b/spec/lib/configuration_methods_spec.rb
index 8e474c381..76fb4a9ab 100644
--- a/spec/lib/configuration_methods_spec.rb
+++ b/spec/lib/configuration_methods_spec.rb
@@ -1,5 +1,3 @@
-require 'spec_helper'
-
describe Configuration::Methods do
before(:all) do
@settings = Configurate::Settings.create do
diff --git a/spec/lib/connection_tester_spec.rb b/spec/lib/connection_tester_spec.rb
index 22fc906bd..85dd5d0a2 100644
--- a/spec/lib/connection_tester_spec.rb
+++ b/spec/lib/connection_tester_spec.rb
@@ -1,6 +1,3 @@
-
-require "spec_helper"
-
describe ConnectionTester do
let(:url) { "https://pod.example.com" }
let(:result) { ConnectionTester::Result.new }
diff --git a/spec/lib/diaspora/camo_spec.rb b/spec/lib/diaspora/camo_spec.rb
index 3e970340e..6c72fce08 100644
--- a/spec/lib/diaspora/camo_spec.rb
+++ b/spec/lib/diaspora/camo_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require 'spec_helper'
-
describe Diaspora::Camo do
before do
AppConfig.privacy.camo.root = 'http://localhost:3000/camo/'
diff --git a/spec/lib/diaspora/exporter_spec.rb b/spec/lib/diaspora/exporter_spec.rb
index 7bb429cc8..d12cfd2d0 100644
--- a/spec/lib/diaspora/exporter_spec.rb
+++ b/spec/lib/diaspora/exporter_spec.rb
@@ -2,7 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require 'spec_helper'
require Rails.root.join('lib', 'diaspora', 'exporter')
describe Diaspora::Exporter do
diff --git a/spec/lib/diaspora/federated/base_spec.rb b/spec/lib/diaspora/federated/base_spec.rb
index 78b262dfd..706abb7b3 100644
--- a/spec/lib/diaspora/federated/base_spec.rb
+++ b/spec/lib/diaspora/federated/base_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require "spec_helper"
-
describe Diaspora::Federated::Base do
class Foo
include Diaspora::Federated::Base
diff --git a/spec/lib/diaspora/federated/retraction_spec.rb b/spec/lib/diaspora/federated/retraction_spec.rb
index 450ff20c9..3f7b9f39b 100644
--- a/spec/lib/diaspora/federated/retraction_spec.rb
+++ b/spec/lib/diaspora/federated/retraction_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require "spec_helper"
-
describe Retraction do
let(:post) { alice.post(:status_message, text: "destroy!", public: true) }
let(:retraction) { Retraction.for(post, alice) }
diff --git a/spec/lib/diaspora/federation/dispatcher/private_spec.rb b/spec/lib/diaspora/federation/dispatcher/private_spec.rb
index b70d7996d..9f20ece51 100644
--- a/spec/lib/diaspora/federation/dispatcher/private_spec.rb
+++ b/spec/lib/diaspora/federation/dispatcher/private_spec.rb
@@ -1,5 +1,3 @@
-require "spec_helper"
-
describe Diaspora::Federation::Dispatcher::Private do
let(:post) { FactoryGirl.create(:status_message, author: alice.person, text: "hello", public: false) }
let(:comment) { FactoryGirl.create(:comment, author: alice.person, post: post) }
diff --git a/spec/lib/diaspora/federation/dispatcher/public_spec.rb b/spec/lib/diaspora/federation/dispatcher/public_spec.rb
index 20c144ea6..bb5bac652 100644
--- a/spec/lib/diaspora/federation/dispatcher/public_spec.rb
+++ b/spec/lib/diaspora/federation/dispatcher/public_spec.rb
@@ -1,5 +1,3 @@
-require "spec_helper"
-
describe Diaspora::Federation::Dispatcher::Public do
let(:post) { FactoryGirl.create(:status_message, author: alice.person, text: "hello", public: true) }
let(:comment) { FactoryGirl.create(:comment, author: alice.person, post: post) }
diff --git a/spec/lib/diaspora/federation/dispatcher_spec.rb b/spec/lib/diaspora/federation/dispatcher_spec.rb
index 40ab01dc8..d4baadade 100644
--- a/spec/lib/diaspora/federation/dispatcher_spec.rb
+++ b/spec/lib/diaspora/federation/dispatcher_spec.rb
@@ -1,5 +1,3 @@
-require "spec_helper"
-
describe Diaspora::Federation::Dispatcher do
let(:post) { FactoryGirl.create(:status_message, author: alice.person, text: "hello", public: true) }
let(:opts) { {service_types: "Services::Twitter"} }
diff --git a/spec/lib/diaspora/federation/entities_spec.rb b/spec/lib/diaspora/federation/entities_spec.rb
index 8e97e6705..671cbd562 100644
--- a/spec/lib/diaspora/federation/entities_spec.rb
+++ b/spec/lib/diaspora/federation/entities_spec.rb
@@ -1,5 +1,3 @@
-require "spec_helper"
-
describe Diaspora::Federation::Entities do
describe ".build" do
it "builds an account deletion" do
diff --git a/spec/lib/diaspora/federation/receive_spec.rb b/spec/lib/diaspora/federation/receive_spec.rb
index df9e5da67..7e55bb7b8 100644
--- a/spec/lib/diaspora/federation/receive_spec.rb
+++ b/spec/lib/diaspora/federation/receive_spec.rb
@@ -1,5 +1,3 @@
-require "spec_helper"
-
describe Diaspora::Federation::Receive do
let(:sender) { FactoryGirl.create(:person) }
let(:post) { FactoryGirl.create(:status_message, text: "hello", public: true, author: alice.person) }
diff --git a/spec/lib/diaspora/fetcher/public_spec.rb b/spec/lib/diaspora/fetcher/public_spec.rb
index 6ad2fbebe..08468d105 100644
--- a/spec/lib/diaspora/fetcher/public_spec.rb
+++ b/spec/lib/diaspora/fetcher/public_spec.rb
@@ -2,12 +2,9 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require 'spec_helper'
-
# Tests fetching public posts of a person on a remote server
describe Diaspora::Fetcher::Public do
before do
-
# the fixture is taken from an actual json request.
# it contains 10 StatusMessages and 5 Reshares, all of them public
# the guid of the person is "7445f9a0a6c28ebb"
diff --git a/spec/lib/diaspora/markdownify_email_spec.rb b/spec/lib/diaspora/markdownify_email_spec.rb
index 5d4ae7186..bac2de175 100644
--- a/spec/lib/diaspora/markdownify_email_spec.rb
+++ b/spec/lib/diaspora/markdownify_email_spec.rb
@@ -1,5 +1,3 @@
-require 'spec_helper'
-
describe Diaspora::Markdownify::Email do
include Rails.application.routes.url_helpers
diff --git a/spec/lib/diaspora/markdownify_spec.rb b/spec/lib/diaspora/markdownify_spec.rb
index 161f88ff6..10ac97a8b 100644
--- a/spec/lib/diaspora/markdownify_spec.rb
+++ b/spec/lib/diaspora/markdownify_spec.rb
@@ -1,5 +1,3 @@
-require "spec_helper"
-
describe Diaspora::Markdownify::HTML do
describe "#autolink" do
before do
diff --git a/spec/lib/diaspora/mentionable_spec.rb b/spec/lib/diaspora/mentionable_spec.rb
index 552097a2e..365d2dd04 100644
--- a/spec/lib/diaspora/mentionable_spec.rb
+++ b/spec/lib/diaspora/mentionable_spec.rb
@@ -1,6 +1,3 @@
-
-require "spec_helper"
-
describe Diaspora::Mentionable do
include PeopleHelper
diff --git a/spec/lib/diaspora/message_renderer_spec.rb b/spec/lib/diaspora/message_renderer_spec.rb
index 9362c6fd0..fa0aa3b3b 100644
--- a/spec/lib/diaspora/message_renderer_spec.rb
+++ b/spec/lib/diaspora/message_renderer_spec.rb
@@ -1,5 +1,3 @@
-require 'spec_helper'
-
describe Diaspora::MessageRenderer do
MESSAGE_NORMALIZTIONS = {
"\u202a#\u200eUSA\u202c" => "#USA",
diff --git a/spec/lib/diaspora/shareable_spec.rb b/spec/lib/diaspora/shareable_spec.rb
index 4df87e80a..716373a4d 100644
--- a/spec/lib/diaspora/shareable_spec.rb
+++ b/spec/lib/diaspora/shareable_spec.rb
@@ -1,5 +1,3 @@
-require "spec_helper"
-
describe Diaspora::Shareable do
describe "scopes" do
context "having multiple objects with equal db IDs" do
diff --git a/spec/lib/diaspora/taggable_spec.rb b/spec/lib/diaspora/taggable_spec.rb
index bbc557d6e..501285623 100644
--- a/spec/lib/diaspora/taggable_spec.rb
+++ b/spec/lib/diaspora/taggable_spec.rb
@@ -1,5 +1,3 @@
-require "spec_helper"
-
describe Diaspora::Taggable do
include Rails.application.routes.url_helpers
diff --git a/spec/lib/direction_detector_spec.rb b/spec/lib/direction_detector_spec.rb
index b19e854db..50c924b8a 100644
--- a/spec/lib/direction_detector_spec.rb
+++ b/spec/lib/direction_detector_spec.rb
@@ -3,8 +3,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require 'spec_helper'
-
describe String do
let(:english) { "Hello World" }
let(:chinese) { "你好世界" }
@@ -24,29 +22,6 @@ describe String do
let(:hebrew_arabic) { "#{hebrew} #{arabic}" }
- describe "#stats_with_rtl_char?" do
- it 'returns true or false correctly' do
- expect(english.starts_with_rtl_char?).to be false
- expect(chinese.starts_with_rtl_char?).to be false
- expect(arabic.starts_with_rtl_char?).to be true
- expect(hebrew.starts_with_rtl_char?).to be true
- expect(hebrew_arabic.starts_with_rtl_char?).to be true
- end
-
- it 'only looks at the first char' do
- expect(english_chinese.starts_with_rtl_char?).to be false
- expect(chinese_english.starts_with_rtl_char?).to be false
- expect(english_arabic.starts_with_rtl_char?).to be false
- expect(hebrew_english.starts_with_rtl_char?).to be true
- expect(arabic_chinese.starts_with_rtl_char?).to be true
- end
-
- it 'ignores whitespaces' do
- expect(" \n \r \t".starts_with_rtl_char?).to be false
- expect(" #{arabic} ".starts_with_rtl_char?).to be true
- end
- end
-
describe "#is_rtl?" do
it 'returns true or false correctly' do
expect(english.is_rtl?).to be false
@@ -65,17 +40,16 @@ describe String do
expect("#{english} #{arabic} #{arabic}".is_rtl?).to be true
end
- it "fallbacks to the first word if there's no majority" do
- expect(hebrew_english.is_rtl?).to be true
- expect(english_hebrew.is_rtl?).to be false
- expect(arabic_english.is_rtl?).to be true
- expect(english_arabic.is_rtl?).to be false
- end
-
it 'ignores whitespaces' do
expect(" \n \r \t".is_rtl?).to be false
expect(" #{arabic} ".is_rtl?).to be true
end
+
+ it "ignores byte order marks" do
+ expect("\u{feff}".is_rtl?).to be false
+ expect("\u{feff}#{arabic}".is_rtl?).to be true
+ expect("\u{feff}#{english}".is_rtl?).to be false
+ end
end
describe '#cleaned_is_rtl?' do
diff --git a/spec/lib/email_inviter_spec.rb b/spec/lib/email_inviter_spec.rb
index 68cd1197c..33f7fecfd 100644
--- a/spec/lib/email_inviter_spec.rb
+++ b/spec/lib/email_inviter_spec.rb
@@ -1,5 +1,3 @@
-require 'spec_helper'
-
describe EmailInviter do
before do
@user = double(:invitation_code => 'coolcodebro', :present? => true,
diff --git a/spec/lib/evil_query_spec.rb b/spec/lib/evil_query_spec.rb
index fed0c55ed..082cccead 100644
--- a/spec/lib/evil_query_spec.rb
+++ b/spec/lib/evil_query_spec.rb
@@ -1,5 +1,3 @@
-require 'spec_helper'
-
describe EvilQuery::MultiStream do
let(:evil_query) { EvilQuery::MultiStream.new(alice, "created_at", Time.zone.now, true) }
diff --git a/spec/lib/i18n_interpolation_fallbacks_spec.rb b/spec/lib/i18n_interpolation_fallbacks_spec.rb
index a93fe1f59..5c306849d 100644
--- a/spec/lib/i18n_interpolation_fallbacks_spec.rb
+++ b/spec/lib/i18n_interpolation_fallbacks_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require 'spec_helper'
-
describe "i18n interpolation fallbacks" do
describe "when string does not require interpolation arguments" do
it "works normally" do
diff --git a/spec/lib/publisher_spec.rb b/spec/lib/publisher_spec.rb
index abbd5ab5b..8eeb76d24 100644
--- a/spec/lib/publisher_spec.rb
+++ b/spec/lib/publisher_spec.rb
@@ -1,6 +1,3 @@
-
-require 'spec_helper'
-
describe Publisher do
before do
@publisher = Publisher.new(alice)
diff --git a/spec/lib/pubsubhubbub_spec.rb b/spec/lib/pubsubhubbub_spec.rb
index 896e08279..0292c6472 100644
--- a/spec/lib/pubsubhubbub_spec.rb
+++ b/spec/lib/pubsubhubbub_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require 'spec_helper'
-
describe Pubsubhubbub do
describe '#publish' do
it 'posts the feed to the given hub' do
diff --git a/spec/lib/rack/internet_explorer_version_spec.rb b/spec/lib/rack/internet_explorer_version_spec.rb
index 2bc7a75c0..78781cb25 100644
--- a/spec/lib/rack/internet_explorer_version_spec.rb
+++ b/spec/lib/rack/internet_explorer_version_spec.rb
@@ -1,7 +1,6 @@
# 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 Rack::InternetExplorerVersion do
before :all do
diff --git a/spec/lib/stream/activity_spec.rb b/spec/lib/stream/activity_spec.rb
index bb066a3f8..a57cce580 100644
--- a/spec/lib/stream/activity_spec.rb
+++ b/spec/lib/stream/activity_spec.rb
@@ -1,4 +1,3 @@
-require 'spec_helper'
require Rails.root.join('spec', 'shared_behaviors', 'stream')
describe Stream::Activity do
diff --git a/spec/lib/stream/aspect_spec.rb b/spec/lib/stream/aspect_spec.rb
index 96c8ce7c4..6b5003f3a 100644
--- a/spec/lib/stream/aspect_spec.rb
+++ b/spec/lib/stream/aspect_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require 'spec_helper'
-
describe Stream::Aspect do
describe '#aspects' do
it 'queries the user given initialized aspect ids' do
diff --git a/spec/lib/stream/base_spec.rb b/spec/lib/stream/base_spec.rb
index 2f5c2435e..76ddcd1ba 100644
--- a/spec/lib/stream/base_spec.rb
+++ b/spec/lib/stream/base_spec.rb
@@ -1,4 +1,3 @@
-require 'spec_helper'
require Rails.root.join('spec', 'shared_behaviors', 'stream')
describe Stream::Base do
@@ -6,12 +5,6 @@ describe Stream::Base do
@stream = Stream::Base.new(alice)
end
- describe '#contacts_link' do
- it 'should default to your contacts page' do
- expect(@stream.contacts_link).to match(/contacts/)
- end
- end
-
describe '#stream_posts' do
it "should returns the posts.for_a_stream" do
posts = double
diff --git a/spec/lib/stream/comments_spec.rb b/spec/lib/stream/comments_spec.rb
index 2140eff96..8cc926870 100644
--- a/spec/lib/stream/comments_spec.rb
+++ b/spec/lib/stream/comments_spec.rb
@@ -1,4 +1,3 @@
-require 'spec_helper'
require Rails.root.join('spec', 'shared_behaviors', 'stream')
describe Stream::Comments do
diff --git a/spec/lib/stream/followed_tag_spec.rb b/spec/lib/stream/followed_tag_spec.rb
index f46d49a70..61569d7c4 100644
--- a/spec/lib/stream/followed_tag_spec.rb
+++ b/spec/lib/stream/followed_tag_spec.rb
@@ -1,4 +1,3 @@
-require 'spec_helper'
require Rails.root.join('spec', 'shared_behaviors', 'stream')
describe Stream::FollowedTag do
diff --git a/spec/lib/stream/likes_spec.rb b/spec/lib/stream/likes_spec.rb
index e4fc44d98..f8d1b2503 100644
--- a/spec/lib/stream/likes_spec.rb
+++ b/spec/lib/stream/likes_spec.rb
@@ -1,4 +1,3 @@
-require 'spec_helper'
require Rails.root.join('spec', 'shared_behaviors', 'stream')
describe Stream::Likes do
diff --git a/spec/lib/stream/mention_spec.rb b/spec/lib/stream/mention_spec.rb
index 399a7945b..bf292dccd 100644
--- a/spec/lib/stream/mention_spec.rb
+++ b/spec/lib/stream/mention_spec.rb
@@ -1,4 +1,3 @@
-require 'spec_helper'
require Rails.root.join('spec', 'shared_behaviors', 'stream')
describe Stream::Mention do
diff --git a/spec/lib/stream/multi_spec.rb b/spec/lib/stream/multi_spec.rb
index b53ee384c..c5c222546 100644
--- a/spec/lib/stream/multi_spec.rb
+++ b/spec/lib/stream/multi_spec.rb
@@ -1,4 +1,3 @@
-require 'spec_helper'
require Rails.root.join('spec', 'shared_behaviors', 'stream')
describe Stream::Multi do
diff --git a/spec/lib/stream/person_spec.rb b/spec/lib/stream/person_spec.rb
index a320f800e..b5cd7422b 100644
--- a/spec/lib/stream/person_spec.rb
+++ b/spec/lib/stream/person_spec.rb
@@ -1,4 +1,3 @@
-require 'spec_helper'
require Rails.root.join('spec', 'shared_behaviors', 'stream')
describe Stream::Person do
diff --git a/spec/lib/stream/public_spec.rb b/spec/lib/stream/public_spec.rb
index a17348cef..f6fbe8b5c 100644
--- a/spec/lib/stream/public_spec.rb
+++ b/spec/lib/stream/public_spec.rb
@@ -1,4 +1,3 @@
-require 'spec_helper'
require Rails.root.join('spec', 'shared_behaviors', 'stream')
describe Stream::Public do
diff --git a/spec/lib/stream/tag_spec.rb b/spec/lib/stream/tag_spec.rb
index 75952680a..afde047f9 100644
--- a/spec/lib/stream/tag_spec.rb
+++ b/spec/lib/stream/tag_spec.rb
@@ -2,7 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require 'spec_helper'
require Rails.root.join('spec', 'shared_behaviors', 'stream')
describe Stream::Tag do
diff --git a/spec/locale_spec.rb b/spec/locale_spec.rb
index 18ee1864c..9aae0dc13 100644
--- a/spec/locale_spec.rb
+++ b/spec/locale_spec.rb
@@ -1,5 +1,3 @@
-require 'spec_helper'
-
describe 'locale files' do
describe "cldr/plurals.rb" do
AVAILABLE_LANGUAGE_CODES.each do |locale|
diff --git a/spec/mailers/export_spec.rb b/spec/mailers/export_spec.rb
index 24b10753b..0c1e7a9ca 100644
--- a/spec/mailers/export_spec.rb
+++ b/spec/mailers/export_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require 'spec_helper'
-
describe ExportMailer, :type => :mailer do
describe '#export_complete_for' do
it "should deliver successfully" do
diff --git a/spec/mailers/maintenance_spec.rb b/spec/mailers/maintenance_spec.rb
index a0df04683..4b997833b 100644
--- a/spec/mailers/maintenance_spec.rb
+++ b/spec/mailers/maintenance_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require 'spec_helper'
-
describe Maintenance, :type => :mailer do
describe 'create warning' do
before do
diff --git a/spec/mailers/notifier_spec.rb b/spec/mailers/notifier_spec.rb
index 6551b9f9c..a23b796b8 100644
--- a/spec/mailers/notifier_spec.rb
+++ b/spec/mailers/notifier_spec.rb
@@ -1,5 +1,3 @@
-require "spec_helper"
-
describe Notifier, type: :mailer do
let(:person) { FactoryGirl.create(:person) }
@@ -478,7 +476,9 @@ describe Notifier, type: :mailer do
end
it "has some informative text in the body" do
- expect(email.body.encoded).to include("https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)")
+ email.body.parts.each do |part|
+ expect(part.decoded).to include("https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)")
+ end
end
end
diff --git a/spec/mailers/report_spec.rb b/spec/mailers/report_spec.rb
index 5ecb66923..ce168bb3b 100644
--- a/spec/mailers/report_spec.rb
+++ b/spec/mailers/report_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require "spec_helper"
-
describe Report, type: :mailer do
describe "#make_notification" do
before do
diff --git a/spec/misc_spec.rb b/spec/misc_spec.rb
index 721b4ddce..1e9851fa9 100644
--- a/spec/misc_spec.rb
+++ b/spec/misc_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require 'spec_helper'
-
describe 'making sure the spec runner works' do
it 'factory creates a user with a person saved' do
user = FactoryGirl.create(:user)
diff --git a/spec/models/account_deletion_spec.rb b/spec/models/account_deletion_spec.rb
index 4b0734b19..972435818 100644
--- a/spec/models/account_deletion_spec.rb
+++ b/spec/models/account_deletion_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require "spec_helper"
-
describe AccountDeletion, type: :model do
let(:account_deletion) { AccountDeletion.new(person: alice.person) }
diff --git a/spec/models/acts_as_taggable_on_tag_spec.rb b/spec/models/acts_as_taggable_on_tag_spec.rb
index 53e9718d2..c5d341224 100644
--- a/spec/models/acts_as_taggable_on_tag_spec.rb
+++ b/spec/models/acts_as_taggable_on_tag_spec.rb
@@ -1,5 +1,3 @@
-require "spec_helper"
-
describe ActsAsTaggableOn::Tag, :type => :model do
subject(:tag) { ActsAsTaggableOn::Tag }
diff --git a/spec/models/api/openid_connect/id_token_spec.rb b/spec/models/api/openid_connect/id_token_spec.rb
index 2ca0d15ae..7c85c3cb4 100644
--- a/spec/models/api/openid_connect/id_token_spec.rb
+++ b/spec/models/api/openid_connect/id_token_spec.rb
@@ -1,5 +1,3 @@
-require "spec_helper"
-
describe Api::OpenidConnect::IdToken, type: :model do
describe "#to_jwt" do
let(:auth) { FactoryGirl.create(:auth_with_read) }
diff --git a/spec/models/aspect_membership_spec.rb b/spec/models/aspect_membership_spec.rb
index f57950794..6bfda4551 100644
--- a/spec/models/aspect_membership_spec.rb
+++ b/spec/models/aspect_membership_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
#
-require "spec_helper"
-
describe AspectMembership, :type => :model do
describe "#before_destroy" do
let(:aspect) { alice.aspects.create(name: "two") }
diff --git a/spec/models/aspect_spec.rb b/spec/models/aspect_spec.rb
index 3ccae9515..4899a2f40 100644
--- a/spec/models/aspect_spec.rb
+++ b/spec/models/aspect_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require "spec_helper"
-
describe Aspect, :type => :model do
describe "creation" do
let(:name) { alice.aspects.first.name }
diff --git a/spec/models/aspect_visibility_spec.rb b/spec/models/aspect_visibility_spec.rb
index b27b2e984..61b9aa28b 100644
--- a/spec/models/aspect_visibility_spec.rb
+++ b/spec/models/aspect_visibility_spec.rb
@@ -1,5 +1,3 @@
-require "spec_helper"
-
describe AspectVisibility, type: :model do
let(:status_message) { FactoryGirl.create(:status_message) }
let(:aspect) { FactoryGirl.create(:aspect) }
diff --git a/spec/models/block_spec.rb b/spec/models/block_spec.rb
index 54f7317fd..e85ea6600 100644
--- a/spec/models/block_spec.rb
+++ b/spec/models/block_spec.rb
@@ -1,5 +1,3 @@
-require "spec_helper"
-
describe Block, :type => :model do
describe "validations" do
it "doesnt allow you to block yourself" do
diff --git a/spec/models/comment_signature_spec.rb b/spec/models/comment_signature_spec.rb
index 396dbb903..c669786d3 100644
--- a/spec/models/comment_signature_spec.rb
+++ b/spec/models/comment_signature_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require "spec_helper"
-
describe CommentSignature, type: :model do
it_behaves_like "signature data" do
let(:relayable_type) { :comment }
diff --git a/spec/models/comment_spec.rb b/spec/models/comment_spec.rb
index 583217755..4fe1d983b 100644
--- a/spec/models/comment_spec.rb
+++ b/spec/models/comment_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require "spec_helper"
-
describe Comment, type: :model do
let(:alices_aspect) { alice.aspects.first }
let(:status_bob) { bob.post(:status_message, text: "hello", to: bob.aspects.first.id) }
diff --git a/spec/models/contact_spec.rb b/spec/models/contact_spec.rb
index 0245d1ab0..1f9318519 100644
--- a/spec/models/contact_spec.rb
+++ b/spec/models/contact_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require "spec_helper"
-
describe Contact, type: :model do
describe "aspect_memberships" do
it "deletes dependent aspect memberships" do
diff --git a/spec/models/conversation_spec.rb b/spec/models/conversation_spec.rb
index 5bb08c2c1..4ec3f6140 100644
--- a/spec/models/conversation_spec.rb
+++ b/spec/models/conversation_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require "spec_helper"
-
describe Conversation, :type => :model do
let(:user1) { alice }
let(:user2) { bob }
diff --git a/spec/models/conversation_visibilities_spec.rb b/spec/models/conversation_visibilities_spec.rb
index 68a77a2f9..4c968622c 100644
--- a/spec/models/conversation_visibilities_spec.rb
+++ b/spec/models/conversation_visibilities_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require "spec_helper"
-
describe ConversationVisibility, type: :model do
let(:user1) { alice }
let(:participant_ids) { [user1.contacts.first.person.id, user1.person.id] }
diff --git a/spec/models/invitation_code_spec.rb b/spec/models/invitation_code_spec.rb
index 61d90583e..2912c1415 100644
--- a/spec/models/invitation_code_spec.rb
+++ b/spec/models/invitation_code_spec.rb
@@ -1,5 +1,3 @@
-require 'spec_helper'
-
describe InvitationCode, :type => :model do
it 'has a valid factory' do
expect(FactoryGirl.build(:invitation_code)).to be_valid
diff --git a/spec/models/like_signature_spec.rb b/spec/models/like_signature_spec.rb
index d31a37433..79b5228d4 100644
--- a/spec/models/like_signature_spec.rb
+++ b/spec/models/like_signature_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require "spec_helper"
-
describe LikeSignature, type: :model do
it_behaves_like "signature data" do
let(:relayable_type) { :like }
diff --git a/spec/models/like_spec.rb b/spec/models/like_spec.rb
index a7899355a..6236924b1 100644
--- a/spec/models/like_spec.rb
+++ b/spec/models/like_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require "spec_helper"
-
describe Like, type: :model do
let(:status) { bob.post(:status_message, text: "hello", to: bob.aspects.first.id) }
diff --git a/spec/models/location_spec.rb b/spec/models/location_spec.rb
index 94eb12a08..fe3eadfe3 100644
--- a/spec/models/location_spec.rb
+++ b/spec/models/location_spec.rb
@@ -1,5 +1,3 @@
-require 'spec_helper'
-
describe Location, :type => :model do
describe 'before validation' do
it 'should create new location when it has coordinates' do
diff --git a/spec/models/mention_spec.rb b/spec/models/mention_spec.rb
index 5ea19fcfd..e0e3a2a46 100644
--- a/spec/models/mention_spec.rb
+++ b/spec/models/mention_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require "spec_helper"
-
describe Mention, type: :model do
describe "after destroy" do
it "destroys a notification" do
diff --git a/spec/models/message_spec.rb b/spec/models/message_spec.rb
index ec853498c..051b384ce 100644
--- a/spec/models/message_spec.rb
+++ b/spec/models/message_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require "spec_helper"
-
describe Message, type: :model do
let(:create_hash) {
{
diff --git a/spec/models/notification_spec.rb b/spec/models/notification_spec.rb
index 6008ac5f5..392fc3940 100644
--- a/spec/models/notification_spec.rb
+++ b/spec/models/notification_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require 'spec_helper'
-
describe Notification, :type => :model do
before do
@sm = FactoryGirl.create(:status_message)
diff --git a/spec/models/notifications/also_commented_spec.rb b/spec/models/notifications/also_commented_spec.rb
index 72361bf03..ba57068f7 100644
--- a/spec/models/notifications/also_commented_spec.rb
+++ b/spec/models/notifications/also_commented_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require "spec_helper"
-
describe Notifications::AlsoCommented, type: :model do
let(:sm) { FactoryGirl.build(:status_message, author: alice.person, public: true) }
let(:comment) { FactoryGirl.create(:comment, commentable: sm) }
diff --git a/spec/models/notifications/mentioned_spec.rb b/spec/models/notifications/mentioned_spec.rb
index cb63bb9ff..d9f05f30e 100644
--- a/spec/models/notifications/mentioned_spec.rb
+++ b/spec/models/notifications/mentioned_spec.rb
@@ -1,5 +1,3 @@
-require "spec_helper"
-
describe Notifications::Mentioned, type: :model do
let(:sm) {
FactoryGirl.create(:status_message, author: alice.person, text: "hi @{bob; #{bob.diaspora_handle}}", public: true)
diff --git a/spec/models/notifications/private_message_spec.rb b/spec/models/notifications/private_message_spec.rb
index 07916220c..4ab3b0d79 100644
--- a/spec/models/notifications/private_message_spec.rb
+++ b/spec/models/notifications/private_message_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require "spec_helper"
-
describe Notifications::PrivateMessage, type: :model do
let(:conversation) {
conv_guid = FactoryGirl.generate(:guid)
diff --git a/spec/models/notifications/reshared_spec.rb b/spec/models/notifications/reshared_spec.rb
index 203ed5230..6a9cb82ab 100644
--- a/spec/models/notifications/reshared_spec.rb
+++ b/spec/models/notifications/reshared_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require "spec_helper"
-
describe Notifications::Reshared, type: :model do
let(:sm) { FactoryGirl.build(:status_message, author: alice.person, public: true) }
let(:reshare) { FactoryGirl.build(:reshare, root: sm) }
diff --git a/spec/models/notifications/started_sharing_spec.rb b/spec/models/notifications/started_sharing_spec.rb
index 29fb2d4e7..4c5a094b8 100644
--- a/spec/models/notifications/started_sharing_spec.rb
+++ b/spec/models/notifications/started_sharing_spec.rb
@@ -1,5 +1,3 @@
-require "spec_helper"
-
describe Notifications::StartedSharing, type: :model do
let(:contact) { alice.contact_for(bob.person) }
let(:started_sharing_notification) { Notifications::StartedSharing.new(recipient: alice) }
diff --git a/spec/models/open_graph_cache_spec.rb b/spec/models/open_graph_cache_spec.rb
index adbf98a03..8edd764c6 100644
--- a/spec/models/open_graph_cache_spec.rb
+++ b/spec/models/open_graph_cache_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require "spec_helper"
-
describe OpenGraphCache, type: :model do
describe "fetch_and_save_opengraph_data!" do
context "with an unsecure video url" do
diff --git a/spec/models/participation_spec.rb b/spec/models/participation_spec.rb
index 806c7e681..7ee4d189b 100644
--- a/spec/models/participation_spec.rb
+++ b/spec/models/participation_spec.rb
@@ -1,5 +1,3 @@
-require "spec_helper"
-
describe Participation, type: :model do
let(:status) { bob.post(:status_message, text: "hello", to: bob.aspects.first.id) }
diff --git a/spec/models/person_spec.rb b/spec/models/person_spec.rb
index 0c3e7649c..bb2bb7d6b 100644
--- a/spec/models/person_spec.rb
+++ b/spec/models/person_spec.rb
@@ -2,10 +2,7 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require 'spec_helper'
-
describe Person, :type => :model do
-
before do
@user = bob
@person = FactoryGirl.create(:person)
diff --git a/spec/models/photo_spec.rb b/spec/models/photo_spec.rb
index e6b9a169b..1d3ee559d 100644
--- a/spec/models/photo_spec.rb
+++ b/spec/models/photo_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require 'spec_helper'
-
def with_carrierwave_processing(&block)
UnprocessedImage.enable_processing = true
val = yield
diff --git a/spec/models/pod_spec.rb b/spec/models/pod_spec.rb
index beb283414..730f240e3 100644
--- a/spec/models/pod_spec.rb
+++ b/spec/models/pod_spec.rb
@@ -1,5 +1,3 @@
-require "spec_helper"
-
describe Pod, type: :model do
describe ".find_or_create_by" do
it "takes a url, and makes one by host" do
@@ -82,6 +80,16 @@ describe Pod, type: :model do
end
end
+ describe ".check_scheduled!" do
+ it "calls #test_connection! on all scheduled pods" do
+ (0..4).map { FactoryGirl.create(:pod) }
+ FactoryGirl.create(:pod, scheduled_check: true)
+
+ expect_any_instance_of(Pod).to receive(:test_connection!)
+ Pod.check_scheduled!
+ end
+ end
+
describe "#active?" do
it "returns true for an unchecked pod" do
pod = FactoryGirl.create(:pod)
@@ -104,6 +112,32 @@ describe Pod, type: :model do
end
end
+ describe "#schedule_check_if_needed" do
+ it "schedules the pod for the next check if it is offline" do
+ pod = FactoryGirl.create(:pod, status: :net_failed)
+ pod.schedule_check_if_needed
+ expect(pod.scheduled_check).to be_truthy
+ end
+
+ it "does nothing if the pod unchecked" do
+ pod = FactoryGirl.create(:pod)
+ pod.schedule_check_if_needed
+ expect(pod.scheduled_check).to be_falsey
+ end
+
+ it "does nothing if the pod is online" do
+ pod = FactoryGirl.create(:pod, status: :no_errors)
+ pod.schedule_check_if_needed
+ expect(pod.scheduled_check).to be_falsey
+ end
+
+ it "does nothing if the pod is scheduled for the next check" do
+ pod = FactoryGirl.create(:pod, status: :no_errors, scheduled_check: true)
+ expect(pod).not_to receive(:update_column)
+ pod.schedule_check_if_needed
+ end
+ end
+
describe "#test_connection!" do
before do
@pod = FactoryGirl.create(:pod)
@@ -127,6 +161,16 @@ describe Pod, type: :model do
expect(@pod.checked_at).to be_within(1.second).of Time.zone.now
end
+ it "resets the scheduled_check flag" do
+ allow(@result).to receive(:error)
+ allow(@result).to receive(:error?)
+ @pod.update_column(:scheduled_check, true)
+
+ @pod.test_connection!
+
+ expect(@pod.scheduled_check).to be_falsey
+ end
+
it "handles a failed check" do
expect(@result).to receive(:error?).at_least(:once) { true }
expect(@result).to receive(:error).at_least(:once) { ConnectionTester::NetFailure.new }
diff --git a/spec/models/poll_answer_spec.rb b/spec/models/poll_answer_spec.rb
index 4249a6af9..780f2b7b3 100644
--- a/spec/models/poll_answer_spec.rb
+++ b/spec/models/poll_answer_spec.rb
@@ -1,5 +1,3 @@
-require 'spec_helper'
-
describe PollAnswer, :type => :model do
before do
@status = FactoryGirl.create(:status_message_with_poll)
diff --git a/spec/models/poll_participation_signature_spec.rb b/spec/models/poll_participation_signature_spec.rb
index 6427d40fb..181b4d94f 100644
--- a/spec/models/poll_participation_signature_spec.rb
+++ b/spec/models/poll_participation_signature_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require "spec_helper"
-
describe PollParticipationSignature, type: :model do
it_behaves_like "signature data" do
let(:relayable_type) { :poll_participation }
diff --git a/spec/models/poll_participation_spec.rb b/spec/models/poll_participation_spec.rb
index 7d79a09a5..65730481b 100644
--- a/spec/models/poll_participation_spec.rb
+++ b/spec/models/poll_participation_spec.rb
@@ -1,5 +1,3 @@
-require "spec_helper"
-
describe PollParticipation, type: :model do
before do
@alices_aspect = alice.aspects.first
diff --git a/spec/models/poll_spec.rb b/spec/models/poll_spec.rb
index 14e7af31a..30fd872bb 100644
--- a/spec/models/poll_spec.rb
+++ b/spec/models/poll_spec.rb
@@ -1,5 +1,3 @@
-require 'spec_helper'
-
describe Poll, :type => :model do
before do
@poll = Poll.new(:question => "What do you think about apples?")
diff --git a/spec/models/post_spec.rb b/spec/models/post_spec.rb
index afd154694..fd7b44274 100644
--- a/spec/models/post_spec.rb
+++ b/spec/models/post_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require 'spec_helper'
-
describe Post, :type => :model do
describe 'scopes' do
describe '.owned_or_visible_by_user' do
diff --git a/spec/models/profile_spec.rb b/spec/models/profile_spec.rb
index f29d8da26..85c630bfe 100644
--- a/spec/models/profile_spec.rb
+++ b/spec/models/profile_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require 'spec_helper'
-
describe Profile, :type => :model do
describe 'validation' do
describe "of first_name" do
diff --git a/spec/models/report_spec.rb b/spec/models/report_spec.rb
index 04e4bc85a..12b843656 100644
--- a/spec/models/report_spec.rb
+++ b/spec/models/report_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require 'spec_helper'
-
describe Report, :type => :model do
before do
#:report => { :item_id => @message.id, :item_type => 'post', :text => 'offensive content' }
diff --git a/spec/models/reshare_spec.rb b/spec/models/reshare_spec.rb
index cc436de9a..b861065ea 100644
--- a/spec/models/reshare_spec.rb
+++ b/spec/models/reshare_spec.rb
@@ -1,5 +1,3 @@
-require "spec_helper"
-
describe Reshare, type: :model do
it "has a valid Factory" do
expect(FactoryGirl.build(:reshare)).to be_valid
diff --git a/spec/models/role_spec.rb b/spec/models/role_spec.rb
index 225cd4ead..97b4424d1 100644
--- a/spec/models/role_spec.rb
+++ b/spec/models/role_spec.rb
@@ -1,5 +1,3 @@
-require "spec_helper"
-
describe Role do
let!(:person) { create(:person) }
let!(:admin) { create(:person) }
diff --git a/spec/models/service_spec.rb b/spec/models/service_spec.rb
index a7aa8a3e6..b15287a38 100644
--- a/spec/models/service_spec.rb
+++ b/spec/models/service_spec.rb
@@ -1,7 +1,4 @@
-require 'spec_helper'
-
describe Service, :type => :model do
-
before do
@post = alice.post(:status_message, :text => "hello", :to => alice.aspects.first.id)
@service = Services::Facebook.new(:access_token => "yeah", :uid => 1)
diff --git a/spec/models/services/facebook_spec.rb b/spec/models/services/facebook_spec.rb
index 162e72ef0..ec5176b4c 100644
--- a/spec/models/services/facebook_spec.rb
+++ b/spec/models/services/facebook_spec.rb
@@ -1,7 +1,4 @@
-require 'spec_helper'
-
describe Services::Facebook, :type => :model do
-
before do
@user = alice
@post = @user.post(:status_message, :text => "hello", :to =>@user.aspects.first.id, :public =>true, :photos => [])
diff --git a/spec/models/services/tumblr_spec.rb b/spec/models/services/tumblr_spec.rb
index 2a8f0d71b..43113a590 100644
--- a/spec/models/services/tumblr_spec.rb
+++ b/spec/models/services/tumblr_spec.rb
@@ -1,5 +1,3 @@
-require "spec_helper"
-
describe Services::Tumblr, type: :model do
let(:user) { alice }
let(:post) { user.post(:status_message, text: "hello", to: user.aspects.first.id) }
diff --git a/spec/models/services/twitter_spec.rb b/spec/models/services/twitter_spec.rb
index b2d09cae3..79469a8c1 100644
--- a/spec/models/services/twitter_spec.rb
+++ b/spec/models/services/twitter_spec.rb
@@ -1,7 +1,4 @@
-require 'spec_helper'
-
describe Services::Twitter, :type => :model do
-
before do
@user = alice
@post = @user.post(:status_message, :text => "hello", :to =>@user.aspects.first.id, :photos => [])
diff --git a/spec/models/services/wordpress_spec.rb b/spec/models/services/wordpress_spec.rb
index 23ed5f69b..4b52ae34a 100644
--- a/spec/models/services/wordpress_spec.rb
+++ b/spec/models/services/wordpress_spec.rb
@@ -1,5 +1,3 @@
-require "spec_helper"
-
describe Services::Wordpress, type: :model do
before do
@user = alice
diff --git a/spec/models/share_visibility_spec.rb b/spec/models/share_visibility_spec.rb
index cd691679e..a4ba6f361 100644
--- a/spec/models/share_visibility_spec.rb
+++ b/spec/models/share_visibility_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require "spec_helper"
-
describe ShareVisibility, type: :model do
describe ".batch_import" do
let(:post) { FactoryGirl.create(:status_message, author: alice.person) }
diff --git a/spec/models/signature_order_spec.rb b/spec/models/signature_order_spec.rb
index 646bbcd2e..e3d207281 100644
--- a/spec/models/signature_order_spec.rb
+++ b/spec/models/signature_order_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require "spec_helper"
-
describe SignatureOrder, type: :model do
context "validation" do
it "requires an order" do
diff --git a/spec/models/status_message_spec.rb b/spec/models/status_message_spec.rb
index 674229a91..843305813 100644
--- a/spec/models/status_message_spec.rb
+++ b/spec/models/status_message_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require "spec_helper"
-
describe StatusMessage, type: :model do
include PeopleHelper
diff --git a/spec/models/tag_following_spec.rb b/spec/models/tag_following_spec.rb
index af7879215..cc159a255 100644
--- a/spec/models/tag_following_spec.rb
+++ b/spec/models/tag_following_spec.rb
@@ -1,5 +1,3 @@
-require 'spec_helper'
-
describe TagFollowing, :type => :model do
before do
@tag = FactoryGirl.build(:tag)
diff --git a/spec/models/user/authentication_token_spec.rb b/spec/models/user/authentication_token_spec.rb
new file mode 100644
index 000000000..f43a41557
--- /dev/null
+++ b/spec/models/user/authentication_token_spec.rb
@@ -0,0 +1,40 @@
+describe User::AuthenticationToken, type: :model do
+ describe "#reset_authentication_token!" do
+ it "sets the authentication token" do
+ expect(alice.authentication_token).to be_nil
+ alice.reset_authentication_token!
+ expect(alice.authentication_token).not_to be_nil
+ end
+
+ it "resets the authentication token" do
+ alice.reset_authentication_token!
+ expect { alice.reset_authentication_token! }.to change { alice.authentication_token }
+ end
+ end
+
+ describe "#ensure_authentication_token!" do
+ it "doesn't change the authentication token" do
+ alice.reset_authentication_token!
+ expect { alice.ensure_authentication_token! }.to_not change { alice.authentication_token }
+ end
+
+ it "sets the authentication token if not yet set" do
+ expect(alice.authentication_token).to be_nil
+ alice.ensure_authentication_token!
+ expect(alice.authentication_token).not_to be_nil
+ end
+ end
+
+ describe ".authentication_token" do
+ it "generates an authentication token" do
+ expect(User.authentication_token.length).to eq(30)
+ end
+
+ it "checks that the authentication token is not yet in use by another user" do
+ alice.reset_authentication_token!
+ expect(Devise).to receive(:friendly_token).with(30).and_return(alice.authentication_token, "some_unused_token")
+
+ expect(User.authentication_token).to eq("some_unused_token")
+ end
+ end
+end
diff --git a/spec/models/user/connecting_spec.rb b/spec/models/user/connecting_spec.rb
index 8b8262dd2..455ce2143 100644
--- a/spec/models/user/connecting_spec.rb
+++ b/spec/models/user/connecting_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require "spec_helper"
-
describe User::Connecting, type: :model do
let(:aspect1) { alice.aspects.first }
let(:aspect2) { alice.aspects.create(name: "other") }
diff --git a/spec/models/user/posting_spec.rb b/spec/models/user/posting_spec.rb
index 5966ba2bf..83226b16a 100644
--- a/spec/models/user/posting_spec.rb
+++ b/spec/models/user/posting_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require 'spec_helper'
-
describe User, :type => :model do
before do
@aspect = alice.aspects.first
diff --git a/spec/models/user/querying_spec.rb b/spec/models/user/querying_spec.rb
index 1a54d996a..471f2e32e 100644
--- a/spec/models/user/querying_spec.rb
+++ b/spec/models/user/querying_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require 'spec_helper'
-
describe User::Querying, :type => :model do
before do
@alices_aspect = alice.aspects.where(:name => "generic").first
diff --git a/spec/models/user/social_actions_spec.rb b/spec/models/user/social_actions_spec.rb
index 244f0f183..3f4ff57b3 100644
--- a/spec/models/user/social_actions_spec.rb
+++ b/spec/models/user/social_actions_spec.rb
@@ -1,5 +1,3 @@
-require "spec_helper"
-
describe User::SocialActions, type: :model do
let(:status) { FactoryGirl.create(:status_message, public: true, author: bob.person) }
diff --git a/spec/models/user_preference_spec.rb b/spec/models/user_preference_spec.rb
index 022b54db8..3f1ced13c 100644
--- a/spec/models/user_preference_spec.rb
+++ b/spec/models/user_preference_spec.rb
@@ -1,7 +1,4 @@
-require 'spec_helper'
-
describe UserPreference, :type => :model do
-
it 'should only allow valid email types to exist' do
pref = alice.user_preferences.new(:email_type => 'not_valid')
expect(pref).not_to be_valid
diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb
index 80ab08d40..da59913ce 100644
--- a/spec/models/user_spec.rb
+++ b/spec/models/user_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require 'spec_helper'
-
describe User, :type => :model do
context "relations" do
context "#conversations" do
diff --git a/spec/presenters/aspect_membership_presenter_spec.rb b/spec/presenters/aspect_membership_presenter_spec.rb
index 86d25de66..971fdb9e4 100644
--- a/spec/presenters/aspect_membership_presenter_spec.rb
+++ b/spec/presenters/aspect_membership_presenter_spec.rb
@@ -1,5 +1,3 @@
-require 'spec_helper'
-
describe AspectMembershipPresenter do
before do
@am = alice.aspects.where(:name => "generic").first.aspect_memberships.first
diff --git a/spec/presenters/aspect_presenter_spec.rb b/spec/presenters/aspect_presenter_spec.rb
index ba2bb5b4a..74dd52a41 100644
--- a/spec/presenters/aspect_presenter_spec.rb
+++ b/spec/presenters/aspect_presenter_spec.rb
@@ -1,5 +1,3 @@
-require 'spec_helper'
-
describe AspectPresenter do
before do
@presenter = AspectPresenter.new(bob.aspects.first)
diff --git a/spec/presenters/avatar_presenter_spec.rb b/spec/presenters/avatar_presenter_spec.rb
index c819b96fc..0a7daea6a 100644
--- a/spec/presenters/avatar_presenter_spec.rb
+++ b/spec/presenters/avatar_presenter_spec.rb
@@ -1,5 +1,3 @@
-require "spec_helper"
-
describe AvatarPresenter do
describe "#base_hash" do
it "calls image_url() for the avatars" do
diff --git a/spec/presenters/base_presenter_spec.rb b/spec/presenters/base_presenter_spec.rb
index 561d1993f..108594c01 100644
--- a/spec/presenters/base_presenter_spec.rb
+++ b/spec/presenters/base_presenter_spec.rb
@@ -1,5 +1,3 @@
-require "spec_helper"
-
describe BasePresenter do
it "falls back to nil" do
p = BasePresenter.new(nil)
diff --git a/spec/presenters/contact_presenter_spec.rb b/spec/presenters/contact_presenter_spec.rb
index 7ac959606..dc24a0b3a 100644
--- a/spec/presenters/contact_presenter_spec.rb
+++ b/spec/presenters/contact_presenter_spec.rb
@@ -1,5 +1,3 @@
-require "spec_helper"
-
describe ContactPresenter do
before do
@presenter = ContactPresenter.new(alice.contact_for(bob.person), alice)
diff --git a/spec/presenters/node_info_presenter_spec.rb b/spec/presenters/node_info_presenter_spec.rb
index de10d4e31..6c168a8e6 100644
--- a/spec/presenters/node_info_presenter_spec.rb
+++ b/spec/presenters/node_info_presenter_spec.rb
@@ -1,5 +1,3 @@
-require "spec_helper"
-
describe NodeInfoPresenter do
let(:presenter) { NodeInfoPresenter.new("1.0") }
let(:hash) { presenter.as_json.as_json }
diff --git a/spec/presenters/o_embed_presenter_spec.rb b/spec/presenters/o_embed_presenter_spec.rb
index bf8192675..9a14a5e7a 100644
--- a/spec/presenters/o_embed_presenter_spec.rb
+++ b/spec/presenters/o_embed_presenter_spec.rb
@@ -1,4 +1,3 @@
-require 'spec_helper'
describe OEmbedPresenter do
before do
@oembed = OEmbedPresenter.new(FactoryGirl.create(:status_message))
diff --git a/spec/presenters/person_presenter_spec.rb b/spec/presenters/person_presenter_spec.rb
index 3dab714d1..e6c224674 100644
--- a/spec/presenters/person_presenter_spec.rb
+++ b/spec/presenters/person_presenter_spec.rb
@@ -1,5 +1,3 @@
-require "spec_helper"
-
describe PersonPresenter do
let(:profile_user) { FactoryGirl.create(:user_with_aspect) }
let(:person) { profile_user.person }
diff --git a/spec/presenters/post_ineraction_presenter_spec.rb b/spec/presenters/post_ineraction_presenter_spec.rb
index 0018bce10..c7306a37a 100644
--- a/spec/presenters/post_ineraction_presenter_spec.rb
+++ b/spec/presenters/post_ineraction_presenter_spec.rb
@@ -1,5 +1,3 @@
-require "spec_helper"
-
describe PostInteractionPresenter do
let(:status_message_without_participation) {
FactoryGirl.create(:status_message_without_participation)
diff --git a/spec/presenters/post_presenter_spec.rb b/spec/presenters/post_presenter_spec.rb
index 6bd2ca689..0c2a5c993 100644
--- a/spec/presenters/post_presenter_spec.rb
+++ b/spec/presenters/post_presenter_spec.rb
@@ -1,5 +1,3 @@
-require "spec_helper"
-
describe PostPresenter do
before do
@sm = FactoryGirl.create(:status_message, public: true)
diff --git a/spec/presenters/profile_presenter_spec.rb b/spec/presenters/profile_presenter_spec.rb
index 61829ab40..8084490e6 100644
--- a/spec/presenters/profile_presenter_spec.rb
+++ b/spec/presenters/profile_presenter_spec.rb
@@ -1,5 +1,3 @@
-require "spec_helper"
-
describe ProfilePresenter do
let(:profile) { FactoryGirl.create(:profile_with_image_url, person: alice.person) }
diff --git a/spec/presenters/service_presenter_spec.rb b/spec/presenters/service_presenter_spec.rb
index 046645552..997952795 100644
--- a/spec/presenters/service_presenter_spec.rb
+++ b/spec/presenters/service_presenter_spec.rb
@@ -1,5 +1,3 @@
-require 'spec_helper'
-
describe ServicePresenter do
describe '#as_json' do
it 'includes the provider name of the json' do
diff --git a/spec/presenters/social_relay_presenter_spec.rb b/spec/presenters/social_relay_presenter_spec.rb
index aa2f43395..61a80edf8 100644
--- a/spec/presenters/social_relay_presenter_spec.rb
+++ b/spec/presenters/social_relay_presenter_spec.rb
@@ -1,5 +1,3 @@
-require "spec_helper"
-
describe SocialRelayPresenter do
before do
@presenter = SocialRelayPresenter.new
diff --git a/spec/presenters/statistics_presenter_spec.rb b/spec/presenters/statistics_presenter_spec.rb
index b76350c56..b0d1143e8 100644
--- a/spec/presenters/statistics_presenter_spec.rb
+++ b/spec/presenters/statistics_presenter_spec.rb
@@ -1,5 +1,3 @@
-require "spec_helper"
-
describe StatisticsPresenter do
before do
@presenter = StatisticsPresenter.new
diff --git a/spec/presenters/user_presenter_spec.rb b/spec/presenters/user_presenter_spec.rb
index aa9ecf7ce..eeb463316 100644
--- a/spec/presenters/user_presenter_spec.rb
+++ b/spec/presenters/user_presenter_spec.rb
@@ -1,5 +1,3 @@
-require 'spec_helper'
-
describe UserPresenter do
before do
@presenter = UserPresenter.new(bob, [])
diff --git a/spec/serializers/comment_serializer_spec.rb b/spec/serializers/comment_serializer_spec.rb
index 36578a628..42ec79b77 100644
--- a/spec/serializers/comment_serializer_spec.rb
+++ b/spec/serializers/comment_serializer_spec.rb
@@ -1,5 +1,3 @@
-require "spec_helper"
-
describe Export::CommentSerializer do
let(:comment) { create(:comment) }
subject(:json_output) { Export::CommentSerializer.new(comment).to_json }
diff --git a/spec/serializers/notification_serializer_spec.rb b/spec/serializers/notification_serializer_spec.rb
index c771ad2b4..8f9a20a3c 100644
--- a/spec/serializers/notification_serializer_spec.rb
+++ b/spec/serializers/notification_serializer_spec.rb
@@ -1,5 +1,3 @@
-require "spec_helper"
-
describe NotificationSerializer do
let(:notifications_controller) { NotificationsController.new }
diff --git a/spec/serializers/post_serializer_spec.rb b/spec/serializers/post_serializer_spec.rb
index 924fe6c71..c96d42458 100644
--- a/spec/serializers/post_serializer_spec.rb
+++ b/spec/serializers/post_serializer_spec.rb
@@ -1,5 +1,3 @@
-require "spec_helper"
-
describe Export::PostSerializer do
let(:post) { create(:status_message_with_photo) }
subject(:json_output) { Export::PostSerializer.new(post).to_json }
diff --git a/spec/services/comment_service_spec.rb b/spec/services/comment_service_spec.rb
index 7717f4561..930e7c6f4 100644
--- a/spec/services/comment_service_spec.rb
+++ b/spec/services/comment_service_spec.rb
@@ -1,5 +1,3 @@
-require "spec_helper"
-
describe CommentService do
let(:post) { alice.post(:status_message, text: "hello", to: alice.aspects.first) }
diff --git a/spec/services/post_service_spec.rb b/spec/services/post_service_spec.rb
index 2f2d4764f..3d6b96a48 100644
--- a/spec/services/post_service_spec.rb
+++ b/spec/services/post_service_spec.rb
@@ -1,5 +1,3 @@
-require "spec_helper"
-
describe PostService do
let(:post) { alice.post(:status_message, text: "ohai", to: alice.aspects.first) }
let(:public) { alice.post(:status_message, text: "hey", public: true) }
diff --git a/spec/services/status_message_creation_service_spec.rb b/spec/services/status_message_creation_service_spec.rb
index 617034e09..80631f266 100644
--- a/spec/services/status_message_creation_service_spec.rb
+++ b/spec/services/status_message_creation_service_spec.rb
@@ -1,5 +1,3 @@
-require "spec_helper"
-
describe StatusMessageCreationService do
describe "#create" do
let(:aspect) { alice.aspects.first }
diff --git a/spec/shared_behaviors/account_deletion.rb b/spec/shared_behaviors/account_deletion.rb
index 1f4b655c1..48500e0d0 100644
--- a/spec/shared_behaviors/account_deletion.rb
+++ b/spec/shared_behaviors/account_deletion.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require 'spec_helper'
-
shared_examples_for 'it removes the person associations' do
it "removes all of the person's posts" do
expect(Post.where(:author_id => @person.id).count).to eq(0)
diff --git a/spec/shared_behaviors/receiving.rb b/spec/shared_behaviors/receiving.rb
index 78898dc8c..999147427 100644
--- a/spec/shared_behaviors/receiving.rb
+++ b/spec/shared_behaviors/receiving.rb
@@ -1,5 +1,3 @@
-require "spec_helper"
-
shared_examples_for "it ignores existing object received twice" do |klass|
it "return nil if the #{klass} already exists" do
expect(Diaspora::Federation::Receive.perform(entity)).not_to be_nil
diff --git a/spec/shared_behaviors/relayable.rb b/spec/shared_behaviors/relayable.rb
index a1e18e7f2..e50ab1161 100644
--- a/spec/shared_behaviors/relayable.rb
+++ b/spec/shared_behaviors/relayable.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require "spec_helper"
-
shared_examples_for "it is relayable" do
describe "validations" do
context "author ignored by parent author" do
diff --git a/spec/shared_behaviors/signature.rb b/spec/shared_behaviors/signature.rb
index 3b40d751e..389cf2838 100644
--- a/spec/shared_behaviors/signature.rb
+++ b/spec/shared_behaviors/signature.rb
@@ -1,5 +1,3 @@
-require "spec_helper"
-
shared_examples_for "signature data" do
let(:relayable) { FactoryGirl.create(relayable_type) }
let(:signature) {
diff --git a/spec/shared_behaviors/stream.rb b/spec/shared_behaviors/stream.rb
index fa1c0d2de..91d00d513 100644
--- a/spec/shared_behaviors/stream.rb
+++ b/spec/shared_behaviors/stream.rb
@@ -1,5 +1,3 @@
-require 'spec_helper'
-
shared_examples_for 'it is a stream' do
context 'required methods for display' do
it '#title' do
@@ -18,10 +16,6 @@ shared_examples_for 'it is a stream' do
expect(@stream.send(:publisher_opts)).not_to be_nil
end
- it 'has a contacts link' do
- expect(@stream.contacts_link).not_to be_nil
- end
-
it 'should make the stream a time object' do
@stream.max_time = 123
expect(@stream.max_time).to be_a(Time)
diff --git a/spec/shared_behaviors/taggable.rb b/spec/shared_behaviors/taggable.rb
index ccec40e7d..7d3dd21de 100644
--- a/spec/shared_behaviors/taggable.rb
+++ b/spec/shared_behaviors/taggable.rb
@@ -3,8 +3,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require 'spec_helper'
-
shared_examples_for "it is taggable" do
include ActionView::Helpers::UrlHelper
diff --git a/spec/support/fixture_builder.rb b/spec/support/fixture_builder.rb
index e7d90d83f..7d8eb3a09 100644
--- a/spec/support/fixture_builder.rb
+++ b/spec/support/fixture_builder.rb
@@ -1,5 +1,3 @@
-require File.join(File.dirname(__FILE__), "user_methods.rb")
-
FixtureBuilder.configure do |fbuilder|
# rebuild fixtures automatically when these files change:
diff --git a/spec/workers/deferred_dispatch_spec.rb b/spec/workers/deferred_dispatch_spec.rb
index 214106d8d..f39a1ac98 100644
--- a/spec/workers/deferred_dispatch_spec.rb
+++ b/spec/workers/deferred_dispatch_spec.rb
@@ -1,5 +1,3 @@
-require "spec_helper"
-
describe Workers::DeferredDispatch do
it "handles non existing records gracefully" do
expect {
diff --git a/spec/workers/delete_account_spec.rb b/spec/workers/delete_account_spec.rb
index dd604f7d8..8c6fbff89 100644
--- a/spec/workers/delete_account_spec.rb
+++ b/spec/workers/delete_account_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require 'spec_helper'
-
describe Workers::DeleteAccount do
describe '#perform' do
it 'performs the account deletion' do
diff --git a/spec/workers/delete_post_from_service_spec.rb b/spec/workers/delete_post_from_service_spec.rb
index 2830ca7cd..4aee4aef7 100644
--- a/spec/workers/delete_post_from_service_spec.rb
+++ b/spec/workers/delete_post_from_service_spec.rb
@@ -1,5 +1,3 @@
-require "spec_helper"
-
describe Workers::DeletePostFromService do
it "calls service#delete_from_service with given opts" do
service = double
diff --git a/spec/workers/export_photos_spec.rb b/spec/workers/export_photos_spec.rb
index 15db9eee4..e5ee4c47d 100644
--- a/spec/workers/export_photos_spec.rb
+++ b/spec/workers/export_photos_spec.rb
@@ -1,7 +1,4 @@
-require 'spec_helper'
-
describe Workers::ExportPhotos do
-
before do
allow(User).to receive(:find).with(alice.id).and_return(alice)
end
diff --git a/spec/workers/export_user_spec.rb b/spec/workers/export_user_spec.rb
index 795a9f6b8..65ebfb356 100644
--- a/spec/workers/export_user_spec.rb
+++ b/spec/workers/export_user_spec.rb
@@ -1,7 +1,4 @@
-require 'spec_helper'
-
describe Workers::ExportUser do
-
before do
allow(User).to receive(:find).with(alice.id).and_return(alice)
end
diff --git a/spec/workers/fetch_profile_photo_spec.rb b/spec/workers/fetch_profile_photo_spec.rb
index 0b118ce7e..66106b278 100644
--- a/spec/workers/fetch_profile_photo_spec.rb
+++ b/spec/workers/fetch_profile_photo_spec.rb
@@ -1,5 +1,3 @@
-require 'spec_helper'
-
describe Workers::FetchProfilePhoto do
before do
@user = alice
diff --git a/spec/workers/fetch_webfinger_spec.rb b/spec/workers/fetch_webfinger_spec.rb
index 0a9469c75..7a3b667fb 100644
--- a/spec/workers/fetch_webfinger_spec.rb
+++ b/spec/workers/fetch_webfinger_spec.rb
@@ -1,5 +1,3 @@
-require "spec_helper"
-
describe Workers::FetchWebfinger do
it "should webfinger and queue a job to fetch public posts" do
@person = FactoryGirl.create(:person)
diff --git a/spec/workers/gather_o_embed_data_spec.rb b/spec/workers/gather_o_embed_data_spec.rb
index ad01e4a30..6d9fe1484 100644
--- a/spec/workers/gather_o_embed_data_spec.rb
+++ b/spec/workers/gather_o_embed_data_spec.rb
@@ -1,4 +1,3 @@
-require 'spec_helper'
describe Workers::GatherOEmbedData do
before do
@flickr_oembed_data = {
diff --git a/spec/workers/gather_open_graph_data_spec.rb b/spec/workers/gather_open_graph_data_spec.rb
index ac7c4eecd..74aefe548 100644
--- a/spec/workers/gather_open_graph_data_spec.rb
+++ b/spec/workers/gather_open_graph_data_spec.rb
@@ -1,4 +1,3 @@
-require 'spec_helper'
describe Workers::GatherOpenGraphData do
before do
@ogsite_title = 'Homepage'
diff --git a/spec/workers/mail/csrf_token_fail_spec.rb b/spec/workers/mail/csrf_token_fail_spec.rb
index 321b06dc4..e57292048 100644
--- a/spec/workers/mail/csrf_token_fail_spec.rb
+++ b/spec/workers/mail/csrf_token_fail_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require "spec_helper"
-
describe Workers::Mail::CsrfTokenFail do
describe "#perfom" do
it "should call .deliver on the notifier object" do
diff --git a/spec/workers/mail/invite_email_spec.rb b/spec/workers/mail/invite_email_spec.rb
index ef0ca75c7..70ad6a2c9 100644
--- a/spec/workers/mail/invite_email_spec.rb
+++ b/spec/workers/mail/invite_email_spec.rb
@@ -1,5 +1,3 @@
-require 'spec_helper'
-
describe Workers::Mail::InviteEmail do
let(:emails) { ['foo@bar.com', 'baz@bar.com'] }
let(:message) { 'get over here!' }
diff --git a/spec/workers/mail/liked_spec.rb b/spec/workers/mail/liked_spec.rb
index 4d91d16e7..8bb31ef0d 100644
--- a/spec/workers/mail/liked_spec.rb
+++ b/spec/workers/mail/liked_spec.rb
@@ -1,5 +1,3 @@
-require "spec_helper"
-
describe Workers::Mail::Liked do
describe "#perfom" do
it "should call .deliver_now on the notifier object" do
diff --git a/spec/workers/mail/mentioned_spec.rb b/spec/workers/mail/mentioned_spec.rb
index 32ab738eb..e63a9dfe5 100644
--- a/spec/workers/mail/mentioned_spec.rb
+++ b/spec/workers/mail/mentioned_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require 'spec_helper'
-
describe Workers::Mail::Mentioned do
describe '#perfom' do
it 'should call .deliver on the notifier object' do
diff --git a/spec/workers/mail/private_message_spec.rb b/spec/workers/mail/private_message_spec.rb
index 311f7cdce..8722cd211 100644
--- a/spec/workers/mail/private_message_spec.rb
+++ b/spec/workers/mail/private_message_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require 'spec_helper'
-
describe Workers::Mail::PrivateMessage do
describe '#perfom_delegate' do
it 'should call .deliver on the notifier object' do
diff --git a/spec/workers/mail/reshared_spec.rb b/spec/workers/mail/reshared_spec.rb
index 74b5c43ec..fea1eb54d 100644
--- a/spec/workers/mail/reshared_spec.rb
+++ b/spec/workers/mail/reshared_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require 'spec_helper'
-
describe Workers::Mail::Reshared do
describe '#perfom' do
it 'should call .deliver on the notifier object' do
diff --git a/spec/workers/post_to_service_spec.rb b/spec/workers/post_to_service_spec.rb
index e75578079..1a4370b81 100644
--- a/spec/workers/post_to_service_spec.rb
+++ b/spec/workers/post_to_service_spec.rb
@@ -1,5 +1,3 @@
-require 'spec_helper'
-
describe Workers::PostToService do
it 'calls service#post with the given service' do
user = alice
diff --git a/spec/workers/process_photo_spec.rb b/spec/workers/process_photo_spec.rb
index 8e28fba74..e7bfc5312 100644
--- a/spec/workers/process_photo_spec.rb
+++ b/spec/workers/process_photo_spec.rb
@@ -1,5 +1,3 @@
-require 'spec_helper'
-
describe Workers::ProcessPhoto do
before do
@user = alice
diff --git a/spec/workers/publish_to_hub_spec.rb b/spec/workers/publish_to_hub_spec.rb
index 8af3c09bb..62656d4de 100644
--- a/spec/workers/publish_to_hub_spec.rb
+++ b/spec/workers/publish_to_hub_spec.rb
@@ -2,8 +2,6 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require "spec_helper"
-
describe Workers::PublishToHub do
describe ".perform" do
it "calls pubsubhubbub" do
diff --git a/spec/workers/queue_users_for_removal_spec.rb b/spec/workers/queue_users_for_removal_spec.rb
index e7871ccad..19c25cc0a 100644
--- a/spec/workers/queue_users_for_removal_spec.rb
+++ b/spec/workers/queue_users_for_removal_spec.rb
@@ -1,5 +1,3 @@
-require 'spec_helper'
-
describe Workers::QueueUsersForRemoval do
describe 'remove_old_users is active' do
before do
diff --git a/spec/workers/receive_private_spec.rb b/spec/workers/receive_private_spec.rb
index 86d09ed19..b4089e51c 100644
--- a/spec/workers/receive_private_spec.rb
+++ b/spec/workers/receive_private_spec.rb
@@ -1,5 +1,3 @@
-require "spec_helper"
-
describe Workers::ReceivePrivate do
let(:data) { "<xml></xml>" }
diff --git a/spec/workers/receive_public_spec.rb b/spec/workers/receive_public_spec.rb
index 0f2c3aa7c..62e6a5632 100644
--- a/spec/workers/receive_public_spec.rb
+++ b/spec/workers/receive_public_spec.rb
@@ -1,5 +1,3 @@
-require "spec_helper"
-
describe Workers::ReceivePublic do
let(:data) { "<xml></xml>" }
diff --git a/spec/workers/recheck_offline_pods_spec.rb b/spec/workers/recheck_offline_pods_spec.rb
new file mode 100644
index 000000000..6dc59b0e5
--- /dev/null
+++ b/spec/workers/recheck_offline_pods_spec.rb
@@ -0,0 +1,9 @@
+describe Workers::RecheckScheduledPods do
+ it "performs a connection test on all scheduled pods" do
+ (0..4).map { FactoryGirl.create(:pod) }
+ FactoryGirl.create(:pod, scheduled_check: true)
+
+ expect_any_instance_of(Pod).to receive(:test_connection!)
+ Workers::RecheckScheduledPods.new.perform
+ end
+end
diff --git a/spec/workers/recurring_pod_check_spec.rb b/spec/workers/recurring_pod_check_spec.rb
index fec3b7f24..cba3c0543 100644
--- a/spec/workers/recurring_pod_check_spec.rb
+++ b/spec/workers/recurring_pod_check_spec.rb
@@ -1,6 +1,3 @@
-
-require "spec_helper"
-
describe Workers::RecurringPodCheck do
before do
@pods = (0..4).map do
diff --git a/spec/workers/remove_old_user_spec.rb b/spec/workers/remove_old_user_spec.rb
index 12e0fad57..91c3efa9e 100644
--- a/spec/workers/remove_old_user_spec.rb
+++ b/spec/workers/remove_old_user_spec.rb
@@ -1,5 +1,3 @@
-require 'spec_helper'
-
describe Workers::RemoveOldUser do
describe 'remove_old_users is active' do
before do
diff --git a/spec/workers/reset_password_spec.rb b/spec/workers/reset_password_spec.rb
index f0f393f75..faf829e69 100644
--- a/spec/workers/reset_password_spec.rb
+++ b/spec/workers/reset_password_spec.rb
@@ -1,5 +1,3 @@
-require 'spec_helper'
-
describe Workers::ResetPassword do
describe "#perform" do
it "given a user id it sends the reset password instructions for that user" do
diff --git a/spec/workers/send_base_spec.rb b/spec/workers/send_base_spec.rb
index 6515faf90..5c0bb6610 100644
--- a/spec/workers/send_base_spec.rb
+++ b/spec/workers/send_base_spec.rb
@@ -1,5 +1,3 @@
-require "spec_helper"
-
describe Workers::SendBase do
it "retries first time after at least 256 seconds" do
retry_delay = Workers::SendBase.new.send(:seconds_to_delay, 1)
diff --git a/spec/workers/send_private_spec.rb b/spec/workers/send_private_spec.rb
index 947b6c8ee..92765c0a2 100644
--- a/spec/workers/send_private_spec.rb
+++ b/spec/workers/send_private_spec.rb
@@ -1,5 +1,3 @@
-require "spec_helper"
-
describe Workers::SendPrivate do
let(:sender_id) { "any_user@example.org" }
let(:obj_str) { "status_message@guid" }
diff --git a/spec/workers/send_public_spec.rb b/spec/workers/send_public_spec.rb
index 2bb7eb9c4..bf34c6501 100644
--- a/spec/workers/send_public_spec.rb
+++ b/spec/workers/send_public_spec.rb
@@ -1,5 +1,3 @@
-require "spec_helper"
-
describe Workers::SendPublic do
let(:sender_id) { "any_user@example.org" }
let(:obj_str) { "status_message@guid" }
diff --git a/vendor/assets/javascripts/typeahead.bundle.js b/vendor/assets/javascripts/typeahead.bundle.js
deleted file mode 100644
index b68ec30f3..000000000
--- a/vendor/assets/javascripts/typeahead.bundle.js
+++ /dev/null
@@ -1,2469 +0,0 @@
-/*!
- * typeahead.js 0.11.1
- * https://github.com/twitter/typeahead.js
- * Copyright 2013-2016 Twitter, Inc. and other contributors; Licensed MIT
- */
-
-(function(root, factory) {
- if (typeof define === "function" && define.amd) {
- define([ "jquery" ], function(a0) {
- return root["Bloodhound"] = factory(a0);
- });
- } else if (typeof exports === "object") {
- module.exports = factory(require("jquery"));
- } else {
- root["Bloodhound"] = factory(jQuery);
- }
-})(this, function($) {
- var _ = function() {
- "use strict";
- return {
- isMsie: function() {
- return /(msie|trident)/i.test(navigator.userAgent) ? navigator.userAgent.match(/(msie |rv:)(\d+(.\d+)?)/i)[2] : false;
- },
- isBlankString: function(str) {
- return !str || /^\s*$/.test(str);
- },
- escapeRegExChars: function(str) {
- return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
- },
- isString: function(obj) {
- return typeof obj === "string";
- },
- isNumber: function(obj) {
- return typeof obj === "number";
- },
- isArray: $.isArray,
- isFunction: $.isFunction,
- isObject: $.isPlainObject,
- isUndefined: function(obj) {
- return typeof obj === "undefined";
- },
- isElement: function(obj) {
- return !!(obj && obj.nodeType === 1);
- },
- isJQuery: function(obj) {
- return obj instanceof $;
- },
- toStr: function toStr(s) {
- return _.isUndefined(s) || s === null ? "" : s + "";
- },
- bind: $.proxy,
- each: function(collection, cb) {
- $.each(collection, reverseArgs);
- function reverseArgs(index, value) {
- return cb(value, index);
- }
- },
- map: $.map,
- filter: $.grep,
- every: function(obj, test) {
- var result = true;
- if (!obj) {
- return result;
- }
- $.each(obj, function(key, val) {
- if (!(result = test.call(null, val, key, obj))) {
- return false;
- }
- });
- return !!result;
- },
- some: function(obj, test) {
- var result = false;
- if (!obj) {
- return result;
- }
- $.each(obj, function(key, val) {
- if (result = test.call(null, val, key, obj)) {
- return false;
- }
- });
- return !!result;
- },
- mixin: $.extend,
- identity: function(x) {
- return x;
- },
- clone: function(obj) {
- return $.extend(true, {}, obj);
- },
- getIdGenerator: function() {
- var counter = 0;
- return function() {
- return counter++;
- };
- },
- templatify: function templatify(obj) {
- return $.isFunction(obj) ? obj : template;
- function template() {
- return String(obj);
- }
- },
- defer: function(fn) {
- setTimeout(fn, 0);
- },
- debounce: function(func, wait, immediate) {
- var timeout, result;
- return function() {
- var context = this, args = arguments, later, callNow;
- later = function() {
- timeout = null;
- if (!immediate) {
- result = func.apply(context, args);
- }
- };
- callNow = immediate && !timeout;
- clearTimeout(timeout);
- timeout = setTimeout(later, wait);
- if (callNow) {
- result = func.apply(context, args);
- }
- return result;
- };
- },
- throttle: function(func, wait) {
- var context, args, timeout, result, previous, later;
- previous = 0;
- later = function() {
- previous = new Date();
- timeout = null;
- result = func.apply(context, args);
- };
- return function() {
- var now = new Date(), remaining = wait - (now - previous);
- context = this;
- args = arguments;
- if (remaining <= 0) {
- clearTimeout(timeout);
- timeout = null;
- previous = now;
- result = func.apply(context, args);
- } else if (!timeout) {
- timeout = setTimeout(later, remaining);
- }
- return result;
- };
- },
- stringify: function(val) {
- return _.isString(val) ? val : JSON.stringify(val);
- },
- noop: function() {}
- };
- }();
- var VERSION = "0.11.1";
- var tokenizers = function() {
- "use strict";
- return {
- nonword: nonword,
- whitespace: whitespace,
- obj: {
- nonword: getObjTokenizer(nonword),
- whitespace: getObjTokenizer(whitespace)
- }
- };
- function whitespace(str) {
- str = _.toStr(str);
- return str ? str.split(/\s+/) : [];
- }
- function nonword(str) {
- str = _.toStr(str);
- return str ? str.split(/\W+/) : [];
- }
- function getObjTokenizer(tokenizer) {
- return function setKey(keys) {
- keys = _.isArray(keys) ? keys : [].slice.call(arguments, 0);
- return function tokenize(o) {
- var tokens = [];
- _.each(keys, function(k) {
- tokens = tokens.concat(tokenizer(_.toStr(o[k])));
- });
- return tokens;
- };
- };
- }
- }();
- var LruCache = function() {
- "use strict";
- function LruCache(maxSize) {
- this.maxSize = _.isNumber(maxSize) ? maxSize : 100;
- this.reset();
- if (this.maxSize <= 0) {
- this.set = this.get = $.noop;
- }
- }
- _.mixin(LruCache.prototype, {
- set: function set(key, val) {
- var tailItem = this.list.tail, node;
- if (this.size >= this.maxSize) {
- this.list.remove(tailItem);
- delete this.hash[tailItem.key];
- this.size--;
- }
- if (node = this.hash[key]) {
- node.val = val;
- this.list.moveToFront(node);
- } else {
- node = new Node(key, val);
- this.list.add(node);
- this.hash[key] = node;
- this.size++;
- }
- },
- get: function get(key) {
- var node = this.hash[key];
- if (node) {
- this.list.moveToFront(node);
- return node.val;
- }
- },
- reset: function reset() {
- this.size = 0;
- this.hash = {};
- this.list = new List();
- }
- });
- function List() {
- this.head = this.tail = null;
- }
- _.mixin(List.prototype, {
- add: function add(node) {
- if (this.head) {
- node.next = this.head;
- this.head.prev = node;
- }
- this.head = node;
- this.tail = this.tail || node;
- },
- remove: function remove(node) {
- node.prev ? node.prev.next = node.next : this.head = node.next;
- node.next ? node.next.prev = node.prev : this.tail = node.prev;
- },
- moveToFront: function(node) {
- this.remove(node);
- this.add(node);
- }
- });
- function Node(key, val) {
- this.key = key;
- this.val = val;
- this.prev = this.next = null;
- }
- return LruCache;
- }();
- var PersistentStorage = function() {
- "use strict";
- var LOCAL_STORAGE;
- try {
- LOCAL_STORAGE = window.localStorage;
- LOCAL_STORAGE.setItem("~~~", "!");
- LOCAL_STORAGE.removeItem("~~~");
- } catch (err) {
- LOCAL_STORAGE = null;
- }
- function PersistentStorage(namespace, override) {
- this.prefix = [ "__", namespace, "__" ].join("");
- this.ttlKey = "__ttl__";
- this.keyMatcher = new RegExp("^" + _.escapeRegExChars(this.prefix));
- this.ls = override || LOCAL_STORAGE;
- !this.ls && this._noop();
- }
- _.mixin(PersistentStorage.prototype, {
- _prefix: function(key) {
- return this.prefix + key;
- },
- _ttlKey: function(key) {
- return this._prefix(key) + this.ttlKey;
- },
- _noop: function() {
- this.get = this.set = this.remove = this.clear = this.isExpired = _.noop;
- },
- _safeSet: function(key, val) {
- try {
- this.ls.setItem(key, val);
- } catch (err) {
- if (err.name === "QuotaExceededError") {
- this.clear();
- this._noop();
- }
- }
- },
- get: function(key) {
- if (this.isExpired(key)) {
- this.remove(key);
- }
- return decode(this.ls.getItem(this._prefix(key)));
- },
- set: function(key, val, ttl) {
- if (_.isNumber(ttl)) {
- this._safeSet(this._ttlKey(key), encode(now() + ttl));
- } else {
- this.ls.removeItem(this._ttlKey(key));
- }
- return this._safeSet(this._prefix(key), encode(val));
- },
- remove: function(key) {
- this.ls.removeItem(this._ttlKey(key));
- this.ls.removeItem(this._prefix(key));
- return this;
- },
- clear: function() {
- var i, keys = gatherMatchingKeys(this.keyMatcher);
- for (i = keys.length; i--; ) {
- this.remove(keys[i]);
- }
- return this;
- },
- isExpired: function(key) {
- var ttl = decode(this.ls.getItem(this._ttlKey(key)));
- return _.isNumber(ttl) && now() > ttl ? true : false;
- }
- });
- return PersistentStorage;
- function now() {
- return new Date().getTime();
- }
- function encode(val) {
- return JSON.stringify(_.isUndefined(val) ? null : val);
- }
- function decode(val) {
- return $.parseJSON(val);
- }
- function gatherMatchingKeys(keyMatcher) {
- var i, key, keys = [], len = LOCAL_STORAGE.length;
- for (i = 0; i < len; i++) {
- if ((key = LOCAL_STORAGE.key(i)).match(keyMatcher)) {
- keys.push(key.replace(keyMatcher, ""));
- }
- }
- return keys;
- }
- }();
- var Transport = function() {
- "use strict";
- var pendingRequestsCount = 0, pendingRequests = {}, maxPendingRequests = 6, sharedCache = new LruCache(10);
- function Transport(o) {
- o = o || {};
- this.cancelled = false;
- this.lastReq = null;
- this._send = o.transport;
- this._get = o.limiter ? o.limiter(this._get) : this._get;
- this._cache = o.cache === false ? new LruCache(0) : sharedCache;
- }
- Transport.setMaxPendingRequests = function setMaxPendingRequests(num) {
- maxPendingRequests = num;
- };
- Transport.resetCache = function resetCache() {
- sharedCache.reset();
- };
- _.mixin(Transport.prototype, {
- _fingerprint: function fingerprint(o) {
- o = o || {};
- return o.url + o.type + $.param(o.data || {});
- },
- _get: function(o, cb) {
- var that = this, fingerprint, jqXhr;
- fingerprint = this._fingerprint(o);
- if (this.cancelled || fingerprint !== this.lastReq) {
- return;
- }
- if (jqXhr = pendingRequests[fingerprint]) {
- jqXhr.done(done).fail(fail);
- } else if (pendingRequestsCount < maxPendingRequests) {
- pendingRequestsCount++;
- pendingRequests[fingerprint] = this._send(o).done(done).fail(fail).always(always);
- } else {
- this.onDeckRequestArgs = [].slice.call(arguments, 0);
- }
- function done(resp) {
- cb(null, resp);
- that._cache.set(fingerprint, resp);
- }
- function fail() {
- cb(true);
- }
- function always() {
- pendingRequestsCount--;
- delete pendingRequests[fingerprint];
- if (that.onDeckRequestArgs) {
- that._get.apply(that, that.onDeckRequestArgs);
- that.onDeckRequestArgs = null;
- }
- }
- },
- get: function(o, cb) {
- var resp, fingerprint;
- cb = cb || $.noop;
- o = _.isString(o) ? {
- url: o
- } : o || {};
- fingerprint = this._fingerprint(o);
- this.cancelled = false;
- this.lastReq = fingerprint;
- if (resp = this._cache.get(fingerprint)) {
- cb(null, resp);
- } else {
- this._get(o, cb);
- }
- },
- cancel: function() {
- this.cancelled = true;
- }
- });
- return Transport;
- }();
- var SearchIndex = window.SearchIndex = function() {
- "use strict";
- var CHILDREN = "c", IDS = "i";
- function SearchIndex(o) {
- o = o || {};
- if (!o.datumTokenizer || !o.queryTokenizer) {
- $.error("datumTokenizer and queryTokenizer are both required");
- }
- this.identify = o.identify || _.stringify;
- this.datumTokenizer = o.datumTokenizer;
- this.queryTokenizer = o.queryTokenizer;
- this.matchAnyQueryToken = o.matchAnyQueryToken;
- this.reset();
- }
- _.mixin(SearchIndex.prototype, {
- bootstrap: function bootstrap(o) {
- this.datums = o.datums;
- this.trie = o.trie;
- },
- add: function(data) {
- var that = this;
- data = _.isArray(data) ? data : [ data ];
- _.each(data, function(datum) {
- var id, tokens;
- that.datums[id = that.identify(datum)] = datum;
- tokens = normalizeTokens(that.datumTokenizer(datum));
- _.each(tokens, function(token) {
- var node, chars, ch;
- node = that.trie;
- chars = token.split("");
- while (ch = chars.shift()) {
- node = node[CHILDREN][ch] || (node[CHILDREN][ch] = newNode());
- node[IDS].push(id);
- }
- });
- });
- },
- get: function get(ids) {
- var that = this;
- return _.map(ids, function(id) {
- return that.datums[id];
- });
- },
- search: function search(query) {
- var that = this, tokens, matches;
- tokens = normalizeTokens(this.queryTokenizer(query));
- _.each(tokens, function(token) {
- var node, chars, ch, ids;
- if (matches && matches.length === 0 && !that.matchAnyQueryToken) {
- return false;
- }
- node = that.trie;
- chars = token.split("");
- while (node && (ch = chars.shift())) {
- node = node[CHILDREN][ch];
- }
- if (node && chars.length === 0) {
- ids = node[IDS].slice(0);
- matches = matches ? getIntersection(matches, ids) : ids;
- } else {
- if (!that.matchAnyQueryToken) {
- matches = [];
- return false;
- }
- }
- });
- return matches ? _.map(unique(matches), function(id) {
- return that.datums[id];
- }) : [];
- },
- all: function all() {
- var values = [];
- for (var key in this.datums) {
- values.push(this.datums[key]);
- }
- return values;
- },
- reset: function reset() {
- this.datums = {};
- this.trie = newNode();
- },
- serialize: function serialize() {
- return {
- datums: this.datums,
- trie: this.trie
- };
- }
- });
- return SearchIndex;
- function normalizeTokens(tokens) {
- tokens = _.filter(tokens, function(token) {
- return !!token;
- });
- tokens = _.map(tokens, function(token) {
- return token.toLowerCase();
- });
- return tokens;
- }
- function newNode() {
- var node = {};
- node[IDS] = [];
- node[CHILDREN] = {};
- return node;
- }
- function unique(array) {
- var seen = {}, uniques = [];
- for (var i = 0, len = array.length; i < len; i++) {
- if (!seen[array[i]]) {
- seen[array[i]] = true;
- uniques.push(array[i]);
- }
- }
- return uniques;
- }
- function getIntersection(arrayA, arrayB) {
- var ai = 0, bi = 0, intersection = [];
- arrayA = arrayA.sort();
- arrayB = arrayB.sort();
- var lenArrayA = arrayA.length, lenArrayB = arrayB.length;
- while (ai < lenArrayA && bi < lenArrayB) {
- if (arrayA[ai] < arrayB[bi]) {
- ai++;
- } else if (arrayA[ai] > arrayB[bi]) {
- bi++;
- } else {
- intersection.push(arrayA[ai]);
- ai++;
- bi++;
- }
- }
- return intersection;
- }
- }();
- var Prefetch = function() {
- "use strict";
- var keys;
- keys = {
- data: "data",
- protocol: "protocol",
- thumbprint: "thumbprint"
- };
- function Prefetch(o) {
- this.url = o.url;
- this.ttl = o.ttl;
- this.cache = o.cache;
- this.prepare = o.prepare;
- this.transform = o.transform;
- this.transport = o.transport;
- this.thumbprint = o.thumbprint;
- this.storage = new PersistentStorage(o.cacheKey);
- }
- _.mixin(Prefetch.prototype, {
- _settings: function settings() {
- return {
- url: this.url,
- type: "GET",
- dataType: "json"
- };
- },
- store: function store(data) {
- if (!this.cache) {
- return;
- }
- this.storage.set(keys.data, data, this.ttl);
- this.storage.set(keys.protocol, location.protocol, this.ttl);
- this.storage.set(keys.thumbprint, this.thumbprint, this.ttl);
- },
- fromCache: function fromCache() {
- var stored = {}, isExpired;
- if (!this.cache) {
- return null;
- }
- stored.data = this.storage.get(keys.data);
- stored.protocol = this.storage.get(keys.protocol);
- stored.thumbprint = this.storage.get(keys.thumbprint);
- isExpired = stored.thumbprint !== this.thumbprint || stored.protocol !== location.protocol;
- return stored.data && !isExpired ? stored.data : null;
- },
- fromNetwork: function(cb) {
- var that = this, settings;
- if (!cb) {
- return;
- }
- settings = this.prepare(this._settings());
- this.transport(settings).fail(onError).done(onResponse);
- function onError() {
- cb(true);
- }
- function onResponse(resp) {
- cb(null, that.transform(resp));
- }
- },
- clear: function clear() {
- this.storage.clear();
- return this;
- }
- });
- return Prefetch;
- }();
- var Remote = function() {
- "use strict";
- function Remote(o) {
- this.url = o.url;
- this.prepare = o.prepare;
- this.transform = o.transform;
- this.indexResponse = o.indexResponse;
- this.transport = new Transport({
- cache: o.cache,
- limiter: o.limiter,
- transport: o.transport
- });
- }
- _.mixin(Remote.prototype, {
- _settings: function settings() {
- return {
- url: this.url,
- type: "GET",
- dataType: "json"
- };
- },
- get: function get(query, cb) {
- var that = this, settings;
- if (!cb) {
- return;
- }
- query = query || "";
- settings = this.prepare(query, this._settings());
- return this.transport.get(settings, onResponse);
- function onResponse(err, resp) {
- err ? cb([]) : cb(that.transform(resp));
- }
- },
- cancelLastRequest: function cancelLastRequest() {
- this.transport.cancel();
- }
- });
- return Remote;
- }();
- var oParser = function() {
- "use strict";
- return function parse(o) {
- var defaults, sorter;
- defaults = {
- initialize: true,
- identify: _.stringify,
- datumTokenizer: null,
- queryTokenizer: null,
- matchAnyQueryToken: false,
- sufficient: 5,
- indexRemote: false,
- sorter: null,
- local: [],
- prefetch: null,
- remote: null
- };
- o = _.mixin(defaults, o || {});
- !o.datumTokenizer && $.error("datumTokenizer is required");
- !o.queryTokenizer && $.error("queryTokenizer is required");
- sorter = o.sorter;
- o.sorter = sorter ? function(x) {
- return x.sort(sorter);
- } : _.identity;
- o.local = _.isFunction(o.local) ? o.local() : o.local;
- o.prefetch = parsePrefetch(o.prefetch);
- o.remote = parseRemote(o.remote);
- return o;
- };
- function parsePrefetch(o) {
- var defaults;
- if (!o) {
- return null;
- }
- defaults = {
- url: null,
- ttl: 24 * 60 * 60 * 1e3,
- cache: true,
- cacheKey: null,
- thumbprint: "",
- prepare: _.identity,
- transform: _.identity,
- transport: null
- };
- o = _.isString(o) ? {
- url: o
- } : o;
- o = _.mixin(defaults, o);
- !o.url && $.error("prefetch requires url to be set");
- o.transform = o.filter || o.transform;
- o.cacheKey = o.cacheKey || o.url;
- o.thumbprint = VERSION + o.thumbprint;
- o.transport = o.transport ? callbackToDeferred(o.transport) : $.ajax;
- return o;
- }
- function parseRemote(o) {
- var defaults;
- if (!o) {
- return;
- }
- defaults = {
- url: null,
- cache: true,
- prepare: null,
- replace: null,
- wildcard: null,
- limiter: null,
- rateLimitBy: "debounce",
- rateLimitWait: 300,
- transform: _.identity,
- transport: null
- };
- o = _.isString(o) ? {
- url: o
- } : o;
- o = _.mixin(defaults, o);
- !o.url && $.error("remote requires url to be set");
- o.transform = o.filter || o.transform;
- o.prepare = toRemotePrepare(o);
- o.limiter = toLimiter(o);
- o.transport = o.transport ? callbackToDeferred(o.transport) : $.ajax;
- delete o.replace;
- delete o.wildcard;
- delete o.rateLimitBy;
- delete o.rateLimitWait;
- return o;
- }
- function toRemotePrepare(o) {
- var prepare, replace, wildcard;
- prepare = o.prepare;
- replace = o.replace;
- wildcard = o.wildcard;
- if (prepare) {
- return prepare;
- }
- if (replace) {
- prepare = prepareByReplace;
- } else if (o.wildcard) {
- prepare = prepareByWildcard;
- } else {
- prepare = idenityPrepare;
- }
- return prepare;
- function prepareByReplace(query, settings) {
- settings.url = replace(settings.url, query);
- return settings;
- }
- function prepareByWildcard(query, settings) {
- settings.url = settings.url.replace(wildcard, encodeURIComponent(query));
- return settings;
- }
- function idenityPrepare(query, settings) {
- return settings;
- }
- }
- function toLimiter(o) {
- var limiter, method, wait;
- limiter = o.limiter;
- method = o.rateLimitBy;
- wait = o.rateLimitWait;
- if (!limiter) {
- limiter = /^throttle$/i.test(method) ? throttle(wait) : debounce(wait);
- }
- return limiter;
- function debounce(wait) {
- return function debounce(fn) {
- return _.debounce(fn, wait);
- };
- }
- function throttle(wait) {
- return function throttle(fn) {
- return _.throttle(fn, wait);
- };
- }
- }
- function callbackToDeferred(fn) {
- return function wrapper(o) {
- var deferred = $.Deferred();
- fn(o, onSuccess, onError);
- return deferred;
- function onSuccess(resp) {
- _.defer(function() {
- deferred.resolve(resp);
- });
- }
- function onError(err) {
- _.defer(function() {
- deferred.reject(err);
- });
- }
- };
- }
- }();
- var Bloodhound = function() {
- "use strict";
- var old;
- old = window && window.Bloodhound;
- function Bloodhound(o) {
- o = oParser(o);
- this.sorter = o.sorter;
- this.identify = o.identify;
- this.sufficient = o.sufficient;
- this.indexRemote = o.indexRemote;
- this.local = o.local;
- this.remote = o.remote ? new Remote(o.remote) : null;
- this.prefetch = o.prefetch ? new Prefetch(o.prefetch) : null;
- this.index = new SearchIndex({
- identify: this.identify,
- datumTokenizer: o.datumTokenizer,
- queryTokenizer: o.queryTokenizer
- });
- o.initialize !== false && this.initialize();
- }
- Bloodhound.noConflict = function noConflict() {
- window && (window.Bloodhound = old);
- return Bloodhound;
- };
- Bloodhound.tokenizers = tokenizers;
- _.mixin(Bloodhound.prototype, {
- __ttAdapter: function ttAdapter() {
- var that = this;
- return this.remote ? withAsync : withoutAsync;
- function withAsync(query, sync, async) {
- return that.search(query, sync, async);
- }
- function withoutAsync(query, sync) {
- return that.search(query, sync);
- }
- },
- _loadPrefetch: function loadPrefetch() {
- var that = this, deferred, serialized;
- deferred = $.Deferred();
- if (!this.prefetch) {
- deferred.resolve();
- } else if (serialized = this.prefetch.fromCache()) {
- this.index.bootstrap(serialized);
- deferred.resolve();
- } else {
- this.prefetch.fromNetwork(done);
- }
- return deferred.promise();
- function done(err, data) {
- if (err) {
- return deferred.reject();
- }
- that.add(data);
- that.prefetch.store(that.index.serialize());
- deferred.resolve();
- }
- },
- _initialize: function initialize() {
- var that = this, deferred;
- this.clear();
- (this.initPromise = this._loadPrefetch()).done(addLocalToIndex);
- return this.initPromise;
- function addLocalToIndex() {
- that.add(that.local);
- }
- },
- initialize: function initialize(force) {
- return !this.initPromise || force ? this._initialize() : this.initPromise;
- },
- add: function add(data) {
- this.index.add(data);
- return this;
- },
- get: function get(ids) {
- ids = _.isArray(ids) ? ids : [].slice.call(arguments);
- return this.index.get(ids);
- },
- search: function search(query, sync, async) {
- var that = this, local;
- sync = sync || _.noop;
- async = async || _.noop;
- local = this.sorter(this.index.search(query));
- sync(this.remote ? local.slice() : local);
- if (this.remote && local.length < this.sufficient) {
- this.remote.get(query, processRemote);
- } else if (this.remote) {
- this.remote.cancelLastRequest();
- }
- return this;
- function processRemote(remote) {
- var nonDuplicates = [];
- _.each(remote, function(r) {
- !_.some(local, function(l) {
- return that.identify(r) === that.identify(l);
- }) && nonDuplicates.push(r);
- });
- that.indexRemote && that.add(nonDuplicates);
- async(nonDuplicates);
- }
- },
- all: function all() {
- return this.index.all();
- },
- clear: function clear() {
- this.index.reset();
- return this;
- },
- clearPrefetchCache: function clearPrefetchCache() {
- this.prefetch && this.prefetch.clear();
- return this;
- },
- clearRemoteCache: function clearRemoteCache() {
- Transport.resetCache();
- return this;
- },
- ttAdapter: function ttAdapter() {
- return this.__ttAdapter();
- }
- });
- return Bloodhound;
- }();
- return Bloodhound;
-});
-
-(function(root, factory) {
- if (typeof define === "function" && define.amd) {
- define([ "jquery" ], function(a0) {
- return factory(a0);
- });
- } else if (typeof exports === "object") {
- module.exports = factory(require("jquery"));
- } else {
- factory(jQuery);
- }
-})(this, function($) {
- var _ = function() {
- "use strict";
- return {
- isMsie: function() {
- return /(msie|trident)/i.test(navigator.userAgent) ? navigator.userAgent.match(/(msie |rv:)(\d+(.\d+)?)/i)[2] : false;
- },
- isBlankString: function(str) {
- return !str || /^\s*$/.test(str);
- },
- escapeRegExChars: function(str) {
- return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
- },
- isString: function(obj) {
- return typeof obj === "string";
- },
- isNumber: function(obj) {
- return typeof obj === "number";
- },
- isArray: $.isArray,
- isFunction: $.isFunction,
- isObject: $.isPlainObject,
- isUndefined: function(obj) {
- return typeof obj === "undefined";
- },
- isElement: function(obj) {
- return !!(obj && obj.nodeType === 1);
- },
- isJQuery: function(obj) {
- return obj instanceof $;
- },
- toStr: function toStr(s) {
- return _.isUndefined(s) || s === null ? "" : s + "";
- },
- bind: $.proxy,
- each: function(collection, cb) {
- $.each(collection, reverseArgs);
- function reverseArgs(index, value) {
- return cb(value, index);
- }
- },
- map: $.map,
- filter: $.grep,
- every: function(obj, test) {
- var result = true;
- if (!obj) {
- return result;
- }
- $.each(obj, function(key, val) {
- if (!(result = test.call(null, val, key, obj))) {
- return false;
- }
- });
- return !!result;
- },
- some: function(obj, test) {
- var result = false;
- if (!obj) {
- return result;
- }
- $.each(obj, function(key, val) {
- if (result = test.call(null, val, key, obj)) {
- return false;
- }
- });
- return !!result;
- },
- mixin: $.extend,
- identity: function(x) {
- return x;
- },
- clone: function(obj) {
- return $.extend(true, {}, obj);
- },
- getIdGenerator: function() {
- var counter = 0;
- return function() {
- return counter++;
- };
- },
- templatify: function templatify(obj) {
- return $.isFunction(obj) ? obj : template;
- function template() {
- return String(obj);
- }
- },
- defer: function(fn) {
- setTimeout(fn, 0);
- },
- debounce: function(func, wait, immediate) {
- var timeout, result;
- return function() {
- var context = this, args = arguments, later, callNow;
- later = function() {
- timeout = null;
- if (!immediate) {
- result = func.apply(context, args);
- }
- };
- callNow = immediate && !timeout;
- clearTimeout(timeout);
- timeout = setTimeout(later, wait);
- if (callNow) {
- result = func.apply(context, args);
- }
- return result;
- };
- },
- throttle: function(func, wait) {
- var context, args, timeout, result, previous, later;
- previous = 0;
- later = function() {
- previous = new Date();
- timeout = null;
- result = func.apply(context, args);
- };
- return function() {
- var now = new Date(), remaining = wait - (now - previous);
- context = this;
- args = arguments;
- if (remaining <= 0) {
- clearTimeout(timeout);
- timeout = null;
- previous = now;
- result = func.apply(context, args);
- } else if (!timeout) {
- timeout = setTimeout(later, remaining);
- }
- return result;
- };
- },
- stringify: function(val) {
- return _.isString(val) ? val : JSON.stringify(val);
- },
- noop: function() {}
- };
- }();
- var WWW = function() {
- "use strict";
- var defaultClassNames = {
- wrapper: "twitter-typeahead",
- input: "tt-input",
- hint: "tt-hint",
- menu: "tt-menu",
- dataset: "tt-dataset",
- suggestion: "tt-suggestion",
- selectable: "tt-selectable",
- empty: "tt-empty",
- open: "tt-open",
- cursor: "tt-cursor",
- highlight: "tt-highlight"
- };
- return build;
- function build(o) {
- var www, classes;
- classes = _.mixin({}, defaultClassNames, o);
- www = {
- css: buildCss(),
- classes: classes,
- html: buildHtml(classes),
- selectors: buildSelectors(classes)
- };
- return {
- css: www.css,
- html: www.html,
- classes: www.classes,
- selectors: www.selectors,
- mixin: function(o) {
- _.mixin(o, www);
- }
- };
- }
- function buildHtml(c) {
- return {
- wrapper: '<span class="' + c.wrapper + '"></span>',
- menu: '<div class="' + c.menu + '"></div>'
- };
- }
- function buildSelectors(classes) {
- var selectors = {};
- _.each(classes, function(v, k) {
- selectors[k] = "." + v;
- });
- return selectors;
- }
- function buildCss() {
- var css = {
- wrapper: {
- position: "relative",
- display: "inline-block"
- },
- hint: {
- position: "absolute",
- top: "0",
- left: "0",
- borderColor: "transparent",
- boxShadow: "none",
- opacity: "1"
- },
- input: {
- position: "relative",
- verticalAlign: "top",
- backgroundColor: "transparent"
- },
- inputWithNoHint: {
- position: "relative",
- verticalAlign: "top"
- },
- menu: {
- position: "absolute",
- top: "100%",
- left: "0",
- zIndex: "100",
- display: "none"
- },
- ltr: {
- left: "0",
- right: "auto"
- },
- rtl: {
- left: "auto",
- right: " 0"
- }
- };
- if (_.isMsie()) {
- _.mixin(css.input, {
- backgroundImage: "url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)"
- });
- }
- return css;
- }
- }();
- var EventBus = function() {
- "use strict";
- var namespace, deprecationMap;
- namespace = "typeahead:";
- deprecationMap = {
- render: "rendered",
- cursorchange: "cursorchanged",
- select: "selected",
- autocomplete: "autocompleted"
- };
- function EventBus(o) {
- if (!o || !o.el) {
- $.error("EventBus initialized without el");
- }
- this.$el = $(o.el);
- }
- _.mixin(EventBus.prototype, {
- _trigger: function(type, args) {
- var $e;
- $e = $.Event(namespace + type);
- (args = args || []).unshift($e);
- this.$el.trigger.apply(this.$el, args);
- return $e;
- },
- before: function(type) {
- var args, $e;
- args = [].slice.call(arguments, 1);
- $e = this._trigger("before" + type, args);
- return $e.isDefaultPrevented();
- },
- trigger: function(type) {
- var deprecatedType;
- this._trigger(type, [].slice.call(arguments, 1));
- if (deprecatedType = deprecationMap[type]) {
- this._trigger(deprecatedType, [].slice.call(arguments, 1));
- }
- }
- });
- return EventBus;
- }();
- var EventEmitter = function() {
- "use strict";
- var splitter = /\s+/, nextTick = getNextTick();
- return {
- onSync: onSync,
- onAsync: onAsync,
- off: off,
- trigger: trigger
- };
- function on(method, types, cb, context) {
- var type;
- if (!cb) {
- return this;
- }
- types = types.split(splitter);
- cb = context ? bindContext(cb, context) : cb;
- this._callbacks = this._callbacks || {};
- while (type = types.shift()) {
- this._callbacks[type] = this._callbacks[type] || {
- sync: [],
- async: []
- };
- this._callbacks[type][method].push(cb);
- }
- return this;
- }
- function onAsync(types, cb, context) {
- return on.call(this, "async", types, cb, context);
- }
- function onSync(types, cb, context) {
- return on.call(this, "sync", types, cb, context);
- }
- function off(types) {
- var type;
- if (!this._callbacks) {
- return this;
- }
- types = types.split(splitter);
- while (type = types.shift()) {
- delete this._callbacks[type];
- }
- return this;
- }
- function trigger(types) {
- var type, callbacks, args, syncFlush, asyncFlush;
- if (!this._callbacks) {
- return this;
- }
- types = types.split(splitter);
- args = [].slice.call(arguments, 1);
- while ((type = types.shift()) && (callbacks = this._callbacks[type])) {
- syncFlush = getFlush(callbacks.sync, this, [ type ].concat(args));
- asyncFlush = getFlush(callbacks.async, this, [ type ].concat(args));
- syncFlush() && nextTick(asyncFlush);
- }
- return this;
- }
- function getFlush(callbacks, context, args) {
- return flush;
- function flush() {
- var cancelled;
- for (var i = 0, len = callbacks.length; !cancelled && i < len; i += 1) {
- cancelled = callbacks[i].apply(context, args) === false;
- }
- return !cancelled;
- }
- }
- function getNextTick() {
- var nextTickFn;
- if (window.setImmediate) {
- nextTickFn = function nextTickSetImmediate(fn) {
- setImmediate(function() {
- fn();
- });
- };
- } else {
- nextTickFn = function nextTickSetTimeout(fn) {
- setTimeout(function() {
- fn();
- }, 0);
- };
- }
- return nextTickFn;
- }
- function bindContext(fn, context) {
- return fn.bind ? fn.bind(context) : function() {
- fn.apply(context, [].slice.call(arguments, 0));
- };
- }
- }();
- var highlight = function(doc) {
- "use strict";
- var defaults = {
- node: null,
- pattern: null,
- tagName: "strong",
- className: null,
- wordsOnly: false,
- caseSensitive: false
- };
- return function hightlight(o) {
- var regex;
- o = _.mixin({}, defaults, o);
- if (!o.node || !o.pattern) {
- return;
- }
- o.pattern = _.isArray(o.pattern) ? o.pattern : [ o.pattern ];
- regex = getRegex(o.pattern, o.caseSensitive, o.wordsOnly);
- traverse(o.node, hightlightTextNode);
- function hightlightTextNode(textNode) {
- var match, patternNode, wrapperNode;
- if (match = regex.exec(textNode.data)) {
- wrapperNode = doc.createElement(o.tagName);
- o.className && (wrapperNode.className = o.className);
- patternNode = textNode.splitText(match.index);
- patternNode.splitText(match[0].length);
- wrapperNode.appendChild(patternNode.cloneNode(true));
- textNode.parentNode.replaceChild(wrapperNode, patternNode);
- }
- return !!match;
- }
- function traverse(el, hightlightTextNode) {
- var childNode, TEXT_NODE_TYPE = 3;
- for (var i = 0; i < el.childNodes.length; i++) {
- childNode = el.childNodes[i];
- if (childNode.nodeType === TEXT_NODE_TYPE) {
- i += hightlightTextNode(childNode) ? 1 : 0;
- } else {
- traverse(childNode, hightlightTextNode);
- }
- }
- }
- };
- function getRegex(patterns, caseSensitive, wordsOnly) {
- var escapedPatterns = [], regexStr;
- for (var i = 0, len = patterns.length; i < len; i++) {
- escapedPatterns.push(_.escapeRegExChars(patterns[i]));
- }
- regexStr = wordsOnly ? "\\b(" + escapedPatterns.join("|") + ")\\b" : "(" + escapedPatterns.join("|") + ")";
- return caseSensitive ? new RegExp(regexStr) : new RegExp(regexStr, "i");
- }
- }(window.document);
- var Input = function() {
- "use strict";
- var specialKeyCodeMap;
- specialKeyCodeMap = {
- 9: "tab",
- 27: "esc",
- 37: "left",
- 39: "right",
- 13: "enter",
- 38: "up",
- 40: "down"
- };
- function Input(o, www) {
- o = o || {};
- if (!o.input) {
- $.error("input is missing");
- }
- www.mixin(this);
- this.$hint = $(o.hint);
- this.$input = $(o.input);
- this.query = this.$input.val();
- this.queryWhenFocused = this.hasFocus() ? this.query : null;
- this.$overflowHelper = buildOverflowHelper(this.$input);
- this._checkLanguageDirection();
- if (this.$hint.length === 0) {
- this.setHint = this.getHint = this.clearHint = this.clearHintIfInvalid = _.noop;
- }
- }
- Input.normalizeQuery = function(str) {
- return _.toStr(str).replace(/^\s*/g, "").replace(/\s{2,}/g, " ");
- };
- _.mixin(Input.prototype, EventEmitter, {
- _onBlur: function onBlur() {
- this.resetInputValue();
- this.trigger("blurred");
- },
- _onFocus: function onFocus() {
- this.queryWhenFocused = this.query;
- this.trigger("focused");
- },
- _onKeydown: function onKeydown($e) {
- var keyName = specialKeyCodeMap[$e.which || $e.keyCode];
- this._managePreventDefault(keyName, $e);
- if (keyName && this._shouldTrigger(keyName, $e)) {
- this.trigger(keyName + "Keyed", $e);
- }
- },
- _onInput: function onInput() {
- this._setQuery(this.getInputValue());
- this.clearHintIfInvalid();
- this._checkLanguageDirection();
- },
- _managePreventDefault: function managePreventDefault(keyName, $e) {
- var preventDefault;
- switch (keyName) {
- case "up":
- case "down":
- preventDefault = !withModifier($e);
- break;
-
- default:
- preventDefault = false;
- }
- preventDefault && $e.preventDefault();
- },
- _shouldTrigger: function shouldTrigger(keyName, $e) {
- var trigger;
- switch (keyName) {
- case "tab":
- trigger = !withModifier($e);
- break;
-
- default:
- trigger = true;
- }
- return trigger;
- },
- _checkLanguageDirection: function checkLanguageDirection() {
- var dir = (this.$input.css("direction") || "ltr").toLowerCase();
- if (this.dir !== dir) {
- this.dir = dir;
- this.$hint.attr("dir", dir);
- this.trigger("langDirChanged", dir);
- }
- },
- _setQuery: function setQuery(val, silent) {
- var areEquivalent, hasDifferentWhitespace;
- areEquivalent = areQueriesEquivalent(val, this.query);
- hasDifferentWhitespace = areEquivalent ? this.query.length !== val.length : false;
- this.query = val;
- if (!silent && !areEquivalent) {
- this.trigger("queryChanged", this.query);
- } else if (!silent && hasDifferentWhitespace) {
- this.trigger("whitespaceChanged", this.query);
- }
- },
- bind: function() {
- var that = this, onBlur, onFocus, onKeydown, onInput;
- onBlur = _.bind(this._onBlur, this);
- onFocus = _.bind(this._onFocus, this);
- onKeydown = _.bind(this._onKeydown, this);
- onInput = _.bind(this._onInput, this);
- this.$input.on("blur.tt", onBlur).on("focus.tt", onFocus).on("keydown.tt", onKeydown);
- if (!_.isMsie() || _.isMsie() > 9) {
- this.$input.on("input.tt", onInput);
- } else {
- this.$input.on("keydown.tt keypress.tt cut.tt paste.tt", function($e) {
- if (specialKeyCodeMap[$e.which || $e.keyCode]) {
- return;
- }
- _.defer(_.bind(that._onInput, that, $e));
- });
- }
- return this;
- },
- focus: function focus() {
- this.$input.focus();
- },
- blur: function blur() {
- this.$input.blur();
- },
- getLangDir: function getLangDir() {
- return this.dir;
- },
- getQuery: function getQuery() {
- return this.query || "";
- },
- setQuery: function setQuery(val, silent) {
- this.setInputValue(val);
- this._setQuery(val, silent);
- },
- hasQueryChangedSinceLastFocus: function hasQueryChangedSinceLastFocus() {
- return this.query !== this.queryWhenFocused;
- },
- getInputValue: function getInputValue() {
- return this.$input.val();
- },
- setInputValue: function setInputValue(value) {
- this.$input.val(value);
- this.clearHintIfInvalid();
- this._checkLanguageDirection();
- },
- resetInputValue: function resetInputValue() {
- this.setInputValue(this.query);
- },
- getHint: function getHint() {
- return this.$hint.val();
- },
- setHint: function setHint(value) {
- this.$hint.val(value);
- },
- clearHint: function clearHint() {
- this.setHint("");
- },
- clearHintIfInvalid: function clearHintIfInvalid() {
- var val, hint, valIsPrefixOfHint, isValid;
- val = this.getInputValue();
- hint = this.getHint();
- valIsPrefixOfHint = val !== hint && hint.indexOf(val) === 0;
- isValid = val !== "" && valIsPrefixOfHint && !this.hasOverflow();
- !isValid && this.clearHint();
- },
- hasFocus: function hasFocus() {
- return this.$input.is(":focus");
- },
- hasOverflow: function hasOverflow() {
- var constraint = this.$input.width() - 2;
- this.$overflowHelper.text(this.getInputValue());
- return this.$overflowHelper.width() >= constraint;
- },
- isCursorAtEnd: function() {
- var valueLength, selectionStart, range;
- valueLength = this.$input.val().length;
- selectionStart = this.$input[0].selectionStart;
- if (_.isNumber(selectionStart)) {
- return selectionStart === valueLength;
- } else if (document.selection) {
- range = document.selection.createRange();
- range.moveStart("character", -valueLength);
- return valueLength === range.text.length;
- }
- return true;
- },
- destroy: function destroy() {
- this.$hint.off(".tt");
- this.$input.off(".tt");
- this.$overflowHelper.remove();
- this.$hint = this.$input = this.$overflowHelper = $("<div>");
- }
- });
- return Input;
- function buildOverflowHelper($input) {
- return $('<pre aria-hidden="true"></pre>').css({
- position: "absolute",
- visibility: "hidden",
- whiteSpace: "pre",
- fontFamily: $input.css("font-family"),
- fontSize: $input.css("font-size"),
- fontStyle: $input.css("font-style"),
- fontVariant: $input.css("font-variant"),
- fontWeight: $input.css("font-weight"),
- wordSpacing: $input.css("word-spacing"),
- letterSpacing: $input.css("letter-spacing"),
- textIndent: $input.css("text-indent"),
- textRendering: $input.css("text-rendering"),
- textTransform: $input.css("text-transform")
- }).insertAfter($input);
- }
- function areQueriesEquivalent(a, b) {
- return Input.normalizeQuery(a) === Input.normalizeQuery(b);
- }
- function withModifier($e) {
- return $e.altKey || $e.ctrlKey || $e.metaKey || $e.shiftKey;
- }
- }();
- var Dataset = function() {
- "use strict";
- var keys, nameGenerator;
- keys = {
- val: "tt-selectable-display",
- obj: "tt-selectable-object"
- };
- nameGenerator = _.getIdGenerator();
- function Dataset(o, www) {
- o = o || {};
- o.templates = o.templates || {};
- o.templates.notFound = o.templates.notFound || o.templates.empty;
- if (!o.source) {
- $.error("missing source");
- }
- if (!o.node) {
- $.error("missing node");
- }
- if (o.name && !isValidName(o.name)) {
- $.error("invalid dataset name: " + o.name);
- }
- www.mixin(this);
- this.highlight = !!o.highlight;
- this.name = o.name || nameGenerator();
- this.limit = o.limit || 5;
- this.displayFn = getDisplayFn(o.display || o.displayKey);
- this.templates = getTemplates(o.templates, this.displayFn);
- this.source = o.source.__ttAdapter ? o.source.__ttAdapter() : o.source;
- this.async = _.isUndefined(o.async) ? this.source.length > 2 : !!o.async;
- this._resetLastSuggestion();
- this.$el = $(o.node).addClass(this.classes.dataset).addClass(this.classes.dataset + "-" + this.name);
- }
- Dataset.extractData = function extractData(el) {
- var $el = $(el);
- if ($el.data(keys.obj)) {
- return {
- val: $el.data(keys.val) || "",
- obj: $el.data(keys.obj) || null
- };
- }
- return null;
- };
- _.mixin(Dataset.prototype, EventEmitter, {
- _overwrite: function overwrite(query, suggestions) {
- suggestions = suggestions || [];
- if (suggestions.length) {
- this._renderSuggestions(query, suggestions);
- } else if (this.async && this.templates.pending) {
- this._renderPending(query);
- } else if (!this.async && this.templates.notFound) {
- this._renderNotFound(query);
- } else {
- this._empty();
- }
- this.trigger("rendered", this.name, suggestions, false);
- },
- _append: function append(query, suggestions) {
- suggestions = suggestions || [];
- if (suggestions.length && this.$lastSuggestion.length) {
- this._appendSuggestions(query, suggestions);
- } else if (suggestions.length) {
- this._renderSuggestions(query, suggestions);
- } else if (!this.$lastSuggestion.length && this.templates.notFound) {
- this._renderNotFound(query);
- }
- this.trigger("rendered", this.name, suggestions, true);
- },
- _renderSuggestions: function renderSuggestions(query, suggestions) {
- var $fragment;
- $fragment = this._getSuggestionsFragment(query, suggestions);
- this.$lastSuggestion = $fragment.children().last();
- this.$el.html($fragment).prepend(this._getHeader(query, suggestions)).append(this._getFooter(query, suggestions));
- },
- _appendSuggestions: function appendSuggestions(query, suggestions) {
- var $fragment, $lastSuggestion;
- $fragment = this._getSuggestionsFragment(query, suggestions);
- $lastSuggestion = $fragment.children().last();
- this.$lastSuggestion.after($fragment);
- this.$lastSuggestion = $lastSuggestion;
- },
- _renderPending: function renderPending(query) {
- var template = this.templates.pending;
- this._resetLastSuggestion();
- template && this.$el.html(template({
- query: query,
- dataset: this.name
- }));
- },
- _renderNotFound: function renderNotFound(query) {
- var template = this.templates.notFound;
- this._resetLastSuggestion();
- template && this.$el.html(template({
- query: query,
- dataset: this.name
- }));
- },
- _empty: function empty() {
- this.$el.empty();
- this._resetLastSuggestion();
- },
- _getSuggestionsFragment: function getSuggestionsFragment(query, suggestions) {
- var that = this, fragment;
- fragment = document.createDocumentFragment();
- _.each(suggestions, function getSuggestionNode(suggestion) {
- var $el, context;
- context = that._injectQuery(query, suggestion);
- $el = $(that.templates.suggestion(context)).data(keys.obj, suggestion).data(keys.val, that.displayFn(suggestion)).addClass(that.classes.suggestion + " " + that.classes.selectable);
- fragment.appendChild($el[0]);
- });
- this.highlight && highlight({
- className: this.classes.highlight,
- node: fragment,
- pattern: query
- });
- return $(fragment);
- },
- _getFooter: function getFooter(query, suggestions) {
- return this.templates.footer ? this.templates.footer({
- query: query,
- suggestions: suggestions,
- dataset: this.name
- }) : null;
- },
- _getHeader: function getHeader(query, suggestions) {
- return this.templates.header ? this.templates.header({
- query: query,
- suggestions: suggestions,
- dataset: this.name
- }) : null;
- },
- _resetLastSuggestion: function resetLastSuggestion() {
- this.$lastSuggestion = $();
- },
- _injectQuery: function injectQuery(query, obj) {
- return _.isObject(obj) ? _.mixin({
- _query: query
- }, obj) : obj;
- },
- update: function update(query) {
- var that = this, canceled = false, syncCalled = false, rendered = 0;
- this.cancel();
- this.cancel = function cancel() {
- canceled = true;
- that.cancel = $.noop;
- that.async && that.trigger("asyncCanceled", query);
- };
- this.source(query, sync, async);
- !syncCalled && sync([]);
- function sync(suggestions) {
- if (syncCalled) {
- return;
- }
- syncCalled = true;
- suggestions = (suggestions || []).slice(0, that.limit);
- rendered = suggestions.length;
- that._overwrite(query, suggestions);
- if (rendered < that.limit && that.async) {
- that.trigger("asyncRequested", query);
- }
- }
- function async(suggestions) {
- suggestions = suggestions || [];
- if (!canceled && rendered < that.limit) {
- that.cancel = $.noop;
- var idx = Math.abs(rendered - that.limit);
- rendered += idx;
- that._append(query, suggestions.slice(0, idx));
- that.async && that.trigger("asyncReceived", query);
- }
- }
- },
- cancel: $.noop,
- clear: function clear() {
- this._empty();
- this.cancel();
- this.trigger("cleared");
- },
- isEmpty: function isEmpty() {
- return this.$el.is(":empty");
- },
- destroy: function destroy() {
- this.$el = $("<div>");
- }
- });
- return Dataset;
- function getDisplayFn(display) {
- display = display || _.stringify;
- return _.isFunction(display) ? display : displayFn;
- function displayFn(obj) {
- return obj[display];
- }
- }
- function getTemplates(templates, displayFn) {
- return {
- notFound: templates.notFound && _.templatify(templates.notFound),
- pending: templates.pending && _.templatify(templates.pending),
- header: templates.header && _.templatify(templates.header),
- footer: templates.footer && _.templatify(templates.footer),
- suggestion: templates.suggestion || suggestionTemplate
- };
- function suggestionTemplate(context) {
- return $("<div>").text(displayFn(context));
- }
- }
- function isValidName(str) {
- return /^[_a-zA-Z0-9-]+$/.test(str);
- }
- }();
- var Menu = function() {
- "use strict";
- function Menu(o, www) {
- var that = this;
- o = o || {};
- if (!o.node) {
- $.error("node is required");
- }
- www.mixin(this);
- this.$node = $(o.node);
- this.query = null;
- this.datasets = _.map(o.datasets, initializeDataset);
- function initializeDataset(oDataset) {
- var node = that.$node.find(oDataset.node).first();
- oDataset.node = node.length ? node : $("<div>").appendTo(that.$node);
- return new Dataset(oDataset, www);
- }
- }
- _.mixin(Menu.prototype, EventEmitter, {
- _onSelectableClick: function onSelectableClick($e) {
- this.trigger("selectableClicked", $($e.currentTarget));
- },
- _onRendered: function onRendered(type, dataset, suggestions, async) {
- this.$node.toggleClass(this.classes.empty, this._allDatasetsEmpty());
- this.trigger("datasetRendered", dataset, suggestions, async);
- },
- _onCleared: function onCleared() {
- this.$node.toggleClass(this.classes.empty, this._allDatasetsEmpty());
- this.trigger("datasetCleared");
- },
- _propagate: function propagate() {
- this.trigger.apply(this, arguments);
- },
- _allDatasetsEmpty: function allDatasetsEmpty() {
- return _.every(this.datasets, isDatasetEmpty);
- function isDatasetEmpty(dataset) {
- return dataset.isEmpty();
- }
- },
- _getSelectables: function getSelectables() {
- return this.$node.find(this.selectors.selectable);
- },
- _removeCursor: function _removeCursor() {
- var $selectable = this.getActiveSelectable();
- $selectable && $selectable.removeClass(this.classes.cursor);
- },
- _ensureVisible: function ensureVisible($el) {
- var elTop, elBottom, nodeScrollTop, nodeHeight;
- elTop = $el.position().top;
- elBottom = elTop + $el.outerHeight(true);
- nodeScrollTop = this.$node.scrollTop();
- nodeHeight = this.$node.height() + parseInt(this.$node.css("paddingTop"), 10) + parseInt(this.$node.css("paddingBottom"), 10);
- if (elTop < 0) {
- this.$node.scrollTop(nodeScrollTop + elTop);
- } else if (nodeHeight < elBottom) {
- this.$node.scrollTop(nodeScrollTop + (elBottom - nodeHeight));
- }
- },
- bind: function() {
- var that = this, onSelectableClick;
- onSelectableClick = _.bind(this._onSelectableClick, this);
- this.$node.on("click.tt", this.selectors.selectable, onSelectableClick);
- this.$node.on("mouseover", this.selectors.selectable, function() {
- that.setCursor($(this));
- });
- this.$node.on("mouseleave", function() {
- that._removeCursor();
- });
- _.each(this.datasets, function(dataset) {
- dataset.onSync("asyncRequested", that._propagate, that).onSync("asyncCanceled", that._propagate, that).onSync("asyncReceived", that._propagate, that).onSync("rendered", that._onRendered, that).onSync("cleared", that._onCleared, that);
- });
- return this;
- },
- isOpen: function isOpen() {
- return this.$node.hasClass(this.classes.open);
- },
- open: function open() {
- this.$node.scrollTop(0);
- this.$node.addClass(this.classes.open);
- },
- close: function close() {
- this.$node.removeClass(this.classes.open);
- this._removeCursor();
- },
- setLanguageDirection: function setLanguageDirection(dir) {
- this.$node.attr("dir", dir);
- },
- selectableRelativeToCursor: function selectableRelativeToCursor(delta) {
- var $selectables, $oldCursor, oldIndex, newIndex;
- $oldCursor = this.getActiveSelectable();
- $selectables = this._getSelectables();
- oldIndex = $oldCursor ? $selectables.index($oldCursor) : -1;
- newIndex = oldIndex + delta;
- newIndex = (newIndex + 1) % ($selectables.length + 1) - 1;
- newIndex = newIndex < -1 ? $selectables.length - 1 : newIndex;
- return newIndex === -1 ? null : $selectables.eq(newIndex);
- },
- setCursor: function setCursor($selectable) {
- this._removeCursor();
- if ($selectable = $selectable && $selectable.first()) {
- $selectable.addClass(this.classes.cursor);
- this._ensureVisible($selectable);
- }
- },
- getSelectableData: function getSelectableData($el) {
- return $el && $el.length ? Dataset.extractData($el) : null;
- },
- getActiveSelectable: function getActiveSelectable() {
- var $selectable = this._getSelectables().filter(this.selectors.cursor).first();
- return $selectable.length ? $selectable : null;
- },
- getTopSelectable: function getTopSelectable() {
- var $selectable = this._getSelectables().first();
- return $selectable.length ? $selectable : null;
- },
- update: function update(query) {
- var isValidUpdate = query !== this.query;
- if (isValidUpdate) {
- this.query = query;
- _.each(this.datasets, updateDataset);
- }
- return isValidUpdate;
- function updateDataset(dataset) {
- dataset.update(query);
- }
- },
- empty: function empty() {
- _.each(this.datasets, clearDataset);
- this.query = null;
- this.$node.addClass(this.classes.empty);
- function clearDataset(dataset) {
- dataset.clear();
- }
- },
- destroy: function destroy() {
- this.$node.off(".tt");
- this.$node = $("<div>");
- _.each(this.datasets, destroyDataset);
- function destroyDataset(dataset) {
- dataset.destroy();
- }
- }
- });
- return Menu;
- }();
- var DefaultMenu = function() {
- "use strict";
- var s = Menu.prototype;
- function DefaultMenu() {
- Menu.apply(this, [].slice.call(arguments, 0));
- }
- _.mixin(DefaultMenu.prototype, Menu.prototype, {
- open: function open() {
- !this._allDatasetsEmpty() && this._show();
- return s.open.apply(this, [].slice.call(arguments, 0));
- },
- close: function close() {
- this._hide();
- return s.close.apply(this, [].slice.call(arguments, 0));
- },
- _onRendered: function onRendered() {
- if (this._allDatasetsEmpty()) {
- this._hide();
- } else {
- this.isOpen() && this._show();
- }
- return s._onRendered.apply(this, [].slice.call(arguments, 0));
- },
- _onCleared: function onCleared() {
- if (this._allDatasetsEmpty()) {
- this._hide();
- } else {
- this.isOpen() && this._show();
- }
- return s._onCleared.apply(this, [].slice.call(arguments, 0));
- },
- setLanguageDirection: function setLanguageDirection(dir) {
- this.$node.css(dir === "ltr" ? this.css.ltr : this.css.rtl);
- return s.setLanguageDirection.apply(this, [].slice.call(arguments, 0));
- },
- _hide: function hide() {
- this.$node.hide();
- },
- _show: function show() {
- this.$node.css("display", "block");
- }
- });
- return DefaultMenu;
- }();
- var Typeahead = function() {
- "use strict";
- function Typeahead(o, www) {
- var onFocused, onBlurred, onEnterKeyed, onTabKeyed, onEscKeyed, onUpKeyed, onDownKeyed, onLeftKeyed, onRightKeyed, onQueryChanged, onWhitespaceChanged;
- o = o || {};
- if (!o.input) {
- $.error("missing input");
- }
- if (!o.menu) {
- $.error("missing menu");
- }
- if (!o.eventBus) {
- $.error("missing event bus");
- }
- www.mixin(this);
- this.eventBus = o.eventBus;
- this.minLength = _.isNumber(o.minLength) ? o.minLength : 1;
- this.input = o.input;
- this.menu = o.menu;
- this.enabled = true;
- this.active = false;
- this.input.hasFocus() && this.activate();
- this.dir = this.input.getLangDir();
- this._hacks();
- this.menu.bind().onSync("selectableClicked", this._onSelectableClicked, this).onSync("asyncRequested", this._onAsyncRequested, this).onSync("asyncCanceled", this._onAsyncCanceled, this).onSync("asyncReceived", this._onAsyncReceived, this).onSync("datasetRendered", this._onDatasetRendered, this).onSync("datasetCleared", this._onDatasetCleared, this);
- onFocused = c(this, "activate", "open", "_onFocused");
- onBlurred = c(this, "deactivate", "_onBlurred");
- onEnterKeyed = c(this, "isActive", "isOpen", "_onEnterKeyed");
- onTabKeyed = c(this, "isActive", "isOpen", "_onTabKeyed");
- onEscKeyed = c(this, "isActive", "_onEscKeyed");
- onUpKeyed = c(this, "isActive", "open", "_onUpKeyed");
- onDownKeyed = c(this, "isActive", "open", "_onDownKeyed");
- onLeftKeyed = c(this, "isActive", "isOpen", "_onLeftKeyed");
- onRightKeyed = c(this, "isActive", "isOpen", "_onRightKeyed");
- onQueryChanged = c(this, "_openIfActive", "_onQueryChanged");
- onWhitespaceChanged = c(this, "_openIfActive", "_onWhitespaceChanged");
- this.input.bind().onSync("focused", onFocused, this).onSync("blurred", onBlurred, this).onSync("enterKeyed", onEnterKeyed, this).onSync("tabKeyed", onTabKeyed, this).onSync("escKeyed", onEscKeyed, this).onSync("upKeyed", onUpKeyed, this).onSync("downKeyed", onDownKeyed, this).onSync("leftKeyed", onLeftKeyed, this).onSync("rightKeyed", onRightKeyed, this).onSync("queryChanged", onQueryChanged, this).onSync("whitespaceChanged", onWhitespaceChanged, this).onSync("langDirChanged", this._onLangDirChanged, this);
- }
- _.mixin(Typeahead.prototype, {
- _hacks: function hacks() {
- var $input, $menu;
- $input = this.input.$input || $("<div>");
- $menu = this.menu.$node || $("<div>");
- $input.on("blur.tt", function($e) {
- var active, isActive, hasActive;
- active = document.activeElement;
- isActive = $menu.is(active);
- hasActive = $menu.has(active).length > 0;
- if (_.isMsie() && (isActive || hasActive)) {
- $e.preventDefault();
- $e.stopImmediatePropagation();
- _.defer(function() {
- $input.focus();
- });
- }
- });
- $menu.on("mousedown.tt", function($e) {
- $e.preventDefault();
- });
- },
- _onSelectableClicked: function onSelectableClicked(type, $el) {
- this.select($el);
- },
- _onDatasetCleared: function onDatasetCleared() {
- this._updateHint();
- },
- _onDatasetRendered: function onDatasetRendered(type, dataset, suggestions, async) {
- this._updateHint();
- this.eventBus.trigger("render", suggestions, async, dataset);
- },
- _onAsyncRequested: function onAsyncRequested(type, dataset, query) {
- this.eventBus.trigger("asyncrequest", query, dataset);
- },
- _onAsyncCanceled: function onAsyncCanceled(type, dataset, query) {
- this.eventBus.trigger("asynccancel", query, dataset);
- },
- _onAsyncReceived: function onAsyncReceived(type, dataset, query) {
- this.eventBus.trigger("asyncreceive", query, dataset);
- },
- _onFocused: function onFocused() {
- this._minLengthMet() && this.menu.update(this.input.getQuery());
- },
- _onBlurred: function onBlurred() {
- if (this.input.hasQueryChangedSinceLastFocus()) {
- this.eventBus.trigger("change", this.input.getQuery());
- }
- },
- _onEnterKeyed: function onEnterKeyed(type, $e) {
- var $selectable;
- if ($selectable = this.menu.getActiveSelectable()) {
- this.select($selectable) && $e.preventDefault();
- }
- },
- _onTabKeyed: function onTabKeyed(type, $e) {
- var $selectable;
- if ($selectable = this.menu.getActiveSelectable()) {
- this.select($selectable) && $e.preventDefault();
- } else if ($selectable = this.menu.getTopSelectable()) {
- this.autocomplete($selectable) && $e.preventDefault();
- }
- },
- _onEscKeyed: function onEscKeyed() {
- this.close();
- },
- _onUpKeyed: function onUpKeyed() {
- this.moveCursor(-1);
- },
- _onDownKeyed: function onDownKeyed() {
- this.moveCursor(+1);
- },
- _onLeftKeyed: function onLeftKeyed() {
- if (this.dir === "rtl" && this.input.isCursorAtEnd()) {
- this.autocomplete(this.menu.getActiveSelectable() || this.menu.getTopSelectable());
- }
- },
- _onRightKeyed: function onRightKeyed() {
- if (this.dir === "ltr" && this.input.isCursorAtEnd()) {
- this.autocomplete(this.menu.getActiveSelectable() || this.menu.getTopSelectable());
- }
- },
- _onQueryChanged: function onQueryChanged(e, query) {
- this._minLengthMet(query) ? this.menu.update(query) : this.menu.empty();
- },
- _onWhitespaceChanged: function onWhitespaceChanged() {
- this._updateHint();
- },
- _onLangDirChanged: function onLangDirChanged(e, dir) {
- if (this.dir !== dir) {
- this.dir = dir;
- this.menu.setLanguageDirection(dir);
- }
- },
- _openIfActive: function openIfActive() {
- this.isActive() && this.open();
- },
- _minLengthMet: function minLengthMet(query) {
- query = _.isString(query) ? query : this.input.getQuery() || "";
- return query.length >= this.minLength;
- },
- _updateHint: function updateHint() {
- var $selectable, data, val, query, escapedQuery, frontMatchRegEx, match;
- $selectable = this.menu.getTopSelectable();
- data = this.menu.getSelectableData($selectable);
- val = this.input.getInputValue();
- if (data && !_.isBlankString(val) && !this.input.hasOverflow()) {
- query = Input.normalizeQuery(val);
- escapedQuery = _.escapeRegExChars(query);
- frontMatchRegEx = new RegExp("^(?:" + escapedQuery + ")(.+$)", "i");
- match = frontMatchRegEx.exec(data.val);
- match && this.input.setHint(val + match[1]);
- } else {
- this.input.clearHint();
- }
- },
- isEnabled: function isEnabled() {
- return this.enabled;
- },
- enable: function enable() {
- this.enabled = true;
- },
- disable: function disable() {
- this.enabled = false;
- },
- isActive: function isActive() {
- return this.active;
- },
- activate: function activate() {
- if (this.isActive()) {
- return true;
- } else if (!this.isEnabled() || this.eventBus.before("active")) {
- return false;
- } else {
- this.active = true;
- this.eventBus.trigger("active");
- return true;
- }
- },
- deactivate: function deactivate() {
- if (!this.isActive()) {
- return true;
- } else if (this.eventBus.before("idle")) {
- return false;
- } else {
- this.active = false;
- this.close();
- this.eventBus.trigger("idle");
- return true;
- }
- },
- isOpen: function isOpen() {
- return this.menu.isOpen();
- },
- open: function open() {
- if (!this.isOpen() && !this.eventBus.before("open")) {
- this.menu.open();
- this._updateHint();
- this.eventBus.trigger("open");
- }
- return this.isOpen();
- },
- close: function close() {
- if (this.isOpen() && !this.eventBus.before("close")) {
- this.menu.close();
- this.input.clearHint();
- this.input.resetInputValue();
- this.eventBus.trigger("close");
- }
- return !this.isOpen();
- },
- setVal: function setVal(val) {
- this.input.setQuery(_.toStr(val));
- },
- getVal: function getVal() {
- return this.input.getQuery();
- },
- select: function select($selectable) {
- var data = this.menu.getSelectableData($selectable);
- if (data && !this.eventBus.before("select", data.obj)) {
- this.input.setQuery(data.val, true);
- this.eventBus.trigger("select", data.obj);
- this.close();
- return true;
- }
- return false;
- },
- autocomplete: function autocomplete($selectable) {
- var query, data, isValid;
- query = this.input.getQuery();
- data = this.menu.getSelectableData($selectable);
- isValid = data && query !== data.val;
- if (isValid && !this.eventBus.before("autocomplete", data.obj)) {
- this.input.setQuery(data.val);
- this.eventBus.trigger("autocomplete", data.obj);
- return true;
- }
- return false;
- },
- moveCursor: function moveCursor(delta) {
- var query, $candidate, data, payload, cancelMove;
- query = this.input.getQuery();
- $candidate = this.menu.selectableRelativeToCursor(delta);
- data = this.menu.getSelectableData($candidate);
- payload = data ? data.obj : null;
- cancelMove = this._minLengthMet() && this.menu.update(query);
- if (!cancelMove && !this.eventBus.before("cursorchange", payload)) {
- this.menu.setCursor($candidate);
- if (data) {
- this.input.setInputValue(data.val);
- } else {
- this.input.resetInputValue();
- this._updateHint();
- }
- this.eventBus.trigger("cursorchange", payload);
- return true;
- }
- return false;
- },
- destroy: function destroy() {
- this.input.destroy();
- this.menu.destroy();
- }
- });
- return Typeahead;
- function c(ctx) {
- var methods = [].slice.call(arguments, 1);
- return function() {
- var args = [].slice.call(arguments);
- _.each(methods, function(method) {
- return ctx[method].apply(ctx, args);
- });
- };
- }
- }();
- (function() {
- "use strict";
- var old, keys, methods;
- old = $.fn.typeahead;
- keys = {
- www: "tt-www",
- attrs: "tt-attrs",
- typeahead: "tt-typeahead"
- };
- methods = {
- initialize: function initialize(o, datasets) {
- var www;
- datasets = _.isArray(datasets) ? datasets : [].slice.call(arguments, 1);
- o = o || {};
- www = WWW(o.classNames);
- return this.each(attach);
- function attach() {
- var $input, $wrapper, $hint, $menu, defaultHint, defaultMenu, eventBus, input, menu, typeahead, MenuConstructor;
- _.each(datasets, function(d) {
- d.highlight = !!o.highlight;
- });
- $input = $(this);
- $wrapper = $(www.html.wrapper);
- $hint = $elOrNull(o.hint);
- $menu = $elOrNull(o.menu);
- defaultHint = o.hint !== false && !$hint;
- defaultMenu = o.menu !== false && !$menu;
- defaultHint && ($hint = buildHintFromInput($input, www));
- defaultMenu && ($menu = $(www.html.menu).css(www.css.menu));
- $hint && $hint.val("");
- $input = prepInput($input, www);
- if (defaultHint || defaultMenu) {
- $wrapper.css(www.css.wrapper);
- $input.css(defaultHint ? www.css.input : www.css.inputWithNoHint);
- $input.wrap($wrapper).parent().prepend(defaultHint ? $hint : null).append(defaultMenu ? $menu : null);
- }
- MenuConstructor = defaultMenu ? DefaultMenu : Menu;
- eventBus = new EventBus({
- el: $input
- });
- input = new Input({
- hint: $hint,
- input: $input
- }, www);
- menu = new MenuConstructor({
- node: $menu,
- datasets: datasets
- }, www);
- typeahead = new Typeahead({
- input: input,
- menu: menu,
- eventBus: eventBus,
- minLength: o.minLength
- }, www);
- $input.data(keys.www, www);
- $input.data(keys.typeahead, typeahead);
- }
- },
- isEnabled: function isEnabled() {
- var enabled;
- ttEach(this.first(), function(t) {
- enabled = t.isEnabled();
- });
- return enabled;
- },
- enable: function enable() {
- ttEach(this, function(t) {
- t.enable();
- });
- return this;
- },
- disable: function disable() {
- ttEach(this, function(t) {
- t.disable();
- });
- return this;
- },
- isActive: function isActive() {
- var active;
- ttEach(this.first(), function(t) {
- active = t.isActive();
- });
- return active;
- },
- activate: function activate() {
- ttEach(this, function(t) {
- t.activate();
- });
- return this;
- },
- deactivate: function deactivate() {
- ttEach(this, function(t) {
- t.deactivate();
- });
- return this;
- },
- isOpen: function isOpen() {
- var open;
- ttEach(this.first(), function(t) {
- open = t.isOpen();
- });
- return open;
- },
- open: function open() {
- ttEach(this, function(t) {
- t.open();
- });
- return this;
- },
- close: function close() {
- ttEach(this, function(t) {
- t.close();
- });
- return this;
- },
- select: function select(el) {
- var success = false, $el = $(el);
- ttEach(this.first(), function(t) {
- success = t.select($el);
- });
- return success;
- },
- autocomplete: function autocomplete(el) {
- var success = false, $el = $(el);
- ttEach(this.first(), function(t) {
- success = t.autocomplete($el);
- });
- return success;
- },
- moveCursor: function moveCursoe(delta) {
- var success = false;
- ttEach(this.first(), function(t) {
- success = t.moveCursor(delta);
- });
- return success;
- },
- val: function val(newVal) {
- var query;
- if (!arguments.length) {
- ttEach(this.first(), function(t) {
- query = t.getVal();
- });
- return query;
- } else {
- ttEach(this, function(t) {
- t.setVal(_.toStr(newVal));
- });
- return this;
- }
- },
- destroy: function destroy() {
- ttEach(this, function(typeahead, $input) {
- revert($input);
- typeahead.destroy();
- });
- return this;
- }
- };
- $.fn.typeahead = function(method) {
- if (methods[method]) {
- return methods[method].apply(this, [].slice.call(arguments, 1));
- } else {
- return methods.initialize.apply(this, arguments);
- }
- };
- $.fn.typeahead.noConflict = function noConflict() {
- $.fn.typeahead = old;
- return this;
- };
- function ttEach($els, fn) {
- $els.each(function() {
- var $input = $(this), typeahead;
- (typeahead = $input.data(keys.typeahead)) && fn(typeahead, $input);
- });
- }
- function buildHintFromInput($input, www) {
- return $input.clone().addClass(www.classes.hint).removeData().css(www.css.hint).css(getBackgroundStyles($input)).prop("readonly", true).removeAttr("id name placeholder required").attr({
- autocomplete: "off",
- spellcheck: "false",
- tabindex: -1
- });
- }
- function prepInput($input, www) {
- $input.data(keys.attrs, {
- dir: $input.attr("dir"),
- autocomplete: $input.attr("autocomplete"),
- spellcheck: $input.attr("spellcheck"),
- style: $input.attr("style")
- });
- $input.addClass(www.classes.input).attr({
- autocomplete: "off",
- spellcheck: false
- });
- try {
- !$input.attr("dir") && $input.attr("dir", "auto");
- } catch (e) {}
- return $input;
- }
- function getBackgroundStyles($el) {
- return {
- backgroundAttachment: $el.css("background-attachment"),
- backgroundClip: $el.css("background-clip"),
- backgroundColor: $el.css("background-color"),
- backgroundImage: $el.css("background-image"),
- backgroundOrigin: $el.css("background-origin"),
- backgroundPosition: $el.css("background-position"),
- backgroundRepeat: $el.css("background-repeat"),
- backgroundSize: $el.css("background-size")
- };
- }
- function revert($input) {
- var www, $wrapper;
- www = $input.data(keys.www);
- $wrapper = $input.parent().filter(www.selectors.wrapper);
- _.each($input.data(keys.attrs), function(val, key) {
- _.isUndefined(val) ? $input.removeAttr(key) : $input.attr(key, val);
- });
- $input.removeData(keys.typeahead).removeData(keys.www).removeData(keys.attr).removeClass(www.classes.input);
- if ($wrapper.length) {
- $input.detach().insertAfter($wrapper);
- $wrapper.remove();
- }
- }
- function $elOrNull(obj) {
- var isValid, $el;
- isValid = _.isJQuery(obj) || _.isElement(obj);
- $el = isValid ? $(obj).first() : [];
- return $el.length ? $el : null;
- }
- })();
-}); \ No newline at end of file