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:
authorJonne Haß <me@jhass.eu>2015-05-03 16:45:49 +0300
committerJonne Haß <me@jhass.eu>2015-05-03 16:45:49 +0300
commitf8b3836d1fb782f7cac93648a71ee7b88e224225 (patch)
tree36e3774587b5bf8984fe557362c0667f8242b295
parentca46b4579bb941e65ad756e57d21232cd849d6ca (diff)
parent260a10b2f28c635df0a96b87ba513a380cf28954 (diff)
Merge branch 'release/0.5.0.0-RC'v0.5.0.0
-rw-r--r--.editorconfig17
-rw-r--r--.foreman2
-rw-r--r--.gitignore14
-rw-r--r--.hound.yml9
l---------.jshintignore1
l---------.jshintrc1
-rw-r--r--.pairs15
-rw-r--r--.powenv1
-rw-r--r--.powrc4
-rw-r--r--.rspec1
-rw-r--r--.rubocop.yml130
-rw-r--r--.ruby-version2
-rw-r--r--.travis.yml27
-rw-r--r--Changelog.md223
-rw-r--r--Gemfile281
-rw-r--r--Gemfile.lock913
-rw-r--r--Guardfile65
-rw-r--r--Procfile5
-rw-r--r--README.md2
-rw-r--r--app/assets/images/branding/header-logo_hover.pngbin0 -> 3931 bytes
-rw-r--r--app/assets/images/close_label.pngbin212 -> 0 bytes
-rw-r--r--[-rwxr-xr-x]app/assets/images/facebox/loading.gifbin2767 -> 2767 bytes
-rw-r--r--app/assets/images/icons/circle.pngbin255 -> 0 bytes
-rw-r--r--app/assets/images/icons/create_participation.pngbin0 -> 1330 bytes
-rw-r--r--app/assets/images/icons/destroy_participation.pngbin0 -> 1405 bytes
-rw-r--r--[-rwxr-xr-x]app/assets/images/icons/menu.pngbin262 -> 262 bytes
-rw-r--r--app/assets/images/peeping-tom.png (renamed from public/peeping-tom.png)bin63911 -> 63911 bytes
-rw-r--r--app/assets/javascripts/app/app.js42
-rw-r--r--app/assets/javascripts/app/collections/aspect_memberships.js6
-rw-r--r--app/assets/javascripts/app/collections/aspects.js5
-rw-r--r--app/assets/javascripts/app/collections/comments.js7
-rw-r--r--app/assets/javascripts/app/collections/contacts.js21
-rw-r--r--app/assets/javascripts/app/collections/likes.js5
-rw-r--r--app/assets/javascripts/app/collections/photos.js5
-rw-r--r--app/assets/javascripts/app/collections/posts.js4
-rw-r--r--app/assets/javascripts/app/collections/reshares.js4
-rw-r--r--app/assets/javascripts/app/collections/tag_followings.js4
-rw-r--r--app/assets/javascripts/app/helpers/date_formatter.js5
-rw-r--r--app/assets/javascripts/app/helpers/direction_detector.js95
-rw-r--r--app/assets/javascripts/app/helpers/handlebars-helpers.js108
-rw-r--r--app/assets/javascripts/app/helpers/handlebars-partials.js5
-rw-r--r--app/assets/javascripts/app/helpers/o_embed.js13
-rw-r--r--app/assets/javascripts/app/helpers/open_graph.js12
-rw-r--r--app/assets/javascripts/app/helpers/text_formatter.js176
-rw-r--r--app/assets/javascripts/app/helpers/timeago.js9
-rw-r--r--app/assets/javascripts/app/helpers/truncate.js14
-rw-r--r--app/assets/javascripts/app/models.js3
-rw-r--r--app/assets/javascripts/app/models/aspect.js4
-rw-r--r--app/assets/javascripts/app/models/aspect_membership.js6
-rw-r--r--app/assets/javascripts/app/models/block.js4
-rw-r--r--app/assets/javascripts/app/models/comment.js4
-rw-r--r--app/assets/javascripts/app/models/contact.js13
-rw-r--r--app/assets/javascripts/app/models/like.js4
-rw-r--r--app/assets/javascripts/app/models/person.js53
-rw-r--r--app/assets/javascripts/app/models/photo.js4
-rw-r--r--app/assets/javascripts/app/models/poll_participation.js4
-rw-r--r--app/assets/javascripts/app/models/post.js39
-rw-r--r--app/assets/javascripts/app/models/post/interactions.js85
-rw-r--r--app/assets/javascripts/app/models/profile.js18
-rw-r--r--app/assets/javascripts/app/models/report.js4
-rw-r--r--app/assets/javascripts/app/models/reshare.js10
-rw-r--r--app/assets/javascripts/app/models/status_message.js6
-rw-r--r--app/assets/javascripts/app/models/stream.js38
-rw-r--r--app/assets/javascripts/app/models/stream_aspects.js15
-rw-r--r--app/assets/javascripts/app/models/tag_following.js4
-rw-r--r--app/assets/javascripts/app/models/user.js10
-rw-r--r--app/assets/javascripts/app/pages/contacts.js75
-rw-r--r--app/assets/javascripts/app/pages/profile.js130
-rw-r--r--app/assets/javascripts/app/pages/single-post-viewer.js9
-rw-r--r--app/assets/javascripts/app/router.js84
-rw-r--r--app/assets/javascripts/app/views.js59
-rw-r--r--app/assets/javascripts/app/views/aspect_membership_blueprint_view.js161
-rw-r--r--app/assets/javascripts/app/views/aspect_membership_view.js25
-rw-r--r--app/assets/javascripts/app/views/aspect_view.js11
-rw-r--r--app/assets/javascripts/app/views/aspects_dropdown_view.js21
-rw-r--r--app/assets/javascripts/app/views/aspects_list_view.js26
-rw-r--r--app/assets/javascripts/app/views/bookmarklet_view.js10
-rw-r--r--app/assets/javascripts/app/views/comment_stream_view.js20
-rw-r--r--app/assets/javascripts/app/views/comment_view.js17
-rw-r--r--app/assets/javascripts/app/views/contact_stream_view.js77
-rw-r--r--app/assets/javascripts/app/views/contact_view.js71
-rw-r--r--app/assets/javascripts/app/views/content_view.js59
-rw-r--r--app/assets/javascripts/app/views/conversations_form_view.js31
-rw-r--r--app/assets/javascripts/app/views/conversations_view.js49
-rw-r--r--app/assets/javascripts/app/views/faq_question_view.js10
-rw-r--r--app/assets/javascripts/app/views/feedback_actions.js6
-rw-r--r--app/assets/javascripts/app/views/feedback_view.js55
-rw-r--r--app/assets/javascripts/app/views/header_view.js36
-rw-r--r--app/assets/javascripts/app/views/help_section_view.js8
-rw-r--r--app/assets/javascripts/app/views/help_view.js84
-rw-r--r--app/assets/javascripts/app/views/hovercard_view.js49
-rw-r--r--app/assets/javascripts/app/views/infinite_stream_view.js13
-rw-r--r--app/assets/javascripts/app/views/likes_info_view.js7
-rw-r--r--app/assets/javascripts/app/views/location_stream.js4
-rw-r--r--app/assets/javascripts/app/views/location_view.js12
-rw-r--r--app/assets/javascripts/app/views/notification_dropdown_view.js118
-rw-r--r--app/assets/javascripts/app/views/notifications_view.js114
-rw-r--r--app/assets/javascripts/app/views/photo_view.js7
-rw-r--r--app/assets/javascripts/app/views/photo_viewer.js7
-rw-r--r--app/assets/javascripts/app/views/photos_view.js9
-rw-r--r--app/assets/javascripts/app/views/poll_view.js21
-rw-r--r--app/assets/javascripts/app/views/post_view.js9
-rw-r--r--app/assets/javascripts/app/views/profile_header_view.js63
-rw-r--r--app/assets/javascripts/app/views/profile_sidebar_view.js17
-rw-r--r--app/assets/javascripts/app/views/publisher/aspect_selector_blueprint_view.js91
-rw-r--r--app/assets/javascripts/app/views/publisher/aspect_selector_view.js19
-rw-r--r--app/assets/javascripts/app/views/publisher/getting_started_view.js19
-rw-r--r--app/assets/javascripts/app/views/publisher/poll_creator_view.js14
-rw-r--r--app/assets/javascripts/app/views/publisher/services_view.js4
-rw-r--r--app/assets/javascripts/app/views/publisher/uploader_view.js12
-rw-r--r--app/assets/javascripts/app/views/publisher_view.js113
-rw-r--r--app/assets/javascripts/app/views/search_view.js72
-rw-r--r--app/assets/javascripts/app/views/sidebar.js4
-rw-r--r--app/assets/javascripts/app/views/single-post-viewer/single_post_actions.js10
-rw-r--r--app/assets/javascripts/app/views/single-post-viewer/single_post_comment_stream.js25
-rw-r--r--app/assets/javascripts/app/views/single-post-viewer/single_post_content_view.js13
-rw-r--r--app/assets/javascripts/app/views/single-post-viewer/single_post_interactions.js9
-rw-r--r--app/assets/javascripts/app/views/single-post-viewer/single_post_moderation.js68
-rw-r--r--app/assets/javascripts/app/views/stream/shortcuts.js50
-rw-r--r--app/assets/javascripts/app/views/stream_faces_view.js9
-rw-r--r--app/assets/javascripts/app/views/stream_post_views.js47
-rw-r--r--app/assets/javascripts/app/views/stream_view.js26
-rw-r--r--app/assets/javascripts/app/views/tag_following_action_view.js19
-rw-r--r--app/assets/javascripts/app/views/tag_following_list_view.js8
-rw-r--r--app/assets/javascripts/app/views/tag_following_view.js5
-rw-r--r--app/assets/javascripts/app/views/tags_view.js9
-rw-r--r--app/assets/javascripts/aspect-edit-pane.js120
-rw-r--r--app/assets/javascripts/aspects-dropdown.js41
-rw-r--r--app/assets/javascripts/browser_detection.js4
-rw-r--r--app/assets/javascripts/contact-edit.js58
-rw-r--r--app/assets/javascripts/contact-list.js64
-rw-r--r--app/assets/javascripts/diaspora.js21
-rw-r--r--app/assets/javascripts/helpers/alert.js30
-rw-r--r--app/assets/javascripts/helpers/i18n.js17
-rw-r--r--app/assets/javascripts/home.js7
-rw-r--r--app/assets/javascripts/ie.js4
-rw-r--r--app/assets/javascripts/inbox.js89
-rw-r--r--app/assets/javascripts/jasmine-load-all.js11
-rw-r--r--app/assets/javascripts/jsxc.js42
-rw-r--r--app/assets/javascripts/mailchimp.js3
-rw-r--r--app/assets/javascripts/main.js21
-rw-r--r--app/assets/javascripts/mentions.js4
-rw-r--r--app/assets/javascripts/mobile/mobile.js (renamed from app/assets/javascripts/mobile.js)129
-rw-r--r--app/assets/javascripts/mobile/mobile_file_uploader.js84
-rw-r--r--app/assets/javascripts/mobile/profile_aspects.js84
-rw-r--r--app/assets/javascripts/osmlocator.js18
-rw-r--r--app/assets/javascripts/pages/contacts-index.js10
-rw-r--r--app/assets/javascripts/pages/invitations-edit.js8
-rw-r--r--app/assets/javascripts/pages/invitations-new.js12
-rw-r--r--app/assets/javascripts/pages/notifications-index.js8
-rw-r--r--app/assets/javascripts/pages/users-getting-started.js14
-rw-r--r--app/assets/javascripts/people.js26
-rw-r--r--app/assets/javascripts/profile.js6
-rw-r--r--app/assets/javascripts/view.js53
-rw-r--r--app/assets/javascripts/widgets/back-to-top.js5
-rw-r--r--app/assets/javascripts/widgets/direction-detector.js51
-rw-r--r--app/assets/javascripts/widgets/flash-messages.js4
-rw-r--r--app/assets/javascripts/widgets/header.js21
-rw-r--r--app/assets/javascripts/widgets/infinite-scroll.js5
-rw-r--r--app/assets/javascripts/widgets/lightbox.js18
-rw-r--r--app/assets/javascripts/widgets/notifications-badge.js83
-rw-r--r--app/assets/javascripts/widgets/notifications.js145
-rw-r--r--app/assets/javascripts/widgets/search.js75
-rw-r--r--app/assets/javascripts/widgets/stream.js4
-rw-r--r--app/assets/javascripts/widgets/timeago.js9
-rw-r--r--app/assets/stylesheets/_flash_messages.scss4
-rw-r--r--app/assets/stylesheets/_mixins.scss (renamed from app/assets/stylesheets/_mixins.css.scss)62
-rw-r--r--app/assets/stylesheets/admin.scss (renamed from app/assets/stylesheets/admin.css.scss)0
-rw-r--r--app/assets/stylesheets/application.css.sass1478
-rw-r--r--app/assets/stylesheets/application.scss (renamed from app/assets/stylesheets/new-templates.css.scss)46
-rw-r--r--app/assets/stylesheets/aspects.css.scss267
-rw-r--r--app/assets/stylesheets/aspects.scss47
-rw-r--r--app/assets/stylesheets/autocomplete.scss (renamed from app/assets/stylesheets/autocomplete.css.scss)25
-rw-r--r--app/assets/stylesheets/blueprint.css3
-rw-r--r--app/assets/stylesheets/bookmarklet.css.scss1
-rw-r--r--app/assets/stylesheets/bookmarklet.scss2
-rw-r--r--app/assets/stylesheets/bootstrap-complete.scss (renamed from app/assets/stylesheets/bootstrap-complete.css.scss)0
-rw-r--r--app/assets/stylesheets/bootstrap-fix.scss24
-rw-r--r--app/assets/stylesheets/bootstrap-headerfix.sass40
-rw-r--r--app/assets/stylesheets/bootstrap-headerfix.scss52
-rw-r--r--app/assets/stylesheets/chat.scss7
-rw-r--r--app/assets/stylesheets/colors.scss (renamed from app/assets/stylesheets/colors.css.scss)3
-rw-r--r--app/assets/stylesheets/comments.scss48
-rw-r--r--app/assets/stylesheets/contacts.css.scss126
-rw-r--r--app/assets/stylesheets/contacts.scss72
-rw-r--r--app/assets/stylesheets/conversations.css.scss255
-rw-r--r--app/assets/stylesheets/conversations.scss228
-rw-r--r--app/assets/stylesheets/default.css15
-rw-r--r--app/assets/stylesheets/entypo.scss (renamed from app/assets/stylesheets/entypo.css.scss)0
-rw-r--r--app/assets/stylesheets/error_pages.css.scss25
-rw-r--r--app/assets/stylesheets/error_pages.scss107
-rw-r--r--app/assets/stylesheets/facebox.scss (renamed from app/assets/stylesheets/facebox.css.scss)0
-rw-r--r--app/assets/stylesheets/footer.scss (renamed from app/assets/stylesheets/footer.css.scss)2
-rw-r--r--app/assets/stylesheets/getting-started.css.scss37
-rw-r--r--app/assets/stylesheets/getting-started.scss81
-rw-r--r--app/assets/stylesheets/header.scss (renamed from app/assets/stylesheets/header.css.scss)84
-rw-r--r--app/assets/stylesheets/help.scss (renamed from app/assets/stylesheets/help.css.scss)34
-rw-r--r--app/assets/stylesheets/home.scss84
-rw-r--r--app/assets/stylesheets/hovercard.scss (renamed from app/assets/stylesheets/hovercard.css.scss)7
-rw-r--r--app/assets/stylesheets/invitations.scss (renamed from app/assets/stylesheets/invitations.css.scss)6
-rw-r--r--app/assets/stylesheets/leftnavbar.css.scss48
-rw-r--r--app/assets/stylesheets/leftnavbar.scss127
-rw-r--r--app/assets/stylesheets/lightbox.scss (renamed from app/assets/stylesheets/lightbox.css.scss)16
-rw-r--r--app/assets/stylesheets/markdown-content.scss11
-rw-r--r--app/assets/stylesheets/media-box.scss (renamed from app/assets/stylesheets/media-box.css.scss)0
-rw-r--r--app/assets/stylesheets/mentions.scss (renamed from app/assets/stylesheets/mentions.css.scss)26
-rw-r--r--app/assets/stylesheets/mobile/header.scss (renamed from app/assets/stylesheets/mobile/header.css.scss)46
-rw-r--r--app/assets/stylesheets/mobile/mobile.scss (renamed from app/assets/stylesheets/mobile/mobile.css.scss)182
-rw-r--r--app/assets/stylesheets/new_styles/_animations.scss75
-rw-r--r--app/assets/stylesheets/new_styles/_base.scss123
-rw-r--r--app/assets/stylesheets/new_styles/_buttons.scss (renamed from app/assets/stylesheets/buttons.css.scss)2
-rw-r--r--app/assets/stylesheets/new_styles/_code.scss7
-rw-r--r--app/assets/stylesheets/new_styles/_flash_messages.scss13
-rw-r--r--app/assets/stylesheets/new_styles/_forms.scss167
-rw-r--r--app/assets/stylesheets/new_styles/_interactions.scss238
-rw-r--r--app/assets/stylesheets/new_styles/_landing.scss113
-rw-r--r--app/assets/stylesheets/new_styles/_login.scss75
-rw-r--r--app/assets/stylesheets/new_styles/_navs.scss15
-rw-r--r--app/assets/stylesheets/new_styles/_new_mixins.scss86
-rw-r--r--app/assets/stylesheets/new_styles/_poll.scss8
-rw-r--r--app/assets/stylesheets/new_styles/_registration.scss69
-rw-r--r--app/assets/stylesheets/new_styles/_settings.scss7
-rw-r--r--app/assets/stylesheets/new_styles/_spinner.scss24
-rw-r--r--app/assets/stylesheets/new_styles/_statistics.scss28
-rw-r--r--app/assets/stylesheets/new_styles/_variables.scss11
-rw-r--r--app/assets/stylesheets/new_styles/_viewer_nav.scss18
-rw-r--r--app/assets/stylesheets/notifications.scss (renamed from app/assets/stylesheets/notifications.css.scss)39
-rw-r--r--app/assets/stylesheets/oembed.scss12
-rw-r--r--app/assets/stylesheets/opengraph.scss (renamed from app/assets/stylesheets/opengraph.css.scss)0
-rw-r--r--app/assets/stylesheets/people.css.scss17
-rw-r--r--app/assets/stylesheets/people.scss29
-rw-r--r--app/assets/stylesheets/photo.css.scss19
-rw-r--r--app/assets/stylesheets/poll.css.scss32
-rw-r--r--app/assets/stylesheets/popover.css.scss28
-rw-r--r--app/assets/stylesheets/popup.css.scss106
-rw-r--r--app/assets/stylesheets/post-content.scss21
-rw-r--r--app/assets/stylesheets/profile.css.scss125
-rw-r--r--app/assets/stylesheets/profile.scss130
-rw-r--r--app/assets/stylesheets/publisher.scss (renamed from app/assets/stylesheets/publisher.css.scss)75
-rw-r--r--app/assets/stylesheets/publisher_blueprint.css.scss409
-rw-r--r--app/assets/stylesheets/report.scss (renamed from app/assets/stylesheets/report.css.scss)0
-rw-r--r--app/assets/stylesheets/rtl.scss (renamed from app/assets/stylesheets/rtl.css.scss)4
-rw-r--r--app/assets/stylesheets/scaffolds.css.scss56
-rw-r--r--app/assets/stylesheets/sessions.css.scss162
-rw-r--r--app/assets/stylesheets/sidebar.css.scss194
-rw-r--r--app/assets/stylesheets/sidebar.scss61
-rw-r--r--app/assets/stylesheets/single-post-view.css.scss261
-rw-r--r--app/assets/stylesheets/single-post-view.scss149
-rw-r--r--app/assets/stylesheets/sizes.scss2
-rw-r--r--app/assets/stylesheets/sprites.scss (renamed from app/assets/stylesheets/sprites.css.scss)0
-rw-r--r--app/assets/stylesheets/stream-faces.scss (renamed from app/assets/stylesheets/stream-faces.css.scss)2
-rw-r--r--app/assets/stylesheets/stream.scss11
-rw-r--r--app/assets/stylesheets/stream_element.css.scss288
-rw-r--r--app/assets/stylesheets/stream_element.scss141
-rw-r--r--app/assets/stylesheets/tag.css.scss22
-rw-r--r--app/assets/stylesheets/tag.scss48
-rw-r--r--app/assets/stylesheets/tags.css.scss20
-rw-r--r--app/assets/stylesheets/ui.css.scss253
-rw-r--r--app/assets/stylesheets/vendor/autoSuggest.css.erb (renamed from app/assets/stylesheets/vendor/autoSuggest.css)42
-rw-r--r--app/assets/stylesheets/vendor/blank.gifbin43 -> 0 bytes
-rw-r--r--app/assets/stylesheets/vendor/blueprint/AUTHORS.textile42
-rw-r--r--app/assets/stylesheets/vendor/blueprint/LICENSE22
-rw-r--r--app/assets/stylesheets/vendor/blueprint/ie.css35
-rw-r--r--app/assets/stylesheets/vendor/blueprint/plugins/buttons/icons/cross.pngbin655 -> 0 bytes
-rw-r--r--app/assets/stylesheets/vendor/blueprint/plugins/buttons/icons/key.pngbin455 -> 0 bytes
-rw-r--r--app/assets/stylesheets/vendor/blueprint/plugins/buttons/icons/tick.pngbin537 -> 0 bytes
-rw-r--r--app/assets/stylesheets/vendor/blueprint/plugins/buttons/readme.txt32
-rw-r--r--app/assets/stylesheets/vendor/blueprint/plugins/buttons/screen.css97
-rw-r--r--app/assets/stylesheets/vendor/blueprint/plugins/fancy-type/readme.txt14
-rw-r--r--app/assets/stylesheets/vendor/blueprint/plugins/fancy-type/screen.css71
-rw-r--r--app/assets/stylesheets/vendor/blueprint/plugins/link-icons/icons/doc.pngbin777 -> 0 bytes
-rw-r--r--app/assets/stylesheets/vendor/blueprint/plugins/link-icons/icons/email.pngbin641 -> 0 bytes
-rw-r--r--app/assets/stylesheets/vendor/blueprint/plugins/link-icons/icons/external.pngbin46828 -> 0 bytes
-rw-r--r--app/assets/stylesheets/vendor/blueprint/plugins/link-icons/icons/feed.pngbin691 -> 0 bytes
-rw-r--r--app/assets/stylesheets/vendor/blueprint/plugins/link-icons/icons/im.pngbin741 -> 0 bytes
-rw-r--r--app/assets/stylesheets/vendor/blueprint/plugins/link-icons/icons/pdf.pngbin591 -> 0 bytes
-rw-r--r--app/assets/stylesheets/vendor/blueprint/plugins/link-icons/icons/visited.pngbin46925 -> 0 bytes
-rw-r--r--app/assets/stylesheets/vendor/blueprint/plugins/link-icons/icons/xls.pngbin663 -> 0 bytes
-rw-r--r--app/assets/stylesheets/vendor/blueprint/plugins/link-icons/readme.txt18
-rw-r--r--app/assets/stylesheets/vendor/blueprint/plugins/link-icons/screen.css40
-rw-r--r--app/assets/stylesheets/vendor/blueprint/plugins/rtl/readme.txt10
-rw-r--r--app/assets/stylesheets/vendor/blueprint/plugins/rtl/screen.css110
-rw-r--r--app/assets/stylesheets/vendor/blueprint/print.css29
-rw-r--r--app/assets/stylesheets/vendor/blueprint/screen.css258
-rw-r--r--app/assets/stylesheets/vendor/blueprint/src/forms.css65
-rw-r--r--app/assets/stylesheets/vendor/blueprint/src/grid.css280
-rw-r--r--app/assets/stylesheets/vendor/blueprint/src/grid.pngbin132 -> 0 bytes
-rw-r--r--app/assets/stylesheets/vendor/blueprint/src/ie.css76
-rw-r--r--app/assets/stylesheets/vendor/blueprint/src/print.css85
-rw-r--r--app/assets/stylesheets/vendor/blueprint/src/reset.css45
-rw-r--r--app/assets/stylesheets/vendor/blueprint/src/typography.css106
-rw-r--r--[-rwxr-xr-x]app/assets/stylesheets/vendor/facebox.css6
-rw-r--r--app/assets/stylesheets/vendor/fileuploader.css73
-rw-r--r--app/assets/stylesheets/vendor/html5-boilerplate-mobile.css315
-rw-r--r--app/assets/stylesheets/vendor/images/icon-search-black.pngbin1245 -> 0 bytes
-rw-r--r--app/assets/stylesheets/vendor/images/icons-18-black.pngbin2138 -> 0 bytes
-rw-r--r--app/assets/stylesheets/vendor/images/icons-18-white.pngbin2207 -> 0 bytes
-rw-r--r--app/assets/stylesheets/vendor/images/icons-36-black.pngbin4011 -> 0 bytes
-rw-r--r--app/assets/stylesheets/vendor/images/icons-36-white.pngbin4343 -> 0 bytes
-rw-r--r--app/assets/stylesheets/vendor/interim-bootstrap.css.scss13
-rw-r--r--app/assets/stylesheets/vendor/jquery.mentionsInput.css4
-rw-r--r--app/assets/stylesheets/vendor/jquery.mobile-1.0b2.min.css8
-rw-r--r--app/assets/stylesheets/vendor/jquery.ui.autocomplete.css56
-rw-r--r--app/assets/stylesheets/vendor/tipsy.css12
-rw-r--r--app/assets/templates/aspect_tpl.jst.hbs8
-rw-r--r--app/assets/templates/comment-stream_tpl.jst.hbs6
-rw-r--r--app/assets/templates/comment_tpl.jst.hbs22
-rw-r--r--app/assets/templates/contact_tpl.jst.hbs23
-rw-r--r--app/assets/templates/faq_chat_tpl.jst.hbs6
-rw-r--r--app/assets/templates/faq_getting_help_tpl.jst.hbs5
-rw-r--r--app/assets/templates/faq_keyboard_shortcuts_tpl.jst.hbs4
-rw-r--r--app/assets/templates/faq_posts_and_posting_tpl.jst.hbs73
-rw-r--r--app/assets/templates/faq_question_tpl.jst.hbs2
-rw-r--r--app/assets/templates/faq_sharing_tpl.jst.hbs7
-rw-r--r--app/assets/templates/faq_tags_tpl.jst.hbs30
-rw-r--r--app/assets/templates/header_tpl.jst.hbs6
-rw-r--r--app/assets/templates/help_tpl.jst.hbs10
-rw-r--r--app/assets/templates/likes-info_tpl.jst.hbs10
-rw-r--r--app/assets/templates/photo_tpl.jst.hbs34
-rw-r--r--app/assets/templates/poll_creator_tpl.jst.hbs25
-rw-r--r--app/assets/templates/poll_tpl.jst.hbs7
-rw-r--r--app/assets/templates/profile_header_tpl.jst.hbs104
-rw-r--r--app/assets/templates/profile_sidebar_tpl.jst.hbs37
-rw-r--r--app/assets/templates/reshare_tpl.jst.hbs6
-rw-r--r--app/assets/templates/single-post-viewer/single-post-actions_tpl.jst.hbs6
-rw-r--r--app/assets/templates/single-post-viewer/single-post-content_tpl.jst.hbs44
-rw-r--r--app/assets/templates/single-post-viewer/single-post-interactions_tpl.jst.hbs8
-rw-r--r--app/assets/templates/single-post-viewer/single-post-moderation_tpl.jst.hbs28
-rw-r--r--app/assets/templates/status-message_tpl.jst.hbs4
-rw-r--r--app/assets/templates/stream-element_tpl.jst.hbs37
-rw-r--r--app/assets/templates/stream-faces_tpl.jst.hbs4
-rw-r--r--app/assets/templates/stream-frame_tpl.jst.hbs31
-rw-r--r--app/assets/templates/stream_tpl.jst.hbs75
-rw-r--r--app/assets/templates/tag_following_action_tpl.jst.hbs12
-rw-r--r--app/assets/templates/tag_following_tpl.jst.hbs2
-rw-r--r--app/controllers/admin/admin_controller.rb9
-rw-r--r--app/controllers/admin/users_controller.rb27
-rw-r--r--app/controllers/admins_controller.rb28
-rw-r--r--app/controllers/api/v1/tokens_controller.rb16
-rw-r--r--app/controllers/application_controller.rb32
-rw-r--r--app/controllers/aspect_memberships_controller.rb13
-rw-r--r--app/controllers/aspects_controller.rb35
-rw-r--r--app/controllers/blocks_controller.rb2
-rw-r--r--app/controllers/comments_controller.rb6
-rw-r--r--app/controllers/contacts_controller.rb40
-rw-r--r--app/controllers/conversation_visibilities_controller.rb9
-rw-r--r--app/controllers/conversations_controller.rb63
-rw-r--r--app/controllers/help_controller.rb5
-rw-r--r--app/controllers/home_controller.rb11
-rw-r--r--app/controllers/invitation_codes_controller.rb2
-rw-r--r--app/controllers/invitations_controller.rb4
-rw-r--r--app/controllers/likes_controller.rb10
-rw-r--r--app/controllers/messages_controller.rb2
-rw-r--r--app/controllers/notifications_controller.rb23
-rw-r--r--app/controllers/participations_controller.rb23
-rw-r--r--app/controllers/passwords_controller.rb4
-rw-r--r--app/controllers/people_controller.rb120
-rw-r--r--app/controllers/photos_controller.rb26
-rw-r--r--app/controllers/posts_controller.rb21
-rw-r--r--app/controllers/profiles_controller.rb10
-rw-r--r--app/controllers/publics_controller.rb8
-rw-r--r--app/controllers/registrations_controller.rb3
-rw-r--r--app/controllers/report_controller.rb4
-rw-r--r--app/controllers/reshares_controller.rb10
-rw-r--r--app/controllers/search_controller.rb4
-rw-r--r--app/controllers/services_controller.rb27
-rw-r--r--app/controllers/sessions_controller.rb8
-rw-r--r--app/controllers/share_visibilities_controller.rb2
-rw-r--r--app/controllers/statistics_controller.rb8
-rw-r--r--app/controllers/status_messages_controller.rb9
-rw-r--r--app/controllers/streams_controller.rb9
-rw-r--r--app/controllers/tag_followings_controller.rb6
-rw-r--r--app/controllers/tags_controller.rb10
-rw-r--r--app/controllers/terms_controller.rb3
-rw-r--r--app/controllers/users_controller.rb69
-rw-r--r--app/helpers/application_helper.rb22
-rw-r--r--app/helpers/aspect_global_helper.rb54
-rw-r--r--app/helpers/aspects_helper.rb58
-rw-r--r--app/helpers/contacts_helper.rb35
-rw-r--r--app/helpers/conversations_helper.rb9
-rw-r--r--app/helpers/error_messages_helper.rb3
-rw-r--r--app/helpers/jsxc_helper.rb13
-rw-r--r--app/helpers/layout_helper.rb21
-rw-r--r--app/helpers/mobile_helper.rb2
-rw-r--r--app/helpers/notifications_helper.rb25
-rw-r--r--app/helpers/notifier_helper.rb17
-rw-r--r--app/helpers/open_graph_helper.rb75
-rw-r--r--app/helpers/people_helper.rb28
-rw-r--r--app/helpers/profile_helper.rb15
-rw-r--r--app/helpers/report_helper.rb2
-rw-r--r--app/helpers/services_helper.rb9
-rw-r--r--app/helpers/statistics_helper.rb37
-rw-r--r--app/helpers/tags_helper.rb13
-rw-r--r--app/mailers/export_mailer.rb39
-rw-r--r--app/mailers/maintenance.rb15
-rw-r--r--app/mailers/notification_mailers/base.rb2
-rw-r--r--app/mailers/notifier.rb4
-rw-r--r--app/mailers/report_mailer.rb3
-rw-r--r--app/models/account_deletion.rb1
-rw-r--r--app/models/comment.rb6
-rw-r--r--app/models/contact.rb29
-rw-r--r--app/models/conversation.rb26
-rw-r--r--app/models/conversation_visibility.rb10
-rw-r--r--app/models/o_embed_cache.rb6
-rw-r--r--app/models/open_graph_cache.rb35
-rw-r--r--app/models/person.rb32
-rw-r--r--app/models/photo.rb21
-rw-r--r--app/models/pod.rb6
-rw-r--r--app/models/poll.rb6
-rw-r--r--app/models/post.rb24
-rw-r--r--app/models/profile.rb20
-rw-r--r--app/models/reshare.rb39
-rw-r--r--app/models/role.rb13
-rw-r--r--app/models/services/facebook.rb2
-rw-r--r--app/models/share_visibility.rb11
-rw-r--r--app/models/status_message.rb21
-rw-r--r--app/models/user.rb130
-rw-r--r--app/models/user/connecting.rb6
-rw-r--r--app/models/user/querying.rb16
-rw-r--r--app/presenters/aspect_membership_presenter.rb11
-rw-r--r--app/presenters/avatar_presenter.rb12
-rw-r--r--app/presenters/base_presenter.rb28
-rw-r--r--app/presenters/block_presenter.rb6
-rw-r--r--app/presenters/comment_presenter.rb4
-rw-r--r--app/presenters/contact_presenter.rb17
-rw-r--r--app/presenters/person_presenter.rb79
-rw-r--r--app/presenters/photo_presenter.rb16
-rw-r--r--app/presenters/post_presenter.rb27
-rw-r--r--app/presenters/profile_presenter.rb24
-rw-r--r--app/presenters/statistics_presenter.rb135
-rw-r--r--app/serializers/export/aspect_serializer.rb7
-rw-r--r--app/serializers/export/comment_serializer.rb10
-rw-r--r--app/serializers/export/contact_serializer.rb12
-rw-r--r--app/serializers/export/post_serializer.rb15
-rw-r--r--app/serializers/export/profile_serializer.rb14
-rw-r--r--app/serializers/export/user_serializer.rb23
-rw-r--r--app/uploaders/exported_photos.rb17
-rw-r--r--app/uploaders/exported_user.rb19
-rw-r--r--app/uploaders/processed_image.rb12
-rw-r--r--app/uploaders/secure_uploader.rb7
-rw-r--r--app/uploaders/unprocessed_image.rb12
-rw-r--r--app/views/admins/_user_entry.haml6
-rw-r--r--app/views/admins/correlations.haml22
-rw-r--r--app/views/admins/stats.html.haml112
-rw-r--r--app/views/admins/user_search.html.haml98
-rw-r--r--app/views/admins/weekly_user_stats.haml26
-rw-r--r--app/views/aspect_memberships/_add_to_aspect.haml7
-rw-r--r--app/views/aspect_memberships/_aspect_membership_dropdown.haml (renamed from app/views/aspect_memberships/_aspect_membership_dropdown.html.haml)4
-rw-r--r--app/views/aspect_memberships/_aspect_membership_dropdown.mobile.haml13
-rw-r--r--app/views/aspect_memberships/_aspect_membership_dropdown_blueprint.html.haml19
-rw-r--r--app/views/aspect_memberships/_remove_from_aspect.haml7
-rw-r--r--app/views/aspect_memberships/add_to_aspect.js.haml7
-rw-r--r--app/views/aspect_memberships/create.js.erb20
-rw-r--r--app/views/aspect_memberships/destroy.js.erb10
-rw-r--r--app/views/aspect_memberships/remove_from_aspect.js.haml7
-rw-r--r--app/views/aspects/_aspect_stream.haml2
-rw-r--r--app/views/aspects/_no_contacts_message.haml3
-rw-r--r--app/views/aspects/create.js.erb4
-rw-r--r--app/views/aspects/edit.html.haml24
-rw-r--r--app/views/aspects/new.haml40
-rw-r--r--app/views/aspects/toggle_contact_visibility.js.erb15
-rw-r--r--app/views/comments/index.mobile.haml15
-rw-r--r--app/views/community_spotlight/_user.html.haml13
-rw-r--r--app/views/contacts/_aspect_listings.haml55
-rw-r--r--app/views/contacts/_contact.html.haml10
-rw-r--r--app/views/contacts/_header.html.haml42
-rw-r--r--app/views/contacts/_sidebar.html.haml14
-rw-r--r--app/views/contacts/index.html.haml69
-rw-r--r--app/views/contacts/index.mobile.haml3
-rw-r--r--app/views/contacts/sharing.haml30
-rw-r--r--app/views/contacts/spotlight.haml42
-rw-r--r--app/views/conversations/_conversation.haml5
-rw-r--r--app/views/conversations/_new.haml18
-rw-r--r--app/views/conversations/_show.haml23
-rw-r--r--app/views/conversations/index.haml35
-rw-r--r--app/views/conversations/index.mobile.haml2
-rw-r--r--app/views/conversations/new.html.haml11
-rw-r--r--app/views/conversations/new.mobile.haml (renamed from app/views/conversations/new.haml)4
-rw-r--r--app/views/conversations/show.js.erb25
-rw-r--r--app/views/devise/passwords/edit.haml31
-rw-r--r--app/views/devise/passwords/edit.mobile.haml (renamed from app/views/passwords/edit.mobile.haml)8
-rw-r--r--app/views/devise/passwords/new.haml24
-rw-r--r--app/views/devise/passwords/new.mobile.haml (renamed from app/views/passwords/new.mobile.haml)8
-rw-r--r--app/views/errors/error_404.haml10
-rw-r--r--app/views/errors/error_422.haml8
-rw-r--r--app/views/errors/error_500.haml10
-rw-r--r--app/views/errors/not_public.haml12
-rw-r--r--app/views/home/default.haml64
-rw-r--r--app/views/invitations/new.html.haml2
-rw-r--r--app/views/invitations/new.mobile.haml28
-rw-r--r--app/views/invitations/new_blueprint.html.haml34
-rw-r--r--app/views/layouts/_header.html.haml2
-rw-r--r--app/views/layouts/_open_graph.haml5
-rw-r--r--app/views/layouts/application.html.haml24
-rw-r--r--app/views/layouts/application.mobile.haml28
-rw-r--r--app/views/layouts/centered_with_header_with_footer.html.haml9
-rw-r--r--app/views/layouts/error_page.haml14
-rw-r--r--app/views/maintenance/account_removal_warning.markerb2
-rw-r--r--app/views/notifications/_notification.haml (renamed from app/views/notifications/_notification.html.haml)0
-rw-r--r--app/views/notifications/_notification.mobile.haml7
-rw-r--r--app/views/notifications/_notify_popup_item.haml7
-rw-r--r--app/views/notifications/index.html.haml35
-rw-r--r--app/views/notifications/index.mobile.haml4
-rw-r--r--app/views/notifier/mentioned.markerb2
-rw-r--r--app/views/notifier/private_message.markerb2
-rw-r--r--app/views/passwords/edit.haml27
-rw-r--r--app/views/passwords/new.haml20
-rw-r--r--app/views/people/_add_contact.haml (renamed from app/views/people/_add_contact.html.haml)4
-rw-r--r--app/views/people/_aspect_membership_dropdown.haml2
-rw-r--r--app/views/people/_index.html.haml20
-rw-r--r--app/views/people/_person.html.haml27
-rw-r--r--app/views/people/_profile_sidebar.html.haml92
-rw-r--r--app/views/people/_relationship_action.haml3
-rw-r--r--app/views/people/_sub_header.html.haml34
-rw-r--r--app/views/people/contacts.haml48
-rw-r--r--app/views/people/index.html.haml1
-rw-r--r--app/views/people/show.html.haml48
-rw-r--r--app/views/people/show.mobile.haml16
-rw-r--r--app/views/people/tag_index.js.erb2
-rw-r--r--app/views/photos/_new_profile_photo.haml2
-rw-r--r--app/views/profiles/_edit.haml2
-rw-r--r--app/views/profiles/_edit_public.haml6
-rw-r--r--app/views/profiles/edit.haml13
-rw-r--r--app/views/publisher/_aspect_dropdown.html.haml20
-rw-r--r--app/views/publisher/_publisher.html.haml84
-rw-r--r--app/views/publisher/_publisher.mobile.haml8
-rw-r--r--app/views/publisher/_publisher_blueprint.html.haml100
-rw-r--r--app/views/publisher/_publisher_bootstrap.html.haml88
-rw-r--r--app/views/registrations/_form.haml33
-rw-r--r--app/views/registrations/edit.html.haml28
-rw-r--r--app/views/registrations/new.haml12
-rw-r--r--app/views/registrations/new.html.erb81
-rw-r--r--app/views/registrations/new.mobile.haml20
-rw-r--r--app/views/report/index.html.haml56
-rw-r--r--app/views/services/index.html.haml2
-rw-r--r--app/views/sessions/new.html.haml68
-rw-r--r--app/views/sessions/new.mobile.haml10
-rw-r--r--app/views/shared/_contact_list.html.haml19
-rw-r--r--app/views/shared/_contact_sidebar.html.haml13
-rw-r--r--app/views/shared/_donatepod.html.haml25
-rw-r--r--app/views/shared/_invitations.haml2
-rw-r--r--app/views/shared/_invitations_blueprint.haml3
-rw-r--r--app/views/shared/_links.haml2
-rw-r--r--app/views/shared/_post_stats.mobile.haml21
-rw-r--r--app/views/shared/_right_sections.html.haml25
-rw-r--r--app/views/shared/_stream_element.mobile.haml31
-rw-r--r--app/views/shared/_stream_more_button.mobile.haml15
-rw-r--r--app/views/simple_captcha/_simple_captcha.haml5
-rw-r--r--app/views/statistics/_statistic.haml5
-rw-r--r--app/views/statistics/_statistics.haml23
-rw-r--r--app/views/statistics/statistics.html.haml1
-rw-r--r--app/views/statistics/statistics.mobile.haml1
-rw-r--r--app/views/status_messages/bookmarklet.html.haml6
-rw-r--r--app/views/status_messages/bookmarklet.mobile.haml2
-rw-r--r--app/views/status_messages/new.html.haml25
-rw-r--r--app/views/streams/main_stream.html.haml100
-rw-r--r--app/views/streams/main_stream.mobile.haml6
-rw-r--r--app/views/tags/show.haml47
-rw-r--r--app/views/tags/show.mobile.haml6
-rw-r--r--app/views/users/edit.html.haml74
-rw-r--r--app/views/users/edit.mobile.haml24
-rw-r--r--app/views/users/export_email.markerb1
-rw-r--r--app/views/users/export_failure_email.markerb1
-rw-r--r--app/views/users/export_photos_email.markerb1
-rw-r--r--app/views/users/export_photos_failure_email.markerb1
-rw-r--r--app/views/users/getting_started.haml7
-rw-r--r--app/views/users/privacy_settings.html.haml25
-rw-r--r--app/workers/base.rb4
-rw-r--r--app/workers/deferred_dispatch.rb3
-rw-r--r--app/workers/export_photos.rb21
-rw-r--r--app/workers/export_user.rb21
-rw-r--r--app/workers/gather_o_embed_data.rb2
-rw-r--r--app/workers/gather_open_graph_data.rb2
-rw-r--r--app/workers/mail/also_commented.rb2
-rw-r--r--app/workers/mail/comment_on_post.rb2
-rw-r--r--app/workers/mail/confirm_email.rb2
-rw-r--r--app/workers/mail/liked.rb2
-rw-r--r--app/workers/mail/mentioned.rb2
-rw-r--r--app/workers/mail/private_message.rb2
-rw-r--r--app/workers/mail/report_worker.rb2
-rw-r--r--app/workers/mail/reshared.rb2
-rw-r--r--app/workers/mail/started_sharing.rb2
-rw-r--r--app/workers/process_photo.rb1
-rw-r--r--app/workers/queue_users_for_removal.rb41
-rw-r--r--app/workers/receive_local_batch.rb1
-rw-r--r--app/workers/remove_old_user.rb27
-rwxr-xr-xbin/bundle3
-rwxr-xr-xbin/cucumber7
-rwxr-xr-xbin/guard16
-rwxr-xr-xbin/rails8
-rwxr-xr-xbin/rake8
-rwxr-xr-xbin/rspec7
-rwxr-xr-xbin/spring18
-rw-r--r--browserlist2
-rw-r--r--config/.jshint.json68
-rw-r--r--config/.jshint_ignore4
-rw-r--r--config/application.rb52
-rw-r--r--config/boot.rb2
-rw-r--r--config/database.yml.example6
-rw-r--r--config/defaults.yml52
-rw-r--r--config/diaspora.yml.example445
-rw-r--r--config/environments/development.rb13
-rw-r--r--config/environments/integration.rb2
-rw-r--r--config/environments/production.rb27
-rw-r--r--config/environments/test.rb13
-rw-r--r--config/initializers/assets.rb2
-rw-r--r--config/initializers/faraday.rb14
-rw-r--r--config/initializers/filter_parameter_logging.rb4
-rw-r--r--config/initializers/json_escape.rb2
-rw-r--r--config/initializers/load_libraries.rb2
-rw-r--r--config/initializers/mailer_config.rb9
-rw-r--r--config/initializers/maintenance.rb16
-rw-r--r--config/initializers/oembed.rb2
-rw-r--r--config/initializers/open_graph_reader.rb6
-rw-r--r--config/initializers/rails_admin.rb35
-rw-r--r--config/initializers/session_store.rb11
-rw-r--r--config/initializers/setup_simple_captcha.rb5
-rw-r--r--config/initializers/sidekiq.rb22
-rw-r--r--config/initializers/strong_parameters.rb2
-rw-r--r--config/initializers/wrap_parameters.rb14
-rw-r--r--config/load_config.rb17
-rw-r--r--config/locale_settings.yml8
-rw-r--r--config/locales/cldr/plurals.rb113
-rw-r--r--config/locales/devise/devise.cs.yml4
-rw-r--r--config/locales/devise/devise.da.yml10
-rw-r--r--config/locales/devise/devise.de_formal.yml8
-rw-r--r--config/locales/devise/devise.el.yml5
-rw-r--r--config/locales/devise/devise.en_valspeak.yml93
-rw-r--r--config/locales/devise/devise.fr.yml6
-rw-r--r--config/locales/devise/devise.hy.yml9
-rw-r--r--config/locales/devise/devise.ia.yml17
-rw-r--r--config/locales/devise/devise.it.yml4
-rw-r--r--config/locales/devise/devise.ms.yml6
-rw-r--r--config/locales/devise/devise.nds.yml67
-rw-r--r--config/locales/devise/devise.sk.yml2
-rw-r--r--config/locales/devise/devise.sv.yml2
-rw-r--r--config/locales/devise/devise.zh-TW.yml8
-rw-r--r--config/locales/diaspora/ar.yml167
-rw-r--r--config/locales/diaspora/art-nvi.yml6
-rw-r--r--config/locales/diaspora/ast.yml28
-rw-r--r--config/locales/diaspora/az.yml153
-rw-r--r--config/locales/diaspora/be.yml24
-rw-r--r--config/locales/diaspora/bg.yml49
-rw-r--r--config/locales/diaspora/br.yml263
-rw-r--r--config/locales/diaspora/bs.yml56
-rw-r--r--config/locales/diaspora/cs.yml350
-rw-r--r--config/locales/diaspora/cy.yml31
-rw-r--r--config/locales/diaspora/da.yml593
-rw-r--r--config/locales/diaspora/de.yml276
-rw-r--r--config/locales/diaspora/de_formal.yml309
-rw-r--r--config/locales/diaspora/el.yml645
-rw-r--r--config/locales/diaspora/en.yml839
-rw-r--r--config/locales/diaspora/en_1337.yml47
-rw-r--r--config/locales/diaspora/en_pirate.yml405
-rw-r--r--config/locales/diaspora/en_shaw.yml46
-rw-r--r--config/locales/diaspora/en_valspeak.yml1236
-rw-r--r--config/locales/diaspora/eo.yml54
-rw-r--r--config/locales/diaspora/es-AR.yml465
-rw-r--r--config/locales/diaspora/es-BO.yml21
-rw-r--r--config/locales/diaspora/es-CL.yml57
-rw-r--r--config/locales/diaspora/es-CO.yml37
-rw-r--r--config/locales/diaspora/es-MX.yml59
-rw-r--r--config/locales/diaspora/es.yml405
-rw-r--r--config/locales/diaspora/eu.yml57
-rw-r--r--config/locales/diaspora/fa.yml22
-rw-r--r--config/locales/diaspora/fi.yml504
-rw-r--r--config/locales/diaspora/fil.yml18
-rw-r--r--config/locales/diaspora/fr.yml579
-rw-r--r--config/locales/diaspora/fy.yml11
-rw-r--r--config/locales/diaspora/ga.yml14
-rw-r--r--config/locales/diaspora/gd.yml300
-rw-r--r--config/locales/diaspora/gl.yml53
-rw-r--r--config/locales/diaspora/he.yml60
-rw-r--r--config/locales/diaspora/hi.yml2
-rw-r--r--config/locales/diaspora/hu.yml106
-rw-r--r--config/locales/diaspora/hy.yml734
-rw-r--r--config/locales/diaspora/ia.yml451
-rw-r--r--config/locales/diaspora/id.yml46
-rw-r--r--config/locales/diaspora/io.yml14
-rw-r--r--config/locales/diaspora/is.yml49
-rw-r--r--config/locales/diaspora/it.yml196
-rw-r--r--config/locales/diaspora/ja.yml61
-rw-r--r--config/locales/diaspora/ka.yml45
-rw-r--r--config/locales/diaspora/kk.yml56
-rw-r--r--config/locales/diaspora/kn.yml4
-rw-r--r--config/locales/diaspora/ko.yml55
-rw-r--r--config/locales/diaspora/lt.yml45
-rw-r--r--config/locales/diaspora/lv.yml175
-rw-r--r--config/locales/diaspora/mk.yml37
-rw-r--r--config/locales/diaspora/ml.yml57
-rw-r--r--config/locales/diaspora/ms.yml116
-rw-r--r--config/locales/diaspora/nb.yml59
-rw-r--r--config/locales/diaspora/nds.yml997
-rw-r--r--config/locales/diaspora/ne.yml2
-rw-r--r--config/locales/diaspora/nl.yml643
-rw-r--r--config/locales/diaspora/nn.yml57
-rw-r--r--config/locales/diaspora/pa.yml18
-rw-r--r--config/locales/diaspora/pl.yml218
-rw-r--r--config/locales/diaspora/pt-BR.yml232
-rw-r--r--config/locales/diaspora/pt-PT.yml156
-rw-r--r--config/locales/diaspora/ro.yml73
-rw-r--r--config/locales/diaspora/ru.yml332
-rw-r--r--config/locales/diaspora/sc.yml110
-rw-r--r--config/locales/diaspora/si.yml22
-rw-r--r--config/locales/diaspora/sk.yml134
-rw-r--r--config/locales/diaspora/sl.yml69
-rw-r--r--config/locales/diaspora/sr.yml332
-rw-r--r--config/locales/diaspora/sv.yml528
-rw-r--r--config/locales/diaspora/ta.yml11
-rw-r--r--config/locales/diaspora/te.yml54
-rw-r--r--config/locales/diaspora/tr.yml104
-rw-r--r--config/locales/diaspora/uk.yml227
-rw-r--r--config/locales/diaspora/ur-PK.yml30
-rw-r--r--config/locales/diaspora/vi.yml72
-rw-r--r--config/locales/diaspora/wo.yml7
-rw-r--r--config/locales/diaspora/zh-CN.yml55
-rw-r--r--config/locales/diaspora/zh-TW.yml436
-rw-r--r--config/locales/javascript/javascript.ar.yml11
-rw-r--r--config/locales/javascript/javascript.cs.yml74
-rw-r--r--config/locales/javascript/javascript.da.yml61
-rw-r--r--config/locales/javascript/javascript.de.yml49
-rw-r--r--config/locales/javascript/javascript.de_formal.yml50
-rw-r--r--config/locales/javascript/javascript.el.yml26
-rw-r--r--config/locales/javascript/javascript.en.yml88
-rw-r--r--config/locales/javascript/javascript.en_valspeak.yml207
-rw-r--r--config/locales/javascript/javascript.es-AR.yml55
-rw-r--r--config/locales/javascript/javascript.es.yml43
-rw-r--r--config/locales/javascript/javascript.fi.yml56
-rw-r--r--config/locales/javascript/javascript.fr.yml56
-rw-r--r--config/locales/javascript/javascript.gd.yml15
-rw-r--r--config/locales/javascript/javascript.gl.yml35
-rw-r--r--config/locales/javascript/javascript.hu.yml22
-rw-r--r--config/locales/javascript/javascript.hy.yml105
-rw-r--r--config/locales/javascript/javascript.ia.yml71
-rw-r--r--config/locales/javascript/javascript.is.yml2
-rw-r--r--config/locales/javascript/javascript.kk.yml17
-rw-r--r--config/locales/javascript/javascript.ms.yml90
-rw-r--r--config/locales/javascript/javascript.nds.yml141
-rw-r--r--config/locales/javascript/javascript.nl.yml67
-rw-r--r--config/locales/javascript/javascript.pl.yml36
-rw-r--r--config/locales/javascript/javascript.pt-BR.yml62
-rw-r--r--config/locales/javascript/javascript.ro.yml2
-rw-r--r--config/locales/javascript/javascript.ru.yml44
-rw-r--r--config/locales/javascript/javascript.sk.yml2
-rw-r--r--config/locales/javascript/javascript.sv.yml41
-rw-r--r--config/locales/javascript/javascript.uk.yml44
-rw-r--r--config/locales/javascript/javascript.zh-TW.yml68
-rw-r--r--config/oembed_providers.yml6
-rw-r--r--config/routes.rb48
-rw-r--r--config/sidekiq.yml19
-rw-r--r--config/unicorn.rb4
-rw-r--r--config/vines/README7
-rw-r--r--db/migrate/0000_create_schema.rb663
-rw-r--r--db/migrate/20110105051803_create_import_tables.rb199
-rw-r--r--db/migrate/20110119060243_add_index_to_post_visibilities.rb9
-rw-r--r--db/migrate/20110119221746_add_indicies.rb29
-rw-r--r--db/migrate/20110120181553_create_statistics.rb15
-rw-r--r--db/migrate/20110120182100_create_data_points.rb17
-rw-r--r--db/migrate/20110123210746_alter_string_columns.rb37
-rw-r--r--db/migrate/20110125190034_unique_index_on_profile.rb37
-rw-r--r--db/migrate/20110126015407_add_invitation_service_and_invitation_identifier_to_user.rb13
-rw-r--r--db/migrate/20110126200714_add_contacts_visible.rb17
-rw-r--r--db/migrate/20110126225202_remove_unique_index_on_email_on_users.rb11
-rw-r--r--db/migrate/20110126232040_add_unique_index_on_invitation_service_and_invitation_identifier_to_users.rb11
-rw-r--r--db/migrate/20110127000931_drop_extra_columns.rb10
-rw-r--r--db/migrate/20110127000953_make_fields_not_null.rb39
-rw-r--r--db/migrate/20110130072907_notification_multiple_people.rb70
-rw-r--r--db/migrate/20110202015222_add_open_to_aspects.rb9
-rw-r--r--db/migrate/20110209204702_create_mentions.rb15
-rw-r--r--db/migrate/20110211021926_fix_target_on_notification.rb29
-rw-r--r--db/migrate/20110211204804_unique_index_post_visibilities.rb39
-rw-r--r--db/migrate/20110213052742_add_more_indicies.rb19
-rw-r--r--db/migrate/20110217044519_undo_adding_indicies.rb10
-rw-r--r--db/migrate/20110225190919_create_conversations_and_messages_and_visibilities.rb39
-rw-r--r--db/migrate/20110228180709_notification_subclasses.rb31
-rw-r--r--db/migrate/20110228201109_foreign_key_constraints.rb63
-rw-r--r--db/migrate/20110228220810_rename_post_to_parent_and_creator_to_author.rb11
-rw-r--r--db/migrate/20110228233419_add_signatures_to_message.rb11
-rw-r--r--db/migrate/20110301014507_rename_person_to_author.rb19
-rw-r--r--db/migrate/20110301202619_drop_statistics.rb9
-rw-r--r--db/migrate/20110311000150_acts_as_taggable_on_migration.rb28
-rw-r--r--db/migrate/20110311183826_create_user_preferences.rb14
-rw-r--r--db/migrate/20110311220249_downcase_tags.rb26
-rw-r--r--db/migrate/20110313015438_rename_text_fields.rb12
-rw-r--r--db/migrate/20110314043119_drop_import_tables.rb10
-rw-r--r--db/migrate/20110317222802_guid_is_unique.rb36
-rw-r--r--db/migrate/20110318000734_create_service_users.rb23
-rw-r--r--db/migrate/20110318012008_delete_disconnected_notifications.rb11
-rw-r--r--db/migrate/20110319005509_add_processed_to_post.rb9
-rw-r--r--db/migrate/20110319172136_add_likes.rb26
-rw-r--r--db/migrate/20110321205715_unprocessed_image_uploader.rb14
-rw-r--r--db/migrate/20110323213655_add_location_to_profile.rb9
-rw-r--r--db/migrate/20110328175936_add_hidden_to_post_visibilities.rb11
-rw-r--r--db/migrate/20110328202414_post_visibilities_on_contacts.rb97
-rw-r--r--db/migrate/20110330175950_tag_uniqueness.rb24
-rw-r--r--db/migrate/20110330230206_pm_foreign_keys.rb53
-rw-r--r--db/migrate/20110331004720_add_hidden_indicies.rb12
-rw-r--r--db/migrate/20110405170101_fix_stream_queries.rb11
-rw-r--r--db/migrate/20110405171412_contact_remove_pending_add_sharing_and_receiving.rb61
-rw-r--r--db/migrate/20110406202932_drop_requests_table.rb40
-rw-r--r--db/migrate/20110406203720_tag_name_uniqueness.rb45
-rw-r--r--db/migrate/20110421120744_downcase_usernames.rb15
-rw-r--r--db/migrate/20110507212759_remove_type_null_notifications.rb13
-rw-r--r--db/migrate/20110513175000_eliminate_stray_user_records.rb32
-rw-r--r--db/migrate/20110514182918_update_devise_invitable.rb13
-rw-r--r--db/migrate/20110517180148_delete_all_new_request_notifications.rb14
-rw-r--r--db/migrate/20110518010050_disable_password_reset_for_accounts_without_usernames.rb16
-rw-r--r--db/migrate/20110518184453_add_token_auth_to_user.rb11
-rw-r--r--db/migrate/20110518222303_add_column_for_activity_streams_photo.rb21
-rw-r--r--db/migrate/20110524184202_add_object_id_to_post.rb11
-rw-r--r--db/migrate/20110525213325_add_root_id_to_posts.rb9
-rw-r--r--db/migrate/20110527135552_photo_status_message_association_on_guid.rb46
-rw-r--r--db/migrate/20110601083310_add_unconfirmed_email_to_users.rb9
-rw-r--r--db/migrate/20110601091059_add_confirm_email_token_to_users.rb9
-rw-r--r--db/migrate/20110603181015_lockable_users.rb9
-rw-r--r--db/migrate/20110603212633_likes_dependent_delete.rb15
-rw-r--r--db/migrate/20110603233202_drop_aspects_open.rb10
-rw-r--r--db/migrate/20110604012703_drop_mongo_remains.rb18
-rw-r--r--db/migrate/20110604204533_index_on_remember_token.rb9
-rw-r--r--db/migrate/20110606192307_drop_mongo_ids.rb29
-rw-r--r--db/migrate/20110623210918_add_o_auth2_support.rb65
-rw-r--r--db/migrate/20110701215925_create_tag_followings.rb14
-rw-r--r--db/migrate/20110705003445_counter_cache_on_post_likes.rb14
-rw-r--r--db/migrate/20110707221112_index_taggings_created_at.rb8
-rw-r--r--db/migrate/20110707234802_likes_on_comments.rb39
-rw-r--r--db/migrate/20110710102747_add_order_id_to_aspects.rb9
-rw-r--r--db/migrate/20110729045734_add_full_name_to_profile.rb29
-rw-r--r--db/migrate/20110730173137_create_pods.rb14
-rw-r--r--db/migrate/20110730173443_create_pod_stats.rb16
-rw-r--r--db/migrate/20110812175614_add_username_to_service_users.rb9
-rw-r--r--db/migrate/20110815210933_remove_invite_counter_from_user.rb9
-rw-r--r--db/migrate/20110816061820_add_fields_to_invitations.rb17
-rw-r--r--db/migrate/20110818212541_add_identifier_to_existing_invitations.rb20
-rw-r--r--db/migrate/20110830170929_remove_pod_stats_table.rb16
-rw-r--r--db/migrate/20110907205720_add_indexes_to_serivces.rb11
-rw-r--r--db/migrate/20110911213207_counter_cache_on_post_comments.rb15
-rw-r--r--db/migrate/20110924112840_create_o_embed_caches.rb14
-rw-r--r--db/migrate/20110926120220_fix_indexes_to_serivces.rb14
-rw-r--r--db/migrate/20110930182048_add_root_guid_index_to_posts.rb9
-rw-r--r--db/migrate/20111002013921_fix_data_type_for_activity_streams_object_id.rb11
-rw-r--r--db/migrate/20111003232053_add_index_for_reshares.rb9
-rw-r--r--db/migrate/20111011193702_add_oembed_cache_to_posts.rb9
-rw-r--r--db/migrate/20111011194702_comment_anything.rb18
-rw-r--r--db/migrate/20111011195702_share_anything.rb114
-rw-r--r--db/migrate/20111012215141_move_photos_to_their_own_table.rb161
-rw-r--r--db/migrate/20111016145626_add_language_to_invitations.rb9
-rw-r--r--db/migrate/20111018010003_add_back_indexes.rb15
-rw-r--r--db/migrate/20111019013244_postgresql_photos_id_seq_init.rb11
-rw-r--r--db/migrate/20111021184041_add_community_spotlight_in_stream.rb14
-rw-r--r--db/migrate/20111023230730_fix_photo_share_visibilities.rb40
-rw-r--r--db/migrate/20111026173547_add_missing_tag_followings_indices.rb34
-rw-r--r--db/migrate/20111101202137_create_blocks.rb12
-rw-r--r--db/migrate/20111103184050_add_closed_account_flag_to_person.rb9
-rw-r--r--db/migrate/20111109023618_create_account_deletions.rb12
-rw-r--r--db/migrate/20111111025358_counter_cache_on_post_reshares.rb35
-rw-r--r--db/migrate/20111114173111_add_auto_follow_back_to_users.rb11
-rw-r--r--db/migrate/20111207230506_add_oauth_redirect_uri_to_oauth_clients.rb9
-rw-r--r--db/migrate/20111207233503_remove_low_length_limits_from_oauth_tables.rb19
-rw-r--r--db/migrate/20111211213438_create_invitation_codes.rb15
-rw-r--r--db/migrate/20111217042006_add_photo_counter_cache_to_post.rb15
-rw-r--r--db/migrate/20120107220942_move_recently_hidden_posts_to_user.rb28
-rw-r--r--db/migrate/20120114191018_remove_photos_count_from_post.rb13
-rw-r--r--db/migrate/20120127235102_add_nsfw_to_profiles.rb9
-rw-r--r--db/migrate/20120202190701_remove_public_share_visibilities.rb59
-rw-r--r--db/migrate/20120203220932_add_interacted_at_to_posts.rb9
-rw-r--r--db/migrate/20120208231253_create_participations.rb17
-rw-r--r--db/migrate/20120301143226_remove_youtube_titles.rb11
-rw-r--r--db/migrate/20120322223517_add_template_name_to_posts.rb5
-rw-r--r--db/migrate/20120328025842_remove_invitation_email_from_users.rb17
-rw-r--r--db/migrate/20120330103021_indexes_on_participation.rb6
-rw-r--r--db/migrate/20120330144057_indexes_on_posts.rb5
-rw-r--r--db/migrate/20120405170105_create_locations.rb12
-rw-r--r--db/migrate/20120414005431_create_rails_admin_histories_table.rb18
-rw-r--r--db/migrate/20120420185823_add_width_and_height_to_photos.rb6
-rw-r--r--db/migrate/20120422072257_add_favorite_to_post.rb5
-rw-r--r--db/migrate/20120427152648_create_roles.rb10
-rw-r--r--db/migrate/20120506053156_add_wallpaper_to_profile.rb5
-rw-r--r--db/migrate/20120510184853_drop_service_users.rb24
-rw-r--r--db/migrate/20120517014034_remove_oauth.rb57
-rw-r--r--db/migrate/20120519015723_remove_multi_photo_frame_reference.rb8
-rw-r--r--db/migrate/20120521191429_remove_rich_media_type.rb8
-rw-r--r--db/migrate/20120803143552_add_fetch_status_to_people.rb5
-rw-r--r--db/migrate/20120906162503_update_devise.rb11
-rw-r--r--db/migrate/20120909053122_remove_wallpaper_from_profile.rb9
-rw-r--r--db/migrate/20130429073928_add_tweet_id_to_post.rb2
-rw-r--r--db/migrate/20130613203350_remove_limit_from_root_guid_in_posts.rb4
-rw-r--r--db/migrate/20140801101230_create_chat_contacts.rb17
-rw-r--r--db/migrate/20140801101352_create_chat_fragments.rb17
-rw-r--r--db/migrate/20140824230505_add_completed_at_to_account_deletions.rb5
-rw-r--r--db/migrate/20140826165533_increase_simple_captcha_limit.rb8
-rw-r--r--db/migrate/20140906192846_fix_open_graph_data.rb10
-rw-r--r--db/migrate/20141001162851_add_remove_after_to_users.rb5
-rw-r--r--db/migrate/20141007003922_add_chat_enabled_to_aspects.rb9
-rw-r--r--db/migrate/20141024170120_create_chat_offline_messages.rb14
-rw-r--r--db/migrate/20141209041241_drop_open_graph_caches_with_invalid_urls.rb9
-rw-r--r--db/migrate/20141216213423_purge_orphan_conversations.rb13
-rw-r--r--db/migrate/20141227120907_add_export_to_user.rb7
-rw-r--r--db/migrate/20141230214830_user_pref_strip_exif.rb9
-rw-r--r--db/migrate/20150106050733_set_mysql_to_unicode_mb4.rb113
-rw-r--r--db/migrate/20150209230946_disable_mail_for_closed_account.rb9
-rw-r--r--db/migrate/20150220001357_add_photos_export_to_user.rb13
-rw-r--r--db/schema.rb1034
-rw-r--r--features/desktop/accepts_invitation.feature10
-rw-r--r--features/desktop/activity_stream.feature23
-rw-r--r--features/desktop/aspect_navigation.feature9
-rw-r--r--features/desktop/blocks_user.feature8
-rw-r--r--features/desktop/change_email.feature8
-rw-r--r--features/desktop/change_password.feature33
-rw-r--r--features/desktop/closes_account.feature18
-rw-r--r--features/desktop/connects_users.feature58
-rw-r--r--features/desktop/contacts.feature19
-rw-r--r--features/desktop/conversations.feature6
-rw-r--r--features/desktop/donations.feature4
-rw-r--r--features/desktop/edits_profile.feature7
-rw-r--r--features/desktop/follows_tags.feature2
-rw-r--r--features/desktop/invitations.feature3
-rw-r--r--features/desktop/keyboard_navigation.feature12
-rw-r--r--features/desktop/likes.feature35
-rw-r--r--features/desktop/logged_out_browsing.feature2
-rw-r--r--features/desktop/manages_aspects.feature43
-rw-r--r--features/desktop/mentions.feature7
-rw-r--r--features/desktop/mentions_from_profile_page.feature23
-rw-r--r--features/desktop/not_safe_for_work.feature9
-rw-r--r--features/desktop/notifications.feature23
-rw-r--r--features/desktop/oembed.feature33
-rw-r--r--features/desktop/photo_lightbox.feature10
-rw-r--r--features/desktop/post_preview.feature9
-rw-r--r--features/desktop/post_with_a_poll.feature39
-rw-r--r--features/desktop/posts_from_main_page.feature44
-rw-r--r--features/desktop/posts_from_profile_page.feature27
-rw-r--r--features/desktop/posts_from_tag_page.feature22
-rw-r--r--features/desktop/profile_photos.feature26
-rw-r--r--features/desktop/reshare.feature23
-rw-r--r--features/desktop/search.feature33
-rw-r--r--features/desktop/show_more.feature6
-rw-r--r--features/desktop/signs_up.feature34
-rw-r--r--features/desktop/single_post_view_moderation.feature62
-rw-r--r--features/desktop/stops_following_users.feature22
-rw-r--r--features/desktop/tags.feature13
-rw-r--r--features/desktop/tags_and_comments.feature21
-rw-r--r--features/mobile/activity_stream.feature18
-rw-r--r--features/mobile/conversations.feature6
-rw-r--r--features/mobile/drawer.feature87
-rw-r--r--features/mobile/edits_profile.feature3
-rw-r--r--features/mobile/getting_started.feature19
-rw-r--r--features/mobile/invitations.feature12
-rw-r--r--features/mobile/multiphoto.feature4
-rw-r--r--features/mobile/people_aspects.feature43
-rw-r--r--features/mobile/posts_from_main_page.feature19
-rw-r--r--features/mobile/reactions.feature12
-rw-r--r--features/mobile/reshare.feature10
-rw-r--r--features/mobile/signs_up.feature34
-rw-r--r--features/step_definitions/aspects_steps.rb50
-rw-r--r--features/step_definitions/conversations_steps.rb17
-rw-r--r--features/step_definitions/custom_web_steps.rb51
-rw-r--r--features/step_definitions/hovercard_steps.rb4
-rw-r--r--features/step_definitions/mention_steps.rb9
-rw-r--r--features/step_definitions/mobile_steps.rb28
-rw-r--r--features/step_definitions/modal_steps.rb3
-rw-r--r--features/step_definitions/post_with_poll_steps.rb12
-rw-r--r--features/step_definitions/posts_steps.rb18
-rw-r--r--features/step_definitions/profile_steps.rb3
-rw-r--r--features/step_definitions/search_steps.rb9
-rw-r--r--features/step_definitions/session_steps.rb7
-rw-r--r--features/step_definitions/single_post_view_steps.rb20
-rw-r--r--features/step_definitions/stream_steps.rb4
-rw-r--r--features/step_definitions/tag_steps.rb7
-rw-r--r--features/step_definitions/user_steps.rb11
-rw-r--r--features/step_definitions/web_steps.rb4
-rw-r--r--features/support/application_cuke_helpers.rb4
-rw-r--r--features/support/database_cleaner_patches.rb24
-rw-r--r--features/support/env.rb173
-rw-r--r--features/support/integration_sessions_controller.rb2
-rw-r--r--features/support/matchers.rb36
-rw-r--r--features/support/paths.rb11
-rw-r--r--features/support/publishing_cuke_helpers.rb47
-rw-r--r--features/support/server.rb73
-rw-r--r--features/support/user_cuke_helpers.rb13
-rw-r--r--graphics/ball.svg217
-rw-r--r--[-rwxr-xr-x]graphics/camera.svg0
-rw-r--r--[-rwxr-xr-x]graphics/check_box_checked.svg0
-rw-r--r--[-rwxr-xr-x]graphics/heart.svg0
-rw-r--r--[-rwxr-xr-x]graphics/pencil.svg0
-rw-r--r--lib/account_deleter.rb8
-rw-r--r--lib/assets/javascripts/clear-form.js (renamed from app/assets/javascripts/clear-form.js)5
-rw-r--r--lib/assets/javascripts/fileuploader-custom.js2
-rw-r--r--lib/assets/javascripts/jquery.mentionsInput.js6
-rw-r--r--lib/assets/javascripts/posix-bracket-expressions.js448
-rw-r--r--lib/collect_user_photos.rb25
-rw-r--r--lib/configuration_methods.rb15
-rw-r--r--lib/csv_generator.rb248
-rw-r--r--lib/development_mail_interceptor.rb7
-rw-r--r--lib/diaspora.rb9
-rw-r--r--lib/diaspora/camo.rb35
-rw-r--r--lib/diaspora/exceptions.rb7
-rw-r--r--lib/diaspora/exporter.rb86
-rw-r--r--lib/diaspora/federated/relayable_retraction.rb4
-rw-r--r--lib/diaspora/federated/request.rb4
-rw-r--r--lib/diaspora/federated/shareable.rb8
-rw-r--r--lib/diaspora/federated/signed_retraction.rb4
-rw-r--r--lib/diaspora/fetcher.rb1
-rw-r--r--lib/diaspora/fetcher/public.rb6
-rw-r--r--lib/diaspora/fetcher/single.rb41
-rw-r--r--lib/diaspora/guid.rb2
-rw-r--r--lib/diaspora/likeable.rb8
-rw-r--r--lib/diaspora/markdownify/html.rb2
-rw-r--r--lib/diaspora/message_renderer.rb36
-rw-r--r--lib/diaspora/relayable.rb17
-rw-r--r--lib/diaspora/shareable.rb4
-rw-r--r--lib/diaspora/taggable.rb29
-rw-r--r--lib/email_inviter.rb2
-rw-r--r--lib/evil_query.rb2
-rw-r--r--lib/federated/relayable.rb6
-rw-r--r--lib/hydra_wrapper.rb2
-rw-r--r--lib/i18n_interpolation_fallbacks.rb8
-rw-r--r--lib/postzord/receiver/private.rb22
-rw-r--r--lib/postzord/receiver/public.rb21
-rw-r--r--lib/rack/chrome_frame.rb2
-rw-r--r--lib/stream/base.rb4
-rw-r--r--lib/stream/tag.rb6
-rw-r--r--lib/tasks/accounts.rake4
-rw-r--r--lib/tasks/assets.rake59
-rw-r--r--lib/tasks/generate_session_secret.rake13
-rw-r--r--lib/tasks/linter.rake12
-rw-r--r--lib/tasks/maintenance.rake9
-rw-r--r--lib/tasks/migrations.rake2
-rw-r--r--lib/tasks/tests.rake14
-rw-r--r--lib/webfinger.rb4
-rw-r--r--public/404.css52
-rw-r--r--public/404.html14
-rw-r--r--public/422.html26
-rw-r--r--public/500.html47
-rw-r--r--public/Roboto-BoldCondensed.ttfbin161308 -> 0 bytes
-rw-r--r--public/Roboto-Regular.ttfbin158604 -> 0 bytes
-rw-r--r--public/apple-touch-icon.pngbin6618 -> 0 bytes
-rw-r--r--public/bgpattern.pngbin4064 -> 0 bytes
-rw-r--r--public/crossdomain.xml3
-rw-r--r--public/default.html158
-rw-r--r--public/icon_128.gifbin6388 -> 0 bytes
-rwxr-xr-xscript/get_config.rb3
-rw-r--r--script/install/setup2
-rwxr-xr-xscript/server33
-rw-r--r--spec/controllers/admin/users_controller_spec.rb23
-rw-r--r--spec/controllers/admins_controller_spec.rb32
-rw-r--r--spec/controllers/application_controller_spec.rb35
-rw-r--r--spec/controllers/aspect_memberships_controller_spec.rb36
-rw-r--r--spec/controllers/aspects_controller_spec.rb99
-rw-r--r--spec/controllers/blocks_controller_spec.rb18
-rw-r--r--spec/controllers/comments_controller_spec.rb54
-rw-r--r--spec/controllers/contacts_controller_spec.rb49
-rw-r--r--spec/controllers/conversation_visibilities_controller_spec.rb25
-rw-r--r--spec/controllers/conversations_controller_spec.rb156
-rw-r--r--spec/controllers/home_controller_spec.rb10
-rw-r--r--spec/controllers/invitations_controller_spec.rb62
-rw-r--r--spec/controllers/jasmine_fixtures/aspects_spec.rb17
-rw-r--r--spec/controllers/jasmine_fixtures/contacts_spec.rb17
-rw-r--r--spec/controllers/jasmine_fixtures/conversations_spec.rb34
-rw-r--r--spec/controllers/jasmine_fixtures/notifications_spec.rb2
-rw-r--r--spec/controllers/jasmine_fixtures/people_spec.rb13
-rw-r--r--spec/controllers/jasmine_fixtures/photos_spec.rb20
-rw-r--r--spec/controllers/jasmine_fixtures/status_messages_spec.rb17
-rw-r--r--spec/controllers/jasmine_fixtures/streams_spec.rb4
-rw-r--r--spec/controllers/likes_controller_spec.rb45
-rw-r--r--spec/controllers/messages_controller_spec.rb30
-rw-r--r--spec/controllers/notifications_controller_spec.rb122
-rw-r--r--spec/controllers/participations_controller_spec.rb79
-rw-r--r--spec/controllers/passwords_controller_spec.rb12
-rw-r--r--spec/controllers/people_controller_spec.rb339
-rw-r--r--spec/controllers/photos_controller_spec.rb93
-rw-r--r--spec/controllers/posts_controller_spec.rb59
-rw-r--r--spec/controllers/profiles_controller_spec.rb48
-rw-r--r--spec/controllers/publics_controller_spec.rb48
-rw-r--r--spec/controllers/registrations_controller_spec.rb46
-rw-r--r--spec/controllers/report_controller_spec.rb46
-rw-r--r--spec/controllers/reshares_controller_spec.rb29
-rw-r--r--spec/controllers/search_controller_spec.rb21
-rw-r--r--spec/controllers/services_controller_spec.rb49
-rw-r--r--spec/controllers/sessions_controller_spec.rb14
-rw-r--r--spec/controllers/share_visibilities_controller_spec.rb8
-rw-r--r--spec/controllers/statistics_controller_spec.rb33
-rw-r--r--spec/controllers/status_messages_controller_spec.rb73
-rw-r--r--spec/controllers/streams_controller_spec.rb14
-rw-r--r--spec/controllers/tags_controller_spec.rb90
-rw-r--r--spec/controllers/users_controller_spec.rb160
-rw-r--r--spec/factories.rb5
-rw-r--r--spec/fixtures/exif.jpgbin0 -> 117835 bytes
-rw-r--r--spec/helpers/application_helper_spec.rb45
-rw-r--r--spec/helpers/conversations_helper_spec.rb34
-rw-r--r--spec/helpers/getting_started_helper_spec.rb6
-rw-r--r--spec/helpers/interim_stream_hackiness_helper_spec.rb16
-rw-r--r--spec/helpers/invitation_codes_helper_spec.rb4
-rw-r--r--spec/helpers/jsxc_helper_spec.rb21
-rw-r--r--spec/helpers/layout_helper_spec.rb6
-rw-r--r--spec/helpers/mobile_helper_spec.rb4
-rw-r--r--spec/helpers/notifications_helper_spec.rb49
-rw-r--r--spec/helpers/notifier_helper_spec.rb48
-rw-r--r--spec/helpers/o_embed_helper_spec.rb14
-rw-r--r--spec/helpers/open_graph_helper_spec.rb25
-rw-r--r--spec/helpers/people_helper_spec.rb54
-rw-r--r--spec/helpers/posts_helper_spec.rb8
-rw-r--r--spec/helpers/report_helper_spec.rb17
-rw-r--r--spec/helpers/stream_helper_spec.rb28
-rw-r--r--spec/helpers/tags_helper_spec.rb14
-rw-r--r--spec/integration/account_deletion_spec.rb32
-rw-r--r--spec/integration/attack_vectors_spec.rb8
-rw-r--r--spec/integration/contact_deleting_spec.rb6
-rw-r--r--spec/integration/dispatching_spec.rb6
-rw-r--r--spec/integration/mentioning_spec.rb22
-rw-r--r--spec/integration/receiving_spec.rb85
-rw-r--r--spec/integration/tag_people_spec.rb12
-rw-r--r--spec/javascripts/alert-spec.js30
-rw-r--r--spec/javascripts/app/app_spec.js2
-rw-r--r--spec/javascripts/app/collections/aspects_spec.js28
-rw-r--r--spec/javascripts/app/collections/comments_collection_spec.js13
-rw-r--r--spec/javascripts/app/collections/contacts_collection_spec.js37
-rw-r--r--spec/javascripts/app/collections/likes_collections_spec.js13
-rw-r--r--spec/javascripts/app/collections/tag_following_collection_spec.js22
-rw-r--r--spec/javascripts/app/helpers/date_formatter_spec.js19
-rw-r--r--spec/javascripts/app/helpers/direction_detector_spec.js34
-rw-r--r--spec/javascripts/app/helpers/text_formatter_spec.js337
-rw-r--r--spec/javascripts/app/helpers/timeago_spec.js20
-rw-r--r--spec/javascripts/app/helpers/truncate_spec.js9
-rw-r--r--spec/javascripts/app/models/contact_spec.js20
-rw-r--r--spec/javascripts/app/models/person_spec.js69
-rw-r--r--spec/javascripts/app/models/photo_spec.js2
-rw-r--r--spec/javascripts/app/models/post/interacations_spec.js92
-rw-r--r--spec/javascripts/app/models/post_spec.js54
-rw-r--r--spec/javascripts/app/models/reshare_spec.js14
-rw-r--r--spec/javascripts/app/models/status_message_spec.js14
-rw-r--r--spec/javascripts/app/models/stream_aspects_spec.js2
-rw-r--r--spec/javascripts/app/models/stream_spec.js80
-rw-r--r--spec/javascripts/app/models/user_spec.js11
-rw-r--r--spec/javascripts/app/pages/contacts_spec.js101
-rw-r--r--spec/javascripts/app/pages/profile_spec.js24
-rw-r--r--spec/javascripts/app/router_spec.js57
-rw-r--r--spec/javascripts/app/views/aspect_membership_blueprint_view_spec.js118
-rw-r--r--spec/javascripts/app/views/aspect_membership_view_spec.js78
-rw-r--r--spec/javascripts/app/views/aspect_view_spec.js9
-rw-r--r--spec/javascripts/app/views/aspects_dropdown_view_spec.js11
-rw-r--r--spec/javascripts/app/views/aspects_list_view_spec.js9
-rw-r--r--spec/javascripts/app/views/bookmarklet_view_spec.js4
-rw-r--r--spec/javascripts/app/views/comment_stream_view_spec.js49
-rw-r--r--spec/javascripts/app/views/comment_view_spec.js84
-rw-r--r--spec/javascripts/app/views/contact_stream_view_spec.js77
-rw-r--r--spec/javascripts/app/views/contact_view_spec.js136
-rw-r--r--spec/javascripts/app/views/content_view_spec.js10
-rw-r--r--spec/javascripts/app/views/conversations_view_spec.js54
-rw-r--r--spec/javascripts/app/views/feedback_view_spec.js119
-rw-r--r--spec/javascripts/app/views/header_view_spec.js63
-rw-r--r--spec/javascripts/app/views/help_view_spec.js85
-rw-r--r--spec/javascripts/app/views/likes_info_view_spec.js37
-rw-r--r--spec/javascripts/app/views/location_view_spec.js2
-rw-r--r--spec/javascripts/app/views/notification_dropdown_view_spec.js107
-rw-r--r--spec/javascripts/app/views/notifications_view_spec.js46
-rw-r--r--spec/javascripts/app/views/oembed_view_spec.js14
-rw-r--r--spec/javascripts/app/views/open_graph_view_spec.js2
-rw-r--r--spec/javascripts/app/views/photo_viewer_spec.js18
-rw-r--r--spec/javascripts/app/views/photos_view_spec.js40
-rw-r--r--spec/javascripts/app/views/poll_view_spec.js39
-rw-r--r--spec/javascripts/app/views/profile_header_view_spec.js33
-rw-r--r--spec/javascripts/app/views/profile_sidebar_view_spec.js36
-rw-r--r--spec/javascripts/app/views/publisher_poll_creator_view_spec.js16
-rw-r--r--spec/javascripts/app/views/publisher_view_spec.js214
-rw-r--r--spec/javascripts/app/views/search_view_spec.js14
-rw-r--r--spec/javascripts/app/views/stream/shortcuts_spec.js113
-rw-r--r--spec/javascripts/app/views/stream_faces_view_spec.js64
-rw-r--r--spec/javascripts/app/views/stream_post_spec.js92
-rw-r--r--spec/javascripts/app/views/stream_view_spec.js21
-rw-r--r--spec/javascripts/app/views/tag_following_action_view_spec.js42
-rw-r--r--spec/javascripts/app/views_spec.js78
-rw-r--r--spec/javascripts/contact-list-spec.js19
-rw-r--r--spec/javascripts/diaspora-spec.js8
-rw-r--r--spec/javascripts/helpers/SpecHelper.js119
-rw-r--r--spec/javascripts/helpers/factory.js108
-rw-r--r--spec/javascripts/helpers/jasmine-jquery.js203
-rw-r--r--spec/javascripts/helpers/mock-ajax.js207
-rw-r--r--spec/javascripts/osmlocator-spec.js21
-rw-r--r--spec/javascripts/rails-spec.js4
-rw-r--r--spec/javascripts/search-spec.js2
-rw-r--r--spec/javascripts/support/jasmine.yml4
-rw-r--r--spec/javascripts/widgets/back-to-top-spec.js6
-rw-r--r--spec/javascripts/widgets/flash-messages-spec.js2
-rw-r--r--spec/javascripts/widgets/i18n-spec.js2
-rw-r--r--spec/javascripts/widgets/lightbox-spec.js6
-rw-r--r--spec/javascripts/widgets/notifications-spec.js122
-rw-r--r--spec/javascripts/widgets/search-spec.js12
-rw-r--r--spec/lib/account_deleter_spec.rb65
-rw-r--r--spec/lib/configuration_methods_spec.rb72
-rw-r--r--spec/lib/csv_generator_spec.rb19
-rw-r--r--spec/lib/diaspora/camo_spec.rb55
-rw-r--r--spec/lib/diaspora/encryptable_spec.rb6
-rw-r--r--spec/lib/diaspora/exporter_spec.rb145
-rw-r--r--spec/lib/diaspora/federated/relayable_retraction_spec.rb49
-rw-r--r--spec/lib/diaspora/federated/request_spec.rb52
-rw-r--r--spec/lib/diaspora/federated/retraction_spec.rb12
-rw-r--r--spec/lib/diaspora/federated/signed_retraction_spec.rb18
-rw-r--r--spec/lib/diaspora/federated_base_spec.rb2
-rw-r--r--spec/lib/diaspora/fetcher/public_spec.rb74
-rw-r--r--spec/lib/diaspora/markdownify_email_spec.rb8
-rw-r--r--spec/lib/diaspora/markdownify_spec.rb2
-rw-r--r--spec/lib/diaspora/mentionable_spec.rb36
-rw-r--r--spec/lib/diaspora/message_renderer_spec.rb50
-rw-r--r--spec/lib/diaspora/parser_spec.rb8
-rw-r--r--spec/lib/direction_detector_spec.rb68
-rw-r--r--spec/lib/email_inviter_spec.rb18
-rw-r--r--spec/lib/encryptor_spec.rb4
-rw-r--r--spec/lib/evil_query_spec.rb14
-rw-r--r--spec/lib/hcard_spec.rb14
-rw-r--r--spec/lib/hydra_wrapper_spec.rb38
-rw-r--r--spec/lib/i18n_interpolation_fallbacks_spec.rb14
-rw-r--r--spec/lib/postzord/dispatcher_spec.rb98
-rw-r--r--spec/lib/postzord/receiver/local_batch_spec.rb24
-rw-r--r--spec/lib/postzord/receiver/private_spec.rb40
-rw-r--r--spec/lib/postzord/receiver/public_spec.rb30
-rw-r--r--spec/lib/postzord/receiver_spec.rb4
-rw-r--r--spec/lib/publisher_spec.rb10
-rw-r--r--spec/lib/pubsubhubbub_spec.rb2
-rw-r--r--spec/lib/rack/chrome_frame_spec.rb34
-rw-r--r--spec/lib/rake_helper_spec.rb9
-rw-r--r--spec/lib/salmon/encrypted_slap_spec.rb26
-rw-r--r--spec/lib/salmon/slap_spec.rb30
-rw-r--r--spec/lib/statistics_spec.rb37
-rw-r--r--spec/lib/stream/activity_spec.rb11
-rw-r--r--spec/lib/stream/aspect_spec.rb46
-rw-r--r--spec/lib/stream/base_spec.rb24
-rw-r--r--spec/lib/stream/followed_tag_spec.rb2
-rw-r--r--spec/lib/stream/multi_spec.rb28
-rw-r--r--spec/lib/stream/person_spec.rb4
-rw-r--r--spec/lib/stream/tag_spec.rb29
-rw-r--r--spec/lib/webfinger_profile_spec.rb8
-rw-r--r--spec/lib/webfinger_spec.rb111
-rw-r--r--spec/locale_spec.rb14
-rw-r--r--spec/mailers/export_spec.rb67
-rw-r--r--spec/mailers/maintenance_spec.rb41
-rw-r--r--spec/mailers/notifier_spec.rb148
-rw-r--r--spec/mailers/report_spec.rb8
-rw-r--r--spec/misc_spec.rb32
-rw-r--r--spec/models/account_deletion_spec.rb30
-rw-r--r--spec/models/acts_as_taggable_on_tag_spec.rb14
-rw-r--r--spec/models/aspect_membership_spec.rb8
-rw-r--r--spec/models/aspect_spec.rb22
-rw-r--r--spec/models/block_spec.rb5
-rw-r--r--spec/models/comment_spec.rb45
-rw-r--r--spec/models/contact_spec.rb60
-rw-r--r--spec/models/conversation_spec.rb74
-rw-r--r--spec/models/conversation_visibilities_spec.rb28
-rw-r--r--spec/models/invitation_code_spec.rb20
-rw-r--r--spec/models/invitation_spec.rb26
-rw-r--r--spec/models/like_spec.rb26
-rw-r--r--spec/models/location_spec.rb6
-rw-r--r--spec/models/mention_spec.rb12
-rw-r--r--spec/models/message_spec.rb28
-rw-r--r--spec/models/notification_spec.rb28
-rw-r--r--spec/models/notifications/private_message_spec.rb20
-rw-r--r--spec/models/notifications/reshared_spec.rb14
-rw-r--r--spec/models/participation_spec.rb2
-rw-r--r--spec/models/person_spec.rb152
-rw-r--r--spec/models/photo_spec.rb101
-rw-r--r--spec/models/pod_spec.rb12
-rw-r--r--spec/models/poll_answer_spec.rb10
-rw-r--r--spec/models/poll_participation_spec.rb20
-rw-r--r--spec/models/poll_spec.rb8
-rw-r--r--spec/models/post_spec.rb152
-rw-r--r--spec/models/profile_spec.rb130
-rw-r--r--spec/models/report_spec.rb24
-rw-r--r--spec/models/reshare_spec.rb132
-rw-r--r--spec/models/role_spec.rb53
-rw-r--r--spec/models/service_spec.rb4
-rw-r--r--spec/models/services/facebook_spec.rb21
-rw-r--r--spec/models/services/tumblr_spec.rb8
-rw-r--r--spec/models/services/twitter_spec.rb44
-rw-r--r--spec/models/services/wordpress_spec.rb6
-rw-r--r--spec/models/share_visibility_spec.rb24
-rw-r--r--spec/models/status_message_spec.rb183
-rw-r--r--spec/models/tag_following_spec.rb10
-rw-r--r--spec/models/user/connecting_spec.rb70
-rw-r--r--spec/models/user/posting_spec.rb31
-rw-r--r--spec/models/user/querying_spec.rb132
-rw-r--r--spec/models/user/social_actions_spec.rb46
-rw-r--r--spec/models/user_preference_spec.rb4
-rw-r--r--spec/models/user_spec.rb495
-rw-r--r--spec/presenters/aspect_membership_presenter_spec.rb15
-rw-r--r--spec/presenters/aspect_presenter_spec.rb2
-rw-r--r--spec/presenters/base_presenter_spec.rb25
-rw-r--r--spec/presenters/contact_presenter_spec.rb26
-rw-r--r--spec/presenters/o_embed_presenter_spec.rb12
-rw-r--r--spec/presenters/person_presenter_spec.rb52
-rw-r--r--spec/presenters/post_presenter_spec.rb20
-rw-r--r--spec/presenters/service_presenter_spec.rb2
-rw-r--r--spec/presenters/statistics_presenter_spec.rb49
-rw-r--r--spec/presenters/user_presenter_spec.rb14
-rw-r--r--spec/shared_behaviors/account_deletion.rb20
-rw-r--r--spec/shared_behaviors/relayable.rb42
-rw-r--r--spec/shared_behaviors/stream.rb18
-rw-r--r--spec/shared_behaviors/taggable.rb33
-rw-r--r--spec/spec_helper.rb175
-rw-r--r--spec/support/deferred_garbage_collection.rb41
-rw-r--r--spec/support/fixture_builder.rb13
-rw-r--r--spec/support/user_methods.rb8
-rw-r--r--spec/workers/deferred_dispatch_spec.rb9
-rw-r--r--spec/workers/delete_account_spec.rb4
-rw-r--r--spec/workers/delete_post_from_service_spec.rb4
-rw-r--r--spec/workers/export_photos_spec.rb26
-rw-r--r--spec/workers/export_user_spec.rb26
-rw-r--r--spec/workers/fetch_profile_photo_spec.rb32
-rw-r--r--spec/workers/gather_o_embed_data_spec.rb10
-rw-r--r--spec/workers/gather_open_graph_data_spec.rb46
-rw-r--r--spec/workers/http_multi_spec.rb27
-rw-r--r--spec/workers/mail/invite_email_spec.rb6
-rw-r--r--spec/workers/mail/mentioned_spec.rb4
-rw-r--r--spec/workers/mail/private_message_spec.rb4
-rw-r--r--spec/workers/mail/reshared_spec.rb4
-rw-r--r--spec/workers/notify_local_users_spec.rb13
-rw-r--r--spec/workers/post_to_service_spec.rb6
-rw-r--r--spec/workers/process_photo_spec.rb22
-rw-r--r--spec/workers/publish_to_hub_spec.rb4
-rw-r--r--spec/workers/queue_users_for_removal_spec.rb82
-rw-r--r--spec/workers/receive_local_batch_spec.rb14
-rw-r--r--spec/workers/receive_salmon_spec.rb6
-rw-r--r--spec/workers/receive_spec.rb6
-rw-r--r--spec/workers/remove_old_user_spec.rb52
-rw-r--r--spec/workers/resend_invitation_spec.rb4
-rw-r--r--spec/workers/reset_password_spec.rb4
-rw-r--r--vendor/assets/javascripts/handlebars-1.0.0.beta.6.js1550
-rw-r--r--vendor/assets/javascripts/jquery.hotkeys.js99
-rw-r--r--vendor/assets/javascripts/jquery.idle-timer.js246
-rw-r--r--vendor/assets/javascripts/jquery.placeholder.js104
-rw-r--r--vendor/assets/javascripts/jquery.textchange.js76
-rw-r--r--vendor/assets/javascripts/mailchimp/jquery.form.js872
-rw-r--r--vendor/assets/javascripts/mailchimp/jquery.validate.js1118
-rw-r--r--vendor/assets/javascripts/mailchimp/jquery126.min.js32
-rw-r--r--vendor/assets/javascripts/markdown.js1
-rw-r--r--vendor/assets/javascripts/markdown/Markdown.Converter.js1332
-rw-r--r--vendor/assets/javascripts/markdown/Markdown.Sanitizer.js108
-rw-r--r--vendor/assets/javascripts/parse_url.js51
-rw-r--r--vendor/assets/javascripts/punycode.js512
1336 files changed, 31671 insertions, 34509 deletions
diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 000000000..030d82329
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,17 @@
+root = true
+
+[*]
+end_of_line = lf
+insert_final_newline = true
+charset = utf-8
+indent_style = space
+indent_size = 2
+
+[{Gemfile,Rakefile,Guardfile,Procfile}]
+trim_trailing_whitespace = true
+
+[*.{js,hbs,rb,rake,ru,erb,haml,scss,sh,md}]
+trim_trailing_whitespace = true
+
+[*.yml]
+trim_trailing_whitespace = false
diff --git a/.foreman b/.foreman
index a39123f3a..d85990e35 100644
--- a/.foreman
+++ b/.foreman
@@ -1,2 +1,2 @@
port: 3000
-formation: web=1,sidekiq=0
+formation: xmpp=0,web=1,sidekiq=0
diff --git a/.gitignore b/.gitignore
index 4daa11583..87b17afd9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,7 @@
+# xmpp certificates, keys and user data
+config/vines/*.crt
+config/vines/*.key
+
#trademark sillyness
app/views/home/_show.*
app/views/terms/terms.*
@@ -10,6 +14,7 @@ config/heroku.yml
config/initializers/secret_token.rb
config/redis.conf
config/deploy_config.yml
+config/schedule.rb
.bundle
vendor/bundle/
vendor/cache/
@@ -29,6 +34,11 @@ spec/fixtures/*.y*ml
spec/fixtures/*.fixture.*
coverage/
xml_locales/
+public/404.html
+public/422.html
+public/500.html
+
+# Sprites
app/assets/images/branding-*.png
app/assets/images/icons-*.png
app/assets/images/social_media_logos-*.png
@@ -58,7 +68,6 @@ tmp/
*.swp
*~
*#
-bin/*
nbproject
patches-*
capybara-*.html
@@ -69,3 +78,6 @@ dump.rdb
#IDE
diaspora.iml
+
+# Dolphin's directory's preferences files
+*.directory
diff --git a/.hound.yml b/.hound.yml
new file mode 100644
index 000000000..9c0f49ddb
--- /dev/null
+++ b/.hound.yml
@@ -0,0 +1,9 @@
+java_script:
+ enabled: true
+ config_file: config/.jshint.json
+ ignore_file: config/.jshint_ignore
+ruby:
+ enabled: true
+ config_file: .rubocop.yml
+scss:
+ enabled: false
diff --git a/.jshintignore b/.jshintignore
new file mode 120000
index 000000000..e650afb05
--- /dev/null
+++ b/.jshintignore
@@ -0,0 +1 @@
+config/.jshint_ignore \ No newline at end of file
diff --git a/.jshintrc b/.jshintrc
new file mode 120000
index 000000000..2c12c8897
--- /dev/null
+++ b/.jshintrc
@@ -0,0 +1 @@
+config/.jshint.json \ No newline at end of file
diff --git a/.pairs b/.pairs
deleted file mode 100644
index f9b826a51..000000000
--- a/.pairs
+++ /dev/null
@@ -1,15 +0,0 @@
-pairs:
- dg: Daniel Grippi; daniel
- rs: Raphael Sofaer; raphael
- iz: Ilya Zhitomirskiy; ilya
- ms: Maxwell Salzberg; maxwell
- dh: Dan Hansen; ohaibbq
- sm: Sarah Mei; sarah
- mjs: Michael Sofaer; michael
- jd: Jeff Dickey; dickeytk
- dc: Dennis Collinson
- tf: Tim Frazer
- kf: Kevin Fitzpatrick
-email:
- prefix: pair
- domain: joindiaspora.com
diff --git a/.powenv b/.powenv
deleted file mode 100644
index fa534d482..000000000
--- a/.powenv
+++ /dev/null
@@ -1 +0,0 @@
-export NEW_HOTNESS=yessir
diff --git a/.powrc b/.powrc
deleted file mode 100644
index 52c4a5737..000000000
--- a/.powrc
+++ /dev/null
@@ -1,4 +0,0 @@
-if [ -f "$rvm_path/scripts/rvm" ] && [ -f ".rvmrc" ]; then
- source "$rvm_path/scripts/rvm"
- source ".rvmrc"
-fi
diff --git a/.rspec b/.rspec
index 7b862b57b..174e25596 100644
--- a/.rspec
+++ b/.rspec
@@ -3,4 +3,3 @@
--color
--tag ~performance
--order random
---drb
diff --git a/.rubocop.yml b/.rubocop.yml
new file mode 100644
index 000000000..2148bb5d0
--- /dev/null
+++ b/.rubocop.yml
@@ -0,0 +1,130 @@
+AllCops:
+ RunRailsCops: true
+
+# Commonly used screens these days easily fit more than 80 characters.
+Metrics/LineLength:
+ Max: 120
+
+# Too short methods lead to extraction of single-use methods, which can make
+# the code easier to read (by naming things), but can also clutter the class
+Metrics/MethodLength:
+ Max: 20
+
+# The guiding principle of classes is SRP, SRP can't be accurately measured by LoC
+Metrics/ClassLength:
+ Max: 1500
+
+# No space makes the method definition shorter and differentiates
+# from a regular assignment.
+Style/SpaceAroundEqualsInParameterDefault:
+ EnforcedStyle: no_space
+
+# Single quotes being faster is hardly measurable and only affects parse time.
+# Enforcing double quotes reduces the times where you need to change them
+# when introducing an interpolation. Use single quotes only if their semantics
+# are needed.
+Style/StringLiterals:
+ EnforcedStyle: double_quotes
+
+# We do not need to support Ruby 1.9, so this is good to use.
+Style/SymbolArray:
+ Enabled: true
+
+# Most readable form.
+Style/AlignHash:
+ EnforcedHashRocketStyle: table
+ EnforcedColonStyle: table
+
+# Mixing the styles looks just silly.
+# REVIEW: Enable once https://github.com/bbatsov/rubocop/commit/760ce1ed2cf10beda5e163f934c03a6fb6daa38e
+# is released.
+#Style/HashSyntax:
+# EnforcedStyle: ruby19_no_mixed_keys
+
+# has_key? and has_value? are far more readable than key? and value?
+Style/DeprecatedHashMethods:
+ Enabled: false
+
+# String#% is by far the least verbose and only object oriented variant.
+Style/FormatString:
+ EnforcedStyle: percent
+
+Style/CollectionMethods:
+ Enabled: true
+ PreferredMethods:
+ # inject seems more common in the community.
+ reduce: "inject"
+
+
+# Either allow this style or don't. Marking it as safe with parenthesis
+# is silly. Let's try to live without them for now.
+Style/ParenthesesAroundCondition:
+ AllowSafeAssignment: false
+Lint/AssignmentInCondition:
+ AllowSafeAssignment: false
+
+# A specialized exception class will take one or more arguments and construct the message from it.
+# So both variants make sense.
+Style/RaiseArgs:
+ Enabled: false
+
+# Fail is an alias of raise. Avoid aliases, it's more cognitive load for no gain.
+# The argument that fail should be used to abort the program is wrong too,
+# there's Kernel#abort for that.
+Style/SignalException:
+ EnforcedStyle: only_raise
+
+# Suppressing exceptions can be perfectly fine, and be it to avoid to
+# explicitly type nil into the rescue since that's what you want to return,
+# or suppressing LoadError for optional dependencies
+Lint/HandleExceptions:
+ Enabled: false
+
+Style/SpaceInsideBlockBraces:
+ # The space here provides no real gain in readability while consuming
+ # horizontal space that could be used for a better parameter name.
+ # Also {| differentiates better from a hash than { | does.
+ SpaceBeforeBlockParameters: false
+
+# No trailing space differentiates better from the block:
+# foo} means hash, foo } means block.
+Style/SpaceInsideHashLiteralBraces:
+ EnforcedStyle: no_space
+
+# { ... } for multi-line blocks is okay, follow Weirichs rule instead:
+# https://web.archive.org/web/20140221124509/http://onestepback.org/index.cgi/Tech/Ruby/BraceVsDoEnd.rdoc
+Style/Blocks:
+ Enabled: false
+
+# do / end blocks should be used for side effects,
+# methods that run a block for side effects and have
+# a useful return value are rare, assign the return
+# value to a local variable for those cases.
+Style/MethodCalledOnDoEndBlock:
+ Enabled: true
+
+# Enforcing the names of variables? To single letter ones? Just no.
+Style/SingleLineBlockParams:
+ Enabled: false
+
+# Shadowing outer local variables with block parameters is often useful
+# to not reinvent a new name for the same thing, it highlights the relation
+# between the outer variable and the parameter. The cases where it's actually
+# confusing are rare, and usually bad for other reasons already, for example
+# because the method is too long.
+Lint/ShadowingOuterLocalVariable:
+ Enabled: false
+
+# Check with yard instead.
+Style/Documentation:
+ Enabled: false
+
+# This is just silly. Calling the argument `other` in all cases makes no sense.
+Style/OpMethod:
+ Enabled: false
+
+# There are valid cases, for example debugging Cucumber steps,
+# also they'll fail CI anyway
+Lint/Debugger:
+ Enabled: false
+
diff --git a/.ruby-version b/.ruby-version
index cd5ac039d..879b416e6 100644
--- a/.ruby-version
+++ b/.ruby-version
@@ -1 +1 @@
-2.0
+2.1
diff --git a/.travis.yml b/.travis.yml
index 852b2cab3..56e74410e 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,12 +1,8 @@
-branches:
- only:
- - 'master'
- - 'develop'
-
language: ruby
+
rvm:
- - 2.0.0
- - 1.9.3
+ - 2.1
+ - 2.0
env:
- DB=postgres BUILD_TYPE=other
@@ -14,12 +10,21 @@ env:
- DB=postgres BUILD_TYPE=cucumber
- DB=mysql BUILD_TYPE=cucumber
+sudo: false
+cache:
+ bundler: true
+ directories:
+ - app/assets/images
-bundler_args: "--without development production heroku"
-script: "./script/ci/build.sh"
+branches:
+ only:
+ - 'master'
+ - 'develop'
+
+before_install: gem install bundler
+bundler_args: "--without development production heroku --jobs 3 --retry 3"
-addons:
- firefox: "26.0"
+script: "./script/ci/build.sh"
notifications:
irc:
diff --git a/Changelog.md b/Changelog.md
index 396e70d44..652eb5d9d 100644
--- a/Changelog.md
+++ b/Changelog.md
@@ -1,3 +1,219 @@
+# 0.5.0.0
+
+## Major Sidekiq update
+This release includes a major upgrade of the background processing system Sidekiq. To upgrade cleanly:
+
+1. Stop diaspora*
+2. Run `RAILS_ENV=production bundle exec sidekiq` and wait 5-10 minutes, then stop it again (hit `CTRL+C`)
+3. Do a normal upgrade of diaspora*
+4. Start diaspora*
+
+## Rails 4 - Manual action required
+Please edit `config/initializers/secret_token.rb`, replacing `secret_token` with
+`secret_key_base`.
+
+```ruby
+# Old
+Rails.application.config.secret_token = '***********...'
+
+# New
+Diaspora::Application.config.secret_key_base = '*************...'
+```
+
+You also need to take care to set `RAILS_ENV` and to clear the cache while precompiling assets: `RAILS_ENV=production bundle exec rake tmp:cache:clear assets:precompile`
+
+## Supported Ruby versions
+This release drops official support for the Ruby 1.9 series. This means we will no longer test against this Ruby version or take care to choose libraries
+that work with it. However that doesn't mean we won't accept patches that improve running diaspora* on it.
+
+At the same time we adopt support for the Ruby 2.1 series and recommend running on the latest Ruby version of that branch. We continue to support the Ruby 2.0
+series and run our comprehensive test suite against it.
+
+## Change in defaults.yml
+The default for including jQuery from a CDN has changed. If you want to continue to include it from a CDN, please explicitly set the `jquery_cdn` setting to `true` in diaspora.yml.
+
+## Change in database.yml
+For MySQL databases, replace `charset: utf8` with `encoding: utf8mb4` and change `collation` from `utf8_bin` to `utf8mb4_bin` in the file `config/database.yml`.
+This is enables full UTF8 support (4bytes characters), including standard emoji characters.
+See `database.yml.example` for reference.
+Please make sure to stop Diaspora prior running this migration!
+
+## Experimental chat feature
+This release adds experimental integration with XMPP for real-time chat. Please see [our wiki](https://wiki.diasporafoundation.org/Vines) for further informations.
+
+## Change in statistics.json schema
+The way services are shown in the `statistics.json` route is changing. The keys relating to showing whether services are enabled or not are moving to their own container as `"services": {....}`, instead of having them all in the root level of the JSON.
+
+The keys will still be available in the root level within the 0.5 release. The old keys will be removed in the 0.6 release.
+
+## New maintenance feature to automatically expire inactive accounts
+Removing of old inactive users can now be done automatically by background processing. The amount of inactivity is set by `after_days`. A warning email will be sent to the user and after an additional `warn_days`, the account will be automatically closed.
+
+This maintenance is not enabled by default. Podmins can enable it by for example copying over the new settings under `settings.maintenance` to their `diaspora.yml` file and setting it enabled. The default setting is to expire accounts that have been inactive for 2 years (no login).
+
+## Camo integration to proxy external assets
+It is now possible to enable an automatic proxying of external assets, for example images embedded via Markdown or OpenGraph thumbnails loaded from insecure third party servers through a [Camo proxy](https://github.com/atmos/camo).
+
+This is disabled by default since it requires the installation of additional packages and might cause some traffic. Check the [wiki page](https://wiki.diasporafoundation.org/Installation/Camo) for more information and detailed installation instructions.
+
+## Paypal unhosted button and currency
+Podmins can now set the currency for donations, and use an unhosted button if they can't use
+a hosted one. Note: you need to **copy the new settings from diaspora.yml.example to your
+diaspora.yml file**. The existing settings from 0.4.x and before will not work any more.
+
+## Custom splash page changes
+diaspora* no longer adds a `div.container` to wrap custom splash pages. This adds the ability for podmins to write home pages using Bootstrap's fluid design. Podmins who added a custom splash page in `app/views/home/_show.{html,mobile}.haml` need to wrap the contents into a `div.container` to keep the old design. You will find updated examples [in our wiki](https://wiki.diasporafoundation.org/Custom_splash_page).
+
+## Refactor
+* Redesign contacts page [#5153](https://github.com/diaspora/diaspora/pull/5153)
+* Improve profile page design on mobile [#5084](https://github.com/diaspora/diaspora/pull/5084)
+* Port test suite to RSpec 3 [#5170](https://github.com/diaspora/diaspora/pull/5170)
+* Port tag stream to Bootstrap [#5138](https://github.com/diaspora/diaspora/pull/5138)
+* Consolidate migrations, if you need a migration prior 2013, checkout the latest release in the 0.4.x series first [#5173](https://github.com/diaspora/diaspora/pull/5173)
+* Add tests for mobile sign up [#5185](https://github.com/diaspora/diaspora/pull/5185)
+* Display new conversation form on conversations/index [#5178](https://github.com/diaspora/diaspora/pull/5178)
+* Port profile page to Backbone [#5180](https://github.com/diaspora/diaspora/pull/5180)
+* Pull punycode.js from rails-assets.org [#5263](https://github.com/diaspora/diaspora/pull/5263)
+* Redesign profile page and port to Bootstrap [#4657](https://github.com/diaspora/diaspora/pull/4657)
+* Unify stream selection links in the left sidebar [#5271](https://github.com/diaspora/diaspora/pull/5271)
+* Refactor schema of statistics.json regarding services [#5296](https://github.com/diaspora/diaspora/pull/5296)
+* Pull jquery.idle-timer.js from rails-assets.org [#5310](https://github.com/diaspora/diaspora/pull/5310)
+* Pull jquery.placeholder.js from rails-assets.org [#5299](https://github.com/diaspora/diaspora/pull/5299)
+* Pull jquery.textchange.js from rails-assets.org [#5297](https://github.com/diaspora/diaspora/pull/5297)
+* Pull jquery.hotkeys.js from rails-assets.org [#5368](https://github.com/diaspora/diaspora/pull/5368)
+* Reduce amount of useless background job retries and pull public posts when missing [#5209](https://github.com/diaspora/diaspora/pull/5209)
+* Updated Weekly User Stats admin page to show data for the most recent week including reversing the order of the weeks in the drop down to show the most recent. [#5331](https://github.com/diaspora/diaspora/pull/5331)
+* Convert some cukes to RSpec tests [#5289](https://github.com/diaspora/diaspora/pull/5289)
+* Hidden overflow for long names on tag pages [#5279](https://github.com/diaspora/diaspora/pull/5279)
+* Always reshare absolute root of a post [#5276](https://github.com/diaspora/diaspora/pull/5276)
+* Convert remaining SASS stylesheets to SCSS [#5342](https://github.com/diaspora/diaspora/pull/5342)
+* Update rack-protection [#5403](https://github.com/diaspora/diaspora/pull/5403)
+* Cleanup diaspora.yml [#5426](https://github.com/diaspora/diaspora/pull/5426)
+* Replace `opengraph_parser` with `open_graph_reader` [#5462](https://github.com/diaspora/diaspora/pull/5462)
+* Make sure conversations without any visibilities left are deleted [#5478](https://github.com/diaspora/diaspora/pull/5478)
+* Change tooltip for delete button in conversations view [#5477](https://github.com/diaspora/diaspora/pull/5477)
+* Replace a modifier-rescue with a specific rescue [#5491](https://github.com/diaspora/diaspora/pull/5491)
+* Port contacts page to backbone [#5473](https://github.com/diaspora/diaspora/pull/5473)
+* Replace CSS vendor prefixes automatically [#5532](https://github.com/diaspora/diaspora/pull/5532)
+* Use sentence case consistently throughout UI [#5588](https://github.com/diaspora/diaspora/pull/5588)
+* Hide sign up button when registrations are disabled [#5612](https://github.com/diaspora/diaspora/pull/5612)
+* Standardize capitalization throughout the UI [#5588](https://github.com/diaspora/diaspora/pull/5588)
+* Display photos on the profile page as thumbnails [#5521](https://github.com/diaspora/diaspora/pull/5521)
+* Unify not connected pages (sign in, sign up, forgot password) [#5391](https://github.com/diaspora/diaspora/pull/5391)
+* Port remaining stream pages to Bootstrap [#5715](https://github.com/diaspora/diaspora/pull/5715)
+* Port notification dropdown to Backbone [#5707](https://github.com/diaspora/diaspora/pull/5707) [#5761](https://github.com/diaspora/diaspora/pull/5761)
+* Add rounded corners for avatars [#5733](https://github.com/diaspora/diaspora/pull/5733)
+* Move registration form to a partial [#5764](https://github.com/diaspora/diaspora/pull/5764)
+* Add tests for liking and unliking posts [#5741](https://github.com/diaspora/diaspora/pull/5741)
+* Rewrite slide effect in conversations as css transition for better performance [#5776](https://github.com/diaspora/diaspora/pull/5776)
+* Various cleanups and improvements in the frontend code [#5781](https://github.com/diaspora/diaspora/pull/5781) [#5769](https://github.com/diaspora/diaspora/pull/5769) [#5763](https://github.com/diaspora/diaspora/pull/5763) [#5762](https://github.com/diaspora/diaspora/pull/5762) [#5758](https://github.com/diaspora/diaspora/pull/5758) [#5755](https://github.com/diaspora/diaspora/pull/5755) [#5747](https://github.com/diaspora/diaspora/pull/5747) [#5734](https://github.com/diaspora/diaspora/pull/5734) [#5786](https://github.com/diaspora/diaspora/pull/5786) [#5768](https://github.com/diaspora/diaspora/pull/5798)
+* Add specs and validations to the role model [#5792](https://github.com/diaspora/diaspora/pull/5792)
+* Replace 'Make something' text by diaspora ball logo on registration page [#5743](https://github.com/diaspora/diaspora/pull/5743)
+
+## Bug fixes
+* orca cannot see 'Add Contact' button [#5158](https://github.com/diaspora/diaspora/pull/5158)
+* Move submit button to the right in conversations view [#4960](https://github.com/diaspora/diaspora/pull/4960)
+* Handle long URLs and titles in OpenGraph descriptions [#5208](https://github.com/diaspora/diaspora/pull/5208)
+* Fix deformed getting started popover [#5227](https://github.com/diaspora/diaspora/pull/5227)
+* Use correct locale for invitation subject [#5232](https://github.com/diaspora/diaspora/pull/5232)
+* Initial support for IDN emails
+* Fix services settings reported by statistics.json [#5256](https://github.com/diaspora/diaspora/pull/5256)
+* Only collapse empty comment box [#5328](https://github.com/diaspora/diaspora/pull/5328)
+* Fix pagination for people/guid/contacts [#5304](https://github.com/diaspora/diaspora/pull/5304)
+* Fix poll creation on Bootstrap pages [#5334](https://github.com/diaspora/diaspora/pull/5334)
+* Show error message on invalid reset password attempt [#5325](https://github.com/diaspora/diaspora/pull/5325)
+* Fix translations on mobile password reset pages [#5318](https://github.com/diaspora/diaspora/pull/5318)
+* Handle unset user agent when signing out [#5316](https://github.com/diaspora/diaspora/pull/5316)
+* More robust URL parsing for oEmbed and OpenGraph [#5347](https://github.com/diaspora/diaspora/pull/5347)
+* Fix Publisher doesn't expand while uploading images [#3098](https://github.com/diaspora/diaspora/issues/3098)
+* Drop unneeded and too open crossdomain.xml
+* Fix hidden aspect dropdown on getting started page [#5407](https://github.com/diaspora/diaspora/pulls/5407)
+* Fix a few issues on Bootstrap pages [#5401](https://github.com/diaspora/diaspora/pull/5401)
+* Improve handling of the `more` link on mobile stream pages [#5400](https://github.com/diaspora/diaspora/pull/5400)
+* Fix prefilling publisher after getting started [#5442](https://github.com/diaspora/diaspora/pull/5442)
+* Fix overflow in profile sidebar [#5450](https://github.com/diaspora/diaspora/pull/5450)
+* Fix code overflow in SPV and improve styling for code tags [#5422](https://github.com/diaspora/diaspora/pull/5422)
+* Correctly validate if local recipients actually want to receive a conversation [#5449](https://github.com/diaspora/diaspora/pull/5449)
+* Improve consistency of poll answer ordering [#5471](https://github.com/diaspora/diaspora/pull/5471)
+* Fix broken aspect selectbox on asynchronous search results [#5488](https://github.com/diaspora/diaspora/pull/5488)
+* Replace %{third_party_tools} by the appropriate hyperlink in tags FAQ [#5509](https://github.com/diaspora/diaspora/pull/5509)
+* Repair downloading the profile image from Facebook [#5493](https://github.com/diaspora/diaspora/pull/5493)
+* Fix localization of post and comment timestamps on mobile [#5482](https://github.com/diaspora/diaspora/issues/5482)
+* Fix mobile JS loading to quieten errors. Fixes also service buttons on mobile bookmarklet.
+* Don't error out when adding a too long location to the profile [#5614](https://github.com/diaspora/diaspora/pull/5614)
+* Correctly decrease unread count for conversations [#5646](https://github.com/diaspora/diaspora/pull/5646)
+* Fix automatic scroll for conversations [#5646](https://github.com/diaspora/diaspora/pull/5646)
+* Fix missing translation on privacy settings page [#5671](https://github.com/diaspora/diaspora/pull/5671)
+* Fix code overflow for the mobile website [#5675](https://github.com/diaspora/diaspora/pull/5675)
+* Strip Unicode format characters prior post processing [#5680](https://github.com/diaspora/diaspora/pull/5680)
+* Disable email notifications for closed user accounts [#5640](https://github.com/diaspora/diaspora/pull/5640)
+* Total user statistic no longer includes closed accounts [#5041](https://github.com/diaspora/diaspora/pull/5041)
+* Don't add a space when rendering a mention [#5711](https://github.com/diaspora/diaspora/pull/5711)
+* Fix flickering hovercards [#5714](https://github.com/diaspora/diaspora/pull/5714) [#5876](https://github.com/diaspora/diaspora/pull/5876)
+* Improved stripping markdown in post titles [#5730](https://github.com/diaspora/diaspora/pull/5730)
+* Remove border from reply form for conversations [#5744](https://github.com/diaspora/diaspora/pull/5744)
+* Fix overflow for headings, blockquotes and other elements [#5731](https://github.com/diaspora/diaspora/pull/5731)
+* Correct photo count on profile page [#5751](https://github.com/diaspora/diaspora/pull/5751)
+* Fix mobile sign up from an invitation [#5754](https://github.com/diaspora/diaspora/pull/5754)
+* Set max-width for tag following button on tag page [#5752](https://github.com/diaspora/diaspora/pull/5752)
+* Display error messages for failed password change [#5580](https://github.com/diaspora/diaspora/pull/5580)
+* Display correct error message for too long tags [#5783](https://github.com/diaspora/diaspora/pull/5783)
+* Fix displaying reshares in the stream on mobile [#5790](https://github.com/diaspora/diaspora/pull/5790)
+* Remove bottom margin from lists that are the last element of a post. [#5721](https://github.com/diaspora/diaspora/pull/5721)
+* Fix pagination design on conversations page [#5791](https://github.com/diaspora/diaspora/pull/5791)
+* Prevent inserting posts into the wrong stream [#5838](https://github.com/diaspora/diaspora/pull/5838)
+* Update help section [#5857](https://github.com/diaspora/diaspora/pull/5857) [#5859](https://github.com/diaspora/diaspora/pull/5859)
+* Fix asset precompilation check in script/server [#5863](https://github.com/diaspora/diaspora/pull/5863)
+* Convert MySQL databases to utf8mb4 [#5530](https://github.com/diaspora/diaspora/pull/5530) [#5624](https://github.com/diaspora/diaspora/pull/5624) [#5865](https://github.com/diaspora/diaspora/pull/5865)
+* Don't upcase labels on mobile sign up/sign in [#5872](https://github.com/diaspora/diaspora/pull/5872)
+
+## Features
+* Don't pull jQuery from a CDN by default [#5105](https://github.com/diaspora/diaspora/pull/5105)
+* Better character limit message [#5151](https://github.com/diaspora/diaspora/pull/5151)
+* Remember whether a AccountDeletion was performed [#5156](https://github.com/diaspora/diaspora/pull/5156)
+* Increased the number of notifications shown in drop down bar to 15 [#5129](https://github.com/diaspora/diaspora/pull/5129)
+* Increase possible captcha length [#5169](https://github.com/diaspora/diaspora/pull/5169)
+* Display visibility icon in publisher aspects dropdown [#4982](https://github.com/diaspora/diaspora/pull/4982)
+* Add a link to the reported comment in the admin panel [#5337](https://github.com/diaspora/diaspora/pull/5337)
+* Strip search query from leading and trailing whitespace [#5317](https://github.com/diaspora/diaspora/pull/5317)
+* Add the "network" key to statistics.json and set it to "Diaspora" [#5308](https://github.com/diaspora/diaspora/pull/5308)
+* Infinite scrolling in the notifications dropdown [#5237](https://github.com/diaspora/diaspora/pull/5237)
+* Maintenance feature to automatically expire inactive accounts [#5288](https://github.com/diaspora/diaspora/pull/5288)
+* Add LibreJS markers to JavaScript [5320](https://github.com/diaspora/diaspora/pull/5320)
+* Ask for confirmation when leaving a submittable publisher [#5309](https://github.com/diaspora/diaspora/pull/5309)
+* Allow page-specific styling via individual CSS classes [#5282](https://github.com/diaspora/diaspora/pull/5282)
+* Change diaspora logo in the header on hover [#5355](https://github.com/diaspora/diaspora/pull/5355)
+* Display diaspora handle in search results [#5419](https://github.com/diaspora/diaspora/pull/5419)
+* Show a message on the ignored users page when there are none [#5434](https://github.com/diaspora/diaspora/pull/5434)
+* Truncate too long OpenGraph descriptions [#5387](https://github.com/diaspora/diaspora/pull/5387)
+* Make the source code URL configurable [#5410](https://github.com/diaspora/diaspora/pull/5410)
+* Prefill publisher on the tag pages [#5442](https://github.com/diaspora/diaspora/pull/5442)
+* Don't include the content of non-public posts into notification mails [#5494](https://github.com/diaspora/diaspora/pull/5494)
+* Allow to set unhosted button and currency for paypal donation [#5452](https://github.com/diaspora/diaspora/pull/5452)
+* Add followed tags in the mobile menu [#5468](https://github.com/diaspora/diaspora/pull/5468)
+* Replace Pagedown with markdown-it [#5526](https://github.com/diaspora/diaspora/pull/5526)
+* Do not truncate notification emails anymore [#4342](https://github.com/diaspora/diaspora/issues/4342)
+* Allows users to export their data in gzipped JSON format from their user settings page [#5499](https://github.com/diaspora/diaspora/pull/5499)
+* Strip EXIF data from newly uploaded images [#5510](https://github.com/diaspora/diaspora/pull/5510)
+* Hide user setting if the community spotlight is not enabled on the pod [#5562](https://github.com/diaspora/diaspora/pull/5562)
+* Add HTML view for pod statistics [#5464](https://github.com/diaspora/diaspora/pull/5464)
+* Added/Moved hide, block user, report and delete button in SPV [#5547](https://github.com/diaspora/diaspora/pull/5547)
+* Added keyboard shortcuts r(reshare), m(expand Post), o(open first link in post) [#5602](https://github.com/diaspora/diaspora/pull/5602)
+* Added dropdown to add/remove people from/to aspects in mobile view [#5594](https://github.com/diaspora/diaspora/pull/5594)
+* Dynamically compute minimum and maximum valid year for birthday field [#5639](https://github.com/diaspora/diaspora/pull/5639)
+* Show hovercard on mentions [#5652](https://github.com/diaspora/diaspora/pull/5652)
+* Make help sections linkable [#5667](https://github.com/diaspora/diaspora/pull/5667)
+* Add invitation link to contacts page [#5655](https://github.com/diaspora/diaspora/pull/5655)
+* Add year to notifications page [#5676](https://github.com/diaspora/diaspora/pull/5676)
+* Give admins the ability to lock & unlock accounts [#5643](https://github.com/diaspora/diaspora/pull/5643)
+* Add reshares to the stream view immediately [#5699](https://github.com/diaspora/diaspora/pull/5699)
+* Update and improve help section [#5665](https://github.com/diaspora/diaspora/pull/5665), [#5706](https://github.com/diaspora/diaspora/pull/5706)
+* Expose participation controls in the stream view [#5511](https://github.com/diaspora/diaspora/pull/5511)
+* Reimplement photo export [#5685](https://github.com/diaspora/diaspora/pull/5685)
+* Add participation controls in the single post view [#5722](https://github.com/diaspora/diaspora/pull/5722)
+* Display polls on reshares [#5782](https://github.com/diaspora/diaspora/pull/5782)
+* Remove footer from stream pages [#5816](https://github.com/diaspora/diaspora/pull/5816)
+
# 0.4.1.3
* Update Redcarped, fixes [OSVDB-120415](http://osvdb.org/show/osvdb/120415).
@@ -19,7 +235,7 @@ This release brings a new ToS feature that allows pods to easily display to user
terms:
enable: true
-When enabled, the footer and sidebar will have a link to terms page, and signup will have a disclaimer indicating that creating an account means the user accepts the terms of use.
+When enabled, the footer and sidebar will have a link to terms page, and sign up will have a disclaimer indicating that creating an account means the user accepts the terms of use.
While the project itself doesn't restrict what kind of terms pods run on, we realize not all podmins want to spend time writing them from scratch. Thus there is a basic ToS template included that will be used unless a custom one available.
@@ -134,7 +350,7 @@ Read more in [#4249](https://github.com/diaspora/diaspora/pull/4249) and [#4883]
* Reorder and reword items on user settings page [#4912](https://github.com/diaspora/diaspora/pull/4912)
* SPV: Improve padding and interaction counts [#4426](https://github.com/diaspora/diaspora/pull/4426)
* Remove auto 'mark as read' for notifications [#4810](https://github.com/diaspora/diaspora/pull/4810)
-* Improve set read/unread in notifications dropdown [#4869](https://github.com/diaspora/diaspora/pull/4869)
+* Improve set read/unread in notifications dropdown [#4869](https://github.com/diaspora/diaspora/pull/4869)
* Refactor publisher: trigger events for certain actions, introduce 'disabled' state [#4932](https://github.com/diaspora/diaspora/pull/4932)
## Bug fixes
@@ -1022,7 +1238,7 @@ The new configuration system allows all possible settings to be overriden by env
### Environment variable changes:
-#### deprectated
+#### deprecated
* REDISTOGO_URL in favour of REDIS_URL or ENVIRONMENT_REDIS
@@ -1081,4 +1297,3 @@ The single-post view will also be revamped/reverted, but that didn't make it int
## Cleanup in maintenance scripts and automated build environment
-
diff --git a/Gemfile b/Gemfile
index e9d70aef2..42688dc40 100644
--- a/Gemfile
+++ b/Gemfile
@@ -1,218 +1,275 @@
-source 'https://rubygems.org'
+source "https://rubygems.org"
-gem 'rails', '3.2.20'
+gem "rails", "4.2.1"
+
+# Legacy Rails features, remove me!
+
+# caches_page
+gem "actionpack-action_caching"
+gem "actionpack-page_caching"
+
+# responders (class level)
+gem "responders", "2.1.0"
# Appserver
-gem 'unicorn', '4.8.3', :require => false
+gem "unicorn", "4.8.3", require: false
# API and JSON
-gem 'acts_as_api', '0.4.2'
-gem 'json', '1.8.1'
+gem "acts_as_api", "0.4.2"
+gem "json", "1.8.2"
# Authentication
-gem 'devise', '3.2.4'
-gem 'devise_lastseenable', '0.0.4'
+gem "devise", "3.4.1"
+gem "devise_lastseenable", "0.0.4"
+gem "devise-token_authenticatable", "~> 0.3.0"
# Captcha
-gem 'galetahub-simple_captcha', '0.1.5', :require => 'simple_captcha'
+gem "simple_captcha2", "0.3.4", require: "simple_captcha"
# Background processing
-gem 'sidekiq', '2.17.7'
-gem 'sinatra', '1.3.3'
+gem "sidekiq", "3.3.3"
+gem "sinatra", "1.4.6"
+
+# Scheduled processing
+
+gem "sidetiq", "0.6.3"
+
+# Compression
+
+gem "uglifier", "2.7.1"
# Configuration
-gem 'configurate', '0.0.8'
+gem "configurate", "0.2.0"
# Cross-origin resource sharing
-gem 'rack-cors', '0.2.9', :require => 'rack/cors'
+gem "rack-cors", "0.3.1", require: "rack/cors"
+
+# CSS
+
+gem "bootstrap-sass", "2.3.2.2"
+gem "compass-rails", "2.0.4"
+gem "sass-rails", "5.0.1"
+gem "autoprefixer-rails", "5.1.7.1"
# Database
-ENV['DB'] ||= 'mysql'
+ENV["DB"] ||= "mysql"
-gem 'mysql2', '0.3.16' if ENV['DB'] == 'all' || ENV['DB'] == 'mysql'
-gem 'pg', '0.17.1' if ENV['DB'] == 'all' || ENV['DB'] == 'postgres'
+gem "mysql2", "0.3.18" if ENV["DB"] == "all" || ENV["DB"] == "mysql"
+gem "pg", "0.18.1" if ENV["DB"] == "all" || ENV["DB"] == "postgres"
-gem 'activerecord-import', '0.3.1'
-gem 'foreigner', '1.6.1'
+gem "activerecord-import", "0.7.0"
# File uploading
-gem 'carrierwave', '0.10.0'
-gem 'fog', '1.22.1'
-gem 'mini_magick', '3.7.0'
-gem 'remotipart', '1.2.1'
+gem "carrierwave", "0.10.0"
+gem "fog", "1.28.0"
+gem "mini_magick", "4.2.0"
+gem "remotipart", "1.2.1"
# GUID generation
-gem 'uuid', '2.3.7'
-
-# Localization
+gem "uuid", "2.3.7"
-gem 'http_accept_language', '1.0.2'
-gem 'i18n-inflector-rails', '1.0.7'
-gem 'rails-i18n', '0.7.4'
+# Icons
-# Mail
+gem "entypo-rails", "2.2.2"
-gem 'markerb', '1.0.2'
-gem 'messagebus_ruby_api', '1.0.3'
+# JavaScript
-# Parsing
+gem "backbone-on-rails", "1.1.2"
+gem "handlebars_assets", "0.20.1"
+gem "jquery-rails", "3.1.2"
+gem "js_image_paths", "0.0.2"
+gem "js-routes", "1.0.0"
-gem 'nokogiri', '1.6.1'
-gem 'rails_autolink', '1.1.5'
-gem 'redcarpet', '3.2.3'
-gem 'roxml', '3.1.6'
-gem 'ruby-oembed', '0.8.9'
-gem 'opengraph_parser', '0.2.3'
+source "https://rails-assets.org" do
+ gem "rails-assets-jquery", "1.11.1" # Should be kept in sync with jquery-rails
+ gem "rails-assets-markdown-it", "4.2.0"
+ gem "rails-assets-markdown-it-hashtag", "0.3.0"
+ gem "rails-assets-markdown-it-diaspora-mention", "0.3.0"
+ gem "rails-assets-markdown-it-sanitizer", "0.3.0"
+ gem "rails-assets-markdown-it--markdown-it-for-inline", "0.1.0"
+ gem "rails-assets-markdown-it-sub", "1.0.0"
+ gem "rails-assets-markdown-it-sup", "1.0.0"
-# Please remove when migrating to Rails 4
-gem 'strong_parameters', '0.2.3'
+ # jQuery plugins
+ gem "rails-assets-jeresig--jquery.hotkeys", "0.2.0"
+ gem "rails-assets-jquery-idletimer", "1.0.1"
+ gem "rails-assets-jquery-placeholder", "2.1.1"
+ gem "rails-assets-jquery-textchange", "0.2.3"
+ gem "rails-assets-perfect-scrollbar", "0.5.9"
+end
-# Services
+# Localization
-gem 'omniauth', '1.2.1'
-gem 'omniauth-facebook', '1.6.0'
-gem 'omniauth-tumblr', '1.1'
-gem 'omniauth-twitter', '1.0.1'
-gem 'twitter', '4.8.1'
-gem 'omniauth-wordpress','0.2.1'
+gem "http_accept_language", "2.0.5"
+gem "i18n-inflector-rails", "1.0.7"
+gem "rails-i18n", "4.0.4"
-# Tags
+# Mail
-gem 'acts-as-taggable-on', '3.2.6'
+gem "markerb", "1.0.2"
+gem "messagebus_ruby_api", "1.0.3"
-# URIs and HTTP
+# Parsing
-gem 'addressable', '2.3.6', :require => 'addressable/uri'
-gem 'faraday', '0.8.9'
-gem 'faraday_middleware', '0.9.0'
-gem 'typhoeus', '0.6.8'
+gem "nokogiri", "1.6.6.2"
+gem "redcarpet", "3.2.3"
+gem "twitter-text", "1.11.0"
+gem "roxml", "3.1.6"
+gem "ruby-oembed", "0.8.12"
+gem "open_graph_reader", "0.5.0"
-# Views
+# Services
-gem 'gon', '5.0.4'
-gem 'haml', '4.0.5'
-gem 'mobile-fu', '1.2.2'
-gem 'will_paginate', '3.0.5'
-gem 'rails-timeago', '2.4.0'
+gem "omniauth", "1.2.2"
+gem "omniauth-facebook", "1.6.0"
+gem "omniauth-tumblr", "1.1"
+gem "omniauth-twitter", "1.0.1"
+gem "twitter", "4.8.1"
+gem "omniauth-wordpress", "0.2.1"
-# Workarounds
-# https://github.com/rubyzip/rubyzip#important-note
-gem 'zip-zip'
+# Serializers
-### GROUPS ####
+gem "active_model_serializers", "0.9.3"
-group :assets do
+# XMPP chat dependencies
+gem "diaspora-vines", "~> 0.1.27"
+gem "rails-assets-diaspora_jsxc", "~> 0.1.1", source: "https://rails-assets.org"
- # Icons
- gem 'entypo-rails', '2.2.1'
+# Tags
- # CSS
+gem "acts-as-taggable-on", "3.5.0"
- gem 'bootstrap-sass', '2.2.2.0'
- gem 'compass-rails', '1.1.7'
- gem 'sass-rails', '3.2.6'
+# URIs and HTTP
- # Compression
+gem "addressable", "2.3.7", require: "addressable/uri"
+gem "faraday", "0.9.1"
+gem "faraday_middleware", "0.9.1"
+gem "faraday-cookie_jar", "0.0.6"
+gem "typhoeus", "0.7.1"
- gem 'uglifier', '2.5.0'
+# Views
- # JavaScript
+gem "gon", "5.2.3"
+gem "haml", "4.0.6"
+gem "mobile-fu", "1.3.1"
+gem "will_paginate", "3.0.7"
+gem "rails-timeago", "2.11.0"
- gem 'backbone-on-rails', '1.1.1'
- gem 'handlebars_assets', '0.12.0'
- gem 'jquery-rails', '3.0.4'
+# Workarounds
+# https://github.com/rubyzip/rubyzip#important-note
+gem "zip-zip"
- # Windows and OSX have an execjs compatible runtime built-in, Linux users should
- # install Node.js or use 'therubyracer'.
- #
- # See https://github.com/sstephenson/execjs#readme for more supported runtimes
+# Prevent occasions where minitest is not bundled in
+# packaged versions of ruby. See following issues/prs:
+# https://github.com/gitlabhq/gitlabhq/issues/3826
+# https://github.com/gitlabhq/gitlabhq/pull/3852
+# https://github.com/discourse/discourse/pull/238
+gem "minitest"
- # gem 'therubyracer', :platform => :ruby
-end
+# Windows and OSX have an execjs compatible runtime built-in, Linux users should
+# install Node.js or use "therubyracer".
+#
+# See https://github.com/sstephenson/execjs#readme for more supported runtimes
-group :production do # we don't install these on travis to speed up test runs
+# gem "therubyracer", :platform => :ruby
+group :production do # we don"t install these on travis to speed up test runs
# Administration
- gem 'rails_admin', '0.4.9'
+ gem "rails_admin", "0.6.7"
# Analytics
- gem 'rack-google-analytics', '0.14.0', :require => 'rack/google-analytics'
- gem 'rack-piwik', '0.2.2', :require => 'rack/piwik'
+ gem "rack-google-analytics", "1.2.0"
+ gem "rack-piwik", "0.3.0", require: "rack/piwik"
# Click-jacking protection
- gem 'rack-protection', '1.2'
+ gem "rack-protection", "1.5.3"
# Process management
- gem 'foreman', '0.62'
+ gem "foreman", "0.62"
# Redirects
- gem 'rack-rewrite', '1.5.0', :require => false
- gem 'rack-ssl', '1.3.3', :require => 'rack/ssl'
+ gem "rack-rewrite", "1.5.1", require: false
+ gem "rack-ssl", "1.4.1", require: "rack/ssl"
# Third party asset hosting
- gem 'asset_sync', '1.0.0', :require => false
+ gem "asset_sync", "1.1.0", require: false
end
group :development do
# Automatic test runs
- gem 'guard-cucumber', '1.4.1'
- gem 'guard-rspec', '4.2.9'
- gem 'rb-fsevent', '0.9.4', :require => false
- gem 'rb-inotify', '0.9.4', :require => false
+ gem "guard-cucumber", "1.5.4"
+ gem "guard-jshintrb", "1.1.1"
+ gem "guard-rspec", "4.5.0"
+ gem "guard-rubocop", "1.2.0"
+ gem "guard", "2.12.5", require: false
+ gem "rb-fsevent", "0.9.4", require: false
+ gem "rb-inotify", "0.9.5", require: false
+
+ # Linters
+ gem "jshintrb", "0.3.0"
+ gem "rubocop", "0.29.1"
# Preloading environment
- gem 'guard-spork', '1.5.1'
- gem 'spork', '1.0.0rc4'
+ gem "spring", "1.3.3"
+ gem "spring-commands-rspec", "1.0.4"
+ gem "spring-commands-cucumber", "1.0.1"
+
+ # Debugging
+ gem "pry"
+ gem "pry-debundle"
+ gem "pry-byebug"
end
group :test do
# RSpec (unit tests, some integration tests)
- gem 'fixture_builder', '0.3.6'
- gem 'fuubar', '1.3.3'
- gem 'rspec-instafail', '0.2.4', :require => false
- gem 'test_after_commit', '0.2.3'
+ gem "fixture_builder", "0.3.6"
+ gem "fuubar", "2.0.0"
+ gem "rspec-instafail", "0.2.6", require: false
+ gem "test_after_commit", "0.4.1"
# Cucumber (integration tests)
- gem 'capybara', '2.2.1'
- gem 'database_cleaner', '1.3.0'
- gem 'selenium-webdriver', '2.42.0'
+ gem "capybara", "2.4.4"
+ gem "database_cleaner" , "1.4.1"
+ gem "selenium-webdriver", "2.45.0"
# General helpers
- gem 'factory_girl_rails', '4.4.1'
- gem 'timecop', '0.7.1'
- gem 'webmock', '1.18.0', :require => false
+ gem "factory_girl_rails", "4.5.0"
+ gem "timecop", "0.7.3"
+ gem "webmock", "1.20.4", require: false
+ gem "shoulda-matchers", "2.8.0", require: false
end
-
group :development, :test do
# RSpec (unit tests, some integration tests)
- gem "rspec-rails", '2.14.2'
+ gem "rspec-rails", "3.2.1"
# Cucumber (integration tests)
- gem 'cucumber-rails', '1.4.1', :require => false
+ gem "cucumber-rails", "1.4.2", require: false
# Jasmine (client side application tests (JS))
- gem 'jasmine', '1.3.2'
- gem 'sinon-rails', '1.9.0'
+ gem "jasmine", "2.2.0"
+ gem "jasmine-jquery-rails", "2.0.3"
+ gem "rails-assets-jasmine-ajax", "3.1.0", source: "https://rails-assets.org"
+ gem "sinon-rails", "1.10.3"
end
diff --git a/Gemfile.lock b/Gemfile.lock
index 86b6f0bc3..87cfbd191 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -1,47 +1,74 @@
GEM
remote: https://rubygems.org/
+ remote: https://rails-assets.org/
specs:
- actionmailer (3.2.20)
- actionpack (= 3.2.20)
- mail (~> 2.5.4)
- actionpack (3.2.20)
- activemodel (= 3.2.20)
- activesupport (= 3.2.20)
- builder (~> 3.0.0)
+ CFPropertyList (2.3.1)
+ actionmailer (4.2.1)
+ actionpack (= 4.2.1)
+ actionview (= 4.2.1)
+ activejob (= 4.2.1)
+ mail (~> 2.5, >= 2.5.4)
+ rails-dom-testing (~> 1.0, >= 1.0.5)
+ actionpack (4.2.1)
+ actionview (= 4.2.1)
+ activesupport (= 4.2.1)
+ rack (~> 1.6)
+ rack-test (~> 0.6.2)
+ rails-dom-testing (~> 1.0, >= 1.0.5)
+ rails-html-sanitizer (~> 1.0, >= 1.0.1)
+ actionpack-action_caching (1.1.1)
+ actionpack (>= 4.0.0, < 5.0)
+ actionpack-page_caching (1.0.2)
+ actionpack (>= 4.0.0, < 5)
+ actionview (4.2.1)
+ activesupport (= 4.2.1)
+ builder (~> 3.1)
erubis (~> 2.7.0)
- journey (~> 1.0.4)
- rack (~> 1.4.5)
- rack-cache (~> 1.2)
- rack-test (~> 0.6.1)
- sprockets (~> 2.2.1)
- activemodel (3.2.20)
- activesupport (= 3.2.20)
- builder (~> 3.0.0)
- activerecord (3.2.20)
- activemodel (= 3.2.20)
- activesupport (= 3.2.20)
- arel (~> 3.0.2)
- tzinfo (~> 0.3.29)
- activerecord-import (0.3.1)
- activerecord (~> 3.0)
- activeresource (3.2.20)
- activemodel (= 3.2.20)
- activesupport (= 3.2.20)
- activesupport (3.2.20)
- i18n (~> 0.6, >= 0.6.4)
- multi_json (~> 1.0)
- acts-as-taggable-on (3.2.6)
- activerecord (>= 3, < 5)
+ rails-dom-testing (~> 1.0, >= 1.0.5)
+ rails-html-sanitizer (~> 1.0, >= 1.0.1)
+ active_model_serializers (0.9.3)
+ activemodel (>= 3.2)
+ activejob (4.2.1)
+ activesupport (= 4.2.1)
+ globalid (>= 0.3.0)
+ activemodel (4.2.1)
+ activesupport (= 4.2.1)
+ builder (~> 3.1)
+ activerecord (4.2.1)
+ activemodel (= 4.2.1)
+ activesupport (= 4.2.1)
+ arel (~> 6.0)
+ activerecord-import (0.7.0)
+ activerecord (>= 3.0)
+ activeresource (4.0.0)
+ activemodel (~> 4.0)
+ activesupport (~> 4.0)
+ rails-observers (~> 0.1.1)
+ activesupport (4.2.1)
+ i18n (~> 0.7)
+ json (~> 1.7, >= 1.7.7)
+ minitest (~> 5.1)
+ thread_safe (~> 0.3, >= 0.3.4)
+ tzinfo (~> 1.1)
+ acts-as-taggable-on (3.5.0)
+ activerecord (>= 3.2, < 5)
acts_as_api (0.4.2)
activemodel (>= 3.0.0)
activesupport (>= 3.0.0)
rack (>= 1.1.0)
- addressable (2.3.6)
- arel (3.0.3)
- asset_sync (1.0.0)
+ addressable (2.3.7)
+ arel (6.0.0)
+ asset_sync (1.1.0)
activemodel
fog (>= 1.8.0)
- backbone-on-rails (1.1.1.0)
+ unf
+ ast (2.0.0)
+ astrolabe (1.3.0)
+ parser (>= 2.2.0.pre.3, < 3.0)
+ autoprefixer-rails (5.1.7.1)
+ execjs
+ json
+ backbone-on-rails (1.1.2.0)
actionmailer
actionpack
activemodel
@@ -50,11 +77,13 @@ GEM
ejs
jquery-rails
railties
- bcrypt (3.1.7)
- bootstrap-sass (2.2.2.0)
+ bcrypt (3.1.10)
+ bootstrap-sass (2.3.2.2)
sass (~> 3.2)
- builder (3.0.4)
- capybara (2.2.1)
+ builder (3.2.2)
+ byebug (4.0.3)
+ columnize (= 0.9.0)
+ capybara (2.4.4)
mime-types (>= 1.16)
nokogiri (>= 1.3.3)
rack (>= 1.0.0)
@@ -65,202 +94,321 @@ GEM
activesupport (>= 3.2.0)
json (>= 1.7)
mime-types (>= 1.16)
- celluloid (0.15.2)
- timers (~> 1.1.0)
- childprocess (0.5.3)
+ celluloid (0.16.0)
+ timers (~> 4.0.0)
+ childprocess (0.5.5)
ffi (~> 1.0, >= 1.0.11)
- chunky_png (1.3.1)
+ chunky_png (1.3.4)
coderay (1.1.0)
- coffee-rails (3.2.2)
+ coffee-rails (4.1.0)
coffee-script (>= 2.2.0)
- railties (~> 3.2.0)
- coffee-script (2.2.0)
+ railties (>= 4.0.0, < 5.0)
+ coffee-script (2.3.0)
coffee-script-source
execjs
- coffee-script-source (1.7.0)
- compass (0.12.6)
+ coffee-script-source (1.9.1)
+ columnize (0.9.0)
+ compass (1.0.3)
chunky_png (~> 1.2)
- fssm (>= 0.2.7)
- sass (~> 3.2.19)
- compass-rails (1.1.7)
- compass (>= 0.12.2)
- sprockets (<= 2.11.0)
- configurate (0.0.8)
- connection_pool (2.0.0)
- crack (0.4.1)
- safe_yaml (~> 0.9.0)
- cucumber (1.3.15)
+ compass-core (~> 1.0.2)
+ compass-import-once (~> 1.0.5)
+ rb-fsevent (>= 0.9.3)
+ rb-inotify (>= 0.9)
+ sass (>= 3.3.13, < 3.5)
+ compass-core (1.0.3)
+ multi_json (~> 1.0)
+ sass (>= 3.3.0, < 3.5)
+ compass-import-once (1.0.5)
+ sass (>= 3.2, < 3.5)
+ compass-rails (2.0.4)
+ compass (~> 1.0.0)
+ sass-rails (<= 5.0.1)
+ sprockets (< 2.13)
+ configurate (0.2.0)
+ connection_pool (2.1.3)
+ crack (0.4.2)
+ safe_yaml (~> 1.0.0)
+ cucumber (1.3.19)
builder (>= 2.1.2)
diff-lcs (>= 1.1.3)
gherkin (~> 2.12)
multi_json (>= 1.7.5, < 2.0)
- multi_test (>= 0.1.1)
- cucumber-rails (1.4.1)
+ multi_test (>= 0.1.2)
+ cucumber-rails (1.4.2)
capybara (>= 1.1.2, < 3)
cucumber (>= 1.3.8, < 2)
- mime-types (~> 1.16)
+ mime-types (>= 1.16, < 3)
nokogiri (~> 1.5)
rails (>= 3, < 5)
- database_cleaner (1.3.0)
- devise (3.2.4)
+ database_cleaner (1.4.1)
+ devise (3.4.1)
bcrypt (~> 3.0)
orm_adapter (~> 0.1)
railties (>= 3.2.6, < 5)
+ responders
thread_safe (~> 0.1)
warden (~> 1.2.3)
+ devise-token_authenticatable (0.3.0)
+ devise (~> 3.4.0)
devise_lastseenable (0.0.4)
devise
- devise
- rails (>= 3.0.4)
rails (>= 3.0.4)
warden
- warden
+ diaspora-vines (0.1.27)
+ activerecord (~> 4.1)
+ bcrypt (~> 3.1)
+ em-hiredis (~> 0.3.0)
+ eventmachine (>= 1.0.5, < 1.1)
+ http_parser.rb (~> 0.6)
+ nokogiri (~> 1.6)
diff-lcs (1.2.5)
+ domain_name (0.5.23)
+ unf (>= 0.0.5, < 1.0.0)
eco (1.0.0)
coffee-script
eco-source
execjs
eco-source (1.1.0.rc.1)
ejs (1.1.1)
- entypo-rails (2.2.1)
+ em-hiredis (0.3.0)
+ eventmachine (~> 1.0)
+ hiredis (~> 0.5.0)
+ entypo-rails (2.2.2)
railties (>= 3.1, <= 5)
erubis (2.7.0)
- ethon (0.7.0)
+ ethon (0.7.3)
ffi (>= 1.3.0)
- excon (0.34.0)
- execjs (2.1.0)
- factory_girl (4.4.0)
+ eventmachine (1.0.7)
+ excon (0.44.4)
+ execjs (2.4.0)
+ factory_girl (4.5.0)
activesupport (>= 3.0.0)
- factory_girl_rails (4.4.1)
- factory_girl (~> 4.4.0)
+ factory_girl_rails (4.5.0)
+ factory_girl (~> 4.5.0)
railties (>= 3.0.0)
- faraday (0.8.9)
- multipart-post (~> 1.2.0)
- faraday_middleware (0.9.0)
- faraday (>= 0.7.4, < 0.9)
- ffi (1.9.3)
+ faraday (0.9.1)
+ multipart-post (>= 1.2, < 3)
+ faraday-cookie_jar (0.0.6)
+ faraday (>= 0.7.4)
+ http-cookie (~> 1.0.0)
+ faraday_middleware (0.9.1)
+ faraday (>= 0.7.4, < 0.10)
+ ffi (1.9.8)
+ fission (0.5.0)
+ CFPropertyList (~> 2.2)
fixture_builder (0.3.6)
activerecord (>= 2)
activesupport (>= 2)
- fog (1.22.1)
- fog-brightbox
- fog-core (~> 1.22)
+ fog (1.28.0)
+ fog-atmos
+ fog-aws (~> 0.0)
+ fog-brightbox (~> 0.4)
+ fog-core (~> 1.27, >= 1.27.3)
+ fog-ecloud
fog-json
+ fog-profitbricks
+ fog-radosgw (>= 0.0.2)
+ fog-riakcs
+ fog-sakuracloud (>= 0.0.4)
+ fog-serverlove
+ fog-softlayer
+ fog-storm_on_demand
+ fog-terremark
+ fog-vmfusion
+ fog-voxel
+ fog-xml (~> 0.1.1)
ipaddress (~> 0.5)
nokogiri (~> 1.5, >= 1.5.11)
- fog-brightbox (0.0.2)
+ fog-atmos (0.1.0)
fog-core
+ fog-xml
+ fog-aws (0.1.1)
+ fog-core (~> 1.27)
+ fog-json (~> 1.0)
+ fog-xml (~> 0.1)
+ ipaddress (~> 0.8)
+ fog-brightbox (0.7.1)
+ fog-core (~> 1.22)
fog-json
- fog-core (1.22.0)
+ inflecto (~> 0.0.2)
+ fog-core (1.29.0)
builder
- excon (~> 0.33)
+ excon (~> 0.38)
formatador (~> 0.2)
mime-types
net-scp (~> 1.1)
net-ssh (>= 2.1.3)
+ fog-ecloud (0.0.2)
+ fog-core
+ fog-xml
fog-json (1.0.0)
multi_json (~> 1.0)
- font-awesome-rails (3.2.1.2)
+ fog-profitbricks (0.0.2)
+ fog-core
+ fog-xml
+ nokogiri
+ fog-radosgw (0.0.3)
+ fog-core (>= 1.21.0)
+ fog-json
+ fog-xml (>= 0.0.1)
+ fog-riakcs (0.1.0)
+ fog-core
+ fog-json
+ fog-xml
+ fog-sakuracloud (1.0.0)
+ fog-core
+ fog-json
+ fog-serverlove (0.1.1)
+ fog-core
+ fog-json
+ fog-softlayer (0.4.1)
+ fog-core
+ fog-json
+ fog-storm_on_demand (0.1.0)
+ fog-core
+ fog-json
+ fog-terremark (0.0.4)
+ fog-core
+ fog-xml
+ fog-vmfusion (0.0.1)
+ fission
+ fog-core
+ fog-voxel (0.0.2)
+ fog-core
+ fog-xml
+ fog-xml (0.1.1)
+ fog-core
+ nokogiri (~> 1.5, >= 1.5.11)
+ font-awesome-rails (4.3.0.0)
railties (>= 3.2, < 5.0)
- foreigner (1.6.1)
- activerecord (>= 3.0.0)
foreman (0.62.0)
thor (>= 0.13.6)
formatador (0.2.5)
- fssm (0.2.10)
- fuubar (1.3.3)
- rspec (>= 2.14.0, < 3.1.0)
+ fuubar (2.0.0)
+ rspec (~> 3.0)
ruby-progressbar (~> 1.4)
- galetahub-simple_captcha (0.1.5)
gherkin (2.12.2)
multi_json (~> 1.3)
- gon (5.0.4)
+ globalid (0.3.3)
+ activesupport (>= 4.1.0)
+ gon (5.2.3)
actionpack (>= 2.3.0)
json
- guard (2.6.1)
+ multi_json
+ request_store (>= 1.0.5)
+ guard (2.12.5)
formatador (>= 0.2.4)
listen (~> 2.7)
lumberjack (~> 1.0)
+ nenv (~> 0.1)
+ notiffany (~> 0.0)
pry (>= 0.9.12)
+ shellany (~> 0.0)
thor (>= 0.18.1)
- guard-cucumber (1.4.1)
- cucumber (>= 1.2.0)
- guard (>= 1.1.0)
- guard-rspec (4.2.9)
+ guard-compat (1.2.1)
+ guard-cucumber (1.5.4)
+ cucumber (>= 1.3.0)
+ guard-compat (~> 1.0)
+ nenv (~> 0.1)
+ guard-jshintrb (1.1.1)
+ guard (~> 2.0)
+ jshintrb
+ guard-rspec (4.5.0)
guard (~> 2.1)
- rspec (>= 2.14, < 4.0)
- guard-spork (1.5.1)
- childprocess (>= 0.2.3)
- guard (>= 1.1)
- spork (>= 0.8.4)
- haml (4.0.5)
- tilt
- handlebars_assets (0.12.0)
- execjs (>= 1.2.9)
- sprockets (>= 2.0.3)
+ guard-compat (~> 1.1)
+ rspec (>= 2.99.0, < 4.0)
+ guard-rubocop (1.2.0)
+ guard (~> 2.0)
+ rubocop (~> 0.20)
+ haml (4.0.6)
tilt
- hashie (2.1.1)
+ handlebars_assets (0.20.1)
+ execjs (~> 2.0)
+ multi_json (~> 1.0)
+ sprockets (~> 2.0)
+ tilt (~> 1.2)
+ hashie (3.4.0)
hike (1.2.3)
- http_accept_language (1.0.2)
- i18n (0.6.11)
+ hiredis (0.5.2)
+ hitimes (1.2.2)
+ http-cookie (1.0.2)
+ domain_name (~> 0.5)
+ http_accept_language (2.0.5)
+ http_parser.rb (0.6.0)
+ i18n (0.7.0)
i18n-inflector (2.6.7)
i18n (>= 0.4.1)
i18n-inflector-rails (1.0.7)
actionpack (>= 3.0.0)
i18n-inflector (~> 2.6)
railties (>= 3.0.0)
+ ice_cube (0.11.1)
+ inflecto (0.0.2)
ipaddress (0.8.0)
- jasmine (1.3.2)
- jasmine-core (~> 1.3.1)
- rack (~> 1.0)
- rspec (>= 1.3.1)
- selenium-webdriver (>= 0.1.3)
- jasmine-core (1.3.1)
- journey (1.0.4)
- jquery-rails (3.0.4)
+ jasmine (2.2.0)
+ jasmine-core (~> 2.2)
+ phantomjs
+ rack (>= 1.2.1)
+ rake
+ jasmine-core (2.2.0)
+ jasmine-jquery-rails (2.0.3)
+ jquery-rails (3.1.2)
railties (>= 3.0, < 5.0)
thor (>= 0.14, < 2.0)
- jquery-ui-rails (3.0.1)
- jquery-rails
- railties (>= 3.1.0)
- json (1.8.1)
- jwt (1.0.0)
- kaminari (0.15.1)
+ jquery-ui-rails (5.0.3)
+ railties (>= 3.2.16)
+ js-routes (1.0.0)
+ railties (>= 3.2)
+ sprockets-rails
+ js_image_paths (0.0.2)
+ rails (~> 4.0)
+ jshintrb (0.3.0)
+ execjs
+ multi_json (>= 1.3)
+ rake
+ json (1.8.2)
+ jwt (1.4.1)
+ kaminari (0.16.3)
actionpack (>= 3.0.0)
activesupport (>= 3.0.0)
- kgio (2.9.2)
- listen (2.7.5)
+ kgio (2.9.3)
+ listen (2.9.0)
celluloid (>= 0.15.2)
rb-fsevent (>= 0.9.3)
rb-inotify (>= 0.9)
- lumberjack (1.0.6)
- macaddr (1.6.1)
- systemu (~> 2.5.0)
- mail (2.5.4)
- mime-types (~> 1.16)
- treetop (~> 1.4.8)
+ loofah (2.0.1)
+ nokogiri (>= 1.5.9)
+ lumberjack (1.0.9)
+ macaddr (1.7.1)
+ systemu (~> 2.6.2)
+ mail (2.6.3)
+ mime-types (>= 1.16, < 3)
markerb (1.0.2)
redcarpet (>= 2.0)
messagebus_ruby_api (1.0.3)
method_source (0.8.2)
- mime-types (1.25.1)
- mini_magick (3.7.0)
- subexec (~> 0.2.1)
- mini_portile (0.5.3)
- mobile-fu (1.2.2)
+ mime-types (2.4.3)
+ mini_magick (4.2.0)
+ mini_portile (0.6.2)
+ minitest (5.5.1)
+ mobile-fu (1.3.1)
rack-mobile-detect
rails
- multi_json (1.10.1)
- multi_test (0.1.1)
+ multi_json (1.11.0)
+ multi_test (0.1.2)
multi_xml (0.5.5)
- multipart-post (1.2.0)
- mysql2 (0.3.16)
+ multipart-post (2.0.0)
+ mysql2 (0.3.18)
+ nenv (0.2.0)
nested_form (0.3.2)
net-scp (1.2.1)
net-ssh (>= 2.6.5)
- net-ssh (2.9.1)
- nokogiri (1.6.1)
- mini_portile (~> 0.5.0)
+ net-ssh (2.9.2)
+ nokogiri (1.6.6.2)
+ mini_portile (~> 0.6.0)
+ notiffany (0.0.6)
+ nenv (~> 0.1)
+ shellany (~> 0.0)
oauth (0.4.7)
oauth2 (0.9.4)
faraday (>= 0.8, < 0.10)
@@ -268,8 +416,8 @@ GEM
multi_json (~> 1.3)
multi_xml (~> 0.5)
rack (~> 1.2)
- omniauth (1.2.1)
- hashie (>= 1.2, < 3)
+ omniauth (1.2.2)
+ hashie (>= 1.2, < 4)
rack (~> 1.0)
omniauth-facebook (1.6.0)
omniauth-oauth2 (~> 1.1)
@@ -288,178 +436,257 @@ GEM
omniauth-oauth (~> 1.0)
omniauth-wordpress (0.2.1)
omniauth-oauth2 (~> 1.1.0)
- opengraph_parser (0.2.3)
- addressable
- nokogiri
+ open_graph_reader (0.5.0)
+ faraday (~> 0.9.0)
+ nokogiri (~> 1.6)
orm_adapter (0.5.0)
- polyglot (0.3.5)
- pry (0.9.12.6)
- coderay (~> 1.0)
- method_source (~> 0.8)
+ parser (2.2.0.3)
+ ast (>= 1.1, < 3.0)
+ phantomjs (1.9.8.0)
+ powerpack (0.1.0)
+ pry (0.10.1)
+ coderay (~> 1.1.0)
+ method_source (~> 0.8.1)
slop (~> 3.4)
- rack (1.4.5)
- rack-cache (1.2)
- rack (>= 0.4)
- rack-cors (0.2.9)
- rack-google-analytics (0.14.0)
+ pry-byebug (3.1.0)
+ byebug (~> 4.0)
+ pry (~> 0.10)
+ pry-debundle (0.8)
+ pry
+ rack (1.6.0)
+ rack-cors (0.3.1)
+ rack-google-analytics (1.2.0)
actionpack
activesupport
rack-mobile-detect (0.4.0)
rack
- rack-piwik (0.2.2)
- rack-pjax (0.7.0)
+ rack-piwik (0.3.0)
+ rack-pjax (0.8.0)
nokogiri (~> 1.5)
- rack (~> 1.3)
- rack-protection (1.2.0)
+ rack (~> 1.1)
+ rack-protection (1.5.3)
rack
- rack-rewrite (1.5.0)
- rack-ssl (1.3.3)
+ rack-rewrite (1.5.1)
+ rack-ssl (1.4.1)
rack
- rack-test (0.6.2)
+ rack-test (0.6.3)
rack (>= 1.0)
- rails (3.2.20)
- actionmailer (= 3.2.20)
- actionpack (= 3.2.20)
- activerecord (= 3.2.20)
- activeresource (= 3.2.20)
- activesupport (= 3.2.20)
- bundler (~> 1.0)
- railties (= 3.2.20)
- rails-i18n (0.7.4)
- i18n (~> 0.5)
- rails-timeago (2.4.0)
+ rails (4.2.1)
+ actionmailer (= 4.2.1)
+ actionpack (= 4.2.1)
+ actionview (= 4.2.1)
+ activejob (= 4.2.1)
+ activemodel (= 4.2.1)
+ activerecord (= 4.2.1)
+ activesupport (= 4.2.1)
+ bundler (>= 1.3.0, < 2.0)
+ railties (= 4.2.1)
+ sprockets-rails
+ rails-assets-diaspora_jsxc (0.1.1)
+ rails-assets-jquery (~> 1.11.1)
+ rails-assets-jquery-colorbox (~> 1.5.14)
+ rails-assets-jquery-fullscreen (~> 1.1.4)
+ rails-assets-jquery-ui (~> 1.10.4)
+ rails-assets-jquery.slimscroll (~> 1.3.3)
+ rails-assets-jasmine (2.2.1)
+ rails-assets-jasmine-ajax (3.1.0)
+ rails-assets-jasmine (~> 2.0)
+ rails-assets-jeresig--jquery.hotkeys (0.2.0)
+ rails-assets-jquery (>= 1.4.2)
+ rails-assets-jquery (1.11.1)
+ rails-assets-jquery-colorbox (1.5.15)
+ rails-assets-jquery (>= 1.3.2)
+ rails-assets-jquery-fullscreen (1.1.4)
+ rails-assets-jquery-idletimer (1.0.1)
+ rails-assets-jquery-placeholder (2.1.1)
+ rails-assets-jquery (>= 1.6)
+ rails-assets-jquery-textchange (0.2.3)
+ rails-assets-jquery
+ rails-assets-jquery-ui (1.10.4)
+ rails-assets-jquery (>= 1.6)
+ rails-assets-jquery.slimscroll (1.3.3)
+ rails-assets-jquery (>= 1.7)
+ rails-assets-markdown-it--markdown-it-for-inline (0.1.0)
+ rails-assets-markdown-it (4.2.0)
+ rails-assets-markdown-it-diaspora-mention (0.3.0)
+ rails-assets-markdown-it-hashtag (0.3.0)
+ rails-assets-markdown-it-sanitizer (0.3.0)
+ rails-assets-markdown-it-sub (1.0.0)
+ rails-assets-markdown-it-sup (1.0.0)
+ rails-assets-perfect-scrollbar (0.5.9)
+ rails-assets-jquery (>= 1.10)
+ rails-deprecated_sanitizer (1.0.3)
+ activesupport (>= 4.2.0.alpha)
+ rails-dom-testing (1.0.6)
+ activesupport (>= 4.2.0.beta, < 5.0)
+ nokogiri (~> 1.6.0)
+ rails-deprecated_sanitizer (>= 1.0.1)
+ rails-html-sanitizer (1.0.2)
+ loofah (~> 2.0)
+ rails-i18n (4.0.4)
+ i18n (~> 0.6)
+ railties (~> 4.0)
+ rails-observers (0.1.2)
+ activemodel (~> 4.0)
+ rails-timeago (2.11.0)
actionpack (>= 3.1)
activesupport (>= 3.1)
- rails_admin (0.4.9)
- bootstrap-sass (~> 2.2)
- builder (~> 3.0)
- coffee-rails (>= 3.1, < 5)
- font-awesome-rails (~> 3.0)
+ rails_admin (0.6.7)
+ builder (~> 3.1)
+ coffee-rails (~> 4.0)
+ font-awesome-rails (>= 3.0, < 5)
haml (~> 4.0)
- jquery-rails (>= 2.1, < 4)
- jquery-ui-rails (~> 3.0)
+ jquery-rails (>= 3.0, < 5)
+ jquery-ui-rails (~> 5.0)
kaminari (~> 0.14)
nested_form (~> 0.3)
- rack-pjax (~> 0.6)
- rails (~> 3.1)
+ rack-pjax (~> 0.7)
+ rails (~> 4.0)
remotipart (~> 1.0)
- safe_yaml (~> 0.6)
- sass-rails (~> 3.1)
- rails_autolink (1.1.5)
- rails (> 3.1)
- railties (3.2.20)
- actionpack (= 3.2.20)
- activesupport (= 3.2.20)
- rack-ssl (~> 1.3.2)
+ safe_yaml (~> 1.0)
+ sass-rails (>= 4.0, < 6)
+ railties (4.2.1)
+ actionpack (= 4.2.1)
+ activesupport (= 4.2.1)
rake (>= 0.8.7)
- rdoc (~> 3.4)
- thor (>= 0.14.6, < 2.0)
+ thor (>= 0.18.1, < 2.0)
+ rainbow (2.0.0)
raindrops (0.13.0)
- rake (10.3.2)
+ rake (10.4.2)
rb-fsevent (0.9.4)
- rb-inotify (0.9.4)
+ rb-inotify (0.9.5)
ffi (>= 0.5.0)
- rdoc (3.12.2)
- json (~> 1.4)
redcarpet (3.2.3)
- redis (3.1.0)
+ redis (3.2.1)
redis-namespace (1.5.1)
redis (~> 3.0, >= 3.0.4)
remotipart (1.2.1)
+ request_store (1.1.0)
+ responders (2.1.0)
+ railties (>= 4.2.0, < 5)
roxml (3.1.6)
activesupport (>= 2.3.0)
nokogiri (>= 1.3.3)
- rspec (2.14.1)
- rspec-core (~> 2.14.0)
- rspec-expectations (~> 2.14.0)
- rspec-mocks (~> 2.14.0)
- rspec-core (2.14.8)
- rspec-expectations (2.14.5)
- diff-lcs (>= 1.1.3, < 2.0)
- rspec-instafail (0.2.4)
- rspec-mocks (2.14.6)
- rspec-rails (2.14.2)
- actionpack (>= 3.0)
- activemodel (>= 3.0)
- activesupport (>= 3.0)
- railties (>= 3.0)
- rspec-core (~> 2.14.0)
- rspec-expectations (~> 2.14.0)
- rspec-mocks (~> 2.14.0)
- ruby-oembed (0.8.9)
- ruby-progressbar (1.5.1)
- rubyzip (1.1.4)
- safe_yaml (0.9.7)
- sass (3.2.19)
- sass-rails (3.2.6)
- railties (~> 3.2.0)
- sass (>= 3.1.10)
- tilt (~> 1.3)
- selenium-webdriver (2.42.0)
- childprocess (>= 0.5.0)
+ rspec (3.2.0)
+ rspec-core (~> 3.2.0)
+ rspec-expectations (~> 3.2.0)
+ rspec-mocks (~> 3.2.0)
+ rspec-core (3.2.2)
+ rspec-support (~> 3.2.0)
+ rspec-expectations (3.2.0)
+ diff-lcs (>= 1.2.0, < 2.0)
+ rspec-support (~> 3.2.0)
+ rspec-instafail (0.2.6)
+ rspec
+ rspec-mocks (3.2.1)
+ diff-lcs (>= 1.2.0, < 2.0)
+ rspec-support (~> 3.2.0)
+ rspec-rails (3.2.1)
+ actionpack (>= 3.0, < 4.3)
+ activesupport (>= 3.0, < 4.3)
+ railties (>= 3.0, < 4.3)
+ rspec-core (~> 3.2.0)
+ rspec-expectations (~> 3.2.0)
+ rspec-mocks (~> 3.2.0)
+ rspec-support (~> 3.2.0)
+ rspec-support (3.2.2)
+ rubocop (0.29.1)
+ astrolabe (~> 1.3)
+ parser (>= 2.2.0.1, < 3.0)
+ powerpack (~> 0.1)
+ rainbow (>= 1.99.1, < 3.0)
+ ruby-progressbar (~> 1.4)
+ ruby-oembed (0.8.12)
+ ruby-progressbar (1.7.5)
+ rubyzip (1.1.7)
+ safe_yaml (1.0.4)
+ sass (3.4.13)
+ sass-rails (5.0.1)
+ railties (>= 4.0.0, < 5.0)
+ sass (~> 3.1)
+ sprockets (>= 2.8, < 4.0)
+ sprockets-rails (>= 2.0, < 4.0)
+ tilt (~> 1.1)
+ selenium-webdriver (2.45.0)
+ childprocess (~> 0.5)
multi_json (~> 1.0)
rubyzip (~> 1.0)
- websocket (~> 1.0.4)
- sidekiq (2.17.7)
- celluloid (>= 0.15.2)
- connection_pool (>= 1.0.0)
+ websocket (~> 1.0)
+ shellany (0.0.1)
+ shoulda-matchers (2.8.0)
+ activesupport (>= 3.0.0)
+ sidekiq (3.3.3)
+ celluloid (>= 0.16.0)
+ connection_pool (>= 2.1.1)
json
redis (>= 3.0.6)
redis-namespace (>= 1.3.1)
+ sidetiq (0.6.3)
+ celluloid (>= 0.14.1)
+ ice_cube (= 0.11.1)
+ sidekiq (>= 3.0.0)
+ simple_captcha2 (0.3.4)
+ rails (>= 4.1)
simple_oauth (0.2.0)
- sinatra (1.3.3)
- rack (~> 1.3, >= 1.3.6)
- rack-protection (~> 1.2)
- tilt (~> 1.3, >= 1.3.3)
- sinon-rails (1.9.0)
+ sinatra (1.4.6)
+ rack (~> 1.4)
+ rack-protection (~> 1.4)
+ tilt (>= 1.3, < 3)
+ sinon-rails (1.10.3)
railties (>= 3.1)
- slop (3.5.0)
- spork (1.0.0rc4)
- sprockets (2.2.3)
+ slop (3.6.0)
+ spring (1.3.3)
+ spring-commands-cucumber (1.0.1)
+ spring (>= 0.9.1)
+ spring-commands-rspec (1.0.4)
+ spring (>= 0.9.1)
+ sprockets (2.12.3)
hike (~> 1.2)
multi_json (~> 1.0)
rack (~> 1.0)
tilt (~> 1.1, != 1.3.0)
- strong_parameters (0.2.3)
- actionpack (~> 3.0)
- activemodel (~> 3.0)
- activesupport (~> 3.0)
- railties (~> 3.0)
- subexec (0.2.3)
- systemu (2.5.2)
- test_after_commit (0.2.3)
+ sprockets-rails (2.2.4)
+ actionpack (>= 3.0)
+ activesupport (>= 3.0)
+ sprockets (>= 2.8, < 4.0)
+ systemu (2.6.5)
+ test_after_commit (0.4.1)
+ activerecord (>= 3.2)
thor (0.19.1)
- thread_safe (0.3.4)
+ thread_safe (0.3.5)
tilt (1.4.1)
- timecop (0.7.1)
- timers (1.1.0)
- treetop (1.4.15)
- polyglot
- polyglot (>= 0.3.1)
+ timecop (0.7.3)
+ timers (4.0.1)
+ hitimes
twitter (4.8.1)
faraday (~> 0.8, < 0.10)
multi_json (~> 1.0)
simple_oauth (~> 0.2)
- typhoeus (0.6.8)
- ethon (>= 0.7.0)
- tzinfo (0.3.42)
- uglifier (2.5.0)
+ twitter-text (1.11.0)
+ unf (~> 0.1.0)
+ typhoeus (0.7.1)
+ ethon (>= 0.7.1)
+ tzinfo (1.2.2)
+ thread_safe (~> 0.1)
+ uglifier (2.7.1)
execjs (>= 0.3.0)
json (>= 1.8.0)
+ unf (0.1.4)
+ unf_ext
+ unf_ext (0.0.6)
unicorn (4.8.3)
kgio (~> 2.6)
rack
raindrops (~> 0.7)
uuid (2.3.7)
macaddr (~> 1.0)
- rack (>= 1.0)
warden (1.2.3)
rack (>= 1.0)
- webmock (1.18.0)
+ webmock (1.20.4)
addressable (>= 2.3.6)
crack (>= 0.3.2)
- websocket (1.0.7)
- will_paginate (3.0.5)
+ websocket (1.2.1)
+ will_paginate (3.0.7)
xpath (2.0.0)
nokogiri (~> 1.3)
zip-zip (0.3)
@@ -469,87 +696,123 @@ PLATFORMS
ruby
DEPENDENCIES
- activerecord-import (= 0.3.1)
- acts-as-taggable-on (= 3.2.6)
+ actionpack-action_caching
+ actionpack-page_caching
+ active_model_serializers (= 0.9.3)
+ activerecord-import (= 0.7.0)
+ acts-as-taggable-on (= 3.5.0)
acts_as_api (= 0.4.2)
- addressable (= 2.3.6)
- asset_sync (= 1.0.0)
- backbone-on-rails (= 1.1.1)
- bootstrap-sass (= 2.2.2.0)
- capybara (= 2.2.1)
+ addressable (= 2.3.7)
+ asset_sync (= 1.1.0)
+ autoprefixer-rails (= 5.1.7.1)
+ backbone-on-rails (= 1.1.2)
+ bootstrap-sass (= 2.3.2.2)
+ capybara (= 2.4.4)
carrierwave (= 0.10.0)
- compass-rails (= 1.1.7)
- configurate (= 0.0.8)
- cucumber-rails (= 1.4.1)
- database_cleaner (= 1.3.0)
- devise (= 3.2.4)
+ compass-rails (= 2.0.4)
+ configurate (= 0.2.0)
+ cucumber-rails (= 1.4.2)
+ database_cleaner (= 1.4.1)
+ devise (= 3.4.1)
+ devise-token_authenticatable (~> 0.3.0)
devise_lastseenable (= 0.0.4)
- entypo-rails (= 2.2.1)
- factory_girl_rails (= 4.4.1)
- faraday (= 0.8.9)
- faraday_middleware (= 0.9.0)
+ diaspora-vines (~> 0.1.27)
+ entypo-rails (= 2.2.2)
+ factory_girl_rails (= 4.5.0)
+ faraday (= 0.9.1)
+ faraday-cookie_jar (= 0.0.6)
+ faraday_middleware (= 0.9.1)
fixture_builder (= 0.3.6)
- fog (= 1.22.1)
- foreigner (= 1.6.1)
+ fog (= 1.28.0)
foreman (= 0.62)
- fuubar (= 1.3.3)
- galetahub-simple_captcha (= 0.1.5)
- gon (= 5.0.4)
- guard-cucumber (= 1.4.1)
- guard-rspec (= 4.2.9)
- guard-spork (= 1.5.1)
- haml (= 4.0.5)
- handlebars_assets (= 0.12.0)
- http_accept_language (= 1.0.2)
+ fuubar (= 2.0.0)
+ gon (= 5.2.3)
+ guard (= 2.12.5)
+ guard-cucumber (= 1.5.4)
+ guard-jshintrb (= 1.1.1)
+ guard-rspec (= 4.5.0)
+ guard-rubocop (= 1.2.0)
+ haml (= 4.0.6)
+ handlebars_assets (= 0.20.1)
+ http_accept_language (= 2.0.5)
i18n-inflector-rails (= 1.0.7)
- jasmine (= 1.3.2)
- jquery-rails (= 3.0.4)
- json (= 1.8.1)
+ jasmine (= 2.2.0)
+ jasmine-jquery-rails (= 2.0.3)
+ jquery-rails (= 3.1.2)
+ js-routes (= 1.0.0)
+ js_image_paths (= 0.0.2)
+ jshintrb (= 0.3.0)
+ json (= 1.8.2)
markerb (= 1.0.2)
messagebus_ruby_api (= 1.0.3)
- mini_magick (= 3.7.0)
- mobile-fu (= 1.2.2)
- mysql2 (= 0.3.16)
- nokogiri (= 1.6.1)
- omniauth (= 1.2.1)
+ mini_magick (= 4.2.0)
+ minitest
+ mobile-fu (= 1.3.1)
+ mysql2 (= 0.3.18)
+ nokogiri (= 1.6.6.2)
+ omniauth (= 1.2.2)
omniauth-facebook (= 1.6.0)
omniauth-tumblr (= 1.1)
omniauth-twitter (= 1.0.1)
omniauth-wordpress (= 0.2.1)
- opengraph_parser (= 0.2.3)
- rack-cors (= 0.2.9)
- rack-google-analytics (= 0.14.0)
- rack-piwik (= 0.2.2)
- rack-protection (= 1.2)
- rack-rewrite (= 1.5.0)
- rack-ssl (= 1.3.3)
- rails (= 3.2.20)
- rails-i18n (= 0.7.4)
- rails-timeago (= 2.4.0)
- rails_admin (= 0.4.9)
- rails_autolink (= 1.1.5)
+ open_graph_reader (= 0.5.0)
+ pry
+ pry-byebug
+ pry-debundle
+ rack-cors (= 0.3.1)
+ rack-google-analytics (= 1.2.0)
+ rack-piwik (= 0.3.0)
+ rack-protection (= 1.5.3)
+ rack-rewrite (= 1.5.1)
+ rack-ssl (= 1.4.1)
+ rails (= 4.2.1)
+ rails-assets-diaspora_jsxc (~> 0.1.1)!
+ rails-assets-jasmine-ajax (= 3.1.0)!
+ rails-assets-jeresig--jquery.hotkeys (= 0.2.0)!
+ rails-assets-jquery (= 1.11.1)!
+ rails-assets-jquery-idletimer (= 1.0.1)!
+ rails-assets-jquery-placeholder (= 2.1.1)!
+ rails-assets-jquery-textchange (= 0.2.3)!
+ rails-assets-markdown-it (= 4.2.0)!
+ rails-assets-markdown-it--markdown-it-for-inline (= 0.1.0)!
+ rails-assets-markdown-it-diaspora-mention (= 0.3.0)!
+ rails-assets-markdown-it-hashtag (= 0.3.0)!
+ rails-assets-markdown-it-sanitizer (= 0.3.0)!
+ rails-assets-markdown-it-sub (= 1.0.0)!
+ rails-assets-markdown-it-sup (= 1.0.0)!
+ rails-assets-perfect-scrollbar (= 0.5.9)!
+ rails-i18n (= 4.0.4)
+ rails-timeago (= 2.11.0)
+ rails_admin (= 0.6.7)
rb-fsevent (= 0.9.4)
- rb-inotify (= 0.9.4)
+ rb-inotify (= 0.9.5)
redcarpet (= 3.2.3)
remotipart (= 1.2.1)
+ responders (= 2.1.0)
roxml (= 3.1.6)
- rspec-instafail (= 0.2.4)
- rspec-rails (= 2.14.2)
- ruby-oembed (= 0.8.9)
- sass-rails (= 3.2.6)
- selenium-webdriver (= 2.42.0)
- sidekiq (= 2.17.7)
- sinatra (= 1.3.3)
- sinon-rails (= 1.9.0)
- spork (= 1.0.0rc4)
- strong_parameters (= 0.2.3)
- test_after_commit (= 0.2.3)
- timecop (= 0.7.1)
+ rspec-instafail (= 0.2.6)
+ rspec-rails (= 3.2.1)
+ rubocop (= 0.29.1)
+ ruby-oembed (= 0.8.12)
+ sass-rails (= 5.0.1)
+ selenium-webdriver (= 2.45.0)
+ shoulda-matchers (= 2.8.0)
+ sidekiq (= 3.3.3)
+ sidetiq (= 0.6.3)
+ simple_captcha2 (= 0.3.4)
+ sinatra (= 1.4.6)
+ sinon-rails (= 1.10.3)
+ spring (= 1.3.3)
+ spring-commands-cucumber (= 1.0.1)
+ spring-commands-rspec (= 1.0.4)
+ test_after_commit (= 0.4.1)
+ timecop (= 0.7.3)
twitter (= 4.8.1)
- typhoeus (= 0.6.8)
- uglifier (= 2.5.0)
+ twitter-text (= 1.11.0)
+ typhoeus (= 0.7.1)
+ uglifier (= 2.7.1)
unicorn (= 4.8.3)
uuid (= 2.3.7)
- webmock (= 1.18.0)
- will_paginate (= 3.0.5)
+ webmock (= 1.20.4)
+ will_paginate (= 3.0.7)
zip-zip
diff --git a/Guardfile b/Guardfile
index 6da0408e0..ec3eade0c 100644
--- a/Guardfile
+++ b/Guardfile
@@ -1,38 +1,45 @@
-# A sample Guardfile
-# More info at https://github.com/guard/guard#readme
-# also, http://asciicasts.com/episodes/264-guard
-guard 'rspec', :all_on_start => false, :all_after_pass => false do
- watch(%r{^spec/.+_spec\.rb$})
- watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
- watch('spec/spec_helper.rb') { "spec" }
+guard :rspec, cmd: "bin/spring rspec", all_on_start: false, all_after_pass: false do
+ watch(/^spec\/.+_spec\.rb$/)
+ watch(/^lib\/(.+)\.rb$/) {|m| "spec/lib/#{m[1]}_spec.rb" }
+ watch(/spec\/spec_helper.rb/) { "spec" }
# Rails example
- watch(%r{^spec/.+_spec\.rb$})
- watch(%r{^app/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
- watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
- watch(%r{^app/controllers/(.+)_(controller)\.rb$}) { |m| ["spec/routing/#{m[1]}_routing_spec.rb", "spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb", "spec/acceptance/#{m[1]}_spec.rb"] }
+ watch(/^spec\/.+_spec\.rb$/)
+ watch(/^app\/(.+)\.rb$/) {|m| "spec/#{m[1]}_spec.rb" }
+ watch(/^lib\/(.+)\.rb$/) {|m| "spec/lib/#{m[1]}_spec.rb" }
+ watch(%r{^app/controllers/(.+)_(controller)\.rb$}) {|m|
+ ["spec/routing/#{m[1]}_routing_spec.rb",
+ "spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb",
+ "spec/acceptance/#{m[1]}_spec.rb"]
+ }
watch(%r{^spec/support/(.+)\.rb$}) { "spec" }
- watch('spec/spec_helper.rb') { "spec" }
- watch('config/routes.rb') { "spec/routing" }
- watch('app/controllers/application_controller.rb') { "spec/controllers" }
+ watch("spec/spec_helper.rb") { "spec" }
+ watch("config/routes.rb") { "spec/routing" }
+ watch("app/controllers/application_controller.rb") { "spec/controllers" }
+
# Capybara request specs
- watch(%r{^app/views/(.+)/.*\.(erb|haml)$}) { |m| "spec/requests/#{m[1]}_spec.rb" }
+ watch(%r{^app/views/(.+)/.*\.(erb|haml)$}) {|m| "spec/requests/#{m[1]}_spec.rb" }
+end
+
+guard(:cucumber,
+ command_prefix: "bin/spring",
+ bundler: false,
+ all_on_start: false,
+ all_after_pass: false) do
+ watch(/^features\/.+\.feature$/)
+ watch(%r{^features/support/.+$}) { "features" }
+ watch(%r{^features/step_definitions/(.+)_steps\.rb$}) {|m|
+ Dir[File.join("**/#{m[1]}.feature")][0] || "features"
+ }
end
-guard 'spork', :cucumber_env => { 'RAILS_ENV' => 'test' }, :rspec_env => { 'RAILS_ENV' => 'test' }, :all_on_start => false, :all_after_pass => false, :wait => 70 do
- watch('config/application.rb')
- watch('config/environment.rb')
- watch(%r{^config/environments/.+\.rb$})
- watch(%r{^config/initializers/.+\.rb$})
- watch('Gemfile')
- watch('Gemfile.lock')
- watch('spec/spec_helper.rb') { :rspec }
- watch('test/test_helper.rb') { :test_unit }
- watch(%r{features/support/}) { :cucumber }
+guard :rubocop, all_on_start: false, keep_failed: false do
+ watch(/(?:app|config|db|lib|features|spec)\/.+\.rb$/)
+ watch(/(config.ru|Gemfile|Guardfile|Rakefile)$/)
end
-guard 'cucumber', :all_on_start => false, :all_after_pass => false do
- watch(%r{^features/.+\.feature$})
- watch(%r{^features/support/.+$}) { 'features' }
- watch(%r{^features/step_definitions/(.+)_steps\.rb$}) { |m| Dir[File.join("**/#{m[1]}.feature")][0] || 'features' }
+guard :jshintrb do
+ watch(/^app\/assets\/javascripts\/.+\.js$/)
+ watch(/^lib\/assets\/javascripts\/.+\.js$/)
+ watch(/^spec\/javascripts\/.+\.js$/)
end
diff --git a/Procfile b/Procfile
index 109ee2337..4119cf536 100644
--- a/Procfile
+++ b/Procfile
@@ -1,2 +1,3 @@
-web: bundle exec unicorn_rails -c config/unicorn.rb -p $PORT
-sidekiq: bundle exec sidekiq
+web: bin/bundle exec unicorn_rails -c config/unicorn.rb -p $PORT
+sidekiq: bin/bundle exec sidekiq
+xmpp: bin/bundle exec vines start
diff --git a/README.md b/README.md
index ba5e33104..d3d76092e 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,5 @@
# diaspora*
-### a privacy aware, distributed, open source social network
+### a privacy-aware, distributed, open source social network
**master:** [![Build Status master](https://secure.travis-ci.org/diaspora/diaspora.png?branch=master)](http://travis-ci.org/diaspora/diaspora)
**develop:** [![Build Status develop](https://secure.travis-ci.org/diaspora/diaspora.png?branch=develop)](http://travis-ci.org/diaspora/diaspora) |
diff --git a/app/assets/images/branding/header-logo_hover.png b/app/assets/images/branding/header-logo_hover.png
new file mode 100644
index 000000000..dae58b943
--- /dev/null
+++ b/app/assets/images/branding/header-logo_hover.png
Binary files differ
diff --git a/app/assets/images/close_label.png b/app/assets/images/close_label.png
deleted file mode 100644
index 53aa1d3ce..000000000
--- a/app/assets/images/close_label.png
+++ /dev/null
Binary files differ
diff --git a/app/assets/images/facebox/loading.gif b/app/assets/images/facebox/loading.gif
index f864d5fd3..f864d5fd3 100755..100644
--- a/app/assets/images/facebox/loading.gif
+++ b/app/assets/images/facebox/loading.gif
Binary files differ
diff --git a/app/assets/images/icons/circle.png b/app/assets/images/icons/circle.png
deleted file mode 100644
index 944a88391..000000000
--- a/app/assets/images/icons/circle.png
+++ /dev/null
Binary files differ
diff --git a/app/assets/images/icons/create_participation.png b/app/assets/images/icons/create_participation.png
new file mode 100644
index 000000000..7496495b9
--- /dev/null
+++ b/app/assets/images/icons/create_participation.png
Binary files differ
diff --git a/app/assets/images/icons/destroy_participation.png b/app/assets/images/icons/destroy_participation.png
new file mode 100644
index 000000000..f13d187a6
--- /dev/null
+++ b/app/assets/images/icons/destroy_participation.png
Binary files differ
diff --git a/app/assets/images/icons/menu.png b/app/assets/images/icons/menu.png
index 59b11180c..59b11180c 100755..100644
--- a/app/assets/images/icons/menu.png
+++ b/app/assets/images/icons/menu.png
Binary files differ
diff --git a/public/peeping-tom.png b/app/assets/images/peeping-tom.png
index e35c0a1f7..e35c0a1f7 100644
--- a/public/peeping-tom.png
+++ b/app/assets/images/peeping-tom.png
Binary files differ
diff --git a/app/assets/javascripts/app/app.js b/app/assets/javascripts/app/app.js
index efb3232a8..de6913f21 100644
--- a/app/assets/javascripts/app/app.js
+++ b/app/assets/javascripts/app/app.js
@@ -1,3 +1,5 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
//= require_self
//= require_tree ./helpers
@@ -12,6 +14,8 @@
//= require_tree ./collections
//= require_tree ./views
+//= require perfect-scrollbar
+
var app = {
collections: {},
models: {},
@@ -31,13 +35,11 @@ var app = {
events: _.extend({}, Backbone.Events),
user: function(userAttrs) {
- if(userAttrs) { return this._user = new app.models.User(userAttrs) }
- return this._user || false
- },
-
- baseImageUrl: function(baseUrl){
- if(baseUrl) { return this._baseImageUrl = baseUrl }
- return this._baseImageUrl || "assets/"
+ if(userAttrs) {
+ this._user = new app.models.User(userAttrs);
+ return this._user;
+ }
+ return this._user || false;
},
initialize: function() {
@@ -53,25 +55,25 @@ var app = {
},
hasPreload : function(prop) {
- return !!(window.gon.preloads && window.gon.preloads[prop]) //returning boolean variable so that parsePreloads, which cleans up properly is used instead
+ return !!(window.gon.preloads && window.gon.preloads[prop]); //returning boolean variable so that parsePreloads, which cleans up properly is used instead
},
setPreload : function(prop, val) {
- window.gon.preloads = window.gon.preloads || {}
- window.gon.preloads[prop] = val
+ window.gon.preloads = window.gon.preloads || {};
+ window.gon.preloads[prop] = val;
},
parsePreload : function(prop) {
if(!app.hasPreload(prop)) { return }
- var preload = window.gon.preloads[prop]
- delete window.gon.preloads[prop] //prevent dirty state across navigates
+ var preload = window.gon.preloads[prop];
+ delete window.gon.preloads[prop]; //prevent dirty state across navigates
- return(preload)
+ return(preload);
},
setupDummyPreloads: function() {
- if (window.gon == undefined) {
+ if (window.gon === undefined) {
window.gon = {preloads:{}};
}
},
@@ -89,8 +91,8 @@ var app = {
},
setupFacebox: function() {
- $.facebox.settings.closeImage = app.baseImageUrl()+'facebox/closelabel.png';
- $.facebox.settings.loadingImage = app.baseImageUrl()+'facebox/loading.gif';
+ $.facebox.settings.closeImage = ImagePaths.get('facebox/closelabel.png');
+ $.facebox.settings.loadingImage = ImagePaths.get('facebox/loading.gif');
$.facebox.settings.opacity = 0.75;
},
@@ -102,14 +104,13 @@ var app = {
evt.preventDefault();
var link = $(this);
- $(".stream_title").text(link.text())
- app.router.navigate(link.attr("href").substring(1) ,true)
+ $(".stream_title").text(link.text());
+ app.router.navigate(link.attr("href").substring(1) ,true);
});
},
setupGlobalViews: function() {
app.hovercard = new app.views.Hovercard();
- app.aspectMembershipsBlueprint = new app.views.AspectMembershipBlueprint();
$('.aspect_membership_dropdown').each(function(){
new app.views.AspectMembership({el: this});
});
@@ -119,7 +120,7 @@ var app = {
/* mixpanel wrapper function */
instrument : function(type, name, object, callback) {
if(!window.mixpanel) { return }
- window.mixpanel[type](name, object, callback)
+ window.mixpanel[type](name, object, callback);
},
setupDisabledLinks: function() {
@@ -132,3 +133,4 @@ var app = {
$(function() {
app.initialize();
});
+// @license-end
diff --git a/app/assets/javascripts/app/collections/aspect_memberships.js b/app/assets/javascripts/app/collections/aspect_memberships.js
new file mode 100644
index 000000000..dc3c0410b
--- /dev/null
+++ b/app/assets/javascripts/app/collections/aspect_memberships.js
@@ -0,0 +1,6 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
+app.collections.AspectMemberships = Backbone.Collection.extend({
+ model: app.models.AspectMembership
+});
+// @license-end
diff --git a/app/assets/javascripts/app/collections/aspects.js b/app/assets/javascripts/app/collections/aspects.js
index 33c9cb56c..1e284274b 100644
--- a/app/assets/javascripts/app/collections/aspects.js
+++ b/app/assets/javascripts/app/collections/aspects.js
@@ -1,3 +1,5 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
app.collections.Aspects = Backbone.Collection.extend({
model: app.models.Aspect,
@@ -23,4 +25,5 @@ app.collections.Aspects = Backbone.Collection.extend({
var separator = Diaspora.I18n.t("comma") + ' ';
return this.selectedAspects('name').join(separator).replace(/,\s([^,]+)$/, ' ' + Diaspora.I18n.t("and") + ' $1') || Diaspora.I18n.t("my_aspects");
}
-})
+});
+// @license-end
diff --git a/app/assets/javascripts/app/collections/comments.js b/app/assets/javascripts/app/collections/comments.js
index 06ae95fe2..f096363e0 100644
--- a/app/assets/javascripts/app/collections/comments.js
+++ b/app/assets/javascripts/app/collections/comments.js
@@ -1,3 +1,5 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
app.collections.Comments = Backbone.Collection.extend({
model: app.models.Comment,
url: function() { return _.result(this.post, 'url') + '/comments'; },
@@ -14,11 +16,12 @@ app.collections.Comments = Backbone.Collection.extend({
var deferred = comment.save({}, {
url: '/posts/'+this.post.id+'/comments',
success: function() {
- comment.set({author: app.currentUser.toJSON(), parent: self.post })
- self.add(comment)
+ comment.set({author: app.currentUser.toJSON(), parent: self.post });
+ self.add(comment);
}
});
return deferred;
}
});
+// @license-end
diff --git a/app/assets/javascripts/app/collections/contacts.js b/app/assets/javascripts/app/collections/contacts.js
new file mode 100644
index 000000000..d0592155f
--- /dev/null
+++ b/app/assets/javascripts/app/collections/contacts.js
@@ -0,0 +1,21 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
+app.collections.Contacts = Backbone.Collection.extend({
+ model: app.models.Contact,
+
+ comparator : function(con1, con2) {
+ if( !con1.person || !con2.person ) return 1;
+
+ if(app.aspect) {
+ var inAspect1 = con1.inAspect(app.aspect.get('id'));
+ var inAspect2 = con2.inAspect(app.aspect.get('id'));
+ if( inAspect1 && !inAspect2 ) return -1;
+ if( !inAspect1 && inAspect2 ) return 1;
+ }
+
+ var n1 = con1.person.get('name');
+ var n2 = con2.person.get('name');
+ return n1.localeCompare(n2);
+ }
+});
+// @license-end
diff --git a/app/assets/javascripts/app/collections/likes.js b/app/assets/javascripts/app/collections/likes.js
index 01831d4f9..76168237b 100644
--- a/app/assets/javascripts/app/collections/likes.js
+++ b/app/assets/javascripts/app/collections/likes.js
@@ -1,7 +1,10 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
app.collections.Likes = Backbone.Collection.extend({
model: app.models.Like,
initialize : function(models, options) {
- this.url = "/posts/" + options.post.id + "/likes" //not delegating to post.url() because when it is in a stream collection it delegates to that url
+ this.url = "/posts/" + options.post.id + "/likes"; //not delegating to post.url() because when it is in a stream collection it delegates to that url
}
});
+// @license-end
diff --git a/app/assets/javascripts/app/collections/photos.js b/app/assets/javascripts/app/collections/photos.js
index 40c960b23..978858304 100644
--- a/app/assets/javascripts/app/collections/photos.js
+++ b/app/assets/javascripts/app/collections/photos.js
@@ -1,8 +1,10 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
app.collections.Photos = Backbone.Collection.extend({
url : "/photos",
model: function(attrs, options) {
- var modelClass = app.models.Photo
+ var modelClass = app.models.Photo;
return new modelClass(attrs, options);
},
@@ -10,3 +12,4 @@ app.collections.Photos = Backbone.Collection.extend({
return resp.photos;
}
});
+// @license-end
diff --git a/app/assets/javascripts/app/collections/posts.js b/app/assets/javascripts/app/collections/posts.js
index 47c60b682..fc5fe1bbe 100644
--- a/app/assets/javascripts/app/collections/posts.js
+++ b/app/assets/javascripts/app/collections/posts.js
@@ -1,4 +1,8 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
app.collections.Posts = Backbone.Collection.extend({
model: app.models.Post,
url : "/posts"
});
+// @license-end
+
diff --git a/app/assets/javascripts/app/collections/reshares.js b/app/assets/javascripts/app/collections/reshares.js
index d2c74c8e5..28ce59c24 100644
--- a/app/assets/javascripts/app/collections/reshares.js
+++ b/app/assets/javascripts/app/collections/reshares.js
@@ -1,4 +1,8 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
app.collections.Reshares = Backbone.Collection.extend({
model: app.models.Reshare,
url : "/reshares"
});
+// @license-end
+
diff --git a/app/assets/javascripts/app/collections/tag_followings.js b/app/assets/javascripts/app/collections/tag_followings.js
index 870878ba7..091827827 100644
--- a/app/assets/javascripts/app/collections/tag_followings.js
+++ b/app/assets/javascripts/app/collections/tag_followings.js
@@ -1,3 +1,5 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
app.collections.TagFollowings = Backbone.Collection.extend({
model: app.models.TagFollowing,
@@ -17,3 +19,5 @@ app.collections.TagFollowings = Backbone.Collection.extend({
}
});
+// @license-end
+
diff --git a/app/assets/javascripts/app/helpers/date_formatter.js b/app/assets/javascripts/app/helpers/date_formatter.js
index beb2d468a..395e55f65 100644
--- a/app/assets/javascripts/app/helpers/date_formatter.js
+++ b/app/assets/javascripts/app/helpers/date_formatter.js
@@ -1,3 +1,5 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
(function(){
app.helpers.dateFormatter = {
parse:function (dateString) {
@@ -12,5 +14,6 @@
return timestamp || 0;
}
- }
+ };
})();
+// @license-end
diff --git a/app/assets/javascripts/app/helpers/direction_detector.js b/app/assets/javascripts/app/helpers/direction_detector.js
new file mode 100644
index 000000000..2449aeead
--- /dev/null
+++ b/app/assets/javascripts/app/helpers/direction_detector.js
@@ -0,0 +1,95 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
+(function() {
+ app.helpers.txtDirection = {
+ setCssFor: function(str, on_element) {
+ if( this.isRTL(str) ) {
+ $(on_element).css('direction', 'rtl');
+ } else {
+ $(on_element).css('direction', 'ltr');
+ }
+ },
+
+ classFor: function(str) {
+ if( this.isRTL(str) ) return 'rtl';
+ return 'ltr';
+ },
+
+ isRTL: function(str) {
+ if(typeof str !== "string" || str.length < 1) {
+ return false;
+ }
+
+ var charCode = this._fixedCharCodeAt(str, 0);
+ if(charCode >= 1536 && charCode <= 1791) // Sarabic, Persian, ...
+ return true;
+
+ else if(charCode >= 65136 && charCode <= 65279) // Arabic present 1
+ return true;
+
+ else if(charCode >= 64336 && charCode <= 65023) // Arabic present 2
+ return true;
+
+ else if(charCode>=1424 && charCode<=1535) // Hebrew
+ return true;
+
+ else if(charCode>=64256 && charCode<=64335) // Hebrew present
+ return true;
+
+ else if(charCode>=68096 && charCode<=68184) // Kharoshthi
+ return true;
+
+ else if(charCode>=67840 && charCode<=67871) // Phoenician
+ return true;
+
+ else if(charCode>=1792 && charCode<=1871) // Syriac
+ return true;
+
+ else if(charCode>=1920 && charCode<=1983) // Thaana
+ return true;
+
+ else if(charCode>=1984 && charCode<=2047) // NKo
+ return true;
+
+ else if(charCode>=11568 && charCode<=11647) // Tifinagh
+ return true;
+
+ return false;
+ },
+
+ // source: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/charCodeAt
+ _fixedCharCodeAt: function(str, idx) {
+ str += '';
+ var code,
+ end = str.length;
+
+ var surrogatePairs = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g;
+ while ((surrogatePairs.exec(str)) != null) {
+ var li = surrogatePairs.lastIndex;
+ if (li - 2 < idx) {
+ idx++;
+ }
+ else {
+ break;
+ }
+ }
+
+ if (idx >= end || idx < 0) {
+ return NaN;
+ }
+
+ code = str.charCodeAt(idx);
+
+ var hi, low;
+ if (0xD800 <= code && code <= 0xDBFF) {
+ hi = code;
+ low = str.charCodeAt(idx+1);
+ // Go one further, since one of the "characters" is part of a surrogate pair
+ return ((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000;
+ }
+ return code;
+ }
+ };
+})();
+// @license-end
+
diff --git a/app/assets/javascripts/app/helpers/handlebars-helpers.js b/app/assets/javascripts/app/helpers/handlebars-helpers.js
index a289b5a64..c428bfdd7 100644
--- a/app/assets/javascripts/app/helpers/handlebars-helpers.js
+++ b/app/assets/javascripts/app/helpers/handlebars-helpers.js
@@ -1,26 +1,67 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
Handlebars.registerHelper('t', function(scope, values) {
- return Diaspora.I18n.t(scope, values.hash)
+ return Diaspora.I18n.t(scope, values.hash);
+});
+
+Handlebars.registerHelper('txtDirClass', function(str) {
+ return app.helpers.txtDirection.classFor(str);
});
Handlebars.registerHelper('imageUrl', function(path){
- return app.baseImageUrl() + path;
+ return ImagePaths.get(path);
});
-Handlebars.registerHelper('linkToPerson', function(context, block) {
+Handlebars.registerHelper('urlTo', function(path_helper, id, data){
+ if( !data ) {
+ // only one argument given to helper, mangle parameters
+ data = id;
+ return Routes[path_helper+'_path'](data.hash);
+ }
+ return Routes[path_helper+'_path'](id, data.hash);
+});
+
+Handlebars.registerHelper('linkToAuthor', function(context, block) {
+ if( !context ) context = this;
var html = "<a href=\"/people/" + context.guid + "\" class=\"author-name ";
html += Handlebars.helpers.hovercardable(context);
html += "\">";
html += block.fn(context);
html += "</a>";
- return html
+ return html;
+});
+
+Handlebars.registerHelper('linkToPerson', function(context, block) {
+ if( !context ) context = this;
+ var html = "<a href=\"/people/" + context.guid + "\" class=\"name\">";
+ html += block.fn(context);
+ html += "</a>";
+
+ return html;
+});
+
+// relationship indicator for profile page
+Handlebars.registerHelper('sharingMessage', function(person) {
+ var i18n_scope = 'people.helper.is_not_sharing';
+ var icon = "circle";
+ if( person.is_sharing ) {
+ i18n_scope = 'people.helper.is_sharing';
+ icon = "entypo check";
+ }
+
+ var title = Diaspora.I18n.t(i18n_scope, {name: person.name});
+ var html = '<span class="sharing_message_container" title="'+title+'" data-placement="bottom">'+
+ ' <i id="sharing_message" class="'+icon+'"></i>'+
+ '</span>';
+ return html;
});
// allow hovercards for users that are not the current user.
// returns the html class name used to trigger hovercards.
Handlebars.registerHelper('hovercardable', function(person) {
- if( app.currentUser.get('guid') != person.guid ) {
+ if( app.currentUser.get('guid') !== person.guid ) {
return 'hovercardable';
}
return '';
@@ -29,18 +70,65 @@ Handlebars.registerHelper('hovercardable', function(person) {
Handlebars.registerHelper('personImage', function(person, size, imageClass) {
/* we return here if person.avatar is blank, because this happens when a
* user is unauthenticated. we don't know why this happens... */
- if( _.isUndefined(person.avatar) ) { return }
+ if( !person.avatar &&
+ !(person.profile && person.profile.avatar) ) return;
+ var avatar = person.avatar || person.profile.avatar;
+ var name = ( person.name ) ? person.name : 'avatar';
size = ( !_.isString(size) ) ? "small" : size;
imageClass = ( !_.isString(imageClass) ) ? size : imageClass;
- return _.template('<img src="<%= src %>" class="avatar <%= img_class %>" title="<%= title %>" />', {
- 'src': person.avatar[size],
+ return _.template('<img src="<%= src %>" class="avatar <%= img_class %>" title="<%= title %>" alt="<%= title %>" />')({
+ 'src': avatar[size],
'img_class': imageClass,
- 'title': _.escape(person.name)
+ 'title': _.escape(name)
});
});
Handlebars.registerHelper('localTime', function(timestamp) {
return new Date(timestamp).toLocaleString();
-}); \ No newline at end of file
+});
+
+Handlebars.registerHelper('fmtTags', function(tags) {
+ var links = _.map(tags, function(tag) {
+ return '<a class="tag" href="' + Routes.tag_path(tag) + '">' +
+ ' #' + tag +
+ '</a>';
+ }).join(' ');
+ return new Handlebars.SafeString(links);
+});
+
+Handlebars.registerHelper('fmtText', function(text) {
+ return new Handlebars.SafeString(app.helpers.textFormatter(text));
+});
+
+Handlebars.registerHelper('isCurrentPage', function(path_helper, id, options){
+ var currentPage = "/"+Backbone.history.fragment;
+ if (currentPage === Handlebars.helpers.urlTo(path_helper, id, options.data)) {
+ return options.fn(this);
+ } else {
+ return options.inverse(this);
+ }
+});
+
+Handlebars.registerHelper('isCurrentProfilePage', function(id, diaspora_handle, options){
+ var username = diaspora_handle.split("@")[0];
+ return Handlebars.helpers.isCurrentPage('person', id, options) ||
+ Handlebars.helpers.isCurrentPage('user_profile', username, options);
+});
+
+Handlebars.registerHelper('aspectMembershipIndicator', function(contact,in_aspect) {
+ if(!app.aspect || !app.aspect.get('id')) return '<div class="aspect_membership_dropdown placeholder"></div>';
+
+ var html = '<i class="entypo ';
+ if( in_aspect === 'in_aspect' ) {
+ html += 'circled-cross contact_remove-from-aspect" ';
+ html += 'title="' + Diaspora.I18n.t('contacts.remove_contact') + '" ';
+ } else {
+ html += 'circled-plus contact_add-to-aspect" ';
+ html += 'title="' + Diaspora.I18n.t('contacts.add_contact') + '" ';
+ }
+ html += '></i>';
+ return html;
+});
+// @license-end
diff --git a/app/assets/javascripts/app/helpers/handlebars-partials.js b/app/assets/javascripts/app/helpers/handlebars-partials.js
index ac42bf485..6f1815229 100644
--- a/app/assets/javascripts/app/helpers/handlebars-partials.js
+++ b/app/assets/javascripts/app/helpers/handlebars-partials.js
@@ -1,4 +1,7 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
/* we need to wrap this in a document ready to ensure JST is accessible */
$(function(){
- Handlebars.registerPartial('status-message', JST['status-message_tpl'])
+ Handlebars.registerPartial('status-message', HandlebarsTemplates['status-message_tpl']);
});
+// @license-end
diff --git a/app/assets/javascripts/app/helpers/o_embed.js b/app/assets/javascripts/app/helpers/o_embed.js
index ff370f1da..67d2e9717 100644
--- a/app/assets/javascripts/app/helpers/o_embed.js
+++ b/app/assets/javascripts/app/helpers/o_embed.js
@@ -1,14 +1,17 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
(function(){
app.helpers.oEmbed = {
html : function (o_embed_cache) {
if (!o_embed_cache) { return "" }
var data = o_embed_cache.data;
- if (data.type == "photo") {
- return '<img src="' + data.url + '" width="' + data.width + '" height="' + data.height + '" />'
+ if (data.type === "photo") {
+ return '<img src="' + data.url + '" width="' + data.width + '" height="' + data.height + '" />';
} else {
- return data.html || ""
+ return data.html || "";
}
}
- }
-})(); \ No newline at end of file
+ };
+})();
+// @license-end
diff --git a/app/assets/javascripts/app/helpers/open_graph.js b/app/assets/javascripts/app/helpers/open_graph.js
index cc22e312f..f106b681f 100644
--- a/app/assets/javascripts/app/helpers/open_graph.js
+++ b/app/assets/javascripts/app/helpers/open_graph.js
@@ -1,8 +1,12 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
(function(){
app.helpers.openGraph = {
html : function (open_graph_cache) {
- if (!open_graph_cache) { return "" }
- return '<img src="' + open_graph_cache.image + '" />'
- }
- }
+ if (!open_graph_cache) { return ""; }
+ return '<img src="' + open_graph_cache.image + '" />';
+ },
+ };
})();
+// @license-end
+
diff --git a/app/assets/javascripts/app/helpers/text_formatter.js b/app/assets/javascripts/app/helpers/text_formatter.js
index 9f27029c6..5bdfd5830 100644
--- a/app/assets/javascripts/app/helpers/text_formatter.js
+++ b/app/assets/javascripts/app/helpers/text_formatter.js
@@ -1,144 +1,66 @@
-
-// cache url regex globally, for direct acces when testing
-$(function() {
- Diaspora.url_regex = /(^|\s)\b((?:(?:https?|ftp):(?:\/{1,3})|www\.)(?:[^"<>\)\s]|\(([^\s()<>]+|(\([^\s()<>]+\)))\))+)(?=\s|$)/gi;
-});
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
(function(){
- //make it so I take text and mentions rather than the modelapp.helpers.textFormatter(
- var textFormatter = function textFormatter(text, model) {
- var mentions = model.get("mentioned_people");
-
- return textFormatter.mentionify(
- textFormatter.hashtagify(
- textFormatter.markdownify(text)
- ), mentions
- )
- };
-
- textFormatter.markdownify = function markdownify(text){
- var converter = Markdown.getSanitizingConverter();
-
- // punycode non-ascii chars in urls
- converter.hooks.chain("preConversion", function(text) {
-
- // add < > around plain urls, effectively making them "autolinks"
- text = text.replace(Diaspora.url_regex, function() {
- var url = arguments[2];
- if( url.match(/^[^\w]/) ) return url; // evil witchcraft, noop
- return arguments[1]+"<"+url+">";
- });
-
- // process links
- // regex copied from: https://code.google.com/p/pagedown/source/browse/Markdown.Converter.js#1198 (and slightly expanded)
- var linkRegex = /(\[.*\]:\s)?(<|\()((?:(https?|ftp):\/\/[^\/'">\s]|www)[^'">\s]+?)([>\)]{1,2})/gi;
- text = text.replace(linkRegex, function() {
- var unicodeUrl = arguments[3];
- var urlSuffix = arguments[5];
-
- unicodeUrl = ( unicodeUrl.match(/^www/) ) ? ('http://' + unicodeUrl) : unicodeUrl;
-
- // handle parentheses, especially in case the link ends with ')'
- if( urlSuffix.indexOf(')') != -1 && urlSuffix.indexOf('>') != -1 ) {
- unicodeUrl += ')';
- urlSuffix = '>';
- }
-
- // url*DE*code as much as possible
- try {
- while( unicodeUrl.indexOf("%") !== -1 && unicodeUrl != decodeURI(unicodeUrl) ) {
- unicodeUrl = decodeURI(unicodeUrl);
- }
- }
- catch(e){}
-
- // markdown doesn't like '(' or ')' anywhere, except where it wants
- var workingUrl = unicodeUrl.replace(/\(/, "%28").replace(/\)/, "%29");
+ app.helpers.textFormatter = function(text, mentions) {
+ mentions = mentions ? mentions : [];
+
+ var md = window.markdownit({
+ breaks: true,
+ html: true,
+ linkify: true,
+ typographer: true
+ });
- var addr = parse_url(unicodeUrl);
- if( !addr.host ) addr.host = ""; // must not be 'undefined'
+ var inlinePlugin = window.markdownitForInline;
+ md.use(inlinePlugin, "utf8_symbols", "text", function (tokens, idx) {
+ tokens[idx].content = tokens[idx].content.replace(/<->/g, "↔")
+ .replace(/<-/g, "←")
+ .replace(/->/g, "→")
+ .replace(/<3/g, "♥");
+ });
- var asciiUrl = // rebuild the url
- (!addr.scheme ? '' : addr.scheme +
- ( (addr.scheme.toLowerCase()=="mailto") ? ':' : '://')) +
- (!addr.user ? '' : addr.user +
- (!addr.pass ? '' : ':'+addr.pass) + '@') +
- punycode.toASCII(addr.host) +
- (!addr.port ? '' : ':' + addr.port) +
- (!addr.path ? '' : encodeURI(addr.path) ) +
- (!addr.query ? '' : '?' + encodeURI(addr.query) ) +
- (!addr.fragment ? '' : '#' + encodeURI(addr.fragment) );
- if( !arguments[1] || arguments[1] == "") { // inline link
- if(arguments[2] == "<") return "["+workingUrl+"]("+asciiUrl+")"; // without link text
- else return arguments[2]+asciiUrl+urlSuffix; // with link text
- } else { // reference style link
- return arguments[1]+asciiUrl;
+ md.use(inlinePlugin, "link_new_window_and_missing_http", "link_open", function (tokens, idx) {
+ tokens[idx].attrs.forEach(function(attribute, index, array) {
+ if( attribute[0] === "href" ) {
+ array[index][1] = attribute[1].replace(/^www\./, "http://www.");
}
});
-
- return text;
+ tokens[idx].attrPush([ "target", "_blank" ]);
});
- // make nice little utf-8 symbols
- converter.hooks.chain("preConversion", function(text) {
- var input_strings = [
- "<->", "->", "<-",
- "(c)", "(r)", "(tm)",
- "<3"
- ];
- var output_symbols = [
- "↔", "→", "←",
- "©", "®", "™",
- "♥"
- ];
- // quote function from: http://stackoverflow.com/a/494122
- var quote = function(str) {
- return str.replace(/([.?*+^$[\]\\(){}|-])/g, "\\$1");
- };
-
- _.each(input_strings, function(str, idx) {
- var r = new RegExp(quote(str), "gi");
- text = text.replace(r, output_symbols[idx]);
- });
- return text;
+ var hashtagPlugin = window.markdownitHashtag;
+ md.use(hashtagPlugin, {
+ // compare tag_text_regexp in app/models/acts_as_taggable_on-tag.rb
+ hashtagRegExp: "[" + PosixBracketExpressions.alnum + "_\\-]+|<3",
+ // compare tag_strings in lib/diaspora/taggabe.rb
+ preceding: "^|\\s"
});
- converter.hooks.chain("postConversion", function (text) {
- return text.replace(/(\"(?:(?:http|https):\/\/)?[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(?:\/\S*)?\")(\>)/g, '$1 target="_blank">')
+ var mentionPlugin = window.markdownitDiasporaMention;
+ md.use(mentionPlugin, {
+ mentions: mentions,
+ allowHovercards: true,
+ currentUserId: app.currentUser.get("guid")
});
- return converter.makeHtml(text)
- };
-
- textFormatter.hashtagify = function hashtagify(text){
- var utf8WordCharcters =/(<a[^>]*>.*?<\/a>)|(\s|^|>)#([\u0080-\uFFFF|\w|-]+|&lt;3)/g;
-
- return text.replace(utf8WordCharcters, function(result, linkTag, preceeder, tagText) {
- if(linkTag)
- return linkTag;
- else
- return preceeder + "<a href='/tags/" + tagText.toLowerCase() +
- "' class='tag'>#" + tagText + "</a>";
- });
- };
+ var subPlugin = window.markdownitSub;
+ md.use(subPlugin);
+ var supPlugin = window.markdownitSup;
+ md.use(supPlugin);
+ var sanitizerPlugin = window.markdownitSanitizer;
+ md.use(sanitizerPlugin);
- textFormatter.mentionify = function mentionify(text, mentions) {
- var mentionRegex = /@\{([^;]+); ([^\}]+)\}/g
- return text.replace(mentionRegex, function(mentionText, fullName, diasporaId) {
- var person = _.find(mentions, function(person){
- return (diasporaId == person.diaspora_id || person.handle) //jquery.mentionsInput gives us person.handle
- })
- if(person) {
- var url = person.url || "/people/" + person.guid //jquery.mentionsInput gives us person.url
- , personText = "<a href='" + url + "' class='mention'>" + fullName + "</a>"
- } else {
- personText = fullName;
- }
+ // xmpp: should behave like mailto:
+ md.linkify.add("xmpp:","mailto:");
+ // mumble:// should behave like http://:
+ md.linkify.add("mumble:","http:");
+ md.linkify.set({ fuzzyLink: false });
- return personText
- })
- }
+ // Bootstrap table markup
+ md.renderer.rules.table_open = function () { return "<table class=\"table table-striped\">\n"; };
- app.helpers.textFormatter = textFormatter;
+ return md.render(text);
+ };
})();
+// @license-end
diff --git a/app/assets/javascripts/app/helpers/timeago.js b/app/assets/javascripts/app/helpers/timeago.js
new file mode 100644
index 000000000..ddea02057
--- /dev/null
+++ b/app/assets/javascripts/app/helpers/timeago.js
@@ -0,0 +1,9 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+(function(){
+ app.helpers.timeago = function(el) {
+ el.find('time.timeago').each(function(i,e) {
+ $(e).attr('title', new Date($(e).attr('datetime')).toLocaleString());
+ }).timeago().tooltip();
+ };
+})();
+// @license-end
diff --git a/app/assets/javascripts/app/helpers/truncate.js b/app/assets/javascripts/app/helpers/truncate.js
new file mode 100644
index 000000000..7cfa6aa59
--- /dev/null
+++ b/app/assets/javascripts/app/helpers/truncate.js
@@ -0,0 +1,14 @@
+(function() {
+ app.helpers.truncate = function(passedString, length) {
+ if (passedString === null || passedString === undefined) {
+ return passedString;
+ }
+
+ if (passedString.length > length) {
+ var lastBlank = passedString.lastIndexOf(' ', length);
+ var trimstring = passedString.substring(0, Math.min(length, lastBlank));
+ return new Handlebars.SafeString(trimstring + " ...");
+ }
+ return new Handlebars.SafeString(passedString);
+ };
+})();
diff --git a/app/assets/javascripts/app/models.js b/app/assets/javascripts/app/models.js
index 657618450..286e990c6 100644
--- a/app/assets/javascripts/app/models.js
+++ b/app/assets/javascripts/app/models.js
@@ -1,3 +1,4 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
// Mixin to provide date formatting and "createdAt" method
// other attributes can be accessed by calling this.timeOf("timestamp-field")
@@ -14,3 +15,5 @@ app.models.formatDateMixin = {
}
};
+// @license-end
+
diff --git a/app/assets/javascripts/app/models/aspect.js b/app/assets/javascripts/app/models/aspect.js
index ec53e034a..7ff651d84 100644
--- a/app/assets/javascripts/app/models/aspect.js
+++ b/app/assets/javascripts/app/models/aspect.js
@@ -1,5 +1,9 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
app.models.Aspect = Backbone.Model.extend({
toggleSelected: function(){
this.set({'selected' : !this.get('selected')}, {async: false});
}
});
+// @license-end
+
diff --git a/app/assets/javascripts/app/models/aspect_membership.js b/app/assets/javascripts/app/models/aspect_membership.js
index 73a213f45..ddb503702 100644
--- a/app/assets/javascripts/app/models/aspect_membership.js
+++ b/app/assets/javascripts/app/models/aspect_membership.js
@@ -1,7 +1,11 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
/**
* this model represents the assignment of an aspect to a person.
* (only valid for the context of the current user)
*/
app.models.AspectMembership = Backbone.Model.extend({
urlRoot: "/aspect_memberships"
-}); \ No newline at end of file
+});
+// @license-end
+
diff --git a/app/assets/javascripts/app/models/block.js b/app/assets/javascripts/app/models/block.js
index ef7e8f1ef..2c6ea5eb1 100644
--- a/app/assets/javascripts/app/models/block.js
+++ b/app/assets/javascripts/app/models/block.js
@@ -1,3 +1,7 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
app.models.Block = Backbone.Model.extend({
urlRoot : "/blocks"
});
+// @license-end
+
diff --git a/app/assets/javascripts/app/models/comment.js b/app/assets/javascripts/app/models/comment.js
index c4c35ce71..f2778f718 100644
--- a/app/assets/javascripts/app/models/comment.js
+++ b/app/assets/javascripts/app/models/comment.js
@@ -1,3 +1,7 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
app.models.Comment = Backbone.Model.extend({
urlRoot: "/comments"
});
+// @license-end
+
diff --git a/app/assets/javascripts/app/models/contact.js b/app/assets/javascripts/app/models/contact.js
new file mode 100644
index 000000000..5457f2c4e
--- /dev/null
+++ b/app/assets/javascripts/app/models/contact.js
@@ -0,0 +1,13 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
+app.models.Contact = Backbone.Model.extend({
+ initialize : function() {
+ this.aspect_memberships = new app.collections.AspectMemberships(this.get('aspect_memberships'));
+ if( this.get('person') ) this.person = new app.models.Person(this.get('person'));
+ },
+
+ inAspect : function(id) {
+ return this.aspect_memberships.any(function(membership){ return membership.get('aspect').id === id; });
+ }
+});
+// @license-end
diff --git a/app/assets/javascripts/app/models/like.js b/app/assets/javascripts/app/models/like.js
index 81e71a61e..2f64ebd75 100644
--- a/app/assets/javascripts/app/models/like.js
+++ b/app/assets/javascripts/app/models/like.js
@@ -1 +1,5 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
app.models.Like = Backbone.Model.extend({ });
+// @license-end
+
diff --git a/app/assets/javascripts/app/models/person.js b/app/assets/javascripts/app/models/person.js
new file mode 100644
index 000000000..0cfcc9f66
--- /dev/null
+++ b/app/assets/javascripts/app/models/person.js
@@ -0,0 +1,53 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
+app.models.Person = Backbone.Model.extend({
+ url: function() {
+ return Routes.person_path(this.get('guid'));
+ },
+
+ initialize: function() {
+ if( this.get('profile') )
+ this.profile = new app.models.Profile(this.get('profile'));
+ },
+
+ isSharing: function() {
+ var rel = this.get('relationship');
+ return (rel === 'mutual' || rel === 'sharing');
+ },
+
+ isReceiving: function() {
+ var rel = this.get('relationship');
+ return (rel === 'mutual' || rel === 'receiving');
+ },
+
+ isMutual: function() {
+ return (this.get('relationship') === 'mutual');
+ },
+
+ isBlocked: function() {
+ return (this.get('relationship') === 'blocked');
+ },
+
+ block: function() {
+ var self = this;
+ var block = new app.models.Block({block: {person_id: this.id}});
+
+ // return the jqXHR with Promise interface
+ return block.save()
+ .done(function() { app.events.trigger('person:block:'+self.id); });
+ },
+
+ unblock: function() {
+ var self = this;
+ if( !this.get('block') ) {
+ var def = $.Deferred();
+ return def.reject();
+ }
+
+ var block = new app.models.Block({id: this.get('block').id});
+ return block.destroy()
+ .done(function() { app.events.trigger('person:unblock:'+self.id); });
+ }
+});
+// @license-end
+
diff --git a/app/assets/javascripts/app/models/photo.js b/app/assets/javascripts/app/models/photo.js
index a856faca1..c7a4efe92 100644
--- a/app/assets/javascripts/app/models/photo.js
+++ b/app/assets/javascripts/app/models/photo.js
@@ -1,6 +1,10 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
app.models.Photo = Backbone.Model.extend(_.extend({}, app.models.formatDateMixin, {
urlRoot : "/photos",
initialize : function() {},
}));
+// @license-end
+
diff --git a/app/assets/javascripts/app/models/poll_participation.js b/app/assets/javascripts/app/models/poll_participation.js
index 36b560dbe..bc8ed46cd 100644
--- a/app/assets/javascripts/app/models/poll_participation.js
+++ b/app/assets/javascripts/app/models/poll_participation.js
@@ -1,5 +1,9 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
app.models.PollParticipation = Backbone.Model.extend({
urlRoot: function(){
return '/posts/' + this.get('post_id') + "/poll_participations";
}
});
+// @license-end
+
diff --git a/app/assets/javascripts/app/models/post.js b/app/assets/javascripts/app/models/post.js
index 74a3cec90..30da8f71c 100644
--- a/app/assets/javascripts/app/models/post.js
+++ b/app/assets/javascripts/app/models/post.js
@@ -1,18 +1,20 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
app.models.Post = Backbone.Model.extend(_.extend({}, app.models.formatDateMixin, {
urlRoot : "/posts",
initialize : function() {
- this.interactions = new app.models.Post.Interactions(_.extend({post : this}, this.get("interactions")))
- this.delegateToInteractions()
+ this.interactions = new app.models.Post.Interactions(_.extend({post : this}, this.get("interactions")));
+ this.delegateToInteractions();
},
delegateToInteractions : function(){
- this.comments = this.interactions.comments
- this.likes = this.interactions.likes
+ this.comments = this.interactions.comments;
+ this.likes = this.interactions.likes;
this.comment = function(){
- this.interactions.comment.apply(this.interactions, arguments)
- }
+ this.interactions.comment.apply(this.interactions, arguments);
+ };
},
interactedAt : function() {
@@ -20,11 +22,12 @@ app.models.Post = Backbone.Model.extend(_.extend({}, app.models.formatDateMixin,
},
reshare : function(){
- return this._reshare = this._reshare || new app.models.Reshare({root_guid : this.get("guid")});
+ this._reshare = this._reshare || new app.models.Reshare({root_guid : this.get("guid")});
+ return this._reshare;
},
reshareAuthor : function(){
- return this.get("author")
+ return this.get("author");
},
blockAuthor: function() {
@@ -36,7 +39,7 @@ app.models.Post = Backbone.Model.extend(_.extend({}, app.models.formatDateMixin,
},
toggleFavorite : function(options){
- this.set({favorite : !this.get("favorite")})
+ this.set({favorite : !this.get("favorite")});
/* guard against attempting to save a model that a user doesn't own */
if(options.save){ this.save() }
@@ -44,27 +47,29 @@ app.models.Post = Backbone.Model.extend(_.extend({}, app.models.formatDateMixin,
headline : function() {
var headline = this.get("text").trim()
- , newlineIdx = headline.indexOf("\n")
- return (newlineIdx > 0 ) ? headline.substr(0, newlineIdx) : headline
+ , newlineIdx = headline.indexOf("\n");
+ return (newlineIdx > 0 ) ? headline.substr(0, newlineIdx) : headline;
},
body : function(){
var body = this.get("text").trim()
- , newlineIdx = body.indexOf("\n")
- return (newlineIdx > 0 ) ? body.substr(newlineIdx+1, body.length) : ""
+ , newlineIdx = body.indexOf("\n");
+ return (newlineIdx > 0 ) ? body.substr(newlineIdx+1, body.length) : "";
},
//returns a promise
preloadOrFetch : function(){
- var action = app.hasPreload("post") ? this.set(app.parsePreload("post")) : this.fetch()
- return $.when(action)
+ var action = app.hasPreload("post") ? this.set(app.parsePreload("post")) : this.fetch();
+ return $.when(action);
},
hasPhotos : function(){
- return this.get("photos") && this.get("photos").length > 0
+ return this.get("photos") && this.get("photos").length > 0;
},
hasText : function(){
- return $.trim(this.get("text")) !== ""
+ return $.trim(this.get("text")) !== "";
}
}));
+// @license-end
+
diff --git a/app/assets/javascripts/app/models/post/interactions.js b/app/assets/javascripts/app/models/post/interactions.js
index f4740be81..d992440f7 100644
--- a/app/assets/javascripts/app/models/post/interactions.js
+++ b/app/assets/javascripts/app/models/post/interactions.js
@@ -1,136 +1,139 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
//require ../post
app.models.Post.Interactions = Backbone.Model.extend({
url : function(){
- return this.post.url() + "/interactions"
+ return this.post.url() + "/interactions";
},
initialize : function(options){
- this.post = options.post
- this.comments = new app.collections.Comments(this.get("comments"), {post : this.post})
+ this.post = options.post;
+ this.comments = new app.collections.Comments(this.get("comments"), {post : this.post});
this.likes = new app.collections.Likes(this.get("likes"), {post : this.post});
this.reshares = new app.collections.Reshares(this.get("reshares"), {post : this.post});
},
parse : function(resp){
- this.comments.reset(resp.comments)
- this.likes.reset(resp.likes)
- this.reshares.reset(resp.reshares)
+ this.comments.reset(resp.comments);
+ this.likes.reset(resp.likes);
+ this.reshares.reset(resp.reshares);
var comments = this.comments
, likes = this.likes
- , reshares = this.reshares
+ , reshares = this.reshares;
return {
comments : comments,
likes : likes,
reshares : reshares,
fetched : true
- }
+ };
},
likesCount : function(){
- return (this.get("fetched") ? this.likes.models.length : this.get("likes_count") )
+ return (this.get("fetched") ? this.likes.models.length : this.get("likes_count") );
},
resharesCount : function(){
- return this.get("fetched") ? this.reshares.models.length : this.get("reshares_count")
+ return this.get("fetched") ? this.reshares.models.length : this.get("reshares_count");
},
commentsCount : function(){
- return this.get("fetched") ? this.comments.models.length : this.get("comments_count")
+ return this.get("fetched") ? this.comments.models.length : this.get("comments_count");
},
userLike : function(){
- return this.likes.select(function(like){ return like.get("author").guid == app.currentUser.get("guid")})[0]
+ return this.likes.select(function(like){ return like.get("author").guid === app.currentUser.get("guid")})[0];
},
userReshare : function(){
return this.reshares.select(function(reshare){
- return reshare.get("author") && reshare.get("author").guid == app.currentUser.get("guid")})[0]
+ return reshare.get("author") && reshare.get("author").guid === app.currentUser.get("guid")})[0];
},
toggleLike : function() {
if(this.userLike()) {
- this.unlike()
+ this.unlike();
} else {
- this.like()
+ this.like();
}
},
like : function() {
var self = this;
this.likes.create({}, {success : function(){
- self.trigger("change")
- self.set({"likes_count" : self.get("likes_count") + 1})
- }})
+ self.trigger("change");
+ self.set({"likes_count" : self.get("likes_count") + 1});
+ }});
- app.instrument("track", "Like")
+ app.instrument("track", "Like");
},
unlike : function() {
var self = this;
- this.userLike().destroy({success : function(model, resp) {
- self.trigger('change')
- self.set({"likes_count" : self.get("likes_count") - 1})
+ this.userLike().destroy({success : function() {
+ self.trigger('change');
+ self.set({"likes_count" : self.get("likes_count") - 1});
}});
- app.instrument("track", "Unlike")
+ app.instrument("track", "Unlike");
},
comment : function (text) {
var self = this;
this.comments.make(text).fail(function () {
- flash = new Diaspora.Widgets.FlashMessages;
+ var flash = new Diaspora.Widgets.FlashMessages();
flash.render({
success: false,
notice: Diaspora.I18n.t("failed_to_post_message")
});
}).done(function() {
- self.trigger('change') //updates after sync
+ self.trigger('change'); //updates after sync
});
- this.trigger("change") //updates count in an eager manner
+ this.trigger("change"); //updates count in an eager manner
- app.instrument("track", "Comment")
+ app.instrument("track", "Comment");
},
reshare : function(){
var interactions = this
, reshare = this.post.reshare()
- , flash = new Diaspora.Widgets.FlashMessages;
+ , flash = new Diaspora.Widgets.FlashMessages();
- reshare.save({}, {
- success : function(resp){
+ reshare.save()
+ .done(function(reshare) {
flash.render({
success: true,
notice: Diaspora.I18n.t("reshares.successful")
});
- },
- error: function(resp){
+ interactions.reshares.add(reshare);
+ if (app.stream && /^\/(?:stream|activity|aspects)/.test(app.stream.basePath())) {
+ app.stream.addNow(reshare);
+ }
+ interactions.trigger("change");
+ })
+ .fail(function(){
flash.render({
success: false,
notice: Diaspora.I18n.t("reshares.duplicate")
});
- }
- }).done(function(){
- interactions.reshares.add(reshare)
- }).done(function(){
- interactions.trigger("change")
});
- app.instrument("track", "Reshare")
+ app.instrument("track", "Reshare");
},
userCanReshare : function(){
- var isReshare = this.post.get("post_type") == "Reshare"
+ var isReshare = this.post.get("post_type") === "Reshare"
, rootExists = (isReshare ? this.post.get("root") : true)
, publicPost = this.post.get("public")
- , userIsNotAuthor = this.post.get("author").diaspora_id != app.currentUser.get("diaspora_id")
- , userIsNotRootAuthor = rootExists && (isReshare ? this.post.get("root").author.diaspora_id != app.currentUser.get("diaspora_id") : true)
+ , userIsNotAuthor = this.post.get("author").diaspora_id !== app.currentUser.get("diaspora_id")
+ , userIsNotRootAuthor = rootExists && (isReshare ? this.post.get("root").author.diaspora_id !== app.currentUser.get("diaspora_id") : true)
, notReshared = !this.userReshare();
return publicPost && app.currentUser.authenticated() && userIsNotAuthor && userIsNotRootAuthor && notReshared;
}
});
+// @license-end
diff --git a/app/assets/javascripts/app/models/profile.js b/app/assets/javascripts/app/models/profile.js
index c0134017d..59c543145 100644
--- a/app/assets/javascripts/app/models/profile.js
+++ b/app/assets/javascripts/app/models/profile.js
@@ -1,20 +1,24 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
app.models.Profile = Backbone.Model.extend({
urlRoot : "/profiles"
}, {
preloadOrFetch : function(id){
- return app.hasPreload("person") ? this.preload() : this.findByGuid(id)
+ return app.hasPreload("person") ? this.preload() : this.findByGuid(id);
},
preload : function(){
- var person = new app.models.Profile(app.parsePreload("person"))
- person.deferred = $.when(true)
- return person
+ var person = new app.models.Profile(app.parsePreload("person"));
+ person.deferred = $.when(true);
+ return person;
},
findByGuid : function(personId){
- var person = new app.models.Profile({ id : personId})
- person.deferred = person.fetch()
- return person
+ var person = new app.models.Profile({ id : personId});
+ person.deferred = person.fetch();
+ return person;
}
});
+// @license-end
+
diff --git a/app/assets/javascripts/app/models/report.js b/app/assets/javascripts/app/models/report.js
index d2d734221..4309a71b8 100644
--- a/app/assets/javascripts/app/models/report.js
+++ b/app/assets/javascripts/app/models/report.js
@@ -1,4 +1,8 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
app.models.Report = Backbone.Model.extend({
urlRoot: '/report',
type: 'POST'
});
+// @license-end
+
diff --git a/app/assets/javascripts/app/models/reshare.js b/app/assets/javascripts/app/models/reshare.js
index 7a4b83ff7..a236f2384 100644
--- a/app/assets/javascripts/app/models/reshare.js
+++ b/app/assets/javascripts/app/models/reshare.js
@@ -1,16 +1,20 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
app.models.Reshare = app.models.Post.extend({
urlRoot : "/reshares",
rootPost : function(){
this._rootPost = this._rootPost || new app.models.Post(this.get("root"));
- return this._rootPost
+ return this._rootPost;
},
reshare : function(){
- return this.rootPost().reshare()
+ return this.rootPost().reshare();
},
reshareAuthor : function(){
- return this.rootPost().reshareAuthor()
+ return this.rootPost().reshareAuthor();
}
});
+// @license-end
+
diff --git a/app/assets/javascripts/app/models/status_message.js b/app/assets/javascripts/app/models/status_message.js
index bce96553d..f8469662a 100644
--- a/app/assets/javascripts/app/models/status_message.js
+++ b/app/assets/javascripts/app/models/status_message.js
@@ -1,3 +1,5 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
app.models.StatusMessage = app.models.Post.extend({
url : function(){
return this.isNew() ? '/status_messages' : '/posts/' + this.get("id");
@@ -15,6 +17,8 @@ app.models.StatusMessage = app.models.Post.extend({
photos : this.photos && this.photos.pluck("id"),
services : this.get("services"),
poll : this.get("poll")
- }
+ };
}
});
+// @license-end
+
diff --git a/app/assets/javascripts/app/models/stream.js b/app/assets/javascripts/app/models/stream.js
index 4cf5ff737..8ac6c3ebf 100644
--- a/app/assets/javascripts/app/models/stream.js
+++ b/app/assets/javascripts/app/models/stream.js
@@ -1,49 +1,54 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
//= require ../collections/posts
//= require ../collections/photos
app.models.Stream = Backbone.Collection.extend({
initialize : function(models, options){
- var collectionClass = options && options.collection || app.collections.Posts;
+ var collectionClass = app.collections.Posts;
+ if( options ) {
+ options.collection && (collectionClass = options.collection);
+ options.basePath && (this.streamPath = options.basePath);
+ }
this.items = new collectionClass([], this.collectionOptions());
},
collectionOptions :function(){
var order = this.sortOrder();
- return { comparator : function(item) { return -item[order](); } }
+ return { comparator : function(item) { return -item[order](); } };
},
url : function(){
- return _.any(this.items.models) ? this.timeFilteredPath() : this.basePath()
+ return _.any(this.items.models) ? this.timeFilteredPath() : this.basePath();
},
_fetchOpts: function(opts) {
var defaultOpts = {
remove: false // tell backbone to keep existing items in the collection
};
- return _.extend({}, defaultOpts, opts);
+ return _.extend({ url: this.url() }, defaultOpts, opts);
},
fetch: function() {
if( this.isFetching() ) return false;
- var url = this.url();
- this.deferred = this.items.fetch(this._fetchOpts({url : url}))
+ this.deferred = this.items.fetch( this._fetchOpts() )
.done(_.bind(this.triggerFetchedEvents, this));
},
isFetching : function() {
- return (this.deferred && this.deferred.state() == "pending");
+ return (this.deferred && this.deferred.state() === "pending");
},
triggerFetchedEvents : function(resp){
this.trigger("fetched", this);
// all loaded?
var respItems = this.items.parse(resp);
- if(respItems && (respItems.author || respItems.length == 0)) {
+ if(respItems && (respItems.author || respItems.length === 0)) {
this.trigger("allItemsLoaded", this);
}
},
basePath : function(){
- return document.location.pathname;
+ return this.streamPath || document.location.pathname;
},
timeFilteredPath : function(){
@@ -52,11 +57,11 @@ app.models.Stream = Backbone.Collection.extend({
maxTime: function(){
var lastPost = _.last(this.items.models);
- return lastPost[this.sortOrder()]()
+ return lastPost[this.sortOrder()]();
},
sortOrder : function() {
- return this.basePath().match(/activity/) ? "interactedAt" : "createdAt"
+ return this.basePath().match(/activity/) ? "interactedAt" : "createdAt";
},
/* This function is for adding a large number of posts one by one.
@@ -66,7 +71,7 @@ app.models.Stream = Backbone.Collection.extend({
* stream for the changes to take effect in the infinite stream view
*/
add : function(models){
- this.items.add(models)
+ this.items.add(models);
},
/* This function is for adding a single post. It immediately triggers
@@ -79,12 +84,13 @@ app.models.Stream = Backbone.Collection.extend({
},
preloadOrFetch : function(){ //hai, plz test me THNX
- return $.when(app.hasPreload("stream") ? this.preload() : this.fetch())
+ return $.when(app.hasPreload("stream") ? this.preload() : this.fetch());
},
preload : function(){
- this.items.reset(app.parsePreload("stream"))
- this.deferred = $.when(true)
- this.trigger("fetched")
+ this.items.reset(app.parsePreload("stream"));
+ this.deferred = $.when(true);
+ this.trigger("fetched");
}
});
+// @license-end
diff --git a/app/assets/javascripts/app/models/stream_aspects.js b/app/assets/javascripts/app/models/stream_aspects.js
index 4dc97899e..e64d3ea5b 100644
--- a/app/assets/javascripts/app/models/stream_aspects.js
+++ b/app/assets/javascripts/app/models/stream_aspects.js
@@ -1,7 +1,9 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
app.models.StreamAspects = app.models.Stream.extend({
url : function(){
- return _.any(this.items.models) ? this.timeFilteredPath() : this.basePath()
+ return _.any(this.items.models) ? this.timeFilteredPath() : this.basePath();
},
initialize : function(models, options){
@@ -19,6 +21,15 @@ app.models.StreamAspects = app.models.Stream.extend({
var url = this.url();
var ids = this.aspects_ids;
this.deferred = this.items.fetch(this._fetchOpts({url : url, data : { 'a_ids': ids }}))
- .done(_.bind(this.triggerFetchedEvents, this));
+ .done(_.bind(this.fetchDone, this));
+ },
+
+ fetchDone: function() {
+ this.triggerFetchedEvents();
+ if (app.aspects) {
+ app.aspects.trigger('aspectStreamFetched');
+ }
}
});
+// @license-end
+
diff --git a/app/assets/javascripts/app/models/tag_following.js b/app/assets/javascripts/app/models/tag_following.js
index b2ab35977..a64820116 100644
--- a/app/assets/javascripts/app/models/tag_following.js
+++ b/app/assets/javascripts/app/models/tag_following.js
@@ -1,3 +1,7 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
app.models.TagFollowing = Backbone.Model.extend({
urlRoot: "/tag_followings"
});
+// @license-end
+
diff --git a/app/assets/javascripts/app/models/user.js b/app/assets/javascripts/app/models/user.js
index b08f281f8..fabf5817d 100644
--- a/app/assets/javascripts/app/models/user.js
+++ b/app/assets/javascripts/app/models/user.js
@@ -1,3 +1,5 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
app.models.User = Backbone.Model.extend({
toggleNsfwState : function() {
if(!app.currentUser.authenticated()){ return false }
@@ -10,14 +12,16 @@ app.models.User = Backbone.Model.extend({
},
expProfileUrl : function(){
- return "/people/" + app.currentUser.get("guid") + "?ex=true"
+ return "/people/" + app.currentUser.get("guid") + "?ex=true";
},
isServiceConfigured : function(providerName) {
- return _.include(this.get("configured_services"), providerName)
+ return _.include(this.get("configured_services"), providerName);
},
isAuthorOf: function(model) {
- return this.authenticated() && model.get("author").id == this.id;
+ return this.authenticated() && model.get("author").id === this.id;
}
});
+// @license-end
+
diff --git a/app/assets/javascripts/app/pages/contacts.js b/app/assets/javascripts/app/pages/contacts.js
new file mode 100644
index 000000000..996a5898b
--- /dev/null
+++ b/app/assets/javascripts/app/pages/contacts.js
@@ -0,0 +1,75 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
+app.pages.Contacts = Backbone.View.extend({
+
+ el: "#contacts_container",
+
+ events: {
+ "click #contacts_visibility_toggle" : "toggleContactVisibility",
+ "click #chat_privilege_toggle" : "toggleChatPrivilege",
+ "click #change_aspect_name" : "showAspectNameForm",
+ "keyup #contact_list_search" : "searchContactList"
+ },
+
+ initialize: function(opts) {
+ this.visibility_toggle = $("#contacts_visibility_toggle .entypo");
+ this.chat_toggle = $("#chat_privilege_toggle .entypo");
+ this.stream = opts.stream;
+ this.stream.render();
+ $("#people_stream.contacts .header .entypo").tooltip({ 'placement': 'bottom'});
+ $(document).on('ajax:success', 'form.edit_aspect', this.updateAspectName);
+ },
+
+ toggleChatPrivilege: function() {
+ if (this.chat_toggle.hasClass("enabled")) {
+ this.chat_toggle.tooltip("destroy")
+ .removeClass("enabled")
+ .removeAttr("data-original-title")
+ .attr("title", Diaspora.I18n.t("contacts.aspect_chat_is_not_enabled"))
+ .tooltip({'placement': 'bottom'});
+ } else {
+ this.chat_toggle.tooltip("destroy")
+ .addClass("enabled")
+ .removeAttr("data-original-title")
+ .attr("title", Diaspora.I18n.t("contacts.aspect_chat_is_enabled"))
+ .tooltip({'placement': 'bottom'});
+ }
+ },
+
+ toggleContactVisibility: function() {
+ if (this.visibility_toggle.hasClass("lock-open")) {
+ this.visibility_toggle.removeClass("lock-open")
+ .addClass("lock")
+ .tooltip("destroy")
+ .removeAttr("data-original-title")
+ .attr("title", Diaspora.I18n.t("contacts.aspect_list_is_not_visible"))
+ .tooltip({'placement': 'bottom'});
+ }
+ else {
+ this.visibility_toggle.removeClass("lock")
+ .addClass("lock-open")
+ .tooltip("destroy")
+ .removeAttr("data-original-title")
+ .attr("title", Diaspora.I18n.t("contacts.aspect_list_is_visible"))
+ .tooltip({'placement': 'bottom'});
+ }
+ },
+
+ showAspectNameForm: function() {
+ $(".header > h3").hide();
+ $(".header > #aspect_name_form").show();
+ },
+
+ updateAspectName: function(evt,data){
+ $(".header #aspect_name").text(data['name']);
+ $("#aspect_nav [data-aspect-id='"+data['id']+"'] .name").text(data['name']);
+ $(".header > #aspect_name_form").hide();
+ $(".header > h3").show();
+ },
+
+ searchContactList: function(e) {
+ this.stream.search($(e.target).val());
+ }
+});
+// @license-end
+
diff --git a/app/assets/javascripts/app/pages/profile.js b/app/assets/javascripts/app/pages/profile.js
new file mode 100644
index 000000000..767c9f3a2
--- /dev/null
+++ b/app/assets/javascripts/app/pages/profile.js
@@ -0,0 +1,130 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
+app.pages.Profile = app.views.Base.extend({
+ events: {
+ 'click #block_user_button': 'blockPerson',
+ 'click #unblock_user_button': 'unblockPerson'
+ },
+
+ subviews: {
+ '#profile': 'sidebarView',
+ '.profile_header': 'headerView',
+ '#main_stream': 'streamView'
+ },
+
+ tooltipSelector: '.profile_button .profile-header-icon, .sharing_message_container',
+
+ initialize: function(opts) {
+ if( !this.model ) {
+ this._populateModel(opts);
+ }
+
+ if( app.hasPreload('photos') )
+ this.photos = app.parsePreload('photos'); // we don't interact with it, so no model
+ if( app.hasPreload('contacts') )
+ this.contacts = app.parsePreload('contacts'); // we don't interact with it, so no model
+
+ 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
+ var id = this.model.get('id');
+ app.events.on('person:block:'+id, this.reload, this);
+ app.events.on('person:unblock:'+id, this.reload, this);
+ app.events.on('aspect:create', this.reload, this);
+ app.events.on('aspect_membership:update', this.reload, this);
+ },
+
+ _populateModel: function(opts) {
+ if( app.hasPreload('person') ) {
+ this.model = new app.models.Person(app.parsePreload('person'));
+ } else if(opts && opts.person_id) {
+ this.model = new app.models.Person({guid: opts.person_id});
+ this.model.fetch();
+ } else {
+ throw new Error("unable to load person");
+ }
+ },
+
+ sidebarView: function() {
+ if( !this.model.has('profile') ) return false;
+ return new app.views.ProfileSidebar({
+ model: this.model,
+ });
+ },
+
+ headerView: function() {
+ if( !this.model.has('profile') ) return false;
+ return new app.views.ProfileHeader({
+ model: this.model,
+ photos: this.photos,
+ contacts: this.contacts
+ });
+ },
+
+ streamView: function() {
+ if( !this.model.has('profile') ) return false;
+ if( this.model.isBlocked() ) {
+ $('#main_stream').empty().html(
+ '<div class="dull">'+
+ Diaspora.I18n.t('profile.ignoring', {name: this.model.get('name')}) +
+ '</div>');
+ return false;
+ }
+
+ // a collection is set, this means we want to view photos
+ var route = this.streamCollection ? 'person_photos_path' : 'person_stream_path';
+ var view = this.streamViewClass ? this.streamViewClass : app.views.Stream;
+
+ app.stream = new app.models.Stream(null, {
+ basePath: Routes[route](app.page.model.get('guid')),
+ collection: this.streamCollection
+ });
+ app.stream.fetch();
+
+ if( this.model.get('is_own_profile') ) {
+ app.publisher = new app.views.Publisher({collection : app.stream.items});
+ }
+
+ return new view({model: app.stream});
+ },
+
+ blockPerson: function() {
+ if( !confirm(Diaspora.I18n.t('ignore_user')) ) return;
+
+ var block = this.model.block();
+ block.fail(function() {
+ Diaspora.page.flashMessages.render({
+ success: false,
+ notice: Diaspora.I18n.t('ignore_failed')
+ });
+ });
+
+ return false;
+ },
+
+ unblockPerson: function() {
+ var block = this.model.unblock();
+ block.fail(function() {
+ Diaspora.page.flashMessages.render({
+ success: false,
+ notice: Diaspora.I18.t('unblock_failed')
+ });
+ });
+ return false;
+ },
+
+ reload: function() {
+ this.$('#profile').addClass('loading');
+ this.model.fetch();
+ },
+
+ _done: function() {
+ this.$('#profile').removeClass('loading');
+ }
+});
+// @license-end
+
diff --git a/app/assets/javascripts/app/pages/single-post-viewer.js b/app/assets/javascripts/app/pages/single-post-viewer.js
index 16403f891..c0b5f6bf9 100644
--- a/app/assets/javascripts/app/pages/single-post-viewer.js
+++ b/app/assets/javascripts/app/pages/single-post-viewer.js
@@ -1,3 +1,5 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
app.pages.SinglePostViewer = app.views.Base.extend({
templateName: "single-post-viewer",
@@ -9,8 +11,8 @@ app.pages.SinglePostViewer = app.views.Base.extend({
initialize : function(options) {
this.model = new app.models.Post({ id : options.id });
this.model.preloadOrFetch().done(_.bind(this.initViews, this));
- this.model.interactions.fetch() //async, yo, might want to throttle this later.
- this.setupLightbox()
+ this.model.interactions.fetch(); //async, yo, might want to throttle this later.
+ this.setupLightbox();
},
setupLightbox : function(){
@@ -31,10 +33,11 @@ app.pages.SinglePostViewer = app.views.Base.extend({
postRenderTemplate : function() {
if(this.model.get("title")){
// formats title to html...
- var html_title = app.helpers.textFormatter(this.model.get("title"), this.model);
+ var html_title = app.helpers.textFormatter(this.model.get("title"), this.model.get("mentioned_people"));
//... and converts html to plain text
document.title = $('<div>').html(html_title).text();
}
},
});
+// @license-end
diff --git a/app/assets/javascripts/app/router.js b/app/assets/javascripts/app/router.js
index d795f0e7d..d471f9c98 100644
--- a/app/assets/javascripts/app/router.js
+++ b/app/assets/javascripts/app/router.js
@@ -1,6 +1,12 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
app.Router = Backbone.Router.extend({
routes: {
+ "help/:section": "help",
+ "help/": "help",
"help": "help",
+ "contacts": "contacts",
+ "conversations": "conversations",
//new hotness
"posts/:id": "singlePost",
@@ -19,11 +25,12 @@ app.Router = Backbone.Router.extend({
"followed_tags": "followed_tags",
"tags/:name": "followed_tags",
"people/:id/photos": "photos",
+ "people/:id/contacts": "profile",
- "people/:id": "stream",
- "u/:name": "stream"
+ "people/:id": "profile",
+ "u/:name": "profile"
},
-
+
initialize: function() {
// To support encoded linefeeds (%0A) we need to specify
// our own internal router.route call with the correct regexp.
@@ -31,10 +38,26 @@ app.Router = Backbone.Router.extend({
this.route(/^bookmarklet(?:\?(.*))?/, "bookmarklet");
},
- help: function() {
+ help: function(section) {
app.help = new app.views.Help();
$("#help").prepend(app.help.el);
- app.help.render();
+ app.help.render(section);
+ },
+
+ contacts: function() {
+ app.aspect = new app.models.Aspect(gon.preloads.aspect);
+ app.contacts = new app.collections.Contacts(app.parsePreload('contacts'));
+
+ var stream = new app.views.ContactStream({
+ collection: app.contacts,
+ el: $('.stream.contacts #contact_stream'),
+ });
+
+ app.page = new app.pages.Contacts({stream: stream});
+ },
+
+ conversations: function() {
+ app.conversations = new app.views.Conversations();
},
singlePost : function(id) {
@@ -42,14 +65,19 @@ app.Router = Backbone.Router.extend({
},
renderPage : function(pageConstructor){
- app.page && app.page.unbind && app.page.unbind() //old page might mutate global events $(document).keypress, so unbind before creating
- app.page = pageConstructor() //create new page after the world is clean (like that will ever happen)
- $("#container").html(app.page.render().el)
+ app.page && app.page.unbind && app.page.unbind(); //old page might mutate global events $(document).keypress, so unbind before creating
+ app.page = pageConstructor(); //create new page after the world is clean (like that will ever happen)
+ app.page.render();
+
+ if( !$.contains(document, app.page.el) ) {
+ // view element isn't already attached to the DOM, insert it
+ $("#container").empty().append(app.page.el);
+ }
},
//below here is oldness
- stream : function(page) {
+ stream : function() {
app.stream = new app.models.Stream();
app.stream.fetch();
app.page = new app.views.Stream({model : app.stream});
@@ -59,13 +87,18 @@ app.Router = Backbone.Router.extend({
$("#main_stream").html(app.page.render().el);
$('#selected_aspect_contacts .content').html(streamFacesView.render().el);
- this.hideInactiveStreamLists();
+ this._hideInactiveStreamLists();
},
- photos : function() {
- app.photos = new app.models.Stream([], {collection: app.collections.Photos});
- app.page = new app.views.Photos({model : app.photos});
- $("#main_stream").html(app.page.render().el);
+ photos : function(guid) {
+ this.renderPage(function() {
+ return new app.pages.Profile({
+ person_id: guid,
+ el: $('body > .container-fluid'),
+ streamCollection: app.collections.Photos,
+ streamView: app.views.Photos
+ });
+ });
},
followed_tags : function(name) {
@@ -82,9 +115,10 @@ app.Router = Backbone.Router.extend({
var followedTagsAction = new app.views.TagFollowingAction(
{tagText: decodeURIComponent(name).toLowerCase()}
);
- $("#author_info").prepend(followedTagsAction.render().el)
+ $("#author_info").prepend(followedTagsAction.render().el);
+ app.tags = new app.views.Tags({tagName: name});
}
- this.hideInactiveStreamLists();
+ this._hideInactiveStreamLists();
},
aspects : function(){
@@ -107,22 +141,28 @@ app.Router = Backbone.Router.extend({
$("#main_stream").html(app.page.render().el);
$('#selected_aspect_contacts .content').html(streamFacesView.render().el);
- this.hideInactiveStreamLists();
+ this._hideInactiveStreamLists();
},
- hideInactiveStreamLists: function() {
- if(this.aspects_list && Backbone.history.fragment != "aspects")
+ _hideInactiveStreamLists: function() {
+ if(this.aspects_list && Backbone.history.fragment !== "aspects")
this.aspects_list.hideAspectsList();
- if(this.followedTagsView && Backbone.history.fragment != "followed_tags")
+ if(this.followedTagsView && Backbone.history.fragment !== "followed_tags")
this.followedTagsView.hideFollowedTags();
},
bookmarklet: function() {
- var contents = (window.gon) ? gon.preloads.bookmarklet : {}
+ var contents = (window.gon) ? gon.preloads.bookmarklet : {};
app.bookmarklet = new app.views.Bookmarklet(
_.extend({}, {el: $('#bookmarklet')}, contents)
).render();
+ },
+
+ profile: function() {
+ this.renderPage(function() { return new app.pages.Profile({
+ el: $('body > .container-fluid')
+ }); });
}
});
-
+// @license-end
diff --git a/app/assets/javascripts/app/views.js b/app/assets/javascripts/app/views.js
index 78baa19b7..55ec8fffc 100644
--- a/app/assets/javascripts/app/views.js
+++ b/app/assets/javascripts/app/views.js
@@ -1,11 +1,13 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
app.views.Base = Backbone.View.extend({
- initialize : function(options) {
+ initialize : function() {
this.setupRenderEvents();
},
presenter : function(){
- return this.defaultPresenter()
+ return this.defaultPresenter();
},
setupRenderEvents : function(){
@@ -16,7 +18,7 @@ app.views.Base = Backbone.View.extend({
},
defaultPresenter : function(){
- var modelJson = this.model && this.model.attributes ? _.clone(this.model.attributes) : {}
+ var modelJson = this.model && this.model.attributes ? _.clone(this.model.attributes) : {};
return _.extend(modelJson, {
current_user : app.currentUser.attributes,
@@ -25,24 +27,29 @@ app.views.Base = Backbone.View.extend({
},
render : function() {
- this.renderTemplate()
- this.renderSubviews()
- this.renderPluginWidgets()
- this.removeTooltips()
+ this.renderTemplate();
+ this.renderSubviews();
+ this.renderPluginWidgets();
+ this.removeTooltips();
- return this
+ return this;
},
renderTemplate : function(){
- var presenter = _.isFunction(this.presenter) ? this.presenter() : this.presenter
- this.template = JST[this.templateName+"_tpl"]
+ var presenter = _.isFunction(this.presenter) ? this.presenter() : this.presenter;
+ this.template = HandlebarsTemplates[this.templateName+"_tpl"];
if(!this.template) {
- console.log(this.templateName ? ("no template for " + this.templateName) : "no templateName specified")
+ console.log(this.templateName ? ("no template for " + this.templateName) : "no templateName specified");
+ return;
}
this.$el
.html(this.template(presenter))
.attr("data-template", _.last(this.templateName.split("/")));
+
+ // add avatar fallback if it can't be loaded
+ this.$el.find(this.avatars.selector).error(this.avatars.fallback);
+
this.postRenderTemplate();
},
@@ -51,12 +58,12 @@ app.views.Base = Backbone.View.extend({
renderSubviews : function(){
var self = this;
_.each(this.subviews, function(property, selector){
- var view = _.isFunction(self[property]) ? self[property]() : self[property]
+ var view = _.isFunction(self[property]) ? self[property]() : self[property];
if(view) {
- self.$(selector).html(view.render().el)
+ self.$(selector).html(view.render().el);
view.delegateEvents();
}
- })
+ });
},
renderPluginWidgets : function() {
@@ -69,16 +76,16 @@ app.views.Base = Backbone.View.extend({
},
setFormAttrs : function(){
- this.model.set(_.inject(this.formAttrs, _.bind(setValueFromField, this), {}))
-
function setValueFromField(memo, attribute, selector){
if(attribute.slice("-2") === "[]") {
- memo[attribute.slice(0, attribute.length - 2)] = _.pluck(this.$el.find(selector).serializeArray(), "value")
+ memo[attribute.slice(0, attribute.length - 2)] = _.pluck(this.$el.find(selector).serializeArray(), "value");
} else {
memo[attribute] = this.$el.find(selector).val() || this.$el.find(selector).text();
}
- return memo
+ return memo;
}
+
+ this.model.set(_.inject(this.formAttrs, _.bind(setValueFromField, this), {}));
},
report: function(evt) {
@@ -97,13 +104,13 @@ app.views.Base = Backbone.View.extend({
var report = new app.models.Report();
report.save(data, {
- success: function(model, response) {
+ success: function() {
Diaspora.page.flashMessages.render({
success: true,
notice: Diaspora.I18n.t('report.status.created')
});
},
- error: function(model, response) {
+ error: function() {
Diaspora.page.flashMessages.render({
success: false,
notice: Diaspora.I18n.t('report.status.exists')
@@ -118,12 +125,14 @@ app.views.Base = Backbone.View.extend({
var url = this.model.urlRoot + '/' + this.model.id;
if (confirm(Diaspora.I18n.t("confirm_dialog"))) {
+ this.$el.addClass('deleting');
this.model.destroy({ url: url })
.done(function() {
self.remove();
})
.fail(function() {
- var flash = new Diaspora.Widgets.FlashMessages;
+ self.$el.removeClass('deleting');
+ var flash = new Diaspora.Widgets.FlashMessages();
flash.render({
success: false,
notice: Diaspora.I18n.t('failed_to_remove')
@@ -131,6 +140,13 @@ app.views.Base = Backbone.View.extend({
});
}
},
+
+ avatars: {
+ fallback: function() {
+ $(this).attr("src", ImagePaths.get("user/default.png"));
+ },
+ selector: "img.avatar"
+ }
});
app.views.StaticContentView = app.views.Base.extend({
@@ -146,3 +162,4 @@ app.views.StaticContentView = app.views.Base.extend({
return this.data;
},
});
+// @license-end
diff --git a/app/assets/javascripts/app/views/aspect_membership_blueprint_view.js b/app/assets/javascripts/app/views/aspect_membership_blueprint_view.js
deleted file mode 100644
index 5608b32c2..000000000
--- a/app/assets/javascripts/app/views/aspect_membership_blueprint_view.js
+++ /dev/null
@@ -1,161 +0,0 @@
-/**
- * this view lets the user (de-)select aspect memberships in the context
- * of another users profile or the contact page.
- *
- * updates to the list of aspects are immediately propagated to the server, and
- * the results are dislpayed as flash messages.
- */
-app.views.AspectMembershipBlueprint = Backbone.View.extend({
-
- initialize: function() {
- // attach event handler, removing any previous instances
- var selector = '.dropdown.aspect_membership .dropdown_list > li';
- $('body')
- .off('click', selector)
- .on('click', selector, _.bind(this._clickHandler, this));
-
- this.list_item = null;
- this.dropdown = null;
- },
-
- // decide what to do when clicked
- // -> addMembership
- // -> removeMembership
- _clickHandler: function(evt) {
- this.list_item = $(evt.target);
- this.dropdown = this.list_item.parent();
-
- this.list_item.addClass('loading');
-
- if( this.list_item.is('.selected') ) {
- var membership_id = this.list_item.data('membership_id');
- this.removeMembership(membership_id);
- } else {
- var aspect_id = this.list_item.data('aspect_id');
- var person_id = this.dropdown.data('person_id');
- this.addMembership(person_id, aspect_id);
- }
-
- return false; // stop the event
- },
-
- // return the (short) name of the person associated with the current dropdown
- _name: function() {
- return this.dropdown.data('person-short-name');
- },
-
- // create a membership for the given person in the given aspect
- addMembership: function(person_id, aspect_id) {
- var aspect_membership = new app.models.AspectMembership({
- 'person_id': person_id,
- 'aspect_id': aspect_id
- });
-
- aspect_membership.on('sync', this._successSaveCb, this);
- aspect_membership.on('error', function() {
- this._displayError('aspect_dropdown.error');
- }, this);
-
- aspect_membership.save();
- },
-
- _successSaveCb: function(aspect_membership) {
- var aspect_id = aspect_membership.get('aspect_id');
- var membership_id = aspect_membership.get('id');
- var li = this.dropdown.find('li[data-aspect_id="'+aspect_id+'"]');
-
- // the user didn't have this person in any aspects before, congratulate them
- // on their newly found friendship ;)
- if( this.dropdown.find('li.selected').length == 0 ) {
- var msg = Diaspora.I18n.t('aspect_dropdown.started_sharing_with', { 'name': this._name() });
- Diaspora.page.flashMessages.render({ 'success':true, 'notice':msg });
- }
-
- li.attr('data-membership_id', membership_id) // just to be sure...
- .data('membership_id', membership_id)
- .addClass('selected');
-
- this.updateSummary();
- this._done();
- },
-
- // show an error flash msg
- _displayError: function(msg_id) {
- this._done();
- this.dropdown.removeClass('active'); // close the dropdown
-
- var msg = Diaspora.I18n.t(msg_id, { 'name': this._name() });
- Diaspora.page.flashMessages.render({ 'success':false, 'notice':msg });
- },
-
- // remove the membership with the given id
- removeMembership: function(membership_id) {
- var aspect_membership = new app.models.AspectMembership({
- 'id': membership_id
- });
-
- aspect_membership.on('sync', this._successDestroyCb, this);
- aspect_membership.on('error', function() {
- this._displayError('aspect_dropdown.error_remove');
- }, this);
-
- aspect_membership.destroy();
- },
-
- _successDestroyCb: function(aspect_membership) {
- var membership_id = aspect_membership.get('id');
- var li = this.dropdown.find('li[data-membership_id="'+membership_id+'"]');
-
- li.removeAttr('data-membership_id')
- .removeData('membership_id')
- .removeClass('selected');
-
- // we just removed the last aspect, inform the user with a flash message
- // that he is no longer sharing with that person
- if( this.dropdown.find('li.selected').length == 0 ) {
- var msg = Diaspora.I18n.t('aspect_dropdown.stopped_sharing_with', { 'name': this._name() });
- Diaspora.page.flashMessages.render({ 'success':true, 'notice':msg });
- }
-
- this.updateSummary();
- this._done();
- },
-
- // cleanup tasks after aspect selection
- _done: function() {
- if( this.list_item ) {
- this.list_item.removeClass('loading');
- }
- },
-
- // refresh the button text to reflect the current aspect selection status
- updateSummary: function() {
- var btn = this.dropdown.parents('div.aspect_membership').find('.button.toggle');
- var aspects_cnt = this.dropdown.find('li.selected').length;
- var txt;
-
- if( aspects_cnt == 0 ) {
- btn.removeClass('in_aspects');
- txt = Diaspora.I18n.t('aspect_dropdown.toggle.zero');
- } else {
- btn.addClass('in_aspects');
- txt = this._pluralSummaryTxt(aspects_cnt);
- }
-
- btn.text(txt + ' ▼');
- },
-
- _pluralSummaryTxt: function(cnt) {
- var all_aspects_cnt = this.dropdown.find('li').length;
-
- if( cnt == 1 ) {
- return this.dropdown.find('li.selected').first().text();
- }
-
- if( cnt == all_aspects_cnt ) {
- return Diaspora.I18n.t('aspect_dropdown.all_aspects');
- }
-
- return Diaspora.I18n.t('aspect_dropdown.toggle', { 'count':cnt.toString() });
- }
-});
diff --git a/app/assets/javascripts/app/views/aspect_membership_view.js b/app/assets/javascripts/app/views/aspect_membership_view.js
index f753c3134..d22452421 100644
--- a/app/assets/javascripts/app/views/aspect_membership_view.js
+++ b/app/assets/javascripts/app/views/aspect_membership_view.js
@@ -1,3 +1,5 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
//= require ./aspects_dropdown_view
/**
@@ -10,7 +12,8 @@
app.views.AspectMembership = app.views.AspectsDropdown.extend({
events: {
- "click ul.aspect_membership.dropdown-menu > li.aspect_selector": "_clickHandler"
+ "click ul.aspect_membership.dropdown-menu > li.aspect_selector": "_clickHandler",
+ "keypress ul.aspect_membership.dropdown-menu > li.aspect_selector": "_clickHandler"
},
initialize: function() {
@@ -22,6 +25,7 @@ app.views.AspectMembership = app.views.AspectsDropdown.extend({
// -> addMembership
// -> removeMembership
_clickHandler: function(evt) {
+ var promise = null;
this.list_item = $(evt.target).closest('li.aspect_selector');
this.dropdown = this.list_item.parent();
@@ -29,13 +33,18 @@ app.views.AspectMembership = app.views.AspectsDropdown.extend({
if( this.list_item.is('.selected') ) {
var membership_id = this.list_item.data('membership_id');
- this.removeMembership(membership_id);
+ promise = this.removeMembership(membership_id);
} else {
var aspect_id = this.list_item.data('aspect_id');
var person_id = this.dropdown.data('person_id');
- this.addMembership(person_id, aspect_id);
+ promise = this.addMembership(person_id, aspect_id);
}
+ promise && promise.always(function() {
+ // trigger a global event
+ app.events.trigger('aspect_membership:update');
+ });
+
return false; // stop the event
},
@@ -56,7 +65,7 @@ app.views.AspectMembership = app.views.AspectsDropdown.extend({
this._displayError('aspect_dropdown.error');
}, this);
- aspect_membership.save();
+ return aspect_membership.save();
},
_successSaveCb: function(aspect_membership) {
@@ -66,7 +75,7 @@ app.views.AspectMembership = app.views.AspectsDropdown.extend({
// the user didn't have this person in any aspects before, congratulate them
// on their newly found friendship ;)
- if( this.dropdown.find('li.selected').length == 0 ) {
+ if( this.dropdown.find('li.selected').length === 0 ) {
var msg = Diaspora.I18n.t('aspect_dropdown.started_sharing_with', { 'name': this._name() });
Diaspora.page.flashMessages.render({ 'success':true, 'notice':msg });
}
@@ -98,7 +107,7 @@ app.views.AspectMembership = app.views.AspectsDropdown.extend({
this._displayError('aspect_dropdown.error_remove');
}, this);
- aspect_membership.destroy();
+ return aspect_membership.destroy();
},
_successDestroyCb: function(aspect_membership) {
@@ -111,7 +120,7 @@ app.views.AspectMembership = app.views.AspectsDropdown.extend({
// we just removed the last aspect, inform the user with a flash message
// that he is no longer sharing with that person
- if( this.dropdown.find('li.selected').length == 0 ) {
+ if( this.dropdown.find('li.selected').length === 0 ) {
var msg = Diaspora.I18n.t('aspect_dropdown.stopped_sharing_with', { 'name': this._name() });
Diaspora.page.flashMessages.render({ 'success':true, 'notice':msg });
}
@@ -132,3 +141,5 @@ app.views.AspectMembership = app.views.AspectsDropdown.extend({
this._updateButton('green');
},
});
+// @license-end
+
diff --git a/app/assets/javascripts/app/views/aspect_view.js b/app/assets/javascripts/app/views/aspect_view.js
index c8e553ea8..66cc4a945 100644
--- a/app/assets/javascripts/app/views/aspect_view.js
+++ b/app/assets/javascripts/app/views/aspect_view.js
@@ -1,3 +1,5 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
app.views.Aspect = app.views.Base.extend({
templateName: "aspect",
@@ -6,19 +8,20 @@ app.views.Aspect = app.views.Base.extend({
className: 'hoverable',
events: {
- 'click .icons-check_yes_ok+a': 'toggleAspect'
+ 'click .entypo.check+a': 'toggleAspect'
},
toggleAspect: function(evt) {
- if (evt) { evt.preventDefault(); };
+ if (evt) { evt.preventDefault(); }
this.model.toggleSelected();
- this.$el.find('.icons-check_yes_ok').toggleClass('selected');
+
app.router.aspects_stream();
},
presenter : function() {
return _.extend(this.defaultPresenter(), {
aspect : this.model
- })
+ });
}
});
+// @license-end
diff --git a/app/assets/javascripts/app/views/aspects_dropdown_view.js b/app/assets/javascripts/app/views/aspects_dropdown_view.js
index 76ecb5878..70e446704 100644
--- a/app/assets/javascripts/app/views/aspects_dropdown_view.js
+++ b/app/assets/javascripts/app/views/aspects_dropdown_view.js
@@ -1,3 +1,5 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
/*
* Aspects view for the publishers aspect dropdown and the aspect membership dropdown.
*/
@@ -14,12 +16,11 @@ app.views.AspectsDropdown = app.views.Base.extend({
// select aspects in the dropdown by a given list of ids
_selectAspects: function(ids) {
- this.$('.dropdown-menu > li').each(function(){
+ this.$('.dropdown-menu > li').each(function() {
var el = $(this);
- if(_.contains(ids, el.data('aspect_id'))){
+ if (_.contains(ids, el.data('aspect_id'))) {
el.addClass('selected');
- }
- else {
+ } else {
el.removeClass('selected');
}
});
@@ -31,16 +32,14 @@ app.views.AspectsDropdown = app.views.Base.extend({
selectedAspects = this.$(".dropdown-menu > li.selected").length,
buttonText;
- if(selectedAspects == 0){
+ if (selectedAspects === 0) {
button.removeClass(inAspectClass).addClass('btn-default');
buttonText = Diaspora.I18n.t("aspect_dropdown.select_aspects");
- }
- else{
+ } else {
button.removeClass('btn-default').addClass(inAspectClass);
- if(selectedAspects == 1){
+ if (selectedAspects === 1) {
buttonText = this.$(".dropdown-menu > li.selected .text").first().text();
- }
- else{
+ } else {
buttonText = Diaspora.I18n.t("aspect_dropdown.toggle", { count: selectedAspects.toString() });
}
}
@@ -48,3 +47,5 @@ app.views.AspectsDropdown = app.views.Base.extend({
button.find('.text').text(buttonText);
}
});
+// @license-end
+
diff --git a/app/assets/javascripts/app/views/aspects_list_view.js b/app/assets/javascripts/app/views/aspects_list_view.js
index 615ff1098..29cdf45a5 100644
--- a/app/assets/javascripts/app/views/aspects_list_view.js
+++ b/app/assets/javascripts/app/views/aspects_list_view.js
@@ -1,3 +1,5 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
app.views.AspectsList = app.views.Base.extend({
templateName: 'aspects-list',
@@ -10,6 +12,7 @@ app.views.AspectsList = app.views.Base.extend({
initialize: function() {
this.collection.on('change', this.toggleSelector, this);
this.collection.on('change', this.updateStreamTitle, this);
+ this.collection.on('aspectStreamFetched', this.updateAspectList, this);
},
postRenderTemplate: function() {
@@ -26,19 +29,12 @@ app.views.AspectsList = app.views.Base.extend({
},
toggleAll: function(evt) {
- if (evt) { evt.preventDefault(); };
+ if (evt) { evt.preventDefault(); }
- var aspects = this.$('li:not(:last)')
if (this.collection.allSelected()) {
this.collection.deselectAll();
- aspects.each(function(i){
- $(this).find('.icons-check_yes_ok').removeClass('selected');
- });
} else {
this.collection.selectAll();
- aspects.each(function(i){
- $(this).find('.icons-check_yes_ok').addClass('selected');
- });
}
this.toggleSelector();
@@ -58,7 +54,19 @@ app.views.AspectsList = app.views.Base.extend({
$('.stream_title').text(this.collection.toSentence());
},
+ updateAspectList: function() {
+ this.collection.each(function(aspect) {
+ var element = this.$("li[data-aspect_id="+aspect.get('id')+"]");
+ if (aspect.get('selected')) {
+ element.find('.entypo.check').addClass('selected');
+ } else {
+ element.find('.entypo.check').removeClass('selected');
+ }
+ });
+ },
+
hideAspectsList: function() {
this.$el.empty();
},
-})
+});
+// @license-end
diff --git a/app/assets/javascripts/app/views/bookmarklet_view.js b/app/assets/javascripts/app/views/bookmarklet_view.js
index 28bce5f47..c8e982fc3 100644
--- a/app/assets/javascripts/app/views/bookmarklet_view.js
+++ b/app/assets/javascripts/app/views/bookmarklet_view.js
@@ -1,3 +1,5 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
app.views.Bookmarklet = Backbone.View.extend({
separator: ' - ',
@@ -28,18 +30,20 @@ app.views.Bookmarklet = Backbone.View.extend({
return contents;
},
- _postSubmit: function(evt) {
+ _postSubmit: function() {
this.$('h4').text(Diaspora.I18n.t('bookmarklet.post_submit'));
},
- _postSuccess: function(evt) {
+ _postSuccess: function() {
this.$('h4').text(Diaspora.I18n.t('bookmarklet.post_success'));
app.publisher.close();
this.$("#publisher").addClass("hidden");
_.delay(window.close, 2000);
},
- _postError: function(evt) {
+ _postError: function() {
this.$('h4').text(Diaspora.I18n.t('bookmarklet.post_something'));
}
});
+// @license-end
+
diff --git a/app/assets/javascripts/app/views/comment_stream_view.js b/app/assets/javascripts/app/views/comment_stream_view.js
index db30390ca..73bc7feda 100644
--- a/app/assets/javascripts/app/views/comment_stream_view.js
+++ b/app/assets/javascripts/app/views/comment_stream_view.js
@@ -1,3 +1,5 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
app.views.CommentStream = app.views.Base.extend({
templateName: "comment-stream",
@@ -37,7 +39,7 @@ app.views.CommentStream = app.views.Base.extend({
moreCommentsCount : (this.model.interactions.commentsCount() - 3),
showExpandCommentsLink : (this.model.interactions.commentsCount() > 3),
commentsCount : this.model.interactions.commentsCount()
- })
+ });
},
createComment: function(evt) {
@@ -55,8 +57,8 @@ app.views.CommentStream = app.views.Base.extend({
},
keyDownOnCommentBox: function(evt) {
- if(evt.keyCode == 13 && evt.ctrlKey) {
- this.$("form").submit()
+ if(evt.keyCode === 13 && evt.ctrlKey) {
+ this.$("form").submit();
return false;
}
},
@@ -64,14 +66,14 @@ app.views.CommentStream = app.views.Base.extend({
appendComment: function(comment) {
// Set the post as the comment's parent, so we can check
// on post ownership in the Comment view.
- comment.set({parent : this.model.toJSON()})
+ comment.set({parent : this.model.toJSON()});
this.$(".comments").append(new app.views.Comment({
model: comment
}).render().el);
},
- commentTextareaFocused: function(evt){
+ commentTextareaFocused: function(){
this.$("form").removeClass('hidden').addClass("open");
},
@@ -81,18 +83,18 @@ app.views.CommentStream = app.views.Base.extend({
expandComments: function(evt){
if(evt){ evt.preventDefault(); }
-
- self = this;
+ var self = this;
this.model.comments.fetch({
success : function(resp){
self.model.set({
comments : resp.models,
all_comments_loaded : true
- })
+ });
- self.model.trigger("commentsExpanded", self)
+ self.model.trigger("commentsExpanded", self);
}
});
}
});
+// @license-end
diff --git a/app/assets/javascripts/app/views/comment_view.js b/app/assets/javascripts/app/views/comment_view.js
index 540c54b99..7f74d1146 100644
--- a/app/assets/javascripts/app/views/comment_view.js
+++ b/app/assets/javascripts/app/views/comment_view.js
@@ -1,3 +1,5 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
//= require ./content_view
app.views.Comment = app.views.Content.extend({
templateName: "comment",
@@ -11,27 +13,27 @@ app.views.Comment = app.views.Content.extend({
},
initialize : function(options){
- this.templateName = options.templateName || this.templateName
- this.model.on("change", this.render, this)
+ this.templateName = options.templateName || this.templateName;
+ this.model.on("change", this.render, this);
},
presenter : function() {
return _.extend(this.defaultPresenter(), {
canRemove: this.canRemove(),
- text : app.helpers.textFormatter(this.model.get("text"), this.model)
- })
+ text : app.helpers.textFormatter(this.model.get("text"))
+ });
},
ownComment : function() {
- return app.currentUser.authenticated() && this.model.get("author").diaspora_id == app.currentUser.get("diaspora_id")
+ return app.currentUser.authenticated() && this.model.get("author").diaspora_id === app.currentUser.get("diaspora_id");
},
postOwner : function() {
- return app.currentUser.authenticated() && this.model.get("parent").author.diaspora_id == app.currentUser.get("diaspora_id")
+ return app.currentUser.authenticated() && this.model.get("parent").author.diaspora_id === app.currentUser.get("diaspora_id");
},
canRemove : function() {
- return app.currentUser.authenticated() && (this.ownComment() || this.postOwner())
+ return app.currentUser.authenticated() && (this.ownComment() || this.postOwner());
}
});
@@ -39,3 +41,4 @@ app.views.ExpandedComment = app.views.Comment.extend({
postRenderTemplate : function(){
}
});
+// @license-end
diff --git a/app/assets/javascripts/app/views/contact_stream_view.js b/app/assets/javascripts/app/views/contact_stream_view.js
new file mode 100644
index 000000000..ad93301bd
--- /dev/null
+++ b/app/assets/javascripts/app/views/contact_stream_view.js
@@ -0,0 +1,77 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
+app.views.ContactStream = Backbone.View.extend({
+ initialize: function() {
+ this.itemCount = 0;
+ this.perPage = 25;
+ this.query = '';
+ this.resultList = this.collection.toArray();
+ var throttledScroll = _.throttle(_.bind(this.infScroll, this), 200);
+ $(window).scroll(throttledScroll);
+ this.on('renderContacts', this.renderContacts, this);
+ },
+
+ render: function() {
+ if( _.isEmpty(this.resultList) ) {
+ var content = document.createDocumentFragment();
+ content = '<div id="no_contacts" class="well">' +
+ ' <h4>' +
+ Diaspora.I18n.t('contacts.search_no_results') +
+ ' </h4>' +
+ '</div>';
+ this.$el.html(content);
+ } else {
+ this.$el.html('');
+ this.renderContacts();
+ }
+ },
+
+ renderContacts: function() {
+ this.$el.addClass("loading");
+ var content = document.createDocumentFragment();
+ _.rest(_.first(this.resultList , this.itemCount + this.perPage), this.itemCount).forEach( function(item) {
+ var view = new app.views.Contact({model: item});
+ content.appendChild(view.render().el);
+ });
+
+ var size = _.size(this.resultList);
+ if( this.itemCount + this.perPage >= size ){
+ this.itemCount = size;
+ this.off('renderContacts');
+ } else {
+ this.itemCount += this.perPage;
+ }
+ this.$el.append(content);
+ this.$el.removeClass("loading");
+ },
+
+ search: function(query) {
+ query = query.trim();
+ if( query || this.query ) {
+ this.off('renderContacts');
+ this.on('renderContacts', this.renderContacts, this);
+ this.itemCount = 0;
+ if( query ) {
+ this.query = query;
+ var regex = new RegExp(query,'i');
+ this.resultList = this.collection.filter(function(contact) {
+ return regex.test(contact.get('person').name) ||
+ regex.test(contact.get('person').diaspora_id);
+ });
+ } else {
+ this.resultList = this.collection.toArray();
+ this.query = '';
+ }
+ this.render();
+ }
+ },
+
+ infScroll: function() {
+ if( this.$el.hasClass('loading') ) return;
+
+ var distanceTop = $(window).height() + $(window).scrollTop(),
+ distanceBottom = $(document).height() - distanceTop;
+ if(distanceBottom < 300) this.trigger('renderContacts');
+ }
+});
+// @license-end
diff --git a/app/assets/javascripts/app/views/contact_view.js b/app/assets/javascripts/app/views/contact_view.js
new file mode 100644
index 000000000..840edfe46
--- /dev/null
+++ b/app/assets/javascripts/app/views/contact_view.js
@@ -0,0 +1,71 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
+app.views.Contact = app.views.Base.extend({
+ templateName: 'contact',
+
+ events: {
+ "click .contact_add-to-aspect" : "addContactToAspect",
+ "click .contact_remove-from-aspect" : "removeContactFromAspect"
+ },
+
+ tooltipSelector: '.contact_add-to-aspect, .contact_remove-from-aspect',
+
+ presenter: function() {
+ return _.extend(this.defaultPresenter(), {
+ person_id : this.model.get('person_id'),
+ person : this.model.get('person'),
+ in_aspect: (app.aspect && this.model.inAspect(app.aspect.get('id'))) ? 'in_aspect' : '',
+ });
+ },
+
+ postRenderTemplate: function() {
+ var self = this;
+ var dropdownEl = this.$('.aspect_membership_dropdown.placeholder');
+ if( dropdownEl.length === 0 ) {
+ return;
+ }
+
+ // TODO render me client side!!!
+ var href = this.model.person.url() + '/aspect_membership_button?size=small';
+
+ $.get(href, function(resp) {
+ dropdownEl.html(resp);
+ new app.views.AspectMembership({el: $('.aspect_dropdown',dropdownEl)});
+
+ // UGLY (re-)attach the facebox
+ self.$('a[rel*=facebox]').facebox();
+ });
+ },
+
+ addContactToAspect: function(){
+ var self = this;
+ this.model.aspect_memberships.create({
+ 'person_id': this.model.get('person_id'),
+ 'aspect_id': app.aspect.get('id')
+ },{
+ success: function(){
+ self.render();
+ },
+ error: function(){
+ var msg = Diaspora.I18n.t('contacts.error_add', { 'name': self.model.get('person').name });
+ Diaspora.page.flashMessages.render({ 'success':false, 'notice':msg });
+ }
+ });
+ },
+
+ removeContactFromAspect: function(){
+ var self = this;
+ this.model.aspect_memberships
+ .find(function(membership){ return membership.get('aspect').id === app.aspect.id; })
+ .destroy({
+ success: function(){
+ self.render();
+ },
+ error: function(){
+ var msg = Diaspora.I18n.t('contacts.error_remove', { 'name': self.model.get('person').name });
+ Diaspora.page.flashMessages.render({ 'success':false, 'notice':msg });
+ }
+ });
+ }
+});
+// @license-end
diff --git a/app/assets/javascripts/app/views/content_view.js b/app/assets/javascripts/app/views/content_view.js
index e2ec64cd3..75a4632cc 100644
--- a/app/assets/javascripts/app/views/content_view.js
+++ b/app/assets/javascripts/app/views/content_view.js
@@ -1,3 +1,5 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
app.views.Content = app.views.Base.extend({
events: {
"click .expander": "expandPost"
@@ -5,7 +7,7 @@ app.views.Content = app.views.Base.extend({
presenter : function(){
return _.extend(this.defaultPresenter(), {
- text : app.helpers.textFormatter(this.model.get("text"), this.model),
+ text : app.helpers.textFormatter(this.model.get("text"), this.model.get("mentioned_people")),
largePhoto : this.largePhoto(),
smallPhotos : this.smallPhotos(),
location: this.location()
@@ -14,13 +16,13 @@ app.views.Content = app.views.Base.extend({
largePhoto : function() {
- var photos = this.model.get("photos")
- if(!photos || photos.length == 0) { return }
- return photos[0]
+ var photos = this.model.get("photos");
+ if(!photos || photos.length === 0) { return }
+ return photos[0];
},
smallPhotos : function() {
- var photos = this.model.get("photos")
+ var photos = this.model.get("photos");
if(!photos || photos.length < 2) { return }
photos.splice(0, 1); // remove first photo as it is already shown as largePhoto
return photos;
@@ -47,10 +49,10 @@ app.views.Content = app.views.Base.extend({
, oembed = elem.find(".oembed")
, opengraph = elem.find(".opengraph")
, addHeight = 0;
- if($.trim(oembed.html()) != "") {
+ if($.trim(oembed.html()) !== "") {
addHeight += oembed.height();
}
- if($.trim(opengraph.html()) != "") {
+ if($.trim(opengraph.html()) !== "") {
addHeight += opengraph.height();
}
@@ -69,7 +71,7 @@ app.views.Content = app.views.Base.extend({
},
postRenderTemplate : function(){
- _.defer(_.bind(this.collapseOversized, this))
+ _.defer(_.bind(this.collapseOversized, this));
}
});
@@ -93,26 +95,55 @@ app.views.OEmbed = app.views.Base.extend({
},
presenter:function () {
- o_embed_cache = this.model.get("o_embed_cache")
+ var o_embed_cache = this.model.get("o_embed_cache");
if(o_embed_cache) {
- typemodel = { rich: false, photo: false, video: false, link: false }
- typemodel[o_embed_cache.data.type] = true
- o_embed_cache.data.types = typemodel
+ var typemodel = { rich: false, photo: false, video: false, link: false };
+ typemodel[o_embed_cache.data.type] = true;
+ o_embed_cache.data.types = typemodel;
}
return _.extend(this.defaultPresenter(), {
o_embed_html : app.helpers.oEmbed.html(o_embed_cache)
- })
+ });
},
showOembedContent : function (evt) {
if( $(evt.target).is('a') ) return;
+ var clickedThumb = false;
+ if ($(evt.target).hasClass(".thumb")) {
+ clickedThumb = $(evt.target);
+ } else {
+ clickedThumb = $(evt.target).parent(".thumb");
+ }
var insertHTML = $(app.helpers.oEmbed.html(this.model.get("o_embed_cache")));
var paramSeparator = ( /\?/.test(insertHTML.attr("src")) ) ? "&" : "?";
insertHTML.attr("src", insertHTML.attr("src") + paramSeparator + "autoplay=1&wmode=opaque");
+ if (clickedThumb) {
+ insertHTML.attr("width", clickedThumb.width());
+ insertHTML.attr("height", clickedThumb.height());
+ }
this.$el.html(insertHTML);
}
});
app.views.OpenGraph = app.views.Base.extend({
- templateName : "opengraph"
+ templateName : "opengraph",
+
+ initialize: function() {
+ this.truncateDescription();
+ },
+
+ truncateDescription: function() {
+ // truncate opengraph description to 250 for stream view
+ if(this.model.has('open_graph_cache')) {
+ var ogdesc = this.model.get('open_graph_cache');
+ ogdesc.description = app.helpers.truncate(ogdesc.description, 250);
+ }
+ }
+});
+
+app.views.SPVOpenGraph = app.views.OpenGraph.extend({
+ truncateDescription: function () {
+ // override with nothing
+ }
});
+// @license-end
diff --git a/app/assets/javascripts/app/views/conversations_form_view.js b/app/assets/javascripts/app/views/conversations_form_view.js
new file mode 100644
index 000000000..30cec16d9
--- /dev/null
+++ b/app/assets/javascripts/app/views/conversations_form_view.js
@@ -0,0 +1,31 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
+app.views.ConversationsForm = Backbone.View.extend({
+
+ 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}];
+ }
+ this.autocompleteInput = $("#contact_autocomplete");
+ this.prepareAutocomplete(this.contacts);
+ },
+
+ prepareAutocomplete: function(data){
+ this.autocompleteInput.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
+ }).focus();
+ }
+});
+// @license-end
+
diff --git a/app/assets/javascripts/app/views/conversations_view.js b/app/assets/javascripts/app/views/conversations_view.js
new file mode 100644
index 000000000..e3810c1c2
--- /dev/null
+++ b/app/assets/javascripts/app/views/conversations_view.js
@@ -0,0 +1,49 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
+app.views.Conversations = Backbone.View.extend({
+
+ el: "#conversations_container",
+
+ events: {
+ "conversation:loaded" : "setupConversation"
+ },
+
+ initialize: function() {
+ if($('#conversation_new:visible').length > 0) {
+ new app.views.ConversationsForm({contacts: gon.contacts});
+ }
+ this.setupConversation();
+ },
+
+ setupConversation: function() {
+ app.helpers.timeago($(this.el));
+ $('.control-icons a').tooltip({placement: 'bottom'});
+
+ var conv = $('.conversation-wrapper .stream_element.selected'),
+ cBadge = $('#conversations_badge .badge_count');
+
+ if(conv.hasClass('unread') ){
+ var unreadCount = parseInt(conv.find('.unread_message_count').text(), 10);
+
+ if(cBadge.text() !== '') {
+ cBadge.text().replace(/\d+/, function(num){
+ num = parseInt(num, 10) - unreadCount;
+ if(num > 0) {
+ cBadge.text(num);
+ } else {
+ cBadge.text(0).addClass('hidden');
+ }
+ });
+ }
+ conv.removeClass('unread');
+ conv.find('.unread_message_count').remove();
+
+ var pos = $('#first_unread').offset().top - 50;
+ $("html").animate({scrollTop:pos});
+ } else {
+ $("html").animate({scrollTop:0});
+ }
+ }
+});
+// @license-end
+
diff --git a/app/assets/javascripts/app/views/faq_question_view.js b/app/assets/javascripts/app/views/faq_question_view.js
index b5654c549..f32969e32 100644
--- a/app/assets/javascripts/app/views/faq_question_view.js
+++ b/app/assets/javascripts/app/views/faq_question_view.js
@@ -1,3 +1,5 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
app.views.FaqQuestionView = app.views.Base.extend({
templateName: "faq_question",
@@ -26,12 +28,14 @@ app.views.FaqQuestionView = app.views.Base.extend({
},
toggled: function(e) {
- el = $(e.target);
- parent = el.parents('.question');
+ var el = $(e.target);
+ var parent = el.parents('.question');
parent.children('.answer').toggle();
parent.toggleClass('opened').toggleClass('collapsed');
e.preventDefault();
},
-}); \ No newline at end of file
+});
+// @license-end
+
diff --git a/app/assets/javascripts/app/views/feedback_actions.js b/app/assets/javascripts/app/views/feedback_actions.js
index b781bccbc..861bde76d 100644
--- a/app/assets/javascripts/app/views/feedback_actions.js
+++ b/app/assets/javascripts/app/views/feedback_actions.js
@@ -1,7 +1,11 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
//=require "./feedback_view"
app.views.FeedbackActions = app.views.Feedback.extend({
id : "user-controls",
templateName : "feedback-actions",
events: {},
initialize: function(){}
-}); \ No newline at end of file
+});
+// @license-end
+
diff --git a/app/assets/javascripts/app/views/feedback_view.js b/app/assets/javascripts/app/views/feedback_view.js
index c230d2b4f..938469bbb 100644
--- a/app/assets/javascripts/app/views/feedback_view.js
+++ b/app/assets/javascripts/app/views/feedback_view.js
@@ -1,3 +1,5 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
app.views.Feedback = app.views.Base.extend({
templateName: "feedback",
@@ -6,18 +8,21 @@ app.views.Feedback = app.views.Base.extend({
events: {
"click .like" : "toggleLike",
"click .reshare" : "resharePost",
- "click .post_report" : "report"
+
+ "click .post_report" : "report",
+ "click .block_user" : "blockUser",
+ "click .hide_post" : "hidePost",
},
tooltipSelector : ".label",
initialize : function() {
this.model.interactions.on('change', this.render, this);
- this.initViews && this.initViews() // I don't know why this was failing with $.noop... :(
+ this.initViews && this.initViews(); // I don't know why this was failing with $.noop... :(
},
presenter : function() {
- var interactions = this.model.interactions
+ var interactions = this.model.interactions;
return _.extend(this.defaultPresenter(),{
commentsCount : interactions.commentsCount(),
@@ -26,7 +31,7 @@ app.views.Feedback = app.views.Base.extend({
userCanReshare : interactions.userCanReshare(),
userLike : interactions.userLike(),
userReshare : interactions.userReshare()
- })
+ });
},
toggleLike: function(evt) {
@@ -38,5 +43,45 @@ app.views.Feedback = app.views.Base.extend({
if(evt) { evt.preventDefault(); }
if(!window.confirm(Diaspora.I18n.t("reshares.post", {name: this.model.reshareAuthor().name}))) { return }
this.model.interactions.reshare();
- }
+ },
+
+ blockUser: function(evt) {
+ if(evt) { evt.preventDefault(); }
+ if(!confirm(Diaspora.I18n.t('ignore_user'))) { return; }
+
+ this.model.blockAuthor()
+ .done(function() {
+ // return to stream
+ document.location.href = "/stream";
+ })
+ .fail(function() {
+ Diaspora.page.flashMessages.render({
+ success: false,
+ notice: Diaspora.I18n.t('hide_post_failed')
+ });
+ });
+ },
+
+ hidePost : function(evt) {
+ if(evt) { evt.preventDefault(); }
+ if(!confirm(Diaspora.I18n.t('hide_post'))) { return; }
+
+ $.ajax({
+ url : "/share_visibilities/42",
+ type : "PUT",
+ data : {
+ post_id : this.model.id
+ }
+ }).done(function() {
+ // return to stream
+ document.location.href = "/stream";
+ })
+ .fail(function() {
+ Diaspora.page.flashMessages.render({
+ success: false,
+ notice: Diaspora.I18n.t('ignore_post_failed')
+ });
+ });
+ },
});
+// @license-end
diff --git a/app/assets/javascripts/app/views/header_view.js b/app/assets/javascripts/app/views/header_view.js
index db55694cc..814ef3a87 100644
--- a/app/assets/javascripts/app/views/header_view.js
+++ b/app/assets/javascripts/app/views/header_view.js
@@ -1,45 +1,53 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
app.views.Header = app.views.Base.extend({
- templateName : "header",
+ templateName: "header",
- className : "dark-header",
+ className: "dark-header",
- events : {
- "click ul.dropdown li:first-child" : "toggleDropdown",
+ events: {
+ "click ul.dropdown li:first-child": "toggleUserDropdown",
"focusin #q": "toggleSearchActive",
"focusout #q": "toggleSearchActive"
},
- initialize : function(options) {
- $(document.body).click($.proxy(this.hideDropdown, this));
+ initialize: function(){
+ $(document.body).click($.proxy(this.hideUserDropdown, this));
+
return this;
},
- menuElement : function() {
- return this.$("ul.dropdown");
+ postRenderTemplate: function(){
+ new app.views.Notifications({ el: '#notification_dropdown' });
+ new app.views.NotificationDropdown({ el: '#notification_badge' });
+ new app.views.Search({ el: '#header-search-form' });
},
- toggleDropdown : function(evt) {
+ menuElement: function(){ return this.$("ul.dropdown"); },
+
+ toggleUserDropdown: function(evt){
if(evt){ evt.preventDefault(); }
this.menuElement().toggleClass("active");
- if($.browser.msie) {
+ if($.browser.msie){
this.$("header").toggleClass('ie-user-menu-active');
}
},
- hideDropdown : function(evt) {
- if(this.menuElement().hasClass("active") && !$(evt.target).parents("#user_menu").length) {
+ hideUserDropdown: function(evt){
+ if(this.menuElement().hasClass("active") && !$(evt.target).parents("#user_menu").length){
this.menuElement().removeClass("active");
}
},
- toggleSearchActive: function(ev) {
+ toggleSearchActive: function(ev){
// jQuery produces two events for focus/blur (for bubbling)
// don't rely on which event arrives first, by allowing for both variants
- var is_active = (_.indexOf(['focus','focusin'], ev.type) != -1);
+ var is_active = (_.indexOf(['focus','focusin'], ev.type) !== -1);
$(ev.target).toggleClass('active', is_active);
return false;
}
});
+// @license-end
diff --git a/app/assets/javascripts/app/views/help_section_view.js b/app/assets/javascripts/app/views/help_section_view.js
index 5c54d96e9..432179461 100644
--- a/app/assets/javascripts/app/views/help_section_view.js
+++ b/app/assets/javascripts/app/views/help_section_view.js
@@ -1,3 +1,5 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
app.views.HelpSectionView = app.views.StaticContentView.extend({
events: {
@@ -24,8 +26,8 @@ app.views.HelpSectionView = app.views.StaticContentView.extend({
},
toggled: function(e) {
- el = $(e.target);
- parent = el.parents('.question');
+ var el = $(e.target);
+ var parent = el.parents('.question');
parent.children('.answer.hideable').toggle();
parent.toggleClass('opened').toggleClass('collapsed');
@@ -52,3 +54,5 @@ app.views.HelpSectionView = app.views.StaticContentView.extend({
},
});
+// @license-end
+
diff --git a/app/assets/javascripts/app/views/help_view.js b/app/assets/javascripts/app/views/help_view.js
index 24234cb39..6cbcdf25c 100644
--- a/app/assets/javascripts/app/views/help_view.js
+++ b/app/assets/javascripts/app/views/help_view.js
@@ -1,3 +1,5 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
app.views.Help = app.views.StaticContentView.extend({
templateName : "help",
@@ -6,23 +8,39 @@ app.views.Help = app.views.StaticContentView.extend({
"click .faq-link-getting-help" : "gettingHelp",
"click .faq-link-sharing" : "sharing",
"click .faq-link-posts-and-posting" : "postsAndPosting",
+ "click .faq-link-tags": "tags",
"click .faq-link-keyboard-shortcuts" : "keyboardShortcuts",
+ "click .faq-link-chat" : "chat"
},
- initialize : function(options) {
+ initialize : function() {
this.GETTING_HELP_SUBS = {
getting_started_a: { tutorial_series: this.linkHtml("http://diasporafoundation.org/getting_started/sign_up", Diaspora.I18n.t( 'getting_started_tutorial' )) },
get_support_a_website: { link: this.linkHtml("https://diasporafoundation.org/", Diaspora.I18n.t( 'foundation_website' ))},
get_support_a_tutorials: { tutorials: this.linkHtml("https://diasporafoundation.org/tutorials", Diaspora.I18n.t( 'tutorials' ))},
get_support_a_wiki: { link: this.linkHtml("https://wiki.diasporafoundation.org/Special:Search", Diaspora.I18n.t( 'wiki' ))},
get_support_a_irc: { irc: this.linkHtml("https://wiki.diasporafoundation.org/How_We_Communicate#IRC", Diaspora.I18n.t( 'irc' ))},
- get_support_a_hashtag: { question: this.linkHtml("/tags/question", "#question")},
+ get_support_a_faq: { faq: this.linkHtml("https://wiki.diasporafoundation.org/FAQ_for_users", Diaspora.I18n.t( 'faq' ))},
+ get_support_a_hashtag: { question: this.linkHtml("/tags/question", "#question")}
};
this.POSTS_AND_POSTING_SUBS = {
format_text_a: {
markdown: this.linkHtml("http://diasporafoundation.org/formatting", Diaspora.I18n.t( 'markdown' )),
- here: this.linkHtml("http://daringfireball.net/projects/markdown/syntax", Diaspora.I18n.t( 'here' )),
+ here: this.linkHtml("http://daringfireball.net/projects/markdown/syntax", Diaspora.I18n.t( 'here' ))
+ }
+ };
+
+ this.TAGS_SUBS = {
+ filter_tags_a: {
+ third_party_tools: this.linkHtml("https://wiki.diasporafoundation.org/Tools_to_use_with_Diaspora", Diaspora.I18n.t( 'third_party_tools' ))
+ }
+ };
+
+ this.CHAT_SUBS = {
+ add_contact_roster_a: {
+ toggle_privilege: this.getChatIcons(),
+ contacts_page: this.linkHtml(Routes.contacts_path(), Diaspora.I18n.t('chat.contacts_page'))
}
};
@@ -43,19 +61,24 @@ app.views.Help = app.views.StaticContentView.extend({
title_tags: Diaspora.I18n.t( 'tags.title' ),
title_keyboard_shortcuts: Diaspora.I18n.t( 'keyboard_shortcuts.title' ),
title_miscellaneous: Diaspora.I18n.t( 'miscellaneous.title' ),
- }
+ title_chat: Diaspora.I18n.t( 'chat.title' ),
+ chat_enabled: this.chatEnabled()
+ };
return this;
},
- render: function(){
- var section = app.views.Base.prototype.render.apply(this, arguments);
+ render: function(section){
+ var html = app.views.Base.prototype.render.apply(this, arguments);
// After render actions
this.resetMenu(true);
this.renderStaticSection("getting_help", "faq_getting_help", this.GETTING_HELP_SUBS);
- return section;
+ var elTarget = this.findSection(section);
+ if(elTarget !== null){ $(elTarget).click(); }
+
+ return html;
},
showItems: function(el) {
@@ -98,8 +121,12 @@ app.views.Help = app.views.StaticContentView.extend({
menuClicked: function(e) {
this.resetMenu();
+
$(e.target).hide();
$(e.target).next().show();
+
+ var data = $(e.target).data('section');
+ app.router.navigate('help/' + data);
},
clearItems: function() {
@@ -115,8 +142,8 @@ app.views.Help = app.views.StaticContentView.extend({
renderStaticSection: function(section, template, subs) {
this.clearItems();
- data = $.extend(Diaspora.I18n.resolve(section), { className: section });
- help_section = new app.views.HelpSectionView({
+ var data = $.extend(Diaspora.I18n.resolve(section), { className: section });
+ var help_section = new app.views.HelpSectionView({
template: template,
data: data,
subs: subs
@@ -124,6 +151,18 @@ app.views.Help = app.views.StaticContentView.extend({
this.$('#faq').append(help_section.render().el);
},
+ /**
+ * Returns The section title whose data-section property equals the given query
+ * Returns null if nothing found
+ * @param data Value for the data-section to find
+ * @returns {jQuery}
+ */
+ findSection: function(data){
+ var res = this.$('a[data-section=' + data + ']');
+ if(res.length === 0){ return null; }
+ return res;
+ },
+
gettingHelp: function(e) {
this.renderStaticSection("getting_help", "faq_getting_help", this.GETTING_HELP_SUBS);
this.menuClicked(e);
@@ -145,6 +184,13 @@ app.views.Help = app.views.StaticContentView.extend({
e.preventDefault();
},
+ tags: function(e) {
+ this.renderStaticSection("tags", "faq_tags", this.TAGS_SUBS);
+ this.menuClicked(e);
+
+ e.preventDefault();
+ },
+
keyboardShortcuts: function(e) {
this.renderStaticSection("keyboard_shortcuts", "faq_keyboard_shortcuts", {});
this.menuClicked(e);
@@ -152,7 +198,27 @@ app.views.Help = app.views.StaticContentView.extend({
e.preventDefault();
},
+ chat: function(e){
+ this.renderStaticSection("chat", "faq_chat", this.CHAT_SUBS);
+ this.menuClicked(e);
+
+ e.preventDefault();
+ },
+
linkHtml: function(url, text) {
return "<a href=\"" + url + "\" target=\"_blank\">" + text + "</a>";
},
+
+ chatEnabled: function(){
+ return gon.chatEnabled;
+ },
+
+ getChatIcons: function(){
+ return '<div class="help-chat-icons">' +
+ ' <i class="entypo lock-open"></i>' +
+ ' <i class="entypo chat"></i>' +
+ ' <i class="entypo trash"></i>' +
+ '</div>';
+ }
});
+// @license-end
diff --git a/app/assets/javascripts/app/views/hovercard_view.js b/app/assets/javascripts/app/views/hovercard_view.js
index c293bba31..cfcf49762 100644
--- a/app/assets/javascripts/app/views/hovercard_view.js
+++ b/app/assets/javascripts/app/views/hovercard_view.js
@@ -1,3 +1,4 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
app.views.Hovercard = app.views.Base.extend({
templateName: 'hovercard',
@@ -14,8 +15,8 @@ app.views.Hovercard = app.views.Base.extend({
.on('mouseenter', '.hovercardable', _.bind(this._mouseenterHandler, this))
.on('mouseleave', '.hovercardable', _.bind(this._mouseleaveHandler, this));
- this.show_me = false;
- this.parent = null; // current 'hovercarable' element that caused HC to appear
+ this.showMe = false;
+ this.parent = null; // current 'hovercardable' element that caused HC to appear
// cache some element references
this.avatar = this.$('.avatar');
@@ -28,7 +29,7 @@ app.views.Hovercard = app.views.Base.extend({
},
postRenderTemplate: function() {
- this.$el.appendTo($('body'))
+ this.$el.appendTo($('body'));
},
deactivate: function() {
@@ -40,7 +41,7 @@ app.views.Hovercard = app.views.Base.extend({
},
_mouseenterHandler: function(event) {
- if( this.active == false ||
+ if( this.active === false ||
$.contains(this.el, event.target) ) { return false; }
var el = $(event.target);
@@ -48,28 +49,31 @@ app.views.Hovercard = app.views.Base.extend({
el = el.parents('a');
}
- if( el.attr('href').indexOf('/people') == -1 ) {
+ if( el.attr('href').indexOf('/people') === -1 ) {
// can't fetch data from that URL, aborting
return false;
}
- this.show_me = true;
+ this.showMe = true;
this.showHovercardOn(el);
return false;
},
_mouseleaveHandler: function(event) {
- if( this.active == false ||
- $.contains(this.el, event.relatedTarget) ) { return false; }
+ this.showMe = false;
+ if( this.active === false ||
+ $.contains(this.el, event.relatedTarget) ) { return false; }
+
+ if( this.mouseIsOverElement(this.parent, event) ||
+ this.mouseIsOverElement(this.$el, event) ) { return false; }
- this.show_me = false;
if( this.$el.is(':visible') ) {
this.$el.fadeOut('fast');
} else {
this.$el.hide();
}
- this.dropdown_container.empty();
+ this.dropdown_container.unbind().empty();
return false;
},
@@ -77,7 +81,7 @@ app.views.Hovercard = app.views.Base.extend({
var el = $(element);
var hc = this.$el;
- if( !this.show_me ) {
+ if( !this.showMe ) {
// mouse has left element
return;
}
@@ -94,11 +98,15 @@ app.views.Hovercard = app.views.Base.extend({
var self = this;
$.get(href, function(person){
- if( !person || person.length == 0 ) {
+ if( !person || person.length === 0 ) {
throw new Error("received data is not a person object");
}
self._populateHovercardWith(person);
+ if( !self.showMe ) {
+ // mouse has left element
+ return;
+ }
self.$el.fadeIn('fast');
});
},
@@ -119,15 +127,13 @@ app.views.Hovercard = app.views.Base.extend({
})) );
// set aspect dropdown
+ // TODO render me client side!!!
var href = this.href();
href += "/aspect_membership_button";
- if(gon.bootstrap == true){
- href += "?bootstrap=true";
- }
$.get(href, function(response) {
self.dropdown_container.html(response);
});
- var aspect_membership = new app.views.AspectMembership({el: self.dropdown_container});
+ new app.views.AspectMembership({el: self.dropdown_container});
},
_positionHovercard: function() {
@@ -138,5 +144,14 @@ app.views.Hovercard = app.views.Base.extend({
top: p_pos.top + p_height - 25,
left: p_pos.left
});
- }
+ },
+
+ mouseIsOverElement: function(element, event) {
+ var elPos = element.offset();
+ return event.pageX >= elPos.left &&
+ event.pageX <= elPos.left + element.width() &&
+ event.pageY >= elPos.top &&
+ event.pageY <= elPos.top + element.height();
+ },
});
+// @license-end
diff --git a/app/assets/javascripts/app/views/infinite_stream_view.js b/app/assets/javascripts/app/views/infinite_stream_view.js
index a1f3066f3..bac823ccc 100644
--- a/app/assets/javascripts/app/views/infinite_stream_view.js
+++ b/app/assets/javascripts/app/views/infinite_stream_view.js
@@ -1,3 +1,5 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
// Abstract Infinite Scroll View Super Class
// Requires:
// a stream model, assigned to this.stream
@@ -32,7 +34,7 @@ app.views.InfScroll = app.views.Base.extend({
createPostView : function(post){
var postView = new this.postClass({ model: post, stream: this.stream });
- if (this.collection.at(0).id == post.id) {
+ if (this.collection.at(0).id === post.id) {
// post is first in collection - insert view at top of the list
this.postViews.unshift(postView);
} else {
@@ -44,7 +46,7 @@ app.views.InfScroll = app.views.Base.extend({
// called for every item inserted in this.collection
addPostView : function(post) {
var el = this.createPostView(post).render().el;
- if (this.collection.at(0).id == post.id) {
+ if (this.collection.at(0).id === post.id) {
this.prependedPosts.insertBefore(el, this.prependedPosts.firstChild);
} else {
this.appendedPosts.appendChild(el);
@@ -56,7 +58,7 @@ app.views.InfScroll = app.views.Base.extend({
},
renderTemplate : function(){
- this.renderInitialPosts()
+ this.renderInitialPosts();
},
renderInitialPosts : function(){
@@ -64,7 +66,7 @@ app.views.InfScroll = app.views.Base.extend({
var els = document.createDocumentFragment();
this.stream.items.each(_.bind(function(post){
els.appendChild(this.createPostView(post).render().el);
- }, this))
+ }, this));
this.$el.html(els);
},
@@ -76,7 +78,7 @@ app.views.InfScroll = app.views.Base.extend({
},
showLoader: function(){
- $("#paginate .loader").removeClass("hidden")
+ $("#paginate .loader").removeClass("hidden");
},
finishedAdding: function() {
@@ -105,3 +107,4 @@ app.views.InfScroll = app.views.Base.extend({
}
}
});
+// @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 737b82792..a672645dd 100644
--- a/app/assets/javascripts/app/views/likes_info_view.js
+++ b/app/assets/javascripts/app/views/likes_info_view.js
@@ -1,3 +1,5 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
app.views.LikesInfo = app.views.Base.extend({
templateName : "likes-info",
@@ -17,11 +19,12 @@ app.views.LikesInfo = app.views.Base.extend({
likes : this.model.interactions.likes.toJSON(),
likesCount : this.model.interactions.likesCount(),
likes_fetched : this.model.interactions.get("fetched"),
- })
+ });
},
showAvatars : function(evt){
if(evt) { evt.preventDefault() }
- this.model.interactions.fetch()
+ this.model.interactions.fetch();
}
});
+// @license-end
diff --git a/app/assets/javascripts/app/views/location_stream.js b/app/assets/javascripts/app/views/location_stream.js
index fbf60f580..fd6fae946 100644
--- a/app/assets/javascripts/app/views/location_stream.js
+++ b/app/assets/javascripts/app/views/location_stream.js
@@ -1,3 +1,7 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
app.views.LocationStream = app.views.Content.extend({
templateName: "status-message-location"
});
+// @license-end
+
diff --git a/app/assets/javascripts/app/views/location_view.js b/app/assets/javascripts/app/views/location_view.js
index 20a7e580a..0fe6be15d 100644
--- a/app/assets/javascripts/app/views/location_view.js
+++ b/app/assets/javascripts/app/views/location_view.js
@@ -1,3 +1,5 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
app.views.Location = Backbone.View.extend({
el: "#location",
@@ -8,18 +10,18 @@ app.views.Location = Backbone.View.extend({
},
render: function(){
- $(this.el).append('<img alt="delete location" src="/assets/ajax-loader.gif">');
+ $(this.el).append('<img alt="ajax-loader" src="'+ImagePaths.get('ajax-loader.gif')+'">');
},
- getLocation: function(e){
- element = this.el;
+ getLocation: function(){
+ var element = this.el;
- locator = new OSM.Locator();
+ var locator = new OSM.Locator();
locator.getAddress(function(address, latlng){
$(element).html('<input id="location_address" type="text" class="input-block-level" value="' + address + '"/>');
$('#location_coords').val(latlng.latitude + "," + latlng.longitude);
- $(element).append('<a id="hide_location"><img alt="delete location" src="/assets/deletelabel.png"></a>');
});
},
});
+// @license-end
diff --git a/app/assets/javascripts/app/views/notification_dropdown_view.js b/app/assets/javascripts/app/views/notification_dropdown_view.js
new file mode 100644
index 000000000..a2c7525db
--- /dev/null
+++ b/app/assets/javascripts/app/views/notification_dropdown_view.js
@@ -0,0 +1,118 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
+app.views.NotificationDropdown = app.views.Base.extend({
+ events:{
+ "click #notifications-badge": "toggleDropdown"
+ },
+
+ initialize: function(){
+ $(document.body).click($.proxy(this.hideDropdown, 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');
+ },
+
+ toggleDropdown: function(evt){
+ evt.preventDefault();
+ evt.stopPropagation();
+ if(this.dropdownShowing()){ this.hideDropdown(evt); }
+ else{ this.showDropdown(); }
+ },
+
+ dropdownShowing: function(){
+ return this.dropdown.css('display') === 'block';
+ },
+
+ showDropdown: function(){
+ this.resetParams();
+ this.ajaxLoader.show();
+ this.badge.addClass('active');
+ this.dropdown.css('display', 'block');
+ this.dropdownNotifications.addClass('loading');
+ this.getNotifications();
+ },
+
+ hideDropdown: function(evt){
+ var inDropdown = $(evt.target).parents().is(this.dropdown);
+ var inHovercard = $.contains(app.hovercard.el, evt.target);
+ if(!inDropdown && !inHovercard && this.dropdownShowing()){
+ this.badge.removeClass('active');
+ this.dropdown.css('display', 'none');
+ this.dropdownNotifications.perfectScrollbar('destroy');
+ }
+ },
+
+ dropdownScroll: function(){
+ var isLoading = ($('.loading').length === 1);
+ if (this.isBottom() && this.hasMoreNotifs && !isLoading){
+ this.dropdownNotifications.addClass('loading');
+ this.getNotifications();
+ }
+ },
+
+ 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_path(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('img').fadeTo(200, 0, function(){
+ self.ajaxLoader.hide(300, function(){
+ self.ajaxLoader.find('img').css('opacity', 1);
+ });
+ });
+ },
+
+ 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').tooltip('destroy').tooltip();
+ }
+ });
+ });
+
+ this.hideAjaxLoader();
+
+ app.helpers.timeago(this.dropdownNotifications);
+
+ this.dropdownNotifications.perfectScrollbar('destroy').perfectScrollbar();
+ this.dropdownNotifications.removeClass('loading');
+ this.dropdownNotifications.scroll(function(){
+ self.dropdownScroll();
+ });
+ }
+});
+// @license-end
diff --git a/app/assets/javascripts/app/views/notifications_view.js b/app/assets/javascripts/app/views/notifications_view.js
index 72bb11849..808ce6749 100644
--- a/app/assets/javascripts/app/views/notifications_view.js
+++ b/app/assets/javascripts/app/views/notifications_view.js
@@ -1,40 +1,35 @@
+// @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 .unread-toggle" : "toggleUnread",
+ "click #mark_all_read_link": "markAllRead"
},
initialize: function() {
- Diaspora.page.header.notifications.setUpNotificationPage(this);
$(".unread-toggle .entypo").tooltip();
+ app.helpers.timeago($(document));
},
toggleUnread: function(evt) {
- note = $(evt.target).closest(".stream_element");
- unread = note.hasClass("unread");
+ var note = $(evt.target).closest(".stream_element");
+ var unread = note.hasClass("unread");
- if (unread) {
- this.setRead(note.data("guid"));
- }
- else {
- this.setUnread(note.data("guid"));
- }
+ if (unread){ this.setRead(note.data("guid")); }
+ else { this.setUnread(note.data("guid")); }
},
- setRead: function(guid) {
- $.ajax({
- url: "/notifications/" + guid,
- data: { set_unread: false },
- type: "PUT",
- context: this,
- success: this.clickSuccess
- });
- },
+ getAllUnread: function(){ return $('.media.stream_element.unread'); },
+
+ setRead: function(guid) { this.setUnreadStatus(guid, false); },
+
+ setUnread: function(guid){ this.setUnreadStatus(guid, true); },
- setUnread: function(guid) {
+ setUnreadStatus: function(guid, state){
$.ajax({
url: "/notifications/" + guid,
- data: { set_unread: true },
+ data: { set_unread: state },
type: "PUT",
context: this,
success: this.clickSuccess
@@ -42,51 +37,58 @@ app.views.Notifications = Backbone.View.extend({
},
clickSuccess: function(data) {
- type = $('.stream_element[data-guid=' + data["guid"] + ']').data('type');
+ var type = $('.stream_element[data-guid=' + data["guid"] + ']').data('type');
this.updateView(data["guid"], type, data["unread"]);
},
+ markAllRead: function(evt){
+ if(evt) { evt.preventDefault(); }
+ var self = this;
+ this.getAllUnread().each(function(i, el){
+ self.setRead($(el).data("guid"));
+ });
+ },
+
updateView: function(guid, type, unread) {
- change = unread ? 1 : -1;
- all_notes = $('ul.nav > li:eq(0) .badge');
- type_notes = $('ul.nav > li[data-type=' + type + '] .badge');
- header_badge = $('#notification_badge .badge_count');
-
- note = $('.stream_element[data-guid=' + guid + ']');
- if(unread) {
- note.removeClass("read").addClass("unread");
- $(".unread-toggle .entypo", note)
- .tooltip('destroy')
- .removeAttr("data-original-title")
- .attr('title',Diaspora.I18n.t('notifications.mark_read'))
- .tooltip();
- }
- else {
- note.removeClass("unread").addClass("read");
- $(".unread-toggle .entypo", note)
+ var change = unread ? 1 : -1,
+ all_notes = $('ul.nav > li:eq(0) .badge'),
+ type_notes = $('ul.nav > li[data-type=' + type + '] .badge'),
+ header_badge = $('#notification_badge .badge_count'),
+ note = $('.stream_element[data-guid=' + guid + ']'),
+ markAllReadLink = $('a#mark_all_read_link'),
+ translationKey = unread ? 'notifications.mark_read' : 'notifications.mark_unread';
+
+ if(unread){ note.removeClass("read").addClass("unread"); }
+ else { note.removeClass("unread").addClass("read"); }
+
+ $(".unread-toggle .entypo", note)
.tooltip('destroy')
.removeAttr("data-original-title")
- .attr('title',Diaspora.I18n.t('notifications.mark_unread'))
+ .attr('title',Diaspora.I18n.t(translationKey))
.tooltip();
- }
- all_notes.text( function(i,text) { return parseInt(text) + change });
- type_notes.text( function(i,text) { return parseInt(text) + change });
- header_badge.text( function(i,text) { return parseInt(text) + change });
- if(all_notes.text()>0){
- all_notes.addClass('badge-important').removeClass('badge-default');
- } else {
- all_notes.removeClass('badge-important').addClass('badge-default');
- }
- if(type_notes.text()>0){
- type_notes.addClass('badge-important').removeClass('badge-default');
- } else {
- type_notes.removeClass('badge-important').addClass('badge-default');
- }
- if(header_badge.text()>0){
+ [all_notes, type_notes, header_badge].forEach(function(element){
+ element.text(function(i, text){
+ return parseInt(text) + change });
+ });
+
+ [all_notes, type_notes].forEach(function(badge) {
+ if(badge.text() > 0) {
+ badge.addClass('badge-important').removeClass('badge-default');
+ }
+ else {
+ badge.removeClass('badge-important').addClass('badge-default');
+ }
+ });
+
+ if(header_badge.text() > 0){
header_badge.removeClass('hidden');
- } else {
+ markAllReadLink.removeClass('disabled');
+ }
+ else{
header_badge.addClass('hidden');
+ markAllReadLink.addClass('disabled');
}
}
});
+// @license-end
diff --git a/app/assets/javascripts/app/views/photo_view.js b/app/assets/javascripts/app/views/photo_view.js
index 072f44744..286d3fe98 100644
--- a/app/assets/javascripts/app/views/photo_view.js
+++ b/app/assets/javascripts/app/views/photo_view.js
@@ -1,3 +1,5 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
app.views.Photo = app.views.Base.extend({
templateName: "photo",
@@ -8,11 +10,10 @@ app.views.Photo = app.views.Base.extend({
"click .remove_post": "destroyModel"
},
- tooltipSelector : ".block_user, .delete",
+ tooltipSelector : ".control-icons a",
initialize : function() {
$(this.el).attr("id", this.model.get("guid"));
- this.model.bind('remove', this.remove, this);
return this;
},
@@ -22,3 +23,5 @@ app.views.Photo = app.views.Base.extend({
});
}
});
+// @license-end
+
diff --git a/app/assets/javascripts/app/views/photo_viewer.js b/app/assets/javascripts/app/views/photo_viewer.js
index 3f30cfbd4..d9a587400 100644
--- a/app/assets/javascripts/app/views/photo_viewer.js
+++ b/app/assets/javascripts/app/views/photo_viewer.js
@@ -1,7 +1,10 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
app.views.PhotoViewer = app.views.Base.extend({
templateName : "photo-viewer",
presenter : function(){
- return { photos : this.model.get("photos") } //json array of attributes, not backbone models, yet.
+ return { photos : this.model.get("photos") }; //json array of attributes, not backbone models, yet.
}
-}); \ No newline at end of file
+});
+// @license-end
diff --git a/app/assets/javascripts/app/views/photos_view.js b/app/assets/javascripts/app/views/photos_view.js
index 7be0a86f2..5d5969ef1 100644
--- a/app/assets/javascripts/app/views/photos_view.js
+++ b/app/assets/javascripts/app/views/photos_view.js
@@ -1,13 +1,15 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
app.views.Photos = app.views.InfScroll.extend({
- initialize : function(options) {
+ initialize : function() {
this.stream = this.model;
this.collection = this.stream.items;
// viable for extraction
this.stream.fetch();
- this.setupLightbox()
- this.setupInfiniteScroll()
+ this.setupLightbox();
+ this.setupInfiniteScroll();
},
postClass : app.views.Photo,
@@ -21,3 +23,4 @@ app.views.Photos = app.views.InfScroll.extend({
$(this.el).delegate("a.photo-link", "click", this.lightbox.lightboxImageClicked);
}
});
+// @license-end
diff --git a/app/assets/javascripts/app/views/poll_view.js b/app/assets/javascripts/app/views/poll_view.js
index 346b7cb5a..14355716d 100644
--- a/app/assets/javascripts/app/views/poll_view.js
+++ b/app/assets/javascripts/app/views/poll_view.js
@@ -1,3 +1,5 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
app.views.Poll = app.views.Base.extend({
templateName: "poll",
@@ -6,17 +8,24 @@ app.views.Poll = app.views.Base.extend({
"click .toggle_result" : "toggleResult"
},
- initialize: function(options) {
+ initialize: function() {
this.model.bind('change', this.render, this);
},
presenter: function(){
var defaultPresenter = this.defaultPresenter();
- var show_form = defaultPresenter.loggedIn &&
- !this.model.attributes.already_participated_in_poll;
+ var isReshare = (this.model.get('post_type') === 'Reshare');
+ var showForm = defaultPresenter.loggedIn &&
+ !isReshare &&
+ !this.model.get('already_participated_in_poll');
+ var originalPostLink = isReshare && this.model.get('root') ?
+ '<a href="/posts/' + this.model.get('root').id + '" class="root_post_link">' + Diaspora.I18n.t('poll.original_post') + '</a>' :
+ '';
return _.extend(defaultPresenter, {
- show_form: show_form
+ show_form: showForm,
+ is_reshare: isReshare,
+ original_post_link: originalPostLink
});
},
@@ -95,7 +104,7 @@ app.views.Poll = app.views.Base.extend({
var pollParticipation = new app.models.PollParticipation({
poll_answer_id: answer_id,
poll_id: this.poll.poll_id,
- post_id: this.poll.post_id,
+ post_id: this.poll.post_id,
});
var _this = this;
@@ -107,3 +116,5 @@ app.views.Poll = app.views.Base.extend({
}
});
+// @license-end
+
diff --git a/app/assets/javascripts/app/views/post_view.js b/app/assets/javascripts/app/views/post_view.js
index 59a8a985f..726055bb7 100644
--- a/app/assets/javascripts/app/views/post_view.js
+++ b/app/assets/javascripts/app/views/post_view.js
@@ -1,13 +1,16 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
app.views.Post = app.views.Base.extend({
presenter : function() {
return _.extend(this.defaultPresenter(), {
authorIsCurrentUser : app.currentUser.isAuthorOf(this.model),
showPost : this.showPost(),
- text : app.helpers.textFormatter(this.model.get("text"), this.model)
- })
+ text : app.helpers.textFormatter(this.model.get("text"), this.model.get("mentioned_people"))
+ });
},
showPost : function() {
- return (app.currentUser.get("showNsfw")) || !this.model.get("nsfw")
+ return (app.currentUser.get("showNsfw")) || !this.model.get("nsfw");
}
});
+// @license-end
diff --git a/app/assets/javascripts/app/views/profile_header_view.js b/app/assets/javascripts/app/views/profile_header_view.js
new file mode 100644
index 000000000..7a460e182
--- /dev/null
+++ b/app/assets/javascripts/app/views/profile_header_view.js
@@ -0,0 +1,63 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
+app.views.ProfileHeader = app.views.Base.extend({
+ templateName: 'profile_header',
+
+ initialize: function(opts) {
+ app.events.on('aspect:create', this.postRenderTemplate, this);
+ this.photos = _.has(opts, 'photos') ? opts.photos : null;
+ this.contacts = _.has(opts, 'contacts') ? opts.contacts : null;
+ },
+
+ presenter: function() {
+ return _.extend({}, this.defaultPresenter(), {
+ show_profile_btns: this._shouldShowProfileBtns(),
+ show_photos: this._shouldShowPhotos(),
+ show_contacts: this._shouldShowContacts(),
+ is_blocked: this.model.isBlocked(),
+ is_sharing: this.model.isSharing(),
+ is_receiving: this.model.isReceiving(),
+ is_mutual: this.model.isMutual(),
+ has_tags: this._hasTags(),
+ contacts: this.contacts,
+ photos: this.photos
+ });
+ },
+
+ _hasTags: function() {
+ return (this.model.get('profile')['tags'].length > 0);
+ },
+
+ _shouldShowProfileBtns: function() {
+ return (app.currentUser.authenticated() && !this.model.get('is_own_profile'));
+ },
+
+ _shouldShowPhotos: function() {
+ return (this.photos && this.photos.count > 0);
+ },
+
+ _shouldShowContacts: function() {
+ return (this.contacts && this.contacts.count > 0);
+ },
+
+ postRenderTemplate: function() {
+ var self = this;
+ var dropdownEl = this.$('.aspect_membership_dropdown.placeholder');
+ if( dropdownEl.length === 0 ) {
+ return;
+ }
+
+ // TODO render me client side!!!
+ var href = this.model.url() + '/aspect_membership_button?create=true&size=normal';
+
+ $.get(href, function(resp) {
+ dropdownEl.html(resp);
+ new app.views.AspectMembership({el: $('.aspect_dropdown',dropdownEl)});
+
+ // UGLY (re-)attach the facebox
+ self.$('a[rel*=facebox]').facebox();
+ });
+ }
+});
+// @license-end
+
diff --git a/app/assets/javascripts/app/views/profile_sidebar_view.js b/app/assets/javascripts/app/views/profile_sidebar_view.js
new file mode 100644
index 000000000..a8b0d4074
--- /dev/null
+++ b/app/assets/javascripts/app/views/profile_sidebar_view.js
@@ -0,0 +1,17 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
+app.views.ProfileSidebar = app.views.Base.extend({
+ templateName: 'profile_sidebar',
+
+ presenter: function() {
+ return _.extend({}, this.defaultPresenter(), {
+ show_profile_info: this._shouldShowProfileInfo(),
+ });
+ },
+
+ _shouldShowProfileInfo: function() {
+ return (this.model.isSharing() || this.model.get('is_own_profile'));
+ }
+});
+// @license-end
+
diff --git a/app/assets/javascripts/app/views/publisher/aspect_selector_blueprint_view.js b/app/assets/javascripts/app/views/publisher/aspect_selector_blueprint_view.js
deleted file mode 100644
index 9d21e43f6..000000000
--- a/app/assets/javascripts/app/views/publisher/aspect_selector_blueprint_view.js
+++ /dev/null
@@ -1,91 +0,0 @@
-/* Copyright (c) 2010-2012, Diaspora Inc. This file is
- * licensed under the Affero General Public License version 3 or later. See
- * the COPYRIGHT file.
- */
-
-// Aspects view for the publisher.
-// Provides the ability to specify the visibility of posted content as public
-// or limited to selected aspects
-app.views.PublisherAspectSelectorBlueprint = Backbone.View.extend({
-
- events: {
- "click .dropdown_list > li": "toggleAspect"
- },
-
- initialize: function(opts) {
- this.form = opts.form;
- },
-
- // event handler for aspect selection
- toggleAspect: function(evt) {
- var el = $(evt.target);
- var btn = el.parent('.dropdown').find('.button');
-
- // visually toggle the aspect selection
- if( el.is('.radio') ) {
- AspectsDropdown.toggleRadio(el);
- } else {
- AspectsDropdown.toggleCheckbox(el);
- }
-
- // update the selection summary
- this._updateAspectsNumber(el);
-
- this._updateSelectedAspectIds();
- },
-
- // select a (list of) aspects in the dropdown selector by the given list of ids
- updateAspectsSelector: function(ids){
- var el = this.$("ul.dropdown_list");
- this.$('.dropdown_list > li').each(function(){
- var el = $(this);
- var aspectId = el.data('aspect_id');
- if (_.contains(ids, aspectId)) {
- el.addClass('selected');
- }
- else {
- el.removeClass('selected');
- }
- });
-
- this._updateAspectsNumber(el);
- this._updateSelectedAspectIds();
- },
-
- // take care of the form fields that will indicate the selected aspects
- _updateSelectedAspectIds: function() {
- var self = this;
-
- // remove previous selection
- this.form.find('input[name="aspect_ids[]"]').remove();
-
- // create fields for current selection
- this.$('.dropdown_list li.selected').each(function() {
- var el = $(this);
- var aspectId = el.data('aspect_id');
-
- self._addHiddenAspectInput(aspectId);
-
- // close the dropdown when a radio item was selected
- if( el.is('.radio') ) {
- el.closest('.dropdown').removeClass('active');
- }
- });
- },
-
- _updateAspectsNumber: function(el){
- AspectsDropdown.updateNumber(
- el.closest(".dropdown_list"),
- null,
- el.parent().find('li.selected').length,
- ''
- );
- },
-
- _addHiddenAspectInput: function(id) {
- var uid = _.uniqueId('aspect_ids_');
- this.form.append(
- '<input id="'+uid+'" name="aspect_ids[]" type="hidden" value="'+id+'">'
- );
- }
-});
diff --git a/app/assets/javascripts/app/views/publisher/aspect_selector_view.js b/app/assets/javascripts/app/views/publisher/aspect_selector_view.js
index f2135f51d..7145de4ad 100644
--- a/app/assets/javascripts/app/views/publisher/aspect_selector_view.js
+++ b/app/assets/javascripts/app/views/publisher/aspect_selector_view.js
@@ -1,3 +1,5 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
//= require ../aspects_dropdown_view
/*
@@ -20,10 +22,9 @@ app.views.PublisherAspectSelector = app.views.AspectsDropdown.extend({
var target = $(evt.target).closest('li');
// visually toggle the aspect selection
- if( target.is('.radio') ) {
+ if (target.is('.radio')) {
this._toggleRadio(target);
- }
- else if( target.is('.aspect_selector') ) {
+ } else if (target.is('.aspect_selector')) {
// don't close the dropdown
evt.stopPropagation();
this._toggleCheckbox(target);
@@ -31,6 +32,16 @@ app.views.PublisherAspectSelector = app.views.AspectsDropdown.extend({
this._updateSelectedAspectIds();
this._updateButton('btn-default');
+
+ // update the globe or lock icon
+ var icon = this.$('#visibility-icon');
+ if (target.find('.text').text().trim() === Diaspora.I18n.t('stream.public')) {
+ icon.removeClass('lock');
+ icon.addClass('globe');
+ } else {
+ icon.removeClass('globe');
+ icon.addClass('lock');
+ }
},
// select a (list of) aspects in the dropdown selector by the given list of ids
@@ -57,3 +68,5 @@ app.views.PublisherAspectSelector = app.views.AspectsDropdown.extend({
});
}
});
+// @license-end
+
diff --git a/app/assets/javascripts/app/views/publisher/getting_started_view.js b/app/assets/javascripts/app/views/publisher/getting_started_view.js
index bd45bf5d4..6d36a83a7 100644
--- a/app/assets/javascripts/app/views/publisher/getting_started_view.js
+++ b/app/assets/javascripts/app/views/publisher/getting_started_view.js
@@ -1,3 +1,5 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
/* Copyright (c) 2010-2012, Diaspora Inc. This file is
* licensed under the Affero General Public License version 3 or later. See
* the COPYRIGHT file.
@@ -21,21 +23,24 @@ app.views.PublisherGettingStarted = Backbone.View.extend({
offset: 30,
id: 'first_message_explain',
placement: 'right',
- html: true
+ html: true,
+ container: 'body'
}, 600);
this._addPopover(this.el_visibility, {
trigger: 'manual',
offset: 10,
id: 'message_visibility_explain',
placement: 'bottom',
- html: true
+ html: true,
+ container: 'body'
}, 1000);
this._addPopover(this.el_stream, {
trigger: 'manual',
offset: -5,
id: 'stream_explain',
placement: 'left',
- html: true
+ html: true,
+ container: 'body'
}, 1400);
// hide some popovers when a post is created
@@ -60,8 +65,10 @@ app.views.PublisherGettingStarted = Backbone.View.extend({
var close = $(popup).find('.close');
close.click(function() {
- if( $('.popover').length==1 ) {
- $.get('/getting_started_completed');
+ if( $('.popover').length === 1 ) {
+ $.get('/getting_started_completed', {success: function() {
+ $("#welcome-to-diaspora, #welcome-to-diaspora~br").remove();
+ }});
}
el.popover('hide');
return false;
@@ -69,3 +76,5 @@ app.views.PublisherGettingStarted = Backbone.View.extend({
}, timeout);
}
});
+// @license-end
+
diff --git a/app/assets/javascripts/app/views/publisher/poll_creator_view.js b/app/assets/javascripts/app/views/publisher/poll_creator_view.js
index ebc6755aa..e1c31fb2b 100644
--- a/app/assets/javascripts/app/views/publisher/poll_creator_view.js
+++ b/app/assets/javascripts/app/views/publisher/poll_creator_view.js
@@ -1,3 +1,5 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
app.views.PublisherPollCreator = app.views.Base.extend({
templateName: "poll_creator",
@@ -64,22 +66,20 @@ app.views.PublisherPollCreator = app.views.Base.extend({
this.$('input').val('');
},
- validate: function(evt){
- var input = $(evt.target);
+ validate: function(){
this.validatePoll();
this.trigger('change');
},
validateInput: function(input){
- var wrapper = input.parents('.control-group');
var isValid = this.isValidInput(input);
if(isValid){
- wrapper.removeClass('error');
+ input.removeClass('error');
return true;
}
else {
- wrapper.addClass('error');
+ input.addClass('error');
return false;
}
},
@@ -97,10 +97,12 @@ app.views.PublisherPollCreator = app.views.Base.extend({
// Validate the input unless it is the last one, or there are only the
// question field and two options
if( i !== inputs.length - 1 || inputs.length <= 3) {
- if(_this.validateInput($(input)) == false) pollValid = false;
+ if(_this.validateInput($(input)) === false) pollValid = false;
}
});
return pollValid;
}
});
+// @license-end
+
diff --git a/app/assets/javascripts/app/views/publisher/services_view.js b/app/assets/javascripts/app/views/publisher/services_view.js
index 757a8f369..1ed4c988b 100644
--- a/app/assets/javascripts/app/views/publisher/services_view.js
+++ b/app/assets/javascripts/app/views/publisher/services_view.js
@@ -1,3 +1,5 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
/* Copyright (c) 2010-2012, Diaspora Inc. This file is
* licensed under the Affero General Public License version 3 or later. See
* the COPYRIGHT file.
@@ -61,3 +63,5 @@ app.views.PublisherServices = Backbone.View.extend({
}
}
});
+// @license-end
+
diff --git a/app/assets/javascripts/app/views/publisher/uploader_view.js b/app/assets/javascripts/app/views/publisher/uploader_view.js
index 60b1ef8af..00580f57a 100644
--- a/app/assets/javascripts/app/views/publisher/uploader_view.js
+++ b/app/assets/javascripts/app/views/publisher/uploader_view.js
@@ -1,3 +1,4 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
// Uploader view for the publisher.
// Initializes the file uploader plugin and handles callbacks for the upload
@@ -46,7 +47,7 @@ app.views.PublisherUploader = Backbone.View.extend({
.width(progress + '%');
},
- submitHandler: function(id, fileName) {
+ submitHandler: function() {
this.$el.addClass('loading');
this._addPhotoPlaceholder();
},
@@ -65,7 +66,7 @@ app.views.PublisherUploader = Backbone.View.extend({
);
},
- uploadCompleteHandler: function(id, fileName, response) {
+ uploadCompleteHandler: function(_id, fileName, response) {
if (response.success){
this.el_info.text(Diaspora.I18n.t('photo_uploader.completed', {file: fileName})).fadeTo(2000, 0);
@@ -109,7 +110,7 @@ app.views.PublisherUploader = Backbone.View.extend({
.find('div.progress').remove();
// no more placeholders? enable buttons
- if( publisher.el_photozone.find('li.loading').length == 0 ) {
+ if( publisher.el_photozone.find('li.loading').length === 0 ) {
this.$el.removeClass('loading');
publisher.setButtonsEnabled(true);
}
@@ -126,7 +127,7 @@ app.views.PublisherUploader = Backbone.View.extend({
// remove an already uploaded photo
_removePhoto: function(evt) {
var self = this;
- var photo = $(evt.target).parents('.publisher_photo')
+ var photo = $(evt.target).parents('.publisher_photo');
var img = photo.find('img');
photo.addClass('dim');
@@ -138,7 +139,7 @@ app.views.PublisherUploader = Backbone.View.extend({
$.when(photo.fadeOut(400)).then(function(){
photo.remove();
- if( self.publisher.$('.publisher_photo').length == 0 ) {
+ if( self.publisher.$('.publisher_photo').length === 0 ) {
// no more photos left...
self.publisher.el_wrapper.removeClass('with_attachments');
}
@@ -152,3 +153,4 @@ app.views.PublisherUploader = Backbone.View.extend({
}
});
+// @license-end
diff --git a/app/assets/javascripts/app/views/publisher_view.js b/app/assets/javascripts/app/views/publisher_view.js
index a975522de..5a928f102 100644
--- a/app/assets/javascripts/app/views/publisher_view.js
+++ b/app/assets/javascripts/app/views/publisher_view.js
@@ -1,3 +1,5 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
/* Copyright (c) 2010-2012, Diaspora Inc. This file is
* licensed under the Affero General Public License version 3 or later. See
* the COPYRIGHT file.
@@ -5,10 +7,9 @@
//= require ./publisher/services_view
//= require ./publisher/aspect_selector_view
-//= require ./publisher/aspect_selector_blueprint_view
//= require ./publisher/getting_started_view
//= require ./publisher/uploader_view
-//= require jquery.textchange
+//= require jquery-textchange
app.views.Publisher = Backbone.View.extend({
@@ -46,10 +47,17 @@ app.views.Publisher = Backbone.View.extend({
// init autoresize plugin
this.el_input.autoResize({ 'extraSpace' : 10, 'maxHeight' : Infinity });
+ // if there is data in the publisher we ask for a confirmation
+ // before the user is able to leave the page
+ $(window).on('beforeunload', _.bind(this._beforeUnload, this));
+
// sync textarea content
- if( this.el_hiddenInput.val() == "" ) {
+ if( this.el_hiddenInput.val() === "" ) {
this.el_hiddenInput.val( this.el_input.val() );
}
+ if( this.el_input.val() === "" ) {
+ this.el_input.val( this.el_hiddenInput.val() );
+ }
// hide close and preview buttons, in case publisher is standalone
// (e.g. bookmarklet, mentions popup)
@@ -62,11 +70,11 @@ app.views.Publisher = Backbone.View.extend({
// textchange event won't be called in Backbone...
this.el_input.bind('textchange', $.noop);
- var _this = this
+ var _this = this;
$('body').on('click', function(event){
// if the click event is happened outside the publisher view, then try to close the box
- if( _this.el && $(event.target).closest('#publisher').attr('id') != _this.el.id){
- _this.tryClose()
+ if( _this.el && $(event.target).closest('#publisher').attr('id') !== _this.el.id){
+ _this.tryClose();
}
});
@@ -75,19 +83,20 @@ app.views.Publisher = Backbone.View.extend({
this.close();
this.showSpinner(true);
});
-
+
// open publisher on post error
this.on('publisher:error', function() {
this.open();
this.showSpinner(false);
});
- // resetting the poll view
+ // resetting the poll view
this.on('publisher:sync', function() {
this.view_poll_creator.render();
});
this.initSubviews();
+ this.checkSubmitAvailability();
return this;
},
@@ -105,14 +114,9 @@ app.views.Publisher = Backbone.View.extend({
form: form
});
- this.view_aspect_selector_blueprint = new app.views.PublisherAspectSelectorBlueprint({
- el: this.$('.public_toggle > .dropdown'),
- form: form
- });
-
this.view_getting_started = new app.views.PublisherGettingStarted({
el_first_msg: this.el_input,
- el_visibility: this.$('.public_toggle > .dropdown'),
+ el_visibility: this.$('.public_toggle .aspect_dropdown > .dropdown-toggle'),
el_stream: $('#gs-shim')
});
@@ -123,23 +127,22 @@ app.views.Publisher = Backbone.View.extend({
this.view_uploader.on('change', this.checkSubmitAvailability, this);
this.view_poll_creator = new app.views.PublisherPollCreator({
- el: this.$('#publisher-poll-creator')
+ el: this.$('#poll_creator_container')
});
this.view_poll_creator.on('change', this.checkSubmitAvailability, this);
this.view_poll_creator.render();
-
},
// set the selected aspects in the dropdown by their ids
setSelectedAspects: function(ids) {
this.view_aspect_selector.updateAspectsSelector(ids);
- this.view_aspect_selector_blueprint.updateAspectsSelector(ids);
},
// inject content into the publisher textarea
setText: function(txt) {
this.el_input.val(txt);
this.el_hiddenInput.val(txt);
+ this.prefillText = txt;
this.el_input.trigger('input');
this.handleTextchange();
@@ -157,7 +160,7 @@ app.views.Publisher = Backbone.View.extend({
if(evt){ evt.preventDefault(); }
// Auto-adding a poll answer always leaves an empty box when the user starts
- // typing in the last box. We'll delete the last one to avoid submitting an
+ // typing in the last box. We'll delete the last one to avoid submitting an
// empty poll answer and failing validation.
this.view_poll_creator.removeLastAnswer();
@@ -192,7 +195,9 @@ app.views.Publisher = Backbone.View.extend({
self.view_poll_creator.trigger('publisher:sync');
}
- if(app.stream) app.stream.addNow(statusMessage.toJSON());
+ if(app.stream && !self.standalone){
+ app.stream.addNow(statusMessage.toJSON());
+ }
// clear state
self.clear();
@@ -200,10 +205,10 @@ app.views.Publisher = Backbone.View.extend({
// standalone means single-shot posting (until further notice)
if( self.standalone ) self.setEnabled(false);
},
- error: function() {
+ error: function(model, resp) {
if( app.publisher ) app.publisher.trigger('publisher:error');
self.setInputEnabled(true);
- Diaspora.page.flashMessages.render({ 'success':false, 'notice':Diaspora.I18n.t('failed_to_post_message') });
+ Diaspora.page.flashMessages.render({ 'success':false, 'notice':resp.responseText });
self.setButtonsEnabled(true);
self.setInputEnabled(true);
}
@@ -212,7 +217,7 @@ app.views.Publisher = Backbone.View.extend({
// creates the location
showLocation: function(){
- if($('#location').length == 0){
+ if($('#location').length === 0){
$('#location_container').append('<div id="location"></div>');
this.el_wrapper.addClass('with_location');
this.view_locator = new app.views.Location();
@@ -235,7 +240,7 @@ app.views.Publisher = Backbone.View.extend({
// avoid submitting form when pressing Enter key
avoidEnter: function(evt){
- if(evt.keyCode == 13)
+ if(evt.keyCode === 13)
return false;
},
@@ -247,7 +252,7 @@ app.views.Publisher = Backbone.View.extend({
var serializedForm = $(evt.target).closest("form").serializeObject();
- var photos = new Array();
+ var photos = [];
$('li.publisher_photo img').each(function(){
var file = $(this).attr('src').substring("/uploads/images/".length);
photos.push(
@@ -261,11 +266,19 @@ app.views.Publisher = Backbone.View.extend({
);
});
- var mentioned_people = new Array();
- var regexp = new RegExp("@{\(\[\^\;\]\+\); \(\[\^\}\]\+\)}", "g");
- while(user=regexp.exec(serializedForm["status_message[text]"])){
+ var mentioned_people = [],
+ regexp = new RegExp("@{\(\[\^\;\]\+\); \(\[\^\}\]\+\)}", "g"),
+ user;
+
+ var getMentionedUser = function(handle) {
+ return Mentions.contacts.filter(function(user) {
+ return user.handle === handle;
+ })[0];
+ };
+
+ while( (user = regexp.exec(serializedForm["status_message[text]"])) ){
// user[1]: name, user[2]: handle
- var mentioned_user = Mentions.contacts.filter(function(item) { return item.handle == user[2];})[0];
+ var mentioned_user = getMentionedUser(user[2]);
if(mentioned_user){
mentioned_people.push({
"id":mentioned_user["id"],
@@ -279,7 +292,7 @@ app.views.Publisher = Backbone.View.extend({
var date = (new Date()).toISOString();
- var poll = undefined;
+ var poll;
var poll_question = serializedForm["poll_question"];
var poll_answers_arry = _.flatten([serializedForm["poll_answers[]"]]);
var poll_answers = _.map(poll_answers_arry, function(answer){
@@ -298,7 +311,7 @@ app.views.Publisher = Backbone.View.extend({
var previewMessage = {
"id" : 0,
"text" : serializedForm["status_message[text]"],
- "public" : serializedForm["aspect_ids[]"]=="public",
+ "public" : serializedForm["aspect_ids[]"] === "public",
"created_at" : date,
"interacted_at" : date,
"post_type" : "StatusMessage",
@@ -339,7 +352,7 @@ app.views.Publisher = Backbone.View.extend({
},
keyDown : function(evt) {
- if( evt.keyCode == 13 && evt.ctrlKey ) {
+ if( evt.keyCode === 13 && evt.ctrlKey ) {
this.$("form").submit();
this.open();
return false;
@@ -350,6 +363,8 @@ app.views.Publisher = Backbone.View.extend({
// clear text(s)
this.el_input.val('');
this.el_hiddenInput.val('');
+ this.el_input.trigger('keyup')
+ .trigger('keydown');
// remove mentions
this.el_input.mentionsInput('reset');
@@ -376,7 +391,7 @@ app.views.Publisher = Backbone.View.extend({
// enable input
this.setInputEnabled(true);
-
+
// enable buttons
this.setButtonsEnabled(true);
@@ -396,7 +411,7 @@ app.views.Publisher = Backbone.View.extend({
tryClose : function(){
// if it is not submittable, close it.
if( !this._submittable() ){
- this.close()
+ this.close();
}
},
@@ -426,7 +441,7 @@ app.views.Publisher = Backbone.View.extend({
else
this.$('#publisher_spinner').addClass('hidden');
},
-
+
checkSubmitAvailability: function() {
if( this._submittable() ) {
this.setButtonsEnabled(true);
@@ -443,15 +458,23 @@ app.views.Publisher = Backbone.View.extend({
},
setButtonsEnabled: function(bool) {
- bool = !bool;
- this.el_submit.prop({disabled: bool});
- this.el_preview.prop({disabled: bool});
+ if (bool) {
+ this.el_submit.removeProp('disabled');
+ this.el_preview.removeProp('disabled');
+ } else {
+ this.el_submit.prop('disabled', true);
+ this.el_preview.prop('disabled', true);
+ }
},
setInputEnabled: function(bool) {
- bool = !bool;
- this.el_input.prop({disabled: bool});
- this.el_hiddenInput.prop({disabled: bool});
+ if (bool) {
+ this.el_input.removeProp('disabled');
+ this.el_hiddenInput.removeProp('disabled');
+ } else {
+ this.el_input.prop('disabled', true);
+ this.el_hiddenInput.prop('disabled', true);
+ }
},
// determine submit availability
@@ -470,8 +493,15 @@ app.views.Publisher = Backbone.View.extend({
this.el_input.mentionsInput("val", function(value){
self.el_hiddenInput.val(value);
});
- }
+ },
+ _beforeUnload: function(e) {
+ if(this._submittable() && this.el_input.val() !== this.prefillText){
+ var confirmationMessage = Diaspora.I18n.t("confirm_unload");
+ (e || window.event).returnValue = confirmationMessage; //Gecko + IE
+ return confirmationMessage; //Webkit, Safari, Chrome, etc.
+ }
+ }
});
// jQuery helper for serializing a <form> into JSON
@@ -491,3 +521,4 @@ $.fn.serializeObject = function()
});
return o;
};
+// @license-end
diff --git a/app/assets/javascripts/app/views/search_view.js b/app/assets/javascripts/app/views/search_view.js
new file mode 100644
index 000000000..aed2e54ca
--- /dev/null
+++ b/app/assets/javascripts/app/views/search_view.js
@@ -0,0 +1,72 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+app.views.Search = app.views.Base.extend({
+ initialize: function(){
+ this.searchFormAction = this.$el.attr('action');
+ this.searchInput = this.$('input[type="search"]');
+ this.searchInputName = this.$('input[type="search"]').attr('name');
+ this.searchInputHandle = this.$('input[type="search"]').attr('handle');
+ this.options = {
+ cacheLength: 15,
+ delay: 800,
+ extraParams: {limit: 4},
+ formatItem: this.formatItem,
+ formatResult: this.formatResult,
+ max: 5,
+ minChars: 2,
+ onSelect: this.selectItemCallback,
+ parse: this.parse,
+ scroll: false,
+ context: this
+ };
+
+ var self = this;
+ this.searchInput.autocomplete(self.searchFormAction + '.json',
+ $.extend(self.options, { element: self.searchInput }));
+ },
+
+ formatItem: function(row){
+ if(typeof row.search !== 'undefined') { return Diaspora.I18n.t('search_for', row); }
+ else {
+ var item = '';
+ if (row.avatar) { item += '<img src="' + row.avatar + '" class="avatar"/>'; }
+ item += row.name;
+ if (row.handle) { item += '<div class="search_handle">' + row.handle + '</div>'; }
+ return item;
+ }
+ },
+
+ formatResult: function(row){ return Handlebars.Utils.escapeExpression(row.name); },
+
+ parse: function(data) {
+ var self = this.context;
+
+ var results = data.map(function(person){
+ person.name = self.formatResult(person);
+ return {data : person, value : person.name};
+ });
+
+ results.push({
+ data: {
+ name: self.searchInput.val(),
+ url: self.searchFormAction + '?' + self.searchInputName + '=' + self.searchInput.val(),
+ search: true
+ },
+ value: self.searchInput.val()
+ });
+
+ return results;
+ },
+
+ selectItemCallback: function(evt, data, formatted){
+ var self = this.context;
+
+ if(data.search === true){
+ window.location = self.searchFormAction + '?' + self.searchInputName + '=' + data.name;
+ }
+ else{ // The actual result
+ self.options.element.val(formatted);
+ window.location = data.url ? data.url : '/tags/' + data.name.substring(1);
+ }
+ }
+});
+// @license-ends
diff --git a/app/assets/javascripts/app/views/sidebar.js b/app/assets/javascripts/app/views/sidebar.js
index a1f388684..d73dbf100 100644
--- a/app/assets/javascripts/app/views/sidebar.js
+++ b/app/assets/javascripts/app/views/sidebar.js
@@ -1,3 +1,5 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
app.views.Sidebar = app.views.Base.extend({
el: '.rightBar',
@@ -9,3 +11,5 @@ app.views.Sidebar = app.views.Base.extend({
event.target.select();
}
});
+// @license-end
+
diff --git a/app/assets/javascripts/app/views/single-post-viewer/single_post_actions.js b/app/assets/javascripts/app/views/single-post-viewer/single_post_actions.js
index 69396abe6..65ea3df45 100644
--- a/app/assets/javascripts/app/views/single-post-viewer/single_post_actions.js
+++ b/app/assets/javascripts/app/views/single-post-viewer/single_post_actions.js
@@ -1,3 +1,5 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
app.views.SinglePostActions = app.views.Feedback.extend({
templateName: "single-post-viewer/single-post-actions",
@@ -8,14 +10,14 @@ app.views.SinglePostActions = app.views.Feedback.extend({
},
presenter: function() {
- var interactions = this.model.interactions
+ var interactions = this.model.interactions;
return _.extend(this.defaultPresenter(), {
authorIsNotCurrentUser : this.authorIsNotCurrentUser(),
userCanReshare : interactions.userCanReshare(),
userLike : interactions.userLike(),
userReshare : interactions.userReshare()
- })
+ });
},
renderPluginWidgets : function() {
@@ -30,7 +32,7 @@ app.views.SinglePostActions = app.views.Feedback.extend({
},
authorIsNotCurrentUser: function() {
- return app.currentUser.authenticated() && this.model.get("author").id != app.user().id
+ return app.currentUser.authenticated() && this.model.get("author").id !== app.user().id;
}
-
});
+// @license-end
diff --git a/app/assets/javascripts/app/views/single-post-viewer/single_post_comment_stream.js b/app/assets/javascripts/app/views/single-post-viewer/single_post_comment_stream.js
index b4a746a29..ebb0a9dbf 100644
--- a/app/assets/javascripts/app/views/single-post-viewer/single_post_comment_stream.js
+++ b/app/assets/javascripts/app/views/single-post-viewer/single_post_comment_stream.js
@@ -1,31 +1,33 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
app.views.SinglePostCommentStream = app.views.CommentStream.extend({
- tooltipSelector: "time, .controls a",
+ tooltipSelector: "time, .control-icons a",
initialize: function(){
$(window).on('hashchange',this.highlightPermalinkComment);
},
-
+
highlightPermalinkComment: function() {
if(document.location.hash){
- element=$(document.location.hash);
- headerSize=50;
+ var element = $(document.location.hash);
+ var headerSize = 50;
$(".highlighted").removeClass("highlighted");
element.addClass("highlighted");
- pos=element.offset().top-headerSize;
+ var pos = element.offset().top - headerSize;
$("html").animate({scrollTop:pos});
}
},
postRenderTemplate: function() {
- app.views.CommentStream.prototype.postRenderTemplate.apply(this)
- this.$(".new_comment_form_wrapper").removeClass('hidden')
- _.defer(this.highlightPermalinkComment)
+ app.views.CommentStream.prototype.postRenderTemplate.apply(this);
+ this.$(".new_comment_form_wrapper").removeClass('hidden');
+ _.defer(this.highlightPermalinkComment);
},
appendComment: function(comment) {
// Set the post as the comment's parent, so we can check
// on post ownership in the Comment view.
- comment.set({parent : this.model.toJSON()})
+ comment.set({parent : this.model.toJSON()});
this.$(".comments").append(new app.views.ExpandedComment({
model: comment
@@ -37,6 +39,7 @@ app.views.SinglePostCommentStream = app.views.CommentStream.extend({
moreCommentsCount : 0,
showExpandCommentsLink : false,
commentsCount : this.model.interactions.commentsCount()
- })
+ });
},
-})
+});
+// @license-end
diff --git a/app/assets/javascripts/app/views/single-post-viewer/single_post_content_view.js b/app/assets/javascripts/app/views/single-post-viewer/single_post_content_view.js
index a012282c6..967b72f9f 100644
--- a/app/assets/javascripts/app/views/single-post-viewer/single_post_content_view.js
+++ b/app/assets/javascripts/app/views/single-post-viewer/single_post_content_view.js
@@ -1,9 +1,12 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
app.views.SinglePostContent = app.views.Base.extend({
templateName: 'single-post-viewer/single-post-content',
tooltipSelector: "time, .post_scope",
subviews : {
"#single-post-actions" : "singlePostActionsView",
+ '#single-post-moderation': "singlePostModerationView",
'#real-post-content' : 'postContentView',
".oembed" : "oEmbedView",
".opengraph" : "openGraphView",
@@ -13,8 +16,9 @@ app.views.SinglePostContent = app.views.Base.extend({
initialize : function() {
this.singlePostActionsView = new app.views.SinglePostActions({model: this.model});
+ this.singlePostModerationView = new app.views.SinglePostModeration({model: this.model});
this.oEmbedView = new app.views.OEmbed({model : this.model});
- this.openGraphView = new app.views.OpenGraph({model : this.model});
+ this.openGraphView = new app.views.SPVOpenGraph({model : this.model});
this.postContentView = new app.views.ExpandedStatusMessage({model: this.model});
this.pollView = new app.views.Poll({ model: this.model });
},
@@ -27,11 +31,12 @@ app.views.SinglePostContent = app.views.Base.extend({
return _.extend(this.defaultPresenter(), {
authorIsCurrentUser :app.currentUser.isAuthorOf(this.model),
showPost : this.showPost(),
- text : app.helpers.textFormatter(this.model.get("text"), this.model)
- })
+ text : app.helpers.textFormatter(this.model.get("text"), this.model.get("mentioned_people"))
+ });
},
showPost : function() {
- return (app.currentUser.get("showNsfw")) || !this.model.get("nsfw")
+ return (app.currentUser.get("showNsfw")) || !this.model.get("nsfw");
}
});
+// @license-end
diff --git a/app/assets/javascripts/app/views/single-post-viewer/single_post_interactions.js b/app/assets/javascripts/app/views/single-post-viewer/single_post_interactions.js
index 17925c0f0..b8c4a8661 100644
--- a/app/assets/javascripts/app/views/single-post-viewer/single_post_interactions.js
+++ b/app/assets/javascripts/app/views/single-post-viewer/single_post_interactions.js
@@ -1,3 +1,5 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
app.views.SinglePostInteractions = app.views.Base.extend({
templateName: "single-post-viewer/single-post-interactions",
tooltipSelector: ".avatar.micro",
@@ -8,11 +10,11 @@ app.views.SinglePostInteractions = app.views.Base.extend({
initialize : function() {
this.model.interactions.on('change', this.render, this);
- this.commentStreamView = new app.views.SinglePostCommentStream({model: this.model})
+ this.commentStreamView = new app.views.SinglePostCommentStream({model: this.model});
},
presenter : function(){
- var interactions = this.model.interactions
+ var interactions = this.model.interactions;
return {
likes : interactions.likes.toJSON(),
comments : interactions.comments.toJSON(),
@@ -20,6 +22,7 @@ app.views.SinglePostInteractions = app.views.Base.extend({
commentsCount : interactions.commentsCount(),
likesCount : interactions.likesCount(),
resharesCount : interactions.resharesCount(),
- }
+ };
},
});
+// @license-end
diff --git a/app/assets/javascripts/app/views/single-post-viewer/single_post_moderation.js b/app/assets/javascripts/app/views/single-post-viewer/single_post_moderation.js
new file mode 100644
index 000000000..ad636addf
--- /dev/null
+++ b/app/assets/javascripts/app/views/single-post-viewer/single_post_moderation.js
@@ -0,0 +1,68 @@
+app.views.SinglePostModeration = app.views.Feedback.extend({
+ templateName: "single-post-viewer/single-post-moderation",
+
+ className: 'control-icons',
+
+ events: function() {
+ return _.defaults({
+ "click .remove_post": "destroyModel",
+ "click .create_participation": "createParticipation",
+ "click .destroy_participation": "destroyParticipation"
+ }, app.views.Feedback.prototype.events);
+ },
+
+ presenter: function() {
+ return _.extend(this.defaultPresenter(), {
+ authorIsCurrentUser : this.authorIsCurrentUser()
+ });
+ },
+
+ renderPluginWidgets : function() {
+ app.views.Base.prototype.renderPluginWidgets.apply(this);
+ this.$('a').tooltip({placement: 'bottom'});
+ },
+
+ authorIsCurrentUser: function() {
+ return app.currentUser.authenticated() && this.model.get("author").id === app.user().id;
+ },
+
+ destroyModel: function(evt) {
+ if(evt) { evt.preventDefault(); }
+ var url = this.model.urlRoot + '/' + this.model.id;
+
+ if (confirm(Diaspora.I18n.t("remove_post"))) {
+ this.model.destroy({ url: url })
+ .done(function() {
+ // return to stream
+ document.location.href = "/stream";
+ })
+ .fail(function() {
+ var flash = new Diaspora.Widgets.FlashMessages();
+ flash.render({
+ success: false,
+ notice: Diaspora.I18n.t('failed_to_remove')
+ });
+ });
+ }
+ },
+
+ createParticipation: function (evt) {
+ if(evt) { evt.preventDefault(); }
+ var self = this;
+ $.post(Routes.post_participation_path(this.model.get("id")), {}, function () {
+ self.model.set({participation: true});
+ self.render();
+ });
+ },
+
+ destroyParticipation: function (evt) {
+ if(evt) { evt.preventDefault(); }
+ var self = this;
+ $.post(Routes.post_participation_path(this.model.get("id")), { _method: "delete" }, function () {
+ self.model.set({participation: false});
+ self.render();
+ });
+ },
+
+ participation: function(){ return this.model.get("participation"); }
+});
diff --git a/app/assets/javascripts/app/views/stream/shortcuts.js b/app/assets/javascripts/app/views/stream/shortcuts.js
index 11f39e2b7..70c473b7e 100644
--- a/app/assets/javascripts/app/views/stream/shortcuts.js
+++ b/app/assets/javascripts/app/views/stream/shortcuts.js
@@ -1,3 +1,5 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
app.views.StreamShortcuts = {
_headerSize: 50,
@@ -11,6 +13,9 @@ app.views.StreamShortcuts = {
this.on('hotkey:gotoPrev', this.gotoPrev, this);
this.on('hotkey:likeSelected', this.likeSelected, this);
this.on('hotkey:commentSelected', this.commentSelected, this);
+ this.on('hotkey:reshareSelected', this.reshareSelected, this);
+ this.on('hotkey:expandSelected', this.expandSelected, this);
+ this.on('hotkey:openFirstLinkSelected', this.openFirstLinkSelected, this);
},
_onHotkeyDown: function(event) {
@@ -19,7 +24,7 @@ app.views.StreamShortcuts = {
if(jQuery.inArray(event.target.type, textAcceptingInputTypes) > -1){
return;
}
-
+
// trigger the events based on what key was pressed
switch (String.fromCharCode( event.which ).toLowerCase()) {
case "j":
@@ -31,7 +36,7 @@ app.views.StreamShortcuts = {
default:
}
},
-
+
_onHotkeyUp: function(event) {
//make sure that the user is not typing in an input field
var textAcceptingInputTypes = ["textarea", "select", "text", "password", "number", "email", "url", "range", "date", "month", "week", "time", "datetime", "datetime-local", "search", "color"];
@@ -47,6 +52,15 @@ app.views.StreamShortcuts = {
case "l":
this.trigger('hotkey:likeSelected');
break;
+ case "r":
+ this.trigger('hotkey:reshareSelected');
+ break;
+ case "m":
+ this.trigger('hotkey:expandSelected');
+ break;
+ case "o":
+ this.trigger('hotkey:openFirstLinkSelected');
+ break;
default:
}
},
@@ -55,7 +69,7 @@ app.views.StreamShortcuts = {
// select next post: take the first post under the header
var stream_elements = this.$('div.stream_element.loaded');
var posUser = window.pageYOffset;
-
+
for (var i = 0; i < stream_elements.length; i++) {
if(stream_elements[i].offsetTop>posUser+this._headerSize){
this.selectPost(stream_elements[i]);
@@ -72,7 +86,7 @@ app.views.StreamShortcuts = {
// select previous post: take the first post above the header
var stream_elements = this.$('div.stream_element.loaded');
var posUser = window.pageYOffset;
-
+
for (var i = stream_elements.length-1; i >=0; i--) {
if(stream_elements[i].offsetTop<posUser+this._headerSize){
this.selectPost(stream_elements[i]);
@@ -84,15 +98,31 @@ app.views.StreamShortcuts = {
this.selectPost(stream_elements[0]);
}
},
-
+
commentSelected: function() {
$('a.focus_comment_textarea',this.$('div.stream_element.loaded.shortcut_selected')).click();
- },
-
+ },
+
likeSelected: function() {
$('a.like:first',this.$('div.stream_element.loaded.shortcut_selected')).click();
},
-
+
+ reshareSelected: function() {
+ $('a.reshare:first',this.$('div.stream_element.loaded.shortcut_selected')).click();
+ },
+
+ expandSelected: function() {
+ $('div.expander:first',this.$('div.stream_element.loaded.shortcut_selected')).click();
+ },
+
+ openFirstLinkSelected: function() {
+ var link = $('div.collapsible a[target="_blank"]:first',this.$('div.stream_element.loaded.shortcut_selected'));
+ if(link.length > 0) {
+ // click does only work with vanilla javascript
+ link[0].click();
+ }
+ },
+
selectPost: function(element){
//remove the selection and selected-class from all posts
var selected=this.$('div.stream_element.loaded.shortcut_selected');
@@ -100,6 +130,8 @@ app.views.StreamShortcuts = {
//move to new post
window.scrollTo(window.pageXOffset, element.offsetTop-this._headerSize);
//add the selection and selected-class to new post
- element.className+=" shortcut_selected highlighted";
+ element.className+=" shortcut_selected highlighted";
},
};
+// @license-end
+
diff --git a/app/assets/javascripts/app/views/stream_faces_view.js b/app/assets/javascripts/app/views/stream_faces_view.js
index 949e8d0b0..0586f6df5 100644
--- a/app/assets/javascripts/app/views/stream_faces_view.js
+++ b/app/assets/javascripts/app/views/stream_faces_view.js
@@ -1,3 +1,5 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
app.views.StreamFaces = app.views.Base.extend({
templateName : "stream-faces",
@@ -7,12 +9,12 @@ app.views.StreamFaces = app.views.Base.extend({
tooltipSelector : ".avatar",
initialize : function(){
- this.updatePeople()
- app.stream.items.bind("add", this.updatePeople, this)
+ this.updatePeople();
+ app.stream.items.bind("add", this.updatePeople, this);
},
presenter : function() {
- return {people : this.people}
+ return {people : this.people};
},
updatePeople : function(){
@@ -27,3 +29,4 @@ app.views.StreamFaces = app.views.Base.extend({
this.render();
}
});
+// @license-end
diff --git a/app/assets/javascripts/app/views/stream_post_views.js b/app/assets/javascripts/app/views/stream_post_views.js
index 6993bd79e..fb44250f6 100644
--- a/app/assets/javascripts/app/views/stream_post_views.js
+++ b/app/assets/javascripts/app/views/stream_post_views.js
@@ -1,3 +1,5 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
app.views.StreamPost = app.views.Post.extend({
templateName: "stream-element",
className : "stream_element loaded",
@@ -21,10 +23,13 @@ app.views.StreamPost = app.views.Post.extend({
"click .remove_post": "destroyModel",
"click .hide_post": "hidePost",
"click .post_report": "report",
- "click .block_user": "blockUser"
+ "click .block_user": "blockUser",
+
+ "click .create_participation": "createParticipation",
+ "click .destroy_participation": "destroyParticipation"
},
- tooltipSelector : ".timeago, .post_scope, .block_user, .delete",
+ tooltipSelector : ".timeago, .post_scope, .post_report, .block_user, .delete, .create_participation, .destroy_participation",
initialize : function(){
var personId = this.model.get('author').id;
@@ -52,7 +57,7 @@ app.views.StreamPost = app.views.Post.extend({
var normalizedClass = this.model.get("post_type").replace(/::/, "__")
, postClass = app.views[normalizedClass] || app.views.StatusMessage;
- return new postClass({ model : this.model })
+ return new postClass({ model : this.model });
},
postLocationStreamView : function(){
@@ -61,7 +66,7 @@ app.views.StreamPost = app.views.Post.extend({
removeNsfwShield: function(evt){
if(evt){ evt.preventDefault(); }
- this.model.set({nsfw : false})
+ this.model.set({nsfw : false});
this.render();
},
@@ -86,22 +91,47 @@ app.views.StreamPost = app.views.Post.extend({
remove : function() {
$(this.el).slideUp(400, _.bind(function(){this.$el.remove()}, this));
- return this
+ return this;
},
hidePost : function(evt) {
if(evt) { evt.preventDefault(); }
if(!confirm(Diaspora.I18n.t('confirm_dialog'))) { return }
+ var self = this;
$.ajax({
url : "/share_visibilities/42",
type : "PUT",
data : {
post_id : this.model.id
}
- })
+ }).done(function() {
+ self.remove();
+ })
+ .fail(function() {
+ Diaspora.page.flashMessages.render({
+ success: false,
+ notice: Diaspora.I18n.t('hide_post_failed')
+ });
+ });
+ },
+
+ createParticipation: function (evt) {
+ if(evt) { evt.preventDefault(); }
+ that = this;
+ $.post(Routes.post_participation_path(this.model.get("id")), {}, function () {
+ that.model.set({participation: true});
+ that.render();
+ });
+ },
- this.remove();
+ destroyParticipation: function (evt) {
+ if(evt) { evt.preventDefault(); }
+ that = this;
+ $.post(Routes.post_participation_path(this.model.get("id")), { _method: "delete" }, function () {
+ that.model.set({participation: false});
+ that.render();
+ });
},
focusCommentTextarea: function(evt){
@@ -112,4 +142,5 @@ app.views.StreamPost = app.views.Post.extend({
return this;
}
-})
+});
+// @license-end
diff --git a/app/assets/javascripts/app/views/stream_view.js b/app/assets/javascripts/app/views/stream_view.js
index 0cd222bd8..9d5d036ca 100644
--- a/app/assets/javascripts/app/views/stream_view.js
+++ b/app/assets/javascripts/app/views/stream_view.js
@@ -1,19 +1,21 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
//= require ./stream/shortcuts
app.views.Stream = app.views.InfScroll.extend(_.extend(
app.views.StreamShortcuts, {
- initialize: function(options) {
- this.stream = this.model
- this.collection = this.stream.items
+ initialize: function() {
+ this.stream = this.model;
+ this.collection = this.stream.items;
- this.postViews = []
+ this.postViews = [];
- this.setupNSFW()
- this.setupLightbox()
- this.setupInfiniteScroll()
- this.setupShortcuts()
- this.markNavSelected()
+ this.setupNSFW();
+ this.setupLightbox();
+ this.setupInfiniteScroll();
+ this.setupShortcuts();
+ this.markNavSelected();
},
postClass : app.views.StreamPost,
@@ -24,11 +26,10 @@ app.views.Stream = app.views.InfScroll.extend(_.extend(
},
setupNSFW : function(){
- app.currentUser.bind("nsfwChanged", reRenderPostViews, this)
-
function reRenderPostViews() {
- _.map(this.postViews, function(view){ view.render() })
+ _.map(this.postViews, function(view){ view.render() });
}
+ app.currentUser.bind("nsfwChanged", reRenderPostViews, this);
},
markNavSelected : function() {
@@ -38,3 +39,4 @@ app.views.Stream = app.views.InfScroll.extend(_.extend(
streamSelection.find("[data-stream='" + activeStream + "']").addClass("selected");
}
}));
+// @license-end
diff --git a/app/assets/javascripts/app/views/tag_following_action_view.js b/app/assets/javascripts/app/views/tag_following_action_view.js
index fbfe2bae2..37d95ff2a 100644
--- a/app/assets/javascripts/app/views/tag_following_action_view.js
+++ b/app/assets/javascripts/app/views/tag_following_action_view.js
@@ -1,11 +1,13 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
app.views.TagFollowingAction = app.views.Base.extend({
templateName: "tag_following_action",
events : {
- "mouseenter .button.red_on_hover": "mouseIn",
- "mouseleave .button.red_on_hover": "mouseOut",
- "click .button": "tagAction"
+ "mouseenter .btn.followed": "mouseIn",
+ "mouseleave .btn.followed": "mouseOut",
+ "click .btn": "tagAction"
},
initialize : function(options){
@@ -18,7 +20,7 @@ app.views.TagFollowingAction = app.views.Base.extend({
return _.extend(this.defaultPresenter(), {
tag_is_followed : this.tag_is_followed(),
followString : this.followString()
- })
+ });
},
followString : function() {
@@ -33,7 +35,7 @@ app.views.TagFollowingAction = app.views.Base.extend({
return !this.model.isNew();
},
- getTagFollowing : function(tagFollowing) {
+ getTagFollowing : function() {
this.model = app.tagFollowings.where({"name":this.tagText})[0] ||
new app.models.TagFollowing({"name":this.tagText});
this.model.bind("change", this.render, this);
@@ -41,12 +43,12 @@ app.views.TagFollowingAction = app.views.Base.extend({
},
mouseIn : function(){
- this.$("input").removeClass("in_aspects");
+ this.$("input").removeClass("green").addClass("btn-danger");
this.$("input").val( Diaspora.I18n.t('stream.tags.stop_following', {tag: this.model.attributes.name} ) );
},
mouseOut : function() {
- this.$("input").addClass("in_aspects");
+ this.$("input").removeClass("btn-danger").addClass("green");
this.$("input").val( Diaspora.I18n.t('stream.tags.following', {"tag" : this.model.attributes.name} ) );
},
@@ -59,4 +61,5 @@ app.views.TagFollowingAction = app.views.Base.extend({
app.tagFollowings.create(this.model);
}
}
-}); \ No newline at end of file
+});
+// @license-end
diff --git a/app/assets/javascripts/app/views/tag_following_list_view.js b/app/assets/javascripts/app/views/tag_following_list_view.js
index 6d7d49a68..dd05875e4 100644
--- a/app/assets/javascripts/app/views/tag_following_list_view.js
+++ b/app/assets/javascripts/app/views/tag_following_list_view.js
@@ -1,3 +1,5 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
//= require jquery.autoSuggest.custom
app.views.TagFollowingList = app.views.Base.extend({
@@ -39,9 +41,9 @@ app.views.TagFollowingList = app.views.Base.extend({
});
this.$("input").bind('keydown', function(evt){
- if(evt.keyCode == 13 || evt.keyCode == 9 || evt.keyCode == 32){
+ if(evt.keyCode === 13 || evt.keyCode === 9 || evt.keyCode === 32){
evt.preventDefault();
- if( $('li.as-result-item.active').length == 0 ){
+ if( $('li.as-result-item.active').length === 0 ){
$('li.as-result-item').first().click();
}
}
@@ -60,7 +62,6 @@ app.views.TagFollowingList = app.views.Base.extend({
createTagFollowing: function(evt) {
if(evt){ evt.preventDefault(); }
- var name = this.$(".tag_input").val();
this.collection.create({"name":this.$(".tag_input").val()});
this.$(".tag_input").val("");
@@ -77,3 +78,4 @@ app.views.TagFollowingList = app.views.Base.extend({
this.$el.empty();
},
});
+// @license-end
diff --git a/app/assets/javascripts/app/views/tag_following_view.js b/app/assets/javascripts/app/views/tag_following_view.js
index e69c4dc6d..838fd896d 100644
--- a/app/assets/javascripts/app/views/tag_following_view.js
+++ b/app/assets/javascripts/app/views/tag_following_view.js
@@ -1,3 +1,5 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
app.views.TagFollowing = app.views.Base.extend({
templateName: "tag_following",
@@ -27,7 +29,8 @@ app.views.TagFollowing = app.views.Base.extend({
presenter : function() {
return _.extend(this.defaultPresenter(), {
tag : this.model
- })
+ });
}
});
+// @license-end
diff --git a/app/assets/javascripts/app/views/tags_view.js b/app/assets/javascripts/app/views/tags_view.js
new file mode 100644
index 000000000..cf13dbb49
--- /dev/null
+++ b/app/assets/javascripts/app/views/tags_view.js
@@ -0,0 +1,9 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
+app.views.Tags = Backbone.View.extend({
+
+ initialize: function() {
+ app.publisher.setText("#"+ this.tagName + " ");
+ }
+});
+// @license-end
diff --git a/app/assets/javascripts/aspect-edit-pane.js b/app/assets/javascripts/aspect-edit-pane.js
deleted file mode 100644
index 57be91bd2..000000000
--- a/app/assets/javascripts/aspect-edit-pane.js
+++ /dev/null
@@ -1,120 +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.
- */
-
-function toggleAspectTitle(){
- $("#aspect_name_title").toggleClass('hidden');
- $("#aspect_name_edit").toggleClass('hidden');
-}
-
-function updateAspectName(new_name) {
- $('#aspect_name_title .name').text(new_name);
- $('input#aspect_name').val(new_name);
-}
-function updatePageAspectName( an_id, new_name) {
- $('ul#aspect_nav [data-aspect-id="'+an_id+'"] .selectable').text(new_name);
-}
-
-$(document).ready(function() {
- $(document).on('click', '#rename_aspect_link', function(){
- toggleAspectTitle();
- });
-
- $(document).on('ajax:success', 'form.edit_aspect', function(evt, data, status, xhr) {
- updateAspectName(data['name']);
- updatePageAspectName( data['id'], data['name'] );
- toggleAspectTitle();
- });
-});
-
-
-/**
- * TEMPORARY SOLUTION
- * TODO remove me, when the contacts section is done with Backbone.js ...
- * (this is about as much covered by tests as the old code ... not at all)
- *
- * see also 'contact-edit.js'
- */
-
-app.tmp || (app.tmp = {});
-
-// on the contacts page, viewing the facebox for single aspect
-app.tmp.ContactAspectsBox = function() {
- $('body').on('click', '#aspect_edit_pane a.add.btn', _.bind(this.addToAspect, this));
- $('body').on('click', '#aspect_edit_pane a.added.btn', _.bind(this.removeFromAspect, this));
-};
-_.extend(app.tmp.ContactAspectsBox.prototype, {
- addToAspect: function(evt) {
- var el = $(evt.currentTarget);
- var aspect_membership = new app.models.AspectMembership({
- 'person_id': el.data('person_id'),
- 'aspect_id': el.data('aspect_id')
- });
-
- aspect_membership.on('sync', this._successSaveCb, this);
- aspect_membership.on('error', function() {
- this._displayError('aspect_dropdown.error', el);
- }, this);
-
- aspect_membership.save();
-
- return false;
- },
-
- _successSaveCb: function(aspect_membership) {
- var membership_id = aspect_membership.get('id');
- var person_id = aspect_membership.get('person_id');
- var el = $('li.contact').find('a.add[data-person_id="'+person_id+'"]');
-
- el.removeClass('add')
- .addClass('added')
- .attr('data-membership_id', membership_id) // just to be sure...
- .data('membership_id', membership_id);
-
- el.find('div').removeClass('icons-monotone_plus_add_round')
- .addClass('icons-monotone_check_yes');
- },
-
- removeFromAspect: function(evt) {
- var el = $(evt.currentTarget);
-
- var aspect_membership = new app.models.AspectMembership({
- 'id': el.data('membership_id')
- });
- aspect_membership.on('sync', this._successDestroyCb, this);
- aspect_membership.on('error', function(aspect_membership) {
- this._displayError('aspect_dropdown.error_remove', el);
- }, this);
-
- aspect_membership.destroy();
-
- return false;
- },
-
- _successDestroyCb: function(aspect_membership) {
- var membership_id = aspect_membership.get('id');
- var el = $('li.contact').find('a.added[data-membership_id="'+membership_id+'"]');
-
- el.removeClass('added')
- .addClass('add')
- .removeAttr('data-membership_id')
- .removeData('membership_id');
-
- el.find('div').removeClass('icons-monotone_check_yes')
- .addClass('icons-monotone_plus_add_round');
- },
-
- _displayError: function(msg_id, contact_el) {
- var name = $('li.contact')
- .has(contact_el)
- .find('h4.name')
- .text();
- var msg = Diaspora.I18n.t(msg_id, { 'name': name });
- Diaspora.page.flashMessages.render({ 'success':false, 'notice':msg });
- }
-});
-
-$(function() {
- var contact_aspects_box = new app.tmp.ContactAspectsBox();
-});
diff --git a/app/assets/javascripts/aspects-dropdown.js b/app/assets/javascripts/aspects-dropdown.js
index 50ee48fab..6c1ea03bc 100644
--- a/app/assets/javascripts/aspects-dropdown.js
+++ b/app/assets/javascripts/aspects-dropdown.js
@@ -1,3 +1,5 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
// Copyright (c) 2010-2012, Diaspora Inc. This file is
// licensed under the Affero General Public License version 3 or later. See
// the COPYRIGHT file.
@@ -7,33 +9,48 @@ var AspectsDropdown = {
var button = dropdown.parents(".dropdown").children('.button.toggle'),
selectedAspects = dropdown.children(".selected").length,
allAspects = dropdown.children().length,
- replacement;
+ replacement,
+ message,
+ isInPublisher = dropdown.closest('#publisher').length;
- if (number == 0) {
+ if (number === 0) {
button.removeClass(inAspectClass);
- if( dropdown.closest('#publisher').length ) {
+ if (isInPublisher) {
replacement = Diaspora.I18n.t("aspect_dropdown.select_aspects");
} else {
replacement = Diaspora.I18n.t("aspect_dropdown.add_to_aspect");
/* flash message prompt */
- var message = Diaspora.I18n.t("aspect_dropdown.stopped_sharing_with", {name: dropdown.data('person-short-name')});
+ message = Diaspora.I18n.t("aspect_dropdown.stopped_sharing_with", {name: dropdown.data('person-short-name')});
Diaspora.page.flashMessages.render({success: true, notice: message});
}
- }else if (selectedAspects == allAspects) {
+ } else if (selectedAspects === allAspects) {
replacement = Diaspora.I18n.t('aspect_dropdown.all_aspects');
- }else if (number == 1) {
+ } else if (number === 1) {
button.addClass(inAspectClass);
replacement = dropdown.find(".selected").first().text();
/* flash message prompt */
- if( dropdown.closest('#publisher').length == 0 ) {
- var message = Diaspora.I18n.t("aspect_dropdown.started_sharing_with", {name: dropdown.data('person-short-name')});
+ if (!isInPublisher) {
+ message = Diaspora.I18n.t("aspect_dropdown.started_sharing_with", {name: dropdown.data('person-short-name')});
Diaspora.page.flashMessages.render({success: true, notice: message});
}
- }else {
- replacement = Diaspora.I18n.t('aspect_dropdown.toggle', { count: number.toString()})
+ } else {
+ replacement = Diaspora.I18n.t('aspect_dropdown.toggle', { count: number.toString()});
}
- button.text(replacement + ' ▼');
+ // if we are in the publisher, we add the visibility icon
+ if (isInPublisher) {
+ var icon = $('#visibility-icon');
+ if (replacement.trim() === Diaspora.I18n.t('stream.public')) {
+ icon.removeClass('lock');
+ icon.addClass('globe');
+ } else {
+ icon.removeClass('globe');
+ icon.addClass('lock');
+ }
+ button.find('.text').text(replacement);
+ } else {
+ button.text(replacement + ' ▼');
+ }
},
toggleCheckbox: function(check) {
@@ -58,4 +75,4 @@ var AspectsDropdown = {
});
}
};
-
+// @license-end
diff --git a/app/assets/javascripts/browser_detection.js b/app/assets/javascripts/browser_detection.js
index 9387c379f..6a8e5adab 100644
--- a/app/assets/javascripts/browser_detection.js
+++ b/app/assets/javascripts/browser_detection.js
@@ -1,5 +1,9 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
jQuery.browser = {};
jQuery.browser.mozilla = /mozilla/.test(navigator.userAgent.toLowerCase()) && !/webkit/.test(navigator.userAgent.toLowerCase());
jQuery.browser.webkit = /webkit/.test(navigator.userAgent.toLowerCase());
jQuery.browser.opera = /opera/.test(navigator.userAgent.toLowerCase());
jQuery.browser.msie = /msie/.test(navigator.userAgent.toLowerCase());
+// @license-end
+
diff --git a/app/assets/javascripts/contact-edit.js b/app/assets/javascripts/contact-edit.js
deleted file mode 100644
index 99647bfb3..000000000
--- a/app/assets/javascripts/contact-edit.js
+++ /dev/null
@@ -1,58 +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.
-
-/**
- * TEMPORARY SOLUTION
- * TODO remove me, when the contacts section is done with Backbone.js ...
- * (this is about as much covered by tests as the old code ... not at all)
- *
- * see also 'aspect-edit-pane.js'
- */
-
-app.tmp || (app.tmp = {});
-
-// on the contacts page, viewing the list of people in a single aspect
-app.tmp.ContactAspects = function() {
- $('#people_stream').on('click', '.contact_remove-from-aspect', _.bind(this.removeFromAspect, this));
-};
-_.extend(app.tmp.ContactAspects.prototype, {
- removeFromAspect: function(evt) {
- evt.stopImmediatePropagation();
- evt.preventDefault();
-
- var el = $(evt.currentTarget);
- var id = el.data('membership_id');
-
- var aspect_membership = new app.models.AspectMembership({'id':id});
- aspect_membership.on('sync', this._successDestroyCb, this);
- aspect_membership.on('error', function(aspect_membership) {
- this._displayError('aspect_dropdown.error_remove', aspect_membership.get('id'));
- }, this);
-
- aspect_membership.destroy();
-
- return false;
- },
-
- _successDestroyCb: function(aspect_membership) {
- var membership_id = aspect_membership.get('id');
-
- $('.stream_element').has('[data-membership_id="'+membership_id+'"]')
- .fadeOut(300, function() { $(this).remove() });
- },
-
- _displayError: function(msg_id, membership_id) {
- var name = $('.stream_element')
- .has('[data-membership_id="'+membership_id+'"]')
- .find('div.bd > a')
- .text();
- var msg = Diaspora.I18n.t(msg_id, { 'name': name });
- Diaspora.page.flashMessages.render({ 'success':false, 'notice':msg });
- }
-});
-
-
-$(function() {
- var contact_aspects = new app.tmp.ContactAspects();
-});
diff --git a/app/assets/javascripts/contact-list.js b/app/assets/javascripts/contact-list.js
index 5d8785a6e..0e8bda50e 100644
--- a/app/assets/javascripts/contact-list.js
+++ b/app/assets/javascripts/contact-list.js
@@ -1,40 +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.
- */
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
var List = {
- initialize: function() {
- $(document).on("keyup", ".contact_list_search", function(e) {
- var search = $(this);
- var list = $(".contacts", ".searchable");
- var query = new RegExp(search.val(),'i');
-
- $("> .contact", list).each( function(idx, element) {
- element = $(element);
- if( !element.find(".name").text().match(query) ) {
- element.addClass('hidden');
- } else {
- element.removeClass('hidden');
- }
- });
- });
- },
-
- disconnectUser: function(contact_id){
- $.ajax({
- url: "/contacts/" + contact_id,
- type: "DELETE",
- success: function(){
- if( $('.searchable').length == 1){
- $('.searchable .contact[data-contact_id='+contact_id+']').fadeOut(200);
- } else if($('#aspects_list').length == 1) {
- $.facebox.close();
- };
- }
- });
- },
-
runDelayedSearch: function( searchTerm ) {
$.getJSON('/people/refresh_search',
{ q: searchTerm },
@@ -49,34 +15,14 @@ var List = {
});
streamEl.html(string);
+ $('.aspect_membership_dropdown').each(function(){
+ new app.views.AspectMembership({el: this});
+ });
},
startSearchDelay: function (theSearch) {
setTimeout( "List.runDelayedSearch('" + theSearch + "')", 10000);
}
-
};
+// @license-end
-$(document).ready(function() {
- $('.added').bind('ajax:loading', function() {
- var $this = $(this);
-
- $this.addClass('disabled');
- $this.fadeTo(200,0.4);
- });
-
- $('.added').bind('hover',
- function() {
- var $this = $(this)
- $this.addClass("remove");
- $this.children("img").attr("src","/images/icons/monotone_close_exit_delete.png");
- },
-
- function() {
- var $this = $(this)
- $this.removeClass("remove");
- $this.children("img").attr("src","/images/icons/monotone_check_yes.png");
- });
-
- List.initialize();
-});
diff --git a/app/assets/javascripts/diaspora.js b/app/assets/javascripts/diaspora.js
index 7d683fdcb..054905786 100644
--- a/app/assets/javascripts/diaspora.js
+++ b/app/assets/javascripts/diaspora.js
@@ -1,3 +1,5 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
/* Copyright (c) 2010-2011, Diaspora Inc. This file is
* licensed under the Affero General Public License version 3 or later. See
* the COPYRIGHT file.
@@ -19,14 +21,18 @@
var eventNames = eventName.split(" ");
for(eventName in eventNames) {
- this.eventsContainer.trigger(eventNames[eventName], args);
+ if(eventNames.hasOwnProperty(eventName)) {
+ this.eventsContainer.trigger(eventNames[eventName], args);
+ }
}
},
subscribe: function(eventName, callback, context) {
var eventNames = eventName.split(" ");
for(eventName in eventNames) {
- this.eventsContainer.bind(eventNames[eventName], $.proxy(callback, context));
+ if(eventNames.hasOwnProperty(eventName)) {
+ this.eventsContainer.bind(eventNames[eventName], $.proxy(callback, context));
+ }
}
}
});
@@ -36,7 +42,10 @@
};
Diaspora.BaseWidget = {
- instantiate: function(Widget, element) {
+ instantiate: function(Widget) {
+ // Mobile version loads only some widgets
+ if (typeof Diaspora.Widgets[Widget] === 'undefined') return;
+
$.extend(Diaspora.Widgets[Widget].prototype, Diaspora.EventBroker.extend(Diaspora.BaseWidget));
var widget = new Diaspora.Widgets[Widget](),
@@ -80,16 +89,16 @@
if(!$.mobile)//why does this need this?
$.extend(Diaspora.page, new Diaspora.BasePage($(document.body)));
- Diaspora.page.publish("page/ready", [$(document.body)])
+ Diaspora.page.publish("page/ready", [$(document.body)]);
};
// temp hack to check if backbone is enabled for the page
Diaspora.backboneEnabled = function(){
return window.app && window.app.stream !== undefined;
- }
+ };
window.Diaspora = Diaspora;
})();
-
$(Diaspora.instantiatePage);
+// @license-end
diff --git a/app/assets/javascripts/helpers/alert.js b/app/assets/javascripts/helpers/alert.js
deleted file mode 100644
index 08dd06dea..000000000
--- a/app/assets/javascripts/helpers/alert.js
+++ /dev/null
@@ -1,30 +0,0 @@
-Diaspora.Alert = {
- faceboxTemplate:
- '<div id="diaspora_alert">' +
- '<div class="span-12 last">' +
- '<div id="facebox_header">' +
- '<h4>' +
- '<%= title %>' +
- '</h4>' +
- '</div>' +
- '<%= content %>' +
- '</div>' +
- '</div>',
-
- show: function(title, content) {
- $(_.template(this.faceboxTemplate, {
- title: title,
- content: content
- })).appendTo(document.body);
-
- $.facebox({
- div: "#diaspora_alert"
- }, "diaspora_alert");
- }
-};
-
-$(function() {
- $(document).bind("close.facebox", function() {
- $("#diaspora_alert").remove();
- });
-});
diff --git a/app/assets/javascripts/helpers/i18n.js b/app/assets/javascripts/helpers/i18n.js
index 442f6fdf9..9be574c45 100644
--- a/app/assets/javascripts/helpers/i18n.js
+++ b/app/assets/javascripts/helpers/i18n.js
@@ -1,10 +1,12 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
Diaspora.I18n = {
language: "en",
locale: {
pluralizationKey: function(n) { return this.fallback.pluralizationKey(n); },
data: {},
fallback: {
- pluralizationKey: function(n) { return n == 1 ? "one" : "other"; },
+ pluralizationKey: function(n) { return n === 1 ? "one" : "other"; },
data: {}
}
},
@@ -18,9 +20,12 @@ Diaspora.I18n = {
updateLocale: function(locale, data) {
locale.data = $.extend(locale.data, data);
- rule = this._resolve(locale, ['pluralization_rule']);
+ var rule = this._resolve(locale, ['pluralization_rule']);
if (rule !== "") {
+ /* jshint evil:true */
+ // TODO change this to `locale.pluralizationKey = rule`?
eval("locale.pluralizationKey = "+rule);
+ /* jshint evil:false */
}
},
@@ -35,7 +40,7 @@ Diaspora.I18n = {
_resolve: function(locale, items) {
var translatedMessage, nextNamespace, originalItems = items.slice();
- while(nextNamespace = items.shift()) {
+ while( (nextNamespace = items.shift()) ) {
translatedMessage = (translatedMessage)
? translatedMessage[nextNamespace]
: locale.data[nextNamespace];
@@ -48,7 +53,7 @@ Diaspora.I18n = {
}
}
}
-
+
return translatedMessage;
},
@@ -60,7 +65,7 @@ Diaspora.I18n = {
}
try {
- return _.template(this._resolve(locale, items), views || {});
+ return _.template(this._resolve(locale, items))(views || {});
} catch (e) {
if (typeof locale.fallback === "undefined") {
return "";
@@ -77,3 +82,5 @@ Diaspora.I18n = {
this.locale.data = arguments[0];
}
};
+// @license-end
+
diff --git a/app/assets/javascripts/home.js b/app/assets/javascripts/home.js
deleted file mode 100644
index 2d14f6045..000000000
--- a/app/assets/javascripts/home.js
+++ /dev/null
@@ -1,7 +0,0 @@
-/* Copyright (c) 2010-2011, Diaspora Inc. This file is
- * licensed under the Affero General Public License version 3 or later. See
- * the COPYRIGHT file.
- */
-
-//= require aspect-edit-pane
-//= require fileuploader-custom
diff --git a/app/assets/javascripts/ie.js b/app/assets/javascripts/ie.js
index c1f744f5e..1c1d5387d 100644
--- a/app/assets/javascripts/ie.js
+++ b/app/assets/javascripts/ie.js
@@ -1,2 +1,6 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
document.createElement('header');
document.createElement('footer');
+// @license-end
+
diff --git a/app/assets/javascripts/inbox.js b/app/assets/javascripts/inbox.js
index 3ab0c4cf5..e270e121b 100644
--- a/app/assets/javascripts/inbox.js
+++ b/app/assets/javascripts/inbox.js
@@ -1,104 +1,21 @@
-/* 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 jquery.autoSuggest.custom
-
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
$(document).ready(function(){
-
- if ($('#first_unread').length > 0) {
- $("html").scrollTop($('#first_unread').offset().top-45);
- }
-
- $('time.timeago').each(function(i,e) {
- var jqe = $(e);
- jqe.attr('data-original-title', new Date(jqe.attr('datetime')).toLocaleString());
- jqe.attr('title', '');
- });
-
- $('.timeago').tooltip();
- $('.timeago').timeago();
-
- $('time.timeago').each(function(i,e) {
- var jqe = $(e);
- jqe.attr('title', '');
- });
-
- $('.stream_element.conversation').hover(
- function(){
- $(this).find('.participants').slideDown('300');
- },
-
- function(){
- $(this).find('.participants').slideUp('300');
- }
- );
-
$(document).on('click', '.conversation-wrapper', function(){
var conversation_path = $(this).data('conversation-path');
-
$.getScript(conversation_path, function() {
Diaspora.page.directionDetector.updateBinds();
});
-
history.pushState(null, "", conversation_path);
-
- var conv = $(this).children('.stream_element'),
- cBadge = $("#conversations_badge .badge_count");
- if(conv.hasClass('unread') ){
- conv.removeClass('unread');
- }
- if(cBadge.html() !== null) {
- cBadge.html().replace(/\d+/, function(num){
- num = parseInt(num);
- cBadge.html(parseInt(num)-1);
- if(num == 1) {
- cBadge.addClass("hidden");
- }
- });
- }
-
return false;
});
$(window).bind("popstate", function(){
if (location.href.match(/conversations\/\d+/) !== null) {
- $.getScript(location.href, function() {
+ $.getScript(location.href, function() {
Diaspora.page.directionDetector.updateBinds();
});
return false;
}
});
-
- $('#conversation_inbox .stream').infinitescroll({
- navSelector : ".pagination",
- // selector for the paged navigation (it will be hidden)
- nextSelector : ".pagination a.next_page",
- // selector for the NEXT link (to page 2)
- itemSelector : "#conversation_inbox .conversation",
- // selector for all items you'll retrieve
- localMode: true,
- debug: false,
- donetext: "no more.",
- loadingText: "",
- loadingImg: '/assets/ajax-loader.gif'
- }, function(){
- $('.conversation-wrapper', '.stream').bind('mousedown', function(){
- bindIt($(this));
- });
- });
-
- // kill scroll binding
- $(window).unbind('.infscr');
-
- // hook up the manual click guy.
- $('a.next_page').click(function(){
- $(document).trigger('retrieve.infscr');
- return false;
- });
-
- // remove the paginator when we're done.
- $(document).ajaxError(function(e,xhr,opt){
- if (xhr.status == 404) { $('a.next_page').remove(); }
- });
});
+// @license-end
diff --git a/app/assets/javascripts/jasmine-load-all.js b/app/assets/javascripts/jasmine-load-all.js
index 7395aba77..793b86e0e 100644
--- a/app/assets/javascripts/jasmine-load-all.js
+++ b/app/assets/javascripts/jasmine-load-all.js
@@ -1,10 +1,11 @@
//= require jquery
-//= require handlebars-1.0.0.beta.6
+//= require handlebars.runtime
//= require templates
//= require main
-//= require home
+//= require fileuploader-custom
//= require inbox
-//= require mobile
-//= require profile
-//= require people
+//= require mobile/mobile
+//= require jquery.autoSuggest.custom
+//= require contact-list
//= require sinon
+//= require jasmine-ajax
diff --git a/app/assets/javascripts/jsxc.js b/app/assets/javascripts/jsxc.js
new file mode 100644
index 000000000..40c8abedb
--- /dev/null
+++ b/app/assets/javascripts/jsxc.js
@@ -0,0 +1,42 @@
+//= require diaspora_jsxc
+
+// initialize jsxc xmpp client
+$(document).ready(function() {
+ if (app.currentUser.authenticated()) {
+ $.post('api/v1/tokens', null, function(data) {
+ if (jsxc && data['token']) {
+ var jid = app.currentUser.get('diaspora_id');
+ jsxc.init({
+ root: '/assets/diaspora_jsxc',
+ logoutElement: $('.user-menu-item [data-method=delete]'),
+ rosterAppend: 'body',
+ otr: {
+ debug: true,
+ SEND_WHITESPACE_TAG: true,
+ WHITESPACE_START_AKE: true
+ },
+ autoLang: true,
+ priority: {
+ online: 1,
+ chat: 1
+ },
+ displayRosterMinimized: function() {
+ return true;
+ },
+ xmpp: {
+ url: $('script#jsxc').data('endpoint'),
+ username: jid.replace(/@.*?$/g, ''),
+ domain: jid.replace(/^.*?@/g, ''),
+ jid: jid,
+ password: data.token,
+ resource: 'diaspora-jsxc',
+ overwrite: true,
+ onlogin: true
+ }
+ });
+ } else {
+ console.error('No token found! Authenticated!?');
+ }
+ }, 'json');
+ }
+});
diff --git a/app/assets/javascripts/mailchimp.js b/app/assets/javascripts/mailchimp.js
deleted file mode 100644
index 6254d0402..000000000
--- a/app/assets/javascripts/mailchimp.js
+++ /dev/null
@@ -1,3 +0,0 @@
-//= require mailchimp/jquery.form
-//= require mailchimp/jquery.validate
-//= require mailchimp/jquery126.min \ No newline at end of file
diff --git a/app/assets/javascripts/main.js b/app/assets/javascripts/main.js
index 389e824af..aaa0c50ea 100644
--- a/app/assets/javascripts/main.js
+++ b/app/assets/javascripts/main.js
@@ -2,28 +2,35 @@
* licensed under the Affero General Public License version 3 or later. See
* the COPYRIGHT file.
*/
+//= require js_image_paths
+//= require js-routes
//= require underscore
//= require backbone
//= require jquery.hotkeys
//= require jquery.remotipart
//= require jquery.autoresize
//= require jquery.charcount
-//= require jquery.placeholder
+//= require jquery-placeholder
//= require rails-timeago
//= require facebox
//= require browser_detection
//= require jquery.events.input
//= require jquery.elastic
//= require jquery.mentionsInput
-//= require jquery.idle-timer
+//= require jquery-idletimer/dist/idle-timer
//= require jquery.infinitescroll-custom
//= require jquery.autocomplete-custom
//= require keycodes
//= require fileuploader-custom
-//= require handlebars-1.0.0.beta.6
-//= require markdown
-//= require punycode
-//= require parse_url
+//= require handlebars.runtime
+//= require posix-bracket-expressions
+//= require markdown-it
+//= require markdown-it-diaspora-mention
+//= require markdown-it-for-inline
+//= require markdown-it-hashtag
+//= require markdown-it-sanitizer
+//= require markdown-it-sub
+//= require markdown-it-sup
//= require clear-form
//= require app/app
//= require diaspora
@@ -32,8 +39,6 @@
//= require_tree ./widgets
//= require view
//= require aspects-dropdown
-//= require contact-edit
-//= require contact-list
//= require mentions
//= require bootstrap-tooltip
//= require bootstrap-popover
diff --git a/app/assets/javascripts/mentions.js b/app/assets/javascripts/mentions.js
index 851337e38..33058ae67 100644
--- a/app/assets/javascripts/mentions.js
+++ b/app/assets/javascripts/mentions.js
@@ -1,3 +1,5 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
var Mentions = {
initialize: function(mentionsInput) {
return mentionsInput.mentionsInput(Mentions.options);
@@ -43,3 +45,5 @@ var Mentions = {
}
}
};
+// @license-end
+
diff --git a/app/assets/javascripts/mobile.js b/app/assets/javascripts/mobile/mobile.js
index 0ba372480..5cd873f13 100644
--- a/app/assets/javascripts/mobile.js
+++ b/app/assets/javascripts/mobile/mobile.js
@@ -1,14 +1,23 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
/* 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 jquery.charcount
+//= require js-routes
//= require mbp-modernizr-custom
//= require mbp-respond.min
//= require mbp-helper
//= require jquery.autoSuggest.custom
//= require fileuploader-custom
//= require rails-timeago
+//= require underscore
+//= require diaspora
+//= require helpers/i18n
+//= require widgets/timeago
+//= require mobile/mobile_file_uploader
+//= require mobile/profile_aspects
$(document).ready(function(){
@@ -31,12 +40,18 @@ $(document).ready(function(){
evt.preventDefault();
$("#app").toggleClass('draw');
});
-
+
/* Show / hide aspects in the drawer */
$('#all_aspects').bind("tap click", function(evt){
evt.preventDefault();
$("#all_aspects + li").toggleClass('hide');
- });
+ });
+
+ /* Show / hide followed tags in the drawer */
+ $('#followed_tags').bind("tap click", function(evt){
+ evt.preventDefault();
+ $("#followed_tags + li").toggleClass('hide');
+ });
/* Heart toggle */
$(".like_action", ".stream").bind("tap click", function(evt){
@@ -68,7 +83,7 @@ $(document).ready(function(){
dataType: 'json',
type: 'DELETE',
beforeSend: showLoader(link),
- complete: function(data){
+ complete: function(){
removeLoader(link);
link.attr("href", href.replace(/\/\d+$/, ''));
@@ -97,12 +112,12 @@ $(document).ready(function(){
dataType: 'json',
type: 'POST',
beforeSend: showLoader(link),
- success: function(data){
+ success: function(){
removeLoader(link);
},
- error: function(data){
+ error: function(){
removeLoader(link);
- alert("Failed to reshare!");
+ alert(Diaspora.I18n.t('failed_to_reshare'));
}
});
}
@@ -115,7 +130,7 @@ $(document).ready(function(){
evt.preventDefault();
var link = $(this),
parent = link.closest(".bottom_bar").first(),
- commentsContainer = function(){ return parent.find(".comment_container").first(); }
+ commentsContainer = function(){ return parent.find(".comment_container").first(); },
existingCommentsContainer = commentsContainer();
if( link.hasClass('active') ) {
@@ -187,7 +202,7 @@ $(document).ready(function(){
context: link,
success: function(data){
var textarea = function(target) { return target.closest(".stream_element").find('textarea.comment_box').first()[0] };
- link.removeClass('loading')
+ link.removeClass('loading');
if(!link.hasClass("add_comment_bottom_link")){
link.removeClass('inactive');
@@ -204,9 +219,9 @@ $(document).ready(function(){
$(".stream").delegate("a.cancel_new_comment", "tap click", function(evt){
evt.preventDefault();
- var link = $(this);
+ var link = $(this),
form = link.closest("form"),
- commentActionLink = link.closest(".bottom_bar").find("a.comment_action").first();
+ commentActionLink = link.closest(".bottom_bar").find("a.comment_action").first(),
container = link.closest('.bottom_bar').find('.add_comment_bottom_link_container');
if(container.length > 0 ){
@@ -224,7 +239,7 @@ $(document).ready(function(){
$.post(form.attr('action')+"?format=mobile", form.serialize(), function(data){
var bottomBar = form.closest('.bottom_bar').first(),
container = bottomBar.find('.add_comment_bottom_link_container'),
- commentActionLink = bottomBar.find("a.comment_action").first();
+ commentActionLink = bottomBar.find("a.comment_action").first(),
reactionLink = bottomBar.find(".show_comments").first(),
commentCount = bottomBar.find(".comment_count");
@@ -234,13 +249,13 @@ $(document).ready(function(){
container.show();
} else {
- var container = $("<div class='comments_container not_all_present'></div>"),
- comments = $("<ul class='comments'></ul>");
+ var comments = $("<ul class='comments'></ul>");
+ container = $("<div class='comments_container not_all_present'></div>");
comments.html(data);
container.append(comments);
form.remove();
- container.appendTo(bottomBar)
+ container.appendTo(bottomBar);
}
reactionLink.text(reactionLink.text().replace(/(\d+)/, function(match){ return parseInt(match) + 1; }));
@@ -251,7 +266,7 @@ $(document).ready(function(){
});
- $(".service_icon").bind("tap click", function(evt) {
+ $(".service_icon").bind("tap click", function() {
var service = $(this).toggleClass("dim"),
selectedServices = $("#new_status_message .service_icon:not(.dim)"),
provider = service.attr("id"),
@@ -287,87 +302,5 @@ $(document).ready(function(){
evt.preventDefault();
$("#new_status_message").submit();
});
-
});
-
-function createUploader(){
-
- var aspectIds = gon.preloads.aspect_ids;
-
- var uploader = new qq.FileUploaderBasic({
- element: document.getElementById('file-upload-publisher'),
- params: {'photo' : {'pending' : 'true', 'aspect_ids' : aspectIds},},
- allowedExtensions: ['jpg', 'jpeg', 'png', 'gif', 'tiff'],
- action: "/photos",
- debug: true,
- button: document.getElementById('file-upload-publisher'),
- sizeLimit: 4194304,
-
- onProgress: function(id, fileName, loaded, total){
- var progress = Math.round(loaded / total * 100 );
- $('#fileInfo-publisher').text(fileName + ' ' + progress + '%');
- },
-
- messages: {
- typeError: Diaspora.I18n.t("photo_uploader.invalid_ext"),
- sizeError: Diaspora.I18n.t("photo_uploader.new_photo.size_error"),
- emptyError: Diaspora.I18n.t("photo_uploader.new_photo.empty")
- },
-
- onSubmit: function(id, fileName){
- $('#file-upload-publisher').addClass("loading");
- $('#publisher_textarea_wrapper').addClass("with_attachments");
- $('#photodropzone').append(
- "<li class='publisher_photo loading' style='position:relative;'>" +
- "<img alt='Ajax-loader2' src='/assets/ajax-loader2.gif' />" +
- "</li>"
- );
- },
-
- onComplete: function(id, fileName, responseJSON) {
- $('#fileInfo-publisher').text(Diaspora.I18n.t("photo_uploader.completed", {'file': fileName}));
- var id = responseJSON.data.photo.id,
- url = responseJSON.data.photo.unprocessed_image.url,
- currentPlaceholder = $('li.loading').first();
-
- $('#publisher_textarea_wrapper').addClass("with_attachments");
- $('#new_status_message').append("<input type='hidden' value='" + id + "' name='photos[]' />");
-
- // replace image placeholders
- var img = currentPlaceholder.find('img');
- img.attr('src', url);
- img.attr('data-id', id);
- currentPlaceholder.removeClass('loading');
- currentPlaceholder.append("<div class='x'>X</div>" +
- "<div class='circle'></div>");
- ////
-
- var publisher = $('#publisher'),
- textarea = publisher.find('textarea');
-
- publisher.find("input[type='submit']").removeAttr('disabled');
-
- $('.x').bind('click', function(){
- var photo = $(this).closest('.publisher_photo');
- photo.addClass("dim");
- $.ajax({url: "/photos/" + photo.children('img').attr('data-id'),
- dataType: 'json',
- type: 'DELETE',
- success: function() {
- photo.fadeOut(400, function(){
- photo.remove();
- if ( $('.publisher_photo').length == 0){
- $('#publisher_textarea_wrapper').removeClass("with_attachments");
- }
- });
- }
- });
- });
- },
-
- onAllComplete: function(completed_files){
- }
-
- });
-}
-createUploader();
+// @license-end
diff --git a/app/assets/javascripts/mobile/mobile_file_uploader.js b/app/assets/javascripts/mobile/mobile_file_uploader.js
new file mode 100644
index 000000000..1084821e9
--- /dev/null
+++ b/app/assets/javascripts/mobile/mobile_file_uploader.js
@@ -0,0 +1,84 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+//= require js_image_paths
+
+function createUploader(){
+
+ var aspectIds = gon.preloads.aspect_ids;
+
+ new qq.FileUploaderBasic({
+ element: document.getElementById('file-upload-publisher'),
+ params: {'photo' : {'pending' : 'true', 'aspect_ids' : aspectIds},},
+ allowedExtensions: ['jpg', 'jpeg', 'png', 'gif', 'tiff'],
+ action: "/photos",
+ debug: true,
+ button: document.getElementById('file-upload-publisher'),
+ sizeLimit: 4194304,
+
+ onProgress: function(id, fileName, loaded, total){
+ var progress = Math.round(loaded / total * 100 );
+ $('#fileInfo-publisher').text(fileName + ' ' + progress + '%');
+ },
+
+ messages: {
+ typeError: Diaspora.I18n.t("photo_uploader.invalid_ext"),
+ sizeError: Diaspora.I18n.t("photo_uploader.new_photo.size_error"),
+ emptyError: Diaspora.I18n.t("photo_uploader.new_photo.empty")
+ },
+
+ onSubmit: function(){
+ $('#file-upload-publisher').addClass("loading");
+ $('#publisher_textarea_wrapper').addClass("with_attachments");
+ $('#photodropzone').append(
+ "<li class='publisher_photo loading' style='position:relative;'>" +
+ "<img alt='Ajax-loader2' src='"+ImagePaths.get('ajax-loader2.gif')+"' />" +
+ "</li>"
+ );
+ },
+
+ onComplete: function(_id, fileName, responseJSON) {
+ $('#fileInfo-publisher').text(Diaspora.I18n.t("photo_uploader.completed", {'file': fileName}));
+ var id = responseJSON.data.photo.id,
+ url = responseJSON.data.photo.unprocessed_image.url,
+ currentPlaceholder = $('li.loading').first();
+
+ $('#publisher_textarea_wrapper').addClass("with_attachments");
+ $('#new_status_message').append("<input type='hidden' value='" + id + "' name='photos[]' />");
+
+ // replace image placeholders
+ var img = currentPlaceholder.find('img');
+ img.attr('src', url);
+ img.attr('data-id', id);
+ currentPlaceholder.removeClass('loading');
+ currentPlaceholder.append("<div class='x'>X</div>" +
+ "<div class='circle'></div>");
+ ////
+
+ var publisher = $('#publisher');
+
+ publisher.find("input[type='submit']").removeAttr('disabled');
+
+ $('.x').bind('click', function(){
+ var photo = $(this).closest('.publisher_photo');
+ photo.addClass("dim");
+ $.ajax({url: "/photos/" + photo.children('img').attr('data-id'),
+ dataType: 'json',
+ type: 'DELETE',
+ success: function() {
+ photo.fadeOut(400, function(){
+ photo.remove();
+ if ( $('.publisher_photo').length === 0){
+ $('#publisher_textarea_wrapper').removeClass("with_attachments");
+ }
+ });
+ }
+ });
+ });
+ },
+
+ onAllComplete: function(){
+ }
+
+ });
+}
+createUploader();
+// @license-end
diff --git a/app/assets/javascripts/mobile/profile_aspects.js b/app/assets/javascripts/mobile/profile_aspects.js
new file mode 100644
index 000000000..11769b4bd
--- /dev/null
+++ b/app/assets/javascripts/mobile/profile_aspects.js
@@ -0,0 +1,84 @@
+$(document).ready(function(){
+ /* profile page: aspect-dropdown */
+
+ // renders the cover text for the dropdown
+ function profileAspectDropdown_refresh($el) {
+ var cover_text, num_selected = $el.find('option.selected').length;
+ if(num_selected === 0) {
+ $el.removeClass('has_connection');
+ cover_text = Diaspora.I18n.t('aspect_dropdown.add_to_aspect');
+ } else {
+ $el.addClass('has_connection');
+ if(num_selected === 1) {
+ cover_text = $el.find('option.selected').data('name');
+ } else {
+ cover_text = Diaspora.I18n.t('aspect_dropdown.toggle', { 'count' : num_selected });
+ }
+ }
+ $el.find('option.list_cover').text(cover_text);
+ }
+
+ // onchange handler for aspect dropdown instances
+ var profileAspectDropDown_onchange = function() {
+ var $el = $(this),
+ selected = $el.find('option:selected');
+ $el.find('option.list_cover').text(Diaspora.I18n.t('aspect_dropdown.updating'));
+ $el.val('list_cover'); // switch back to cover
+
+ if(selected.hasClass('selected')) {
+ // remove from aspect
+ var membership_id = selected.data('membership_id');
+
+ $.ajax({
+ url: Routes.aspect_membership_path(membership_id),
+ type: 'DELETE',
+ dataType: 'json',
+ headers: {
+ 'Accept': "application/json, text/javascript, */*; q=0.01"
+ }
+ }).done(function() {
+ selected.text("– " + Diaspora.I18n.t('aspect_dropdown.mobile_row_unchecked', {name: selected.data('name')}));
+ selected.removeClass('selected');
+ profileAspectDropdown_refresh($el);
+ }).fail(function() {
+ alert(Diaspora.I18n.t('aspect_dropdown.error_remove'));
+ profileAspectDropdown_refresh($el);
+ });
+
+ } else {
+ // add to aspect
+ var person_id = $el.data('person-id');
+
+ $.ajax({
+ url: Routes.aspect_memberships_path(),
+ data: JSON.stringify({
+ "person_id": person_id,
+ "aspect_id": parseInt(selected.val(), 10)
+ }),
+ processData: false,
+ type: 'POST',
+ dataType: 'json',
+ headers: {
+ 'Accept': "application/json, text/javascript, */*; q=0.01"
+ },
+ contentType: "application/json; charset=UTF-8"
+ }).done(function(data) {
+ selected.data('membership_id', data.id); // remember membership-id
+ selected.text("✓ " + Diaspora.I18n.t('aspect_dropdown.mobile_row_checked', {name: selected.data('name')}));
+ selected.addClass('selected');
+ profileAspectDropdown_refresh($el);
+ }).fail(function() {
+ alert(Diaspora.I18n.t('aspect_dropdown.error'));
+ profileAspectDropdown_refresh($el);
+ });
+
+ }
+ };
+
+ // initialize list_cover and register eventhandler for every user_aspect dropdown there is
+ $('.user_aspects').each(function() {
+ profileAspectDropdown_refresh($(this));
+ $(this).change(profileAspectDropDown_onchange);
+ });
+});
+
diff --git a/app/assets/javascripts/osmlocator.js b/app/assets/javascripts/osmlocator.js
index 509413f9d..157230456 100644
--- a/app/assets/javascripts/osmlocator.js
+++ b/app/assets/javascripts/osmlocator.js
@@ -1,23 +1,25 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
OSM = {};
OSM.Locator = function(){
var geolocalize = function(callback){
navigator.geolocation.getCurrentPosition(function(position) {
- lat=position.coords.latitude;
- lon=position.coords.longitude;
- var display_name =$.getJSON("https://nominatim.openstreetmap.org/reverse?format=json&lat="+lat+"&lon="+lon+"&addressdetails=3", function(data){
+ var lat=position.coords.latitude,
+ lon=position.coords.longitude;
+ $.getJSON("https://nominatim.openstreetmap.org/reverse?format=json&lat="+lat+"&lon="+lon+"&addressdetails=3", function(data){
return callback(data.display_name, position.coords);
});
},errorGettingPosition);
};
- function errorGettingPosition(err) {
+ function errorGettingPosition() {
$("#location").remove();
- };
+ }
return {
getAddress: geolocalize
- }
-
-}
+ };
+};
+// @license-end
diff --git a/app/assets/javascripts/pages/contacts-index.js b/app/assets/javascripts/pages/contacts-index.js
deleted file mode 100644
index c570dfd6c..000000000
--- a/app/assets/javascripts/pages/contacts-index.js
+++ /dev/null
@@ -1,10 +0,0 @@
-Diaspora.Pages.ContactsIndex = function() {
- var self = this;
-
- this.subscribe("page/ready", function(evt, document) {
- self.infiniteScroll = self.instantiate("InfiniteScroll",
- {donetext: Diaspora.I18n.t("infinite_scroll.no_more_contacts"),});
- $('.conversation_button').tooltip({placement: 'bottom'});
- });
-
-};
diff --git a/app/assets/javascripts/pages/invitations-edit.js b/app/assets/javascripts/pages/invitations-edit.js
deleted file mode 100644
index b223147ec..000000000
--- a/app/assets/javascripts/pages/invitations-edit.js
+++ /dev/null
@@ -1,8 +0,0 @@
-Diaspora.Pages.InvitationsEdit = function() {
- var self = this;
-
- this.subscribe("page/ready", function(evt, body) {
- jQuery.ajaxSetup({'cache': true});
- $('#user_username').tooltip({trigger: 'focus', placement: 'right'});
- });
-};
diff --git a/app/assets/javascripts/pages/invitations-new.js b/app/assets/javascripts/pages/invitations-new.js
deleted file mode 100644
index da7338e64..000000000
--- a/app/assets/javascripts/pages/invitations-new.js
+++ /dev/null
@@ -1,12 +0,0 @@
-Diaspora.Pages.InvitationsNew = function() {
- var self = this;
-
- this.subscribe("page/ready", function(evt, document) {
- var rtl = $('html').attr('dir') == 'rtl',
- position = rtl ? 'left' : 'right';
-
- $('#new_user [title]').tooltip({trigger: 'focus', placement: position});
- $('#user_email').focus();
- });
-};
-
diff --git a/app/assets/javascripts/pages/notifications-index.js b/app/assets/javascripts/pages/notifications-index.js
deleted file mode 100644
index 7633a4d7d..000000000
--- a/app/assets/javascripts/pages/notifications-index.js
+++ /dev/null
@@ -1,8 +0,0 @@
-Diaspora.Pages.NotificationsIndex = function() {
- var self = this;
-
- this.subscribe("page/ready", function(evt, document) {
- self.infiniteScroll = self.instantiate("InfiniteScroll");
- self.instantiate("TimeAgo", document.find("time.timeago"));
- });
-};
diff --git a/app/assets/javascripts/pages/users-getting-started.js b/app/assets/javascripts/pages/users-getting-started.js
index 58182923e..2fed55655 100644
--- a/app/assets/javascripts/pages/users-getting-started.js
+++ b/app/assets/javascripts/pages/users-getting-started.js
@@ -1,3 +1,5 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
Diaspora.Pages.UsersGettingStarted = function() {
var self = this;
@@ -5,12 +7,12 @@ Diaspora.Pages.UsersGettingStarted = function() {
self.peopleSearch = self.instantiate("Search", body.find("form.people.search_form"));
self.tagSearch = self.instantiate("Search", body.find("form.tag_input.search_form"));
- $('#edit_profile').bind('ajax:success', function(evt, data, status, xhr){
+ $('#edit_profile').bind('ajax:success', function(){
$('#gs-name-form-spinner').addClass("hidden");
});
// It seems that the default behavior of rails ujs is to clear the remote form
- $('#edit_profile').bind('ajax:complete', function(evt, xhr, status){
+ $('#edit_profile').bind('ajax:complete', function(){
var firstNameField = $("#profile_first_name");
firstNameField.val(firstNameField.data("cachedValue"));
@@ -33,7 +35,7 @@ Diaspora.Pages.UsersGettingStarted = function() {
$(this).addClass("active_input");
});
- $("#awesome_button").bind("click", function(evt){
+ $("#awesome_button").bind("click", function(){
var confirmMessage = Diaspora.I18n.t("getting_started.no_tags");
var message = Diaspora.I18n.t("getting_started.preparing_your_stream");
var confirmation = true;
@@ -71,12 +73,14 @@ Diaspora.Pages.UsersGettingStarted = function() {
});
autocompleteInput.bind('keydown', function(evt){
- if(evt.keyCode == 13 || evt.keyCode == 9 || evt.keyCode == 32){
+ if(evt.keyCode === 13 || evt.keyCode === 9 || evt.keyCode === 32){
evt.preventDefault();
- if( $('li.as-result-item.active').length == 0 ){
+ if( $('li.as-result-item.active').length === 0 ){
$('li.as-result-item').first().click();
}
}
});
});
};
+// @license-end
+
diff --git a/app/assets/javascripts/people.js b/app/assets/javascripts/people.js
deleted file mode 100644
index d204d481c..000000000
--- a/app/assets/javascripts/people.js
+++ /dev/null
@@ -1,26 +0,0 @@
-/* Copyright (c) 2010-2011, Diaspora Inc. This file is
- * licensed under the Affero General Public License version 3 or later. See
- * the COPYRIGHT file.
- */
-//= require aspect-edit-pane
-//= require fileuploader-custom
-//= require jquery.autoSuggest.custom
-
-$(document).ready(function() {
- $('#profile_buttons .profile_button div').tooltip({placement: 'bottom'});
- $('#profile_buttons .sharing_message_container').tooltip({placement: 'bottom'});
- $("#block_user_button").click(function(evt) {
- if(!confirm(Diaspora.I18n.t('ignore_user'))) { return; }
- var personId = $(this).data('person-id');
- var block = new app.models.Block();
- block.save({block : {person_id : personId}}, {
- success: function() {
- $('#profile_buttons').attr('class', 'blocked');
- $('#sharing_message').attr('class', 'icons-circle');
- $('.profile_button, .white_bar').remove();
- }
- });
-
- return false;
- });
-});
diff --git a/app/assets/javascripts/profile.js b/app/assets/javascripts/profile.js
deleted file mode 100644
index 8d6b9ddd1..000000000
--- a/app/assets/javascripts/profile.js
+++ /dev/null
@@ -1,6 +0,0 @@
-/* Copyright (c) 2010-2011, Diaspora Inc. This file is
- * licensed under the Affero General Public License version 3 or later. See
- * the COPYRIGHT file.
- */
-//= require jquery.autoSuggest.custom
-
diff --git a/app/assets/javascripts/view.js b/app/assets/javascripts/view.js
index 6e7d7f9ec..508da666d 100644
--- a/app/assets/javascripts/view.js
+++ b/app/assets/javascripts/view.js
@@ -1,8 +1,4 @@
-/* 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 mailchimp/jquery.form
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
var View = {
initialize: function() {
/* Buttons */
@@ -21,46 +17,19 @@ var View = {
/* Dropdowns */
$(document)
- .on('click', this.dropdowns.selector, this.dropdowns.click);
+ .on('click', this.dropdowns.selector, this.dropdowns.click)
+ .on('keypress', this.dropdowns.selector, this.dropdowns.click);
- /* Avatars */
- $(this.avatars.selector).error(this.avatars.fallback);
-
- /* Clear forms after successful submit, this is some legacy dan hanson stuff, do we still want it? */
- $.fn.clearForm = function() {
- return this.each(function() {
- if ($(this).is('form') && !$(this).hasClass('form_do_not_clear')) {
- return $(':input', this).clearForm();
- }
- if ($(this).hasClass('clear_on_submit') || $(this).is(':text') || $(this).is(':password') || $(this).is('textarea')) {
- $(this).val('');
- } else if ($(this).is(':checkbox') || $(this).is(':radio')) {
- $(this).attr('checked', false);
- } else if ($(this).is('select')) {
- this.selectedIndex = -1;
- } else if ($(this).attr('name') == 'photos[]') {
- $(this).val('');
- }
- $(this).blur();
- });
- };
-
- $(document).on('ajax:success', 'form[data-remote]', function (e) {
+ $(document).on('ajax:success', 'form[data-remote]', function () {
$(this).clearForm();
$(this).focusout();
});
/* tag following */
- $("#new_tag_following .tag_input").bind('focus', function(evt){
+ $("#new_tag_following .tag_input").bind('focus', function(){
$(this).siblings("#tag_following_submit").removeClass('hidden');
});
- /* photo exporting in the works */
- $("#photo-export-button").bind("click", function(evt){
- evt.preventDefault();
- alert($(this).attr('title'));
- });
-
$(document.body).click(this.dropdowns.removeFocus);
$('a[rel*=facebox]').facebox();
@@ -68,8 +37,8 @@ var View = {
Diaspora.page.directionDetector.updateBinds();
});
- $("a.new_aspect").click(function(e){
- $("input#aspect_name").focus()
+ $("a.new_aspect").click(function(){
+ $("input#aspect_name").focus();
});
/* facebox 'done' buttons */
@@ -110,16 +79,10 @@ var View = {
},
selector: ".dropdown > .toggle",
parentSelector: ".dropdown > .wrapper"
- },
-
- avatars: {
- fallback: function(evt) {
- $(this).attr("src", "/assets/user/default.png");
- },
- selector: "img.avatar"
}
};
$(function() {
View.initialize();
});
+// @license-end
diff --git a/app/assets/javascripts/widgets/back-to-top.js b/app/assets/javascripts/widgets/back-to-top.js
index bb9a927d2..bde326774 100644
--- a/app/assets/javascripts/widgets/back-to-top.js
+++ b/app/assets/javascripts/widgets/back-to-top.js
@@ -1,3 +1,5 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
(function() {
var BackToTop = function() {
var self = this;
@@ -25,9 +27,10 @@
(self.body.scrollTop() > 1000) ?
'addClass' :
'removeClass'
- ]('visible')
+ ]('visible');
};
};
Diaspora.Widgets.BackToTop = BackToTop;
})();
+// @license-end
diff --git a/app/assets/javascripts/widgets/direction-detector.js b/app/assets/javascripts/widgets/direction-detector.js
index 8c886e6f3..c3b034fa6 100644
--- a/app/assets/javascripts/widgets/direction-detector.js
+++ b/app/assets/javascripts/widgets/direction-detector.js
@@ -1,3 +1,5 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
/* Copyright (c) 2010-2011, Diaspora Inc. This file is
* licensed under the Affero General Public License version 3 or later. See
* the COPYRIGHT file.
@@ -11,47 +13,13 @@
this.subscribe("widget/ready", function() {
self.updateBinds();
-
+
self.globalSubscribe("stream/scrolled", function() {
self.updateBinds();
});
});
- this.isRTL = function(str) {
- if(typeof str !== "string" || str.length < 1) {
- return false;
- }
-
- var charCode = str.charCodeAt(0);
- if(charCode >= 1536 && charCode <= 1791) // Sarabic, Persian, ...
- return true;
-
- else if(charCode >= 65136 && charCode <= 65279) // Arabic present 1
- return true;
-
- else if(charCode >= 64336 && charCode <= 65023) // Arabic present 2
- return true;
-
- else if(charCode>=1424 && charCode<=1535) // Hebrew
- return true;
-
- else if(charCode>=64256 && charCode<=64335) // Hebrew present
- return true;
-
- else if(charCode>=1792 && charCode<=1871) // Syriac
- return true;
-
- else if(charCode>=1920 && charCode<=1983) // Thaana
- return true;
-
- else if(charCode>=1984 && charCode<=2047) // NKo
- return true;
-
- else if(charCode>=11568 && charCode<=11647) // Tifinagh
- return true;
-
- return false;
- };
+ this.isRTL = app.helpers.txtDirection.isRTL;
this.updateBinds = function() {
$.each(self.binds, function(index, bind) {
@@ -71,16 +39,13 @@
this.updateDirection = function() {
var textArea = $(this),
- cleaned = textArea.val().replace(self.cleaner, "").replace(/^[ ]+/, "");
+ cleaned = textArea.val().replace(self.cleaner, "").replace(/^[ ]+/, "");
- if(self.isRTL(cleaned)) {
- textArea.css("direction", "rtl");
- }
- else {
- textArea.css("direction", "ltr");
- }
+ app.helpers.txtDirection.setCssFor(cleaned, textArea);
};
};
Diaspora.Widgets.DirectionDetector = DirectionDetector;
})();
+// @license-end
+
diff --git a/app/assets/javascripts/widgets/flash-messages.js b/app/assets/javascripts/widgets/flash-messages.js
index 377120991..142efce74 100644
--- a/app/assets/javascripts/widgets/flash-messages.js
+++ b/app/assets/javascripts/widgets/flash-messages.js
@@ -1,3 +1,5 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
(function() {
var FlashMessages = function() {
var self = this;
@@ -33,3 +35,5 @@
Diaspora.Widgets.FlashMessages = FlashMessages;
})();
+// @license-end
+
diff --git a/app/assets/javascripts/widgets/header.js b/app/assets/javascripts/widgets/header.js
deleted file mode 100644
index a1fa4ec88..000000000
--- a/app/assets/javascripts/widgets/header.js
+++ /dev/null
@@ -1,21 +0,0 @@
-(function() {
- var Header = function() {
- var self = this;
-
- this.subscribe("widget/ready", function(evt, header) {
- self.notifications = self.instantiate("Notifications",
- header.find("#notification_badge .badge_count"),
- header.find("#notification_dropdown")
- );
-
- self.notificationsDropdown = self.instantiate("NotificationsDropdown",
- header.find("#notification_badge"),
- header.find("#notification_dropdown")
- );
-
- self.search = self.instantiate("Search", header.find(".search_form"));
- });
- };
-
- Diaspora.Widgets.Header = Header;
-})();
diff --git a/app/assets/javascripts/widgets/infinite-scroll.js b/app/assets/javascripts/widgets/infinite-scroll.js
index dbf78b937..d3fa5be01 100644
--- a/app/assets/javascripts/widgets/infinite-scroll.js
+++ b/app/assets/javascripts/widgets/infinite-scroll.js
@@ -1,3 +1,5 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
/* Copyright (c) 2010-2011, Diaspora Inc. This file is
* licensed under the Affero General Public License version 3 or later. See
* the COPYRIGHT file.
@@ -11,7 +13,7 @@
debug: false,
donetext: Diaspora.I18n.t("infinite_scroll.no_more"),
loadingText: "",
- loadingImg: "/assets/ajax-loader.gif",
+ loadingImg: ImagePaths.get("ajax-loader.gif"),
navSelector: "#pagination",
nextSelector: ".paginate",
itemSelector: ".stream_element",
@@ -56,4 +58,5 @@
Diaspora.Widgets.InfiniteScroll = InfiniteScroll;
})();
+// @license-end
diff --git a/app/assets/javascripts/widgets/lightbox.js b/app/assets/javascripts/widgets/lightbox.js
index d896937fc..461be1d0e 100644
--- a/app/assets/javascripts/widgets/lightbox.js
+++ b/app/assets/javascripts/widgets/lightbox.js
@@ -1,3 +1,5 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
/* Copyright (c) 2010-2011, Diaspora Inc. This file is
* licensed under the Affero General Public License version 3 or later. See
* the COPYRIGHT file.
@@ -25,7 +27,7 @@ jQuery.fn.center = (function() {
imageSelector: 'img.stream-photo'
};
- this.subscribe("widget/ready", function(evt) {
+ this.subscribe("widget/ready", function() {
$.extend(self, {
lightbox: $("#lightbox"),
navigation: $("#lightbox-navigation"),
@@ -92,7 +94,7 @@ jQuery.fn.center = (function() {
this.nextImage = function(thumb){
var next = thumb.next();
- if (next.length == 0) {
+ if (next.length === 0) {
next = self.imageset.find("img").first();
}
return(next);
@@ -100,7 +102,7 @@ jQuery.fn.center = (function() {
this.prevImage = function(thumb){
var prev = thumb.prev();
- if (prev.length == 0) {
+ if (prev.length === 0) {
prev = self.imageset.find("img").last();
}
return(prev);
@@ -128,9 +130,9 @@ jQuery.fn.center = (function() {
"data-full-photo": image.attr("data-full-photo")
});
- if(image.attr("data-full-photo") == imageUrl) {
+ if(image.attr("data-full-photo") === imageUrl) {
imageThumb = thumb;
- };
+ }
self.imageset.append(thumb);
});
@@ -152,7 +154,7 @@ jQuery.fn.center = (function() {
this.scrollToThumbnail = function(imageThumb) {
self.navigation.animate({scrollLeft: (self.navigation.scrollLeft()
+ imageThumb.offset().left +35 - (self.window.width() / 2))}, 200, 'swing');
- }
+ };
this.selectImage = function(imageThumb) {
$(".selected", self.imageset).removeClass("selected");
@@ -176,7 +178,7 @@ jQuery.fn.center = (function() {
this.resetLightbox = function() {
self.lightbox.hide();
self.body.removeClass("lightboxed");
- self.image.attr("src", "assets/ajax-loader2.gif");
+ self.image.attr("src", ImagePaths.get("ajax-loader2.gif"));
self.imageset.html("");
};
@@ -187,3 +189,5 @@ jQuery.fn.center = (function() {
Diaspora.Widgets.Lightbox = Lightbox;
})();
+// @license-end
+
diff --git a/app/assets/javascripts/widgets/notifications-badge.js b/app/assets/javascripts/widgets/notifications-badge.js
deleted file mode 100644
index ea062430a..000000000
--- a/app/assets/javascripts/widgets/notifications-badge.js
+++ /dev/null
@@ -1,83 +0,0 @@
-(function() {
- var NotificationDropdown = function() {
- var self = this;
-
- this.subscribe("widget/ready",function(evt, badge, dropdown) {
- $.extend(self, {
- badge: badge,
- badgeLink: badge.find("a"),
- documentBody: $(document.body),
- dropdown: dropdown,
- dropdownNotifications: dropdown.find(".notifications"),
- ajaxLoader: dropdown.find(".ajax_loader")
- });
-
- if( ! $.browser.msie ) {
- self.badge.on('click', self.badgeLink, function(evt){
- evt.preventDefault();
- evt.stopPropagation();
- if (self.dropdownShowing()){
- self.hideDropdown();
- } else {
- self.showDropdown();
- }
- });
- }
-
- self.documentBody.click(function(evt) {
- var inDropdown = $(evt.target).parents().is(self.dropdown);
- var inHovercard = $.contains(app.hovercard.el, evt.target);
-
- if(!inDropdown && !inHovercard && self.dropdownShowing()) {
- self.badgeLink.click();
- }
- });
- });
-
-
- this.dropdownShowing = function() {
- return this.dropdown.css("display") === "block";
- };
-
- this.showDropdown = function() {
- self.ajaxLoader.show();
- self.badge.addClass("active");
- self.dropdown.css("display", "block");
-
- self.getNotifications();
- };
-
- this.hideDropdown = function() {
- self.badge.removeClass("active");
- self.dropdown.css("display", "none");
- };
-
- this.getNotifications = function() {
- $.getJSON("/notifications?per_page=5", function(notifications) {
- self.notifications = notifications;
- self.renderNotifications();
- });
- };
-
- this.renderNotifications = function() {
- self.dropdownNotifications.empty();
-
- $.each(self.notifications, function(index, notifications) {
- $.each(notifications, function(index, notification) {
- self.dropdownNotifications.append(notification.note_html);
- });
- });
- self.dropdownNotifications.find("time.timeago").timeago();
-
- self.dropdownNotifications.find('.unread').each(function(index) {
- Diaspora.page.header.notifications.setUpUnread( $(this) );
- });
- self.dropdownNotifications.find('.read').each(function(index) {
- Diaspora.page.header.notifications.setUpRead( $(this) );
- });
- self.ajaxLoader.hide();
- };
- };
-
- Diaspora.Widgets.NotificationsDropdown = NotificationDropdown;
-})();
diff --git a/app/assets/javascripts/widgets/notifications.js b/app/assets/javascripts/widgets/notifications.js
deleted file mode 100644
index baac01c93..000000000
--- a/app/assets/javascripts/widgets/notifications.js
+++ /dev/null
@@ -1,145 +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.
-*/
-
-(function() {
- var Notifications = function() {
- var self = this;
-
- this.subscribe("widget/ready", function(evt, badge, notificationMenu) {
- $.extend(self, {
- badge: badge,
- count: parseInt(badge.html()) || 0,
- notificationMenu: notificationMenu,
- notificationPage: null
- });
-
- $("a.more").click( function(evt) {
- evt.preventDefault();
- $(this).hide()
- .next(".hidden")
- .removeClass("hidden");
- });
- self.notificationMenu.find('a#mark_all_read_link').click(function(event) {
- $.ajax({
- url: "/notifications/read_all",
- type: "GET",
- dataType:'json',
- success: function(){
- self.notificationMenu.find('.unread').each(function(index) {
- self.setUpRead( $(this) );
- });
- self.resetCount();
- }
- });
- $(event.target).addClass("disabled");
- return false;
- });
- });
- this.setUpNotificationPage = function( page ) {
- self.notificationPage = page;
- }
- this.unreadClick = function() {
- $.ajax({
- url: "/notifications/" + $(this).closest(".stream_element,.notification_element").data("guid"),
- data: { set_unread: true },
- type: "PUT",
- success: self.clickSuccess
- });
- };
- this.readClick = function() {
- $.ajax({
- url: "/notifications/" + $(this).closest(".stream_element,.notification_element").data("guid"),
- data: { set_unread: false },
- type: "PUT",
- success: self.clickSuccess
- });
- };
- this.setUpUnread = function( an_obj ) {
- an_obj.removeClass("read").addClass( "unread" );
- an_obj.find('.unread-toggle')
- .unbind("click")
- .click(self.readClick)
- .find('.entypo')
- .tooltip('destroy')
- .removeAttr('data-original-title')
- .attr('title', Diaspora.I18n.t('notifications.mark_read'))
- .tooltip();
- }
- this.setUpRead = function( an_obj ) {
- an_obj.removeClass("unread").addClass( "read" );
- an_obj.find('.unread-toggle')
- .unbind("click")
- .click(self.unreadClick)
- .find('.entypo')
- .tooltip('destroy')
- .removeAttr('data-original-title')
- .attr('title', Diaspora.I18n.t('notifications.mark_unread'))
- .tooltip();
- }
- this.clickSuccess = function( data ) {
- var itemID = data["guid"]
- var isUnread = data["unread"]
- self.notificationMenu.find('.read,.unread').each(function(index) {
- if ( $(this).data("guid") == itemID ) {
- if ( isUnread ) {
- self.notificationMenu.find('a#mark_all_read_link').removeClass('disabled')
- self.setUpUnread( $(this) )
- } else {
- self.setUpRead( $(this) )
- }
- }
- });
- if ( self.notificationPage == null ) {
- if ( isUnread ) {
- self.incrementCount();
- }else{
- self.decrementCount();
- }
- } else {
- var type = $('.notification_element[data-guid=' + data["guid"] + ']').data('type');
- self.notificationPage.updateView(data["guid"], type, isUnread);
- }
- };
- this.showNotification = function(notification) {
- $(notification.html).prependTo(this.notificationMenu)
- .fadeIn(200)
- .delay(8000)
- .fadeOut(200, function() {
- $(this).detach();
- });
-
- if(typeof notification.incrementCount === "undefined" || notification.incrementCount) {
- this.incrementCount();
- }
- };
-
- this.changeNotificationCount = function(change) {
- self.count = Math.max( self.count + change, 0 )
- self.badge.text(self.count);
-
- if(self.count === 0) {
- self.badge.addClass("hidden");
- }
- else if(self.count === 1) {
- self.badge.removeClass("hidden");
- }
- };
- this.resetCount = function(change) {
- self.count = 0;
- this.changeNotificationCount(0);
- };
-
- this.decrementCount = function() {
- self.changeNotificationCount(-1);
- };
-
- this.incrementCount = function() {
- self.changeNotificationCount(1);
- };
- };
-
- Diaspora.Widgets.Notifications = Notifications;
-})();
diff --git a/app/assets/javascripts/widgets/search.js b/app/assets/javascripts/widgets/search.js
deleted file mode 100644
index 53b60d152..000000000
--- a/app/assets/javascripts/widgets/search.js
+++ /dev/null
@@ -1,75 +0,0 @@
-(function() {
- var Search = function() {
- var self = this;
-
- this.subscribe("widget/ready", function(evt, searchForm) {
- $.extend(self, {
- searchForm: searchForm,
- searchFormAction: searchForm.attr("action"),
- searchInput: searchForm.find("input[type='search']"),
- searchInputName: searchForm.find("input[type='search']").attr("name"),
- options: {
- cacheLength : 15,
- delay : 800,
- extraParams : {limit : 4},
- formatItem : self.formatItem,
- formatResult : self.formatResult,
- max : 5,
- minChars : 2,
- onSelect: self.selectItemCallback,
- parse : self.parse,
- scroll : false
- }
- });
-
- self.searchInput.autocomplete(self.searchFormAction + ".json", $.extend(self.options, {
- element: self.searchInput
- }));
- });
-
- this.formatItem = function(row) {
- if (typeof row.search !== "undefined") {
- return Diaspora.I18n.t("search_for", row);
- } else {
- if (row.avatar) {
- return "<img src='"+ row.avatar +"' class='avatar'/>" + row.name;
- } else {
- return row.name;
- }
- }
- };
-
- this.formatResult = function(row) {
- return Handlebars.Utils.escapeExpression(row.name);
- };
-
- this.parse = function(data) {
- var results = data.map(function(person){
- person['name'] = Handlebars.Utils.escapeExpression(person['name']);
- return {data : person, value : person['name']}
- });
-
- results.push({
- data: {
- name: self.searchInput.val(),
- url: self.searchFormAction + "?" + self.searchInputName + "=" + self.searchInput.val(),
- search: true
- },
- value: self.searchInput.val()
- });
-
- return results;
- };
-
- this.selectItemCallback = function(evt, data, formatted) {
- if (data['search'] === true) { // The placeholder "search for" result
- window.location = self.searchFormAction + '?' + self.searchInputName + '=' + data['name'];
- } else { // The actual result
- self.options.element.val(formatted);
- window.location = data['url'] ? data['url'] : "/tags/" + data['name'].substring(1); // we don't want the #-character
- }
- };
- };
-
- Diaspora.Widgets.Search = Search;
-})();
diff --git a/app/assets/javascripts/widgets/stream.js b/app/assets/javascripts/widgets/stream.js
index c21025aff..a126af0e1 100644
--- a/app/assets/javascripts/widgets/stream.js
+++ b/app/assets/javascripts/widgets/stream.js
@@ -1,3 +1,5 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
(function() {
var Stream = function() {
var self = this;
@@ -30,3 +32,5 @@
Diaspora.Widgets.Stream = Stream;
}
})();
+// @license-end
+
diff --git a/app/assets/javascripts/widgets/timeago.js b/app/assets/javascripts/widgets/timeago.js
index 79e74fd46..dcb680864 100644
--- a/app/assets/javascripts/widgets/timeago.js
+++ b/app/assets/javascripts/widgets/timeago.js
@@ -1,17 +1,17 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
/* Copyright (c) 2010-2011, Diaspora Inc. This file is
* licensed under the Affero General Public License version 3 or later. See
* the COPYRIGHT file.
*/
(function() {
Diaspora.Widgets.TimeAgo = function() {
- var self = this;
-
this.subscribe("widget/ready", function() {
if(Diaspora.I18n.language !== "en") {
$.timeago.settings.lang = Diaspora.I18n.language;
- $.timeago.settings.strings[Diaspora.I18n.language] = {}
+ $.timeago.settings.strings[Diaspora.I18n.language] = {};
$.each($.timeago.settings.strings["en"], function(index) {
- if(index == "numbers") {
+ if(index === "numbers") {
$.timeago.settings.strings[Diaspora.I18n.language][index] = [];
}
else {
@@ -22,3 +22,4 @@
});
};
})();
+// @license-end
diff --git a/app/assets/stylesheets/_flash_messages.scss b/app/assets/stylesheets/_flash_messages.scss
index 56ead2668..e4b4e46c4 100644
--- a/app/assets/stylesheets/_flash_messages.scss
+++ b/app/assets/stylesheets/_flash_messages.scss
@@ -18,8 +18,7 @@
}
.message {
- @include border-radius(6px);
- @include box-shadow(0, 1px, 4px, rgba(0,0,0,0.8));
+ box-shadow: 0 1px 4px rgba(0,0,0,0.8);
display : inline-block;
padding: 10px 12px;
@@ -29,6 +28,7 @@
color : #fff;
background-color : rgba(0,0,0,0.8);
border : 1px solid rgba(255,255,255,0.7);
+ border-radius: 6px;
font-weight: bold;
font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
diff --git a/app/assets/stylesheets/_mixins.css.scss b/app/assets/stylesheets/_mixins.scss
index 8b2c6b31a..5c37c1556 100644
--- a/app/assets/stylesheets/_mixins.css.scss
+++ b/app/assets/stylesheets/_mixins.scss
@@ -8,15 +8,6 @@ $easing: linear;
$default-border-radius: 3px;
/* Style includes */
-@mixin border-radius($tl:$default-border-radius, $tr:$tl, $br:$tl, $bl:$tl){
- -moz-border-radius: $tl $tr $br $bl;
- -webkit-border-radius: $tl $tr $br $bl;
- border-radius: $tl $tr $br $bl;
-}
-
-@mixin dropdown-shadow{
- @include box-shadow(0,0px,13px,rgba(20,20,20,0.5))
-}
@mixin button-gradient($color){
@include linear-gradient(lighten($color,20%), $color);
@@ -30,65 +21,32 @@ $default-border-radius: 3px;
@include linear-gradient(lighten($color,20%), darken($color,15%));
}
-/* Browser compatability */
-@mixin box-shadow($left, $top, $blur, $color:#000){
- -webkit-box-shadow: $left $top $blur $color;
- -moz-box-shadow: $left $top $blur $color;
- box-shadow: $left $top $blur $color;
-}
@mixin linear-gradient($from, $to, $start:0%, $end:100%){
- background-image: mix($from,$to);
+ background: mix($from,$to);
filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr=$from, endColorstr=$to);
-ms-filter: "progid:DXImageTransform.Microsoft.gradient (GradientType=0, startColorstr=#{$from}, endColorstr=#{$to})";
- background-image: -webkit-gradient(linear, 0% $start, 0% $end, from($from), to($to));
- background-image: -moz-linear-gradient(top, $from $start, $to $end);
- background-image: -o-linear-gradient(top, $from $start, $to $end);
+ background: linear-gradient(to bottom, $from $start, $to $end);
}
@mixin horizontal-linear-gradient($from, $to, $start:0%, $end:100%){
background-image: mix($from,$to);
-
- background-image: -moz-linear-gradient(left, $from $start, $to $end);
- background-image: -o-linear-gradient(left, $from $start, $to $end);
- background-image: -webkit-linear-gradient(left, $from $start, $to $end);
- background-image: -ms-linear-gradient(left, $from $start, $to $end);
- background-image: -khtml-linear-gradient(left, $from $start, $to $end);
-}
-
-@mixin opacity($val){
- filter: alpha(opacity= $val* 100);
- -moz-opacity: $val;
- -khtml-opacity: $val;
- opacity: $val;
+ background-image: linear-gradient(left, $from $start, $to $end);
}
-@mixin user-select($val){
- -webkit-user-select: $val;
- -moz-user-select: $val;
-}
@mixin transition($type, $speed:$speed, $easing:$easing){
- -webkit-transition : $type $speed $easing;
- -moz-transition : $type $speed $easing;
- -o-transition : $type $speed $easing;
- transition : $type $speed $easing;
+ transition : $type $speed $easing;
}
@mixin animate($name, $speed:$speed, $occurances:"") {
- -webkit-animation : $name $speed $occurances;
- -moz-animation : $name $speed $occurances;
- -ms-animation : $name $speed $occurances;
- -o-animation : $name $speed $occurances;
+ animation : $name $speed $occurances;
}
@mixin animation($name, $speed:0.2s, $easing:ease-in-out) {
- -webkit-animation: $name $speed $easing;
- -moz-animation: $name $speed $easing;
- -ms-animation: $name $speed $easing;
- -o-animation: $name $speed $easing;
+ animation: $name $speed $easing;
}
@mixin video-overlay(){
@@ -104,8 +62,8 @@ $default-border-radius: 3px;
size : 60px 60px;
}
- @include border-radius(70px, 10px, 10px, 70px);
- @include box-shadow(0, 0, 32px, rgba(255,255,255,.5));
+ border-radius: 70px 10px 10px 70px;
+ box-shadow: 0 0 32px rgba(255,255,255,.5);
position : absolute;
top : 50%;
@@ -126,7 +84,7 @@ $default-border-radius: 3px;
}
& > div > div {
- @include opacity(1.0);
+ opacity: 1;
overflow: hidden;
text-shadow: -1px -1px 0 #000, 0 0 7px #111;
color: #F0F0F0;
@@ -143,7 +101,7 @@ $default-border-radius: 3px;
font-size: .94em;
line-height: 1.3em;
white-space: nowrap;
- @include opacity(.9);
+ opacity: 0.9;
a {
color: lighten($blue, 25%);
diff --git a/app/assets/stylesheets/admin.css.scss b/app/assets/stylesheets/admin.scss
index 2084f5e3d..2084f5e3d 100644
--- a/app/assets/stylesheets/admin.css.scss
+++ b/app/assets/stylesheets/admin.scss
diff --git a/app/assets/stylesheets/application.css.sass b/app/assets/stylesheets/application.css.sass
deleted file mode 100644
index fcca31881..000000000
--- a/app/assets/stylesheets/application.css.sass
+++ /dev/null
@@ -1,1478 +0,0 @@
-@import 'compass'
-@import 'colors'
-@import 'ui'
-@import '_mixins'
-@import '_flash_messages'
-@import 'new_styles/_spinner'
-
-@import 'sidebar'
-@import 'leftnavbar'
-@import 'sprites'
-@import 'header'
-@import 'footer'
-@import 'opengraph'
-@import 'poll'
-@import 'help'
-@import 'profile'
-@import 'publisher_blueprint'
-@import 'facebox'
-@import 'aspects'
-@import 'stream-faces'
-@import 'popover'
-@import 'stream_element'
-@import 'report'
-@import 'new_styles/_forms'
-@import 'tag'
-@import 'photo'
-
-/* ====== media ====== */
-.media
- :margin 10px
-
-.media, .bd
- :overflow hidden
- :_overflow visible
- :zoom 1
-
-.media .img
- :float left
- :margin-right 10px
-
-.media .img img
- :display block
-
-.media .imgEt
- :float right
- :margin-left 10px
-/* ====== ----- ====== */
-
-body
- :padding 2em
- :margin 0
- :top 33px
- :background-color $background-white
-
- :font
- :family "Helvetica Neue",Helvetica,Arial,sans-serif
- :size 13px
-
-a
- :color $blue
- :text
- :decoration none
- &:hover
- :color $blue
- :text
- :decoration underline
- &.disabled
- :color $link-disabled-grey
- :cursor default
- &.disabled.button:hover
- :color $link-disabled-grey
- :cursor default
- :background #f7f7f7
-
-p
- :word-wrap break-word
-
-h1, h2, h3, h4
- :margin
- :bottom 5px
-
- small
- :font-size small
- :color $text-grey
-
-ul > li
- :list-style none
-
-.content ul li
- :list-style disc
-
-.rtl
- :direction rtl
- :text-align right
-
-.hidden
- :display none
-
-.avatar
- :-webkit-box-shadow rgba(0,0,0,0.12) 0px 0px 5px inset
- :-moz-box-shadow rgba(0,0,0,0.12) 0px 0px 5px inset
-
- :background
- :color $background-grey
-
- :width 50px
- :height 50px
-
- :overflow hidden
-
-#content
- :background
- :color #fff
- :border 1px solid #ccc
- :height 100%
-
-.login_error,
-.login_alert
- :color rgb(208,49,43)
- :text-shadow 1px 1px 20px rgb(208,49,43)
-
-.login_notice
- :color rgb(10,150,10)
- :text-shadow 1px 1px 20px rgb(126,240,77)
-
-.fieldWithErrors
- :display inline
-
-.error_messages
- :width 400px
- :border 2px solid #CF0000
- :padding 0
- :padding-bottom 12px
- :margin-bottom 20px
- :background-color #f0f0f0
- :font
- :size 12px
- h2
- :text-align left
- :padding 5px 5px 5px 15px
- :margin 0
- :font
- :weight bold
- :size 12px
- :background-color #c00
- p
- :margin 8px 10px
- ul
- :margin 0
-
-//////////////////////////////////
-
-//////////////////////////////////
-//hacks for tagging plugin...
-ul.as-selections
- :width 100% !important
-//////////////////////////////////
-
-.unread
- :background-color #E6E6E6
- :color #333 !important
- time
- :color #333 !important
-
-#author_info
- :position relative
-
- .avatar img
- :position relative
- :top 0px
- :display inline-block
- :height 30px
- :width 30px
-
- .from
- :display inline-block
-
- &.profile
- .from
- :padding 0
-
- h2,
- h3,
- h4,
- h5
- :display inline-block
- :margin
- :bottom 10px
- :right 10px
- h2
- :margin
- :bottom 0
-
- &.show
- a
- :margin
- :right 1em
- :font
- :weight normal
- h4,
- h5
- :margin 0
- :padding 0
-
- .right
- :top 10px
-
- .description
- :margin
- :bottom 10px
-
-.info
- :font-size smaller
-
-.controls
- :z-index 6
- :float right
-
- .post_report, .comment_report
- :display inline-block
-
- .icons-report
- :height 14px
- :width 14px
-
- .block_user
- :display inline-block
-
- .icons-ignoreuser
- :height 14px
- :width 14px
-
- .delete
- :display inline-block
-
- .icons-deletelabel
- :height 14px
- :width 14px
-
- a:hover
- :text-decoration none
-
-.grey,
-.grey *
- :color $text-grey
-
-.pull-left
- :float left
-
-.pull-right
- :float right
-
-.details,
-.details *
- :font
- :weight normal
-
-.time,
-.via
- :color #aaa
- a
- :color $text-grey
- :text
- :decoration none
- :border none
-
-#user_name
- :margin
- :bottom 20px
-
- img
- :margin
- :right 10px
- :display inline-block
- :float left
- :height 40px
-
- h1
- :margin
- :bottom 7px
- :line-height 18px
- a
- :color #000
-
- span
- :size small
- :font
- :weight normal
- :color $text-grey
- #latest_message_time
- :font-style italic
- ul
- :display inline
- :margin 0
- :padding 0
-
- > li
- :display inline
- :margin
- :right 1em
-
-.stream.show
- &:hover
- > li
- :background none
- :border none
-
-.submit_button
- input
- :float right
-
-#photo_container
- :text
- :align center
-
-#show_photo
- :z-index 11
- :position relative
- :display inline-block
- :max-width 100%
-
- img
- :max-width 100%
-
- #photo_spinner
- :z-index 1
- :position absolute
- :height 100px
- :width 100px
-
- #caption
- :min-height 20px
- :padding 0 10px
- :font
- :size 16px
- :color #333
-
-input:not([type='submit']):not([type='reset']):not([type='hidden']):not(.as-input),
-textarea
- @include border-radius(2px)
- :background-color #fff
- :color #000
- :margin-top 1px
- :font
- :family "Arial", "Helvetica", sans-serif
- :size 14px
-
- :padding 0.3em
-
- :display block
- :border 1px solid #ccc
- :height auto
-
-input[type='checkbox']
- :width auto !important
-
-form p
- :position relative
- :padding 0
- :margin 0
-
-form#update_profile_form p.checkbox_select
- label
- :top 0
-
-form p.checkbox_select
- label
- :left 25px
- :top 3px
- :position absolute
- :font-size 1em
- img
- :position relative
- :top 6px
-
-@mixin placeholder_styles
- :color $text-grey
- :text-shadow 0 1px 1px #eee
- :font-weight normal
-
-.placeholder
- @include placeholder_styles
-
-/* those can't be combined, see: http://stackoverflow.com/questions/2610497 */
-*::-webkit-input-placeholder
- @include placeholder_styles
-
-*::-moz-placeholder
- @include placeholder_styles
-
-.field_with_submit
- input[type='text']
- :width 82%
- :display inline
-
-.dim
- @include opacity(0.3)
-
-img.thumb_small
- :max-height 50px
- :max-width 50px
-img.thumb_medium
- :max-height 100px
- :max-width 100px
-img.thumb_large
- :max-height 300px
- :max-width 300px
-img.scaled_full
- :max-height 700px
- :max-width 700px
-
-#thumbnails
- a
- :display inline-block
- :height 140px
- :min-height 100px
- :margin
- :bottom 5px
- :right 2px
-
- img
- :height 140px
-
-ul#settings_nav
- :display inline
- :padding 0
- :font
- :size large
- :position absolute
- :left 198px
- :top 5px
-
- > li
- :display inline
- :margin
- :right 1em
- :font
- :weight 700
-
- a
- :padding 2px
- :font
- :weight normal
-
-.settings_pane
- :display none
-
-#account_data
- a
- :line-height 30px
-
-.contact_pictures.horizontal
- img
- :margin-right -5px
-
-#thumbnails
- :line-height 14px
-
-.dull
- :color #aaa
- :text-align center
- :font
- :style italic
-
- a
- :color #69AEDD
-
-h1,h2,h3,h4
- .description
- :font
- :size 70%
- :weight 100
- :color #aaa
- :margin
- :top 0.5em
-
-h2,h3,h4
- .description
- :font
- :size 80%
- :weight 200
-
-input[type="search"]
- :-webkit-appearance textfield
- :-moz-appearance textfield
-
-#photo_edit_options
- :display none
-
-#photodropzone
- :padding 0px
- :margin 0px
-
-#section_header
- :width 100%
- :border
- :bottom 2px solid #777
- :position relative
-
- :margin
- :bottom 2em
- :padding
- :bottom 0.4em
-
- h2
- :display inline
-
- .right
- :margin
- :top 10px
-
- h4
- :display inline
- :margin
- :left 1em
-
-.photo_options
- :color $text-grey
- :text
- :align center
-
-.inline
- :display inline
-
-.floating
- @include box-shadow(0,1px,3px,#333)
-
- :position relative
- :padding 12px
- :margin
- :bottom 2em
- :background
- :color rgb(255,255,255)
-
- :border
- :bottom 1px solid #ccc
- :top 1px solid #fff
-
- .submit_block
- :position absolute
- :bottom 13px
- :right 12px
-
- form
- :display relative
-
-#user_photo_uploader
- .avatar
- @include border-radius(5px)
-
- :height 100px
- :width 100px
-
-h3 span.current_gs_step
- :color #22C910
-
-ul#request_result
- :padding 0
- :margin 0
- li
- :margin
- :bottom 25px
- input.add
- :color green
- .stream_element
- .content
- :display inline
- :position relative
- :bottom 2.5em
- :padding 0
-
-#signup_field
- :margin
- :top -200px
- :height 46px
- :padding 0
- :width 400px
- :display inline
-
- div
- :display inline
-
- #mce-responses
- :margin
- :top 12px
- :font
- :size 12px
- :display block
- :color $text-grey
- :text-shadow 0 1px 0 #fff
-
- #mce-error-response
- :color red
-
- #mce-success-response
- :color green
-
- input[type='text']
- :top -1px
- :margin 0
- :right -3px
- :width 300px
-
-
- :border-radius 5px 0 0 5px
- :-webkit-border-radius 5px 0 0 5px
- :-moz-border-radius 5px 0 0 5px
-
- :position relative
- :display inline
- :padding 12px
- :font
- :size 18px
-
- #big_action_button, input[type='submit']
- @include linear-gradient(rgb(65,182,250),rgb(0,123,194))
-
- :height 47px
- :margin 0
- :background
- :color $blue
-
- :-webkit-border-radius 0 5px 5px 0
- :-moz-border-radius 0 5px 5px 0
- :border-radius 0 5px 5px 0
- :border 1px solid #CCC
-
- :padding 12px
- :font
- :size 18px
- :weight bold
- :color #eee
- :text-shadow 0 1px 0 #333
-
- :text
- :align center
-
- &:hover
- @include linear-gradient(rgb(0,136,209),rgb(113,204,255))
-
-#diaspora_description
- :background
- :image image-url('branding/ball.png')
- :repeat no-repeat
- :position top center
-
- :padding
- :top 250px
- :margin
- :top -200px
-
-
- :font
- :size 3.3em
- :weight bold
- :text-shadow 0 1px 3px #999
-
- p
- @include box-shadow(0,1px,3px,#ccc)
- :padding 12px
- :background
- :color #fff
-
-#login_field
- :text
- :align left
- :font
- :style italic
- :margin
- :top 14px
- :left 540px
- :color $text-grey
-
-
-ul#press_logos
- :margin 0
- :top 100px
- :padding 0
- > li
- :display inline
- :margin
- :right 30px
-
- img
- :height 40px
-
- &:last-child
- :margin
- :right 0
-
-#landing_content
- :margin
- :top 100px
- :text
- :align center
-
-#why
- :margin
- :bottom 48px
-
- h2
- :text-shadow 0 1px #fff
- :border
- :bottom 3px solid #eee
-
-#signup
- :margin
- :bottom 48px
-
-#already_invited_pane
- h4
- :color $text-dark-grey
- :color $text-dark-grey
-
-#search_title
- :font
- :weight 200
-
- .term
- :font
- :weight bold
-
-.aspects
- :position relative
- :margin
- :top 1em
-
- .right
- :right 12px
-
- .contact_list
- :height auto
- :max-height auto
- :width 500px
-
-.aspects .aspect_badge
- :font
- :size 1em
-
-.share_with
- :min-width 430px
-
- .avatar
- :width 50px
- :height 50px
- :float left
-
- h4,p
- :padding
- :left 64px
-
- p
- :color #eee
-
-#aspects_list
- :height auto
-
-.show_comments
- :border
- :top 1px solid $border-grey
- :margin
- :top 5px
-
-.show_comments,
-.likes_container
- a
- :color $text-grey
-
-.likes
- .icons-heart
- :height 12px
- :width 13px
- :display inline-block
- :vertical-align top
- :margin-top 3px
- :margin-right 5px
-
- .bd
- :display inline-block
-
- .expand_likes
- :vertical-align text-bottom
-
-.mark_all_read
- :position relative
- :top 10px
-
-#inner_account_delete
- :width 810px
-
-.icons-monotone_email_letter_round
- :height 128px
- :width 128px
-
-#email_invitation
- input
- :width 100%
- textarea
- :width 100%
-
-.share_with
- .add_aspect
- @include border-radius(5px)
-
- :margin
- :top 0.5em
- :background
- :color #ddd
- p
- :padding
- :left 1em
- input[type='text']
- :width 95%
-
- &.checkbox_select
- label
- :padding
- :left 15px
- :top 0
- :height 2em
- .right
- :z-index 5
- :top 34px
- :right 1em
-
- .done
- :padding 1em
- :bottom 2em
- .right
- :right 1em
-
-.invite_friends
- :padding 1em
- :background
- :color $background-grey
- :border 1px solid #ccc
-
-#remember_me
- input[type='checkbox']
- :display inline
- :height auto !important
- :top 2px !important
- label
- :font-size inherit !important
- :position static
-
-.public_icon, .service_icon
- :cursor pointer
-
-#contact_visibility_padlock:hover
- @include opacity(0.7)
-
-.side_stream
- .stream_element
- :padding 10px 0
- .avatar
- :float left
-
-.diaspora_handle
- :font
- :size 12px
- :weight normal
- :color #555
-
-.add_tags
- :font
- :weight normal
- :size 11px
-
-.hover_edit
- :display none
- :font
- :weight normal
- :size 11px
- :margin
- :left 5px
-
-.description:hover
- .hover_edit
- :display inline
-
-.date
- :background
- :color #e6e6e6
- :border-radius 8px
- :padding 5px
- :color $text-grey
-
- :text-align center
- .day
- :font-size 50px
- :font-weight 200
- :margin-bottom -15px
- :margin-top -10px
-
- .month
- :font-size 14px
-
-.subtle
- :color $text-grey
- :font
- :style italic
-
-.button.sign_up
- @include linear-gradient(#D9FFA9,#B9E68A)
- :text-shadow none
- :color #333
-
- &:hover
- @include linear-gradient(darken(#D9FFA9,10%),darken(#B9E68A,10%))
-
- &:active
- @include linear-gradient(darken(#D9FFA9,20%),darken(#B9E68A,20%))
-
-#client-application-image
- :max-width 100%
-
-#service_stream
- :margin 0
- :padding 0
-
-#authorize
- :text-align center
-
-#application-description
- :display inline-block
- :width 300px
- :padding-bottom 20px
-
-ul#requested-scopes
- :vertical-align middle
- li
- :display inline-block
- :padding 5px
-
- img
- :height 30px
- :width 30px
-
- .scope-description
- :display none
-
-.item_count
- :min-width 16px
- :line-height 16px
- :text-align center
- :float right
- @include border-radius(4px)
- :margin-top 1px
- :color $text-grey
- :background
- :color $background-grey
- :display inline-block
- :font
- :size 11px
- :weight 700
-
-ul.left_nav
- :margin 0
- :bottom 15px
- :padding 0
-
- &.sub
- :padding-left 6px
-
- a.community_aspect_selector
- :width 152px
- :vertical-align middle
- :display inline-block
- :line-height 25px
- :text
- :decoration none
- a
- :font-weight bold
- :color $link-grey
- :text
- :decoration none
-
- li
- :position relative
- :width 100%
-
- li.active
- > a.home_selector:not(.sub_selected)
- :font
- :weight 700
-
- > a:not(.sub_selected)
- :color #333
- .item_count
- :color $text-dark-grey
-
- a.aspect_selector,
- a.home_selector,
- a.tag_selector,
- a.element_selector
- &:active
- :cursor -webkit-grabbing
- :cursor -moz-grabbing
- :cursor grabbing
-
- a.home_selector,
- a.tag_selector,
- a.element_selector,
- .root_element
- :display block
- :width 100%
- :padding 3px 7px
-
- a.home_selector,
- li.aspect_element,
- a.element_selector
- &:hover
- @include border-radius(2px)
- :background
- :color lighten($blue,45%)
- :text
- :decoration none
-
- .unfollow_icon
- :margin-right 10px
- :margin-top 4px
- @include transition(opacity)
- @include opacity(0.3)
- :position absolute
- :display none
- :padding 0 5px
- &:hover
- @include opacity(1)
-
- .edit
- :margin-right 10px
- :margin-top 4px
- :width 12px
- :height 12px
- :margin-top 6px
- @include transition(opacity)
- @include opacity(0.3)
- :float right
- :display none
- &:hover
- @include opacity(1)
-
- ul.sub_nav
- :padding
- :left 25px
- :margin 0
- li
- :width 204px
-
-.section
- .left_nav
- a.aspect_selector,
- a.home_selector
- :width 150px
- ul.sub_nav
- :width 140px
- &:hover
- :width auto
-
- a.aspect_selector
- :width 112px
- :vertical-align middle
- :display inline-block
- :line-height 25px
- :text
- :decoration none
-
- a.tag_selector
- :width 117px
- :overflow hidden
- :position relative
- :display inline-block
- &:after
- :display inline-block
- :content ""
- :width 80px
- :height 25px
- :position absolute
- :top 0px
- :left 100px
- &:hover:after
- :background none
-
- li
- :height 25px
- .icons-check_yes_ok
- :height 18px
- :width 18px
- :display inline-block
- :margin-left 3px
- :vertical-align middle
-
- .icons-deletelabel
- :height 14px
- :width 14px
- :margin-top 4px
-
- li.unfollow,
- li.sub_nav_item
- :width 172px
-
- li.unfollow:hover,
- li.sub_nav_item:hover,
- li.hover
- @include border-radius(2px)
- :background
- :color lighten($blue,45%)
- .edit,
- .unfollow_icon
- :z-index 1
- :display inline-block
- .icons-monotone_close_exit_delete
- :height 16px
- :width 16px
-
- .user_card
- :margin-left 8px
-
-.unread-setter
- :display none
-
-.stream_container
- :min-height 500px
-
- h3
- :margin
- :bottom 0
- :border
- :left 1px solid $border-grey
- :padding
- :left 10px
- :top 20px
- :margin
- :left -10px
- :top -20px
-
-#aspect_stream_header
- :padding 0 12px
-
-.new_aspect,
-a.toggle_selector
- :outline none
- :color $text-grey
- :font
- :style italic
-
- &:hover
- :color $link-grey
-
-#community_spotlight
- .avatar
- :height 140px
- :width 140px
-
-.user_card
- @include border-radius(3px)
- @include box-shadow(0,1px,5px,#ccc)
- :padding 10px
- :bottom 30px
- :margin
- :bottom 15px
- :right 10px
-
- :position relative
-
- :min-height 220px
-
- :vertical-align top
-
- :border 1px solid #ccc
- :display inline-block
-
- :width 140px
-
- .tags
- :color $text-grey
-
- h4
- :margin
- :bottom 0
- :padding
- :bottom 2px
-
- .dropdown
- :width 100%
-
-.add_user_to_aspect
- :bottom 12px
- :right 5px
- :position absolute
-
-#right_service_icons
- :text-align center
- :padding 10px
- :bottom 0
-
- .social_media_logos-facebook-24x24,
- .social_media_logos-twitter-24x24,
- .social_media_logos-tumblr-24x24,
- .social_media_logos-wordpress-24x24,
- .social_media_logos-email-24x24,
- .social_media_logos-feed-24x24,
- .social_media_logos-website-24x24
- :height 24px
- :width 24px
-
- a
- :display inline-block
-
-.action_item
- :padding-right 5px
-
-.accept_invitation_form,
-.sign_up_form
- :min-height 350px
- :font-size 16px
- input[type='text'],
- input[type='password'],
- input[type='email']
- :font-size 16px !important
- :width 378px !important
-
- .diaspora_id_text
- :font-size 12px
- :text-align right
- :color $text-grey
- :margin
- :top -8px
- :padding 0
-
- .submit_field
- :text-align right
-
-.accept_invitation_text
- :font
- :weight lighter
-
-.red
- :color $red
-
-.green
- :color green
-.resend
- :color black
- &:hover
- :text-decoration none
- :color black
- &:hover
- :text-decoration none
-
-#grey_header
- @include box-shadow(0,1px,1px,#eee)
- :background
- :color #fafafa
- :width 100%
- :position absolute
- :left 0
- :top 0
- :padding
- :top 80px
- :bottom 20px
- :text
- :align center
- :border
- :bottom 1px solid $border-grey
-
-.mobile_row
- :margin
- :bottom 50px
-
-.field_with_errors
- :position relative
-
- input
- @include box-shadow(0,0,8px,lighten(#D00,30%))
- :border 1px solid #D00 !important
-
-.field_with_errors .message
- :color #D00
- :font-size 12px
- :position absolute
- :top 4px
- :right 10px
- :left auto
-
-.new_user_form fieldset, .accept_invitation_form fieldset
- @include border-radius(3px)
-
- :background
- :color #fff
- :color rgba(255,255,255,0.95)
-
- .submit_field
- :margin
- :top 15px
- span.host_uri
- :float right
- :margin-top -28px
- :color $text-grey
- :padding-right 9px
-
-.center
- :text-align center
-
-.nostrap,
-.nostrap:focus
- :-webkit-box-shadow none
- :-moz-box-shadow none
- :box-shadow none
-
-#hello-there
- p
- :font-size medium
- h1
- :margin 0px
- h2
- :margin
- :top 80px
- :bottom 12px
- h3
- :font
- :size large
- :weight 200
- :margin 0px
- form, p
- :margin-left 30px
- input
- :margin-bottom 15px
- .hero-unit
- :margin 20px 42px
- :padding 40px 80px
- .awesome
- :text-align center
- :margin-top 60px
- .creation
- :font-size 16px
-
-#profile_photo_upload
- #fileInfo
- :margin-top 12px
- :text-align left
-
-#welcome-to-diaspora
- :-webkit-box-shadow inset 0 -2px 10px rgba(0,0,0,0.35)
- :-moz-box-shadow inset 0 -2px 10px rgba(0,0,0,0.35)
-
- :position absolute
- :width 100%
- :left 0
- :top 0
- :padding
- :top 50px
- :bottom 10px
- h1,h3
- :color #fff
- :text-overflow ellipsis
- :white-space nowrap
- :background orange
- &:hover
- #gs-skip-x
- @include opacity(0.4)
- @include transition(opacity, 0.25s)
-
- &:hover
- @include opacity(1)
-
-#gs-shim
- :position absolute
- :top 380px
-
-#gs-skip-x
- @include opacity(0)
- @include transition(opacity, 0.25s)
-
- img
- :position relative
- :right 4px
- :height 20px
-
-
-.avatar.micro
- :height 20px
- :width 20px
-
-#gs-name-form-spinner
- :position absolute
- :top 24px
- :right -33px
-
-.left_nav
- #new_tag_following
- :width 137px
- :margin
- :left 24px
-
- input[type='text']
- :width 137px
- :font
- :size 13px
-
- #tag_following_submit
- &.hidden
- :display none
-
-.nsfw-shield
- @include border-radius(3px)
- :background-color $background-grey
- :width 90%
- :padding 5px 10px
- :border 1px solid $border-grey
- :color $text-grey
-
-#back-to-top
- :display block
- :color white
- :position fixed
- :z-index 49
- :right 20px
- :bottom 20px
- :opacity 0
- :font-size 3em
- :padding 0 11px 0 12px
- :border-radius 10px
- :background-color #aaa
- &:hover
- :opacity 0.85 !important
- &.visible
- :opacity 0.5
-
-.float-right
- :float right
- :margin-top 5px
-
-.nsfw_off
- :font-size smaller
- :color $text-grey
- a
- :color $text-dark-grey
-
-#fileInfo
- :font-size small
- :text-align right
- :margin 5px 2px
-
-.post_preview_button
- :padding 3px 9px 4px
-
-.post_preview
- :padding
- :top 5px
- :border
- :bottom 3px solid #3f8fba !important
- :background
- :color #e8f7ff
-
-#location
- :border 1px solid $border-dark-grey
- :height 20px
- #location_address
- :border none
- :color #aaa
- :height 10px
- :width 430px
- :float left
- a#hide_location
- :position absolute
- :right 22px
- :filter alpha(opacity=30)
- :-moz-opacity 0.3
- :-khtml-opacity 0.3
- :opacity 0.3
- :z-index 5
- a#hide_location:hover
- @include opacity(0)
- :-khtml-opacity 1
- :opacity 1
- :cursor pointer
diff --git a/app/assets/stylesheets/new-templates.css.scss b/app/assets/stylesheets/application.scss
index 0dd65fabd..4d3bd3df3 100644
--- a/app/assets/stylesheets/new-templates.css.scss
+++ b/app/assets/stylesheets/application.scss
@@ -1,15 +1,27 @@
+@import 'bootstrap-fix';
+
+@import 'perfect-scrollbar';
+
@import "colors";
+@import 'sizes';
@import 'mixins';
-@import 'new_styles/new_mixins';
-@import 'new_styles/variables';
/* core */
+@import 'media-box';
+@import 'autocomplete';
+@import 'entypo-fonts';
+@import 'entypo';
+@import 'mentions';
@import 'flash_messages';
@import 'sprites';
-
+@import 'hovercard';
@import 'new_styles/base';
-@import 'new_styles/viewer_nav';
-@import 'buttons';
+@import 'new_styles/buttons';
+@import 'new_styles/interactions';
+@import 'new_styles/spinner';
+@import 'lightbox';
+@import 'vendor/fileuploader';
+@import 'vendor/autoSuggest';
/* font overrides */
@import 'new_styles/typography';
@@ -17,10 +29,11 @@
/* login */
@import 'new_styles/login';
@import 'new_styles/registration';
-@import 'new_styles/landing';
-
@import 'new_styles/forms';
+/* navs */
+@import 'new_styles/navs';
+
/* profile and settings pages */
@import 'new_styles/settings';
@@ -34,6 +47,7 @@
/* conversations */
@import 'conversations';
+@import 'vendor/facebox';
@import 'facebox';
/* publisher */
@@ -55,11 +69,29 @@
/* people */
@import 'people';
@import 'invitations';
+@import 'profile';
/* stream */
@import 'tag';
@import 'stream-faces';
+@import 'stream';
+@import 'stream_element';
+@import 'comments';
+@import 'diaspora_jsxc';
+@import 'chat';
+@import 'markdown-content';
+@import 'oembed';
+@import 'post-content';
+
+/* right bar */
+@import 'sidebar';
/* contacts */
@import 'contacts';
@import 'leftnavbar';
+
+/* code */
+@import 'new_styles/code';
+
+/* statistics */
+@import 'new_styles/statistics';
diff --git a/app/assets/stylesheets/aspects.css.scss b/app/assets/stylesheets/aspects.css.scss
deleted file mode 100644
index 8b2730d08..000000000
--- a/app/assets/stylesheets/aspects.css.scss
+++ /dev/null
@@ -1,267 +0,0 @@
-.aspect_dropdown {
-
- li {
- .status_indicator {
- width: 19px;
- height: 14px;
- display: inline-block;
- }
- .icon-ok, .icon-refresh {
- padding-right: 5px;
- display: none;
- }
- &.selected {
- .icon-ok { display: inline-block;}
- .icon-refresh { display: none;}
- }
- &.loading {
- .icon-refresh { display: inline-block;}
- .icon-ok { display: none;}
- }
- a {
- .text {
- color: #333333;
- }
- &:hover {
- background: $background-grey;
- }
- cursor: pointer;
- padding-left: 10px;
- }
- }
-}
-
-.modify_aspect {
- background: url("icons/pencil.png") no-repeat;
- width: 12px;
- height: 12px;
- display: inline-block;
-}
-
-
-
-/* -- Used in contacts/index.html.haml -- */
-#aspect_controls {
- @include border-radius(2px);
- background-color: #fafafa;
- border: 1px solid #ccc;
- padding: 10px;
- min-height: 23px;
-
- .button, .button_to {
- margin-right: 5px;
- }
-
- .button_to { display: inline-block; }
-
- .contact_visibility_padlock,
- .modify_aspect,
- .icons-mail,
- .icons-monotone_close_exit_delete {
- margin-left: 4px;
- margin-bottom: -2px;
- display: inline-block;
- }
-
- .icons-mail {
- width: 16px;
- height: 13px;
- margin-bottom: -1px;
- }
-}
-
-#aspect_nav {
- list-style-type: none;
-
- .icons-check_yes_ok {
- height:18px;
- width:18px;
- background: url('icons/check_yes_ok.png') no-repeat;
- float: left;
- visibility: hidden;
-
- &.selected {
- visibility: visible;
- }
-
- &.selected + a {
- color: #333333;
- }
- }
-}
-
-.contact_visibility_padlock {
- height: 16px;
- width: 16px;
- /* -- To remove when the facebox will be deleted -- */
- display: inline-block;
- margin-left: 4px;
- margin-bottom: -2px;
-}
-
-/* -- Used in aspects/edit.haml and in contacts/sharing.haml -- */
-#aspect_edit_controls { margin-top: 8px; }
-#aspect_edit_pane {
- width: 772px;
-
- .contact_list_controls {
- height: 30px;
- margin-bottom: 5px;
- }
-
- #aspect_name_title {
- margin: 0px 0px 5px 0px;
- }
-
- #contact_list_search {
- width: 200px;
- margin-bottom: 2px;
- margin-top: 0px;
- float: right;
- }
-
- .contact_list,
- .aspect_list {
- @include border-radius(3px);
- height: 300px;
- max-height: 300px;
- overflow-y: auto;
- overflow-x: hidden;
- border: 1px solid #bbb;
- background-color: rgb(252,252,252);
-
- .avatar {
- float: left;
- height: 50px;
- width: 50px;
- margin-right: 10px !important;
- }
-
- .button.share {
- padding-right: 20px;
- .right {
- right: 8px;
- top: 3px;
- }
- }
-
- .icons-monotone_plus_add_round,
- .icons-monotone_check_yes {
- height: 20px;
- width: 20px;
- }
-
- & > .contacts {
- margin: 0px;
- padding: 5px;
- padding-right: 0px;
-
- & > .contact {
- @include border-radius(3px);
- @include box-shadow(0, 1px, 5px, #ccc);
- position: relative;
- display: inline-block;
- float: left;
- height: 50px;
- width: 170px;
- overflow-x: hidden;
- overflow-y: hidden;
- margin-bottom: 5px;
- margin-right: 5px;
- padding: 5px;
- background-color: #fff;
- border: 1px solid $border-dark-grey;
-
- &.hidden { display: none; }
- &.remote_friend { width: 285px; }
-
- & > .name {
- font-size: 16px;
- margin: 0px 0px 5px 0px;
- white-space: nowrap;
- }
-
- a.btn {
- @include box-shadow(0,0,0);
- border-bottom: none;
- min-width: 90px;
- float: right;
- padding: 2px 0px;
- margin-top: 5px;
- margin-right: -5px;
-
- &.added {
- @include linear-gradient(rgb(158,255,153), rgb(92,199,86));
- background-color: rgb(92,199,86);
- }
-
- &.added.remove {
- @include linear-gradient(rgb(255,153,153), rgb(199,86,86));
-
- &:active { @include linear-gradient(rgb(199,119,119), rgb(130,55,55)); }
- }
- }
- }
- }
- }
-
- .aspect_list {
- height: 300px;
- max-height: 300px;
-
- .name { left: 1em; }
-
- ul > li {
- padding: 1em;
- height: 1em;
-
- .right {
- top: 2px;
- right: 1em;
- }
- }
- }
-
- .person_tiles .tile {
- @include border-radius(2px);
- padding: 6px;
- padding-left: 65px;
- margin: 3px;
- margin-left: 0px;
- display: inline-block;
- width: 126px;
- height: 50px;
- border: 1px solid #eee;
- position: relative;
-
- img {
- position: absolute;
- left: 6px;
- }
- }
-
- &.larger { width: 650px; }
-
- .bottom_submit_section {
- margin-top: 12px;
-
- form {
- display: inline-block;
- margin: 0px;
- }
-
- .creation {
- float: right;
- }
- }
-}
-
-#new_aspect {
- #aspect_contacts_visible.checkbox {
- margin: 0px;
- }
-
- label[for="aspect_contacts_visible"] {
- display: inline;
- }
-}
diff --git a/app/assets/stylesheets/aspects.scss b/app/assets/stylesheets/aspects.scss
new file mode 100644
index 000000000..1aac43f70
--- /dev/null
+++ b/app/assets/stylesheets/aspects.scss
@@ -0,0 +1,47 @@
+.aspect_dropdown {
+
+ li {
+ .status_indicator {
+ width: 19px;
+ height: 14px;
+ display: inline-block;
+ }
+ .icon-ok, .icon-refresh {
+ padding-right: 5px;
+ display: none;
+ }
+ &.selected {
+ .icon-ok { display: inline-block;}
+ .icon-refresh { display: none;}
+ }
+ &.loading {
+ .icon-refresh { display: inline-block;}
+ .icon-ok { display: none;}
+ }
+ a {
+ .text {
+ color: #333333;
+ }
+ &:hover {
+ background: $background-grey;
+ }
+ cursor: pointer;
+ padding-left: 10px;
+ }
+ }
+}
+
+#new_aspect {
+ .checkbox {
+ margin: 0px;
+ }
+
+ label[for="aspect_contacts_visible"],
+ label[for="aspect_chat_enabled"] {
+ display: inline;
+ }
+
+ .bottom_submit_section {
+ padding-top: 20px;
+ }
+}
diff --git a/app/assets/stylesheets/autocomplete.css.scss b/app/assets/stylesheets/autocomplete.scss
index bed1a77b4..c23205248 100644
--- a/app/assets/stylesheets/autocomplete.css.scss
+++ b/app/assets/stylesheets/autocomplete.scss
@@ -3,15 +3,10 @@
background-color: transparent;
overflow: hidden;
z-index: 99999;
- min-width: 247px !important;
+ min-width: 300px !important;
width: 100%;
- -webkit-border-radius: 3px;
- -moz-border-radius: 3px;
border-radius: 3px;
-
- -webkit-box-shadow: 0 1px 3px #999;
- -moz-box-shadow: 0 1px 3px #999;
box-shadow: 0 1px 3px #999;
}
@@ -42,6 +37,8 @@
// in relative units scroll will be broken in firefox
//:line-height 16px
overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
}
.ac_loading {
@@ -71,4 +68,20 @@
left: 5px;
top: 5px;
}
+
+ .search_handle {
+ font-size: 0.8em;
+ color: #999;
+ margin-top: -3px;
+ }
+
+ .ac_over .search_handle{
+ color: #fff;
+ }
+
+ .ac_over .search_handle, .search_handle {
+ display: block;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ }
}
diff --git a/app/assets/stylesheets/blueprint.css b/app/assets/stylesheets/blueprint.css
deleted file mode 100644
index 3f09fb9c3..000000000
--- a/app/assets/stylesheets/blueprint.css
+++ /dev/null
@@ -1,3 +0,0 @@
-/*
-//= require vendor/blueprint/screen
-*/ \ No newline at end of file
diff --git a/app/assets/stylesheets/bookmarklet.css.scss b/app/assets/stylesheets/bookmarklet.css.scss
deleted file mode 100644
index 773eabfd1..000000000
--- a/app/assets/stylesheets/bookmarklet.css.scss
+++ /dev/null
@@ -1 +0,0 @@
-#bookmarklet { padding:10px 10px 30px 10px; margin-top: 0; }
diff --git a/app/assets/stylesheets/bookmarklet.scss b/app/assets/stylesheets/bookmarklet.scss
new file mode 100644
index 000000000..42c2dadbd
--- /dev/null
+++ b/app/assets/stylesheets/bookmarklet.scss
@@ -0,0 +1,2 @@
+#bookmarklet { padding:10px 10px 30px 10px; margin-top: 0; }
+body.page-status_messages.action-bookmarklet { margin-top: 0px } \ No newline at end of file
diff --git a/app/assets/stylesheets/bootstrap-complete.css.scss b/app/assets/stylesheets/bootstrap-complete.scss
index 7e36e3854..7e36e3854 100644
--- a/app/assets/stylesheets/bootstrap-complete.css.scss
+++ b/app/assets/stylesheets/bootstrap-complete.scss
diff --git a/app/assets/stylesheets/bootstrap-fix.scss b/app/assets/stylesheets/bootstrap-fix.scss
new file mode 100644
index 000000000..47b6c0c4d
--- /dev/null
+++ b/app/assets/stylesheets/bootstrap-fix.scss
@@ -0,0 +1,24 @@
+// A temporary fix for broken classes in bootstrap 2.
+// Can probably be removed when migration of bootstrap 3 is done.
+
+input::placeholder,
+textarea::placeholder {
+ color: #999999;
+}
+input::input-placeholder,
+textarea::input-placeholder {
+ color: #999999;
+}
+
+
+// A temporary fix for mention modal #5329
+
+#new_status_message_pane .modal {
+ position: absolute;
+ max-height: none;
+}
+
+#new_status_message_pane .modal-body{
+ overflow-y: visible;
+ max-height: none;
+}
diff --git a/app/assets/stylesheets/bootstrap-headerfix.sass b/app/assets/stylesheets/bootstrap-headerfix.sass
deleted file mode 100644
index d89c51a99..000000000
--- a/app/assets/stylesheets/bootstrap-headerfix.sass
+++ /dev/null
@@ -1,40 +0,0 @@
-// A temporary fix for displaying the header in the single post view.
-// Should be removed once everything uses Bootstrap.
-
-header
- .container
- width: 950px
- .header-nav
- span
- a
- font-weight: bold
- font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif
- font-size: 13px
- li
- font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif
- font-size: 13px
-
- #conversations_badge, #notification_badge
- background: none
-
-
- #notification_badge.active
- @include border-radius(0)
-
- #global_search
- form
- input
- height: 15px
- color: black
-
- #notification_dropdown
- h4
- margin: 0
- .right
- a
- font-weight: bold
- .notification_element
- font-size: 13px
- .timeago
- border: medium none
- cursor: text
diff --git a/app/assets/stylesheets/bootstrap-headerfix.scss b/app/assets/stylesheets/bootstrap-headerfix.scss
new file mode 100644
index 000000000..53f4919dc
--- /dev/null
+++ b/app/assets/stylesheets/bootstrap-headerfix.scss
@@ -0,0 +1,52 @@
+// A temporary fix for displaying the header in the single post view.
+// Should be removed once everything uses Bootstrap.
+
+header {
+ .container {
+ width: 950px;
+ .header-nav {
+ span {
+ a {
+ font-weight: bold;
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+ font-size: 13px;
+ }
+ }
+ }
+ li {
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+ font-size: 13px;
+ }
+ }
+ #conversations_badge, #notification_badge {
+ background: none;
+ }
+ #notification_badge.active {
+ border-radius: 0;
+ }
+ #global_search {
+ form {
+ input {
+ height: 15px;
+ color: black;
+ }
+ }
+ }
+ #notification_dropdown {
+ h4 {
+ margin: 0;
+ }
+ .right {
+ a {
+ font-weight: bold;
+ }
+ }
+ .notification_element {
+ font-size: 13px;
+ .timeago {
+ border: medium none;
+ cursor: text;
+ }
+ }
+ }
+}
diff --git a/app/assets/stylesheets/chat.scss b/app/assets/stylesheets/chat.scss
new file mode 100644
index 000000000..3be259038
--- /dev/null
+++ b/app/assets/stylesheets/chat.scss
@@ -0,0 +1,7 @@
+body > .container-fluid.chat-roster-shown {
+ padding-right: 224px;
+ #back-to-top { right: 244px; }
+}
+body > .container-fluid.chat-roster-hidden {
+ #back-to-top { right: 54px; }
+}
diff --git a/app/assets/stylesheets/colors.css.scss b/app/assets/stylesheets/colors.scss
index 94b8c4b40..fdd29ec3b 100644
--- a/app/assets/stylesheets/colors.css.scss
+++ b/app/assets/stylesheets/colors.scss
@@ -10,15 +10,18 @@ $light-grey: #DDDDDD;
$border-grey: #DDDDDD;
$border-dark-grey: #999999;
+$link-blue : rgb(42,156,235);
$link-grey: #777777;
$link-disabled-grey: #999999;
$text-grey: #999999;
$text-dark-grey: #666666;
+$text: #333333;
$white: white;
$black: black;
$green: #8EDE3D;
+$light-green: lighten($green,20%);
$red: #A80000;
$blue: #3F8FBA;
$dark-blue: darken(#0984C8,10%);
diff --git a/app/assets/stylesheets/comments.scss b/app/assets/stylesheets/comments.scss
new file mode 100644
index 000000000..d21f77fde
--- /dev/null
+++ b/app/assets/stylesheets/comments.scss
@@ -0,0 +1,48 @@
+.comment_stream {
+ .show_comments {
+ margin-top: 5px;
+ border-top: 1px solid $border-grey;
+ a {
+ color: $text-grey;
+ font-size: 13px;
+ }
+ .media { margin-top: 10px; }
+ }
+ .comments > .comment, .comment.new_comment_form_wrapper {
+ .avatar {
+ margin-top: 5px;
+ height: 30px;
+ width: 30px;
+ }
+ margin: 0;
+ border-top: 1px dotted $border-grey;
+ padding: 10px 0;
+
+ .info {
+ margin-top: 5px;
+ font-size: 11px;
+ line-height: 11px;
+ }
+
+ >.highlighted {
+ border-left: 3px solid $blue;
+ padding-left: 3px;
+ }
+ }
+ .submit_button {
+ input {
+ float: right;
+ }
+ padding-left: 12px;
+ width: 95%;
+ display: none;
+ }
+ .comment_box {
+ width: 95%;
+ height: 30px;
+ }
+ textarea.comment_box:focus, textarea.comment_box:valid, textarea.comment_box:active {
+ border-color: $border-dark-grey;
+ & + .submit_button { display: block; }
+ }
+}
diff --git a/app/assets/stylesheets/contacts.css.scss b/app/assets/stylesheets/contacts.css.scss
deleted file mode 100644
index d2f786321..000000000
--- a/app/assets/stylesheets/contacts.css.scss
+++ /dev/null
@@ -1,126 +0,0 @@
-#section_header {
- h3 {
- border-bottom: 1px solid $border-grey;
- }
-}
-
-#people_stream {
- .bd {
- font-size: 13px;
- line-height: 19.5px;
- }
-
- .btn-group {
- margin-top: 5px;
-
- .caret {
- margin-top: 8px;
- }
-
- .text {
- text-shadow: none;
- }
- }
-
- .info {
- font-size: 11px;
- line-height: 16.5px;
- }
-
- .stream_element {
- border-bottom: 1px solid $border-grey;
-
- .icons-monotone_close_exit_delete {
- margin-top: 8px;
- }
-
- .media {
- margin: 10px;
- }
- }
-}
-#people_stream.contacts {
- .stream_element {
- padding: 10px;
- min-height: 30px;
-
- .media { overflow: visible; }
-
- .float-right {
- top: 16px;
-
- a {
- @include opacity(1);
-
- &:hover {
- @include opacity(0.6);
- }
- }
- }
-
- .info { margin-top: -2px; }
- }
-
- .avatar {
- height: 30px;
- width: 30px;
- }
-
- .icons-monotone_close_exit_delete {
- height: 14px;
- width: 14px;
- }
-
- .no_contacts {
- text-align: center;
- margin-top: 50px;
- }
-}
-
-#community_spotlight {
- .avatar {
- width: 140px;
- height: 140px;
- }
-
- .user_card {
- @include border-radius(3px);
- @include box-shadow(0,1px,5px,#ccc);
-
- border: 1px solid #ccc;
- display: inline-block;
- margin-bottom: 15px;
- margin-right: 10px;
- min-height: 220px;
- padding: 10px 10px 30px 10px;
- position: relative;
- vertical-align: top;
- width: 140px;
-
- h4 {
- margin-bottom: 0px;
- padding-bottom: 2px;
- }
-
- .add_user_to_aspect {
- bottom: 10px;
- right: 10px;
- position: absolute;
- }
-
- .dropdown {
- width: 100%;
- }
-
- .tags {
- color: $text-grey;
- }
- }
-}
-
-#no_contacts {
- text-align: center;
- padding: 10px;
- background-color: #eee;
- color: $text-dark-grey;
-}
diff --git a/app/assets/stylesheets/contacts.scss b/app/assets/stylesheets/contacts.scss
new file mode 100644
index 000000000..d43bd6eb7
--- /dev/null
+++ b/app/assets/stylesheets/contacts.scss
@@ -0,0 +1,72 @@
+#contacts_container {
+ #people_stream.contacts {
+ .header {
+ border-bottom: 1px solid $border-grey;
+ margin-top: 10px;
+ min-height: 53px;
+ #change_aspect_name { cursor: pointer; }
+ #aspect_name_form {
+ display: none;
+ form { margin: 0px; }
+ input {
+ margin-bottom: 0px;
+ margin-top: 10px;
+ }
+ .btn { margin-top: 10px; }
+ }
+ #contact_list_search {
+ margin: 6px 30px 0 0;
+ width: 150px;
+ &:focus { width: 250px; }
+ }
+ #aspect_controls > .contacts_button {
+ cursor: pointer;
+ text-decoration: none;
+ margin-right: 25px;
+ }
+ #chat_privilege_toggle > .enabled {
+ color: #000;
+ }
+ .entypo.contacts-header-icon {
+ font-size: 24.5px;
+ line-height: 40px;
+ color: lighten($black,75%);
+ &:hover { color: $black; }
+ }
+ #suggest_member.btn { margin-top: 8px; }
+ }
+
+ .stream_element {
+ .contact_remove-from-aspect, .contact_add-to-aspect {
+ text-decoration: none;
+ cursor: pointer;
+ font-size: 20px;
+ line-height: 50px;
+ margin: 10px;
+ color: lighten($black,75%);
+ &:hover { color: $black; }
+ }
+ &.in_aspect {
+ border-left: 3px solid $green;
+ background-color: lighten($green,35%);
+ }
+ &:not(.in_aspect) { border-left: 3px solid $white; }
+ }
+
+ .no_contacts {
+ text-align: center;
+ margin-top: 50px;
+ }
+ .well { margin: 20px 0 10px; }
+ }
+}
+
+#aspect_nav {
+ li.aspect > a { padding-left: 30px; }
+ li.new_aspect > a { padding-left: 30px; }
+}
+
+#no_contacts {
+ margin-top: 20px;
+ text-align: center;
+}
diff --git a/app/assets/stylesheets/conversations.css.scss b/app/assets/stylesheets/conversations.css.scss
deleted file mode 100644
index 10e183f87..000000000
--- a/app/assets/stylesheets/conversations.css.scss
+++ /dev/null
@@ -1,255 +0,0 @@
-.conversations_container {
- .stream_element {
- border-bottom: 1px solid $border-grey;
- &:first-child {
- border-top: none;
- }
- .last_author {
- font-size: 12px;
- color: $text-dark-grey;
- }
- a.author{
- font-weight: bold;
- unicode-bidi: bidi-override;
- }
-
- .avatar{
- width: 50px;
- height: 50px;
- }
- }
- .stream .stream_element {
- p {
- margin: 0 0 1em 0;
- word-wrap: break-word;
- &:last-child { margin-bottom: 0; }
- }
-
- .new_message { border-bottom: none; }
- .timestamp { font-size: 11px; }
- }
-}
-
-#conversation_show {
- .conversation_participants {
- box-shadow: 0 2px 3px -3px #666;
- -webkit-box-shadow: 0 2px 3px -3px #666;
- -moz-box-shadow: 0 2px 3px -3px #666;
-
- background-color: $background-white;
- margin-bottom: 5px;
- border-bottom: 1px solid $border-grey;
- padding: 5px;
- line-height: 0px;
-
- a.close_conversation {
- display: block;
- margin-top: 10px;
- float: right;
-
- .icons-deletelabel {
- height: 14px;
- width: 14px;
- }
- }
-
- .avatar {
- height: 30px;
- width: 30px;
- }
-
- .avatars {
- text-align: right;
- margin-top: 9px;
- }
-
- a img { margin-bottom: 4px; }
-
- .conversation_controls {
- margin-bottom: 10px;
-
- a { margin-right: 10px; }
- }
- }
-
- .conversation_participants a:hover { text-decoration: none; }
-
- .stream .stream_element {
- padding: 10px;
- }
-}
-
-.stream_element.conversation {
- padding: 8px;
- .media {
- margin-bottom: 0px;
- margin-left: 0px;
- }
-
- &:hover:not(.selected) {
- background-color: lighten($blue,5%);
- .subject,
- .last_author,
- .last_message {
- color: $white;
- }
- .timeago { color: $background-grey; }
- }
- &.selected:hover { background-color: lighten($blue,5%); }
- &:hover { cursor: pointer; }
-
- .avatar {
- width: 50px;
- height: 50px;
- float: left;
- }
-
- .last_author, .last_message {
- font-size: 12px;
- line-height: 15px;
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
- }
-
- .message_count, .unread_message_count {
- margin-left: 3px;
- float: right;
- font-size: 12px;
- font-weight: normal;
- }
-
- .participants_count {
- @include opacity(0.5);
- &:before { content: '+'; }
- float: left;
- background-color: #fff;
- margin-top: 35px;
- margin-left: -50px;
- text-align: center;
- width: 50px;
- height: 15px;
- line-height: 15px;
- font-size: 13px;
- font-weight: bold;
- }
-
- .participants {
- display: none;
- float: left;
- clear: both;
- margin-top: 5px;
- padding-top: 5px;
- height: 25px;
- width: 100%;
- overflow: hidden;
- border-top: 1px dotted $border-grey;
- .avatar {
- margin: 0 5px 0 0;
- height: 25px;
- width: 25px;
- }
- }
-
- .img { line-height: 15px; }
-
- .subject {
- font-size: 14px;
- > * {
- overflow: hidden;
- white-space: nowrap;
- text-overflow: ellipsis;
- }
- }
-
- .timeago {
- float: right;
- line-height: normal;
- font-weight: normal;
- color: $blue;
- }
-}
-
-.conversation.unread {
- background-color: darken($background-white, 5%);
-}
-
-.conversation.selected {
- background-color: $blue;
-
- .subject,
- .last_author,
- .last_message {
- color: $white;
- }
- .timeago { color: $background-grey; }
-}
-
-#left_pane {
- border-right: solid 1px $border-grey;
- h3 {
- padding-bottom: 0;
- }
-
- #left_pane_header {
- padding: 10px;
- padding-right: 20px;
- border-bottom: 1px solid $border-grey;
- }
-
- #conversation_inbox {
- a:hover {
- text-decoration: none;
- }
- }
-}
-
-#no_conversations,
-#no_conversation_text {
- font-weight: bold;
- color: #ccc;
- text-align: center;
- margin-top: 100px;
-}
-
-#no_conversation_text {
- font-size: 20px;
-}
-
-#no_conversation_controls {
- text-align: center;
- font-size: 12px;
-}
-
-#new_conversation_pane {
- ul.as-selections { width: 100% !important; }
- input#contact_ids { box-shadow: none; }
- textarea { width: 98%; }
-
- .bottom_submit_section {
- text-align: right;
- }
-
- .button.creation {
- $button-border-color: #aaa;
- @include border-radius(3px);
- @include box-shadow(0,1px,1px,#cfcfcf);
- @include transition(border);
- @include button-gradient($creation-blue);
- font-size: 12px;
- color: #fff;
- padding: 4px 9px;
- min-width: 90px;
- min-height: 10px;
- border: 1px solid darken($button-border-color,20%);
-
- cursor: pointer;
- white-space: nowrap;
-
- &:hover {
- @include button-gradient-hover($creation-blue);
- border: 1px solid darken($button-border-color,35%);
- text-decoration: none;
- }
- }
-}
diff --git a/app/assets/stylesheets/conversations.scss b/app/assets/stylesheets/conversations.scss
new file mode 100644
index 000000000..f37a0d3c1
--- /dev/null
+++ b/app/assets/stylesheets/conversations.scss
@@ -0,0 +1,228 @@
+#conversations_container {
+ .stream_container { border-left: none; }
+
+ .stream_element {
+ border-bottom: 1px solid $border-grey;
+ &:first-child { border-top: none; }
+ a.author{
+ font-weight: bold;
+ unicode-bidi: bidi-override;
+ }
+
+ .avatar{
+ width: 50px;
+ height: 50px;
+ }
+
+ p {
+ margin: 0 0 1em 0;
+ &:last-child { margin-bottom: 0; }
+ }
+ &.new_message { border-bottom: none; }
+ .timestamp { font-size: 11px; }
+ }
+
+ .stream_element.conversation {
+ padding: 8px;
+ .media {
+ margin-bottom: 0px;
+ margin-left: 0px;
+ }
+
+ &:hover:not(.selected), &.selected {
+ .subject,
+ .last_author,
+ .last_message {
+ color: $white;
+ }
+ .timeago { color: $background-grey; }
+ }
+
+ &:hover, &.unread:hover, &.selected:hover {
+ background-color: lighten($blue,5%);
+ cursor: pointer;
+ .participants {
+ height: 25px;
+ margin-top: 5px;
+ padding-top: 5px;
+ border-color: rgba($border-grey, 1)
+ }
+ }
+ &.unread { background-color: darken($background-white, 5%); }
+ &.selected { background-color: $blue; }
+
+ .avatar {
+ width: 50px;
+ height: 50px;
+ float: left;
+ }
+
+ .last_author, .last_message {
+ font-size: 12px;
+ line-height: 15px;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ }
+ .last_author { color: $text-dark-grey; }
+
+ .message_count, .unread_message_count {
+ margin-left: 3px;
+ float: right;
+ font-size: 12px;
+ font-weight: normal;
+ }
+
+ .participants_count {
+ &:before { content: '+'; }
+ background-color: rgba($white, 0.7);
+ border-bottom-left-radius: 4px;
+ border-bottom-right-radius: 4px;
+ float: left;
+ font-size: 13px;
+ font-weight: bold;
+ height: 15px;
+ line-height: 15px;
+ margin-left: -50px;
+ margin-top: 35px;
+ text-align: center;
+ width: 50px;
+ }
+
+ .participants {
+ float: left;
+ clear: both;
+ height: 0;
+ width: 100%;
+ overflow: hidden;
+ border-top: 1px dotted rgba($border-grey, 0);
+ transition: height ease 300ms;
+ .avatar {
+ margin: 0 5px 0 0;
+ height: 25px;
+ width: 25px;
+ }
+ }
+
+ .img { line-height: 15px; }
+
+ .subject {
+ font-size: $font-size-text;
+ > * {
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ }
+ }
+
+ .timeago {
+ float: right;
+ line-height: normal;
+ font-weight: normal;
+ color: $blue;
+ }
+ }
+}
+
+#conversation_show {
+ .conversation_participants {
+ box-shadow: 0 2px 3px -3px #666;
+
+ background-color: $background-white;
+ margin-bottom: 5px;
+ border-bottom: 1px solid $border-grey;
+ padding: 5px;
+ line-height: 0px;
+
+ .hide_conversation, .delete_conversation {
+ display: block;
+ margin-top: 25px;
+ margin-left: 10px;
+ }
+
+ .avatar {
+ height: 30px;
+ width: 30px;
+ }
+
+ .avatars {
+ text-align: right;
+ margin-top: 9px;
+ }
+
+ a img { margin-bottom: 4px; }
+
+ .conversation_controls {
+ margin-bottom: 10px;
+
+ a { margin-right: 10px; }
+ }
+ }
+
+ .conversation_participants a:hover { text-decoration: none; }
+
+ .stream .stream_element {
+ padding: 10px;
+ }
+}
+
+#left_pane {
+ border-right: solid 1px $border-grey;
+ h3 {
+ padding-bottom: 0;
+ }
+
+ #left_pane_header {
+ padding: 10px;
+ padding-right: 20px;
+ border-bottom: 1px solid $border-grey;
+ }
+
+ #conversation_inbox {
+ a:hover {
+ text-decoration: none;
+ }
+ .pagination {
+ margin-left: auto;
+ margin-right: auto;
+ text-align: center;
+
+ .disabled a {
+ background: $background-grey;
+ }
+ }
+ }
+}
+
+@media (max-width: 1354px) {
+ #left_pane #conversation_inbox .pagination ul > li > a {
+ padding: 4px 7px;
+ }
+}
+
+#conversation_new {
+ label { font-weight: bold; }
+}
+
+#no_conversations,
+#no_conversation_text {
+ font-weight: bold;
+ color: #ccc;
+ text-align: center;
+ margin-top: 100px;
+}
+
+#no_conversation_text {
+ font-size: 20px;
+}
+
+#no_conversation_controls {
+ text-align: center;
+ font-size: 12px;
+}
+
+#new_conversation_pane {
+ ul.as-selections { width: 100% !important; }
+ input#contact_ids { box-shadow: none; }
+ label { font-weight: bold; }
+}
diff --git a/app/assets/stylesheets/default.css b/app/assets/stylesheets/default.css
deleted file mode 100644
index d981555da..000000000
--- a/app/assets/stylesheets/default.css
+++ /dev/null
@@ -1,15 +0,0 @@
-/*
-*= require media-box
-*= require lightbox
-*= require autocomplete
-*= require mentions
-*= require tags
-*= require hovercard
-
-*= require vendor/interim-bootstrap
-*= require vendor/facebox
-*= require vendor/fileuploader
-*= require vendor/autoSuggest
-*= require entypo-fonts
-*= require entypo
-*/
diff --git a/app/assets/stylesheets/entypo.css.scss b/app/assets/stylesheets/entypo.scss
index a2d2a3774..a2d2a3774 100644
--- a/app/assets/stylesheets/entypo.css.scss
+++ b/app/assets/stylesheets/entypo.scss
diff --git a/app/assets/stylesheets/error_pages.css.scss b/app/assets/stylesheets/error_pages.css.scss
deleted file mode 100644
index c2574d770..000000000
--- a/app/assets/stylesheets/error_pages.css.scss
+++ /dev/null
@@ -1,25 +0,0 @@
-@import 'colors';
-@import 'mixins';
-
-#big-number {
- font-family: Roboto-BoldCondensed, Helvetica, Arial, sans-serif;
- font-size: 250px;
- line-height: 1em;
- text-align: center;
- padding-top: 100px;
- text-shadow: 0 2px 0 #fff, 0 -1px 0 #999;
- color: #ddd;
-}
-.transparent {
- @include opacity(0.8);
-}
-#content {
- font-family: Roboto, Helvetica, Arial, sans-serif;
- text-align: center;
- text-shadow: 0 1px 0 #fff;
- font-size: 1.25em;
- line-height: 1.5em;
- color: $text-dark-grey;
- position: absolute;
- left: 0; right: 0;
-}
diff --git a/app/assets/stylesheets/error_pages.scss b/app/assets/stylesheets/error_pages.scss
new file mode 100644
index 000000000..452352e65
--- /dev/null
+++ b/app/assets/stylesheets/error_pages.scss
@@ -0,0 +1,107 @@
+@import 'colors';
+@import 'mixins';
+
+#big-number {
+ font-family: Roboto-BoldCondensed, Helvetica, Arial, sans-serif;
+ font-size: 250px;
+ line-height: 1em;
+ text-align: center;
+ padding-top: 100px;
+ text-shadow: 0 2px 0 #fff, 0 -1px 0 #999;
+ color: #ddd;
+}
+.transparent {
+ opacity: 0.8;
+}
+#content {
+ font-family: Roboto, Helvetica, Arial, sans-serif;
+ text-align: center;
+ text-shadow: 0 1px 0 #fff;
+ font-size: 1.25em;
+ line-height: 1.5em;
+ color: $text-dark-grey;
+ position: absolute;
+ left: 0; right: 0;
+}
+
+#error_404 {
+ width: 100%;
+ height: 100%;
+ position: fixed;
+ bottom:0px;
+ margin: 0px;
+ font-family: Roboto, Helvetica, Arial, sans-serif;
+ text-align: center;
+ text-shadow: 0 1px 0 #fff;
+ color: #666;
+ background: image-url("peeping-tom.png") no-repeat bottom;
+
+ #big-number {
+ font-family: Roboto-BoldCondensed, Helvetica, Arial, sans-serif;
+ font-size: 250px;
+ text-shadow: 0 2px 0 #fff, 0 -1px 0 #999;
+ color: #ddd;
+ }
+
+ a {
+ text-decoration : none;
+ color : rgb(42,156,235);
+ }
+
+ a:hover {
+ text-decoration : underline;
+ }
+
+ .transparent {
+ filter: alpha(opacity=80);
+ opacity: 0.8;
+ }
+}
+
+#error_422 {
+ background-color: #fff;
+ color: #666;
+ text-align: center;
+ font-family: arial, sans-serif;
+
+ div.dialog {
+ width: 25em;
+ padding: 0 4em;
+ margin: 4em auto 0 auto;
+ border: 1px solid #ccc;
+ border-right-color: #999;
+ border-bottom-color: #999;
+ }
+
+ h1 {
+ font-size: 100%;
+ color: #f00;
+ line-height: 1.5em;
+ }
+}
+
+#error_500 {
+ text-align: center;
+ background-color: rgb(252,252,252);
+ color: #444;
+ font-family: 'helvetica neue', 'helvetica', 'arial', sans-serif;
+ margin: 0;
+ padding: 1em;
+
+ header {
+ height: 100px;
+ background-color: #333;
+ position:relative;
+ }
+
+ #diaspora_logo {
+ position: relative;
+ margin-top: 50px;
+ }
+
+ h1 {
+ font-size: 100%;
+ color: #444;
+ line-height: 1.5em;
+ }
+}
diff --git a/app/assets/stylesheets/facebox.css.scss b/app/assets/stylesheets/facebox.scss
index 18b07f2a3..18b07f2a3 100644
--- a/app/assets/stylesheets/facebox.css.scss
+++ b/app/assets/stylesheets/facebox.scss
diff --git a/app/assets/stylesheets/footer.css.scss b/app/assets/stylesheets/footer.scss
index 15c2e6a5e..9d057029d 100644
--- a/app/assets/stylesheets/footer.css.scss
+++ b/app/assets/stylesheets/footer.scss
@@ -31,7 +31,7 @@ footer {
&.separator {
margin-left: -.35em;
margin-right: .65em;
- @include opacity(.6);
+ opacity: 0.6;
}
&:last-child {
diff --git a/app/assets/stylesheets/getting-started.css.scss b/app/assets/stylesheets/getting-started.css.scss
deleted file mode 100644
index d5817f94c..000000000
--- a/app/assets/stylesheets/getting-started.css.scss
+++ /dev/null
@@ -1,37 +0,0 @@
-#hello-there {
- .avatar {
- width: 50px;
- height: 50px;
- }
-
- .awesome {
- text-align: center;
-
- .btn.creation {
- text-shadow: none;
- }
- }
-
- .hero-unit {
- margin: 20px 42px;
- padding: 40px 80px;
- }
-
- h2 {
- margin-top: 80px;
- }
-
- p, form {
- margin-left: 30px;
- }
-
- ul.as-selections {
- width: 100%;
-
- li.as-original {
- input {
- margin-bottom: 15px;
- }
- }
- }
-}
diff --git a/app/assets/stylesheets/getting-started.scss b/app/assets/stylesheets/getting-started.scss
new file mode 100644
index 000000000..57b4d0a6f
--- /dev/null
+++ b/app/assets/stylesheets/getting-started.scss
@@ -0,0 +1,81 @@
+#hello-there {
+ .avatar {
+ width: 50px;
+ height: 50px;
+ }
+
+ .well .media{
+ overflow: visible;
+ }
+
+ .awesome {
+ text-align: center;
+
+ .btn.creation {
+ text-shadow: none;
+ }
+ }
+
+ .hero-unit {
+ margin: 20px 42px;
+ padding: 40px 80px;
+ }
+
+ h2 {
+ margin-top: 80px;
+ }
+
+ p, form {
+ margin-left: 30px;
+ }
+
+ ul.as-selections {
+ width: 100%;
+
+ li.as-original {
+ input {
+ margin-bottom: 15px;
+ }
+ }
+ }
+
+ .as-results .as-list {
+ box-shadow: 0px 1px 1px #666;
+ }
+}
+
+.popover h3 {
+ font-weight: bold;
+ .close { line-height: 18px; }
+}
+
+#welcome-to-diaspora {
+ background: orange;
+ box-shadow: inset 0 -2px 10px rgba(0,0,0,0.35);
+ margin-bottom: 20px;
+ margin-top: -40px;
+ padding-bottom: 30px;
+ padding-top: 60px;
+
+ h1,h3 {
+ color: $white;
+ margin: 0;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ }
+
+ #gs-skip-x {
+ font-size: 40px;
+ }
+
+ &:hover {
+ #gs-skip-x {
+ opacity: .4;
+ @include transition(opacity, 0.25s);
+
+ &:hover {
+ opacity: 1;
+ }
+ }
+ }
+}
diff --git a/app/assets/stylesheets/header.css.scss b/app/assets/stylesheets/header.scss
index d4ecee42b..7e4757ae8 100644
--- a/app/assets/stylesheets/header.css.scss
+++ b/app/assets/stylesheets/header.scss
@@ -4,8 +4,8 @@
}
body > header {
- @include box-shadow(0,1px,3px,rgba(0,0,0,0.9));
- background: url('header-bg.png') rgb(40,35,35);
+ box-shadow: 0 1px 3px rgba(0,0,0,0.9);
+ background: image-url('header-bg.png') rgb(40,35,35);
z-index: 1001;
padding: 6px 0;
color: #CCC;
@@ -39,10 +39,14 @@ body > header {
color: #CCC;
color: rgb(147,147,147);
- &:hover {
+ &:hover, &:focus {
background: none;
color: $highlight-white;
}
+ &:focus {
+ outline: thin dotted $border-dark-grey;
+ text-decoration: none;
+ }
}
&.landing {
@@ -68,7 +72,7 @@ body > header {
font-size: smaller;
.badge_count {
- @include border-radius(2px);
+ border-radius: 2px;
z-index: 3;
position: absolute;
top: -4px;
@@ -118,10 +122,9 @@ body > header {
}
#notification_dropdown {
- @include dropdown-shadow;
-
background: white;
border: solid $border-dark-grey 1px;
+ box-shadow: 0 0px 13px rgba(20,20,20,0.5);
left: 300px;
width: 380px;
display: none;
@@ -152,42 +155,48 @@ body > header {
}
.ajax_loader {
+ border-bottom: 1px solid $border-grey;
text-align: center;
padding: 15px;
}
+ .notifications{
+ overflow: hidden;
+ position: relative;
+ max-height: 325px;
- .notification_element {
- border-bottom: 1px solid $border-grey;
- padding: 5px;
- min-height: 35px;
- line-height: 18px;
-
- > .avatar {
- height: 35px;
- width: 35px;
- float: left;
- }
+ .media.stream_element {
+ border-bottom: 1px solid $border-grey;
+ padding: 5px;
+ min-height: 35px;
+ line-height: 18px;
+ margin: 0;
- .notification_message {
- margin-left: 40px;
- }
+ img.avatar {
+ width: 35px;
+ height: 35px;
+ }
+
+ .pull-right > .aspect_membership_dropdown { display: none; }
+ .unread-toggle { margin: 10px; }
- .unread-toggle {
- padding: 9px 5px;
.entypo {
cursor: pointer;
color: lighten($black,75%);
font-size: 17px;
line-height: 17px;
}
- }
+ .tooltip {
+ position: fixed;
+ }
- &.unread {
- background-color: $background-grey;
- color: $black;
- .unread-toggle {
- .entypo { color: $black; }
+ &.unread {
+ background-color: $background-grey;
+ color: $black;
+ .unread-toggle {
+ .entypo { color: $black; }
+ }
}
+
}
}
@@ -216,14 +225,15 @@ body > header {
right: 0;
input {
- @include box-shadow(0, 1px, 1px, #444);
- @include border-radius(15px);
+ box-shadow: 0 1px 1px #444;
+ border-radius: 15px;
@include transition(width);
width: 100px;
background-color: #444;
border: 1px solid #222;
font-size: 13px;
padding: 4px;
+ margin-top: 1px;
&:hover { background-color: #555; }
@@ -238,8 +248,8 @@ body > header {
width: 200px;
}
- &::-webkit-input-placeholder { text-shadow: none; }
- &::-moz-placeholder { text-shadow: none; }
+ &::input-placeholder { text-shadow: none; }
+ &::placeholder { text-shadow: none; }
&.ac_loading::-webkit-search-cancel-button { -webkit-appearance: none; }
}
}
@@ -276,7 +286,7 @@ body > header {
}
&.active {
- @include dropdown-shadow;
+ box-shadow: 0 0px 13px rgba(20,20,20,0.5);
background-color: rgb(34,30,30);
visibility: visible;
@@ -314,7 +324,7 @@ body > header {
text-decoration: none;
}
- &:focus { :outline: none; }
+ &:focus { outline: none; }
}
.user-menu-more-indicator {
@@ -336,7 +346,7 @@ body > header {
float: left;
height: 100%;
margin-right: 5px;
- margin-top: 3px;
+ margin-top: 2px;
a {
padding: 0 10px;
@@ -374,8 +384,8 @@ body > header {
color: $blue;
&.login {
- @include border-radius(5px);
- @include box-shadow(0, 1px, 1px, #666);
+ border-radius: 5px;
+ box-shadow: 0 1px 1px #666;
padding: 5px 8px;
background-color: #000;
border-top: 1px solid #000;
diff --git a/app/assets/stylesheets/help.css.scss b/app/assets/stylesheets/help.scss
index ca4edf9ed..56fde842e 100644
--- a/app/assets/stylesheets/help.css.scss
+++ b/app/assets/stylesheets/help.scss
@@ -57,40 +57,52 @@ ul#help_nav {
text-align: left;
}
ul > li {
- list-style-type: disc !important;
+ list-style-type: disc !important;
}
-
+
text-align: justify;
.question {
background-color: rgb(242, 242, 242);
margin-bottom: 10px;
- @include border-radius(4px);
+ border-radius: 4px;
a.toggle {
- text-decoration: none;
+ text-decoration: none;
color: black;
}
- h4 {
+ h4 {
text-align: left;
font-weight: 700;
margin: 0px;
- padding: 10px 20px;
+ padding: 10px 20px;
}
-
+
&.collapsed {
- border: 2px solid rgb(242, 242, 242);
+ border: 2px solid rgb(242, 242, 242);
}
-
- &.opened {
+
+ &.opened {
border: 2px solid rgb(142, 222, 61);
h4 {
background-color: rgb(142, 222, 61);
}
}
.answer {
- @include border-radius(0px, 0px, 4px, 4px);
+ border-radius: 0px 0px 4px 4px;
background-color: white;
padding: 10px 20px;
+
+ div.help-chat-icons{
+ text-align: center;
+ font-size: 50px;
+ line-height: 70px;
+
+ i.entypo{
+ color: #bfbfbf;
+
+ &.chat{ color: #000000; }
+ }
+ }
}
}
}
diff --git a/app/assets/stylesheets/home.scss b/app/assets/stylesheets/home.scss
new file mode 100644
index 000000000..acb3e9195
--- /dev/null
+++ b/app/assets/stylesheets/home.scss
@@ -0,0 +1,84 @@
+body {
+ margin-top: 50px;
+ background-color: white;
+ background-image : none;
+}
+
+li {
+ list-style: none;
+}
+
+footer h3 {
+ margin-bottom: 25px;
+ text-align: center;
+}
+
+footer {
+ margin-bottom: 12px;
+ padding: 42px;
+ border-top: 1px solid #ccc;
+ border-bottom: 1px solid #ccc;
+ width: auto
+}
+
+#header {
+ /* Hack to hide the header */
+ box-shadow:none;
+ border:none;
+ background:none;
+
+ left: 0px;
+ padding: 15px 0px;
+}
+
+#header img {
+ margin-left: 15px;
+}
+
+#login-link {
+ float: right;
+ margin-right: 15px;
+}
+
+#steps {
+ text-align: center;
+}
+
+#banner {
+ border-bottom : 1px solid #ccc;
+ border-top : 1px solid #eee;
+ padding : 30px;
+ margin-top: 20px;
+ text-align: center;
+
+ box-shadow : 0 9px 15px -10px rgba(0,0,0,0.7);
+}
+
+#links {
+ margin: 0;
+ padding: 0;
+ text-align: center;
+}
+
+#links .section {
+ margin: 0;
+ padding: 0;
+ display: inline-block;
+ vertical-align: top;
+ width: 24%;
+ max-width: 24%;
+}
+
+#change-page {
+ color: #999;
+ text-align: center;
+ font-style: italic;
+}
+
+.helpful {
+ cursor: help;
+}
+
+.row {
+ margin-bottom: 60px;
+}
diff --git a/app/assets/stylesheets/hovercard.css.scss b/app/assets/stylesheets/hovercard.scss
index 30ad7f9c7..eb5ae9518 100644
--- a/app/assets/stylesheets/hovercard.css.scss
+++ b/app/assets/stylesheets/hovercard.scss
@@ -1,9 +1,6 @@
-@import "colors";
-@import "_mixins.css.scss";
-
#hovercard {
- @include border-radius(2px);
- @include box-shadow(0, 0, 5px, #666666);
+ border-radius: 2px;
+ box-shadow: 0 0 5px #666666;
position: relative;
display: inline-block;
diff --git a/app/assets/stylesheets/invitations.css.scss b/app/assets/stylesheets/invitations.scss
index b83677a66..366b0caf4 100644
--- a/app/assets/stylesheets/invitations.css.scss
+++ b/app/assets/stylesheets/invitations.scss
@@ -1,10 +1,16 @@
#invite_code {
+ background-color: $white;
cursor: text;
display: block;
margin-top: 5px;
}
#invitationsModal {
+ .modal-header, .modal-body {
+ color: $text;
+ font-size: $font-size-text;
+ text-align: initial;
+ }
#paste_link { font-weight: 700; }
#invite_code { margin-top: 10px; }
#codes_left { color: $text-grey; }
diff --git a/app/assets/stylesheets/leftnavbar.css.scss b/app/assets/stylesheets/leftnavbar.css.scss
deleted file mode 100644
index e616aea91..000000000
--- a/app/assets/stylesheets/leftnavbar.css.scss
+++ /dev/null
@@ -1,48 +0,0 @@
-#leftNavBar {
- color: #222222;
-
- ul {
- margin: 0px;
- padding: 0px;
- }
-
- a {
- color: $link-grey;
- font-weight: bold;
- text-decoration: none;
- }
-
- .selected { color: $black; }
- .selected a { color: $black; }
-
- .hoverable {
- display: block;
- margin-right: 6px;
- padding: 4px;
- &:hover { background-color: $background-blue; }
-
- .label {
- background-color: $background-grey;
- color: $text-grey;
- }
- }
-
- .selectable {
- display: block;
- margin-left: 21px;
- overflow: hidden;
- text-overflow: ellipsis;
- }
-
- .action {
- width: 12px;
- height: 12px;
- display: none;
- float: right;
- margin: 3px;
- }
-
- .hoverable:hover > .action {
- display: block;
- }
-}
diff --git a/app/assets/stylesheets/leftnavbar.scss b/app/assets/stylesheets/leftnavbar.scss
new file mode 100644
index 000000000..6bee6e8d6
--- /dev/null
+++ b/app/assets/stylesheets/leftnavbar.scss
@@ -0,0 +1,127 @@
+#leftNavBar {
+ a {
+ color: $link-grey;
+ font-weight: bold;
+ text-decoration: none;
+ }
+
+ ul {
+ margin: 0px;
+ padding: 0px;
+ list-style: none;
+ }
+
+ .selected { color: $black; }
+ .selected a { color: $black; }
+
+ .hoverable {
+ display: block;
+ margin-right: 6px;
+ padding: 4px;
+ &:hover { background-color: $background-blue; }
+ }
+
+ .selectable {
+ display: block;
+ margin-left: 21px;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ }
+
+ #home_user_badge {
+ border-bottom: 1px dashed $border-grey;
+ margin-bottom: 10px;
+ min-height: 50px;
+ padding-bottom: 10px;
+ padding-left: 4px;
+
+ .avatar {
+ float: left;
+ height: 50px;
+ width: 50px;
+ }
+
+ h4 {
+ margin-left: 60px;
+ padding-top: 15px;
+ overflow: hidden;
+ text-overflow: ellipsis;
+
+ a { color: $black; }
+ }
+ }
+
+ #stream_selection {
+ & > li {
+ margin-bottom: 5px;
+ }
+ }
+
+ #aspects_list, #tags_list {
+ .hoverable > .action {
+ visibility: hidden;
+ margin: 0 3px;
+ }
+ .hoverable:hover > .action {
+ visibility: visible;
+ }
+ }
+
+ #aspects_list {
+ .entypo.check {
+ float: left;
+ visibility: hidden;
+ &.selected { visibility: visible; }
+ }
+ .selected + a {
+ color: #333333;
+ }
+ }
+
+ #tags_list {
+ .delete_tag_following {
+ font-size: 20px;
+ line-height: 15px;
+ }
+
+ #new_tag_following {
+ margin-left: 20px;
+ margin-top: 5px;
+ }
+
+ /* ---- override app/stylesheets/vendor/autoSuggest.css ---- */
+ ul.as-selections { padding: 1px 5px 4px 5px; }
+ .tag_input {
+ line-height: $font-size-text;
+ vertical-align: top;
+ width: 100%;
+ }
+
+ .as-result {
+ margin-top: -1px;
+ margin-left: 1px;
+ }
+
+ .as-list {
+ em {
+ background-color: #aabbcc;
+ color: black;
+ padding: 0px;
+ }
+
+ color: black;
+ position: static; /* override absolute */
+ margin: 0px;
+ border-radius: 0px 0px 3px 3px;
+ box-shadow: 0px 1px 1px #666;
+ }
+
+ .as-result-item.active {
+ color: black;
+ text-shadow: none;
+ background-color: $background-blue;
+ border-color: $background-blue;
+ }
+ /* ---- end override app/stylesheets/vendor/autoSuggest.css ---- */
+ }
+}
diff --git a/app/assets/stylesheets/lightbox.css.scss b/app/assets/stylesheets/lightbox.scss
index 9fc9f50bd..872126eb0 100644
--- a/app/assets/stylesheets/lightbox.css.scss
+++ b/app/assets/stylesheets/lightbox.scss
@@ -1,9 +1,3 @@
-// licensed under the Affero General Public License version 3 or later. See
-// the COPYRIGHT file.
-
-@import 'colors';
-@import 'mixins';
-
#lightbox{
z-index: 1003;
position: fixed;
@@ -26,7 +20,7 @@
}
#lightbox-image{
- @include box-shadow(0, 10px, 20px, black);
+ box-shadow: 0 10px 20px black;
top: 0;
display: block;
margin-bottom: 120px;
@@ -74,8 +68,6 @@
}
#lightbox-backdrop{
- -moz-box-shadow:inset 0 0 50px #000000;
- -webkit-box-shadow:inset 0 0 50px #000000;
box-shadow:inset 0 0 50px #000000;
z-index: 1002;
@@ -128,8 +120,8 @@
padding-right: 50px;
img{
- @include transition(opacity, 0.2s);
- @include opacity(0.2);
+ transition: opacity 0.2s;
+ opacity: 0.2;
height: 70px;
width: 70px;
margin-right: 5px;
@@ -141,7 +133,7 @@
}
&.selected{
- @include opacity(1);
+ opacity: 1;
}
}
}
diff --git a/app/assets/stylesheets/markdown-content.scss b/app/assets/stylesheets/markdown-content.scss
new file mode 100644
index 000000000..4d7d8e895
--- /dev/null
+++ b/app/assets/stylesheets/markdown-content.scss
@@ -0,0 +1,11 @@
+.markdown-content {
+ p { margin: 0 0 0.8em; }
+ p:last-child { margin-bottom: 0; }
+
+ ul, ol {
+ margin-top:0.8em;
+ margin-bottom:0.8em;
+ &:first-child { margin-top: 0; }
+ &:last-child { margin-bottom: 0; }
+ }
+}
diff --git a/app/assets/stylesheets/media-box.css.scss b/app/assets/stylesheets/media-box.scss
index 2c11626d9..2c11626d9 100644
--- a/app/assets/stylesheets/media-box.css.scss
+++ b/app/assets/stylesheets/media-box.scss
diff --git a/app/assets/stylesheets/mentions.css.scss b/app/assets/stylesheets/mentions.scss
index 49187d20b..6647170ee 100644
--- a/app/assets/stylesheets/mentions.css.scss
+++ b/app/assets/stylesheets/mentions.scss
@@ -1,8 +1,5 @@
-@import 'colors';
-@import '_mixins.css.scss';
-
.mentions-input-box {
- @include border-radius(3px);
+ border-radius: 3px;
background: #fff;
position: relative;
@@ -37,7 +34,7 @@
margin: 0;
padding: 0;
- @include border-radius(0px, 0px, 5px, 5px);
+ border-radius: 0px 0px 5px 5px;
li {
color: #444;
@@ -54,7 +51,7 @@
white-space: nowrap;
&:hover, &.active { background: $background-grey; }
- &:last-child { @include border-radius(0px, 0px, 5px, 5px); }
+ &:last-child { border-radius: 0px 0px 5px 5px; }
img, div.icon {
float: left;
@@ -66,19 +63,22 @@
}
}
+ .mentions-box {
+ position: absolute;
+ right: 0px;
+ bottom: 0px;
+ left: 0px;
+ top: 0px;
+ padding: 4px 6px;
+ }
+
.mentions {
- bottom: 0;
color: white;
font-size: 14px;
font-family: Arial, Helvetica, sans-serif;
- left: 0;
line-height: normal;
overflow: hidden;
- padding: 4px;
- position: absolute;
- right: 0;
- top: 0;
- width: 445px;
+ width: 100%;
white-space: pre-wrap;
word-wrap: break-word;
diff --git a/app/assets/stylesheets/mobile/header.css.scss b/app/assets/stylesheets/mobile/header.scss
index 20e537941..3c887aa8d 100644
--- a/app/assets/stylesheets/mobile/header.css.scss
+++ b/app/assets/stylesheets/mobile/header.scss
@@ -5,13 +5,13 @@ header {
height: 45px;
top: 0px;
z-index: 10;
- background: url('../header-bg-long.jpg') rgb(40,35,35);
- @include box-shadow(0, 1px, 2px, #333);
+ background: image-url('header-bg-long.jpg') rgb(40,35,35);
+ box-shadow: 0 1px 2px #333;
border-bottom: 1px solid #222;
}
#main_nav {
- width: 100%;
+ width: 100%;
#header_title {
display: inline-block;
@@ -32,7 +32,7 @@ header {
font-weight: bold;
font-size: smaller;
background-color: transparent;
-
+
img {
height: 30px;
width: 30px;
@@ -40,7 +40,7 @@ header {
}
.badge_count {
- @include border-radius(2px);
+ border-radius: 2px;
z-index: 3;
position: absolute;
top: 3px;
@@ -48,7 +48,7 @@ header {
background-color: $red;
margin-left: -8px;
}
-
+
#conversation_icon {
height: 18px;
}
@@ -62,18 +62,13 @@ header {
width: 100%;
left: 100%;
background-color: #444;
-
- box-shadow: -2px 0px 2px 1px #333;
- -o-box-shadow: -2px 0px 2px 1px #333;
- -ms-box-shadow: -2px 0px 2px 1px #333;
- -moz-box-shadow: -2px 0px 2px 1px #333;
- -webkit-box-shadow: -2px 0px 2px 1px #333;
+ box-shadow: -2px 0px 2px 1px #333;
header {
position: static;
left: 100%;
right: -80%;
-
+
#global_search {
position: relative;
@@ -83,8 +78,8 @@ header {
right: 22%;
input {
- @include box-shadow(0, 1px, 1px, #444);
- @include border-radius(15px);
+ box-shadow: 0 1px 1px #444;
+ border-radius: 15px;
width: 100%;
margin-top: 7px;
background-color: #444;
@@ -103,13 +98,12 @@ header {
background-color: white;
}
- &::-webkit-input-placeholder { text-shadow: none; }
- &:-moz-placeholder { text-shadow: none; }
+ &:placeholder { text-shadow: none; }
}
}
}
}
-
+
nav {
position: absolute;
top: 45px;
@@ -124,7 +118,7 @@ header {
color: $light-grey;
border-bottom: solid rgb(53, 53, 53) 2px;
}
-
+
li:hover {
background-color: $link-grey;
}
@@ -132,21 +126,21 @@ header {
.no_border {
padding: 0px;
border-bottom: 0px;
-
+
&:hover {
background-color: transparent;
}
-
+
> ul > li > a {
font-size: 14px;
padding: 8px 42px;
}
}
-
+
.hide {
display: none;
}
-
+
.avatar {
height: 35px;
width: 35px;
@@ -154,7 +148,7 @@ header {
float: right;
}
}
-
+
a {
display: block;
color: $light-grey;
@@ -171,8 +165,4 @@ header {
/* This class is added when the user open the drawer */
#app.draw > * {
transform: translateX(-80%);
- -o-transform: translateX(-80%);
- -ms-transform: translateX(-80%);
- -moz-transform: translateX(-80%);
- -webkit-transform: translateX(-80%);
}
diff --git a/app/assets/stylesheets/mobile/mobile.css.scss b/app/assets/stylesheets/mobile/mobile.scss
index c536cd28e..f5f48ea65 100644
--- a/app/assets/stylesheets/mobile/mobile.css.scss
+++ b/app/assets/stylesheets/mobile/mobile.scss
@@ -1,17 +1,22 @@
-@import 'bootstrap';
-@import 'bootstrap-responsive';
+@import "bootstrap";
+@import "bootstrap-responsive";
@import "colors";
-@import "_mixins.css.scss";
-@import 'vendor/autoSuggest';
-@import '_flash_messages.scss';
+@import "_mixins";
+@import "vendor/autoSuggest";
+@import "_flash_messages";
-@import 'header';
+@import "header";
a {
color: #2489ce;
text-decoration: none;
}
+code {
+ white-space: normal;
+ word-wrap: break-word;
+ }
+
body {
background: {
image: image-url('texture/hatched-light.jpg');
@@ -48,11 +53,12 @@ h3 {
position: relative;
text-align: left;
padding: 10px 0;
- * {
- max-width: 100%; }
min-height: 34px;
+
+ * { max-width: 100%; }
+
.avatar {
- @include border-radius(4px);
+ border-radius: 4px;
float: left;
height: 35px;
@@ -148,12 +154,14 @@ h3 {
.login-container {
padding: 10px;
+ label, legend { text-transform: uppercase; }
}
}
-.stream_element, #login_form {
- @include border-radius(5px);
- @include box-shadow(0, 1px, 2px, rgba(0, 0, 0, 0.2));
+.stream_element,
+#login_form {
+ border-radius: 5px;
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);
background-color: #fff;
margin-bottom: 10px;
@@ -178,7 +186,7 @@ h3 {
padding: 0;
margin: 0;
img {
- @include border-radius(3px);
+ border-radius: 3px;
margin: 0;
padding: 0; } }
@@ -190,8 +198,7 @@ h3 {
}
}
-.more-link {
- -webkit-box-shadow: inset 0 1px 5px #777, 0 1px 1px rgba(0,0,0,0.4);
+.more-link, .no-more-posts {
display: block;
text-align: center;
padding: 0 10px;
@@ -202,10 +209,15 @@ h3 {
color: rgba(220,220,220,0.8);
}
- h1 {
+ h1, h2 {
color: $text-grey;
padding: 20px;
- text-shadow: 0 2px 0 #fff; } }
+ text-shadow: 0 2px 0 #fff;
+ }
+}
+.no-more-posts {
+ box-shadow: inset 0 1px 5px #777, 0 1px 1px rgba(0,0,0,0.4);
+}
.info {
color: #ccc;
@@ -297,27 +309,42 @@ h3 {
}
#author_info {
- height: 100%;
- position: relative;
+ margin: -10px;
+ margin-bottom: 10px;
+ padding-top: 5px;
+ background-color: #fff;
+ border-bottom: 1px solid #aaa;
word-wrap: break-word;
img {
- height: 90px;
- width: 90px;
- margin-right: 10px;
+ border-radius: 4px;
+
+ height: 70px;
+ width: 70px;
+ margin: 10px;
float: left;
}
.content {
- padding-left: 100px;
+ padding-left: 90px;
+
+ h2 {
+ font-size: 20px;
+ line-height: 20px;
+ margin-bottom: 0px;
+ }
+
+ .description {
+ font: {
+ weight: normal;
+ size: small;
+ };
+ color: $text-grey;
+ }
}
- .description {
- font: {
- weight: normal;
- size: small;
- };
- color: $text-grey;
+ .bottom_bar {
+ position: static;
}
}
@@ -331,7 +358,7 @@ h3 {
}
.bottom_bar {
- @include border-radius(0, 0, 5px, 5px);
+ border-radius: 0 0 5px 5px;
z-index: 3;
display: block;
position: relative;
@@ -418,14 +445,14 @@ h3 {
float: right; }
.stream_element .photo_attachments {
- @include border-radius(3px, 3px, 0, 0);
+ border-radius: 3px 3px 0 0;
border: {
bottom: 1px solid #ccc;
}
img.big-stream-photo {
- @include border-radius(3px, 3px, 0, 0);
+ border-radius: 3px 3px 0 0;
width: 100%;
}
a {
@@ -434,7 +461,7 @@ h3 {
}
.photo_area {
- @include border-radius(3px);
+ border-radius: 3px;
text-align: center; }
.image_link {
@@ -488,7 +515,7 @@ h3 {
cursor: pointer;
&.dim {
- @include opacity(0.6);
+ opacity: 0.6;
}
}
}
@@ -498,8 +525,8 @@ h3 {
}
textarea {
- @include border-radius(0);
- @include box-shadow(0, 2px, 3px, #999);
+ border-radius: 0;
+ box-shadow: 0 2px 3px #999;
border: none;
border-bottom: 1px solid $border-dark-grey;
width: 96%;
@@ -543,7 +570,7 @@ select {
}
.additional_photo_count {
- @include opacity(0.5);
+ opacity: 0.5;
position: absolute;
padding: 3px 8px;
@@ -623,9 +650,9 @@ select {
}
.conversation_participants img.avatar{
- height:35px;
- width:35px;
- margin: 5px 0 5px 2px;
+ height:35px;
+ width:35px;
+ margin: 5px 0 5px 2px;
}
.conversations img.avatar{
@@ -662,8 +689,8 @@ select {
}
form#new_conversation.new_message input.button.creation{
- float: right;
- margin: 0 5px 5px;
+ float: right;
+ margin: 0 5px 5px;
}
h3.ltr {
@@ -742,24 +769,17 @@ textarea#conversation_text {
vertical-align: middle;
cursor: pointer;
background-color: #f5f5f5;
- background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6);
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));
- background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6);
- background-image: -o-linear-gradient(top, #ffffff, #e6e6e6);
+ background-image: gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));
background-image: linear-gradient(to bottom, #ffffff, #e6e6e6);
background-repeat: repeat-x;
border: 1px solid #cccccc;
border-color: #e6e6e6 #e6e6e6 #bfbfbf;
border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
border-bottom-color: #b3b3b3;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
+ border-radius: 4px;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);
filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
- -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
- -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
- box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
}
.button.creation:hover,
@@ -782,10 +802,7 @@ textarea#conversation_text {
color: #333333;
text-decoration: none;
background-position: 0 -15px;
- -webkit-transition: background-position 0.1s linear;
- -moz-transition: background-position 0.1s linear;
- -o-transition: background-position 0.1s linear;
- transition: background-position 0.1s linear;
+ transition: background-position 0.1s linear;
}
.button.creation:focus {
@@ -831,6 +848,22 @@ form#new_user.new_user input.btn {
text-shadow: 1px 1px 20px rgb(126, 240, 77);
}
+#conversation_inbox {
+ .pagination {
+ margin-left: auto;
+ margin-right: auto;
+ text-align: center;
+
+ ul > li > a {
+ padding: 4px 8px;
+ }
+
+ .disabled a{
+ background: $background-grey;
+ }
+ }
+}
+
input#user_password, #user_username, #user_password_confirmation, #user_email {
height: 30px;
}
@@ -891,8 +924,8 @@ form p.checkbox_select {
position: relative;
img {
- @include border-radius(5px);
- @include box-shadow(0,1px,2px,#666);
+ border-radius: 5px;
+ box-shadow: 0 1px 2px #666;
position: absolute;
left: 0;
@@ -902,7 +935,7 @@ form p.checkbox_select {
&.avatar {
@include transition(opacity, 0.5s);
&.loading {
- @include opacity(0.3);
+ opacity: 0.3;
}
}
}
@@ -910,9 +943,9 @@ form p.checkbox_select {
}
#file-upload.button {
- @include border-radius(3px);
@include button-gradient($light-grey);
- @include box-shadow(0,1px,1px,#cfcfcf);
+ border-radius: 3px;
+ box-shadow: 0 1px 1px #cfcfcf;
@include transition(border);
display: inline-block;
@@ -968,9 +1001,11 @@ select#user_language, #user_auto_follow_back_aspect_id, #aspect_ids_ {
line-height: 18px;
color: inherit;
background-color: $background-grey;
- -webkit-border-radius: 6px;
- -moz-border-radius: 6px;
border-radius: 10px;
+ .img .avatar {
+ width: 50px;
+ height: 50px;
+ }
}
.search-mobile {
@@ -1002,19 +1037,19 @@ select#aspect_ids_ {
cursor: pointer;
&:hover img {
- @include opacity(0.4);
+ opacity: 0.4;
}
}
#publisher_textarea_wrapper {
- @include border-radius(2px);
+ border-radius: 2px;
margin: 12px 0px;
background: #fff;
position: relative;
padding-right: 10px;
#hide_publisher {
- @include opacity(0.3);
+ opacity: 0.3;
z-index: 5;
padding: 3px;
position: absolute;
@@ -1022,7 +1057,7 @@ select#aspect_ids_ {
top: 0;
&:hover {
- @include opacity(1);
+ opacity: 1;
}
}
@@ -1062,7 +1097,7 @@ select#aspect_ids_ {
}
.circle {
- @include border-radius(20px);
+ border-radius: 20px;
z-index: 1;
position: absolute;
right: -7px;
@@ -1159,3 +1194,14 @@ select#aspect_ids_ {
}
}
+// Styles for mobile profile of other users
+.user_aspects {
+ width: auto !important;
+ float: right;
+ margin: 0 10px 0 0;
+ padding: 3px;
+
+ &.has_connection {
+ background-color: $light-green;
+ }
+}
diff --git a/app/assets/stylesheets/new_styles/_animations.scss b/app/assets/stylesheets/new_styles/_animations.scss
index 3a60309be..93ca29ad3 100644
--- a/app/assets/stylesheets/new_styles/_animations.scss
+++ b/app/assets/stylesheets/new_styles/_animations.scss
@@ -1,78 +1,5 @@
-@-webkit-keyframes opacity-pulse {
- 0% { @include opacity(0.3); }
- 65% { @include opacity(0.9); }
- 100% { @include opacity(0.3); }
-}
-@-moz-keyframes opacity-pulse {
- 0% { @include opacity(0.3); }
- 65% { @include opacity(0.9); }
- 100% { @include opacity(0.3); }
-}
-@-ms-keyframes opacity-pulse {
- 0% { @include opacity(0.3); }
- 65% { @include opacity(0.9); }
- 100% { @include opacity(0.3); }
-}
-@-o-keyframes opacity-pulse {
- 0% { @include opacity(0.3); }
- 65% { @include opacity(0.9); }
- 100% { @include opacity(0.3); }
-}
-
-@-webkit-keyframes ease-over {
- 0% { @include opacity(0); -webkit-transform : scale(1.3); }
- 100% { @include opacity(1); -webkit-transform : scale(1); }
-}
-@-moz-keyframes ease-over {
- 0% { @include opacity(0); -moz-transform : scale(1.3); }
- 100% { @include opacity(1); -moz-transform : scale(1); }
-}
-@-ms-keyframes ease-over {
- 0% { @include opacity(0); -ms-transform : scale(1.3); }
- 100% { @include opacity(1); -ms-transform : scale(1); }
-}
-@-o-keyframes ease-over {
- 0% { @include opacity(0); -o-transform : scale(1.3); }
- 100% { @include opacity(1); -o-transform : scale(1); }
-}
-
-@-webkit-keyframes ease-out {
- 0% { @include opacity(1); -webkit-transform : scale(1); }
- 100% { @include opacity(0); -webkit-transform : scale(1.3); }
-}
-@-moz-keyframes ease-out {
- 0% { @include opacity(1); -moz-transform : scale(1); }
- 100% { @include opacity(0); -moz-transform : scale(1.3); }
-}
-@-ms-keyframes ease-out {
- 0% { @include opacity(1); -ms-transform : scale(1); }
- 100% { @include opacity(0); -ms-transform : scale(1.3); }
-}
-@-o-keyframes ease-out {
- 0% { @include opacity(1); -o-transform : scale(1); }
- 100% { @include opacity(0); -o-transform : scale(1.3); }
-}
-
/* flash message animations - header height is about 40px */
-@-webkit-keyframes expose {
- 0% { top : -100px; }
- 15% { top : 34px; }
- 85% { top : 34px; }
- 100% { top : -100px; }
-}
-@-moz-keyframes expose {
- 0% { top : -100px; }
- 15% { top : 34px; }
- 85% { top : 34px; }
- 100% { top : -100px; }
-}
-@-ms-keyframes expose {
- 0% { top : -100px; }
- 15% { top : 34px; }
- 85% { top : 34px; }
- 100% { top : -100px; }
-}
-@-o-keyframes expose {
+@keyframes expose {
0% { top : -100px; }
15% { top : 34px; }
85% { top : 34px; }
diff --git a/app/assets/stylesheets/new_styles/_base.scss b/app/assets/stylesheets/new_styles/_base.scss
index 43aefe2e3..318b99484 100644
--- a/app/assets/stylesheets/new_styles/_base.scss
+++ b/app/assets/stylesheets/new_styles/_base.scss
@@ -7,21 +7,32 @@ body {
body {
margin-top: 40px;
padding : none;
+ font-size: $font-size-text;
&.lock {
overflow: hidden;
}
}
+blockquote p {
+ font-size: $font-size-text;
+ line-height: $line-height;
+}
+
+/* Overflow */
+h1, h2, h3, h4, h5, h6,
+p,
+blockquote,
+code,
+pre { word-wrap: break-word; }
+a.tag { word-break: break-all; }
+
/* new link color */
-$link-blue : rgb(42,156,235);
a { color : $link-blue }
-/* bootstrap extentions */
-.icon-red { background-image: image_url("img/glyphicons-halflings-red.png"); }
-.icon-blue { background-image: image_url("img/glyphicons-halflings-blue.png"); }
-
.avatar {
+ border-radius: 4px;
+
&.micro {
height: 20px;
width: 20px;
@@ -31,72 +42,18 @@ a { color : $link-blue }
height: 35px;
width: 35px;
}
-}
-#forgot_password,
-#reset_password {
- background-image : image_url("texture/light-bg.png");
- height: 100%;
+ &.medium {
+ height: auto;
+ width: auto;
+ max-width: 75px;
+ }
}
.author-name {
color: inherit;
}
-.photo-fill {
- @include background-cover();
- position: absolute;
- top: 0;
- left: 0;
- height: 100%;
- width: 100%;
-}
-
-$bring-dark-accent-forward-color: #DDD;
-
-#top-right-nav {
- z-index: 10;
- position : absolute;
- right : 10px;
- top : 10px;
-
- & > a {
- @include transition(opacity);
- @include opacity(0.4);
-
- margin-left : 5px;
-
- &:hover {
- @include opacity(0.75);
- text-decoration : none;
- }
- }
-}
-
-#header {
- position : fixed;
- top : 0;
- width : 100%;
- padding : 15px;
- z-index : 30;
-
- -webkit-box-shadow : inset 0 -10px 10px -8px rgba(0,0,0,0.8);
- -moz-box-shadow : inset 0 -10px 10px -8px rgba(0,0,0,0.8);
-
- border-bottom : 1px solid #333;
-
- color : #fff;
- background : {
- color : #333;
- size : cover;
- attachment : fixed;
- }
-
- h1 {
- @include opacity(0.4);
- }
-}
-
/* bootstrap label fixes for Roboto */
.label {
padding : 2px 5px;
@@ -110,42 +67,6 @@ $bring-dark-accent-forward-color: #DDD;
}
}
-.profile-image-container {
- border-radius: 140px;
- border : 3px solid #fff;
- box-shadow : 0 0 2px rgba(0,0,0,0.5), 0 0 10px rgba(0,0,0,0.6), inset 0 0 15px rgba(0,0,0,0.5), inset 0 -2px 4px rgba(255,255,255,0.3);
- background-size: cover;
-
- height : 140px;
- width : 140px;
- background : {
- position : center;
- image : image-url('user/default.png');
- }
-
- display : inline-block;
-
- margin-bottom : 5px;
-
- &.small {
- height : 40px;
- width : 40px;
- border : 2px solid #fff;
- }
-
- &.smaller {
- height : 34px;
- width : 34px;
- border : 2px solid #ccc;
- }
-
- &.micro {
- height : 24px;
- width : 24px;
- border : 2px solid #fff;
- }
-}
-
#back-to-top {
display: block;
color: white;
@@ -166,7 +87,7 @@ $bring-dark-accent-forward-color: #DDD;
/* general purpose classes */
.small-horizontal-spacer {
- height: 20px;
+ min-height: 20px;
}
.big-horizontal-spacer {
diff --git a/app/assets/stylesheets/buttons.css.scss b/app/assets/stylesheets/new_styles/_buttons.scss
index 2b0817086..732f98af3 100644
--- a/app/assets/stylesheets/buttons.css.scss
+++ b/app/assets/stylesheets/new_styles/_buttons.scss
@@ -3,7 +3,7 @@
@include button-gradient($creation-blue);
color: #fff;
border: 1px solid darken($button-border-color,20%);
-
+ text-shadow: none;
&:hover {
background: $creation-blue;
border: 1px solid darken($button-border-color,35%);
diff --git a/app/assets/stylesheets/new_styles/_code.scss b/app/assets/stylesheets/new_styles/_code.scss
new file mode 100644
index 000000000..aae6a603f
--- /dev/null
+++ b/app/assets/stylesheets/new_styles/_code.scss
@@ -0,0 +1,7 @@
+code { white-space: normal; }
+
+pre {
+ overflow-x: auto;
+ white-space: pre;
+ code { white-space: pre; }
+}
diff --git a/app/assets/stylesheets/new_styles/_flash_messages.scss b/app/assets/stylesheets/new_styles/_flash_messages.scss
deleted file mode 100644
index 8665c03b3..000000000
--- a/app/assets/stylesheets/new_styles/_flash_messages.scss
+++ /dev/null
@@ -1,13 +0,0 @@
-
-@import '../_flash_messages';
-
-#flash_notice,
-#flash_alert,
-#flash_error {
- .message {
- margin-top : 10px;
- padding : 10px 20px 8px;
- background-color : rgba(0,0,0,0.8);
- border : 1px solid rgba(255,255,255,0.7);
- }
-} \ No newline at end of file
diff --git a/app/assets/stylesheets/new_styles/_forms.scss b/app/assets/stylesheets/new_styles/_forms.scss
index c85da9ec0..7e4203b84 100644
--- a/app/assets/stylesheets/new_styles/_forms.scss
+++ b/app/assets/stylesheets/new_styles/_forms.scss
@@ -1,120 +1,105 @@
+input,
+input[type=email],
+input[type=text],
+input[type=password],
+textarea { /* Bootstrap reset */
+ &,
+ &:active,
+ &:invalid,
+ &:invalid:required,
+ &:focus,
+ &:active:focus,
+ &:invalid:focus,
+ &:invalid:required:focus {
+ border-color: $border-grey;
+ box-shadow: none;
+ color : $text-dark-grey;
+ }
+}
+
/* autocomplete colors */
input:-webkit-autofill{
background-color: #fff !important;
background-image: none !important;
}
-
+/* Forms described here are only used on the public pages at the moment */
form.block-form {
- display : inline-block;
+ margin: 20px auto;
label {
color : $text-dark-grey;
+ position: absolute;
+ top: -9999px;
+ left: -9999px;
}
- input {
- &:invalid,
- &:invalid:required,
- &:invalid:required:focus {
- -webkit-box-shadow : none;
- -moz-box-shadow : none;
- box-shadow : none;
- box-shadow : none;
+ fieldset {
+ margin-bottom: 1em;
+ background-color: #fff;
+ position: relative; /* To correctly place the entypo icon */
- border : none;
+ input {
color : $text-dark-grey;
+ margin: 0px;
+ border-bottom-width: 0px;
+ border-radius: 0px;
}
- }
-
- fieldset {
- @include border-radius(5px);
-
- -webkit-box-shadow : inset 0 1px 1px rgba(0,0,0,0.2), 0 1px 2px rgba(255,255,255,0.7);
-
- margin-bottom : 1em;
-
- background-color : #fff;
-
- border : 1px solid $border-dark-grey;
-
- input[type=text],
- input[type=email],
- input[type=password] {
- @include box-shadow(0,0,0,0);
- @include border-radius(0);
-
- background : transparent;
-
- padding : 10px;
- margin-bottom : 0;
- border : none;
+ .form-control {
+ font-size: 16px;
+ height: 40px;
+ padding: 10px;
+ padding-left: 40px;
}
- /* mainly bootstrap overrides */
- .control-group {
- margin : 0;
- border-bottom : 1px solid $border-grey;
-
- .control-label,
- input[type=text],
- input[type=password],
- .field_with_errors label {
- padding : 10px;
- margin : 0;
+ .form-control:first-of-type {
+ &,
+ &:focus,
+ &:invalid,
+ &:invalid:focus,
+ &:invalid:required,
+ &:invalid:required:focus {
+ border-top-left-radius: 5px;
+ border-top-right-radius: 5px;
}
+ }
- .controls { margin-left : 100px; position : relative; }
- .control-label { width : 80px; }
-
- .controls .field_with_errors input {
- background : {
- image : image-url('invalid_fat@2x.png');
- repeat : no-repeat;
- position : 197px;
- size: 20px 20px;
- }
+ .form-control:last-of-type {
+ &,
+ &:focus,
+ &:invalid,
+ &:invalid:focus,
+ &:invalid:required,
+ &:invalid:required:focus {
+ border-bottom-left-radius: 5px;
+ border-bottom-right-radius: 5px;
+ border-bottom-width: 1px;
}
}
- }
-
- input[type=submit] {
- text-align : center;
- display : block;
- width : 100%;
- padding : 8px 0;
- }
-}
-
-textarea, input[type=text], input[type=password] {
- &:focus, &:invalid:focus {
- border: 1px solid $border-dark-grey;
- outline: none;
- -webkit-box-shadow: none;
- box-shadow: none;
- }
-}
-/* buttons to be extracted? */
-.new-btn {
- @include transition(box-shadow);
- @include border-radius(5px);
- @include linear-gradient(#fff, rgb(233,233,233));
- @include box-shadow(0, 1px, 2px, rgba(0,0,0,0));
+ .entypo {
+ position: absolute;
+ top: 10px;
+ left: 10px;
+ width: 20px;
+ text-align: center;
+ color: $text-grey;
+ font-size: 20px;
+ }
- background-color : rgb(233,233,233);
- color : $text-grey;
- border : 1px solid $border-dark-grey;
+ .entypo:nth-of-type(2) {
+ top: 50px;
+ }
- //font-family : Roboto-Bold;
- font-size : 14px;
- text-shadow : 0 1px 2px #eee;
+ .entypo:nth-of-type(3) {
+ top: 90px;
+ }
- &:hover {
- @include box-shadow(0, 1px, 2px, rgba(0,0,0,0.3));
- }
+ .entypo:nth-of-type(4) {
+ top: 130px;
+ }
- &:active {
- box-shadow : inset 0 1px 3px rgba(0,0,0,0.3), 0 1px 2px rgba(255,255,255,0.7);
+ ::placeholder { text-transform: uppercase; }
}
}
diff --git a/app/assets/stylesheets/new_styles/_interactions.scss b/app/assets/stylesheets/new_styles/_interactions.scss
index a0e12d638..96c147eaf 100644
--- a/app/assets/stylesheets/new_styles/_interactions.scss
+++ b/app/assets/stylesheets/new_styles/_interactions.scss
@@ -1,224 +1,60 @@
-@import '../mixins';
-
-#post-info {
- text-align: center;
- z-index: 10;
-
- margin-top: -33px;
-
- #post-info-container {
- @include info-container();
- }
-
- .well {
- -webkit-box-shadow: inset 0 2px 2px rgba(0,0,0,0.10);
- -moz-box-shadow: inset 0 2px 2px rgba(0,0,0,0.10);
- box-shadow: inset 0 2px 2px rgba(0,0,0,0.10);
-
- margin: 5px;
- padding: 5px;
- text-align: left;
-
- max-height: 20px;
- overflow: hidden;
-
- background: {
- color: #222;
- color: rgba(0,0,0,0.2);
- }
-
- border: {
- left: 1px solid #444;
- right: 1px solid #444;
- bottom: 1px solid #555;
- top: 1px solid #111;
- }
-
- .img {
- margin-right: 5px;
- }
-
- i {
- margin-top: 1px;
- }
+.control-icons {
+ a {
+ margin-right: 5px;
+ &:hover { text-decoration: none; }
- .avatar {
- @include border-radius();
- margin-right: 0;
+ i.entypo {
+ color: $text-grey;
+ font-size: $font-size-text;
+ line-height: $line-height;
+ vertical-align: middle;
+ &:hover { color: $text; }
+ &.cross { font-size: $line-height; }
}
- }
-
- #post-comments {
- text-align: left;
- padding-top: 0;
- }
-
- #new-post-comment-container {
- position: relative;
-
- padding: 10px;
- textarea{
- height: 18px;
- width: 318px;
- padding: 4px;
+ &.hide_conversation i {
+ font-size: $line-height*1.5;
}
- form {
- margin-bottom: 0;
+ &.delete_conversation i {
+ font-size: $font-size-text*1.5;
}
- .btn {
- position: absolute;
- right: 10px;
- bottom: 10px;
- font-size: 11px;
- line-height: 16px;
- padding: 5px 9px;
+ &.destroy_participation i {
+ color: $black;
+ &:hover { color: $text-dark-grey; }
}
}
}
-.comment-content h1, .comment-content h2, .comment-content h3, .comment-content h4, .comment-content h5, .comment-content h6 {
- color: white;
- text-shadow: 1px 1px black;
- text-rendering: optimizelegibility;
-}
-
-.post-comment {
- -moz-box-shadow: 0 1px 2px -2px #999;
- -webkit-box-shadow: 0 1px 2px -2px #999;
- box-shadow: 0 1px 2px -2px #999;
-
- border-bottom: 1px solid #333;
-
- p:last-child {
- margin-bottom: 0;
- }
-
- &:last-child {
- box-shadow: none;
- border-bottom: none;
- }
-
- padding: 10px;
- padding-right: 40px;
- margin: 0px;
-
- .avatar {
- @include border-radius();
-
- border: {
- top: 1px solid #222;
- right: 1px solid #444;
- left: 1px solid #444;
- bottom: 1px solid $text-dark-grey;
- }
- }
-
- text-shadow: 0 1px 3px rgba(0,0,0,0.3);
-
- a:hover {
- color: #99CCFF
- }
-
- time {
- color: $text-dark-grey;
- font-size: smaller;
- }
-
- .controls {
- @include transition(opacity);
- @include opacity(0);
-
+.stream_container, #single-post-interactions {
+ .control-icons {
+ z-index: 6;
float: right;
- margin-right: -40px;
- a {
- padding: 3px 5px;
- &:hover {
- text-decoration: none;
- }
+ .block_user,
+ .comment_report,
+ .create_participation,
+ .delete,
+ .destroy_participation,
+ .post_report {
+ display: inline-block;
}
- }
-
- &:hover {
- .controls {
- @include opacity(0.4);
- &:hover {
- @include opacity(1);
- }
+ & > a:hover {
+ text-decoration: none;
}
}
-}
-
-.permalink-wrapper,
-#user-controls {
- height: 30px;
-
- .avatar {
- vertical-align: top;
- height: 27px;
- width: 27px;
- }
-
- a {
- @include opacity(0.6);
- @include transition(opacity, 0.3s);
-
- position: relative;
- z-index: 20;
-
- padding: 1px 4px 0;
- margin-right: 5px;
- line-height: 24px;
-
- i {
- padding: 0;
- margin: 0;
+ .stream_element, .comment, .photo, .stream_element:hover .comment {
+ .control-icons > a {
+ @include transition(opacity);
+ opacity: 0;
}
- color: #fff;
-
- &.label {
- @include box-shadow(0, 0, 2px, rgba(255,255,255,0.9));
- background-color: #000;
- }
-
- &.comment {
- padding-right: 5px;
- margin-right: 0;
- }
-
- &:hover {
- @include opacity(1);
- text-decoration: none;
+ &:hover .control-icons {
+ & > a { opacity: 0.8; }
+ & > a:hover { opacity: 1; }
}
}
}
-
-/* stream specific wrapper */
-#stream-interactions {
- position : fixed;
- top : 0;
- bottom : 0;
- overflow-y : auto;
-
- #post-info {
- text-align : left;
- margin-top : 10px;
- }
-
- #user-controls {
- padding : 7px;
- }
-}
-
-.permalink-wrapper {
- float : right;
- margin-top : 9px;
- margin-right : -5px;
- margin-left : 4px;
-}
diff --git a/app/assets/stylesheets/new_styles/_landing.scss b/app/assets/stylesheets/new_styles/_landing.scss
deleted file mode 100644
index fc070691f..000000000
--- a/app/assets/stylesheets/new_styles/_landing.scss
+++ /dev/null
@@ -1,113 +0,0 @@
-/* le declarations */
-#landing {
- overflow : hidden;
- position : absolute;
- min-height : 100%;
- width : 100%;
- top : 0;
- left : 0;
-
- background : {
- color : #fff;
- }
-
- #sign_up {
- text-align:center;
- position : relative;
- z-index : 20;
-
- border-bottom: 1px solid #ccc;
- padding-bottom:50px;
-
- form {
- label.control-label { width : 80px !important; text-align:right; }
- .controls { margin-left : 100px; }
-
- input[type='submit'] {
- @include transition(background);
- @include box-shadow(0,0,0,0);
-
- font-size:1.2em;
- background : #99CC00;
- color : #fff;
- text-shadow : 0 -1px 0 #669900;
- border : 1px solid $border-dark-grey;
-
- &:hover {
- background : desaturate(#99CC00, 15%);
- }
-
- &:active {
- @include box-shadow(0,0,0,0);
- background : darken(rgb(255, 77, 54), 2%);
- }
- }
- }
- }
-
- #invites {
- margin : 20px 0;
- }
-
- #footer {
- position : absolute;
- bottom : 0;
- left : 0;
- width : 100%;
- padding : 10px 0;
- color : #333;
- text-align : center;
- }
-
- #landing_banner {
- .container {
- position:relative;
- }
-
- text-align:center;
- padding:50px;
- margin-bottom:50px;
- color:#ccc;
- background:#222;
-
- h2 {
- font-weight:100;
- }
-
- .landing-logo {
- margin-bottom:15px;
- height:60px;
- }
-
- .landing-banner-right {
- position:absolute;
- right:0;
-
- a {
- color:#ccc;
- font-size:1.2em;
- font-weight:100;
- padding:5px 10px;
- }
- }
-
- .login-button {
- @include border-radius(3px);
- border:1px solid #666;
- background:#111;
-
- &:hover {
- background:#222;
- border:1px solid $border-dark-grey;
- text-decoration:none;
- }
- }
- }
-
- #steps {
- text-align: center;
- p {
- color: $text-dark-grey;
- }
- }
-}
diff --git a/app/assets/stylesheets/new_styles/_login.scss b/app/assets/stylesheets/new_styles/_login.scss
index 0f9d03c36..a538a15e0 100644
--- a/app/assets/stylesheets/new_styles/_login.scss
+++ b/app/assets/stylesheets/new_styles/_login.scss
@@ -1,81 +1,16 @@
+#login,
#forgot_password,
#reset_password {
- position : absolute;
- top : 0;
- left : 0;
- padding-top : 200px;
- min-width : 100%;
+ padding-top: 25px;
- //color : #fff;
- text-align : center;
-
- label {
- text-transform: uppercase;
- }
-
- input[type=text],
- input[type=password] {
- width : 120px;
- }
-
- #huge-text {
- font-family : Roboto-Light;
- font-size : 200px;
- color : #ddd;
- text-shadow : 0 1px 0 #fff;
- }
-
- #forgot_password_link {
- margin : 40px;
- color : $text-grey;
- clear : all;
- }
-}
-
-#login {
- padding-top: 20px;
.branding-asterisk {
margin: auto;
width: 154px;
height: 154px;
+ margin-bottom: 12px;
}
- .form-signin {
- margin-bottom: 30px;
- .form-control {
- font-size: 16px;
- height: auto;
- padding: 10px;
- padding-left: 40px;
- }
- fieldset {
- margin-bottom: 20px;
- }
- .entypo {
- position: relative;
- display: inline-block;
- width: 20px;
- text-align: center;
- top: -6px;
- left: 12px;
- color: $text-grey;
- font-size: 20px;
- }
- input[type=text], input[type=password] {
- &:focus {
- border: 1px solid #ccc;
- }
- }
- input[type=text] {
- margin-bottom: -24px;
- @include border-radius(5px, 5px, 0, 0);
- }
- input[type=password] {
- margin-bottom: -23px;
- @include border-radius(0, 0, 5px, 5px);
- }
- #forgot_password_link {
- margin-top: 20px;
- }
+ form.block-form {
+ max-width: 400px;
}
}
diff --git a/app/assets/stylesheets/new_styles/_navs.scss b/app/assets/stylesheets/new_styles/_navs.scss
new file mode 100644
index 000000000..d93871c92
--- /dev/null
+++ b/app/assets/stylesheets/new_styles/_navs.scss
@@ -0,0 +1,15 @@
+.nav.nav-tabs{
+ li > a {
+ color: $text-dark-grey;
+ .entypo, .mentionIcon {
+ color: $text-dark-grey;
+ margin-right: 5px;
+ }
+ .mentionIcon { font-weight: 700; }
+ }
+ li.active > a {
+ background-color: $background-grey;
+ color: $black;
+ .entypo, .mentionIcon { color: $black; }
+ }
+}
diff --git a/app/assets/stylesheets/new_styles/_new_mixins.scss b/app/assets/stylesheets/new_styles/_new_mixins.scss
deleted file mode 100644
index f2bc78db9..000000000
--- a/app/assets/stylesheets/new_styles/_new_mixins.scss
+++ /dev/null
@@ -1,86 +0,0 @@
-$light-grey: #999;
-$pane-width: 420px;
-$night-background-color : #333;
-$night-text-color : #999;
-
-/* mixins */
-@mixin center($orient:vertical) {
- display: -webkit-box;
- -webkit-box-orient: $orient;
- -webkit-box-pack: center;
- -webkit-box-align: center;
-
- display: -moz-box;
- -moz-box-orient: $orient;
- -moz-box-pack: center;
- -moz-box-align: center;
-
- display: box;
- box-orient: $orient;
- box-pack: center;
- box-align: center;
-}
-
-@mixin pane-width() {
- width: $pane-width;
- max-width: 100%;
-}
-
-@mixin background-cover() {
- background: no-repeat center center fixed;
- -webkit-background-size: cover;
- -moz-background-size: cover;
- -o-background-size: cover;
- background-size: cover;
-}
-
-@mixin info-container-base() {
- @include box-shadow(0, 6px, 20px, #000);
- @include dark-hatched-bg();
-
- border-top: 1px solid #555;
- color: #ddd;
-}
-
-@mixin info-container() {
- @include info-container-base();
- @include border-radius(3px, 0px);
- @include pane-width();
-
- display: inline-block;
- position: relative;
-
- border-right: 1px solid #444;
- border-left: 1px solid #444;
-
- padding-top: 25px;
-
-/* webkit acceleration */
- -webkit-transform: translateZ(0);
-}
-
-@mixin dark-hatched-bg() {
- background-color: #444;
- background-image: image-url("texture/hatched-dark.png");
-}
-
-@mixin photo-shadow() {
- @include box-shadow(0, 3px, 15px, rgba(0,0,0,0.7));
-}
-
-@mixin media-text() {
- font-size: 2em;
- line-height: 1.2em;
- padding-bottom: 0;
- margin-bottom: 0;
-}
-
-@mixin newspaper-type() {
- font-family: Palatino, times, georgia, serif;
-}
-
-@mixin centered-frame(){
- display: table-cell;
- vertical-align: middle;
- text-align: center;
-}
diff --git a/app/assets/stylesheets/new_styles/_poll.scss b/app/assets/stylesheets/new_styles/_poll.scss
index ddccc0c68..c7eba90ce 100644
--- a/app/assets/stylesheets/new_styles/_poll.scss
+++ b/app/assets/stylesheets/new_styles/_poll.scss
@@ -1,7 +1,3 @@
-@import '../colors';
-@import '../mixins';
-@import 'new_mixins';
-
.poll_form {
border-top: 1px solid $border-grey;
border-bottom: 1px solid $border-grey;
@@ -21,7 +17,7 @@
.progress {
background-image: none;
- @include box-shadow(0, 0, 0);
+ box-shadow: 0 0 0;
margin-bottom: 5px;
height: 10px !important;
@@ -34,7 +30,7 @@
}
.submit[disabled] {
cursor: default;
- color: $light-grey;
+ color: $text-grey;
&:hover, &:active {
background-image: none;
diff --git a/app/assets/stylesheets/new_styles/_registration.scss b/app/assets/stylesheets/new_styles/_registration.scss
index 90e053807..7d006d187 100644
--- a/app/assets/stylesheets/new_styles/_registration.scss
+++ b/app/assets/stylesheets/new_styles/_registration.scss
@@ -1,48 +1,49 @@
#registration {
- position:absolute;
- min-width: 100%;
- min-height: 100%;
- background-color : #afc652;
- color: #fff;
-
- #create-something-text {
- font-family : Roboto-Light;
- font-size : 100px;
- line-height : 100px;
- white-space : nowrap;
+ .ball {
+ height: 633px;
+ max-width: 100%;
+ background: image-url("branding/ball.png") no-repeat;
+ background-size: contain;
}
- #diaspora-hearts {
- font-family : Roboto-Light;
- font-size : 24px;
- margin-top : 0.2em;
- margin-bottom : 1em;
- white-space : nowrap;
- }
+ .v-center {
+ display: table;
+ height: 633px;
- #sign-up-text {
- font-family : Roboto-Bold;
- color : #7f9448;
- margin-bottom : 0.5em;
- }
+ .content {
+ display: table-cell;
+ vertical-align: middle;
- #collage {
- width : 344px;
- height : auto;
- max-width : 95%;
+ #pod-name {
+ text-align: center;
+ margin: 12px;
+ font-size : 35px;
+ }
+ }
}
form {
- .control-label,
- .controls {
- margin-left : auto;
- width : auto;
+ max-width: 400px;
+
+ .captcha_img {
+ position: absolute;
+ left: 10px;
+ width: 120px;
+ top: 169px;
}
- .controls {
- float : right;
+ #user_captcha {
+ font-size: 16px;
+ height: 40px;
+ padding: 10px 10px 10px 130px;
+ line-height: $line-height;
+ box-sizing: border-box;
+ width: 100%;
+ border-bottom: 1px solid $border-grey;
+ border-bottom-left-radius: 5px;
+ border-bottom-right-radius: 5px;
}
-
+
#terms > a {
color: inherit;
text-decoration: underline;
diff --git a/app/assets/stylesheets/new_styles/_settings.scss b/app/assets/stylesheets/new_styles/_settings.scss
index d5324108c..f0679ed8a 100644
--- a/app/assets/stylesheets/new_styles/_settings.scss
+++ b/app/assets/stylesheets/new_styles/_settings.scss
@@ -13,5 +13,8 @@
}
#profile_photo_upload .avatar {
- max-width: 150px;
-} \ No newline at end of file
+ height: auto;
+ width: auto;
+ max-width: 200px;
+ margin-bottom: 10px;
+}
diff --git a/app/assets/stylesheets/new_styles/_spinner.scss b/app/assets/stylesheets/new_styles/_spinner.scss
index ff0ee7161..49086f97e 100644
--- a/app/assets/stylesheets/new_styles/_spinner.scss
+++ b/app/assets/stylesheets/new_styles/_spinner.scss
@@ -1,23 +1,13 @@
-@-webkit-keyframes fade-in {
+@keyframes fade-in {
0% { opacity: 0; }
100% { opacity: 1; }
}
-@-webkit-keyframes spin {
+@keyframes spin {
0% { -webkit-transform: rotate(0deg); }
100% { -webkit-transform: rotate(360deg); }
}
-@-moz-keyframes fade-in {
- 0% { opacity: 0; }
- 100% { opacity: 1; }
-}
-
-@-moz-keyframes spin {
- 0% { -moz-transform: rotate(0deg); }
- 100% { -moz-transform: rotate(360deg); }
-}
-
#paginate, #infscr-loading {
margin-top: 10px;
padding: 8px 0;
@@ -28,16 +18,12 @@
}
.loaded {
- -webkit-animation: fade-in 0.16s linear;
- -moz-animation: fade-in 0.16s linear;
+ animation: fade-in 0.16s linear;
}
.loader {
- -webkit-mask-image: image-url('static-loader.png');
- -webkit-animation: spin 1s infinite ease-in-out,
- fade-in 0.2s ease-in;
- -moz-animation: spin 1s infinite ease-in-out,
- fade-in 0.2s ease-in;
+ mask-image: image-url('static-loader.png');
+ animation: spin 1s infinite ease-in-out, fade-in 0.2s ease-in;
background-image : image-url("static-loader.png");
diff --git a/app/assets/stylesheets/new_styles/_statistics.scss b/app/assets/stylesheets/new_styles/_statistics.scss
new file mode 100644
index 000000000..30a9a871b
--- /dev/null
+++ b/app/assets/stylesheets/new_styles/_statistics.scss
@@ -0,0 +1,28 @@
+.page-statistics {
+ h1{ text-align: center; }
+
+ h3{
+ margin: 0px;
+ padding: 10px;
+ background-color: $green;
+ }
+
+ .span-3 {
+ width: 30%;
+ height: 150px;
+ text-align: center;
+ border: 1px solid $border-grey;
+ margin-bottom: 10px;
+ border-radius: 5px;
+ .data{
+ word-wrap: break-word;
+ overflow: hidden;
+ margin-top: 25px;
+ font-size: 25px;
+ line-height: 30px;
+ }
+ .serv-disabled{
+ background-color: $background-grey;
+ }
+ }
+} \ No newline at end of file
diff --git a/app/assets/stylesheets/new_styles/_variables.scss b/app/assets/stylesheets/new_styles/_variables.scss
deleted file mode 100644
index a53110274..000000000
--- a/app/assets/stylesheets/new_styles/_variables.scss
+++ /dev/null
@@ -1,11 +0,0 @@
-$container-width : 1170;
-
-$margin-between-columns : 30;
-$column-width : 295 - $margin-between-columns;
-$raw-two-column-width : ($column-width * 2) + ($margin-between-columns * 2) ;
-$two-column-width : $raw-two-column-width - 30; //simply subtract an arbitrary ammount :)
-
-$margin-between-rows : 20;
-
-$row-height : $column-width;
-$two-row-height : $raw-two-column-width - 20;
diff --git a/app/assets/stylesheets/new_styles/_viewer_nav.scss b/app/assets/stylesheets/new_styles/_viewer_nav.scss
deleted file mode 100644
index 36b847652..000000000
--- a/app/assets/stylesheets/new_styles/_viewer_nav.scss
+++ /dev/null
@@ -1,18 +0,0 @@
-@import '../mixins';
-
-body.idle {
- #post-nav {
- @include opacity(0);
-
- .nav-arrow{
- &.right {
- margin-right: -40px;
- }
-
- &.left {
- margin-left: -40px;
- }
- }
-
- }
-}
diff --git a/app/assets/stylesheets/notifications.css.scss b/app/assets/stylesheets/notifications.scss
index a2998d139..d784105c7 100644
--- a/app/assets/stylesheets/notifications.css.scss
+++ b/app/assets/stylesheets/notifications.scss
@@ -1,18 +1,8 @@
#notifications_container {
.nav.nav-tabs{
li > a {
- color: $text-dark-grey;
- .entypo {
- color: $text-dark-grey;
- margin-right: 5px;
- }
.badge.badge-default { display: none; }
}
- li.active > a {
- background-color: $background-grey;
- color: $black;
- .entypo { color: $black; }
- }
}
.stream {
@@ -25,14 +15,31 @@
margin-bottom: 10px;
}
+ .year_container { margin-top: 40px; }
+ .year {
+ background-color: $white;
+ color: $text-grey;
+ font-size: 40px;
+ line-height: 40px;
+ margin-bottom: -20px;
+ text-align: center;
+ }
+
+ .year_container + .day_group {
+ border-top: 1px solid $border-grey;
+ padding-top: 60px;
+ }
+
+ .day_group + .day_group {
+ border-top: 1px dashed $border-grey;
+ margin-top: 10px;
+ padding-top: 10px;
+ }
+
.day_group {
- margin-bottom: 10px;
- padding-bottom: 10px;
- border-bottom: 1px dashed $border-grey;
- &:last-child { border-bottom: none; }
.date {
text-align: center;
- color: $light-grey;
+ color: $text-grey;
.day {
font-size: 40px;
line-height: 40px;
@@ -88,5 +95,7 @@
}
.pagination { text-align: center; }
+
+ .no_notifications { text-align: center; }
}
}
diff --git a/app/assets/stylesheets/oembed.scss b/app/assets/stylesheets/oembed.scss
new file mode 100644
index 000000000..592ca5a76
--- /dev/null
+++ b/app/assets/stylesheets/oembed.scss
@@ -0,0 +1,12 @@
+.oembed {
+ background: image-url("ajax-loader2.gif") no-repeat center center;
+ width: 100%;
+ .thumb, iframe { margin: 10px auto; }
+ .thumb {
+ @include video-overlay;
+ }
+ iframe, .thumb img {
+ width: 100%;
+ min-height: 60%;
+ }
+}
diff --git a/app/assets/stylesheets/opengraph.css.scss b/app/assets/stylesheets/opengraph.scss
index b0f877e4c..b0f877e4c 100644
--- a/app/assets/stylesheets/opengraph.css.scss
+++ b/app/assets/stylesheets/opengraph.scss
diff --git a/app/assets/stylesheets/people.css.scss b/app/assets/stylesheets/people.css.scss
deleted file mode 100644
index 682d412a9..000000000
--- a/app/assets/stylesheets/people.css.scss
+++ /dev/null
@@ -1,17 +0,0 @@
-#people_search {
- #people_stream {
- .stream_element {
- border-bottom: 1px solid $border-grey;
- padding-right: 10px;
- .avatar {
- width: 50px;
- height: 50px;
- }
- .info { font-size: 11px; }
- }
- }
- #search_title {
- .term { font-weight: 700; }
- small { margin-left: 15px; }
- }
-}
diff --git a/app/assets/stylesheets/people.scss b/app/assets/stylesheets/people.scss
new file mode 100644
index 000000000..c217dcca4
--- /dev/null
+++ b/app/assets/stylesheets/people.scss
@@ -0,0 +1,29 @@
+#people_search {
+ #search_title {
+ .term { font-weight: 700; }
+ small { margin-left: 15px; }
+ }
+}
+#people_stream {
+ .media, .media-body {
+ overflow: visible;
+ }
+ .stream_element.media {
+ border-bottom: 1px solid $border-grey;
+ padding: 10px;
+ margin: 0px;
+ font-size: 13px;
+ line-height: 16px;
+ min-height: 50px;
+ .avatar {
+ width: 50px;
+ height: 50px;
+ }
+ .btn-group.aspect_membership_dropdown { margin: 12px 0; }
+ .thats_you {
+ line-height: 50px;
+ margin-right: 10px;
+ }
+ .info { font-size: 11px; }
+ }
+}
diff --git a/app/assets/stylesheets/photo.css.scss b/app/assets/stylesheets/photo.css.scss
deleted file mode 100644
index 5450bff44..000000000
--- a/app/assets/stylesheets/photo.css.scss
+++ /dev/null
@@ -1,19 +0,0 @@
-.photo {
- .controls:first-child {
- .control_icon {
- @include transition(opacity);
- @include opacity(0);
- }
- }
-
- &:hover {
- .controls:first-child {
- .control_icon {
- @include opacity(0.3);
- }
- .control_icon:hover {
- @include opacity(1);
- }
- }
- }
-} \ No newline at end of file
diff --git a/app/assets/stylesheets/poll.css.scss b/app/assets/stylesheets/poll.css.scss
deleted file mode 100644
index 590dd8502..000000000
--- a/app/assets/stylesheets/poll.css.scss
+++ /dev/null
@@ -1,32 +0,0 @@
-@import 'new_styles/poll';
-
-.poll_form {
- .pull-right {
- float: right;
- }
- label {
- display: block;
- font-size: 13px;
- font-weight: normal;
- line-height: 20px;
- padding-left: 20px;
-
- input[type=radio] {
- float: left;
- margin-left: -20px;
- }
- &:HOVER {
- cursor: pointer;
- }
- }
- .progress {
- overflow: hidden;
- background-color: #f6f6f6;
- @include border-radius(4px);
-
- .bar {
- height: 100%;
- float: left;
- }
- }
-}
diff --git a/app/assets/stylesheets/popover.css.scss b/app/assets/stylesheets/popover.css.scss
deleted file mode 100644
index 1e29e5d5f..000000000
--- a/app/assets/stylesheets/popover.css.scss
+++ /dev/null
@@ -1,28 +0,0 @@
-.popover {
- .close {
- @include opacity(0);
- @include transition(opacity, 0.2s);
- position: relative;
- top: 1px;
- right: -5px;
- float: right;
- .icons-deletelabel {
- height: 14px;
- width: 14px;
- }
-
- img { margin-top: 10px; }
- }
-
- &:hover {
- .close {
- @include opacity(0.5);
-
- &:hover { @include opacity(1); }
- }
- }
-}
-body {
- .popover { z-index: 1000; }
-}
-
diff --git a/app/assets/stylesheets/popup.css.scss b/app/assets/stylesheets/popup.css.scss
deleted file mode 100644
index c1391081d..000000000
--- a/app/assets/stylesheets/popup.css.scss
+++ /dev/null
@@ -1,106 +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.
-
-@import "mixins";
-@import "colors";
-
-body, html{
- padding: 20px;
-}
-
-body, html, header, footer, ul{
- padding: 0;
- margin: 0;
-}
-
-header,
-footer{
- width: 100%;
- left: 0;
-}
-
-header{
- top: 0;
-}
-
-footer{
- bottom: 0;
- padding: 5px 0;
- color: #444;
-}
-
-header{
- position: relative;
- font-size: 12px;
- padding-top: 8px;
- padding-bottom: 0px;
- font-weight: 700;
- color: #fff;
- vertical-align: top;
- margin-bottom: 20px;
-
- #asterisk{
- position: relative;
- margin-right: 3px;
- top: -2px;
- left: 10px;
- margin-right: 14px;
- }
-}
-
-footer{
- position: absolute;
- background-color: $background-grey;
- border-top: 1px solid #ccc;
- bottom: 0;
- left: 0;
-}
-
-#popup-contents{
- width: 700px;
- text-align:center;
-}
-
-#popup-content-left,
-#popup-content-right{
- text-align: left;
- display: inline-block;
- vertical-align: top;
- padding: 20px;
-}
-
-#popup-content-left{
- width: 400px;
-}
-
-#popup-content-right{
- width: 200px;
- border-left: 3px solid #555;
- text-align: center;
-}
-
-ul#requested-scopes{
- padding-left: 20px;
- margin-top: 5px;
-
- li{
- position: relative;
- padding: 5px;
- padding-left: 50px;
- min-height: 40px;
- margin-bottom: 15px;
- }
-
- .scope-photo{
- height: 35px;
- width: 35px;
- left: 0;
- position: absolute;
-
- *{
- max-height: 100%;
- max-width: 100%;
- }
- }
-}
diff --git a/app/assets/stylesheets/post-content.scss b/app/assets/stylesheets/post-content.scss
new file mode 100644
index 000000000..3300d25f5
--- /dev/null
+++ b/app/assets/stylesheets/post-content.scss
@@ -0,0 +1,21 @@
+.post-content {
+ .photo_attachments {
+ margin-top: 7px;
+ padding-bottom: 10px;
+ text-align: center;
+ img {
+ &.big_stream_photo {
+ display: block;
+ max-width: 100%;
+ }
+ &.thumb_small {
+ display: inline;
+ max-width: 50px;
+ max-height: 50px;
+ }
+ margin-left: auto;
+ margin-right: auto;
+ padding-bottom: 5px;
+ }
+ }
+}
diff --git a/app/assets/stylesheets/profile.css.scss b/app/assets/stylesheets/profile.css.scss
deleted file mode 100644
index a826ca2ba..000000000
--- a/app/assets/stylesheets/profile.css.scss
+++ /dev/null
@@ -1,125 +0,0 @@
-
-.profile_photo {
- img {
- height: auto;
- width: 200px;
- }
-}
-
-#profile {
- h3 { margin-bottom: 0; }
- ul {
- margin: 0;
- padding: 0;
- }
-
- ul#profile_information {
- margin: 1em 0;
- > li {
- margin-bottom: 2em;
- margin-right: 2em;
- h4 { font-weight: bold; }
- }
- }
-
- .image_list {
- .section {
- margin-bottom: 4px;
- }
- img {
- height: 45px;
- width: 45px;
- }
- }
-
- .blocked {
- background-color: rgb(244, 42, 42);
- .profile_button {
- width: 150px;
- }
- }
- .mutual {
- background-color: rgb(142, 222, 61);
- .profile_button {
- width: 50px;
- }
- }
- .only_sharing {
- background-color: rgb(142, 222, 61);
- .profile_button {
- width: 150px;
- }
- }
- .receiving {
- background-color: rgb(211, 211, 211);
- .profile_button {
- width: 75px;
- }
- }
- .not_sharing {
- background-color: rgb(211, 211, 211);
- .profile_button {
- width: 150px;
- }
- }
-
- #profile_buttons {
- width: 190px;
- padding-right: 10px;
- height: 28px;
- text-align: center;
- @include border-bottom-radius(8px);
-
- .sharing_message_container {
- float: left;
- padding: 5px 1px;
- @include opacity(0.3);
- background-color: white;
- @include border-bottom-left-radius(8px);
- }
-
- .profile_button {
- display: inline-block;
- text-align: center;
- }
-
- a { @include opacity(0.5); }
- a:hover { @include opacity(1); }
-
- .icons-check_yes_ok {
- display: inline-block;
- height: 18px;
- width: 18px;
- }
- .icons-circle {
- display: inline-block;
- height: 18px;
- width: 18px;
- }
- .icons-ignoreuser {
- display: inline-block;
- height: 14px;
- width: 14px;
- margin: 7px 0;
- }
- .icons-mention {
- display: inline-block;
- height: 18px;
- width: 19px;
- margin: 5px 0;
- }
- .icons-message {
- display: inline-block;
- height: 18px;
- width: 25px;
- margin: 5px 0;
- }
- .white_bar {
- display: inline-block;
- height: 18px;
- width: 1px;
- background-color: white;
- margin: 5px 0;
- }
- }
-}
diff --git a/app/assets/stylesheets/profile.scss b/app/assets/stylesheets/profile.scss
new file mode 100644
index 000000000..7c868ff55
--- /dev/null
+++ b/app/assets/stylesheets/profile.scss
@@ -0,0 +1,130 @@
+#profile_container {
+ .profile_header {
+ margin-bottom: 20px;
+ border-left: 1px solid #dddddd;
+ padding-left: 10px;
+ padding-top: 20px;
+ margin-left: -10px;
+ margin-top: -20px;
+
+ #edit_profile, #unblock_user_button, .aspect_dropdown {
+ margin-top: 5px;
+ margin-right: 10px;
+ }
+
+ #author_info {
+ h2 {
+ line-height: 35px;
+ margin-top: 10px;
+ margin-bottom: 0px;
+ }
+ #name {
+ font-weight: 700;
+ }
+ #diaspora_handle {
+ color: $text-grey;
+ font-size: 20px;
+ }
+ #sharing_message {
+ cursor: default;
+ font-size: 20px;
+ &.circle {
+ color: $text-grey;
+ &:before { content: '\26aa'; }
+ }
+ &.entypo.check { color: darken($green,20%); }
+ }
+ .description {
+ margin-bottom: 20px;
+ .tag {
+ background-color: transparent;
+ font-size: $font-size-text;
+ }
+ .tag:not(.entypo) {
+ font-weight: 700;
+ }
+ .entypo.tag {
+ margin: 0 5px;
+ font-weight: normal;
+ &:hover {text-decoration: none;}
+ }
+ }
+ }
+
+ #profile_horizontal_bar {
+ border-top: 1px dashed $border-grey;
+ border-bottom: 1px solid $border-grey;
+ min-height: 50px;
+ margin-top: 10px;
+ #profile_buttons {
+ padding: 10px 0;
+ > .profile_button {
+ text-decoration: none;
+ cursor: pointer;
+ margin-right: 25px;
+ .entypo.profile-header-icon, .profile-header-icon {
+ font-size: 24.5px;
+ line-height: 30px;
+ color: lighten($black,75%);
+ &:hover { color: $black; }
+ }
+ #mention_button { font-weight: 700; }
+ }
+ }
+
+ ul#profile_nav {
+ list-style: none;
+ margin: 0;
+ > li {
+ display: inline-block;
+ &.active {
+ border-bottom: 3px solid $creation-blue;
+ a {
+ color: $black;
+ .entypo { color: $black; }
+ }
+ }
+ a {
+ padding: 10px 15px;
+ font-size: 16px;
+ line-height: 46px;
+ color: lighten($black,50%);
+ .entypo {
+ color: lighten($black,50%);
+ margin-right: 2px;
+ }
+ &:hover {
+ color: $black;
+ .entypo { color: $black; }
+ text-decoration: none;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ #profile {
+ padding: 10px 20px;
+ #profile_photo {
+ margin-top: 10px;
+ padding-bottom: 10px;
+ border-bottom: 1px dashed $border-grey;
+ text-align: center;
+ }
+
+ ul#profile_information {
+ margin: 0;
+ list-style: none;
+ overflow-x: hidden;
+ word-wrap: break-word;
+ > li {
+ margin-bottom: 2em;
+ h4 { font-weight: bold; }
+ }
+ }
+
+ }
+
+ .stream_container > .pagination { text-align: center; }
+}
diff --git a/app/assets/stylesheets/publisher.css.scss b/app/assets/stylesheets/publisher.scss
index 696f573d6..462a13080 100644
--- a/app/assets/stylesheets/publisher.css.scss
+++ b/app/assets/stylesheets/publisher.scss
@@ -1,32 +1,33 @@
#publisher {
z-index: 1;
color: $text-grey;
-
+
&.closed {
#button_container,
#location_container,
#hide_publisher,
#photodropzone_container,
+ .counter,
.options_and_submit {
display: none !important;
}
-
+
#publisher_textarea_wrapper { border: 1px solid $border-grey !important; }
}
-
+
.mentions-autocomplete-list ul { width: 100% !important; }
-
+
form {
margin: 0;
#fileInfo { display: none !important; }
#hide_publisher {
margin-top: 10px;
}
-
+
#publisher_spinner {
text-align: center;
}
-
+
.options_and_submit {
#publisher_service_icons {
.btn-link { text-decoration: none; }
@@ -36,7 +37,7 @@
padding-left: 5px;
padding-right: 5px;
}
- .dim { @include opacity(0.3); }
+ .dim { opacity: 0.3; }
.social_media_logos-wordpress-16x16 {
display: inline-block;
height: 16px;
@@ -44,13 +45,13 @@
}
}
}
-
+
#publisher_textarea_wrapper {
background-color: white;
border-radius: 3px;
border: 1px solid $border-dark-grey;
- input[type='text'] {
+ input[type='text']#status_message_text {
border: none;
box-shadow: none;
margin: none;
@@ -67,7 +68,7 @@
&.active textarea {
min-height: 70px;
}
-
+
.help-block {
font-size: 13px;
line-height: 30px;
@@ -76,36 +77,40 @@
color: lighten($text-grey,20%);
a { color: lighten($blue,20%); }
}
-
+
.mentions-input-box .mentions {
- padding: 4px 6px !important;
- line-height: 20px !important;
- width: 100% !important;
+ line-height: $line-height !important;
}
&.with_attachments .row-fluid#photodropzone_container {
- border-top: 1px dashed $border-grey;
+ border-top: 1px dashed $border-grey;
}
- #poll_creator_wrapper {
- display:none;
+ .row-fluid#poll_creator_container {
+ display: none;
border-top: 1px dashed $border-grey;
padding:4px 6px 4px 6px;
box-sizing: border-box;
- -moz-box-sizing: border-box;
- -webkit-box-sizing: border-box;
+ .remove-answer.entypo.cross {
+ display: none;
+ color: lighten($black,75%);
+ &.active { display: block; }
+ &:hover { color: $black; }
+ line-height: 30px;
+ font-size: 18px;
+ cursor: pointer;
+ }
}
&.with_location .row-fluid#location_container {
height: 30px;
- #hide_location { display: none !important; }
border-top: 1px dashed $border-grey;
- input[type='text'] {
+ input[type='text'] {
margin-bottom: 0;
color: $text-grey;
}
}
- &.active .row-fluid#button_container {
+ &.active .row-fluid#button_container {
border-top: 1px solid $border-grey;
}
@@ -120,13 +125,13 @@
overflow: hidden;
line-height: 80px;
vertical-align: middle;
-
+
img {
vertical-align: middle;
width: 80px;
}
- .x {
+ .x {
display: none;
width: 50px;
height: 50px;
@@ -139,11 +144,11 @@
font-style: bold;
position: absolute;
z-index: 2;
- @include opacity(0.85);
+ opacity: 0.85;
cursor: pointer;
top: 15px;
left: 15px;
-
+
&:before {
content: '\2716';
font-family: 'entypo';
@@ -153,17 +158,17 @@
&:hover .x {
display: inline-block;
}
-
- .progress {
+
+ .progress {
width: 100%;
height: 20px;
margin: 30px 0;
}
-
+
.ajax-loader { display: none; }
}
}
-
+
#upload_error {
color: white;
font-style: bold;
@@ -171,7 +176,7 @@
background-color: $red;
text-align: center;
}
-
+
#publisher-images {
margin-right: 5px;
#file-upload,
@@ -181,13 +186,13 @@
text-decoration: none !important;
font-size: 16px;
padding: 4px 5px;
- i {
+ i {
color: $text-grey;
}
&:hover{
i { color: black; }
}
- input[type='file'] {
+ input[type='file'] {
cursor: pointer;
&::-webkit-file-upload-button {
cursor: pointer;
@@ -207,7 +212,7 @@
height: 30px;
line-height: 30px;
position: absolute;
- right: 70px;
+ right: 100px;
bottom: -31px;
font-size: 13px;
}
@@ -220,7 +225,7 @@
.exceeded {
color: red;
}
- }
+ }
}
.aspect_dropdown {
diff --git a/app/assets/stylesheets/publisher_blueprint.css.scss b/app/assets/stylesheets/publisher_blueprint.css.scss
deleted file mode 100644
index 9c81db04c..000000000
--- a/app/assets/stylesheets/publisher_blueprint.css.scss
+++ /dev/null
@@ -1,409 +0,0 @@
-#publisher {
- z-index: 1;
- color: $text-grey;
- position: relative;
- margin-top: 0;
- margin-bottom: 0;
- padding: 0 12px 22px 12px;
- top: 0;
- border-bottom: 1px #eee solid;
-
- form {
- textarea {
- resize: none;
- height: 50px;
- margin: 0;
- }
- }
-
- &.mention_popup {
- padding: 1px 12px;
- margin-bottom: 0;
- border-bottom: none;
- }
-
- &.closed {
- .options_and_submit {
- display: none !important;
- }
-
- .counter {
- display: none;
- }
- }
-
- &:not(.closed) {
- textarea {
- margin-bottom: 30px;
- }
- }
-
- .mentions-autocomplete-list ul {
- width: 483px;
- }
-
- #publisher_spinner {
- clear: both;
- margin-bottom: -2px;
- min-height: 21px;
- padding-top: 6px;
- position: relative;
- text-align: center;
- }
-
- .options_and_submit {
- min-height: 21px;
- clear: both;
- position: relative;
- padding-top: 6px;
- margin-bottom: -2px;
-
- input {
- display: inline;
- }
-
- .public_toggle {
- text-align: right;
- .dropdown {
- text-align: left;
- }
-
- .icons-monotone_wrench_settings {
- display: inline-block;
- width: 16px;
- height: 16px;
- }
-
- a.question_mark {
- text-decoration: none;
- }
- }
-
- #publisher_service_icons {
- position: relative;
- top: 3px;
- margin-right: 10px;
-
- .social_media_logos-facebook-16x16,
- .social_media_logos-twitter-16x16,
- .social_media_logos-tumblr-16x16,
- .social_media_logos-wordpress-16x16,
- .social_media_logos-email-16x16,
- .social_media_logos-feed-16x16,
- .social_media_logos-website-16x16 {
- display: inline-block;
- height: 16px;
- width: 16px;
- }
- }
-
- #fileInfo {
- display: inline;
- position: relative;
- top: -2px;
- }
- }
-
- #status_message_fake_text {
- min-height: 20px;
- }
-
- .content_creation {
- margin-top: 1em;
- }
-
- #file-upload {
- bottom: 1px !important;
- display: inline-block;
- margin: 0;
- padding: .3em .3em 3px;
- position: absolute !important;
- right: 6px;
- cursor: pointer;
-
- input[type='file'] {
- cursor: pointer;
- right: initial !important;
- height: 100%;
- width: 100%;
- &::-webkit-file-upload-button {
- cursor: pointer;
- }
- }
-
- img {
- @include opacity(0.4);
- vertical-align: bottom;
- }
-
- &:hover {
- color: $text-dark-grey;
- cursor: pointer;
-
- img {
- @include opacity(0.8);
- }
- }
-
- &:active {
- color: #444;
- text-shadow: 0 1px 0 #fafafa;
-
- img {
- @include opacity(1);
- }
- }
-
- &.loading {
- @include opacity(0.5);
- }
- }
-}
-
-#publisher_textarea_wrapper {
- #hide_publisher {
- @include opacity(0.3);
- z-index: 5;
- padding: 3px;
- position: absolute;
- right: 6px;
- margin-top: 9px;
-
- .icons-deletelabel {
- height: 14px;
- width: 14px;
- }
-
- &:hover {
- @include opacity(1);
- }
- }
-
- .markdownIndications {
- position: absolute;
- bottom: 0px;
- }
-
- @include border-radius(2px);
-
- border: 1px solid #ccc;
- background: #fff;
-
- &.active {
- border: 1px solid $border-dark-grey;
- }
-
- position: relative;
- padding-right: 10px;
-
- textarea {
- z-index: 2;
- border: none;
-
- &:focus {
- outline: 0;
- background: transparent;
- }
- }
-
- &.with_attachments {
- padding-bottom: 38px;
- }
-
- #photodropzone {
- z-index: 3;
- position: absolute;
- bottom: 15px;
- right: 35px;
- width: 430px;
- left: 5px;
- padding: 0;
-
- li {
- display: inline-block;
- margin-right: 4px;
- img {
- width: 50px;
- max-height: 55px;
- }
- .circle {
- @include border-radius(20px);
-
- display: none;
- z-index: 1;
- position: absolute;
- right: -7px;
- top: -5px;
- background-color: #333;
-
- width: 20px;
- max-width: 20px;
- height: 20px;
- max-height: 20px;
- border: 1px solid #fff;
- }
-
- .x {
- display: none;
- z-index: 2;
- position: absolute;
- top: -3px;
- right: -1px;
- font-size: small;
- font-weight: bold;
- &:before {
- content: 'X';
- }
- }
-
- &:hover {
- cursor: default;
- .circle {
- display: block;
- }
- .x {
- display: block;
- }
- }
- }
- }
-
- .counter {
- position: absolute;
- font-size: 13px;
- padding: 12px 0 0 5px;
- }
- .warning {
- color: orange;
- }
- .exceeded {
- color: red;
- }
-}
-
-#publisher.closed {
- #publisher_textarea_wrapper #hide_publisher,
- .markdownIndications {
- display: none;
- }
-}
-
-#publisher_photo_upload {
- position: absolute;
- display: inline;
- left: 600px;
- top: 0;
- z-index: 10;
-}
-
-#publisher-images {
- padding-left: 5px;
-
- #locator {
- bottom: 1px !important;
- display: inline-block;
- margin: 0;
- position: absolute !important;
- right: 30px;
- cursor: pointer;
- img {
- padding-top: 2px;
- @include opacity(0.4);
- }
- &:hover {
- color: $text-dark-grey;
- cursor: pointer;
- img {
- @include opacity(0.8);
- }
- }
- }
- #poll_creator {
- bottom: 1px !important;
- display: inline-block;
- margin: 0;
- cursor: pointer;
- position: absolute !important;
- right: 55px;
- i {
- @include opacity(0.4);
- }
- &:hover {
- color: $text-dark-grey;
- cursor: pointer;
- i {
- @include opacity(1);
- }
- }
- }
-
- .btn {
- height: 19px;
- width: 19px;
- }
-}
-
-#publisher-poll-creator {
- border: 1px solid $border-dark-grey;
- padding: 5px;
- margin-top: 5px;
- @include border-radius(2px);
- display: none;
-
- &.active {
- display: block;
- }
- input {
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- margin-bottom: 0px;
- }
- .poll-question input {
- width: 100%;
- }
- .controls {
- float: none;
- z-index: none;
- }
- .control-group {
- &.error {
- color: $red;
- background: transparent;
- border: none;
- padding: 0px;
-
- input {
- border-color: $red;
- }
- }
- }
- .poll-answer {
- input {
- width: 96%;
- display: inline-block;
- vertical-align: bottom;
- }
- .remove-answer {
- width: 14px;
- height: 14px;
- @include opacity(0.4);
- cursor: pointer;
- vertical-align: top;
- margin-top: 7px;
- display: none;
-
- &:hover {
- @include opacity(1);
- }
- &.active {
- display: inline-block;
- }
- }
- }
- .control-group {
- margin-bottom: 5px;
- }
- .add-answer {
- padding-top: 5px;
- }
-}
diff --git a/app/assets/stylesheets/report.css.scss b/app/assets/stylesheets/report.scss
index d964b55cd..d964b55cd 100644
--- a/app/assets/stylesheets/report.css.scss
+++ b/app/assets/stylesheets/report.scss
diff --git a/app/assets/stylesheets/rtl.css.scss b/app/assets/stylesheets/rtl.scss
index 0cbfb9b8c..b46cf4d8b 100644
--- a/app/assets/stylesheets/rtl.css.scss
+++ b/app/assets/stylesheets/rtl.scss
@@ -251,10 +251,6 @@ ul.comments li form p, ul.show_comments li form p, div.likes li form p, div.disl
right: 35px;
}
-ul.comments li.posted .controls .delete {
- float: left
-}
-
.stream .stream_element time {
right: auto;
left: 20px;
diff --git a/app/assets/stylesheets/scaffolds.css.scss b/app/assets/stylesheets/scaffolds.css.scss
deleted file mode 100644
index 931b39d5f..000000000
--- a/app/assets/stylesheets/scaffolds.css.scss
+++ /dev/null
@@ -1,56 +0,0 @@
-body {
- background-color: #fff;
- color: #333;
- font-family: verdana, arial, helvetica, sans-serif;
- font-size: 13px;
- line-height: 18px; }
-
-p, ol, ul, td {
- font-family: verdana, arial, helvetica, sans-serif;
- font-size: 13px;
- line-height: 18px; }
-
-pre {
- background-color: #eee;
- padding: 10px;
- font-size: 11px; }
-
-a {
- color: #000;
- &:visited {
- color: $text-dark-grey; }
- &:hover {
- color: #fff;
- background-color: #000; } }
-
-div {
- &.field, &.actions {
- margin-bottom: 10px; } }
-
-#notice {
- color: green; }
-
-.field_with_errors {
- padding: 2px;
- background-color: red;
- display: table; }
-
-#error_explanation {
- width: 450px;
- border: 2px solid red;
- padding: 7px;
- padding-bottom: 0;
- margin-bottom: 20px;
- background-color: #f0f0f0;
- h2 {
- text-align: left;
- font-weight: bold;
- padding: 5px 5px 5px 15px;
- font-size: 12px;
- margin: -7px;
- margin-bottom: 0px;
- background-color: #c00;
- color: #fff; }
- ul li {
- font-size: 12px;
- list-style: square; } }
diff --git a/app/assets/stylesheets/sessions.css.scss b/app/assets/stylesheets/sessions.css.scss
deleted file mode 100644
index f693641f0..000000000
--- a/app/assets/stylesheets/sessions.css.scss
+++ /dev/null
@@ -1,162 +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.
-
-@font-face {
- font-family: 'BrandonGrotesqueLightRegular';
- src: url('brandongrotesque_light/Brandon_light-webfont.eot');
- src: local('☺'), url('brandongrotesque_light/Brandon_light-webfont.woff') format('woff'), url('brandongrotesque_light/Brandon_light-webfont.ttf') format('truetype'), url('brandongrotesque_light/Brandon_light-webfont.svg#webfont') format('svg');
- font: {
- weight: normal;
- style: normal;
- }
-}
-
-#flash_notice,
-#flash_error,
-#flash_alert {
- z-index: 100;
- top: 32px;
- position: absolute;
- color: #000;
- width: 400px;
- margin: 0 0 0 -200px;
- left: 50%;
- text-align: center;
- font-size: 14px;
- padding: 3px 0;
-}
-
-#flash_notice {
- background-color: #CFC;
- border: solid 1px #6C6;
-}
-
-#flash_error,
-#flash_alert {
- background-color: #FCC;
- border: solid 1px #C66;
-}
-
-.fieldWithErrors {
- display: inline;
-}
-
-.error_messages {
- width: 400px;
- border: 2px solid #CF0000;
- padding: 0;
- padding-bottom: 12px;
- margin-bottom: 20px;
- background-color: #f0f0f0;
- font-size: 12px;
- h2 {
- text-align: left;
- padding: 5px 5px 5px 15px;
- margin: 0;
- font: {
- weight: bold;
- size: 12px;
- }
- background-color: #c00;
- }
- p {
- margin: 8px 10px;
- }
- ul {
- margin: 0;
- }
-}
-
-/* via blueprint */
-html {
- font-size: 100.01%;
-}
-
-/* via blueprint */
-body {
- font: {
- size: 75%;
- family: "Helvetica Neue", Arial, Helvetica, sans-serif;
- }
- color: #222;
- background: #fff;
-
- margin-left: 100px;
-}
-
-/* via blueprint */
-input[type=text],
-input[type=password],
-textarea, select {
- background-color: #fff;
- border: 1px solid #bbb;
-}
-
-/* via blueprint */
-input[type=text]:focus,
-input[type=password]:focus,
-input.text:focus,
-input.title:focus,
-textarea:focus, select:focus {
- border-color: #666;
-}
-
-#huge_text {
- font: {
- size: 40px;
- family: 'BrandonGrotesqueLightRegular';
- }
- line-height: 120px;
- color: #333;
- text-shadow: 0 1px 1px #999;
-}
-
-input {
- font-size: 14px;
-}
-
-form p {
- position: relative;
- padding: 0;
-}
-
-label {
- color: #999;
- position: absolute;
- padding-top: 7px;
- left: 8px;
- font: {
- size: 14px;
- weight: normal;
- }
-}
-
-input[type='text'],
-input[type='password'] {
- font-family: "Helvetica Neue", Arial, Helvetica, sans-serif;
- padding: 0.3em;
- width: 395px;
- border-top: 1px solid #999;
-}
-
-#user {
- display: inline;
- width: 500px;
- .username {
- width: 200px;
- display: inline;
-
- input {
- display: inline;
- width: 200px;
- }
- }
-
- .user_network {
- width: 200px;
- display: inline;
- font-size: 18px;
- }
-}
-
diff --git a/app/assets/stylesheets/sidebar.css.scss b/app/assets/stylesheets/sidebar.css.scss
deleted file mode 100644
index 613e78ed8..000000000
--- a/app/assets/stylesheets/sidebar.css.scss
+++ /dev/null
@@ -1,194 +0,0 @@
-#home_user_badge {
- min-height: 50px;
- margin-bottom: 20px;
- margin-left: 4px;
-
- img {
- float: left;
- }
-
- h4 {
- margin-left: 60px;
- padding-top: 15px;
- overflow: hidden;
- text-overflow: ellipsis;
-
- a {
- color: inherit;
- font-weight: bold;
- }
- }
-}
-
-#leftNavBar {
- float: left;
- margin: 0px;
- margin-right: 10px;
-}
-
-#stream_selection {
- & > li {
- margin-bottom: 10px;
- }
-}
-
-#aspects_list {
- .icons-check_yes_ok {
- height:18px;
- width:18px;
- background: url('icons/check_yes_ok.png') no-repeat;
- float: left;
- visibility: hidden;
- }
-
- .selected {
- visibility: visible;
- }
-
- .selected + a {
- color: #333333;
- }
-}
-
-.modify_aspect {
- background: url("icons/pencil.png") no-repeat;
- width: 12px;
- height: 12px;
- display: inline-block;
-}
-
-#tags_list {
- .delete_tag_following {
- background: url("icons/deletelabel.png") no-repeat;
- }
-
- /* ---- override app/stylesheets/vendor/autoSuggest.css ---- */
- .tag_input {
- width: 100%;
- }
-
- .as-result {
- margin-top: -1px;
- margin-left: 1px;
- }
-
- .as-list {
- em {
- background-color: #aabbcc;
- color: black;
- padding: 0px;
- }
-
- color: black;
- position: static; /* override absolute */
- margin: 0px;
- border-radius: 0px 0px 3px 3px;
- box-shadow: 0px 1px 1px #666;
- }
-
- .as-result-item.active {
- color: black;
- text-shadow: none;
- background-color: $background-blue;
- border-color: $background-blue;
- }
- /* ---- end override app/stylesheets/vendor/autoSuggest.css ---- */
-}
-
-.rightBar {
- .section {
- margin-bottom: 20px;
-
- .title {
- position: relative;
- border-bottom: 1px solid $border-grey;
- padding-bottom: 2px;
-
- &.no_icon { padding-left: 8px; }
-
- .right {
- right: 4px;
- top: 3px;
- font-size: smaller;
- font-weight: bold;
- color: $text-dark-grey;
- }
-
- .icons-plus,
- .icons-heart,
- .icons-question,
- .icons-monotone_wrench_settings,
- .icons-coffee,
- .icons-mail,
- .icons-bookmark {
- position: absolute;
- margin-left: 3px;
- }
-
- .icons-plus {
- width: 14px;
- height: 14px;
- }
-
- .icons-heart {
- width: 13px;
- height: 12px;
- }
-
- .icons-question,
- .icons-monotone_wrench_settings {
- width: 16px;
- height: 16px;
- }
-
- .icons-bookmark {
- width: 14px;
- height: 16px;
- }
-
- .icons-coffee {
- width: 16px;
- height: 14px;
- }
-
- .icons-mail {
- width: 16px;
- height: 13px;
- }
-
-
- h5.title-header {
- margin-left: 22px;
- }
-
- h5 {
- font-size: 12px;
- margin: 0;
- color: $text-dark-grey;
- }
- }
-
- .content {
- padding: 8px;
- color: $text-grey;
- font-size: 11px;
-
- p, ul {
- margin: 5px 0px;
- }
-
- ul {
- padding-left: 0;
-
- li {
- list-style: none;
- }
- }
-
- #invite_code {
- width: 100%;
- @include box-sizing(border-box);
- }
- }
- }
-}
diff --git a/app/assets/stylesheets/sidebar.scss b/app/assets/stylesheets/sidebar.scss
new file mode 100644
index 000000000..28d012ceb
--- /dev/null
+++ b/app/assets/stylesheets/sidebar.scss
@@ -0,0 +1,61 @@
+.rightBar {
+ padding-top: 20px;
+
+ .section {
+ margin-bottom: 20px;
+
+ > .title {
+ border-bottom: 1px solid $border-grey;
+ padding-bottom: 2px;
+
+ &.no_icon { padding-left: 8px; }
+
+ h5 {
+ color: $text-dark-grey;
+ font-weight: bold;
+ font-size: 13px;
+ margin: 0;
+ &.title-header { margin-left: 5px; }
+ }
+ }
+
+ .content {
+ color: $text-grey;
+ font-size: 11px;
+ line-height: 18px;
+ padding: 5px;
+
+ p, ul { margin: 0; }
+
+ ul {
+ margin-bottom: 5px;
+ padding-left: 0;
+ li { list-style: none; }
+ }
+
+ & > #invite_code {
+ box-sizing: border-box;
+ font-size: 11px;
+ height: 30px;
+ width: 100%;
+ }
+
+ & > #right_service_icons {
+ text-align: center;
+ padding: 10px {
+ bottom: 0;
+ };
+ .social_media_logos-facebook-24x24,
+ .social_media_logos-twitter-24x24,
+ .social_media_logos-tumblr-24x24,
+ .social_media_logos-wordpress-24x24 {
+ height: 24px;
+ width: 24px;
+ }
+ a {
+ display: inline-block;
+ }
+ }
+ }
+ }
+}
diff --git a/app/assets/stylesheets/single-post-view.css.scss b/app/assets/stylesheets/single-post-view.css.scss
deleted file mode 100644
index cf6ffa3d6..000000000
--- a/app/assets/stylesheets/single-post-view.css.scss
+++ /dev/null
@@ -1,261 +0,0 @@
-#single-post-container {
- padding-top: 20px;
-}
-
-#single-post-content {
- border-right: solid 1px #cccccc;
- padding-right: 12px;
- #head {
- padding-bottom: 10px;
- border-bottom: 1px solid $border-grey;
- #post-info {
- .author{ color: $grey; }
- .info {
- color: lighten($text-grey,10%);
- font-size: 12px;
- .post-time a { color: $text-grey; }
- .post_scope { margin-right: 5px; }
- .status-message-location {
- padding-top: 2px;
- line-height: 14px;
- }
- }
- .avatar.medium {
- max-width: 75px;
- }
- .bd {
- padding-left: 10px;
- }
- }
- .row-fluid.reshare {
- border-top: 1px solid lighten($border-grey,5%);
- padding-top: 10px;
- margin-top: 10px;
- }
- #reshare-info {
- line-height: 15px;
- i.retweet {
- color: $text-dark-grey;
- font-size: 28px;
- line-height: 30px;
- margin-left: 8px;
- margin-right: 8px;
- }
- .post-time a {
- color: $text-grey;
- display: block;
- font-size: 12px;
- }
- .avatar {
- height: 30px;
- width: 30px;
- }
- .img { margin-right: 10px; }
- }
- #single-post-actions {
- padding-right: 5px;
- i {
- font-size: 28px;
- line-height: 30px;
- }
- i.comment:hover {
- color: #424242;
- }
- .post_report i.gray:hover {
- color: $red;
- }
- i.heart.gray:hover {
- color: $red;
- }
- i.heart.red:hover {
- color: #f55f5a;
- }
- i.retweet:hover {
- color: #3f8fba;
- }
- time {
- float: right;
- margin-left: 3px;
- }
- a {
- margin: 0 0 0 6px;
- &:hover {
- text-decoration: none;
- }
- }
- }
- }
-
- #body {
- margin-left: 20px;
- padding-top: 20px;
- width: auto;
- p {
- margin: 0 0 1em 0;
- word-wrap: break-word;
- }
- .photo_attachments {
- padding-bottom: 10px;
- text-align: center;
- img {
- &.big_stream_photo {
- display: block;
- max-width: 90%;
- }
- &.thumb_small {
- display: inline;
- max-width: 50px;
- max-height: 50px;
- }
- margin-left: auto;
- margin-right: auto;
- padding-bottom: 5px;
- }
- }
- .oembed {
- background: image-url("ajax-loader2.gif") no-repeat center center;
- float: left;
- width: 95%;
- .thumb {
- @include video-overlay;
- }
- iframe, .thumb img {
- width: 100%;
- min-height: 60%;
- }
- }
- }
-}
-
-#single-post-interactions {
- border-left: 1px solid #cccccc;
- position: relative;
- left: -1px;
- margin-left: 0;
- padding-left: 15px;
-
- .comments .comment {
- border-bottom: solid 1px #cccccc;
- padding-top: 10px;
- padding-bottom: 10px;
- p {
- margin: 0 0 1em 0;
- word-wrap: break-word;
- &:last-child {
- margin-bottom: 0;
- }
- }
- }
- .no_comments {
- padding-top: 10px;
- padding-bottom: 10px;
- background-color: $background-grey;
- text-align: center;
- @include border-radius(4px);
- margin-bottom: 30px;
- }
-
- textarea {
- width: 95%;
- }
- .new_comment_form_wrapper {
- border-bottom: none;
- }
- a {
- color: #3f8fba;
- }
- .timeago {
- font-size: smaller;
- }
- .count {
- i {
- display: inline-block;
- text-align: center;
- width: 25px;
- vertical-align: middle;
- }
- span {
- margin-left: -3px;
- width: 30px;
- display: inline-block;
- text-align: center;
- }
- }
- #reshares, #likes, #comments-meta {
- margin-left: 7px;
- margin-bottom: 8px;
- }
-}
-
-.comment {
- &:hover {
- .controls {
- @include opacity(0.3);
- }
- }
-
- >.highlighted {
- border-left: 3px solid $blue;
- padding-left: 3px;
- }
-
- .controls {
- @include transition(opacity);
- @include opacity(0);
- z-index: 6;
- float: right;
- &:hover {
- @include opacity(1);
- }
- .comment_report {
- display: inline-block;
- .icons-report {
- height: 14px;
- width: 14px;
- }
- }
- .delete {
- display: inline-block;
- .icons-deletelabel {
- height: 14px;
- width: 14px;
- }
- }
- a:hover {
- text-decoration: none;
- }
- }
- .submit_button {
- input {
- float: right;
- }
- padding-left: 12px;
- width: 95%;
- }
-
- .button.creation {
- $button-border-color: #aaa;
- @include border-radius(3px);
- @include box-shadow(0,1px,1px,#cfcfcf);
- @include transition(border);
- @include button-gradient($creation-blue);
- font: {
- size: 12px;
- }
- color: #fff;
- padding: 4px 9px;
- min-width: 90px;
- min-height: 10px;
- border: 1px solid darken($button-border-color,20%);
-
- cursor: pointer;
- white-space: nowrap;
-
- &:hover {
- @include button-gradient-hover($creation-blue);
- border: 1px solid darken($button-border-color,35%);
- text-decoration: none;
- }
- }
-}
-
diff --git a/app/assets/stylesheets/single-post-view.scss b/app/assets/stylesheets/single-post-view.scss
new file mode 100644
index 000000000..c5a5684a1
--- /dev/null
+++ b/app/assets/stylesheets/single-post-view.scss
@@ -0,0 +1,149 @@
+#single-post-container {
+ padding-top: 20px;
+}
+
+#single-post-content {
+ border-right: solid 1px #cccccc;
+ padding-right: 12px;
+ #head {
+ padding-bottom: 10px;
+ border-bottom: 1px solid $border-grey;
+ #post-info {
+ .author{ color: $grey; }
+ .info {
+ color: lighten($text-grey,10%);
+ font-size: 12px;
+ .post-time a { color: $text-grey; }
+ .post_scope { margin-right: 5px; }
+ .status-message-location {
+ padding-top: 2px;
+ line-height: $font-size-text;
+ }
+ }
+ .bd {
+ padding-left: 10px;
+ }
+ }
+ .row-fluid.reshare {
+ border-top: 1px solid lighten($border-grey,5%);
+ padding-top: 10px;
+ margin-top: 10px;
+ }
+ #reshare-info {
+ line-height: 15px;
+ i.retweet {
+ color: $text-dark-grey;
+ font-size: 28px;
+ line-height: 30px;
+ margin-left: 8px;
+ margin-right: 8px;
+ }
+ .post-context {
+ font-size: 12px;
+
+ #single-post-moderation {
+ margin-left: 5px;
+
+ > div.control-icons {
+ display: inline-block;
+ }
+ }
+ }
+ .post-time a {
+ color: $text-grey;
+ font-size: 12px;
+ }
+ .avatar {
+ height: 30px;
+ width: 30px;
+ }
+ .img { margin-right: 10px; }
+ }
+ #single-post-actions {
+ padding-right: 5px;
+ i {
+ font-size: 28px;
+ line-height: 30px;
+ }
+ i.comment:hover {
+ color: #424242;
+ }
+ .post_report i.gray:hover {
+ color: $red;
+ }
+ i.heart.gray:hover {
+ color: $red;
+ }
+ i.heart.red:hover {
+ color: #f55f5a;
+ }
+ i.retweet:hover {
+ color: #3f8fba;
+ }
+ time {
+ float: right;
+ margin-left: 3px;
+ }
+ a {
+ margin: 0 0 0 6px;
+ &:hover {
+ text-decoration: none;
+ }
+ }
+ }
+ }
+
+ #body {
+ margin-left: 20px;
+ padding-top: 20px;
+ width: auto;
+
+ .oembed { width: 95%; }
+ .photo_attachments {
+ img.big_stream_photo { max-width: 90%; }
+ }
+ }
+}
+
+#single-post-interactions {
+ border-left: 1px solid #cccccc;
+ position: relative;
+ left: -1px;
+ margin-left: 0;
+ padding-left: 15px;
+
+ .comment.media .img {
+ margin-left: 5px;
+ }
+
+ .no_comments {
+ padding-top: 10px;
+ padding-bottom: 10px;
+ background-color: $background-grey;
+ text-align: center;
+ border-radius: 4px;
+ margin-bottom: 30px;
+ }
+
+ a {
+ color: $blue;
+ }
+ .count {
+ i {
+ display: inline-block;
+ text-align: center;
+ width: 25px;
+ vertical-align: middle;
+ }
+ span {
+ margin-left: -3px;
+ width: 30px;
+ display: inline-block;
+ text-align: center;
+ }
+ }
+ #reshares, #likes, #comments-meta {
+ margin-left: 7px;
+ margin-bottom: 8px;
+ }
+}
diff --git a/app/assets/stylesheets/sizes.scss b/app/assets/stylesheets/sizes.scss
new file mode 100644
index 000000000..3679382d4
--- /dev/null
+++ b/app/assets/stylesheets/sizes.scss
@@ -0,0 +1,2 @@
+$font-size-text: 13px;
+$line-height: 20px;
diff --git a/app/assets/stylesheets/sprites.css.scss b/app/assets/stylesheets/sprites.scss
index 686161f75..686161f75 100644
--- a/app/assets/stylesheets/sprites.css.scss
+++ b/app/assets/stylesheets/sprites.scss
diff --git a/app/assets/stylesheets/stream-faces.css.scss b/app/assets/stylesheets/stream-faces.scss
index 4d2ae989d..b05f19f43 100644
--- a/app/assets/stylesheets/stream-faces.css.scss
+++ b/app/assets/stylesheets/stream-faces.scss
@@ -1,7 +1,7 @@
#selected_aspect_contacts .avatar {
height: 32px;
width: 32px;
- margin-bottom: -2px;
+ margin-bottom: 2px;
}
.stream-faces a:hover { text-decoration: none; }
diff --git a/app/assets/stylesheets/stream.scss b/app/assets/stylesheets/stream.scss
new file mode 100644
index 000000000..55545d529
--- /dev/null
+++ b/app/assets/stylesheets/stream.scss
@@ -0,0 +1,11 @@
+.stream_container {
+ border-left: 1px solid $border-grey;
+ padding-left: 10px;
+ padding-top: 20px;
+ margin-left: -10px;
+ margin-top: -20px;
+ #publisher {
+ margin-bottom: 15px;
+ }
+ .well#ignore-info { text-align: center; }
+}
diff --git a/app/assets/stylesheets/stream_element.css.scss b/app/assets/stylesheets/stream_element.css.scss
deleted file mode 100644
index 249bab9db..000000000
--- a/app/assets/stylesheets/stream_element.css.scss
+++ /dev/null
@@ -1,288 +0,0 @@
-.stream {
- audio {
- display: block;
- margin: 5px 0;
- }
-
- .stream_element {
- border-bottom: 1px solid $border-grey;
-
- h1, h2, h3, h4, h5, h6 {
- word-wrap: break-word;
- word-break: break-word;
- }
-
- p {
- &:last-child {
- padding-bottom: 0;
- margin-bottom: 0;
- }
- }
-
- &:first-child {
- border-top: none;
- }
-
- ul {
- li {
- list-style: disc;
- }
- }
-
- .youtube-player, .vimeo-player {
- border: none;
- height: 304px;
- width: 410px;
- }
- }
-}
-
-.stream_element {
- &.highlighted { border-left: 3px solid $blue; }
-
- a.author {
- font-weight: bold;
- unicode-bidi: bidi-override;
- }
-
- .photo_attachments {
- margin-top: 7px;
- }
-
- img {
- max-width: 100%;
- }
-
- .bd {
- > img {
- height: 30px;
- width: 30px;
- float: left;
- margin-right: 10px;
- }
- }
-
- .info {
- font-size: 11px;
- }
-
- .stream_photo {
- float: left;
- margin-top: 6px;
- }
-
- .controls:first-child {
- .control_icon {
- @include transition(opacity);
- @include opacity(0);
- }
- }
-
- &:hover {
- .controls:first-child {
- .control_icon {
- @include opacity(0.3);
- }
- .control_icon:hover {
- @include opacity(1);
- }
- }
- }
-}
-
-.status_message_show {
- .comment_box {
- width: 653px;
- margin-bottom: 5px;
- }
-}
-
-.post_scope {
- cursor: default;
-}
-
-.stream_element .reshare,
-.comment {
- .avatar {
- width: 30px;
- height: 30px;
- }
-}
-
-.likes,
-.stream_element div.reshare {
- font-size: 12px;
-}
-
-.comment, .stream_element {
- >.highlighted {
- border-left: 3px solid $blue;
- padding-left: 3px;
- }
-}
-
-.comment.no-border {
- &.media {
- border: none;
- padding: 0;
- }
-}
-
-.comment {
- &.media {
- margin-left: 0;
- margin-right: 0;
-
- border-top: 1px dotted #aaa;
-
- padding-top: 10px;
-
- .controls {
- .comment_delete, .comment_report {
- @include transition(opacity);
- @include opacity(0);
- }
- }
- &:hover {
- .controls {
- .comment_delete, .comment_report {
- @include opacity(0.3);
- }
- .comment_delete:hover, .comment_report:hover {
- @include opacity(1);
- }
- }
- }
- }
-
- .youtube-player, .vimeo-player {
- border: none;
- height: 250px;
- width: 400px;
- }
-
- .ltr {
- ol, ul {
- padding-left: 2em;
- li {
- padding: 0px;
- border: none;
- list-style: inherit;
- }
- }
- }
-
- .right {
- right: 4px;
- }
-}
-
-.stream_element {
- .new_comment_form_wrapper {
- width: 415px;
- }
-}
-
-.stream_element .bd {
- & > .likes, & > .comments {
- margin-right: 15px;
- }
-}
-
-.status-message-location {
- .near-from {
- font-size: smaller;
- color: #aaa;
- width: 100%;
- float: left;
- }
- .address {
- font-size: 11px;
- color: #bbb;
- }
-}
-
-.stream_element .post-content .reshare {
- border-left: 2px solid $border-grey;
-}
-
-.stream_element.loaded .media .bd .feedback {
- clear: both;
-}
-
-form.new_comment {
- input {
- display: none;
- }
-
- textarea {
- height: 21px;
- font-size: 12px;
- width: 364px;
- }
-
- &.open {
- input {
- display: block;
- }
- }
-}
-
-.stream_element {
- .subject {
- font-size: 13px;
- font-weight: bold;
- color: #444;
- overflow: hidden;
- white-space: nowrap;
- }
-
- .last_author {
- font-size: 12px;
- color: $text-dark-grey;
- }
-
- .collapsible {
- overflow: hidden;
- position: relative;
-
- p {
- margin: 0 0 0.8em;
- }
- p:last-of-type {
- margin: 0;
- }
-
- .expander {
- position: absolute;
- bottom: 0;
- left: 0;
- right: 0;
- height: 30px;
- text-align: center;
- line-height: 48px;
- font-size: .8em;
- color: $grey;
- text-shadow: 0 0 7px #FFF;
- cursor: pointer;
- border-bottom: 2px solid $border-grey;
- @include border-radius(0, 0, 3px, 3px);
- @include linear-gradient(rgba(255,255,255,0) , #EEE, 0%, 95%);
- background-color: transparent;
- }
-
- .oembed {
- background: image-url('ajax-loader2.gif') no-repeat center center;
- float: left;
- width: 100%;
-
- .thumb {
- @include video-overlay();
- }
-
- iframe, .thumb img {
- width: 100%;
- }
- }
- }
-}
diff --git a/app/assets/stylesheets/stream_element.scss b/app/assets/stylesheets/stream_element.scss
new file mode 100644
index 000000000..1e43245e3
--- /dev/null
+++ b/app/assets/stylesheets/stream_element.scss
@@ -0,0 +1,141 @@
+#main_stream .stream_element,
+#main_stream > div > .photo {
+ & > .media {
+ margin: 0px;
+ }
+ &.deleting {
+ > .media { opacity: 0.3; }
+ .control-icons { display: none !important; }
+ }
+}
+
+#main_stream > div > .photo {
+ & > .media {
+ overflow: visible;
+ > .bd {
+ position: relative;
+ overflow: inherit;
+ > .control-icons {
+ border-radius: 4px;
+ padding-left: 5px;
+ position: absolute;
+ right: 6px;
+ text-align: center;
+ top: 1px;
+ }
+ }
+ &:hover > .bd > .control-icons { background: #fff; }
+ }
+ .thumbnail {
+ height: 200px;
+ padding: 10px;
+ margin: 0 5px 10px;
+ text-align: center;
+ line-height: 200px;
+ border: 1px solid $border-grey;
+ background: #fefefe;
+ box-shadow: 3px 3px 2px #eee;
+ img {
+ &.big_photo { max-height: 200px; }
+ }
+ }
+}
+
+#main_stream .stream_element {
+ border-bottom: 1px solid $border-grey;
+ padding: 10px;
+ & > .media {
+ & > .img > .avatar {
+ margin-top: 5px;
+ &.small {
+ height: 50px;
+ width: 50px;
+ }
+ }
+ .author-name {
+ font-weight: bold;
+ margin-bottom: 4px;
+ unicode-bidi: bidi-override;
+ }
+ a.author-name { color: $blue; }
+ .feedback {
+ margin-top: 5px;
+ font-size: 11px;
+ line-height: 11px;
+ }
+ .likes {
+ margin-top: 10px;
+ font-size: 12px;
+ line-height: 16px;
+ .bd { display: inline-block; }
+ .entypo.heart {
+ display: inline-block;
+ font-size: 16px;
+ vertical-align: top;
+ margin-top: -2px;
+ margin-right: 5px;
+ }
+ }
+ .stream_photo {
+ float: left;
+ margin-top: 6px;
+ }
+ .status-message-location .near-from {
+ font-size: 11px;
+ color: $text-grey;
+ }
+ .grey { color: $text-grey; }
+ .post-content p:last-of-type { margin-bottom: 0; }
+ .nsfw-shield {
+ color: $text-grey;
+ padding: 5px 10px;
+ background-color: $background-grey;
+ border: 1px solid $border-grey;
+ border-radius: 3px;
+ }
+ }
+
+ div.reshare {
+ border-left: 2px solid $border-grey;
+ margin-top: 3px;
+
+ & > .media .avatar {
+ margin-top: 5px;
+ height: 30px;
+ width: 30px;
+ }
+ }
+
+ .collapsible {
+ overflow: hidden;
+ position: relative;
+
+ .expander {
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ height: 30px;
+ text-align: center;
+ line-height: 48px;
+ font-size: .8em;
+ color: $grey;
+ text-shadow: 0 0 7px #FFF;
+ cursor: pointer;
+ border-bottom: 2px solid $border-grey;
+ border-radius: 0 0 3px 3px;
+ @include linear-gradient(rgba(255,255,255,0) , #EEE, 0%, 95%);
+ background-color: transparent;
+ }
+ }
+
+ &.highlighted {
+ padding-left: 8px;
+ border-left: 3px solid $creation-blue;
+ }
+
+ &.post_preview {
+ background-color: lighten($creation-blue,45%);
+ border: 1px solid $creation-blue;
+ }
+}
diff --git a/app/assets/stylesheets/tag.css.scss b/app/assets/stylesheets/tag.css.scss
deleted file mode 100644
index 3c5b54cc5..000000000
--- a/app/assets/stylesheets/tag.css.scss
+++ /dev/null
@@ -1,22 +0,0 @@
-.tag {
- display: inline-block;
- font-weight: bold;
- &:hover {
- text-decoration: underline;
- background-color: lighten($blue, 47%);
- }
-}
-
-h1.tag {
- border-bottom: 2px dotted $blue;
- &:hover { border-bottom: 2px dotted $blue; }
-}
-
-.info {
- .tag {
- background-color: #efefef;
- color: $text-grey;
- border-bottom: 1px dotted $border-dark-grey;
- &:hover { border-bottom: 1px solid $border-dark-grey; }
- }
-}
diff --git a/app/assets/stylesheets/tag.scss b/app/assets/stylesheets/tag.scss
new file mode 100644
index 000000000..aa49a815d
--- /dev/null
+++ b/app/assets/stylesheets/tag.scss
@@ -0,0 +1,48 @@
+.tag {
+ display: inline-block;
+ font-weight: bold;
+ &:hover {
+ text-decoration: underline;
+ background-color: lighten($blue, 47%);
+ }
+}
+
+a.tag { color: $blue; }
+
+h1.tag {
+ border-bottom: 2px dotted $blue;
+ &:hover { border-bottom: 2px dotted $blue; }
+}
+
+.info {
+ .tag {
+ background-color: #efefef;
+ color: $text-grey;
+ border-bottom: 1px dotted $border-dark-grey;
+ &:hover { border-bottom: 1px solid $border-dark-grey; }
+ }
+}
+
+#tags_show {
+ .span3 {
+ h4 { margin: 25px 0 15px; }
+ .side_stream #people_stream {
+ .name { display: block; }
+ .name, .diaspora_handle, .tags {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ }
+ }
+ }
+ .span7 {
+ .tag-following-action {
+ max-width: 100%;
+ input[type="submit"] {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ max-width: 100%;
+ }
+ }
+ }
+}
diff --git a/app/assets/stylesheets/tags.css.scss b/app/assets/stylesheets/tags.css.scss
deleted file mode 100644
index 189531472..000000000
--- a/app/assets/stylesheets/tags.css.scss
+++ /dev/null
@@ -1,20 +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.
-
-.tags_show {
- .side_stream {
- .stream_element {
- .add_contact {
- display: inline;
- float: right;
- font-size: 10px;
- .button {
- padding: 5px 1px 4px 1px;
- margin-right: 3px;
- font-size: 10px;
- }
- }
- }
- }
-}
diff --git a/app/assets/stylesheets/ui.css.scss b/app/assets/stylesheets/ui.css.scss
deleted file mode 100644
index 22f1043df..000000000
--- a/app/assets/stylesheets/ui.css.scss
+++ /dev/null
@@ -1,253 +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.
-
-@import "_mixins.css.scss";
-
-$button-border-color: #aaa;
-
-.ui-autocomplete {
- left: -11px
-}
-
-.button {
- @include border-radius(3px);
- @include button-gradient($light-grey);
- @include box-shadow(0,1px,1px,#cfcfcf);
- @include transition(border);
-
- display: inline;
-
- font: {
- style: normal;
- size: 12px;
- }
- color: #505050;
-
- padding: 4px 9px;
-
- min-width: 90px;
- min-height: 10px;
-
- border: 1px solid $button-border-color;
-
- cursor: pointer;
- white-space: nowrap;
-
- &:hover {
- @include button-gradient-hover-no-saturation($light-grey);
- color: #505050;
- text-decoration: none;
- border: 1px solid darken($button-border-color,15%);
- }
-
- &:active {
- @include linear-gradient(#acacac,#808080);
- }
-
- img {
- position: relative;
- height: 20px;
- width: 20px;
- top: 6px;
- }
-}
-
-/* fix for input height */
-input.button {
- padding: 3px 9px {
- bottom: 4px
- }
-}
-
-.button .selected {
- @include linear-gradient(#f0f0f0,$highlight-white,29%,85%);
-
- border-top: 1px solid #aaa;
-}
-
-.button {
- &.delete {
- color: desaturate($red,10%);
- }
-
- &.in_aspects {
- @include button-gradient($green);
- &:hover {
- @include button-gradient-hover($green);
- }
- }
-
- &.creation {
- @include button-gradient($creation-blue);
- color: #fff;
-
- border: 1px solid darken($button-border-color,20%);
-
- &:hover {
- @include button-gradient-hover($creation-blue);
- border: 1px solid darken($button-border-color,35%);
- }
- }
-
- &.red_on_hover {
- &:hover {
- @include button-gradient(#F74427);
- color: #222;
- }
- }
-}
-
-.right {
- position: absolute;
- right: 0;
-}
-
-.dropdown {
- position: relative;
- display: inline-block;
-
- .button {
- width: 240px;
- }
-
- .wrapper {
- @include box-shadow(0, 2px, 5px, #666);
- //@include opacity(0)
- @include transition(opacity);
-
- display: none;
- z-index: 20;
- position: absolute;
- width: 140px;
- margin-top: 2px;
- background-color: #fff;
- border: 1px solid $border-dark-grey;
-
- ul {
- @include user-select(none);
- font-size: normal;
-
- padding: 0 !important;
- margin: 0 !important;
- color: #000;
-
- > li {
- font-size: 11px !important;
- padding: 6px 2px {
- left: 24px; }
- position: relative;
- color: #222;
- list-style: none !important;
-
- &.selected {
- background: {
- image: image-url('icons/check_yes_ok.png');
- position: 3px 6px;
- repeat: no-repeat;
- }
- }
-
- &.selected:hover {
- background: {
- image: image-url('icons/check_yes_ok_white.png');
- position: 3px 4px;
- }
- }
-
- &.loading {
- background: {
- image: image-url('ajax-loader.gif');
- repeat: no-repeat;
- position: 4px 2px;
- }
- }
-
- &.loading:hover {
- background: {
- image: image-url('ajax-loader_inverted.gif');
- /* bump top position up 1px to compensate for the 1px added top border */
- position: 4px 1px;
- }
- }
-
- &.newItem {
- a {
- color: $text-grey;
- font-style: italic;
-
- &:hover {
- text-decoration: none;
- }
- }
- }
- }
- }
- }
-
- &.hang_right {
- .wrapper {
- @include border-radius(3px, 0, 3px, 3px);
- right: 3px;
- }
- }
-
- &.hang_left {
- .wrapper {
- @include border-radius(0, 3px, 3px, 3px);
- left: 0px;
- }
- }
-
- .selected {
- font-weight: bold;
- }
-
- &.active {
- .wrapper {
- //@include opacity(1)
- display: block;
- }
-
- .button {
- @include border-radius(3px, 3px, 0, 0);
- border: 1px solid #444;
- }
-
- .button {
- background: #666;
- }
-
- .button,
- .wrapper ul > li:hover {
- background-color: #666;
- color: #fff;
- text-shadow: none;
- }
-
- .wrapper ul > li:hover {
- border: {
- top: 1px solid #444;
- bottom: 1px solid #444;
- }
- padding: {
- top: 5px;
- bottom: 5px;
- }
-
- &.divider {
- padding-bottom: 3px;
- }
-
- a {
- color: #ccc;
- }
- }
-
- .wrapper ul > li,
- .wrapper ul > li * {
- cursor: pointer;
- }
- }
-}
-
diff --git a/app/assets/stylesheets/vendor/autoSuggest.css b/app/assets/stylesheets/vendor/autoSuggest.css.erb
index 1f8df0659..fd784d5d3 100644
--- a/app/assets/stylesheets/vendor/autoSuggest.css
+++ b/app/assets/stylesheets/vendor/autoSuggest.css.erb
@@ -7,15 +7,13 @@ ul.as-selections {
overflow: auto;
background-color: #fff;
border-radius: 3px;
- -webkit-border-radius: 3px;
- -moz-border-radius: 3px;
- /* 1% padding (all sides) + 98% width = 100% */
+ /* 1% padding (all sides) + 98% width = 100% */
padding: 1%;
width: 98%;
}
ul.as-selections.loading {
- background: url("/assets/ajax-loader.gif") right center no-repeat;
+ background: url('<%= image_path("ajax-loader.gif") %>') right center no-repeat;
}
ul.as-selections li {
@@ -29,18 +27,14 @@ ul.as-selections li.as-selection-item {
font-size: 13px;
text-shadow: 0 1px 1px #fff;
background-color: #ddeefe;
- background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#ddeefe), to(#bfe0f1));
+ background-image: gradient(linear, 0% 0%, 0% 100%, from(#ddeefe), to(#bfe0f1));
border: 1px solid #acc3ec;
padding: 0;
padding-top: 6px;
padding-bottom: 6px;
padding-left: 6px;
border-radius: 5px;
- -webkit-border-radius: 5px;
- -moz-border-radius: 5px;
box-shadow: 0 1px 1px #e4edf2;
- -webkit-box-shadow: 0 1px 1px #e4edf2;
- -moz-box-shadow: 0 1px 1px #e4edf2;
line-height: 10px;
margin-top: -1px;
margin-bottom: 10px;
@@ -60,18 +54,16 @@ ul.as-selections li.as-selection-item a.as-close {
font-size: 14px;
font-weight: bold;
text-shadow: 0 1px 1px #fff;
- -webkit-transition: color .1s ease-in;
+ transition: color .1s ease-in;
}
ul.as-selections li.as-selection-item.blur {
color: #666666;
background-color: #f4f4f4;
- background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#f4f4f4), to(#d5d5d5));
+ background-image: gradient(linear, 0% 0%, 0% 100%, from(#f4f4f4), to(#d5d5d5));
border-color: #bbb;
border-top-color: #ccc;
box-shadow: 0 1px 1px #e9e9e9;
- -webkit-box-shadow: 0 1px 1px #e9e9e9;
- -moz-box-shadow: 0 1px 1px #e9e9e9;
}
ul.as-selections li.as-selection-item.blur a.as-close {
@@ -81,7 +73,7 @@ ul.as-selections li.as-selection-item.blur a.as-close {
ul.as-selections li:hover.as-selection-item {
color: #2b3840;
background-color: #bbd4f1;
- background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#bbd4f1), to(#a3c2e5));
+ background-image: gradient(linear, 0% 0%, 0% 100%, from(#bbd4f1), to(#a3c2e5));
border-color: #6da0e0;
border-top-color: #8bb7ed;
}
@@ -135,11 +127,7 @@ ul.as-list {
background-color: rgba(255,255,255,0.95);
z-index: 2;
box-shadow: 0 2px 12px #222;
- -webkit-box-shadow: 0 2px 12px #222;
- -moz-box-shadow: 0 2px 12px #222;
border-radius: 5px;
- -webkit-border-radius: 5px;
- -moz-border-radius: 5px;
}
li.as-result-item, li.as-message {
@@ -150,8 +138,6 @@ li.as-result-item, li.as-message {
border-bottom: 1px solid #ddd;
cursor: pointer;
border-radius: 3px;
- -webkit-border-radius: 3px;
- -moz-border-radius: 3px;
}
li:first-child.as-result-item {
@@ -165,26 +151,26 @@ li.as-message {
li.as-result-item.active {
background-color: #3668d9;
- background-image: -webkit-gradient(linear, 0% 0%, 0% 64%, from(rgb(110, 129, 245)), to(rgb(62, 82, 242)));
+ background-image: gradient(linear, 0% 0%, 0% 64%, from(rgb(110, 129, 245)), to(rgb(62, 82, 242)));
border-color: #3342e8;
color: #fff;
text-shadow: 0 1px 2px #122042;
}
-li.as-result-item em {
- font-style: normal;
- background: #444;
+li.as-result-item em {
+ font-style: normal;
+ background: #444;
padding: 0 2px;
color: #fff;
}
-li.as-result-item.active em {
- background: #253f7a;
+li.as-result-item.active em {
+ background: #253f7a;
color: #fff;
}
/* Webkit Hacks */
-@media screen and (-webkit-min-device-pixel-ratio:0) {
+@media screen and (-webkit-min-device-pixel-ratio:0) {
ul.as-selections li.as-selection-item {
padding-top: 6px;
padding-bottom: 6px;
@@ -218,7 +204,7 @@ ul.as-selections li.as-selection-item a.as-close {
}
/* Firefox 3.0 Hacks */
-ul.as-list, x:-moz-any-link, x:default {
+ul.as-list, x:-moz-any-link, x:default {
border: 1px solid #ccc;
}
BODY:first-of-type ul.as-list, x:-moz-any-link, x:default { /* Target FF 3.5+ */
diff --git a/app/assets/stylesheets/vendor/blank.gif b/app/assets/stylesheets/vendor/blank.gif
deleted file mode 100644
index 35d42e808..000000000
--- a/app/assets/stylesheets/vendor/blank.gif
+++ /dev/null
Binary files differ
diff --git a/app/assets/stylesheets/vendor/blueprint/AUTHORS.textile b/app/assets/stylesheets/vendor/blueprint/AUTHORS.textile
deleted file mode 100644
index d873e010a..000000000
--- a/app/assets/stylesheets/vendor/blueprint/AUTHORS.textile
+++ /dev/null
@@ -1,42 +0,0 @@
-h1. Blueprint CSS Framework Authors and Contributors
-
-Blueprint is based on the work of many talented people. It is
-through their good intentions we are allowed to use many of the
-techniques found in the framework.
-
-h2. Current Team
-
-Blueprint was realized and maintained through version 0.7.1 by
-"Olav Bjorkoy":http://bjorkoy.com who has sinced passed the torch
-to the current team. They are:
-
-Admins:
-* "Christian Montoya":http://christianmontoya.net
-* "Josh Clayton":http://jdclayton.com
-
-Contributors:
-* "Glenn Rempe":http://blog.rempe.us/
-* "Chris Eppstein":http://twitter.com/chriseppstein
-* "Sean K. Stewart":http://seankstewart.com/
-
-h2. Original CSS authors
-
-The first iteration of Blueprint was built upon many conventions
-and ideas that were developed by true CSS experts.
-
-The grid and typography is based on work by:
-* "Jeff Croft":http://jeffcroft.com
-* "Nathan Borror":http://www.playgroundblues.com
-* "Christian Metts":http://mintchaos.com
-* "Wilson Miner":http://www.wilsonminer.com
-
-The CSS reset is based on work by:
-* "Eric Meyer":http://www.meyerweb.com/eric
-
-The Fancy Type plugin is based on work by:
-* "Mark Boulton":http://www.markboulton.co.uk
-* "Typogrify":http://typogrify.googlecode.com
-
-(However, remember that these people are not involved with the
-framework, so please don't waste their or your time asking them
-for support.)
diff --git a/app/assets/stylesheets/vendor/blueprint/LICENSE b/app/assets/stylesheets/vendor/blueprint/LICENSE
deleted file mode 100644
index 13076fb5f..000000000
--- a/app/assets/stylesheets/vendor/blueprint/LICENSE
+++ /dev/null
@@ -1,22 +0,0 @@
-Copyright (c) 2007 - 2010 blueprintcss.org
-
-Permission is hereby granted, free of charge, to any person
-obtaining a copy of this software and associated documentation
-files (the "Software"), to deal in the Software without
-restriction, including without limitation the rights to use,
-copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the
-Software is furnished to do so, subject to the following
-conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-OTHER DEALINGS IN THE SOFTWARE.
diff --git a/app/assets/stylesheets/vendor/blueprint/ie.css b/app/assets/stylesheets/vendor/blueprint/ie.css
deleted file mode 100644
index 3dddda945..000000000
--- a/app/assets/stylesheets/vendor/blueprint/ie.css
+++ /dev/null
@@ -1,35 +0,0 @@
-/* -----------------------------------------------------------------------
-
-
- Blueprint CSS Framework 0.9
- http://blueprintcss.org
-
- * Copyright (c) 2007-Present. See LICENSE for more info.
- * See README for instructions on how to use Blueprint.
- * For credits and origins, see AUTHORS.
- * This is a compressed file. See the sources in the 'src' directory.
-
------------------------------------------------------------------------ */
-
-/* ie.css */
-body {text-align:center;}
-.container {text-align:left;}
-* html .column, * html .span-1, * html .span-2, * html .span-3, * html .span-4, * html .span-5, * html .span-6, * html .span-7, * html .span-8, * html .span-9, * html .span-10, * html .span-11, * html .span-12, * html .span-13, * html .span-14, * html .span-15, * html .span-16, * html .span-17, * html .span-18, * html .span-19, * html .span-20, * html .span-21, * html .span-22, * html .span-23, * html .span-24 {display:inline;overflow-x:hidden;}
-* html legend {margin:0px -8px 16px 0;padding:0;}
-sup {vertical-align:text-top;}
-sub {vertical-align:text-bottom;}
-html>body p code {*white-space:normal;}
-hr {margin:-8px auto 11px;}
-img {-ms-interpolation-mode:bicubic;}
-.clearfix, .container {display:inline-block;}
-* html .clearfix, * html .container {height:1%;}
-fieldset {padding-top:0;}
-textarea {overflow:auto;}
-input.text, input.title, textarea {background-color:#fff;border:1px solid #bbb;}
-input.text:focus, input.title:focus {border-color:#666;}
-input.text, input.title, textarea, select {margin:0.5em 0;}
-input.checkbox, input.radio {position:relative;top:.25em;}
-form.inline div, form.inline p {vertical-align:middle;}
-form.inline label {position:relative;top:-0.25em;}
-form.inline input.checkbox, form.inline input.radio, form.inline input.button, form.inline button {margin:0.5em 0;}
-button, input.button {position:relative;top:0.25em;} \ No newline at end of file
diff --git a/app/assets/stylesheets/vendor/blueprint/plugins/buttons/icons/cross.png b/app/assets/stylesheets/vendor/blueprint/plugins/buttons/icons/cross.png
deleted file mode 100644
index 1514d51a3..000000000
--- a/app/assets/stylesheets/vendor/blueprint/plugins/buttons/icons/cross.png
+++ /dev/null
Binary files differ
diff --git a/app/assets/stylesheets/vendor/blueprint/plugins/buttons/icons/key.png b/app/assets/stylesheets/vendor/blueprint/plugins/buttons/icons/key.png
deleted file mode 100644
index a9d5e4f8c..000000000
--- a/app/assets/stylesheets/vendor/blueprint/plugins/buttons/icons/key.png
+++ /dev/null
Binary files differ
diff --git a/app/assets/stylesheets/vendor/blueprint/plugins/buttons/icons/tick.png b/app/assets/stylesheets/vendor/blueprint/plugins/buttons/icons/tick.png
deleted file mode 100644
index a9925a06a..000000000
--- a/app/assets/stylesheets/vendor/blueprint/plugins/buttons/icons/tick.png
+++ /dev/null
Binary files differ
diff --git a/app/assets/stylesheets/vendor/blueprint/plugins/buttons/readme.txt b/app/assets/stylesheets/vendor/blueprint/plugins/buttons/readme.txt
deleted file mode 100644
index aa9fe26ba..000000000
--- a/app/assets/stylesheets/vendor/blueprint/plugins/buttons/readme.txt
+++ /dev/null
@@ -1,32 +0,0 @@
-Buttons
-
-* Gives you great looking CSS buttons, for both <a> and <button>.
-* Demo: particletree.com/features/rediscovering-the-button-element
-
-
-Credits
-----------------------------------------------------------------
-
-* Created by Kevin Hale [particletree.com]
-* Adapted for Blueprint by Olav Bjorkoy [bjorkoy.com]
-
-
-Usage
-----------------------------------------------------------------
-
-1) Add this plugin to lib/settings.yml.
- See compress.rb for instructions.
-
-2) Use the following HTML code to place the buttons on your site:
-
- <button type="submit" class="button positive">
- <img src="css/blueprint/plugins/buttons/icons/tick.png" alt=""/> Save
- </button>
-
- <a class="button" href="/password/reset/">
- <img src="css/blueprint/plugins/buttons/icons/key.png" alt=""/> Change Password
- </a>
-
- <a href="#" class="button negative">
- <img src="css/blueprint/plugins/buttons/icons/cross.png" alt=""/> Cancel
- </a>
diff --git a/app/assets/stylesheets/vendor/blueprint/plugins/buttons/screen.css b/app/assets/stylesheets/vendor/blueprint/plugins/buttons/screen.css
deleted file mode 100644
index bb66b2154..000000000
--- a/app/assets/stylesheets/vendor/blueprint/plugins/buttons/screen.css
+++ /dev/null
@@ -1,97 +0,0 @@
-/* --------------------------------------------------------------
-
- buttons.css
- * Gives you some great CSS-only buttons.
-
- Created by Kevin Hale [particletree.com]
- * particletree.com/features/rediscovering-the-button-element
-
- See Readme.txt in this folder for instructions.
-
--------------------------------------------------------------- */
-
-a.button, button {
- display:block;
- float:left;
- margin: 0.7em 0.5em 0.7em 0;
- padding:5px 10px 5px 7px; /* Links */
-
- border:1px solid #dedede;
- border-top:1px solid #eee;
- border-left:1px solid #eee;
-
- background-color:#f5f5f5;
- font-family:"Lucida Grande", Tahoma, Arial, Verdana, sans-serif;
- font-size:100%;
- line-height:130%;
- text-decoration:none;
- font-weight:bold;
- color:#565656;
- cursor:pointer;
-}
-button {
- width:auto;
- overflow:visible;
- padding:4px 10px 3px 7px; /* IE6 */
-}
-button[type] {
- padding:4px 10px 4px 7px; /* Firefox */
- line-height:17px; /* Safari */
-}
-*:first-child+html button[type] {
- padding:4px 10px 3px 7px; /* IE7 */
-}
-button img, a.button img{
- margin:0 3px -3px 0 !important;
- padding:0;
- border:none;
- width:16px;
- height:16px;
- float:none;
-}
-
-
-/* Button colors
--------------------------------------------------------------- */
-
-/* Standard */
-button:hover, a.button:hover{
- background-color:#dff4ff;
- border:1px solid #c2e1ef;
- color:#336699;
-}
-a.button:active{
- background-color:#6299c5;
- border:1px solid #6299c5;
- color:#fff;
-}
-
-/* Positive */
-body .positive {
- color:#529214;
-}
-a.positive:hover, button.positive:hover {
- background-color:#E6EFC2;
- border:1px solid #C6D880;
- color:#529214;
-}
-a.positive:active {
- background-color:#529214;
- border:1px solid #529214;
- color:#fff;
-}
-
-/* Negative */
-body .negative {
- color:#d12f19;
-}
-a.negative:hover, button.negative:hover {
- background-color:#fbe3e4;
- border:1px solid #fbc2c4;
- color:#d12f19;
-}
-a.negative:active {
- background-color:#d12f19;
- border:1px solid #d12f19;
- color:#fff;
-}
diff --git a/app/assets/stylesheets/vendor/blueprint/plugins/fancy-type/readme.txt b/app/assets/stylesheets/vendor/blueprint/plugins/fancy-type/readme.txt
deleted file mode 100644
index 85f249152..000000000
--- a/app/assets/stylesheets/vendor/blueprint/plugins/fancy-type/readme.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-Fancy Type
-
-* Gives you classes to use if you'd like some
- extra fancy typography.
-
-Credits and instructions are specified above each class
-in the fancy-type.css file in this directory.
-
-
-Usage
-----------------------------------------------------------------
-
-1) Add this plugin to lib/settings.yml.
- See compress.rb for instructions.
diff --git a/app/assets/stylesheets/vendor/blueprint/plugins/fancy-type/screen.css b/app/assets/stylesheets/vendor/blueprint/plugins/fancy-type/screen.css
deleted file mode 100644
index 127cf2553..000000000
--- a/app/assets/stylesheets/vendor/blueprint/plugins/fancy-type/screen.css
+++ /dev/null
@@ -1,71 +0,0 @@
-/* --------------------------------------------------------------
-
- fancy-type.css
- * Lots of pretty advanced classes for manipulating text.
-
- See the Readme file in this folder for additional instructions.
-
--------------------------------------------------------------- */
-
-/* Indentation instead of line shifts for sibling paragraphs. */
- p + p { text-indent:2em; margin-top:-1.5em; }
- form p + p { text-indent: 0; } /* Don't want this in forms. */
-
-
-/* For great looking type, use this code instead of asdf:
- <span class="alt">asdf</span>
- Best used on prepositions and ampersands. */
-
-.alt {
- color: #666;
- font-family: "Warnock Pro", "Goudy Old Style","Palatino","Book Antiqua", Georgia, serif;
- font-style: italic;
- font-weight: normal;
-}
-
-
-/* For great looking quote marks in titles, replace "asdf" with:
- <span class="dquo">&#8220;</span>asdf&#8221;
- (That is, when the title starts with a quote mark).
- (You may have to change this value depending on your font size). */
-
-.dquo { margin-left: -.5em; }
-
-
-/* Reduced size type with incremental leading
- (http://www.markboulton.co.uk/journal/comments/incremental_leading/)
-
- This could be used for side notes. For smaller type, you don't necessarily want to
- follow the 1.5x vertical rhythm -- the line-height is too much.
-
- Using this class, it reduces your font size and line-height so that for
- every four lines of normal sized type, there is five lines of the sidenote. eg:
-
- New type size in em's:
- 10px (wanted side note size) / 12px (existing base size) = 0.8333 (new type size in ems)
-
- New line-height value:
- 12px x 1.5 = 18px (old line-height)
- 18px x 4 = 72px
- 72px / 5 = 14.4px (new line height)
- 14.4px / 10px = 1.44 (new line height in em's) */
-
-p.incr, .incr p {
- font-size: 10px;
- line-height: 1.44em;
- margin-bottom: 1.5em;
-}
-
-
-/* Surround uppercase words and abbreviations with this class.
- Based on work by Jørgen Arnor Gårdsø Lom [http://twistedintellect.com/] */
-
-.caps {
- font-variant: small-caps;
- letter-spacing: 1px;
- text-transform: lowercase;
- font-size:1.2em;
- line-height:1%;
- font-weight:bold;
- padding:0 2px;
-}
diff --git a/app/assets/stylesheets/vendor/blueprint/plugins/link-icons/icons/doc.png b/app/assets/stylesheets/vendor/blueprint/plugins/link-icons/icons/doc.png
deleted file mode 100644
index 834cdfaf4..000000000
--- a/app/assets/stylesheets/vendor/blueprint/plugins/link-icons/icons/doc.png
+++ /dev/null
Binary files differ
diff --git a/app/assets/stylesheets/vendor/blueprint/plugins/link-icons/icons/email.png b/app/assets/stylesheets/vendor/blueprint/plugins/link-icons/icons/email.png
deleted file mode 100644
index 7348aed77..000000000
--- a/app/assets/stylesheets/vendor/blueprint/plugins/link-icons/icons/email.png
+++ /dev/null
Binary files differ
diff --git a/app/assets/stylesheets/vendor/blueprint/plugins/link-icons/icons/external.png b/app/assets/stylesheets/vendor/blueprint/plugins/link-icons/icons/external.png
deleted file mode 100644
index 2cd011b22..000000000
--- a/app/assets/stylesheets/vendor/blueprint/plugins/link-icons/icons/external.png
+++ /dev/null
Binary files differ
diff --git a/app/assets/stylesheets/vendor/blueprint/plugins/link-icons/icons/feed.png b/app/assets/stylesheets/vendor/blueprint/plugins/link-icons/icons/feed.png
deleted file mode 100644
index 315c4f4fa..000000000
--- a/app/assets/stylesheets/vendor/blueprint/plugins/link-icons/icons/feed.png
+++ /dev/null
Binary files differ
diff --git a/app/assets/stylesheets/vendor/blueprint/plugins/link-icons/icons/im.png b/app/assets/stylesheets/vendor/blueprint/plugins/link-icons/icons/im.png
deleted file mode 100644
index 79f35ccbd..000000000
--- a/app/assets/stylesheets/vendor/blueprint/plugins/link-icons/icons/im.png
+++ /dev/null
Binary files differ
diff --git a/app/assets/stylesheets/vendor/blueprint/plugins/link-icons/icons/pdf.png b/app/assets/stylesheets/vendor/blueprint/plugins/link-icons/icons/pdf.png
deleted file mode 100644
index 8f8095e46..000000000
--- a/app/assets/stylesheets/vendor/blueprint/plugins/link-icons/icons/pdf.png
+++ /dev/null
Binary files differ
diff --git a/app/assets/stylesheets/vendor/blueprint/plugins/link-icons/icons/visited.png b/app/assets/stylesheets/vendor/blueprint/plugins/link-icons/icons/visited.png
deleted file mode 100644
index b8a1eceb9..000000000
--- a/app/assets/stylesheets/vendor/blueprint/plugins/link-icons/icons/visited.png
+++ /dev/null
Binary files differ
diff --git a/app/assets/stylesheets/vendor/blueprint/plugins/link-icons/icons/xls.png b/app/assets/stylesheets/vendor/blueprint/plugins/link-icons/icons/xls.png
deleted file mode 100644
index b977d7e52..000000000
--- a/app/assets/stylesheets/vendor/blueprint/plugins/link-icons/icons/xls.png
+++ /dev/null
Binary files differ
diff --git a/app/assets/stylesheets/vendor/blueprint/plugins/link-icons/readme.txt b/app/assets/stylesheets/vendor/blueprint/plugins/link-icons/readme.txt
deleted file mode 100644
index fc4dc6490..000000000
--- a/app/assets/stylesheets/vendor/blueprint/plugins/link-icons/readme.txt
+++ /dev/null
@@ -1,18 +0,0 @@
-Link Icons
-* Icons for links based on protocol or file type.
-
-This is not supported in IE versions < 7.
-
-
-Credits
-----------------------------------------------------------------
-
-* Marc Morgan
-* Olav Bjorkoy [bjorkoy.com]
-
-
-Usage
-----------------------------------------------------------------
-
-1) Add this line to your HTML:
- <link rel="stylesheet" href="css/blueprint/plugins/link-icons/screen.css" type="text/css" media="screen, projection">
diff --git a/app/assets/stylesheets/vendor/blueprint/plugins/link-icons/screen.css b/app/assets/stylesheets/vendor/blueprint/plugins/link-icons/screen.css
deleted file mode 100644
index 7b4bef988..000000000
--- a/app/assets/stylesheets/vendor/blueprint/plugins/link-icons/screen.css
+++ /dev/null
@@ -1,40 +0,0 @@
-/* --------------------------------------------------------------
-
- link-icons.css
- * Icons for links based on protocol or file type.
-
- See the Readme file in this folder for additional instructions.
-
--------------------------------------------------------------- */
-
-/* Use this class if a link gets an icon when it shouldn't. */
-body a.noicon {
- background:transparent none !important;
- padding:0 !important;
- margin:0 !important;
-}
-
-/* Make sure the icons are not cut */
-a[href^="http:"], a[href^="mailto:"], a[href^="http:"]:visited,
-a[href$=".pdf"], a[href$=".doc"], a[href$=".xls"], a[href$=".rss"],
-a[href$=".rdf"], a[href^="aim:"] {
- padding:2px 22px 2px 0;
- margin:-2px 0;
- background-repeat: no-repeat;
- background-position: right center;
-}
-
-/* External links */
-a[href^="http:"] { background-image: url(icons/external.png); }
-a[href^="mailto:"] { background-image: url(icons/email.png); }
-a[href^="http:"]:visited { background-image: url(icons/visited.png); }
-
-/* Files */
-a[href$=".pdf"] { background-image: url(icons/pdf.png); }
-a[href$=".doc"] { background-image: url(icons/doc.png); }
-a[href$=".xls"] { background-image: url(icons/xls.png); }
-
-/* Misc */
-a[href$=".rss"],
-a[href$=".rdf"] { background-image: url(icons/feed.png); }
-a[href^="aim:"] { background-image: url(icons/im.png); }
diff --git a/app/assets/stylesheets/vendor/blueprint/plugins/rtl/readme.txt b/app/assets/stylesheets/vendor/blueprint/plugins/rtl/readme.txt
deleted file mode 100644
index 5564c402a..000000000
--- a/app/assets/stylesheets/vendor/blueprint/plugins/rtl/readme.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-RTL
-* Mirrors Blueprint, so it can be used with Right-to-Left languages.
-
-By Ran Yaniv Hartstein, ranh.co.il
-
-Usage
-----------------------------------------------------------------
-
-1) Add this line to your HTML:
- <link rel="stylesheet" href="css/blueprint/plugins/rtl/screen.css" type="text/css" media="screen, projection">
diff --git a/app/assets/stylesheets/vendor/blueprint/plugins/rtl/screen.css b/app/assets/stylesheets/vendor/blueprint/plugins/rtl/screen.css
deleted file mode 100644
index 7db7eb5e6..000000000
--- a/app/assets/stylesheets/vendor/blueprint/plugins/rtl/screen.css
+++ /dev/null
@@ -1,110 +0,0 @@
-/* --------------------------------------------------------------
-
- rtl.css
- * Mirrors Blueprint for left-to-right languages
-
- By Ran Yaniv Hartstein [ranh.co.il]
-
--------------------------------------------------------------- */
-
-body .container { direction: rtl; }
-body .column, body .span-1, body .span-2, body .span-3, body .span-4, body .span-5, body .span-6, body .span-7, body .span-8, body .span-9, body .span-10, body .span-11, body .span-12, body .span-13, body .span-14, body .span-15, body .span-16, body .span-17, body .span-18, body .span-19, body .span-20, body .span-21, body .span-22, body .span-23, body .span-24 {
- float: right;
- margin-right: 0;
- margin-left: 10px;
- text-align:right;
-}
-
-body div.last { margin-left: 0; }
-body table .last { padding-left: 0; }
-
-body .append-1 { padding-right: 0; padding-left: 40px; }
-body .append-2 { padding-right: 0; padding-left: 80px; }
-body .append-3 { padding-right: 0; padding-left: 120px; }
-body .append-4 { padding-right: 0; padding-left: 160px; }
-body .append-5 { padding-right: 0; padding-left: 200px; }
-body .append-6 { padding-right: 0; padding-left: 240px; }
-body .append-7 { padding-right: 0; padding-left: 280px; }
-body .append-8 { padding-right: 0; padding-left: 320px; }
-body .append-9 { padding-right: 0; padding-left: 360px; }
-body .append-10 { padding-right: 0; padding-left: 400px; }
-body .append-11 { padding-right: 0; padding-left: 440px; }
-body .append-12 { padding-right: 0; padding-left: 480px; }
-body .append-13 { padding-right: 0; padding-left: 520px; }
-body .append-14 { padding-right: 0; padding-left: 560px; }
-body .append-15 { padding-right: 0; padding-left: 600px; }
-body .append-16 { padding-right: 0; padding-left: 640px; }
-body .append-17 { padding-right: 0; padding-left: 680px; }
-body .append-18 { padding-right: 0; padding-left: 720px; }
-body .append-19 { padding-right: 0; padding-left: 760px; }
-body .append-20 { padding-right: 0; padding-left: 800px; }
-body .append-21 { padding-right: 0; padding-left: 840px; }
-body .append-22 { padding-right: 0; padding-left: 880px; }
-body .append-23 { padding-right: 0; padding-left: 920px; }
-
-body .prepend-1 { padding-left: 0; padding-right: 40px; }
-body .prepend-2 { padding-left: 0; padding-right: 80px; }
-body .prepend-3 { padding-left: 0; padding-right: 120px; }
-body .prepend-4 { padding-left: 0; padding-right: 160px; }
-body .prepend-5 { padding-left: 0; padding-right: 200px; }
-body .prepend-6 { padding-left: 0; padding-right: 240px; }
-body .prepend-7 { padding-left: 0; padding-right: 280px; }
-body .prepend-8 { padding-left: 0; padding-right: 320px; }
-body .prepend-9 { padding-left: 0; padding-right: 360px; }
-body .prepend-10 { padding-left: 0; padding-right: 400px; }
-body .prepend-11 { padding-left: 0; padding-right: 440px; }
-body .prepend-12 { padding-left: 0; padding-right: 480px; }
-body .prepend-13 { padding-left: 0; padding-right: 520px; }
-body .prepend-14 { padding-left: 0; padding-right: 560px; }
-body .prepend-15 { padding-left: 0; padding-right: 600px; }
-body .prepend-16 { padding-left: 0; padding-right: 640px; }
-body .prepend-17 { padding-left: 0; padding-right: 680px; }
-body .prepend-18 { padding-left: 0; padding-right: 720px; }
-body .prepend-19 { padding-left: 0; padding-right: 760px; }
-body .prepend-20 { padding-left: 0; padding-right: 800px; }
-body .prepend-21 { padding-left: 0; padding-right: 840px; }
-body .prepend-22 { padding-left: 0; padding-right: 880px; }
-body .prepend-23 { padding-left: 0; padding-right: 920px; }
-
-body .border {
- padding-right: 0;
- padding-left: 4px;
- margin-right: 0;
- margin-left: 5px;
- border-right: none;
- border-left: 1px solid #eee;
-}
-
-body .colborder {
- padding-right: 0;
- padding-left: 24px;
- margin-right: 0;
- margin-left: 25px;
- border-right: none;
- border-left: 1px solid #eee;
-}
-
-body .pull-1 { margin-left: 0; margin-right: -40px; }
-body .pull-2 { margin-left: 0; margin-right: -80px; }
-body .pull-3 { margin-left: 0; margin-right: -120px; }
-body .pull-4 { margin-left: 0; margin-right: -160px; }
-
-body .push-0 { margin: 0 18px 0 0; }
-body .push-1 { margin: 0 18px 0 -40px; }
-body .push-2 { margin: 0 18px 0 -80px; }
-body .push-3 { margin: 0 18px 0 -120px; }
-body .push-4 { margin: 0 18px 0 -160px; }
-body .push-0, body .push-1, body .push-2,
-body .push-3, body .push-4 { float: left; }
-
-
-/* Typography with RTL support */
-body h1,body h2,body h3,
-body h4,body h5,body h6 { font-family: Arial, sans-serif; }
-html body { font-family: Arial, sans-serif; }
-body pre,body code,body tt { font-family: monospace; }
-
-/* Mirror floats and margins on typographic elements */
-body p img { float: right; margin: 1.5em 0 1.5em 1.5em; }
-body dd, body ul, body ol { margin-left: 0; margin-right: 1.5em;}
-body td, body th { text-align:right; }
diff --git a/app/assets/stylesheets/vendor/blueprint/print.css b/app/assets/stylesheets/vendor/blueprint/print.css
deleted file mode 100644
index fdb82208e..000000000
--- a/app/assets/stylesheets/vendor/blueprint/print.css
+++ /dev/null
@@ -1,29 +0,0 @@
-/* -----------------------------------------------------------------------
-
-
- Blueprint CSS Framework 0.9
- http://blueprintcss.org
-
- * Copyright (c) 2007-Present. See LICENSE for more info.
- * See README for instructions on how to use Blueprint.
- * For credits and origins, see AUTHORS.
- * This is a compressed file. See the sources in the 'src' directory.
-
------------------------------------------------------------------------ */
-
-/* print.css */
-body {line-height:1.5;font-family:"Helvetica Neue", Arial, Helvetica, sans-serif;color:#000;background:none;font-size:10pt;}
-.container {background:none;}
-hr {background:#ccc;color:#ccc;width:100%;height:2px;margin:2em 0;padding:0;border:none;}
-hr.space {background:#fff;color:#fff;visibility:hidden;}
-h1, h2, h3, h4, h5, h6 {font-family:"Helvetica Neue", Arial, "Lucida Grande", sans-serif;}
-code {font:.9em "Courier New", Monaco, Courier, monospace;}
-a img {border:none;}
-p img.top {margin-top:0;}
-blockquote {margin:1.5em;padding:1em;font-style:italic;font-size:.9em;}
-.small {font-size:.9em;}
-.large {font-size:1.1em;}
-.quiet {color:#999;}
-.hide {display:none;}
-a:link, a:visited {background:transparent;font-weight:700;text-decoration:underline;}
-a:link:after, a:visited:after {content:" (" attr(href) ")";font-size:90%;} \ No newline at end of file
diff --git a/app/assets/stylesheets/vendor/blueprint/screen.css b/app/assets/stylesheets/vendor/blueprint/screen.css
deleted file mode 100644
index 562a344e0..000000000
--- a/app/assets/stylesheets/vendor/blueprint/screen.css
+++ /dev/null
@@ -1,258 +0,0 @@
-/* -----------------------------------------------------------------------
-
-
- Blueprint CSS Framework 0.9
- http://blueprintcss.org
-
- * Copyright (c) 2007-Present. See LICENSE for more info.
- * See README for instructions on how to use Blueprint.
- * For credits and origins, see AUTHORS.
- * This is a compressed file. See the sources in the 'src' directory.
-
------------------------------------------------------------------------ */
-
-/* reset.css */
-html, body, div, span, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, code, del, dfn, em, img, q, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, dialog, figure, footer, header, hgroup, nav, section {margin:0;padding:0;border:0;font-weight:inherit;font-style:inherit;font-size:100%;font-family:inherit;vertical-align:baseline;}
-article, aside, dialog, figure, footer, header, hgroup, nav, section {display:block;}
-body {line-height:1.5;}
-table {border-collapse:separate;border-spacing:0;}
-caption, th, td {text-align:left;font-weight:normal;}
-table, td, th {vertical-align:middle;}
-blockquote:before, blockquote:after, q:before, q:after {content:"";}
-blockquote, q {quotes:"" "";}
-a img {border:none;}
-
-/* typography.css */
-html {font-size:100.01%;}
-body {font-size:75%;color:#222;background:#fff;font-family:"Helvetica", Arial, sans-serif;}
-h1, h2, h3, h4, h5, h6 {font-weight:normal;color:#111;}
-h1 {font-size:3em;line-height:1;margin-bottom:0.5em;}
-h2 {font-size:2em;margin-bottom:0.75em;}
-h3 {font-size:1.5em;line-height:1;margin-bottom:1em;}
-h4 {font-size:1.2em;line-height:1.25;margin-bottom:1.25em;}
-h5 {font-size:1em;font-weight:bold;margin-bottom:1.5em;}
-h6 {font-size:1em;font-weight:bold;}
-h1 img, h2 img, h3 img, h4 img, h5 img, h6 img {margin:0;}
-p {margin:0 0 1.5em;}
-p img.left {float:left;margin:1.5em 1.5em 1.5em 0;padding:0;}
-p img.right {float:right;margin:1.5em 0 1.5em 1.5em;}
-a:focus, a:hover {color:#000;}
-a {color:#009;text-decoration:underline;}
-blockquote {margin:1.5em;color:#666;font-style:italic;}
-strong {font-weight:bold;}
-em, dfn {font-style:italic;}
-dfn {font-weight:bold;}
-sup, sub {line-height:0;}
-abbr, acronym {border-bottom:1px dotted #666;}
-address {margin:0 0 1.5em;font-style:italic;}
-del {color:#666;}
-pre {margin:1.5em 0;white-space:pre;}
-pre, code, tt {font:1em 'andale mono', 'lucida console', monospace;line-height:1.5;overflow:auto;}
-li ul, li ol {margin:0;}
-ul, ol {margin:0 1.5em 1.5em 0;padding-left:3.333em;}
-ul {list-style-type:disc;}
-ol {list-style-type:decimal;}
-dl {margin:0 0 1.5em 0;}
-dl dt {font-weight:bold;}
-dd {margin-left:1.5em;}
-table {margin-bottom:1.4em;width:100%;}
-th {font-weight:bold;}
-thead th {background:#c3d9ff;}
-th, td, caption {padding:4px 10px 4px 5px;}
-tr.even td {background:#e5ecf9;}
-tfoot {font-style:italic;}
-caption {background:#eee;}
-.small {font-size:.8em;margin-bottom:1.875em;line-height:1.875em;}
-.large {font-size:1.2em;line-height:2.5em;margin-bottom:1.25em;}
-.hide {display:none;}
-.quiet {color:#666;}
-.loud {color:#000;}
-.highlight {background:#ff0;}
-.added {background:#060;color:#fff;}
-.removed {background:#900;color:#fff;}
-.first {margin-left:0;padding-left:0;}
-.last {margin-right:0;padding-right:0;}
-.top {margin-top:0;padding-top:0;}
-.bottom {margin-bottom:0;padding-bottom:0;}
-
-/* forms.css */
-label {font-weight:bold;}
-fieldset {padding:1.4em;margin:0 0 1.5em 0;border:1px solid #ccc;}
-legend {font-weight:bold;font-size:1.2em;}
-input[type=text], input[type=password], input.text, input.title, textarea, select {background-color:#fff;border:1px solid #bbb;}
-input[type=text]:focus, input[type=password]:focus, input.text:focus, input.title:focus, textarea:focus, select:focus {border-color:#666;}
-input[type=text], input[type=password], input.text, input.title, textarea, select {margin:0.5em 0;}
-input.text, input.title {width:300px;padding:5px;}
-input.title {font-size:1.5em;}
-textarea {width:390px;height:250px;padding:5px;}
-input[type=checkbox], input[type=radio], input.checkbox, input.radio {position:relative;top:.25em;}
-form.inline {line-height:3;}
-form.inline p {margin-bottom:0;}
-.error, .notice, .success {padding:.8em;margin-bottom:1em;border:2px solid #ddd;}
-.error {background:#FBE3E4;color:#8a1f11;border-color:#FBC2C4;}
-.notice {background:#FFF6BF;color:#514721;border-color:#FFD324;}
-.success {background:#E6EFC2;color:#264409;border-color:#C6D880;}
-.error a {color:#8a1f11;}
-.notice a {color:#514721;}
-.success a {color:#264409;}
-
-/* grid.css */
-.container {width:950px;margin:0 auto;}
-.showgrid {background:url(src/grid.png);}
-.column, .span-1, .span-2, .span-3, .span-4, .span-5, .span-6, .span-7, .span-8, .span-9, .span-10, .span-11, .span-12, .span-13, .span-14, .span-15, .span-16, .span-17, .span-18, .span-19, .span-20, .span-21, .span-22, .span-23, .span-24 {float:left;margin-right:10px;}
-.last {margin-right:0;}
-.span-1 {width:30px;}
-.span-2 {width:70px;}
-.span-3 {width:110px;}
-.span-4 {width:150px;}
-.span-5 {width:190px;}
-.span-6 {width:230px;}
-.span-7 {width:270px;}
-.span-8 {width:310px;}
-.span-9 {width:350px;}
-.span-10 {width:390px;}
-.span-11 {width:430px;}
-.span-12 {width:470px;}
-.span-13 {width:510px;}
-.span-14 {width:550px;}
-.span-15 {width:590px;}
-.span-16 {width:630px;}
-.span-17 {width:670px;}
-.span-18 {width:710px;}
-.span-19 {width:750px;}
-.span-20 {width:790px;}
-.span-21 {width:830px;}
-.span-22 {width:870px;}
-.span-23 {width:910px;}
-.span-24 {width:950px;margin-right:0;}
-input.span-1, textarea.span-1, input.span-2, textarea.span-2, input.span-3, textarea.span-3, input.span-4, textarea.span-4, input.span-5, textarea.span-5, input.span-6, textarea.span-6, input.span-7, textarea.span-7, input.span-8, textarea.span-8, input.span-9, textarea.span-9, input.span-10, textarea.span-10, input.span-11, textarea.span-11, input.span-12, textarea.span-12, input.span-13, textarea.span-13, input.span-14, textarea.span-14, input.span-15, textarea.span-15, input.span-16, textarea.span-16, input.span-17, textarea.span-17, input.span-18, textarea.span-18, input.span-19, textarea.span-19, input.span-20, textarea.span-20, input.span-21, textarea.span-21, input.span-22, textarea.span-22, input.span-23, textarea.span-23, input.span-24, textarea.span-24 {border-left-width:1px;border-right-width:1px;padding-left:5px;padding-right:5px;}
-input.span-1, textarea.span-1 {width:18px;}
-input.span-2, textarea.span-2 {width:58px;}
-input.span-3, textarea.span-3 {width:98px;}
-input.span-4, textarea.span-4 {width:138px;}
-input.span-5, textarea.span-5 {width:178px;}
-input.span-6, textarea.span-6 {width:218px;}
-input.span-7, textarea.span-7 {width:258px;}
-input.span-8, textarea.span-8 {width:298px;}
-input.span-9, textarea.span-9 {width:338px;}
-input.span-10, textarea.span-10 {width:378px;}
-input.span-11, textarea.span-11 {width:418px;}
-input.span-12, textarea.span-12 {width:458px;}
-input.span-13, textarea.span-13 {width:498px;}
-input.span-14, textarea.span-14 {width:538px;}
-input.span-15, textarea.span-15 {width:578px;}
-input.span-16, textarea.span-16 {width:618px;}
-input.span-17, textarea.span-17 {width:658px;}
-input.span-18, textarea.span-18 {width:698px;}
-input.span-19, textarea.span-19 {width:738px;}
-input.span-20, textarea.span-20 {width:778px;}
-input.span-21, textarea.span-21 {width:818px;}
-input.span-22, textarea.span-22 {width:858px;}
-input.span-23, textarea.span-23 {width:898px;}
-input.span-24, textarea.span-24 {width:938px;}
-.append-1 {padding-right:40px;}
-.append-2 {padding-right:80px;}
-.append-3 {padding-right:120px;}
-.append-4 {padding-right:160px;}
-.append-5 {padding-right:200px;}
-.append-6 {padding-right:240px;}
-.append-7 {padding-right:280px;}
-.append-8 {padding-right:320px;}
-.append-9 {padding-right:360px;}
-.append-10 {padding-right:400px;}
-.append-11 {padding-right:440px;}
-.append-12 {padding-right:480px;}
-.append-13 {padding-right:520px;}
-.append-14 {padding-right:560px;}
-.append-15 {padding-right:600px;}
-.append-16 {padding-right:640px;}
-.append-17 {padding-right:680px;}
-.append-18 {padding-right:720px;}
-.append-19 {padding-right:760px;}
-.append-20 {padding-right:800px;}
-.append-21 {padding-right:840px;}
-.append-22 {padding-right:880px;}
-.append-23 {padding-right:920px;}
-.prepend-1 {padding-left:40px;}
-.prepend-2 {padding-left:80px;}
-.prepend-3 {padding-left:120px;}
-.prepend-4 {padding-left:160px;}
-.prepend-5 {padding-left:200px;}
-.prepend-6 {padding-left:240px;}
-.prepend-7 {padding-left:280px;}
-.prepend-8 {padding-left:320px;}
-.prepend-9 {padding-left:360px;}
-.prepend-10 {padding-left:400px;}
-.prepend-11 {padding-left:440px;}
-.prepend-12 {padding-left:480px;}
-.prepend-13 {padding-left:520px;}
-.prepend-14 {padding-left:560px;}
-.prepend-15 {padding-left:600px;}
-.prepend-16 {padding-left:640px;}
-.prepend-17 {padding-left:680px;}
-.prepend-18 {padding-left:720px;}
-.prepend-19 {padding-left:760px;}
-.prepend-20 {padding-left:800px;}
-.prepend-21 {padding-left:840px;}
-.prepend-22 {padding-left:880px;}
-.prepend-23 {padding-left:920px;}
-.border {padding-right:4px;margin-right:5px;border-right:1px solid #eee;}
-.colborder {padding-right:24px;margin-right:25px;border-right:1px solid #eee;}
-.pull-1 {margin-left:-40px;}
-.pull-2 {margin-left:-80px;}
-.pull-3 {margin-left:-120px;}
-.pull-4 {margin-left:-160px;}
-.pull-5 {margin-left:-200px;}
-.pull-6 {margin-left:-240px;}
-.pull-7 {margin-left:-280px;}
-.pull-8 {margin-left:-320px;}
-.pull-9 {margin-left:-360px;}
-.pull-10 {margin-left:-400px;}
-.pull-11 {margin-left:-440px;}
-.pull-12 {margin-left:-480px;}
-.pull-13 {margin-left:-520px;}
-.pull-14 {margin-left:-560px;}
-.pull-15 {margin-left:-600px;}
-.pull-16 {margin-left:-640px;}
-.pull-17 {margin-left:-680px;}
-.pull-18 {margin-left:-720px;}
-.pull-19 {margin-left:-760px;}
-.pull-20 {margin-left:-800px;}
-.pull-21 {margin-left:-840px;}
-.pull-22 {margin-left:-880px;}
-.pull-23 {margin-left:-920px;}
-.pull-24 {margin-left:-960px;}
-.pull-1, .pull-2, .pull-3, .pull-4, .pull-5, .pull-6, .pull-7, .pull-8, .pull-9, .pull-10, .pull-11, .pull-12, .pull-13, .pull-14, .pull-15, .pull-16, .pull-17, .pull-18, .pull-19, .pull-20, .pull-21, .pull-22, .pull-23, .pull-24 {float:left;position:relative;}
-.push-1 {margin:0 -40px 1.5em 40px;}
-.push-2 {margin:0 -80px 1.5em 80px;}
-.push-3 {margin:0 -120px 1.5em 120px;}
-.push-4 {margin:0 -160px 1.5em 160px;}
-.push-5 {margin:0 -200px 1.5em 200px;}
-.push-6 {margin:0 -240px 1.5em 240px;}
-.push-7 {margin:0 -280px 1.5em 280px;}
-.push-8 {margin:0 -320px 1.5em 320px;}
-.push-9 {margin:0 -360px 1.5em 360px;}
-.push-10 {margin:0 -400px 1.5em 400px;}
-.push-11 {margin:0 -440px 1.5em 440px;}
-.push-12 {margin:0 -480px 1.5em 480px;}
-.push-13 {margin:0 -520px 1.5em 520px;}
-.push-14 {margin:0 -560px 1.5em 560px;}
-.push-15 {margin:0 -600px 1.5em 600px;}
-.push-16 {margin:0 -640px 1.5em 640px;}
-.push-17 {margin:0 -680px 1.5em 680px;}
-.push-18 {margin:0 -720px 1.5em 720px;}
-.push-19 {margin:0 -760px 1.5em 760px;}
-.push-20 {margin:0 -800px 1.5em 800px;}
-.push-21 {margin:0 -840px 1.5em 840px;}
-.push-22 {margin:0 -880px 1.5em 880px;}
-.push-23 {margin:0 -920px 1.5em 920px;}
-.push-24 {margin:0 -960px 1.5em 960px;}
-.push-1, .push-2, .push-3, .push-4, .push-5, .push-6, .push-7, .push-8, .push-9, .push-10, .push-11, .push-12, .push-13, .push-14, .push-15, .push-16, .push-17, .push-18, .push-19, .push-20, .push-21, .push-22, .push-23, .push-24 {float:right;position:relative;}
-.prepend-top {margin-top:1.5em;}
-.append-bottom {margin-bottom:1.5em;}
-.box {padding:1.5em;margin-bottom:1.5em;background:#E5ECF9;}
-hr {background:#ddd;color:#ddd;clear:both;float:none;width:100%;height:.1em;margin:0 0 1.45em;border:none;}
-hr.space {background:#fff;color:#fff;visibility:hidden;}
-.clearfix:after, .container:after {content:"\0020";display:block;height:0;clear:both;visibility:hidden;overflow:hidden;}
-.clearfix, .container {display:block;}
-.clear {clear:both;}
diff --git a/app/assets/stylesheets/vendor/blueprint/src/forms.css b/app/assets/stylesheets/vendor/blueprint/src/forms.css
deleted file mode 100644
index b49113407..000000000
--- a/app/assets/stylesheets/vendor/blueprint/src/forms.css
+++ /dev/null
@@ -1,65 +0,0 @@
-/* --------------------------------------------------------------
-
- forms.css
- * Sets up some default styling for forms
- * Gives you classes to enhance your forms
-
- Usage:
- * For text fields, use class .title or .text
- * For inline forms, use .inline (even when using columns)
-
--------------------------------------------------------------- */
-
-label { font-weight: bold; }
-fieldset { padding:1.4em; margin: 0 0 1.5em 0; border: 1px solid #ccc; }
-legend { font-weight: bold; font-size:1.2em; }
-
-
-/* Form fields
--------------------------------------------------------------- */
-
-input[type=text], input[type=password],
-input.text, input.title,
-textarea, select {
- background-color:#fff;
- border:1px solid #bbb;
-}
-input[type=text]:focus, input[type=password]:focus,
-input.text:focus, input.title:focus,
-textarea:focus, select:focus {
- border-color:#666;
-}
-
-input[type=text], input[type=password],
-input.text, input.title,
-textarea, select {
- margin:0.5em 0;
-}
-
-input.text,
-input.title { width: 300px; padding:5px; }
-input.title { font-size:1.5em; }
-textarea { width: 390px; height: 250px; padding:5px; }
-
-input[type=checkbox], input[type=radio],
-input.checkbox, input.radio {
- position:relative; top:.25em;
-}
-
-form.inline { line-height:3; }
-form.inline p { margin-bottom:0; }
-
-
-/* Success, notice and error boxes
--------------------------------------------------------------- */
-
-.error,
-.notice,
-.success { padding: .8em; margin-bottom: 1em; border: 2px solid #ddd; }
-
-.error { background: #FBE3E4; color: #8a1f11; border-color: #FBC2C4; }
-.notice { background: #FFF6BF; color: #514721; border-color: #FFD324; }
-.success { background: #E6EFC2; color: #264409; border-color: #C6D880; }
-.error a { color: #8a1f11; }
-.notice a { color: #514721; }
-.success a { color: #264409; }
diff --git a/app/assets/stylesheets/vendor/blueprint/src/grid.css b/app/assets/stylesheets/vendor/blueprint/src/grid.css
deleted file mode 100644
index 02a9d0ca3..000000000
--- a/app/assets/stylesheets/vendor/blueprint/src/grid.css
+++ /dev/null
@@ -1,280 +0,0 @@
-/* --------------------------------------------------------------
-
- grid.css
- * Sets up an easy-to-use grid of 24 columns.
-
- By default, the grid is 950px wide, with 24 columns
- spanning 30px, and a 10px margin between columns.
-
- If you need fewer or more columns, namespaces or semantic
- element names, use the compressor script (lib/compress.rb)
-
--------------------------------------------------------------- */
-
-/* A container should group all your columns. */
-.container {
- width: 950px;
- margin: 0 auto;
-}
-
-/* Use this class on any .span / container to see the grid. */
-.showgrid {
- background: url(src/grid.png);
-}
-
-
-/* Columns
--------------------------------------------------------------- */
-
-/* Sets up basic grid floating and margin. */
-.column, .span-1, .span-2, .span-3, .span-4, .span-5, .span-6, .span-7, .span-8, .span-9, .span-10, .span-11, .span-12, .span-13, .span-14, .span-15, .span-16, .span-17, .span-18, .span-19, .span-20, .span-21, .span-22, .span-23, .span-24 {
- float: left;
- margin-right: 10px;
-}
-
-/* The last column in a row needs this class. */
-.last { margin-right: 0; }
-
-/* Use these classes to set the width of a column. */
-.span-1 {width: 30px;}
-
-.span-2 {width: 70px;}
-.span-3 {width: 110px;}
-.span-4 {width: 150px;}
-.span-5 {width: 190px;}
-.span-6 {width: 230px;}
-.span-7 {width: 270px;}
-.span-8 {width: 310px;}
-.span-9 {width: 350px;}
-.span-10 {width: 390px;}
-.span-11 {width: 430px;}
-.span-12 {width: 470px;}
-.span-13 {width: 510px;}
-.span-14 {width: 550px;}
-.span-15 {width: 590px;}
-.span-16 {width: 630px;}
-.span-17 {width: 670px;}
-.span-18 {width: 710px;}
-.span-19 {width: 750px;}
-.span-20 {width: 790px;}
-.span-21 {width: 830px;}
-.span-22 {width: 870px;}
-.span-23 {width: 910px;}
-.span-24 {width:950px; margin-right:0;}
-
-/* Use these classes to set the width of an input. */
-input.span-1, textarea.span-1, input.span-2, textarea.span-2, input.span-3, textarea.span-3, input.span-4, textarea.span-4, input.span-5, textarea.span-5, input.span-6, textarea.span-6, input.span-7, textarea.span-7, input.span-8, textarea.span-8, input.span-9, textarea.span-9, input.span-10, textarea.span-10, input.span-11, textarea.span-11, input.span-12, textarea.span-12, input.span-13, textarea.span-13, input.span-14, textarea.span-14, input.span-15, textarea.span-15, input.span-16, textarea.span-16, input.span-17, textarea.span-17, input.span-18, textarea.span-18, input.span-19, textarea.span-19, input.span-20, textarea.span-20, input.span-21, textarea.span-21, input.span-22, textarea.span-22, input.span-23, textarea.span-23, input.span-24, textarea.span-24 {
- border-left-width: 1px;
- border-right-width: 1px;
- padding-left: 5px;
- padding-right: 5px;
-}
-
-input.span-1, textarea.span-1 { width: 18px; }
-input.span-2, textarea.span-2 { width: 58px; }
-input.span-3, textarea.span-3 { width: 98px; }
-input.span-4, textarea.span-4 { width: 138px; }
-input.span-5, textarea.span-5 { width: 178px; }
-input.span-6, textarea.span-6 { width: 218px; }
-input.span-7, textarea.span-7 { width: 258px; }
-input.span-8, textarea.span-8 { width: 298px; }
-input.span-9, textarea.span-9 { width: 338px; }
-input.span-10, textarea.span-10 { width: 378px; }
-input.span-11, textarea.span-11 { width: 418px; }
-input.span-12, textarea.span-12 { width: 458px; }
-input.span-13, textarea.span-13 { width: 498px; }
-input.span-14, textarea.span-14 { width: 538px; }
-input.span-15, textarea.span-15 { width: 578px; }
-input.span-16, textarea.span-16 { width: 618px; }
-input.span-17, textarea.span-17 { width: 658px; }
-input.span-18, textarea.span-18 { width: 698px; }
-input.span-19, textarea.span-19 { width: 738px; }
-input.span-20, textarea.span-20 { width: 778px; }
-input.span-21, textarea.span-21 { width: 818px; }
-input.span-22, textarea.span-22 { width: 858px; }
-input.span-23, textarea.span-23 { width: 898px; }
-input.span-24, textarea.span-24 { width: 938px; }
-
-/* Add these to a column to append empty cols. */
-
-.append-1 { padding-right: 40px;}
-.append-2 { padding-right: 80px;}
-.append-3 { padding-right: 120px;}
-.append-4 { padding-right: 160px;}
-.append-5 { padding-right: 200px;}
-.append-6 { padding-right: 240px;}
-.append-7 { padding-right: 280px;}
-.append-8 { padding-right: 320px;}
-.append-9 { padding-right: 360px;}
-.append-10 { padding-right: 400px;}
-.append-11 { padding-right: 440px;}
-.append-12 { padding-right: 480px;}
-.append-13 { padding-right: 520px;}
-.append-14 { padding-right: 560px;}
-.append-15 { padding-right: 600px;}
-.append-16 { padding-right: 640px;}
-.append-17 { padding-right: 680px;}
-.append-18 { padding-right: 720px;}
-.append-19 { padding-right: 760px;}
-.append-20 { padding-right: 800px;}
-.append-21 { padding-right: 840px;}
-.append-22 { padding-right: 880px;}
-.append-23 { padding-right: 920px;}
-
-/* Add these to a column to prepend empty cols. */
-
-.prepend-1 { padding-left: 40px;}
-.prepend-2 { padding-left: 80px;}
-.prepend-3 { padding-left: 120px;}
-.prepend-4 { padding-left: 160px;}
-.prepend-5 { padding-left: 200px;}
-.prepend-6 { padding-left: 240px;}
-.prepend-7 { padding-left: 280px;}
-.prepend-8 { padding-left: 320px;}
-.prepend-9 { padding-left: 360px;}
-.prepend-10 { padding-left: 400px;}
-.prepend-11 { padding-left: 440px;}
-.prepend-12 { padding-left: 480px;}
-.prepend-13 { padding-left: 520px;}
-.prepend-14 { padding-left: 560px;}
-.prepend-15 { padding-left: 600px;}
-.prepend-16 { padding-left: 640px;}
-.prepend-17 { padding-left: 680px;}
-.prepend-18 { padding-left: 720px;}
-.prepend-19 { padding-left: 760px;}
-.prepend-20 { padding-left: 800px;}
-.prepend-21 { padding-left: 840px;}
-.prepend-22 { padding-left: 880px;}
-.prepend-23 { padding-left: 920px;}
-
-
-/* Border on right hand side of a column. */
-.border {
- padding-right: 4px;
- margin-right: 5px;
- border-right: 1px solid #eee;
-}
-
-/* Border with more whitespace, spans one column. */
-.colborder {
- padding-right: 24px;
- margin-right: 25px;
- border-right: 1px solid #eee;
-}
-
-
-/* Use these classes on an element to push it into the
-next column, or to pull it into the previous column. */
-
-
-.pull-1 { margin-left: -40px; }
-.pull-2 { margin-left: -80px; }
-.pull-3 { margin-left: -120px; }
-.pull-4 { margin-left: -160px; }
-.pull-5 { margin-left: -200px; }
-.pull-6 { margin-left: -240px; }
-.pull-7 { margin-left: -280px; }
-.pull-8 { margin-left: -320px; }
-.pull-9 { margin-left: -360px; }
-.pull-10 { margin-left: -400px; }
-.pull-11 { margin-left: -440px; }
-.pull-12 { margin-left: -480px; }
-.pull-13 { margin-left: -520px; }
-.pull-14 { margin-left: -560px; }
-.pull-15 { margin-left: -600px; }
-.pull-16 { margin-left: -640px; }
-.pull-17 { margin-left: -680px; }
-.pull-18 { margin-left: -720px; }
-.pull-19 { margin-left: -760px; }
-.pull-20 { margin-left: -800px; }
-.pull-21 { margin-left: -840px; }
-.pull-22 { margin-left: -880px; }
-.pull-23 { margin-left: -920px; }
-.pull-24 { margin-left: -960px; }
-
-.pull-1, .pull-2, .pull-3, .pull-4, .pull-5, .pull-6, .pull-7, .pull-8, .pull-9, .pull-10, .pull-11, .pull-12, .pull-13, .pull-14, .pull-15, .pull-16, .pull-17, .pull-18, .pull-19, .pull-20, .pull-21, .pull-22, .pull-23, .pull-24 {float: left; position:relative;}
-
-
-.push-1 { margin: 0 -40px 1.5em 40px; }
-.push-2 { margin: 0 -80px 1.5em 80px; }
-.push-3 { margin: 0 -120px 1.5em 120px; }
-.push-4 { margin: 0 -160px 1.5em 160px; }
-.push-5 { margin: 0 -200px 1.5em 200px; }
-.push-6 { margin: 0 -240px 1.5em 240px; }
-.push-7 { margin: 0 -280px 1.5em 280px; }
-.push-8 { margin: 0 -320px 1.5em 320px; }
-.push-9 { margin: 0 -360px 1.5em 360px; }
-.push-10 { margin: 0 -400px 1.5em 400px; }
-.push-11 { margin: 0 -440px 1.5em 440px; }
-.push-12 { margin: 0 -480px 1.5em 480px; }
-.push-13 { margin: 0 -520px 1.5em 520px; }
-.push-14 { margin: 0 -560px 1.5em 560px; }
-.push-15 { margin: 0 -600px 1.5em 600px; }
-.push-16 { margin: 0 -640px 1.5em 640px; }
-.push-17 { margin: 0 -680px 1.5em 680px; }
-.push-18 { margin: 0 -720px 1.5em 720px; }
-.push-19 { margin: 0 -760px 1.5em 760px; }
-.push-20 { margin: 0 -800px 1.5em 800px; }
-.push-21 { margin: 0 -840px 1.5em 840px; }
-.push-22 { margin: 0 -880px 1.5em 880px; }
-.push-23 { margin: 0 -920px 1.5em 920px; }
-.push-24 { margin: 0 -960px 1.5em 960px; }
-
-.push-1, .push-2, .push-3, .push-4, .push-5, .push-6, .push-7, .push-8, .push-9, .push-10, .push-11, .push-12, .push-13, .push-14, .push-15, .push-16, .push-17, .push-18, .push-19, .push-20, .push-21, .push-22, .push-23, .push-24 {float: right; position:relative;}
-
-
-/* Misc classes and elements
--------------------------------------------------------------- */
-
-/* In case you need to add a gutter above/below an element */
-.prepend-top {
- margin-top:1.5em;
-}
-.append-bottom {
- margin-bottom:1.5em;
-}
-
-/* Use a .box to create a padded box inside a column. */
-.box {
- padding: 1.5em;
- margin-bottom: 1.5em;
- background: #E5ECF9;
-}
-
-/* Use this to create a horizontal ruler across a column. */
-hr {
- background: #ddd;
- color: #ddd;
- clear: both;
- float: none;
- width: 100%;
- height: .1em;
- margin: 0 0 1.45em;
- border: none;
-}
-
-hr.space {
- background: #fff;
- color: #fff;
- visibility: hidden;
-}
-
-
-/* Clearing floats without extra markup
- Based on How To Clear Floats Without Structural Markup by PiE
- [http://www.positioniseverything.net/easyclearing.html] */
-
-.clearfix:after, .container:after {
- content: "\0020";
- display: block;
- height: 0;
- clear: both;
- visibility: hidden;
- overflow:hidden;
-}
-.clearfix, .container {display: block;}
-
-/* Regular clearing
- apply to column that should drop below previous ones. */
-
-.clear { clear:both; }
diff --git a/app/assets/stylesheets/vendor/blueprint/src/grid.png b/app/assets/stylesheets/vendor/blueprint/src/grid.png
deleted file mode 100644
index 61a068918..000000000
--- a/app/assets/stylesheets/vendor/blueprint/src/grid.png
+++ /dev/null
Binary files differ
diff --git a/app/assets/stylesheets/vendor/blueprint/src/ie.css b/app/assets/stylesheets/vendor/blueprint/src/ie.css
deleted file mode 100644
index 0f458e6e9..000000000
--- a/app/assets/stylesheets/vendor/blueprint/src/ie.css
+++ /dev/null
@@ -1,76 +0,0 @@
-/* --------------------------------------------------------------
-
- ie.css
-
- Contains every hack for Internet Explorer,
- so that our core files stay sweet and nimble.
-
--------------------------------------------------------------- */
-
-/* Make sure the layout is centered in IE5 */
-body { text-align: center; }
-.container { text-align: left; }
-
-/* Fixes IE margin bugs */
-* html .column, * html .span-1, * html .span-2,
-* html .span-3, * html .span-4, * html .span-5,
-* html .span-6, * html .span-7, * html .span-8,
-* html .span-9, * html .span-10, * html .span-11,
-* html .span-12, * html .span-13, * html .span-14,
-* html .span-15, * html .span-16, * html .span-17,
-* html .span-18, * html .span-19, * html .span-20,
-* html .span-21, * html .span-22, * html .span-23,
-* html .span-24 { display:inline; overflow-x: hidden; }
-
-
-/* Elements
--------------------------------------------------------------- */
-
-/* Fixes incorrect styling of legend in IE6. */
-* html legend { margin:0px -8px 16px 0; padding:0; }
-
-/* Fixes wrong line-height on sup/sub in IE. */
-sup { vertical-align:text-top; }
-sub { vertical-align:text-bottom; }
-
-/* Fixes IE7 missing wrapping of code elements. */
-html>body p code { *white-space: normal; }
-
-/* IE 6&7 has problems with setting proper <hr> margins. */
-hr { margin:-8px auto 11px; }
-
-/* Explicitly set interpolation, allowing dynamically resized images to not look horrible */
-img { -ms-interpolation-mode:bicubic; }
-
-/* Clearing
--------------------------------------------------------------- */
-
-/* Makes clearfix actually work in IE */
-.clearfix, .container { display:inline-block; }
-* html .clearfix,
-* html .container { height:1%; }
-
-
-/* Forms
--------------------------------------------------------------- */
-
-/* Fixes padding on fieldset */
-fieldset { padding-top:0; }
-
-/* Makes classic textareas in IE 6 resemble other browsers */
-textarea { overflow:auto; }
-
-/* Fixes rule that IE 6 ignores */
-input.text, input.title, textarea { background-color:#fff; border:1px solid #bbb; }
-input.text:focus, input.title:focus { border-color:#666; }
-input.text, input.title, textarea, select { margin:0.5em 0; }
-input.checkbox, input.radio { position:relative; top:.25em; }
-
-/* Fixes alignment of inline form elements */
-form.inline div, form.inline p { vertical-align:middle; }
-form.inline label { position:relative;top:-0.25em; }
-form.inline input.checkbox, form.inline input.radio,
-form.inline input.button, form.inline button {
- margin:0.5em 0;
-}
-button, input.button { position:relative;top:0.25em; }
diff --git a/app/assets/stylesheets/vendor/blueprint/src/print.css b/app/assets/stylesheets/vendor/blueprint/src/print.css
deleted file mode 100644
index bbc7948af..000000000
--- a/app/assets/stylesheets/vendor/blueprint/src/print.css
+++ /dev/null
@@ -1,85 +0,0 @@
-/* --------------------------------------------------------------
-
- print.css
- * Gives you some sensible styles for printing pages.
- * See Readme file in this directory for further instructions.
-
- Some additions you'll want to make, customized to your markup:
- #header, #footer, #navigation { display:none; }
-
--------------------------------------------------------------- */
-
-body {
- line-height: 1.5;
- font-family: "Helvetica Neue", Arial, Helvetica, sans-serif;
- color:#000;
- background: none;
- font-size: 10pt;
-}
-
-
-/* Layout
--------------------------------------------------------------- */
-
-.container {
- background: none;
-}
-
-hr {
- background:#ccc;
- color:#ccc;
- width:100%;
- height:2px;
- margin:2em 0;
- padding:0;
- border:none;
-}
-hr.space {
- background: #fff;
- color: #fff;
- visibility: hidden;
-}
-
-
-/* Text
--------------------------------------------------------------- */
-
-h1,h2,h3,h4,h5,h6 { font-family: "Helvetica Neue", Arial, "Lucida Grande", sans-serif; }
-code { font:.9em "Courier New", Monaco, Courier, monospace; }
-
-a img { border:none; }
-p img.top { margin-top: 0; }
-
-blockquote {
- margin:1.5em;
- padding:1em;
- font-style:italic;
- font-size:.9em;
-}
-
-.small { font-size: .9em; }
-.large { font-size: 1.1em; }
-.quiet { color: #999; }
-.hide { display:none; }
-
-
-/* Links
--------------------------------------------------------------- */
-
-a:link, a:visited {
- background: transparent;
- font-weight:700;
- text-decoration: underline;
-}
-
-a:link:after, a:visited:after {
- content: " (" attr(href) ")";
- font-size: 90%;
-}
-
-/* If you're having trouble printing relative links, uncomment and customize this:
- (note: This is valid CSS3, but it still won't go through the W3C CSS Validator) */
-
-/* a[href^="/"]:after {
- content: " (http://www.yourdomain.com" attr(href) ") ";
-} */
diff --git a/app/assets/stylesheets/vendor/blueprint/src/reset.css b/app/assets/stylesheets/vendor/blueprint/src/reset.css
deleted file mode 100644
index 09d9131ab..000000000
--- a/app/assets/stylesheets/vendor/blueprint/src/reset.css
+++ /dev/null
@@ -1,45 +0,0 @@
-/* --------------------------------------------------------------
-
- reset.css
- * Resets default browser CSS.
-
--------------------------------------------------------------- */
-
-html, body, div, span, object, iframe,
-h1, h2, h3, h4, h5, h6, p, blockquote, pre,
-a, abbr, acronym, address, code,
-del, dfn, em, img, q, dl, dt, dd, ol, ul, li,
-fieldset, form, label, legend,
-table, caption, tbody, tfoot, thead, tr, th, td,
-article, aside, dialog, figure, footer, header,
-hgroup, nav, section {
- margin: 0;
- padding: 0;
- border: 0;
- font-weight: inherit;
- font-style: inherit;
- font-size: 100%;
- font-family: inherit;
- vertical-align: baseline;
-}
-
-article, aside, dialog, figure, footer, header,
-hgroup, nav, section {
- display:block;
-}
-
-body {
- line-height: 1.5;
-}
-
-/* Tables still need 'cellspacing="0"' in the markup. */
-table { border-collapse: separate; border-spacing: 0; }
-caption, th, td { text-align: left; font-weight: normal; }
-table, td, th { vertical-align: middle; }
-
-/* Remove possible quote marks (") from <q>, <blockquote>. */
-blockquote:before, blockquote:after, q:before, q:after { content: ""; }
-blockquote, q { quotes: "" ""; }
-
-/* Remove annoying border on linked images. */
-a img { border: none; }
diff --git a/app/assets/stylesheets/vendor/blueprint/src/typography.css b/app/assets/stylesheets/vendor/blueprint/src/typography.css
deleted file mode 100644
index a1cfe272b..000000000
--- a/app/assets/stylesheets/vendor/blueprint/src/typography.css
+++ /dev/null
@@ -1,106 +0,0 @@
-/* --------------------------------------------------------------
-
- typography.css
- * Sets up some sensible default typography.
-
--------------------------------------------------------------- */
-
-/* Default font settings.
- The font-size percentage is of 16px. (0.75 * 16px = 12px) */
-html { font-size:100.01%; }
-body {
- font-size: 75%;
- color: #222;
- background: #fff;
- font-family: "Helvetica Neue", Arial, Helvetica, sans-serif;
-}
-
-
-/* Headings
--------------------------------------------------------------- */
-
-h1,h2,h3,h4,h5,h6 { font-weight: normal; color: #111; }
-
-h1 { font-size: 3em; line-height: 1; margin-bottom: 0.5em; }
-h2 { font-size: 2em; margin-bottom: 0.75em; }
-h3 { font-size: 1.5em; line-height: 1; margin-bottom: 1em; }
-h4 { font-size: 1.2em; line-height: 1.25; margin-bottom: 1.25em; }
-h5 { font-size: 1em; font-weight: bold; margin-bottom: 1.5em; }
-h6 { font-size: 1em; font-weight: bold; }
-
-h1 img, h2 img, h3 img,
-h4 img, h5 img, h6 img {
- margin: 0;
-}
-
-
-/* Text elements
--------------------------------------------------------------- */
-
-p { margin: 0 0 1.5em; }
-p img.left { float: left; margin: 1.5em 1.5em 1.5em 0; padding: 0; }
-p img.right { float: right; margin: 1.5em 0 1.5em 1.5em; }
-
-a:focus,
-a:hover { color: #000; }
-a { color: #009; text-decoration: underline; }
-
-blockquote { margin: 1.5em; color: #666; font-style: italic; }
-strong { font-weight: bold; }
-em,dfn { font-style: italic; }
-dfn { font-weight: bold; }
-sup, sub { line-height: 0; }
-
-abbr,
-acronym { border-bottom: 1px dotted #666; }
-address { margin: 0 0 1.5em; font-style: italic; }
-del { color:#666; }
-
-pre { margin: 1.5em 0; white-space: pre; }
-pre,code,tt { font: 1em 'andale mono', 'lucida console', monospace; line-height: 1.5; }
-
-
-/* Lists
--------------------------------------------------------------- */
-
-li ul,
-li ol { margin: 0; }
-ul, ol { margin: 0 1.5em 1.5em 0; padding-left: 3.333em; }
-
-ul { list-style-type: disc; }
-ol { list-style-type: decimal; }
-
-dl { margin: 0 0 1.5em 0; }
-dl dt { font-weight: bold; }
-dd { margin-left: 1.5em;}
-
-
-/* Tables
--------------------------------------------------------------- */
-
-table { margin-bottom: 1.4em; width:100%; }
-th { font-weight: bold; }
-thead th { background: #c3d9ff; }
-th,td,caption { padding: 4px 10px 4px 5px; }
-tr.even td { background: #e5ecf9; }
-tfoot { font-style: italic; }
-caption { background: #eee; }
-
-
-/* Misc classes
--------------------------------------------------------------- */
-
-.small { font-size: .8em; margin-bottom: 1.875em; line-height: 1.875em; }
-.large { font-size: 1.2em; line-height: 2.5em; margin-bottom: 1.25em; }
-.hide { display: none; }
-
-.quiet { color: #666; }
-.loud { color: #000; }
-.highlight { background:#ff0; }
-.added { background:#060; color: #fff; }
-.removed { background:#900; color: #fff; }
-
-.first { margin-left:0; padding-left:0; }
-.last { margin-right:0; padding-right:0; }
-.top { margin-top:0; padding-top:0; }
-.bottom { margin-bottom:0; padding-bottom:0; }
diff --git a/app/assets/stylesheets/vendor/facebox.css b/app/assets/stylesheets/vendor/facebox.css
index bd754e51b..511a9ef36 100755..100644
--- a/app/assets/stylesheets/vendor/facebox.css
+++ b/app/assets/stylesheets/vendor/facebox.css
@@ -9,11 +9,7 @@
#facebox .popup{
position:relative;
border:1px solid #999;
- -webkit-border-radius:2px;
- -moz-border-radius:2px;
border-radius:2px;
- -webkit-box-shadow:0 0 10px rgba(0,0,0,0.8), 0 2px 200px rgba(255,255,255,0.2);
- -moz-box-shadow:0 0 10px rgba(0,0,0,0.8), 0 2px 200px rgba(255,255,255,0.2);;
box-shadow:0 0 10px rgba(0,0,0,0.8), 0 2px 200px rgba(255,255,255,0.2);;
}
@@ -22,8 +18,6 @@
width: 370px;
padding: 20px;
background: #fff;
- -webkit-border-radius:2px;
- -moz-border-radius:2px;
border-radius:2px;
}
diff --git a/app/assets/stylesheets/vendor/fileuploader.css b/app/assets/stylesheets/vendor/fileuploader.css
index e530c6594..cfd76937f 100644
--- a/app/assets/stylesheets/vendor/fileuploader.css
+++ b/app/assets/stylesheets/vendor/fileuploader.css
@@ -1,29 +1,74 @@
-.qq-uploader { position:relative; width: 100%;}
+.qq-uploader {
+ position:relative;
+ width: 100%;
+}
.qq-upload-button {
display:block; /* or inline-block */
- width: 105px; padding: 7px 0; text-align:center;
- background:#333; border-bottom:1px solid #999;color:#fff;
+ width: 105px;
+ padding: 7px 0;
+ text-align:center;
+ background:#333;
+ border-bottom:1px solid #999;
+ color:#fff;
}
.qq-upload-drop-area {
- position:absolute; top:0; left:0; width:100%; height:100%; min-height: 70px; z-index:2;
- background:#ccc; text-align:center;
+ position:absolute;
+ top:0; left:0;
+ width:100%;
+ height:100%;
+ min-height: 70px;
+ z-index:2;
+ background:#ccc;
+ text-align:center;
}
+
.qq-upload-drop-area span {
- display:block; position:absolute; top: 50%; width:100%; margin-top:-8px; font-size:16px;
+ display:block;
+ position:absolute;
+ top: 50%;
+ width:100%;
+ margin-top:-8px;
+ font-size:16px;
+}
+
+.qq-upload-drop-area-active {
+ background:#FF7171;
+}
+
+.qq-upload-list {
+ margin:15px 35px;
+ padding:0;
+ list-style:disc;
+}
+
+.qq-upload-list li {
+ margin:0;
+ padding:0;
+ line-height:15px;
+ font-size:12px;
}
-.qq-upload-drop-area-active {background:#FF7171;}
-.qq-upload-list {margin:15px 35px; padding:0; list-style:disc;}
-.qq-upload-list li { margin:0; padding:0; line-height:15px; font-size:12px;}
.qq-upload-file, .qq-upload-spinner, .qq-upload-size, .qq-upload-cancel, .qq-upload-failed-text {
margin-right: 7px;
}
-.qq-upload-file {}
-.qq-upload-spinner {display:inline-block; background: url("loading.gif"); width:15px; height:15px; vertical-align:text-bottom;}
-.qq-upload-size,.qq-upload-cancel {font-size:11px;}
+.qq-upload-spinner {
+ display:inline-block;
+ background: url("loading.gif");
+ width:15px;
+ height:15px;
+ vertical-align:text-bottom;
+}
+
+.qq-upload-size,.qq-upload-cancel {
+ font-size:11px;
+}
-.qq-upload-failed-text {display:none;}
-.qq-upload-fail .qq-upload-failed-text {display:inline;}
+.qq-upload-failed-text {
+ display:none;
+}
+.qq-upload-fail .qq-upload-failed-text {
+ display:inline;
+}
diff --git a/app/assets/stylesheets/vendor/html5-boilerplate-mobile.css b/app/assets/stylesheets/vendor/html5-boilerplate-mobile.css
deleted file mode 100644
index 22c33391c..000000000
--- a/app/assets/stylesheets/vendor/html5-boilerplate-mobile.css
+++ /dev/null
@@ -1,315 +0,0 @@
-/*
- * HTML5 ✰ Boilerplate
- *
- * What follows is the result of much research on cross-browser styling.
- * Credit left inline and big thanks to Nicolas Gallagher, Jonathan Neal,
- * Kroc Camen, and the H5BP dev community and team.
- *
- * Detailed information about this CSS: h5bp.com/css
- *
- * ==|== normalize ==========================================================
- */
-
-
-/* =============================================================================
- HTML5 display definitions
- ========================================================================== */
-
-article, aside, details, figcaption, figure, footer, header, hgroup, nav, section { display: block; }
-audio, canvas, video { display: inline-block; *display: inline; *zoom: 1; }
-audio:not([controls]) { display: none; }
-[hidden] { display: none; }
-
-
-/* =============================================================================
- Base
- ========================================================================== */
-
-/*
- * 1. Correct text resizing oddly in IE6/7 when body font-size is set using em units
- * 2. Force vertical scrollbar in non-IE
- * 3. Prevent iOS text size adjust on device orientation change, without disabling user zoom: h5bp.com/g
- */
-
-html { font-size: 100%; overflow-y: scroll; -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; }
-
-body { margin: 0; font-size: 13px; line-height: 1.231; }
-
-body, button, input, select, textarea { font-family: sans-serif; color: #222; }
-
-/*
- * Remove text-shadow in selection highlight: h5bp.com/i
- * These selection declarations have to be separate
- * Also: hot pink! (or customize the background color to match your design)
- */
-
-::-moz-selection { background: #fe57a1; color: #fff; text-shadow: none; }
-::selection { background: #fe57a1; color: #fff; text-shadow: none; }
-
-
-/* =============================================================================
- Links
- ========================================================================== */
-
-a { color: #00e; }
-a:visited { color: #551a8b; }
-a:hover { color: #06e; }
-a:focus { outline: thin dotted; }
-
-/* Improve readability when focused and hovered in all browsers: h5bp.com/h */
-a:hover, a:active { outline: 0; }
-
-
-/* =============================================================================
- Typography
- ========================================================================== */
-
-abbr[title] { border-bottom: 1px dotted; }
-
-b, strong { font-weight: bold; }
-
-blockquote { margin: 1em 40px; }
-
-dfn { font-style: italic; }
-
-hr { display: block; height: 1px; border: 0; border-top: 1px solid #ccc; margin: 1em 0; padding: 0; }
-
-ins { background: #ff9; color: #000; text-decoration: none; }
-
-mark { background: #ff0; color: #000; font-style: italic; font-weight: bold; }
-
-/* Redeclare monospace font family: h5bp.com/j */
-pre, code, kbd, samp { font-family: monospace, serif; _font-family: 'courier new', monospace; font-size: 1em; }
-
-/* Improve readability of pre-formatted text in all browsers */
-pre { white-space: pre; white-space: pre-wrap; word-wrap: break-word; }
-
-q { quotes: none; }
-q:before, q:after { content: ""; content: none; }
-
-small { font-size: 85%; }
-
-/* Position subscript and superscript content without affecting line-height: h5bp.com/k */
-sub, sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; }
-sup { top: -0.5em; }
-sub { bottom: -0.25em; }
-
-
-/* =============================================================================
- Lists
- ========================================================================== */
-
-ul, ol { margin: 1em 0; padding: 0 0 0 40px; }
-dd { margin: 0 0 0 40px; }
-nav ul, nav ol { list-style: none; list-style-image: none; margin: 0; padding: 0; }
-
-
-/* =============================================================================
- Embedded content
- ========================================================================== */
-
-/*
- * 1. Improve image quality when scaled in IE7: h5bp.com/d
- * 2. Remove the gap between images and borders on image containers: h5bp.com/e
- */
-
-img { border: 0; -ms-interpolation-mode: bicubic; vertical-align: middle; }
-
-/*
- * Correct overflow not hidden in IE9
- */
-
-svg:not(:root) { overflow: hidden; }
-
-
-/* =============================================================================
- Figures
- ========================================================================== */
-
-figure { margin: 0; }
-
-
-/* =============================================================================
- Forms
- ========================================================================== */
-
-form { margin: 0; }
-fieldset { border: 0; margin: 0; padding: 0; }
-
-/* Indicate that 'label' will shift focus to the associated form element */
-label { cursor: pointer; }
-
-/*
- * 1. Correct color not inheriting in IE6/7/8/9
- * 2. Correct alignment displayed oddly in IE6/7
- */
-
-legend { border: 0; *margin-left: -7px; padding: 0; }
-
-/*
- * 1. Correct font-size not inheriting in all browsers
- * 2. Remove margins in FF3/4 S5 Chrome
- * 3. Define consistent vertical alignment display in all browsers
- */
-
-button, input, select, textarea { font-size: 100%; margin: 0; vertical-align: baseline; *vertical-align: middle; }
-
-/*
- * 1. Define line-height as normal to match FF3/4 (set using !important in the UA stylesheet)
- * 2. Correct inner spacing displayed oddly in IE6/7
- */
-
-button, input { line-height: normal; *overflow: visible; }
-
-/*
- * Reintroduce inner spacing in 'table' to avoid overlap and whitespace issues in IE6/7
- */
-
-table button, table input { *overflow: auto; }
-
-/*
- * 1. Display hand cursor for clickable form elements
- * 2. Allow styling of clickable form elements in iOS
- */
-
-button, input[type="button"], input[type="reset"], input[type="submit"], [role="button"] { cursor: pointer; -webkit-appearance: button; }
-
-/*
- * Consistent box sizing and appearance
- */
-
-input[type="checkbox"], input[type="radio"] { box-sizing: border-box; padding: 0; }
-input[type="search"] { -webkit-appearance: textfield; -moz-box-sizing: content-box; -webkit-box-sizing: content-box; box-sizing: content-box; }
-input[type="search"]::-webkit-search-decoration { -webkit-appearance: none; }
-
-/*
- * Remove inner padding and border in FF3/4: h5bp.com/l
- */
-
-button::-moz-focus-inner, input::-moz-focus-inner { border: 0; padding: 0; }
-
-/*
- * 1. Remove default vertical scrollbar in IE6/7/8/9
- * 2. Allow only vertical resizing
- */
-
-textarea { overflow: auto; vertical-align: top; resize: vertical; }
-
-/* Colors for form validity */
-input:valid, textarea:valid { }
-input:invalid, textarea:invalid { background-color: #f0dddd; }
-
-
-/* =============================================================================
- Tables
- ========================================================================== */
-
-table { border-collapse: collapse; border-spacing: 0; }
-td { vertical-align: top; }
-
-
-/* ==|== primary styles =====================================================
- Author:
- ========================================================================== */
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-/*
- * Media queries for responsive design https://github.com/shichuan/mobile-html5-boilerplate/wiki/The-Style
- */
-
-
-/* Styles for desktop and large screen ----------- */
-
-/*styles for 800px and up!*/
-@media only screen and (min-width: 800px) {
- /* Styles */
-}/*/mediaquery*/
-
-
-/* iPhone 4, Opera Mobile 11 and other high pixel ratio devices ----------- */
-@media
-only screen and (-webkit-min-device-pixel-ratio: 1.5),
-only screen and (-o-min-device-pixel-ratio: 3/2),
-only screen and (min--moz-device-pixel-ratio: 1.5),
-only screen and (min-device-pixel-ratio: 1.5) {
- /* Styles */
-}
-
-
-
-/* ==|== non-semantic helper classes ========================================
- Please define your styles before this section.
- ========================================================================== */
-
-/* prevent callout */
-.nocallout {-webkit-touch-callout: none;}
-
-/* Text overflow with ellipsis */
-.ellipsis {
- text-overflow: ellipsis;
- overflow: hidden;
- white-space: nowrap;
-}
-
-/* A hack for HTML5 contenteditable attribute on mobile */
-textarea[contenteditable] {-webkit-appearance: none;}
-
-/* A workaround for S60 3.x and 5.0 devices which do not animated gif images if they have been set as display: none */
-.gifhidden {position: absolute; left: -100%;}
-
-/* For image replacement */
-.ir { display: block; border: 0; text-indent: -999em; overflow: hidden; background-color: transparent; background-repeat: no-repeat; text-align: left; direction: ltr; }
-.ir br { display: none; }
-
-/* Hide from both screenreaders and browsers: h5bp.com/u */
-.hidden { display: none !important; visibility: hidden; }
-
-/* Hide only visually, but have it available for screenreaders: h5bp.com/v */
-.visuallyhidden { border: 0; clip: rect(0 0 0 0); height: 1px; margin: -1px; overflow: hidden; padding: 0; position: absolute; width: 1px; }
-
-/* Extends the .visuallyhidden class to allow the element to be focusable when navigated to via the keyboard: h5bp.com/p */
-.visuallyhidden.focusable:active, .visuallyhidden.focusable:focus { clip: auto; height: auto; margin: 0; overflow: visible; position: static; width: auto; }
-
-/* Hide visually and from screenreaders, but maintain layout */
-.invisible { visibility: hidden; }
-
-/* Contain floats: h5bp.com/q */
-.clearfix:before, .clearfix:after { content: ""; display: table; }
-.clearfix:after { clear: both; }
-.clearfix { *zoom: 1; }
-
-
-
-/* ==|== print styles =======================================================
- Print styles.
- Inlined to avoid required HTTP connection: h5bp.com/r
- ========================================================================== */
-
-@media print {
- * { background: transparent !important; color: black !important; text-shadow: none !important; filter:none !important; -ms-filter: none !important; } /* Black prints faster: h5bp.com/s */
- a, a:visited { text-decoration: underline; }
- a[href]:after { content: " (" attr(href) ")"; }
- abbr[title]:after { content: " (" attr(title) ")"; }
- .ir a:after, a[href^="javascript:"]:after, a[href^="#"]:after { content: ""; } /* Don't show links for images, or javascript/internal links */
- pre, blockquote { border: 1px solid #999; page-break-inside: avoid; }
- thead { display: table-header-group; } /* h5bp.com/t */
- tr, img { page-break-inside: avoid; }
- img { max-width: 100% !important; }
- @page { margin: 0.5cm; }
- p, h2, h3 { orphans: 3; widows: 3; }
- h2, h3 { page-break-after: avoid; }
-}
diff --git a/app/assets/stylesheets/vendor/images/icon-search-black.png b/app/assets/stylesheets/vendor/images/icon-search-black.png
deleted file mode 100644
index 5721120f8..000000000
--- a/app/assets/stylesheets/vendor/images/icon-search-black.png
+++ /dev/null
Binary files differ
diff --git a/app/assets/stylesheets/vendor/images/icons-18-black.png b/app/assets/stylesheets/vendor/images/icons-18-black.png
deleted file mode 100644
index 71268bdf7..000000000
--- a/app/assets/stylesheets/vendor/images/icons-18-black.png
+++ /dev/null
Binary files differ
diff --git a/app/assets/stylesheets/vendor/images/icons-18-white.png b/app/assets/stylesheets/vendor/images/icons-18-white.png
deleted file mode 100644
index dadc6af58..000000000
--- a/app/assets/stylesheets/vendor/images/icons-18-white.png
+++ /dev/null
Binary files differ
diff --git a/app/assets/stylesheets/vendor/images/icons-36-black.png b/app/assets/stylesheets/vendor/images/icons-36-black.png
deleted file mode 100644
index 8c35ae3fb..000000000
--- a/app/assets/stylesheets/vendor/images/icons-36-black.png
+++ /dev/null
Binary files differ
diff --git a/app/assets/stylesheets/vendor/images/icons-36-white.png b/app/assets/stylesheets/vendor/images/icons-36-white.png
deleted file mode 100644
index 7e559b816..000000000
--- a/app/assets/stylesheets/vendor/images/icons-36-white.png
+++ /dev/null
Binary files differ
diff --git a/app/assets/stylesheets/vendor/interim-bootstrap.css.scss b/app/assets/stylesheets/vendor/interim-bootstrap.css.scss
deleted file mode 100644
index 531710600..000000000
--- a/app/assets/stylesheets/vendor/interim-bootstrap.css.scss
+++ /dev/null
@@ -1,13 +0,0 @@
-// Load the necessary styles from the bootstrap-sass partials to keep this file
-// up to date with the version of Bootstrap we're using.
-@import "bootstrap/mixins";
-@import "bootstrap/variables";
-@import "bootstrap/tooltip";
-@import "bootstrap/popovers";
-@import "bootstrap/component-animations";
-
-/* hacks */
-.popover h3 {
- margin-bottom: 0;
- font-weight: bold;
-}
diff --git a/app/assets/stylesheets/vendor/jquery.mentionsInput.css b/app/assets/stylesheets/vendor/jquery.mentionsInput.css
deleted file mode 100644
index 1ea96dc74..000000000
--- a/app/assets/stylesheets/vendor/jquery.mentionsInput.css
+++ /dev/null
@@ -1,4 +0,0 @@
-
-#publisher .mentions-input-box .mentions-autocomplete-list {
- width: 483px;
-}
diff --git a/app/assets/stylesheets/vendor/jquery.mobile-1.0b2.min.css b/app/assets/stylesheets/vendor/jquery.mobile-1.0b2.min.css
deleted file mode 100644
index 89be9382d..000000000
--- a/app/assets/stylesheets/vendor/jquery.mobile-1.0b2.min.css
+++ /dev/null
@@ -1,8 +0,0 @@
-/*!
- * jQuery Mobile v1.0b2
- * http://jquerymobile.com/
- *
- * Copyright 2010, jQuery Project
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- */.ui-bar-a{border:1px solid #2a2a2a;background:#111;color:#fff;font-weight:bold;text-shadow:0 -1px 1px #000;background-image:-webkit-gradient(linear,left top,left bottom,from(#3c3c3c),to(#111));background-image:-webkit-linear-gradient(top,#3c3c3c,#111);background-image:-moz-linear-gradient(top,#3c3c3c,#111);background-image:-ms-linear-gradient(top,#3c3c3c,#111);background-image:-o-linear-gradient(top,#3c3c3c,#111);background-image:linear-gradient(top,#3c3c3c,#111)}.ui-bar-a,.ui-bar-a input,.ui-bar-a select,.ui-bar-a textarea,.ui-bar-a button{font-family:Helvetica,Arial,sans-serif}.ui-bar-a .ui-link-inherit{color:#fff}.ui-bar-a .ui-link{color:#7cc4e7;font-weight:bold}.ui-body-a{border:1px solid #2a2a2a;background:#222;color:#fff;text-shadow:0 1px 0 #000;font-weight:normal;background-image:-webkit-gradient(linear,left top,left bottom,from(#666),to(#222));background-image:-webkit-linear-gradient(top,#666,#222);background-image:-moz-linear-gradient(top,#666,#222);background-image:-ms-linear-gradient(top,#666,#222);background-image:-o-linear-gradient(top,#666,#222);background-image:linear-gradient(top,#666,#222)}.ui-body-a,.ui-body-a input,.ui-body-a select,.ui-body-a textarea,.ui-body-a button{font-family:Helvetica,Arial,sans-serif}.ui-body-a .ui-link-inherit{color:#fff}.ui-body-a .ui-link{color:#2489ce;font-weight:bold}.ui-br{border-bottom:#828282;border-bottom:rgba(130,130,130,.3);border-bottom-width:1px;border-bottom-style:solid}.ui-btn-up-a{border:1px solid #222;background:#333;font-weight:bold;color:#fff;text-shadow:0 -1px 1px #000;background-image:-webkit-gradient(linear,left top,left bottom,from(#555),to(#333));background-image:-webkit-linear-gradient(top,#555,#333);background-image:-moz-linear-gradient(top,#555,#333);background-image:-ms-linear-gradient(top,#555,#333);background-image:-o-linear-gradient(top,#555,#333);background-image:linear-gradient(top,#555,#333)}.ui-btn-up-a a.ui-link-inherit{color:#fff}.ui-btn-hover-a{border:1px solid #000;background:#444;font-weight:bold;color:#fff;text-shadow:0 -1px 1px #000;background-image:-webkit-gradient(linear,left top,left bottom,from(#666),to(#444));background-image:-webkit-linear-gradient(top,#666,#444);background-image:-moz-linear-gradient(top,#666,#444);background-image:-ms-linear-gradient(top,#666,#444);background-image:-o-linear-gradient(top,#666,#444);background-image:linear-gradient(top,#666,#444)}.ui-btn-hover-a a.ui-link-inherit{color:#fff}.ui-btn-down-a{border:1px solid #000;background:#3d3d3d;font-weight:bold;color:#fff;text-shadow:0 -1px 1px #000;background-image:-webkit-gradient(linear,left top,left bottom,from(#333),to(#5a5a5a));background-image:-webkit-linear-gradient(top,#333,#5a5a5a);background-image:-moz-linear-gradient(top,#333,#5a5a5a);background-image:-ms-linear-gradient(top,#333,#5a5a5a);background-image:-o-linear-gradient(top,#333,#5a5a5a);background-image:linear-gradient(top,#333,#5a5a5a)}.ui-btn-down-a a.ui-link-inherit{color:#fff}.ui-btn-up-a,.ui-btn-hover-a,.ui-btn-down-a{font-family:Helvetica,Arial,sans-serif;text-decoration:none}.ui-bar-b{border:1px solid #456f9a;background:#5e87b0;color:#fff;font-weight:bold;text-shadow:0 -1px 1px #254f7a;background-image:-webkit-gradient(linear,left top,left bottom,from(#81a8ce),to(#5e87b0));background-image:-webkit-linear-gradient(top,#81a8ce,#5e87b0);background-image:-moz-linear-gradient(top,#81a8ce,#5e87b0);background-image:-ms-linear-gradient(top,#81a8ce,#5e87b0);background-image:-o-linear-gradient(top,#81a8ce,#5e87b0);background-image:linear-gradient(top,#81a8ce,#5e87b0)}.ui-bar-b,.ui-bar-b input,.ui-bar-b select,.ui-bar-b textarea,.ui-bar-b button{font-family:Helvetica,Arial,sans-serif}.ui-bar-b .ui-link-inherit{color:#fff}.ui-bar-b .ui-link{color:#7cc4e7;font-weight:bold}.ui-body-b{border:1px solid #c6c6c6;background:#ccc;color:#333;text-shadow:0 1px 0 #fff;font-weight:normal;background-image:-webkit-gradient(linear,left top,left bottom,from(#e6e6e6),to(#ccc));background-image:-webkit-linear-gradient(top,#e6e6e6,#ccc);background-image:-moz-linear-gradient(top,#e6e6e6,#ccc);background-image:-ms-linear-gradient(top,#e6e6e6,#ccc);background-image:-o-linear-gradient(top,#e6e6e6,#ccc);background-image:linear-gradient(top,#e6e6e6,#ccc)}.ui-body-b,.ui-body-b input,.ui-body-b select,.ui-body-b textarea,.ui-body-b button{font-family:Helvetica,Arial,sans-serif}.ui-body-b .ui-link-inherit{color:#333}.ui-body-b .ui-link{color:#2489ce;font-weight:bold}.ui-btn-up-b{border:1px solid #145072;background:#2567ab;font-weight:bold;color:#fff;text-shadow:0 -1px 1px #145072;background-image:-webkit-gradient(linear,left top,left bottom,from(#5f9cc5),to(#396b9e));background-image:-webkit-linear-gradient(top,#5f9cc5,#396b9e);background-image:-moz-linear-gradient(top,#5f9cc5,#396b9e);background-image:-ms-linear-gradient(top,#5f9cc5,#396b9e);background-image:-o-linear-gradient(top,#5f9cc5,#396b9e);background-image:linear-gradient(top,#5f9cc5,#396b9e)}.ui-btn-up-b a.ui-link-inherit{color:#fff}.ui-btn-hover-b{border:1px solid #00516e;background:#4b88b6;font-weight:bold;color:#fff;text-shadow:0 -1px 1px #014d68;background-image:-webkit-gradient(linear,left top,left bottom,from(#72b0d4),to(#4b88b6));background-image:-webkit-linear-gradient(top,#72b0d4,#4b88b6);background-image:-moz-linear-gradient(top,#72b0d4,#4b88b6);background-image:-ms-linear-gradient(top,#72b0d4,#4b88b6);background-image:-o-linear-gradient(top,#72b0d4,#4b88b6);background-image:linear-gradient(top,#72b0d4,#4b88b6)}.ui-btn-hover-b a.ui-link-inherit{color:#fff}.ui-btn-down-b{border:1px solid #225377;background:#4e89c5;font-weight:bold;color:#fff;text-shadow:0 -1px 1px #225377;background-image:-webkit-gradient(linear,left top,left bottom,from(#396b9e),to(#4e89c5));background-image:-webkit-linear-gradient(top,#396b9e,#4e89c5);background-image:-moz-linear-gradient(top,#396b9e,#4e89c5);background-image:-ms-linear-gradient(top,#396b9e,#4e89c5);background-image:-o-linear-gradient(top,#396b9e,#4e89c5);background-image:linear-gradient(top,#396b9e,#4e89c5)}.ui-btn-down-b a.ui-link-inherit{color:#fff}.ui-btn-up-b,.ui-btn-hover-b,.ui-btn-down-b{font-family:Helvetica,Arial,sans-serif;text-decoration:none}.ui-bar-c{border:1px solid #b3b3b3;background:#e9eaeb;color:#3e3e3e;font-weight:bold;text-shadow:0 1px 1px #fff;background-image:-webkit-gradient(linear,left top,left bottom,from(#f0f0f0),to(#e9eaeb));background-image:-webkit-linear-gradient(top,#f0f0f0,#e9eaeb);background-image:-moz-linear-gradient(top,#f0f0f0,#e9eaeb);background-image:-ms-linear-gradient(top,#f0f0f0,#e9eaeb);background-image:-o-linear-gradient(top,#f0f0f0,#e9eaeb);background-image:linear-gradient(top,#f0f0f0,#e9eaeb)}.ui-bar-c,.ui-bar-c input,.ui-bar-c select,.ui-bar-c textarea,.ui-bar-c button{font-family:Helvetica,Arial,sans-serif}.ui-body-c{border:1px solid #b3b3b3;color:#333;text-shadow:0 1px 0 #fff;background:#f0f0f0;background-image:-webkit-gradient(linear,left top,left bottom,from(#eee),to(#ddd));background-image:-webkit-linear-gradient(top,#eee,#ddd);background-image:-moz-linear-gradient(top,#eee,#ddd);background-image:-ms-linear-gradient(top,#eee,#ddd);background-image:-o-linear-gradient(top,#eee,#ddd);background-image:linear-gradient(top,#eee,#ddd)}.ui-body-c,.ui-body-c input,.ui-body-c select,.ui-body-c textarea,.ui-body-c button{font-family:Helvetica,Arial,sans-serif}.ui-body-c .ui-link-inherit{color:#333}.ui-body-c .ui-link{color:#2489ce;font-weight:bold}.ui-btn-up-c{border:1px solid #ccc;background:#eee;font-weight:bold;color:#444;text-shadow:0 1px 1px #f6f6f6;background-image:-webkit-gradient(linear,left top,left bottom,from(#fdfdfd),to(#eee));background-image:-webkit-linear-gradient(top,#fdfdfd,#eee);background-image:-moz-linear-gradient(top,#fdfdfd,#eee);background-image:-ms-linear-gradient(top,#fdfdfd,#eee);background-image:-o-linear-gradient(top,#fdfdfd,#eee);background-image:linear-gradient(top,#fdfdfd,#eee)}.ui-btn-up-c a.ui-link-inherit{color:#2f3e46}.ui-btn-hover-c{border:1px solid #bbb;background:#dadada;font-weight:bold;color:#101010;text-shadow:0 1px 1px #fff;background-image:-webkit-gradient(linear,left top,left bottom,from(#ededed),to(#dadada));background-image:-webkit-linear-gradient(top,#ededed,#dadada);background-image:-moz-linear-gradient(top,#ededed,#dadada);background-image:-ms-linear-gradient(top,#ededed,#dadada);background-image:-o-linear-gradient(top,#ededed,#dadada);background-image:linear-gradient(top,#ededed,#dadada)}.ui-btn-hover-c a.ui-link-inherit{color:#2f3e46}.ui-btn-down-c{border:1px solid #808080;background:#fdfdfd;font-weight:bold;color:#111;text-shadow:0 1px 1px #fff;background-image:-webkit-gradient(linear,left top,left bottom,from(#eee),to(#fdfdfd));background-image:-webkit-linear-gradient(top,#eee,#fdfdfd);background-image:-moz-linear-gradient(top,#eee,#fdfdfd);background-image:-ms-linear-gradient(top,#eee,#fdfdfd);background-image:-o-linear-gradient(top,#eee,#fdfdfd);background-image:linear-gradient(top,#eee,#fdfdfd)}.ui-btn-down-c a.ui-link-inherit{color:#2f3e46}.ui-btn-up-c,.ui-btn-hover-c,.ui-btn-down-c{font-family:Helvetica,Arial,sans-serif;text-decoration:none}.ui-bar-d{border:1px solid #ccc;background:#bbb;color:#333;text-shadow:0 1px 0 #eee;background-image:-webkit-gradient(linear,left top,left bottom,from(#ddd),to(#bbb));background-image:-webkit-linear-gradient(top,#ddd,#bbb);background-image:-moz-linear-gradient(top,#ddd,#bbb);background-image:-ms-linear-gradient(top,#ddd,#bbb);background-image:-o-linear-gradient(top,#ddd,#bbb);background-image:linear-gradient(top,#ddd,#bbb)}.ui-bar-d,.ui-bar-d input,.ui-bar-d select,.ui-bar-d textarea,.ui-bar-d button{font-family:Helvetica,Arial,sans-serif}.ui-bar-d .ui-link-inherit{color:#333}.ui-bar-d .ui-link{color:#2489ce;font-weight:bold}.ui-body-d{border:1px solid #ccc;color:#333;text-shadow:0 1px 0 #fff;background:#fff}.ui-body-d,.ui-body-d input,.ui-body-d select,.ui-body-d textarea,.ui-body-d button{font-family:Helvetica,Arial,sans-serif}.ui-body-d .ui-link-inherit{color:#333}.ui-body-d .ui-link{color:#2489ce;font-weight:bold}.ui-btn-up-d{border:1px solid #ccc;background:#fff;font-weight:bold;color:#444;text-shadow:0 1px 1px #fff}.ui-btn-up-d a.ui-link-inherit{color:#333}.ui-btn-hover-d{border:1px solid #aaa;background:#eee;font-weight:bold;color:#222;cursor:pointer;text-shadow:0 1px 1px #fff;background-image:-webkit-gradient(linear,left top,left bottom,from(#fdfdfd),to(#eee));background-image:-webkit-linear-gradient(top,#fdfdfd,#eee);background-image:-moz-linear-gradient(top,#fdfdfd,#eee);background-image:-ms-linear-gradient(top,#fdfdfd,#eee);background-image:-o-linear-gradient(top,#fdfdfd,#eee);background-image:linear-gradient(top,#fdfdfd,#eee)}.ui-btn-hover-d a.ui-link-inherit{color:#222}.ui-btn-down-d{border:1px solid #aaa;background:#fff;font-weight:bold;color:#111;text-shadow:0 1px 1px #fff;background-image:-webkit-gradient(linear,left top,left bottom,from(#eee),to(#fff));background-image:-webkit-linear-gradient(top,#eee,#fff);background-image:-moz-linear-gradient(top,#eee,#fff);background-image:-ms-linear-gradient(top,#eee,#fff);background-image:-o-linear-gradient(top,#eee,#fff);background-image:linear-gradient(top,#eee,#fff)}.ui-btn-down-d a.ui-link-inherit{color:#111}.ui-btn-up-d,.ui-btn-hover-d,.ui-btn-down-d{font-family:Helvetica,Arial,sans-serif;text-decoration:none}.ui-bar-e{border:1px solid #f7c942;background:#fadb4e;color:#333;text-shadow:0 1px 0 #fff;background-image:-webkit-gradient(linear,left top,left bottom,from(#fceda7),to(#fadb4e));background-image:-webkit-linear-gradient(top,#fceda7,#fadb4e);background-image:-moz-linear-gradient(top,#fceda7,#fadb4e);background-image:-ms-linear-gradient(top,#fceda7,#fadb4e);background-image:-o-linear-gradient(top,#fceda7,#fadb4e);background-image:linear-gradient(top,#fceda7,#fadb4e)}.ui-bar-e,.ui-bar-e input,.ui-bar-e select,.ui-bar-e textarea,.ui-bar-e button{font-family:Helvetica,Arial,sans-serif}.ui-bar-e .ui-link-inherit{color:#333}.ui-bar-e .ui-link{color:#2489ce;font-weight:bold}.ui-body-e{border:1px solid #f7c942;color:#333;text-shadow:0 1px 0 #fff;background:#faeb9e;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#faeb9e));background-image:-webkit-linear-gradient(top,#fff,#faeb9e);background-image:-moz-linear-gradient(top,#fff,#faeb9e);background-image:-ms-linear-gradient(top,#fff,#faeb9e);background-image:-o-linear-gradient(top,#fff,#faeb9e);background-image:linear-gradient(top,#fff,#faeb9e)}.ui-body-e,.ui-body-e input,.ui-body-e select,.ui-body-e textarea,.ui-body-e button{font-family:Helvetica,Arial,sans-serif}.ui-body-e .ui-link-inherit{color:#333}.ui-body-e .ui-link{color:#2489ce;font-weight:bold}.ui-btn-up-e{border:1px solid #f7c942;background:#fadb4e;font-weight:bold;color:#333;text-shadow:0 1px 0 #fff;background-image:-webkit-gradient(linear,left top,left bottom,from(#fceda7),to(#fadb4e));background-image:-webkit-linear-gradient(top,#fceda7,#fadb4e);background-image:-moz-linear-gradient(top,#fceda7,#fadb4e);background-image:-ms-linear-gradient(top,#fceda7,#fadb4e);background-image:-o-linear-gradient(top,#fceda7,#fadb4e);background-image:linear-gradient(top,#fceda7,#fadb4e)}.ui-btn-up-e a.ui-link-inherit{color:#333}.ui-btn-hover-e{border:1px solid #e79952;background:#fbe26f;font-weight:bold;color:#111;text-shadow:0 1px 1px #fff;background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf0b5),to(#fbe26f));background-image:-webkit-linear-gradient(top,#fcf0b5,#fbe26f);background-image:-moz-linear-gradient(top,#fcf0b5,#fbe26f);background-image:-ms-linear-gradient(top,#fcf0b5,#fbe26f);background-image:-o-linear-gradient(top,#fcf0b5,#fbe26f);background-image:linear-gradient(top,#fcf0b5,#fbe26f)}.ui-btn-hover-e a.ui-link-inherit{color:#333}.ui-btn-down-e{border:1px solid #f7c942;background:#fceda7;font-weight:bold;color:#111;text-shadow:0 1px 1px #fff;background-image:-webkit-gradient(linear,left top,left bottom,from(#fadb4e),to(#fceda7));background-image:-webkit-linear-gradient(top,#fadb4e,#fceda7);background-image:-moz-linear-gradient(top,#fadb4e,#fceda7);background-image:-ms-linear-gradient(top,#fadb4e,#fceda7);background-image:-o-linear-gradient(top,#fadb4e,#fceda7);background-image:linear-gradient(top,#fadb4e,#fceda7)}.ui-btn-down-e a.ui-link-inherit{color:#333}.ui-btn-up-e,.ui-btn-hover-e,.ui-btn-down-e{font-family:Helvetica,Arial,sans-serif;text-decoration:none}a.ui-link-inherit{text-decoration:none!important}.ui-btn-active{border:1px solid #155678;background:#4596ce;font-weight:bold;color:#fff;cursor:pointer;text-shadow:0 -1px 1px #145072;text-decoration:none;background-image:-webkit-gradient(linear,left top,left bottom,from(#85bae4),to(#5393c5));background-image:-webkit-linear-gradient(top,#85bae4,#5393c5);background-image:-moz-linear-gradient(top,#85bae4,#5393c5);background-image:-ms-linear-gradient(top,#85bae4,#5393c5);background-image:-o-linear-gradient(top,#85bae4,#5393c5);background-image:linear-gradient(top,#85bae4,#5393c5);outline:0}.ui-btn-active a.ui-link-inherit{color:#fff}.ui-btn-inner{border-top:1px solid #fff;border-color:rgba(255,255,255,.3)}.ui-corner-tl{-moz-border-radius-topleft:.6em;-webkit-border-top-left-radius:.6em;border-top-left-radius:.6em}.ui-corner-tr{-moz-border-radius-topright:.6em;-webkit-border-top-right-radius:.6em;border-top-right-radius:.6em}.ui-corner-bl{-moz-border-radius-bottomleft:.6em;-webkit-border-bottom-left-radius:.6em;border-bottom-left-radius:.6em}.ui-corner-br{-moz-border-radius-bottomright:.6em;-webkit-border-bottom-right-radius:.6em;border-bottom-right-radius:.6em}.ui-corner-top{-moz-border-radius-topleft:.6em;-webkit-border-top-left-radius:.6em;border-top-left-radius:.6em;-moz-border-radius-topright:.6em;-webkit-border-top-right-radius:.6em;border-top-right-radius:.6em}.ui-corner-bottom{-moz-border-radius-bottomleft:.6em;-webkit-border-bottom-left-radius:.6em;border-bottom-left-radius:.6em;-moz-border-radius-bottomright:.6em;-webkit-border-bottom-right-radius:.6em;border-bottom-right-radius:.6em}.ui-corner-right{-moz-border-radius-topright:.6em;-webkit-border-top-right-radius:.6em;border-top-right-radius:.6em;-moz-border-radius-bottomright:.6em;-webkit-border-bottom-right-radius:.6em;border-bottom-right-radius:.6em}.ui-corner-left{-moz-border-radius-topleft:.6em;-webkit-border-top-left-radius:.6em;border-top-left-radius:.6em;-moz-border-radius-bottomleft:.6em;-webkit-border-bottom-left-radius:.6em;border-bottom-left-radius:.6em}.ui-corner-all{-moz-border-radius:.6em;-webkit-border-radius:.6em;border-radius:.6em}.ui-disabled{opacity:.3}.ui-disabled,.ui-disabled a{cursor:default}.ui-icon{background:#666;background:rgba(0,0,0,.4);background-image:url(images/icons-18-white.png);background-repeat:no-repeat;-moz-border-radius:9px;-webkit-border-radius:9px;border-radius:9px}.ui-icon-alt{background:#fff;background:rgba(255,255,255,.3);background-image:url(images/icons-18-black.png);background-repeat:no-repeat}@media only screen and (-webkit-min-device-pixel-ratio:1.5),only screen and (min--moz-device-pixel-ratio:1.5),only screen and (min-resolution:240dpi){.ui-icon-plus,.ui-icon-minus,.ui-icon-delete,.ui-icon-arrow-r,.ui-icon-arrow-l,.ui-icon-arrow-u,.ui-icon-arrow-d,.ui-icon-check,.ui-icon-gear,.ui-icon-refresh,.ui-icon-forward,.ui-icon-back,.ui-icon-grid,.ui-icon-star,.ui-icon-alert,.ui-icon-info,.ui-icon-home,.ui-icon-search,.ui-icon-checkbox-off,.ui-icon-checkbox-on,.ui-icon-radio-off,.ui-icon-radio-on{background-image:url(images/icons-36-white.png);-moz-background-size:776px 18px;-o-background-size:776px 18px;-webkit-background-size:776px 18px;background-size:776px 18px}.ui-icon-alt{background-image:url(images/icons-36-black.png)}}.ui-icon-plus{background-position:-0 50%}.ui-icon-minus{background-position:-36px 50%}.ui-icon-delete{background-position:-72px 50%}.ui-icon-arrow-r{background-position:-108px 50%}.ui-icon-arrow-l{background-position:-144px 50%}.ui-icon-arrow-u{background-position:-180px 50%}.ui-icon-arrow-d{background-position:-216px 50%}.ui-icon-check{background-position:-252px 50%}.ui-icon-gear{background-position:-288px 50%}.ui-icon-refresh{background-position:-324px 50%}.ui-icon-forward{background-position:-360px 50%}.ui-icon-back{background-position:-396px 50%}.ui-icon-grid{background-position:-432px 50%}.ui-icon-star{background-position:-468px 50%}.ui-icon-alert{background-position:-504px 50%}.ui-icon-info{background-position:-540px 50%}.ui-icon-home{background-position:-576px 50%}.ui-icon-search{background-position:-612px 50%}.ui-icon-checkbox-off{background-position:-684px 50%}.ui-icon-checkbox-on{background-position:-648px 50%}.ui-icon-radio-off{background-position:-756px 50%}.ui-icon-radio-on{background-position:-720px 50%}.ui-checkbox .ui-icon{-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.ui-icon-checkbox-off,.ui-icon-radio-off{background-color:transparent}.ui-checkbox-on .ui-icon,.ui-radio-on .ui-icon{background-color:#4596ce}.ui-icon-searchfield{background-image:url(images/icon-search-black.png);background-size:16px 16px}.ui-icon-loading{background-image:url(assets/ajax-loader.png);width:40px;height:40px;-moz-border-radius:20px;-webkit-border-radius:20px;border-radius:20px;background-size:35px 35px}.ui-btn-corner-tl{-moz-border-radius-topleft:1em;-webkit-border-top-left-radius:1em;border-top-left-radius:1em}.ui-btn-corner-tr{-moz-border-radius-topright:1em;-webkit-border-top-right-radius:1em;border-top-right-radius:1em}.ui-btn-corner-bl{-moz-border-radius-bottomleft:1em;-webkit-border-bottom-left-radius:1em;border-bottom-left-radius:1em}.ui-btn-corner-br{-moz-border-radius-bottomright:1em;-webkit-border-bottom-right-radius:1em;border-bottom-right-radius:1em}.ui-btn-corner-top{-moz-border-radius-topleft:1em;-webkit-border-top-left-radius:1em;border-top-left-radius:1em;-moz-border-radius-topright:1em;-webkit-border-top-right-radius:1em;border-top-right-radius:1em}.ui-btn-corner-bottom{-moz-border-radius-bottomleft:1em;-webkit-border-bottom-left-radius:1em;border-bottom-left-radius:1em;-moz-border-radius-bottomright:1em;-webkit-border-bottom-right-radius:1em;border-bottom-right-radius:1em}.ui-btn-corner-right{-moz-border-radius-topright:1em;-webkit-border-top-right-radius:1em;border-top-right-radius:1em;-moz-border-radius-bottomright:1em;-webkit-border-bottom-right-radius:1em;border-bottom-right-radius:1em}.ui-btn-corner-left{-moz-border-radius-topleft:1em;-webkit-border-top-left-radius:1em;border-top-left-radius:1em;-moz-border-radius-bottomleft:1em;-webkit-border-bottom-left-radius:1em;border-bottom-left-radius:1em}.ui-btn-corner-all{-moz-border-radius:1em;-webkit-border-radius:1em;border-radius:1em}.ui-corner-tl,.ui-corner-tr,.ui-corner-bl,.ui-corner-br,.ui-corner-top,.ui-corner-bottom,.ui-corner-right,.ui-corner-left,.ui-corner-all,.ui-btn-corner-tl,.ui-btn-corner-tr,.ui-btn-corner-bl,.ui-btn-corner-br,.ui-btn-corner-top,.ui-btn-corner-bottom,.ui-btn-corner-right,.ui-btn-corner-left,.ui-btn-corner-all{-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.ui-overlay{background:#666;opacity:.5;filter:Alpha(Opacity=50);position:absolute;width:100%;height:100%}.ui-overlay-shadow{-moz-box-shadow:0 0 12px rgba(0,0,0,.6);-webkit-box-shadow:0 0 12px rgba(0,0,0,.6);box-shadow:0 0 12px rgba(0,0,0,.6)}.ui-shadow{-moz-box-shadow:0 1px 4px rgba(0,0,0,.3);-webkit-box-shadow:0 1px 4px rgba(0,0,0,.3);box-shadow:0 1px 4px rgba(0,0,0,.3)}.ui-bar-a .ui-shadow,.ui-bar-b .ui-shadow,.ui-bar-c .ui-shadow{-moz-box-shadow:0 1px 0 rgba(255,255,255,.3);-webkit-box-shadow:0 1px 0 rgba(255,255,255,.3);box-shadow:0 1px 0 rgba(255,255,255,.3)}.ui-shadow-inset{-moz-box-shadow:inset 0 1px 4px rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 4px rgba(0,0,0,.2);box-shadow:inset 0 1px 4px rgba(0,0,0,.2)}.ui-icon-shadow{-moz-box-shadow:0 1px 0 rgba(255,255,255,.4);-webkit-box-shadow:0 1px 0 rgba(255,255,255,.4);box-shadow:0 1px 0 rgba(255,255,255,.4)}.ui-focus{-moz-box-shadow:0 0 12px #387bbe;-webkit-box-shadow:0 0 12px #387bbe;box-shadow:0 0 12px #387bbe}.ui-mobile-nosupport-boxshadow *{-moz-box-shadow:none!important;-webkit-box-shadow:none!important;box-shadow:none!important}.ui-mobile-nosupport-boxshadow .ui-focus{outline-width:2px}.ui-mobile,.ui-mobile body{height:100%}.ui-mobile fieldset,.ui-page{padding:0;margin:0}.ui-mobile a img,.ui-mobile fieldset{border:0}.ui-mobile-viewport{margin:0;overflow-x:hidden;-webkit-text-size-adjust:none;-ms-text-size-adjust:none;-webkit-tap-highlight-color:rgba(0,0,0,0)}.ui-mobile [data-role=page],.ui-mobile [data-role=dialog],.ui-page{top:0;left:0;width:100%;min-height:100%;position:absolute;display:none;border:0}.ui-mobile .ui-page-active{display:block;overflow:visible}.portrait,.portrait .ui-page{min-height:420px}.landscape,.landscape .ui-page{min-height:300px}.ui-loading .ui-mobile-viewport{overflow:hidden!important}.ui-loading .ui-loader{display:block}.ui-loading .ui-page{overflow:hidden}.ui-loader{display:none;position:absolute;opacity:.85;z-index:100;left:50%;width:200px;margin-left:-130px;margin-top:-35px;padding:10px 30px}.ui-loader h1{font-size:15px;text-align:center}.ui-loader .ui-icon{position:static;display:block;opacity:.9;margin:0 auto;width:35px;height:35px;background-color:transparent}.ui-mobile-rendering>*{visibility:hidden}.ui-bar,.ui-body{position:relative;padding:.4em 15px;overflow:hidden;display:block;clear:both}.ui-bar{font-size:16px;margin:0}.ui-bar h1,.ui-bar h2,.ui-bar h3,.ui-bar h4,.ui-bar h5,.ui-bar h6{margin:0;padding:0;font-size:16px;display:inline-block}.ui-header,.ui-footer{display:block}.ui-page .ui-header,.ui-page .ui-footer{position:relative}.ui-header .ui-btn-left{position:absolute;left:10px;top:.4em}.ui-header .ui-btn-right{position:absolute;right:10px;top:.4em}.ui-header .ui-title,.ui-footer .ui-title{min-height:1.1em;text-align:center;font-size:16px;display:block;margin:.6em 90px .8em;padding:0;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;outline:0!important}.ui-content{border-width:0;overflow:visible;overflow-x:hidden;padding:15px}.ui-page-fullscreen .ui-content{padding:0}.ui-icon{width:18px;height:18px}.ui-fullscreen img{max-width:100%}.ui-nojs{position:absolute;left:-9999px}.spin{-webkit-transform:rotate(360deg);-webkit-animation-name:spin;-webkit-animation-duration:1s;-webkit-animation-iteration-count:infinite;-webkit-animation-timing-function:linear}@-webkit-keyframes spin{from{-webkit-transform:rotate(0deg)}to{-webkit-transform:rotate(360deg)}}.in,.out{-webkit-animation-timing-function:ease-in-out;-webkit-animation-duration:350ms}.slide.in{-webkit-transform:translateX(0);-webkit-animation-name:slideinfromright}.slide.out{-webkit-transform:translateX(-100%);-webkit-animation-name:slideouttoleft}.slide.in.reverse{-webkit-transform:translateX(0);-webkit-animation-name:slideinfromleft}.slide.out.reverse{-webkit-transform:translateX(100%);-webkit-animation-name:slideouttoright}.slideup.in{-webkit-transform:translateY(0);-webkit-animation-name:slideinfrombottom;z-index:10}.slideup.out{-webkit-animation-name:dontmove;z-index:0}.slideup.out.reverse{-webkit-transform:translateY(100%);z-index:10;-webkit-animation-name:slideouttobottom}.slideup.in.reverse{z-index:0;-webkit-animation-name:dontmove}.slidedown.in{-webkit-transform:translateY(0);-webkit-animation-name:slideinfromtop;z-index:10}.slidedown.out{-webkit-animation-name:dontmove;z-index:0}.slidedown.out.reverse{-webkit-transform:translateY(-100%);z-index:10;-webkit-animation-name:slideouttotop}.slidedown.in.reverse{z-index:0;-webkit-animation-name:dontmove}@-webkit-keyframes slideinfromright{from{-webkit-transform:translateX(100%)}to{-webkit-transform:translateX(0)}}@-webkit-keyframes slideinfromleft{from{-webkit-transform:translateX(-100%)}to{-webkit-transform:translateX(0)}}@-webkit-keyframes slideouttoleft{from{-webkit-transform:translateX(0)}to{-webkit-transform:translateX(-100%)}}@-webkit-keyframes slideouttoright{from{-webkit-transform:translateX(0)}to{-webkit-transform:translateX(100%)}}@-webkit-keyframes slideinfromtop{from{-webkit-transform:translateY(-100%)}to{-webkit-transform:translateY(0)}}@-webkit-keyframes slideinfrombottom{from{-webkit-transform:translateY(100%)}to{-webkit-transform:translateY(0)}}@-webkit-keyframes slideouttobottom{from{-webkit-transform:translateY(0)}to{-webkit-transform:translateY(100%)}}@-webkit-keyframes slideouttotop{from{-webkit-transform:translateY(0)}to{-webkit-transform:translateY(-100%)}}@-webkit-keyframes fadein{from{opacity:0}to{opacity:1}}@-webkit-keyframes fadeout{from{opacity:1}to{opacity:0}}.fade.in{opacity:1;z-index:10;-webkit-animation-name:fadein}.fade.out{z-index:0;-webkit-animation-name:fadeout}.viewport-flip{-webkit-perspective:1000;position:absolute}.ui-mobile-viewport-transitioning,.ui-mobile-viewport-transitioning .ui-page{width:100%;height:100%;overflow:hidden}.flip{-webkit-animation-duration:.65s;-webkit-backface-visibility:hidden;-webkit-transform:translateX(0)}.flip.in{-webkit-transform:rotateY(0) scale(1);-webkit-animation-name:flipinfromleft}.flip.out{-webkit-transform:rotateY(-180deg) scale(.8);-webkit-animation-name:flipouttoleft}.flip.in.reverse{-webkit-transform:rotateY(0) scale(1);-webkit-animation-name:flipinfromright}.flip.out.reverse{-webkit-transform:rotateY(180deg) scale(.8);-webkit-animation-name:flipouttoright}@-webkit-keyframes flipinfromright{from{-webkit-transform:rotateY(-180deg) scale(.8)}to{-webkit-transform:rotateY(0) scale(1)}}@-webkit-keyframes flipinfromleft{from{-webkit-transform:rotateY(180deg) scale(.8)}to{-webkit-transform:rotateY(0) scale(1)}}@-webkit-keyframes flipouttoleft{from{-webkit-transform:rotateY(0) scale(1)}to{-webkit-transform:rotateY(-180deg) scale(.8)}}@-webkit-keyframes flipouttoright{from{-webkit-transform:rotateY(0) scale(1)}to{-webkit-transform:rotateY(180deg) scale(.8)}}@-webkit-keyframes dontmove{from{opacity:1}to{opacity:1}}.pop{-webkit-transform-origin:50% 50%}.pop.in{-webkit-transform:scale(1);opacity:1;-webkit-animation-name:popin;z-index:10}.pop.out.reverse{-webkit-transform:scale(.2);opacity:0;-webkit-animation-name:popout;z-index:10}.pop.in.reverse{z-index:0;-webkit-animation-name:dontmove}@-webkit-keyframes popin{from{-webkit-transform:scale(.2);opacity:0}to{-webkit-transform:scale(1);opacity:1}}@-webkit-keyframes popout{from{-webkit-transform:scale(1);opacity:1}to{-webkit-transform:scale(.2);opacity:0}}.ui-grid-a,.ui-grid-b,.ui-grid-c,.ui-grid-d{overflow:hidden}.ui-block-a,.ui-block-b,.ui-block-c,.ui-block-d,.ui-block-e{margin:0;padding:0;border:0;float:left;min-height:1px}.ui-grid-solo .ui-block-a{width:100%;float:none}.ui-grid-a .ui-block-a,.ui-grid-a .ui-block-b{width:50%}.ui-grid-a .ui-block-a{clear:left}.ui-grid-b .ui-block-a,.ui-grid-b .ui-block-b,.ui-grid-b .ui-block-c{width:33.333%}.ui-grid-b .ui-block-a{clear:left}.ui-grid-c .ui-block-a,.ui-grid-c .ui-block-b,.ui-grid-c .ui-block-c,.ui-grid-c .ui-block-d{width:25%}.ui-grid-c .ui-block-a{clear:left}.ui-grid-d .ui-block-a,.ui-grid-d .ui-block-b,.ui-grid-d .ui-block-c,.ui-grid-d .ui-block-d,.ui-grid-d .ui-block-e{width:20%}.ui-grid-d .ui-block-a{clear:left}.ui-header,.ui-footer,.ui-page-fullscreen .ui-header,.ui-page-fullscreen .ui-footer{position:absolute;overflow:hidden;width:100%;border-left-width:0;border-right-width:0}.ui-header-fixed,.ui-footer-fixed{z-index:1000;-webkit-transform:translateZ(0)}.ui-footer-duplicate,.ui-page-fullscreen .ui-fixed-inline{display:none}.ui-page-fullscreen .ui-header,.ui-page-fullscreen .ui-footer{opacity:.9}.ui-navbar{overflow:hidden}.ui-navbar ul,.ui-navbar-expanded ul{list-style:none;padding:0;margin:0;position:relative;display:block;border:0}.ui-navbar-collapsed ul{float:left;width:75%;margin-right:-2px}.ui-navbar-collapsed .ui-navbar-toggle{float:left;width:25%}.ui-navbar li.ui-navbar-truncate{position:absolute;left:-9999px;top:-9999px}.ui-navbar li .ui-btn,.ui-navbar .ui-navbar-toggle .ui-btn{display:block;font-size:12px;text-align:center;margin:0;border-right-width:0}.ui-navbar li .ui-btn{margin-right:-1px}.ui-navbar li .ui-btn:last-child{margin-right:0}.ui-header .ui-navbar li .ui-btn,.ui-header .ui-navbar .ui-navbar-toggle .ui-btn,.ui-footer .ui-navbar li .ui-btn,.ui-footer .ui-navbar .ui-navbar-toggle .ui-btn{border-top-width:0;border-bottom-width:0}.ui-navbar .ui-btn-inner{padding-left:2px;padding-right:2px}.ui-navbar-noicons li .ui-btn .ui-btn-inner,.ui-navbar-noicons .ui-navbar-toggle .ui-btn-inner{padding-top:.8em;padding-bottom:.9em}.ui-navbar-expanded .ui-btn{margin:0;font-size:14px}.ui-navbar-expanded .ui-btn-inner{padding-left:5px;padding-right:5px}.ui-navbar-expanded .ui-btn-icon-top .ui-btn-inner{padding:45px 5px 15px;text-align:center}.ui-navbar-expanded .ui-btn-icon-top .ui-icon{top:15px}.ui-navbar-expanded .ui-btn-icon-bottom .ui-btn-inner{padding:15px 5px 45px;text-align:center}.ui-navbar-expanded .ui-btn-icon-bottom .ui-icon{bottom:15px}.ui-navbar-expanded li .ui-btn .ui-btn-inner{min-height:2.5em}.ui-navbar-expanded .ui-navbar-noicons .ui-btn .ui-btn-inner{padding-top:1.8em;padding-bottom:1.9em}.ui-btn{display:block;text-align:center;cursor:pointer;position:relative;margin:.5em 5px;padding:0}.ui-btn:focus,.ui-btn:active{outline:0}.ui-header .ui-btn,.ui-footer .ui-btn,.ui-bar .ui-btn{display:inline-block;font-size:13px;margin:0}.ui-btn-inline{display:inline-block}.ui-btn-inner{padding:.6em 25px;display:block;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;position:relative;zoom:1}.ui-header .ui-btn-inner,.ui-footer .ui-btn-inner,.ui-bar .ui-btn-inner{padding:.4em 8px .5em}.ui-btn-icon-notext{display:inline-block;width:20px;height:20px;padding:2px 1px 2px 3px;text-indent:-9999px}.ui-btn-icon-notext .ui-btn-inner{padding:0}.ui-btn-icon-notext .ui-btn-text{position:absolute;left:-999px}.ui-btn-icon-left .ui-btn-inner{padding-left:33px}.ui-header .ui-btn-icon-left .ui-btn-inner,.ui-footer .ui-btn-icon-left .ui-btn-inner,.ui-bar .ui-btn-icon-left .ui-btn-inner{padding-left:27px}.ui-btn-icon-right .ui-btn-inner{padding-right:33px}.ui-header .ui-btn-icon-right .ui-btn-inner,.ui-footer .ui-btn-icon-right .ui-btn-inner,.ui-bar .ui-btn-icon-right .ui-btn-inner{padding-right:27px}.ui-btn-icon-top .ui-btn-inner{padding-top:33px}.ui-header .ui-btn-icon-top .ui-btn-inner,.ui-footer .ui-btn-icon-top .ui-btn-inner,.ui-bar .ui-btn-icon-top .ui-btn-inner{padding-top:27px}.ui-btn-icon-bottom .ui-btn-inner{padding-bottom:33px}.ui-header .ui-btn-icon-bottom .ui-btn-inner,.ui-footer .ui-btn-icon-bottom .ui-btn-inner,.ui-bar .ui-btn-icon-bottom .ui-btn-inner{padding-bottom:27px}.ui-btn-icon-notext .ui-icon{display:block}.ui-btn-icon-left .ui-icon,.ui-btn-icon-right .ui-icon{position:absolute;top:50%;margin-top:-9px}.ui-btn-icon-top .ui-icon,.ui-btn-icon-bottom .ui-icon{position:absolute;left:50%;margin-left:-9px}.ui-btn-icon-left .ui-icon{left:10px}.ui-btn-icon-right .ui-icon{right:10px}.ui-header .ui-btn-icon-left .ui-icon,.ui-footer .ui-btn-icon-left .ui-icon,.ui-bar .ui-btn-icon-left .ui-icon{left:4px}.ui-header .ui-btn-icon-right .ui-icon,.ui-footer .ui-btn-icon-right .ui-icon,.ui-bar .ui-btn-icon-right .ui-icon{right:4px}.ui-header .ui-btn-icon-top .ui-icon,.ui-footer .ui-btn-icon-top .ui-icon,.ui-bar .ui-btn-icon-top .ui-icon{top:4px}.ui-header .ui-btn-icon-bottom .ui-icon,.ui-footer .ui-btn-icon-bottom .ui-icon,.ui-bar .ui-btn-icon-bottom .ui-icon{bottom:4px}.ui-btn-icon-top .ui-icon{top:5px}.ui-btn-icon-bottom .ui-icon{bottom:5px}.ui-btn-hidden{position:absolute;top:0;left:0;width:100%;height:100%;-webkit-appearance:button;opacity:0;cursor:pointer;-ms-filter:"alpha(opacity=0)";filter:alpha(opacity=0);background:transparent}.ui-collapsible-contain{margin:.5em 0}.ui-collapsible-heading{font-size:16px;display:block;margin:0 -8px;padding:0;border-width:0 0 1px 0;position:relative}.ui-collapsible-heading a{text-align:left;margin:0}.ui-collapsible-heading a .ui-btn-inner{padding-left:40px}.ui-collapsible-heading a span.ui-btn{position:absolute;left:6px;top:50%;margin:-12px 0 0 0;width:20px;height:20px;padding:1px 0 1px 2px;text-indent:-9999px}.ui-collapsible-heading a span.ui-btn .ui-btn-inner{padding:10px 0}.ui-collapsible-heading a span.ui-btn .ui-icon{left:0;margin-top:-10px}.ui-collapsible-heading-status{position:absolute;left:-9999px}.ui-collapsible-content{display:block;padding:10px 0 10px 8px}.ui-collapsible-content-collapsed{display:none}.ui-collapsible-set{margin:.5em 0}.ui-collapsible-set .ui-collapsible-contain{margin:-1px 0 0}.ui-controlgroup,fieldset.ui-controlgroup{padding:0;margin:.5em 0 1em}.ui-bar .ui-controlgroup{margin:0 .3em}.ui-controlgroup-label{font-size:16px;line-height:1.4;font-weight:normal;margin:0 0 .3em}.ui-controlgroup-controls{display:block;width:95%}.ui-controlgroup li{list-style:none}.ui-controlgroup-vertical .ui-btn,.ui-controlgroup-vertical .ui-checkbox,.ui-controlgroup-vertical .ui-radio{margin:0;border-bottom-width:0}.ui-controlgroup-vertical .ui-controlgroup-last{border-bottom-width:1px}.ui-controlgroup-horizontal{padding:0}.ui-controlgroup-horizontal .ui-btn,.ui-controlgroup-horizontal .ui-checkbox,.ui-controlgroup-horizontal .ui-radio{display:inline-block;margin:0 -5px 0 0}.ui-controlgroup-horizontal .ui-checkbox,.ui-controlgroup-horizontal .ui-radio{display:inline}.ui-controlgroup-horizontal .ui-checkbox .ui-btn,.ui-controlgroup-horizontal .ui-radio .ui-btn,.ui-controlgroup-horizontal .ui-checkbox:last-child,.ui-controlgroup-horizontal .ui-radio:last-child{margin-right:0}.ui-controlgroup-horizontal .ui-controlgroup-last{margin-right:0}.ui-controlgroup .ui-checkbox label,.ui-controlgroup .ui-radio label{font-size:16px}@media all and (min-width:450px){.ui-controlgroup-label{vertical-align:top;display:inline-block;width:20%;margin:0 2% 0 0}.ui-controlgroup-controls{width:60%;display:inline-block}}.ui-dialog{min-height:480px}.ui-dialog .ui-header,.ui-dialog .ui-content,.ui-dialog .ui-footer{margin:15px;position:relative}.ui-dialog .ui-header,.ui-dialog .ui-footer{z-index:10;width:auto}.ui-dialog .ui-content,.ui-dialog .ui-footer{margin-top:-15px}.ui-checkbox,.ui-radio{position:relative;margin:.2em 0 .5em;z-index:1}.ui-checkbox .ui-btn,.ui-radio .ui-btn{margin:0;text-align:left;z-index:2}.ui-checkbox .ui-btn-inner,.ui-radio .ui-btn-inner{white-space:normal}.ui-checkbox .ui-btn-icon-left .ui-btn-inner,.ui-radio .ui-btn-icon-left .ui-btn-inner{padding-left:45px}.ui-checkbox .ui-btn-icon-right .ui-btn-inner,.ui-radio .ui-btn-icon-right .ui-btn-inner{padding-right:45px}.ui-checkbox .ui-icon,.ui-radio .ui-icon{top:1.1em}.ui-checkbox .ui-btn-icon-left .ui-icon,.ui-radio .ui-btn-icon-left .ui-icon{left:15px}.ui-checkbox .ui-btn-icon-right .ui-icon,.ui-radio .ui-btn-icon-right .ui-icon{right:15px}.ui-checkbox input,.ui-radio input{position:absolute;left:20px;top:50%;width:10px;height:10px;margin:-5px 0 0 0;outline:0!important;z-index:1}.ui-field-contain{padding:1.5em 0;margin:0;border-bottom-width:1px;overflow:visible}.ui-field-contain:first-child{border-top-width:0}@media all and (min-width:450px){.ui-field-contain{border-width:0;padding:0;margin:1em 0}}.ui-select{display:block;position:relative}.ui-select select{position:absolute;left:-9999px;top:-9999px}.ui-select .ui-btn{overflow:hidden}.ui-select .ui-btn select{cursor:pointer;-webkit-appearance:button;left:0;top:0;width:100%;height:100%;opacity:0;-ms-filter:"alpha(opacity=0)";filter:alpha(opacity=0)}@-moz-document url-prefix(){.ui-select .ui-btn select{opacity:.0001}}.ui-select .ui-btn select.ui-select-nativeonly{opacity:1;text-indent:0}.ui-select .ui-btn-icon-right .ui-btn-inner{padding-right:45px}.ui-select .ui-btn-icon-right .ui-icon{right:15px}label.ui-select{font-size:16px;line-height:1.4;font-weight:normal;margin:0 0 .3em;display:block}.ui-select .ui-btn-text,.ui-selectmenu .ui-btn-text{display:block;min-height:1em}.ui-select .ui-btn-text{text-overflow:ellipsis;overflow:hidden}.ui-selectmenu{position:absolute;padding:0;z-index:100!important;width:80%;max-width:350px;padding:6px}.ui-selectmenu .ui-listview{margin:0}.ui-selectmenu .ui-btn.ui-li-divider{cursor:default}.ui-selectmenu-hidden{top:-9999px;left:-9999px}.ui-selectmenu-screen{position:absolute;top:0;left:0;width:100%;height:100%;z-index:99}.ui-screen-hidden,.ui-selectmenu-list .ui-li .ui-icon{display:none}.ui-selectmenu-list .ui-li .ui-icon{display:block}.ui-li.ui-selectmenu-placeholder{display:none}.ui-selectmenu .ui-header .ui-title{margin:.6em 46px .8em}@media all and (min-width:450px){label.ui-select{display:inline-block;width:20%;margin:0 2% 0 0}.ui-select{width:60%;display:inline-block}}.ui-selectmenu .ui-header h1:after{content:'.';visibility:hidden}label.ui-input-text{font-size:16px;line-height:1.4;display:block;font-weight:normal;margin:0 0 .3em}input.ui-input-text,textarea.ui-input-text{background-image:none;padding:.4em;line-height:1.4;font-size:16px;display:block;width:95%}input.ui-input-text{-webkit-appearance:none}textarea.ui-input-text{height:50px;-webkit-transition:height 200ms linear;-moz-transition:height 200ms linear;-o-transition:height 200ms linear;transition:height 200ms linear}.ui-input-search{padding:0 30px;width:77%;background-position:8px 50%;background-repeat:no-repeat;position:relative}.ui-input-search input.ui-input-text{border:0;width:98%;padding:.4em 0;margin:0;display:block;background:transparent none;outline:0!important}.ui-input-search .ui-input-clear{position:absolute;right:0;top:50%;margin-top:-14px}.ui-input-search .ui-input-clear-hidden{display:none}@media all and (min-width:450px){label.ui-input-text{vertical-align:top;display:inline-block;width:20%;margin:0 2% 0 0}input.ui-input-text,textarea.ui-input-text,.ui-input-search{width:60%;display:inline-block}.ui-input-search{width:50%}.ui-input-search input.ui-input-text{width:98%}}.ui-listview{margin:0;counter-reset:listnumbering}.ui-content .ui-listview{margin:-15px}.ui-content .ui-listview-inset{margin:1em 0}.ui-listview,.ui-li{list-style:none;padding:0}.ui-li,.ui-li.ui-field-contain{display:block;margin:0;position:relative;overflow:visible;text-align:left;border-width:0;border-top-width:1px}.ui-li .ui-btn-text a.ui-link-inherit{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.ui-li-divider,.ui-li-static{padding:.5em 15px;font-size:14px;font-weight:bold}.ui-li-divider{counter-reset:listnumbering}ol.ui-listview .ui-link-inherit:before,ol.ui-listview .ui-li-static:before,.ui-li-dec{font-size:.8em;display:inline-block;padding-right:.3em;font-weight:normal;counter-increment:listnumbering;content:counter(listnumbering) ". "}ol.ui-listview .ui-li-jsnumbering:before{content:""!important}.ui-listview-inset .ui-li{border-right-width:1px;border-left-width:1px}.ui-li:last-child,.ui-li.ui-field-contain:last-child{border-bottom-width:1px}.ui-li>.ui-btn-inner{display:block;position:relative;padding:0}.ui-li .ui-btn-inner a.ui-link-inherit,.ui-li-static.ui-li{padding:.7em 75px .7em 15px;display:block}.ui-li-has-thumb .ui-btn-inner a.ui-link-inherit,.ui-li-static.ui-li-has-thumb{min-height:60px;padding-left:100px}.ui-li-has-icon .ui-btn-inner a.ui-link-inherit,.ui-li-static.ui-li-has-icon{min-height:20px;padding-left:40px}.ui-li-heading{font-size:16px;font-weight:bold;display:block;margin:.6em 0;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.ui-li-desc{font-size:12px;font-weight:normal;display:block;margin:-.5em 0 .6em;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.ui-li-thumb,.ui-li-icon{position:absolute;left:1px;top:0;max-height:80px;max-width:80px}.ui-li-icon{max-height:40px;max-width:40px;left:10px;top:.9em}.ui-li-thumb,.ui-li-icon,.ui-li-content{float:left;margin-right:10px}.ui-li-aside{float:right;width:50%;text-align:right;margin:.3em 0}@media all and (min-width:480px){.ui-li-aside{width:45%}}.ui-li-divider{cursor:default}.ui-li-has-alt .ui-btn-inner a.ui-link-inherit,.ui-li-static.ui-li-has-alt{padding-right:95px}.ui-li-count{position:absolute;font-size:11px;font-weight:bold;padding:.2em .5em;top:50%;margin-top:-.9em;right:38px}.ui-li-divider .ui-li-count,.ui-li-static .ui-li-count{right:10px}.ui-li-has-alt .ui-li-count{right:55px}.ui-li-link-alt{position:absolute;width:40px;height:100%;border-width:0;border-left-width:1px;top:0;right:0;margin:0;padding:0}.ui-li-link-alt .ui-btn{overflow:hidden;position:absolute;right:8px;top:50%;margin:-11px 0 0 0;border-bottom-width:1px}.ui-li-link-alt .ui-btn-inner{padding:0;position:static}.ui-li-link-alt .ui-btn .ui-icon{right:50%;margin-right:-9px}.ui-listview-filter{border-width:0;overflow:hidden;margin:-15px -15px 15px -15px}.ui-listview-filter .ui-input-search{margin:5px;width:auto;display:block}.ui-listview-filter-inset{margin:-15px -5px -15px -5px;background:transparent}.ui-li.ui-screen-hidden{display:none}@media only screen and (min-device-width:768px) and (max-device-width:1024px){.ui-li .ui-btn-text{overflow:visible}}label.ui-slider{display:block}input.ui-slider-input{display:inline-block;width:50px}select.ui-slider-switch{display:none}div.ui-slider{position:relative;display:inline-block;overflow:visible;height:15px;padding:0;margin:0 2% 0 20px;top:4px;width:66%}a.ui-slider-handle{position:absolute;z-index:10;top:50%;width:28px;height:28px;margin-top:-15px;margin-left:-15px}a.ui-slider-handle .ui-btn-inner{padding-left:0;padding-right:0}@media all and (min-width:480px){label.ui-slider{display:inline-block;width:20%;margin:0 2% 0 0}div.ui-slider{width:45%}}div.ui-slider-switch{height:32px;overflow:hidden;margin-left:0}div.ui-slider-inneroffset{margin-left:50%;position:absolute;top:1px;height:100%;width:50%}div.ui-slider-handle-snapping{-webkit-transition:left 100ms linear}div.ui-slider-labelbg{position:absolute;top:0;margin:0;border-width:0}div.ui-slider-switch div.ui-slider-labelbg-a{width:60%;height:100%;left:0}div.ui-slider-switch div.ui-slider-labelbg-b{width:60%;height:100%;right:0}.ui-slider-switch-a div.ui-slider-labelbg-a,.ui-slider-switch-b div.ui-slider-labelbg-b{z-index:-1}.ui-slider-switch-a div.ui-slider-labelbg-b,.ui-slider-switch-b div.ui-slider-labelbg-a{z-index:0}div.ui-slider-switch a.ui-slider-handle{z-index:20;width:101%;height:32px;margin-top:-18px;margin-left:-101%}span.ui-slider-label{width:100%;position:absolute;height:32px;font-size:16px;text-align:center;line-height:2;background:0;border-color:transparent}span.ui-slider-label-a{left:-100%;margin-right:-1px}span.ui-slider-label-b{right:-100%;margin-left:-1px} \ No newline at end of file
diff --git a/app/assets/stylesheets/vendor/jquery.ui.autocomplete.css b/app/assets/stylesheets/vendor/jquery.ui.autocomplete.css
deleted file mode 100644
index ebbf48ddf..000000000
--- a/app/assets/stylesheets/vendor/jquery.ui.autocomplete.css
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * jQuery UI Autocomplete 1.8.8
- *
- * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Autocomplete#theming
- */
-.ui-autocomplete { position: absolute; cursor: default; }
-
-/* workarounds */
-* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */
-
-/*
- * jQuery UI Menu 1.8.8
- *
- * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Menu#theming
- */
-.ui-menu {
- list-style:none;
- padding: 2px;
- margin: 0;
- display:block;
- float: left;
- background-color: #fff;
-}
-.ui-menu .ui-menu {
- margin-top: -3px;
-}
-.ui-menu .ui-menu-item {
- margin:0;
- padding: 0;
- zoom: 1;
- float: left;
- clear: left;
- width: 100%;
-}
-.ui-menu .ui-menu-item a {
- text-decoration:none;
- display:block;
- padding:.2em .4em;
- line-height:1.5;
- zoom:1;
-}
-.ui-menu .ui-menu-item a.ui-state-hover,
-.ui-menu .ui-menu-item a.ui-state-active {
- font-weight: normal;
- margin: -1px;
- background-color: #3F8FBA;
- color: #eee;
-}
diff --git a/app/assets/stylesheets/vendor/tipsy.css b/app/assets/stylesheets/vendor/tipsy.css
deleted file mode 100644
index 932bd6e6e..000000000
--- a/app/assets/stylesheets/vendor/tipsy.css
+++ /dev/null
@@ -1,12 +0,0 @@
-.tipsy { padding: 5px; font-size: 10px; position: absolute; z-index: 100000; }
- .tipsy-inner { padding: 5px 8px 4px 8px; background-color: black; color: white; max-width: 200px; text-align: center; }
- .tipsy-inner { border-radius: 3px; -moz-border-radius:3px; -webkit-border-radius:3px; }
- .tipsy-arrow { position: absolute; background: url('../../images/tipsy.gif') no-repeat top left; width: 9px; height: 5px; }
- .tipsy-n .tipsy-arrow { top: 0; left: 50%; margin-left: -4px; }
- .tipsy-nw .tipsy-arrow { top: 0; left: 10px; }
- .tipsy-ne .tipsy-arrow { top: 0; right: 10px; }
- .tipsy-s .tipsy-arrow { bottom: 0; left: 50%; margin-left: -4px; background-position: bottom left; }
- .tipsy-sw .tipsy-arrow { bottom: 0; left: 10px; background-position: bottom left; }
- .tipsy-se .tipsy-arrow { bottom: 0; right: 10px; background-position: bottom left; }
- .tipsy-e .tipsy-arrow { top: 50%; margin-top: -4px; right: 0; width: 5px; height: 9px; background-position: top right; }
- .tipsy-w .tipsy-arrow { top: 50%; margin-top: -4px; left: 0; width: 5px; height: 9px; }
diff --git a/app/assets/templates/aspect_tpl.jst.hbs b/app/assets/templates/aspect_tpl.jst.hbs
index bd3acf7ea..840ee584e 100644
--- a/app/assets/templates/aspect_tpl.jst.hbs
+++ b/app/assets/templates/aspect_tpl.jst.hbs
@@ -1,7 +1,9 @@
-<a href="/contacts?a_id={{id}}" class="action modify_aspect"></a>
+<a href="/contacts?a_id={{id}}" class="action modify_aspect pull-right">
+ <i class="entypo pencil"></i>
+</a>
{{#if selected}}
- <div class="icons-check_yes_ok selected"></div>
+ <i class="entypo check selected"></i>
{{else}}
- <div class="icons-check_yes_ok"></div>
+ <div class="entypo check"></div>
{{/if}}
<a href="/aspects/query" class="selectable" data-guid="{{id}}"> {{name}} </a>
diff --git a/app/assets/templates/comment-stream_tpl.jst.hbs b/app/assets/templates/comment-stream_tpl.jst.hbs
index abcc20324..1ba92fe98 100644
--- a/app/assets/templates/comment-stream_tpl.jst.hbs
+++ b/app/assets/templates/comment-stream_tpl.jst.hbs
@@ -11,7 +11,7 @@
<div class="comments"> </div>
{{#if loggedIn}}
- <div class="comment no-border media new_comment_form_wrapper {{#unless commentsCount}} hidden {{/unless}}">
+ <div class="comment media new_comment_form_wrapper {{#unless commentsCount}} hidden {{/unless}}">
{{#with current_user}}
<a href="/people/{{guid}}" class="img">
{{{personImage this}}}
@@ -20,9 +20,9 @@
<div class="bd">
<form accept-charset="UTF-8" action="/posts/{{id}}/comments" class="new_comment" id="new_comment_on_{{id}}" method="post">
- <textarea class="comment_box" id="comment_text_on_{{id}}" name="text" rows="2" placeholder="{{t "stream.comment"}}" />
+ <textarea class="comment_box" id="comment_text_on_{{id}}" name="text" rows="2" required placeholder="{{t "stream.comment"}}" />
<div class="submit_button">
- <input class="button creation" id="comment_submit_{{id}}" name="commit" type="submit" value="{{t "stream.comment"}}" />
+ <input class="btn creation" id="comment_submit_{{id}}" name="commit" type="submit" value="{{t "stream.comment"}}" />
</div>
</form>
</div>
diff --git a/app/assets/templates/comment_tpl.jst.hbs b/app/assets/templates/comment_tpl.jst.hbs
index 23eb368d9..9a96c8916 100644
--- a/app/assets/templates/comment_tpl.jst.hbs
+++ b/app/assets/templates/comment_tpl.jst.hbs
@@ -1,35 +1,33 @@
<div id="{{guid}}">
<div class="img">
- {{#linkToPerson author}}
+ {{#linkToAuthor author}}
{{{personImage this "small" "small"}}}
- {{/linkToPerson}}
+ {{/linkToAuthor}}
</div>
<div class="bd">
- <div class="controls">
+ <div class="control-icons">
{{#if loggedIn}}
{{#if canRemove}}
<a href="#" class="delete comment_delete" title="{{t "delete"}}">
- <div alt="Deletelabel" class="icons-deletelabel" />
+ <i class="entypo trash"></i>
<a/>
{{else}}
<a href="#" data-type="comment" class="comment_report" title="{{t "report.name"}}">
- <div class="icons-report"/>
+ <i class="entypo warning"></i>
</a>
{{/if}}
{{/if}}
</div>
- {{#with author}}
- <a href="/people/{{guid}}" class="author author-name {{hovercardable this}}">
- {{name}}
- </a>
- {{/with}}
+ {{#linkToAuthor author}}
+ {{name}}
+ {{/linkToAuthor}}
- <div class="collapsible comment-content">
+ <div class="collapsible comment-content markdown-content">
{{{text}}}
</div>
-
+
<div class="info">
<a href="/posts/{{parent.id}}#{{guid}}" class="permalink_comment">
<time class="timeago" data-original-title="{{{localTime created_at}}}" datetime="{{created_at}}"/>
diff --git a/app/assets/templates/contact_tpl.jst.hbs b/app/assets/templates/contact_tpl.jst.hbs
new file mode 100644
index 000000000..a89542f4e
--- /dev/null
+++ b/app/assets/templates/contact_tpl.jst.hbs
@@ -0,0 +1,23 @@
+<div class="stream_element media contact {{in_aspect}}" id={{person_id}}>
+ <div class="pull-right">
+ {{{aspectMembershipIndicator this in_aspect}}}
+ </div>
+
+ <div class="media-object pull-left">
+ {{{personImage person 'small'}}}
+ </div>
+
+ <div class="media-body">
+ {{#linkToPerson person}}
+ {{name}}
+ {{/linkToPerson}}
+
+ <div class="info diaspora_handle">
+ {{person.diaspora_id}}
+ </div>
+
+ <div class="info tags">
+ {{{fmtTags person.profile.tags}}}
+ </div>
+ </div>
+</div>
diff --git a/app/assets/templates/faq_chat_tpl.jst.hbs b/app/assets/templates/faq_chat_tpl.jst.hbs
new file mode 100644
index 000000000..fb3633345
--- /dev/null
+++ b/app/assets/templates/faq_chat_tpl.jst.hbs
@@ -0,0 +1,6 @@
+<div class='question opened collapsible'>
+ <a class='toggle' href='#'>
+ <h4>{{ add_contact_roster_q }}</h4>
+ </a>
+ <div class='answer hideable'>{{{ add_contact_roster_a }}}</div>
+</div> \ No newline at end of file
diff --git a/app/assets/templates/faq_getting_help_tpl.jst.hbs b/app/assets/templates/faq_getting_help_tpl.jst.hbs
index ea46f687f..1457d820d 100644
--- a/app/assets/templates/faq_getting_help_tpl.jst.hbs
+++ b/app/assets/templates/faq_getting_help_tpl.jst.hbs
@@ -2,7 +2,7 @@
<h1>diaspora* FAQ</h1>
<br>
<div class='question opened'>
- <h4>{{ getting_started_q }}}</h4>
+ <h4>{{{ getting_started_q }}}</h4>
<div class='answer'>
{{{ getting_started_a }}}
</div>
@@ -15,8 +15,9 @@
<li>{{{ get_support_a_tutorials }}}</li>
<li>{{{ get_support_a_wiki }}}</li>
<li>{{{ get_support_a_irc }}}</li>
+ <li>{{{ get_support_a_faq }}}</li>
<li>{{{ get_support_a_hashtag }}}</li>
</ul>
</div>
</div>
-</div> \ No newline at end of file
+</div>
diff --git a/app/assets/templates/faq_keyboard_shortcuts_tpl.jst.hbs b/app/assets/templates/faq_keyboard_shortcuts_tpl.jst.hbs
index 1f3074bbd..cd8d4e244 100644
--- a/app/assets/templates/faq_keyboard_shortcuts_tpl.jst.hbs
+++ b/app/assets/templates/faq_keyboard_shortcuts_tpl.jst.hbs
@@ -10,6 +10,10 @@
<li>{{ keyboard_shortcuts_li2 }}</li>
<li>{{ keyboard_shortcuts_li3 }}</li>
<li>{{ keyboard_shortcuts_li4 }}</li>
+ <li>{{ keyboard_shortcuts_li5 }}</li>
+ <li>{{ keyboard_shortcuts_li6 }}</li>
+ <li>{{ keyboard_shortcuts_li7 }}</li>
+ <li>{{ keyboard_shortcuts_li8 }}</li>
</ul>
</div>
</div>
diff --git a/app/assets/templates/faq_posts_and_posting_tpl.jst.hbs b/app/assets/templates/faq_posts_and_posting_tpl.jst.hbs
index 98986102c..10af52769 100644
--- a/app/assets/templates/faq_posts_and_posting_tpl.jst.hbs
+++ b/app/assets/templates/faq_posts_and_posting_tpl.jst.hbs
@@ -1,20 +1,55 @@
-<div class='question opened collapsible'>
- <a class='toggle' href='#'>
- <h4>{{ hide_posts_q }}</h4>
- </a>
- <div class='answer hideable'>{{ hide_posts_a }}</div>
- </div>
<div class='question opened collapsible'>
<a class='toggle' href='#'>
- <h4>{{ format_text_q }}</h4>
+ <h4>{{ stream_full_of_posts_q }}</h4>
</a>
<div class='answer hideable'>
- {{{ format_text_a }}}
+ {{ stream_full_of_posts_a1 }}
+ <ol>
+ <li>{{ stream_full_of_posts_li1 }}</li>
+ <li>{{ stream_full_of_posts_li2 }}</li>
+ <li>{{ stream_full_of_posts_li3 }}</li>
+ </ol>
</div>
</div>
<div class='question opened collapsible'>
<a class='toggle' href='#'>
+ <h4>{{ hide_posts_q }}</h4>
+ </a>
+ <div class='answer hideable'>{{ hide_posts_a }}</div>
+ </div>
+ <div class='question opened collapsible'>
+ <a class='toggle' href='#'>
+ <h4>{{ post_notification_q }}</h4>
+ </a>
+ <div class='answer hideable'>{{ post_notification_a }}</div>
+ </div>
+ <div class='question opened collapsible'>
+ <a class='toggle' href='#'>
+ <h4>{{ post_report_q }}</h4>
+ </a>
+ <div class='answer hideable'>{{ post_report_a }}</div>
+ </div>
+ <div class='question opened collapsible'>
+ <a class='toggle' href='#'>
+ <h4>{{ character_limit_q }}</h4>
+ </a>
+ <div class='answer hideable'>{{ character_limit_a }}</div>
+ </div>
+ <div class='question opened collapsible'>
+ <a class='toggle' href='#'>
+ <h4>{{ char_limit_services_q }}</h4>
+ </a>
+ <div class='answer hideable'>{{ char_limit_services_a }}</div>
+ </div>
+ <div class='question opened collapsible'>
+ <a class='toggle' href='#'>
+ <h4>{{ format_text_q }}</h4>
+ </a>
+ <div class='answer hideable'>{{{ format_text_a }}}</div>
+ </div>
+ <div class='question opened collapsible'>
+ <a class='toggle' href='#'>
<h4>{{ insert_images_q }}</h4>
</a>
<div class='answer hideable'>{{ insert_images_a }}</div>
@@ -43,27 +78,13 @@
</div>
<div class='question opened collapsible'>
<a class='toggle' href='#'>
- <h4>{{ character_limit_q }}</h4>
+ <h4>{{ post_location_q }}</h4>
</a>
- <div class='answer hideable'>{{ character_limit_a }}</div>
+ <div class='answer hideable'>{{ post_location_a }}</div>
</div>
<div class='question opened collapsible'>
<a class='toggle' href='#'>
- <h4>{{ char_limit_services_q }}</h4>
+ <h4>{{ post_poll_q }}</h4>
</a>
- <div class='answer hideable'>{{ char_limit_services_a }}</div>
- </div>
- <div class='question opened collapsible'>
- <a class='toggle' href='#'>
- <h4>{{ stream_full_of_posts_q }}</h4>
- </a>
- <div class='answer hideable'>
- {{ stream_full_of_posts_a1 }}
- <ol>
- <li>{{ stream_full_of_posts_li1 }}</li>
- <li>{{ stream_full_of_posts_li2 }}</li>
- <li>{{ stream_full_of_posts_li3 }}</li>
- </ol>
- </div>
+ <div class='answer hideable'>{{ post_poll_a }}</div>
</div>
-</div> \ No newline at end of file
diff --git a/app/assets/templates/faq_question_tpl.jst.hbs b/app/assets/templates/faq_question_tpl.jst.hbs
index 269c2d6db..981ce9666 100644
--- a/app/assets/templates/faq_question_tpl.jst.hbs
+++ b/app/assets/templates/faq_question_tpl.jst.hbs
@@ -4,6 +4,6 @@
<h4>{{ question }}</h4>
</a>
<div class='answer hideable'>
- {{ answer }}
+ {{{ answer }}}
</div>
</div> \ No newline at end of file
diff --git a/app/assets/templates/faq_sharing_tpl.jst.hbs b/app/assets/templates/faq_sharing_tpl.jst.hbs
index e83089c55..f62d5c20f 100644
--- a/app/assets/templates/faq_sharing_tpl.jst.hbs
+++ b/app/assets/templates/faq_sharing_tpl.jst.hbs
@@ -13,12 +13,19 @@
<li>{{ add_to_aspect_li5 }}</li>
<li>{{ add_to_aspect_li6 }}</li>
<li>{{ add_to_aspect_li7 }}</li>
+ <li>{{ add_to_aspect_li8 }}</li>
</ul>
{{ add_to_aspect_a2 }}
</div>
</div>
<div class='question opened collapsible'>
<a class='toggle' href='#'>
+ <h4>{{ sharing_notification_q }}</h4>
+ </a>
+ <div class='answer hideable'>{{ sharing_notification_a }}</div>
+</div>
+<div class='question opened collapsible'>
+ <a class='toggle' href='#'>
<h4>{{ only_sharing_q }}</h4>
</a>
<div class='answer hideable'>{{ only_sharing_a }}</div>
diff --git a/app/assets/templates/faq_tags_tpl.jst.hbs b/app/assets/templates/faq_tags_tpl.jst.hbs
new file mode 100644
index 000000000..f093dcea4
--- /dev/null
+++ b/app/assets/templates/faq_tags_tpl.jst.hbs
@@ -0,0 +1,30 @@
+<div class='question opened collapsible'>
+ <a class='toggle' href='#'>
+ <h4>{{ what_are_tags_for_q }}</h4>
+ </a>
+ <div class='answer hideable'>{{{ what_are_tags_for_a }}}</div>
+</div>
+<div class='question opened collapsible'>
+ <a class='toggle' href='#'>
+ <h4>{{ tags_in_comments_q }}</h4>
+ </a>
+ <div class='answer hideable'>{{{ tags_in_comments_a }}}</div>
+</div>
+<div class='question opened collapsible'>
+ <a class='toggle' href='#'>
+ <h4>{{ followed_tags_q }}</h4>
+ </a>
+ <div class='answer hideable'>{{{ followed_tags_a }}}</div>
+</div>
+<div class='question opened collapsible'>
+ <a class='toggle' href='#'>
+ <h4>{{ people_tag_page_q }}</h4>
+ </a>
+ <div class='answer hideable'>{{{ people_tag_page_a }}}</div>
+</div>
+<div class='question opened collapsible'>
+ <a class='toggle' href='#'>
+ <h4>{{ filter_tags_q }}</h4>
+ </a>
+ <div class='answer hideable'>{{{ filter_tags_a }}}</div>
+</div> \ No newline at end of file
diff --git a/app/assets/templates/header_tpl.jst.hbs b/app/assets/templates/header_tpl.jst.hbs
index 2c2bb2d86..3922d6b5d 100644
--- a/app/assets/templates/header_tpl.jst.hbs
+++ b/app/assets/templates/header_tpl.jst.hbs
@@ -22,7 +22,7 @@
<div id="nav_badges">
<div class="badge badge-inverse" id="notification_badge">
<div class="icons-notifications_grey" >
- <a href="/notifications" title="{{t "header.notifications"}}" class="badge_link" >
+ <a id="notifications-badge" href="/notifications" title="{{t "header.notifications"}}" class="badge_link" >
<div class="badge_count {{#unless current_user.notifications_count}} hidden {{/unless}}">
{{current_user.notifications_count}}
</div>
@@ -72,7 +72,7 @@
<div class="user-menu-more-indicator">
</div>
- <img alt="{{current_user.name}}" class="user-menu-avatar" src="{{current_user.avatar.small}}" title="{{current_user.name}}" />
+ {{{personImage current_user 'small' 'avatar user-menu-avatar'}}}
<a class="user-name" href="#">{{current_user.name}}</a>
</li>
<li class="user-menu-item"><a href="/people/{{current_user.guid}}">{{t "header.profile"}}</a></li>
@@ -87,7 +87,7 @@
<div id="global_search">
- <form accept-charset="UTF-8" action="/search" class="search_form" method="get">
+ <form id="header-search-form" accept-charset="UTF-8" action="/search" class="search_form" method="get">
<input name="utf8" type="hidden" value="✓">
<input id="q" name="q" placeholder="{{t "header.search"}}" results="5" type="search" autocomplete="off" class="ac_input">
</form>
diff --git a/app/assets/templates/help_tpl.jst.hbs b/app/assets/templates/help_tpl.jst.hbs
index 9bd79d684..45bb0ed7e 100644
--- a/app/assets/templates/help_tpl.jst.hbs
+++ b/app/assets/templates/help_tpl.jst.hbs
@@ -17,7 +17,7 @@
<span class="section-selected">{{ title_account_and_data_management }}</span>
</li>
<li>
- <a href="#" class="section-unselected faq-link" data-section="aspects" data-items="what_is_an_aspect who_sees_post restrict_posts_i_see contacts_know_aspect contacts_visible remove_notification rename_aspect change_aspect_of_post post_multiple_aspects person_multiple_aspects delete_aspect">{{ title_aspects }}</a>
+ <a href="#" class="section-unselected faq-link" data-section="aspects" data-items="what_is_an_aspect who_sees_post contacts_know_aspect person_multiple_aspects contacts_visible remove_notification change_aspect_of_post post_multiple_aspects restrict_posts_i_see rename_aspect delete_aspect">{{ title_aspects }}</a>
<span class="section-selected">{{ title_aspects }}</span>
</li>
<li>
@@ -57,7 +57,7 @@
<span class="section-selected">{{ title_sharing }}</span>
</li>
<li>
- <a href="#" class="section-unselected faq-link" data-section="tags" data-items="what_are_tags_for tags_in_comments followed_tags people_tag_page filter_tags">{{ title_tags }}</a>
+ <a href="#" class="section-unselected faq-link-tags" data-section="tags" data-items="what_are_tags_for tags_in_comments followed_tags people_tag_page filter_tags">{{ title_tags }}</a>
<span class="section-selected">{{ title_tags }}</span>
</li>
<li>
@@ -68,6 +68,12 @@
<a href="#" class="section-unselected faq-link" data-section="miscellaneous" data-items="back_to_top photo_albums subscribe_feed diaspora_app">{{ title_miscellaneous }}</a>
<span class="section-selected">{{ title_miscellaneous }}</span>
</li>
+ {{#if chat_enabled }}
+ <li>
+ <a href="#" class="section-unselected faq-link-chat" data-section="chat" data-items="add_contact_roster i_m_a_podmin">{{ title_chat }}</a>
+ <span class="section-selected">{{ title_chat }}</span>
+ </li>
+ {{/if}}
</ul>
</div>
</div>
diff --git a/app/assets/templates/likes-info_tpl.jst.hbs b/app/assets/templates/likes-info_tpl.jst.hbs
index 0af32bb90..71206eb50 100644
--- a/app/assets/templates/likes-info_tpl.jst.hbs
+++ b/app/assets/templates/likes-info_tpl.jst.hbs
@@ -1,7 +1,7 @@
{{#if likesCount}}
<div class="comment">
<div class="media">
- <div alt="Heart" class="icons-heart"></div>
+ <i class="entypo heart"></i>
<div class="bd">
{{#unless likes_fetched}}
@@ -12,11 +12,9 @@
{{else}}
{{#each likes}}
- {{#with author}}
- <a href="/people/{{guid}}" class="{{hovercardable this}}">
- <img src="{{avatar.small}}" class="avatar micro" title="{{name}}"/>
- </a>
- {{/with}}
+ {{#linkToAuthor author}}
+ {{{personImage this 'small' 'micro'}}}
+ {{/linkToAuthor}}
{{/each}}
{{/unless}}
</div>
diff --git a/app/assets/templates/photo_tpl.jst.hbs b/app/assets/templates/photo_tpl.jst.hbs
index 534b9b998..4f8e8b1bf 100644
--- a/app/assets/templates/photo_tpl.jst.hbs
+++ b/app/assets/templates/photo_tpl.jst.hbs
@@ -1,29 +1,29 @@
-<div class="media">
+<div class="media span4">
<div class="bd">
{{#if loggedIn}}
- <div class="controls">
- {{#unless authorIsCurrentUser}}
+ <div class="control-icons">
+ {{#if authorIsCurrentUser}}
+ <a href="#" rel="nofollow" class="delete remove_post" title="{{t "delete"}}">
+ <i class="entypo trash"></i>
+ </a>
+ {{else}}
<a href="#" rel="nofollow" data-type="post" class="post_report" title="{{t "report.name"}}">
- <div class="icons-report control_icon"/>
+ <i class="entypo warning"></i>
</a>
<a href="#" rel="nofollow" class="block_user" title="{{t "ignore"}}">
- <div class="icons-ignoreuser control_icon"></div>
+ <i class="entypo block"></i>
</a>
<a href="#" rel="nofollow" class="delete hide_post" title="{{t "stream.hide"}}">
- <div class="icons-deletelabel delete control_icon"/>
- </a>
- {{else}}
- <a href="#" rel="nofollow" class="delete remove_post" title="{{t "delete"}}">
- <div class="icons-deletelabel delete control_icon"/>
+ <i class="entypo cross"></i>
</a>
- {{/unless}}
+ {{/if}}
</div>
{{/if}}
-
- <a href="#" class="photo-link">
- <img src="{{sizes.large}}" class="photo big_photo" data-small-photo="{{sizes.small}}" data-full-photo="{{sizes.large}}" rel="lightbox">
- </a>
-
+ <div class="thumbnail">
+ <a href="#" class="photo-link">
+ <img src="{{sizes.large}}" class="photo big_photo" data-small-photo="{{sizes.small}}" data-full-photo="{{sizes.large}}" rel="lightbox">
+ </a>
+ </div>
-</div> \ No newline at end of file
+</div>
diff --git a/app/assets/templates/poll_creator_tpl.jst.hbs b/app/assets/templates/poll_creator_tpl.jst.hbs
index f71d46f01..ea5ce6207 100644
--- a/app/assets/templates/poll_creator_tpl.jst.hbs
+++ b/app/assets/templates/poll_creator_tpl.jst.hbs
@@ -1,20 +1,21 @@
<div class="poll-question control-group">
- <div class="controls">
- <input class="span12" placeholder="{{t 'publisher.question' }}" type="text" name="poll_question">
- </div>
+ <input class="input-block-level" placeholder="{{t 'publisher.question' }}" type="text" name="poll_question">
</div>
<div class="poll-answers">
- <div class="poll-answer control-group">
- <div class="controls">
- <input type="text" name="poll_answers[]" placeholder="{{t 'publisher.option' }}">
- <div class="remove-answer icons-deletelabel"></div>
+ <div class="poll-answer row-fluid">
+ <div class="span11">
+ <input type="text" class="input-block-level" name="poll_answers[]" placeholder="{{t 'publisher.option' }}">
+ </div>
+ <div class="span1">
+ <i class="remove-answer entypo cross"></i>
</div>
</div>
- <div class="poll-answer control-group">
- <div class="controls">
- <input type="text" name="poll_answers[]" placeholder="{{t 'publisher.option' }}">
- <div class="remove-answer icons-deletelabel"></div>
+ <div class="poll-answer row-fluid">
+ <div class="span11">
+ <input type="text" class="input-block-level" name="poll_answers[]" placeholder="{{t 'publisher.option' }}">
+ </div>
+ <div class="span1">
+ <i class="remove-answer entypo cross"></i>
</div>
</div>
</div>
-
diff --git a/app/assets/templates/poll_tpl.jst.hbs b/app/assets/templates/poll_tpl.jst.hbs
index f9aad7f18..4b73b1a86 100644
--- a/app/assets/templates/poll_tpl.jst.hbs
+++ b/app/assets/templates/poll_tpl.jst.hbs
@@ -37,6 +37,13 @@
</div>
{{/poll.poll_answers}}
{{/if}}
+
+ {{#if is_reshare }}
+ <div class="poll_footer">
+ {{{t "poll.go_to_original_post" original_post_link=original_post_link}}}
+ </div>
+ {{/if}}
+
</div>
</div>
{{/if}}
diff --git a/app/assets/templates/profile_header_tpl.jst.hbs b/app/assets/templates/profile_header_tpl.jst.hbs
new file mode 100644
index 000000000..516ae8345
--- /dev/null
+++ b/app/assets/templates/profile_header_tpl.jst.hbs
@@ -0,0 +1,104 @@
+{{#if loggedIn}}
+ <div class="pull-right">
+ {{#if is_own_profile}}
+ {{!-- can't block myself, so don't check it here --}}
+ <a href="{{urlTo 'edit_profile'}}" id="edit_profile" class="btn btn-primary creation">{{t 'people.edit_my_profile'}}</a>
+ {{else}} {{#if is_blocked}}
+ <a href="#" id="unblock_user_button" class="btn btn-danger">{{t 'people.stop_ignoring'}}</a>
+ {{else}}
+ <div class="placeholder aspect_membership_dropdown"></div>
+ {{/if}}{{/if}}
+ </div>
+{{/if}}
+
+<div id="author_info">
+ <h2>
+ <span id="name">{{name}}</span>
+ <span id="diaspora_handle">{{diaspora_id}}</span>
+ {{#if show_profile_btns}}
+ {{{sharingMessage this}}}
+ {{/if}}
+ </h2>
+
+ {{#if loggedIn}}
+ {{#if has_tags}}
+ <div class="description">
+ <i class="entypo tag"></i>
+ {{fmtTags profile.tags}}
+ </div>
+ {{else}}
+ {{#if is_own_profile}}
+ <div class="description">
+ <i>{{t 'profile.you_have_no_tags'}}</i>
+ <span class="add_tags">
+ <a href="{{urlTo 'edit_profile'}}">{{t 'profile.add_some'}}</a>
+ </span>
+ </div>
+ {{/if}}
+ {{/if}}
+ {{/if}}
+</div>
+
+{{#if loggedIn}}
+ <div id="profile_horizontal_bar">
+ {{#if show_profile_btns}}
+ <div id="profile_buttons" class="pull-right">
+ {{#if is_receiving}}
+ {{!-- create status message with mention --}}
+ <span class="profile_button">
+ <span id="mention_button" class="profile-header-icon" title="{{t 'people.mention'}}" data-placement="bottom" data-toggle="modal" data-target="#mentionModal">@</span>
+ </span>
+ {{/if}}
+
+ {{#if is_mutual}}
+ {{!-- create private conversation with person --}}
+ <span class="profile_button">
+ <i id="message_button" class="entypo profile-header-icon mail" title="{{t 'people.message'}}" data-placement="bottom" data-toggle="modal" data-target="#conversationModal"></i>
+ </span>
+ {{/if}}
+
+ {{#unless is_blocked}}
+ {{!-- ignore the person --}}
+ <a href="#" class="profile_button" rel="nofollow">
+ <i id="block_user_button" class="entypo profile-header-icon block block_user" title="{{t 'ignore'}}" data-placement="bottom"></i>
+ </a>
+ {{/unless}}
+ </div>
+ {{/if}}
+
+ <ul id="profile_nav">
+ <li {{#isCurrentProfilePage guid diaspora_id}} class="active" {{/isCurrentProfilePage}}>
+ <a href="{{urlTo 'person' guid}}" id="posts_link">
+ <i class="entypo docs"></i>
+ {{t 'profile.posts'}}
+ </a>
+ </li>
+ {{#if show_photos}}
+ <li {{#isCurrentPage 'person_photos' guid}} class="active" {{/isCurrentPage}}>
+ <a href="{{urlTo 'person_photos' guid}}" id="photos_link">
+ <i class="entypo picture"></i>
+ {{t 'profile.photos'}}
+ <div class="badge badge-default">{{photos.count}}</div>
+ </a>
+ </li>
+ {{/if}}
+ {{#if show_contacts}}
+ <li {{#isCurrentPage 'person_contacts' guid}} class="active" {{/isCurrentPage}}>
+ {{#if is_own_profile}}
+ <a href="{{urlTo 'contacts'}}" id="contacts_link">
+ <i class="entypo users"></i>
+ {{t 'profile.contacts'}}
+ <div class="badge badge-default">{{contacts.count}}</div>
+ </a>
+ {{else}}
+ <a href="{{urlTo 'person_contacts' guid}}" id="contacts_link">
+ <i class="entypo users"></i>
+ {{t 'profile.contacts'}}
+ <div class="badge badge-default">{{contacts.count}}</div>
+ </a>
+ {{/if}}
+ </li>
+ {{/if}}
+ </div>
+ </div>
+{{/if}}
diff --git a/app/assets/templates/profile_sidebar_tpl.jst.hbs b/app/assets/templates/profile_sidebar_tpl.jst.hbs
new file mode 100644
index 000000000..69cc76d83
--- /dev/null
+++ b/app/assets/templates/profile_sidebar_tpl.jst.hbs
@@ -0,0 +1,37 @@
+
+<div id="profile_photo" class="profile_photo">
+ {{#linkToPerson this}}
+ {{{personImage this "large"}}}
+ {{/linkToPerson}}
+</div>
+
+{{#if show_profile_info}}
+ <ul id="profile_information">
+ {{#with profile}}
+ {{#if bio}}
+ <li>
+ <h4>{{t 'profile.bio'}}</h4>
+ <div class="{{txtDirClass bio}}">{{fmtText bio}}</div>
+ </li>
+ {{/if}}
+ {{#if location}}
+ <li>
+ <h4>{{t 'profile.location'}}</h4>
+ <div class="{{txtDirClass location}}">{{fmtText location}}</div>
+ </li>
+ {{/if}}
+ {{#if gender}}
+ <li>
+ <h4>{{t 'profile.gender'}}</h4>
+ {{gender}}
+ </li>
+ {{/if}}
+ {{#if birthday}}
+ <li>
+ <h4>{{t 'profile.born'}}</h4>
+ {{birthday}}
+ </li>
+ {{/if}}
+ {{/with}}
+ </ul>
+{{/if}}
diff --git a/app/assets/templates/reshare_tpl.jst.hbs b/app/assets/templates/reshare_tpl.jst.hbs
index ef7b821f2..a1a661658 100644
--- a/app/assets/templates/reshare_tpl.jst.hbs
+++ b/app/assets/templates/reshare_tpl.jst.hbs
@@ -6,14 +6,16 @@
{{#with root}}
<a href="/people/{{author.guid}}" class="img {{{hovercardable this}}}">
- <img src="{{author.avatar.small}}" class="avatar" />
+ {{{personImage author 'small'}}}
</a>
{{/with}}
{{#with root}}
<div class="bd">
<div>
- <a href="/people/{{author.guid}}" class="author {{{hovercardable author}}}">{{author.name}}</a>
+ {{#linkToAuthor author}}
+ {{name}}
+ {{/linkToAuthor}}
<span class="details grey">
-
diff --git a/app/assets/templates/single-post-viewer/single-post-actions_tpl.jst.hbs b/app/assets/templates/single-post-viewer/single-post-actions_tpl.jst.hbs
index 908c2d4ab..a183acba3 100644
--- a/app/assets/templates/single-post-viewer/single-post-actions_tpl.jst.hbs
+++ b/app/assets/templates/single-post-viewer/single-post-actions_tpl.jst.hbs
@@ -23,11 +23,5 @@
</a>
{{/if}}
{{/if}}
-
- {{#if authorIsNotCurrentUser}}
- <a href="#" data-type="post" class="post_report" title="{{t "report.name"}}">
- <i class="entypo gray large">&#x21;</i>
- </a>
- {{/if}}
{{/if}}
</div>
diff --git a/app/assets/templates/single-post-viewer/single-post-content_tpl.jst.hbs b/app/assets/templates/single-post-viewer/single-post-content_tpl.jst.hbs
index a144e0390..4bffd46ff 100644
--- a/app/assets/templates/single-post-viewer/single-post-content_tpl.jst.hbs
+++ b/app/assets/templates/single-post-viewer/single-post-content_tpl.jst.hbs
@@ -3,29 +3,29 @@
<div id='post-info' class='span8'>
<div class="img pull-left">
{{#if root}}
- {{#linkToPerson root.author}}
+ {{#linkToAuthor root.author}}
{{{personImage this 'medium'}}}
- {{/linkToPerson}}
+ {{/linkToAuthor}}
{{else}}
- {{#linkToPerson author}}
+ {{#linkToAuthor author}}
{{{personImage this 'medium'}}}
- {{/linkToPerson}}
+ {{/linkToAuthor}}
{{/if}}
</div>
<div class="bd">
<span class='author'>
{{#if root}}
- {{#linkToPerson root.author}}
+ {{#linkToAuthor root.author}}
{{name}}
- {{/linkToPerson}}
+ {{/linkToAuthor}}
{{else}}
- {{#linkToPerson author}}
+ {{#linkToAuthor author}}
{{name}}
- {{/linkToPerson}}
+ {{/linkToAuthor}}
{{/if}}
</span>
-
+
<div class='info'>
{{#if public}}
<span class='post_scope' title="{{t "stream.public"}}">
@@ -58,6 +58,9 @@
{{/if}}
<div class='status-message-location' />
</div>
+ {{#unless root}}
+ <div id='single-post-moderation' />
+ {{/unless}}
</div>
</div>
{{#unless root}}
@@ -69,26 +72,29 @@
<div class='span8' id='reshare-info'>
<i class='entypo retweet small pull-left'></i>
<div class="img pull-left">
- {{#linkToPerson author}}
+ {{#linkToAuthor author}}
{{{personImage this 'small'}}}
- {{/linkToPerson}}
+ {{/linkToAuthor}}
</div>
<span class="author">
- {{#linkToPerson author}}
+ {{#linkToAuthor author}}
{{name}}
- {{/linkToPerson}}
- </span>
- <span class="post-time">
- <a href="/posts/{{id}}">
- <time datetime="{{created_at}}" title="{{localTime created_at}}" />
- </a>
+ {{/linkToAuthor}}
</span>
+ <div class="post-context">
+ <span class="post-time">
+ <a href="/posts/{{id}}">
+ <time datetime="{{created_at}}" title="{{localTime created_at}}" />
+ </a>
+ </span>
+ <span id='single-post-moderation' />
+ </div>
</div>
<div id='single-post-actions' class='span4' />
</div>
{{/if}}
</div>
<div id='body' class='row-fluid'>
- <div id='real-post-content' class='span12'>
+ <div id='real-post-content' class='post-content span12'>
</div>
</div>
diff --git a/app/assets/templates/single-post-viewer/single-post-interactions_tpl.jst.hbs b/app/assets/templates/single-post-viewer/single-post-interactions_tpl.jst.hbs
index aebe7a680..2488ea0de 100644
--- a/app/assets/templates/single-post-viewer/single-post-interactions_tpl.jst.hbs
+++ b/app/assets/templates/single-post-viewer/single-post-interactions_tpl.jst.hbs
@@ -6,9 +6,9 @@
</span>
<span>
{{#each reshares}}
- {{#linkToPerson author}}
+ {{#linkToAuthor author}}
{{{personImage this 'small' 'micro'}}}
- {{/linkToPerson}}
+ {{/linkToAuthor}}
{{/each}}
</span>
</div>
@@ -21,9 +21,9 @@
</span>
<span>
{{#each likes}}
- {{#linkToPerson author}}
+ {{#linkToAuthor author}}
{{{personImage this 'small' 'micro'}}}
- {{/linkToPerson}}
+ {{/linkToAuthor}}
{{/each}}
</span>
</div>
diff --git a/app/assets/templates/single-post-viewer/single-post-moderation_tpl.jst.hbs b/app/assets/templates/single-post-viewer/single-post-moderation_tpl.jst.hbs
new file mode 100644
index 000000000..fa96417b2
--- /dev/null
+++ b/app/assets/templates/single-post-viewer/single-post-moderation_tpl.jst.hbs
@@ -0,0 +1,28 @@
+<div>
+ {{#if loggedIn}}
+ {{#if authorIsCurrentUser}}
+ <a href="#" class="remove_post" title="{{t "delete"}}">
+ <i class="entypo trash"></i>
+ </a>
+ {{else}}
+ <a href="#" data-type="post" class="post_report" title="{{t "report.name"}}">
+ <i class="entypo warning"></i>
+ </a>
+ <a href="#" data-type="post" class="block_user" title="{{t "ignore"}}">
+ <i class="entypo block"></i>
+ </a>
+ {{#if participation}}
+ <a href="#" data-type="nofollow" class="destroy_participation" title="{{t "stream.disable_post_notifications"}}">
+ <i class="entypo bell"></i>
+ </a>
+ {{else}}
+ <a href="#" data-type="nofollow" class="create_participation" title="{{t "stream.enable_post_notifications"}}">
+ <i class="entypo bell"></i>
+ </a>
+ {{/if}}
+ <a href="#" data-type="post" class="hide_post" title="{{t "stream.hide"}}">
+ <i class="entypo cross"></i>
+ </a>
+ {{/if}}
+ {{/if}}
+</div>
diff --git a/app/assets/templates/status-message_tpl.jst.hbs b/app/assets/templates/status-message_tpl.jst.hbs
index 761dc57c6..a750289cc 100644
--- a/app/assets/templates/status-message_tpl.jst.hbs
+++ b/app/assets/templates/status-message_tpl.jst.hbs
@@ -15,7 +15,9 @@
{{/if}}
<div class="collapsible">
- {{{text}}}
+ <div class="markdown-content">
+ {{{text}}}
+ </div>
<div class="oembed"></div>
<div class="opengraph"></div>
<div class="poll"></div>
diff --git a/app/assets/templates/stream-element_tpl.jst.hbs b/app/assets/templates/stream-element_tpl.jst.hbs
index 9a6952808..6029e056b 100644
--- a/app/assets/templates/stream-element_tpl.jst.hbs
+++ b/app/assets/templates/stream-element_tpl.jst.hbs
@@ -8,29 +8,38 @@
<div class="bd">
{{#if loggedIn}}
- <div class="controls">
- {{#unless authorIsCurrentUser}}
+ <div class="control-icons">
+ {{#if authorIsCurrentUser}}
+ <a href="#" rel="nofollow" class="delete remove_post" title="{{t "delete"}}">
+ <i class="entypo trash"></i>
+ </a>
+ {{else}}
<a href="#" rel="nofollow" data-type="post" class="post_report" title="{{t "report.name"}}">
- <div class="icons-report control_icon"/>
+ <i class="entypo warning"></i>
</a>
<a href="#" rel="nofollow" class="block_user" title="{{t "ignore"}}">
- <div class="icons-ignoreuser control_icon"></div>
+ <i class="entypo block"></i>
</a>
+ {{#if participation}}
+ <a href="#" rel="nofollow" class="destroy_participation" title="{{t "stream.disable_post_notifications"}}">
+ <i class="entypo bell"></i>
+ </a>
+ {{else}}
+ <a href="#" rel="nofollow" class="create_participation" title="{{t "stream.enable_post_notifications"}}">
+ <i class="entypo bell"></i>
+ </a>
+ {{/if}}
<a href="#" rel="nofollow" class="delete hide_post" title="{{t "stream.hide"}}">
- <div class="icons-deletelabel delete control_icon"/>
+ <i class="entypo cross"></i>
</a>
- {{else}}
- <a href="#" rel="nofollow" class="delete remove_post" title="{{t "delete"}}">
- <div class="icons-deletelabel delete control_icon"/>
- </a>
- {{/unless}}
+ {{/if}}
</div>
{{/if}}
-
+
<div>
- {{#with author}}
- <a href="/people/{{guid}}" class="author {{{hovercardable this}}}">{{name}}</a>
- {{/with}}
+ {{#linkToAuthor author}}
+ {{name}}
+ {{/linkToAuthor}}
<span class="details grey">
-
diff --git a/app/assets/templates/stream-faces_tpl.jst.hbs b/app/assets/templates/stream-faces_tpl.jst.hbs
index 6db001f19..2e9898905 100644
--- a/app/assets/templates/stream-faces_tpl.jst.hbs
+++ b/app/assets/templates/stream-faces_tpl.jst.hbs
@@ -1,5 +1,5 @@
{{#people}}
- {{#linkToPerson this}}
+ {{#linkToAuthor this}}
{{{personImage this "small"}}}
- {{/linkToPerson}}
+ {{/linkToAuthor}}
{{/people}}
diff --git a/app/assets/templates/stream-frame_tpl.jst.hbs b/app/assets/templates/stream-frame_tpl.jst.hbs
deleted file mode 100644
index 5574a479d..000000000
--- a/app/assets/templates/stream-frame_tpl.jst.hbs
+++ /dev/null
@@ -1,31 +0,0 @@
-<div id="{{guid}}" data-id="{{id}}" data-target="#{{guid}}" class="stream-frame-wrapper">
-
- <div class="permalink-wrapper info">
- <a href="/posts/{{id}}" class="permalink">
- <i class="icon-zoom-in icon-white"></i>
- </a>
- </div>
-
- <div class="permalink-wrapper info">
- <a href="/p/{{guid}}">
- <i class="icon-zoom-in icon-white"></i>
- </a>
- </div>
- <div class='stream-frame-feedback'></div>
-
- <div class="media author">
- {{#linkToPerson author}}
- <div class="img">
- <div class="profile-image-container smaller" style="background-image : url('{{avatar.large}}')"></div>
- </div>
- {{/linkToPerson}}
-
- <div class="bd">
- {{#linkToPerson author}}
- {{name}}
- {{/linkToPerson}}
- </div>
- </div>
-
- <div class="small-frame"></div>
-</div>
diff --git a/app/assets/templates/stream_tpl.jst.hbs b/app/assets/templates/stream_tpl.jst.hbs
deleted file mode 100644
index c3fb636a8..000000000
--- a/app/assets/templates/stream_tpl.jst.hbs
+++ /dev/null
@@ -1,75 +0,0 @@
-<div id="header">
- <div class="container" style="position:relative;">
-
- <div id="top-right-nav">
- {{#if current_user.guid}}
- <a href="/notifications" title="Notifications" id="notifications-button">
- <span class="label label-inverse">
- {{current_user.notifications_count}}
- </span>
- </a>
-
- <a href="/people/{{current_user.guid}}?ex=true" id="profile-button">
- <span class="label label-inverse">
- <i class="icon-user icon-white"></i>
- <span>
- PROFILE
- </span>
- </span>
- </a>
-
- <a href="/" id="home-button">
- <span class="label label-inverse">
- <i class="icon-home icon-white"></i>
- <span>
- HOME
- </span>
- </span>
- </a>
-
- <a href="/users/sign_out" data-method="delete" title="Log out" id="logout-button">
- <span class="label label-inverse">
- <i class="icon-off icon-white"></i>
- </span>
- </a>
- {{else}}
- <a href="/" id="home-button">
- <span class="label label-inverse">
- <span>
- {{t "pod_name"}}
- </span>
- </span>
- </a>
- {{/if}}
- </div>
-
- <h1>
- <a href='/stream?ex=true' class='logo'>
- {{t "pod_name"}}
- </a>
- </h1>
- </div>
-</div>
-
-<div id="stream">
- <div class="container">
- <div class="row">
- <div class="background offset5"></div>
- </div>
-
- <div class="row">
- <div class='span4 offset1'>
- <section id="stream-content" />
- <div id="paginate">
- <div class="loader"/>
- </div>
- </div>
-
-
- <!--Since stream-interactions is fixed, we need a double span5 declaration here :(-->
- <div class="span6">
- <section id="stream-interactions" class="span6"/>
- </div>
- </div>
- </div>
-</div>
diff --git a/app/assets/templates/tag_following_action_tpl.jst.hbs b/app/assets/templates/tag_following_action_tpl.jst.hbs
index 606f6778f..2d31000f4 100644
--- a/app/assets/templates/tag_following_action_tpl.jst.hbs
+++ b/app/assets/templates/tag_following_action_tpl.jst.hbs
@@ -1,10 +1,12 @@
-<div class="right">
+<div class="pull-right tag-following-action">
<form accept-charset="UTF-8" action="/tag_followings" method="post">
- <input type="submit" class="button take_action
- {{#if tag_is_followed }}
- red_on_hover in_aspects
+ <input type="submit" class="btn
+ {{#if tag_is_followed }}
+ green followed
+ {{else}}
+ btn-default
{{/if}}
" type="submit" value="{{followString}}"
/>
</form>
-</div> \ No newline at end of file
+</div>
diff --git a/app/assets/templates/tag_following_tpl.jst.hbs b/app/assets/templates/tag_following_tpl.jst.hbs
index bc88c255f..1f269a095 100644
--- a/app/assets/templates/tag_following_tpl.jst.hbs
+++ b/app/assets/templates/tag_following_tpl.jst.hbs
@@ -1,4 +1,4 @@
-<a href="#" id="unfollow_{{name}}" rel="nofollow" class="action delete_tag_following" title="{{t "delete"}}"><a/>
+<a href="#" id="unfollow_{{name}}" rel="nofollow" class="action delete_tag_following pull-right" title="{{t "delete"}}">&times;<a/>
<a href="/tags/{{name}}" class="selectable">
#{{ name }}
</a>
diff --git a/app/controllers/admin/admin_controller.rb b/app/controllers/admin/admin_controller.rb
index 1030efd5f..8e22795ef 100644
--- a/app/controllers/admin/admin_controller.rb
+++ b/app/controllers/admin/admin_controller.rb
@@ -1,7 +1,8 @@
+module Admin
+ class AdminController < ApplicationController
-class Admin::AdminController < ApplicationController
-
- before_filter :authenticate_user!
- before_filter :redirect_unless_admin
+ before_filter :authenticate_user!
+ before_filter :redirect_unless_admin
+ end
end
diff --git a/app/controllers/admin/users_controller.rb b/app/controllers/admin/users_controller.rb
index 678d04fb8..2163c3630 100644
--- a/app/controllers/admin/users_controller.rb
+++ b/app/controllers/admin/users_controller.rb
@@ -1,16 +1,23 @@
+module Admin
+ class UsersController < AdminController
-class Admin::UsersController < Admin::AdminController
+ def close_account
+ u = User.find(params[:id])
+ u.close_account!
+ redirect_to user_search_path, notice: t("admins.user_search.account_closing_scheduled", name: u.username)
+ end
- def close_account
- u = User.find(close_account_params)
- u.close_account!
- redirect_to user_search_path, notice: t('admins.user_search.account_closing_scheduled', name: u.username)
- end
+ def lock_account
+ u = User.find(params[:id])
+ u.lock_access!
+ redirect_to user_search_path, notice: t("admins.user_search.account_locking_scheduled", name: u.username)
+ end
- private
+ def unlock_account
+ u = User.find(params[:id])
+ u.unlock_access!
+ redirect_to user_search_path, notice: t("admins.user_search.account_unlocking_scheduled", name: u.username)
+ end
- def close_account_params
- params.require(:id)
end
-
end
diff --git a/app/controllers/admins_controller.rb b/app/controllers/admins_controller.rb
index 7bf3f6830..cf85c0184 100644
--- a/app/controllers/admins_controller.rb
+++ b/app/controllers/admins_controller.rb
@@ -1,7 +1,5 @@
class AdminsController < Admin::AdminController
- use_bootstrap_for :user_search, :weekly_user_stats, :stats, :correlations
-
def user_search
if params[:admins_controller_user_search]
search_params = params.require(:admins_controller_user_search)
@@ -41,12 +39,12 @@ class AdminsController < Admin::AdminController
@created_users_by_week[week] << u.username
end
- @selected_week = params[:week] || @created_users_by_week.keys.first
+ @selected_week = params[:week] || @created_users_by_week.keys.last
@counter = @created_users_by_week[@selected_week].count
end
def stats
- @popular_tags = ActsAsTaggableOn::Tagging.joins(:tag).limit(50).count(:group => :tag, :order => 'count(taggings.id) DESC')
+ @popular_tags = ActsAsTaggableOn::Tagging.joins(:tag).limit(50).order('count(taggings.id) DESC').group(:tag).count
case params[:range]
when "week"
@@ -67,7 +65,7 @@ class AdminsController < Admin::AdminController
create_hash(model, :range => range)
end
- @posts_per_day = Post.count(:group => "DATE(created_at)", :conditions => ["created_at >= ?", Date.today - 21.days], :order => "DATE(created_at) ASC")
+ @posts_per_day = Post.where("created_at >= ?", Date.today - 21.days).group("DATE(created_at)").order("DATE(created_at) ASC").count
@most_posts_within = @posts_per_day.values.max.to_f
@user_count = User.count
@@ -101,12 +99,10 @@ DATA
end
- # TODO action needed after rails4 update
class UserSearch
- #include ActiveModel::Model # rails4
+ include ActiveModel::Model
include ActiveModel::Conversion
include ActiveModel::Validations
- include ActiveModel::MassAssignmentSecurity
attr_accessor :username, :email, :guid, :under13
@@ -117,26 +113,20 @@ DATA
yield(self) if block_given?
end
- def assign_attributes(values, options={})
- sanitize_for_mass_assignment(values, options[:as]).each do |k, v|
- send("#{k}=", v)
+ def assign_attributes(values)
+ values.each do |k, v|
+ public_send("#{k}=", v)
end
end
- # TODO remove this once ActiveModel is included
- def persisted?
- false
- end
-
def any_searchfield_present?
- if %w(username email guid under13).all? { |attr| self.send(attr).blank? }
+ if %w(username email guid under13).all? { |attr| public_send(attr).blank? }
errors.add :base, "no fields for search set"
end
end
def perform
- #return User.none unless valid? # rails4
- return [] unless valid?
+ return User.none unless valid?
users = User.arel_table
people = Person.arel_table
diff --git a/app/controllers/api/v1/tokens_controller.rb b/app/controllers/api/v1/tokens_controller.rb
new file mode 100644
index 000000000..f59c2eac5
--- /dev/null
+++ b/app/controllers/api/v1/tokens_controller.rb
@@ -0,0 +1,16 @@
+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/application_controller.rb b/app/controllers/application_controller.rb
index 320ce93f0..b56427ba6 100644
--- a/app/controllers/application_controller.rb
+++ b/app/controllers/application_controller.rb
@@ -6,13 +6,13 @@ class ApplicationController < ActionController::Base
has_mobile_fu
protect_from_forgery :except => :receive
- before_filter :ensure_http_referer_is_set
- before_filter :set_locale
- before_filter :set_diaspora_header
- before_filter :set_grammatical_gender
- before_filter :mobile_switch
- before_filter :gon_set_current_user
- before_filter :gon_set_preloads
+ before_action :ensure_http_referer_is_set
+ before_action :set_locale
+ before_action :set_diaspora_header
+ before_action :set_grammatical_gender
+ before_action :mobile_switch
+ before_action :gon_set_current_user
+ before_action :gon_set_preloads
inflection_method :grammatical_gender => :gender
@@ -24,10 +24,14 @@ class ApplicationController < ActionController::Base
:tags,
:open_publisher
- layout ->(c) { request.format == :mobile ? "application" : "centered_with_header_with_footer" }
+ layout proc { request.format == :mobile ? "application" : "with_header_with_footer" }
private
+ def default_serializer_options
+ {root: false}
+ end
+
def ensure_http_referer_is_set
request.env['HTTP_REFERER'] ||= '/'
end
@@ -36,7 +40,7 @@ class ApplicationController < ActionController::Base
def after_sign_out_path_for(resource_or_scope)
# mobile_fu's is_mobile_device? wasn't working here for some reason...
# it may have been just because of the test env.
- if request.env['HTTP_USER_AGENT'].match(/mobile/i)
+ if request.env['HTTP_USER_AGENT'].try(:match, /mobile/i)
root_path
else
new_user_session_path
@@ -80,8 +84,7 @@ class ApplicationController < ActionController::Base
if user_signed_in?
I18n.locale = current_user.language
else
- locale = request.preferred_language_from AVAILABLE_LANGUAGE_CODES
- locale ||= request.compatible_language_from AVAILABLE_LANGUAGE_CODES
+ locale = http_accept_language.language_region_compatible_from AVAILABLE_LANGUAGE_CODES
locale ||= DEFAULT_LANGUAGE
I18n.locale = locale
end
@@ -150,11 +153,4 @@ class ApplicationController < ActionController::Base
return unless gon.preloads.nil?
gon.preloads = {}
end
-
- def self.use_bootstrap_for *routes
- before_filter -> {
- @css_framework = :bootstrap
- gon.bootstrap = true
- }, only: routes.flatten
- end
end
diff --git a/app/controllers/aspect_memberships_controller.rb b/app/controllers/aspect_memberships_controller.rb
index 2fd459828..eddfa3935 100644
--- a/app/controllers/aspect_memberships_controller.rb
+++ b/app/controllers/aspect_memberships_controller.rb
@@ -4,7 +4,7 @@
#
class AspectMembershipsController < ApplicationController
- before_filter :authenticate_user!
+ before_action :authenticate_user!
respond_to :html, :json
@@ -31,13 +31,10 @@ class AspectMembershipsController < ApplicationController
flash.now[:error] = I18n.t 'aspect_memberships.destroy.failure'
end
- respond_with do |format|
+ respond_to do |format|
format.json do
if success
- render :json => {
- :person_id => contact.person_id,
- :aspect_ids => contact.aspects.map{|a| a.id}
- }
+ render :json => AspectMembershipPresenter.new(membership).base_hash
else
render :text => membership.errors.full_messages, :status => 403
end
@@ -57,7 +54,9 @@ class AspectMembershipsController < ApplicationController
flash.now[:notice] = I18n.t('aspects.add_to_aspect.success')
respond_with do |format|
format.json do
- render :json => AspectMembership.where(:contact_id => @contact.id, :aspect_id => @aspect.id).first.to_json
+ render :json => AspectMembershipPresenter.new(
+ AspectMembership.where(:contact_id => @contact.id, :aspect_id => @aspect.id).first)
+ .base_hash
end
format.all { redirect_to :back }
diff --git a/app/controllers/aspects_controller.rb b/app/controllers/aspects_controller.rb
index 9ba5cf702..7913862bb 100644
--- a/app/controllers/aspects_controller.rb
+++ b/app/controllers/aspects_controller.rb
@@ -3,7 +3,7 @@
# the COPYRIGHT file.
class AspectsController < ApplicationController
- before_filter :authenticate_user!
+ before_action :authenticate_user!
respond_to :html,
:js,
@@ -67,28 +67,6 @@ class AspectsController < ApplicationController
end
end
- def edit
- @aspect = current_user.aspects.where(:id => params[:id]).includes(:contacts => {:person => :profile}).first
-
- @contacts_in_aspect = @aspect.contacts.includes(:aspect_memberships, :person => :profile).all.sort! { |x, y| x.person.name <=> y.person.name }
- c = Contact.arel_table
- if @contacts_in_aspect.empty?
- @contacts_not_in_aspect = current_user.contacts.includes(:aspect_memberships, :person => :profile).all.sort! { |x, y| x.person.name <=> y.person.name }
- else
- @contacts_not_in_aspect = current_user.contacts.where(c[:id].not_in(@contacts_in_aspect.map(&:id))).includes(:aspect_memberships, :person => :profile).all.sort! { |x, y| x.person.name <=> y.person.name }
- end
-
- @contacts = @contacts_in_aspect + @contacts_not_in_aspect
-
- unless @aspect
- render :file => Rails.root.join('public', '404.html').to_s, :layout => false, :status => 404
- else
- @aspect_ids = [@aspect.id]
- @aspect_contacts_count = @aspect.contacts.size
- render :layout => false
- end
- end
-
def update
@aspect = current_user.aspects.where(:id => params[:id]).first
@@ -100,6 +78,14 @@ class AspectsController < ApplicationController
render :json => { :id => @aspect.id, :name => @aspect.name }
end
+ def toggle_chat_privilege
+ @aspect = current_user.aspects.where(:id => params[:aspect_id]).first
+
+ @aspect.chat_enabled = !@aspect.chat_enabled
+ @aspect.save
+ render :nothing => true
+ end
+
def toggle_contact_visibility
@aspect = current_user.aspects.where(:id => params[:aspect_id]).first
@@ -109,6 +95,7 @@ class AspectsController < ApplicationController
@aspect.contacts_visible = true
end
@aspect.save
+ render :nothing => true
end
private
@@ -123,6 +110,6 @@ class AspectsController < ApplicationController
end
def aspect_params
- params.require(:aspect).permit(:name, :contacts_visible, :order_id)
+ params.require(:aspect).permit(:name, :contacts_visible, :chat_enabled, :order_id)
end
end
diff --git a/app/controllers/blocks_controller.rb b/app/controllers/blocks_controller.rb
index f6f13ed7c..bcea0e561 100644
--- a/app/controllers/blocks_controller.rb
+++ b/app/controllers/blocks_controller.rb
@@ -1,5 +1,5 @@
class BlocksController < ApplicationController
- before_filter :authenticate_user!
+ before_action :authenticate_user!
respond_to :html, :json
diff --git a/app/controllers/comments_controller.rb b/app/controllers/comments_controller.rb
index 18de5d16a..46927dc96 100644
--- a/app/controllers/comments_controller.rb
+++ b/app/controllers/comments_controller.rb
@@ -4,7 +4,7 @@
class CommentsController < ApplicationController
include ApplicationHelper
- before_filter :authenticate_user!, :except => [:index]
+ before_action :authenticate_user!, :except => [:index]
respond_to :html,
:mobile,
@@ -47,7 +47,9 @@ class CommentsController < ApplicationController
end
def new
- render :layout => false
+ respond_to do |format|
+ format.mobile { render :layout => false }
+ end
end
def index
diff --git a/app/controllers/contacts_controller.rb b/app/controllers/contacts_controller.rb
index 68e3f6469..1b8c91d2b 100644
--- a/app/controllers/contacts_controller.rb
+++ b/app/controllers/contacts_controller.rb
@@ -3,18 +3,16 @@
# the COPYRIGHT file.
class ContactsController < ApplicationController
- before_filter :authenticate_user!
-
- use_bootstrap_for :index, :spotlight
+ before_action :authenticate_user!
def index
respond_to do |format|
- # Used for normal requests to contacts#index and subsequent infinite scroll calls
+ # Used for normal requests to contacts#index
format.html { set_up_contacts }
# Used by the mobile site
- format.mobile { set_up_contacts }
+ format.mobile { set_up_contacts_mobile }
# Used to populate mentions in the publisher
format.json {
@@ -25,11 +23,6 @@ class ContactsController < ApplicationController
end
end
- def sharing
- @contacts = current_user.contacts.sharing.includes(:aspect_memberships)
- render :layout => false
- end
-
def spotlight
@spotlight = true
@people = Person.community_spotlight
@@ -38,6 +31,33 @@ class ContactsController < ApplicationController
private
def set_up_contacts
+ type = params[:set].presence
+ type ||= "by_aspect" if params[:a_id].present?
+ type ||= "receiving"
+
+ @contacts = contacts_by_type(type)
+ @contacts_size = @contacts.length
+ gon.preloads[:contacts] = @contacts.map{ |c| ContactPresenter.new(c, current_user).full_hash_with_person }
+ end
+
+ def contacts_by_type(type)
+ case type
+ when "all"
+ current_user.contacts
+ when "only_sharing"
+ current_user.contacts.only_sharing
+ when "receiving"
+ current_user.contacts.receiving
+ when "by_aspect"
+ @aspect = current_user.aspects.find(params[:a_id])
+ gon.preloads[:aspect] = AspectPresenter.new(@aspect).as_json
+ current_user.contacts
+ else
+ raise ArgumentError, "unknown type #{type}"
+ end
+ end
+
+ def set_up_contacts_mobile
@contacts = case params[:set]
when "only_sharing"
current_user.contacts.only_sharing
diff --git a/app/controllers/conversation_visibilities_controller.rb b/app/controllers/conversation_visibilities_controller.rb
index 125fdf985..6d40eb3cb 100644
--- a/app/controllers/conversation_visibilities_controller.rb
+++ b/app/controllers/conversation_visibilities_controller.rb
@@ -4,14 +4,19 @@
#
class ConversationVisibilitiesController < ApplicationController
- before_filter :authenticate_user!
+ before_action :authenticate_user!
def destroy
@vis = ConversationVisibility.where(:person_id => current_user.person.id,
:conversation_id => params[:conversation_id]).first
if @vis
+ participants = @vis.conversation.participants.count
if @vis.destroy
- flash[:notice] = I18n.t('conversations.destroy.success')
+ if participants == 1
+ flash[:notice] = I18n.t('conversations.destroy.delete_success')
+ else
+ flash[:notice] = I18n.t('conversations.destroy.hide_success')
+ end
end
end
redirect_to conversations_path
diff --git a/app/controllers/conversations_controller.rb b/app/controllers/conversations_controller.rb
index 8322cfb3c..7edf04aee 100644
--- a/app/controllers/conversations_controller.rb
+++ b/app/controllers/conversations_controller.rb
@@ -1,9 +1,7 @@
class ConversationsController < ApplicationController
- before_filter :authenticate_user!
+ before_action :authenticate_user!
layout ->(c) { request.format == :mobile ? "application" : "with_header" }
- use_bootstrap_for :index, :show, :new
-
respond_to :html, :mobile, :json, :js
def index
@@ -21,12 +19,18 @@ class ConversationsController < ApplicationController
@first_unread_message_id = @conversation.try(:first_unread_message, current_user).try(:id)
+ if @conversation
+ @conversation.set_read(current_user)
+ end
+
@authors = {}
@conversations.each { |c| @authors[c.id] = c.last_author }
@ordered_participants = {}
@conversations.each { |c| @ordered_participants[c.id] = (c.messages.map{|m| m.author}.reverse + c.participants).uniq }
+ gon.contacts = contacts_data
+
respond_with do |format|
format.html
format.json { render :json => @conversations, :status => 200 }
@@ -34,9 +38,12 @@ class ConversationsController < ApplicationController
end
def create
+ contact_ids = params[:contact_ids]
+
# Can't split nil
- if params[:contact_ids]
- person_ids = current_user.contacts.where(id: params[:contact_ids].split(',')).pluck(:person_id)
+ 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)
end
opts = params.require(:conversation).permit(:subject)
@@ -63,42 +70,52 @@ class ConversationsController < ApplicationController
end
def show
- if @conversation = current_user.conversations.where(id: params[:id]).first
-
- @first_unread_message_id = @conversation.first_unread_message(current_user).try(:id)
- if @visibility = ConversationVisibility.where(:conversation_id => params[:id], :person_id => current_user.person.id).first
- @visibility.unread = 0
- @visibility.save
+ respond_to do |format|
+ format.html do
+ redirect_to conversations_path(:conversation_id => params[:id])
+ return
end
- respond_to do |format|
- format.html { redirect_to conversations_path(:conversation_id => @conversation.id) }
+ if @conversation = current_user.conversations.where(id: params[:id]).first
+ @first_unread_message_id = @conversation.first_unread_message(current_user).try(:id)
+ @conversation.set_read(current_user)
+
format.js
format.json { render :json => @conversation, :status => 200 }
+ else
+ redirect_to conversations_path
end
- else
- redirect_to conversations_path
end
end
def new
- all_contacts_and_ids = Contact.connection.select_rows(
- current_user.contacts.where(:sharing => true).joins(:person => :profile).
- select("contacts.id, profiles.first_name, profiles.last_name, people.diaspora_handle").to_sql
- ).map{|r| {:value => r[0], :name => ERB::Util.h(Person.name_from_attrs(r[1], r[2], r[3]).gsub(/(")/, "'"))} }
+ if !params[:modal] && !session[:mobile_view] && request.format.html?
+ redirect_to conversations_path
+ return
+ end
+ @contacts_json = contacts_data.to_json
@contact_ids = ""
- @contacts_json = all_contacts_and_ids.to_json
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?
- render :layout => true
- elsif
- render :layout => false
+ render :layout => true
+ else
+ render :layout => false
end
end
+
+ private
+
+ def contacts_data
+ current_user.contacts.sharing.joins(person: :profile)
+ .pluck(*%w(contacts.id profiles.first_name profiles.last_name people.diaspora_handle))
+ .map {|contact_id, *name_attrs|
+ {value: contact_id, name: ERB::Util.h(Person.name_from_attrs(*name_attrs)) }
+ }
+ end
end
diff --git a/app/controllers/help_controller.rb b/app/controllers/help_controller.rb
index 0e3e05f6e..3d65e1f0d 100644
--- a/app/controllers/help_controller.rb
+++ b/app/controllers/help_controller.rb
@@ -1,4 +1,5 @@
class HelpController < ApplicationController
- before_filter -> { @css_framework = :bootstrap }
- layout ->(c) { request.format == :mobile ? "application" : "with_header_with_footer" }
+ def faq
+ gon.chatEnabled = AppConfig.chat.enabled?
+ end
end
diff --git a/app/controllers/home_controller.rb b/app/controllers/home_controller.rb
index 31d67426f..0c455737b 100644
--- a/app/controllers/home_controller.rb
+++ b/app/controllers/home_controller.rb
@@ -4,12 +4,12 @@
class HomeController < ApplicationController
def show
- partial_dir = Rails.root.join('app', 'views', 'home')
+ partial_dir = Rails.root.join("app", "views", "home")
if user_signed_in?
redirect_to stream_path
elsif is_mobile_device?
- if partial_dir.join('_show.mobile.haml').exist? ||
- partial_dir.join('_show.mobile.erb').exist?
+ if partial_dir.join("_show.mobile.haml").exist? ||
+ partial_dir.join("_show.mobile.erb").exist?
render :show
else
redirect_to user_session_path
@@ -18,9 +18,8 @@ class HomeController < ApplicationController
partial_dir.join("_show.html.erb").exist?
render :show
else
- @css_framework = :bootstrap # Hack, port site to one framework
- render file: Rails.root.join("public", "default.html"),
- layout: 'application'
+ render :default,
+ layout: "application"
end
end
diff --git a/app/controllers/invitation_codes_controller.rb b/app/controllers/invitation_codes_controller.rb
index d267db12f..896514739 100644
--- a/app/controllers/invitation_codes_controller.rb
+++ b/app/controllers/invitation_codes_controller.rb
@@ -1,5 +1,5 @@
class InvitationCodesController < ApplicationController
- before_filter :ensure_valid_invite_code
+ before_action :ensure_valid_invite_code
rescue_from ActiveRecord::RecordNotFound do
redirect_to root_url, :notice => "That invite code is no longer valid"
diff --git a/app/controllers/invitations_controller.rb b/app/controllers/invitations_controller.rb
index ffcae4a0c..1801c39fe 100644
--- a/app/controllers/invitations_controller.rb
+++ b/app/controllers/invitations_controller.rb
@@ -4,7 +4,7 @@
class InvitationsController < ApplicationController
- before_filter :authenticate_user!, :only => [:new, :create]
+ before_action :authenticate_user!, :only => [:new, :create]
def new
@invite_code = current_user.invitation_code
@@ -14,7 +14,7 @@ class InvitationsController < ApplicationController
respond_to do |format|
format.html do
- render params[:blueprint] ? 'invitations/new_blueprint' : 'invitations/new', layout: false
+ render 'invitations/new', layout: false
end
end
end
diff --git a/app/controllers/likes_controller.rb b/app/controllers/likes_controller.rb
index 8ab65b6ca..adf92827e 100644
--- a/app/controllers/likes_controller.rb
+++ b/app/controllers/likes_controller.rb
@@ -4,14 +4,20 @@
class LikesController < ApplicationController
include ApplicationHelper
- before_filter :authenticate_user!
+ before_action :authenticate_user!
respond_to :html,
:mobile,
:json
def create
- @like = current_user.like!(target) if target rescue ActiveRecord::RecordInvalid
+ begin
+ @like = if target
+ current_user.like!(target)
+ end
+ rescue ActiveRecord::RecordNotFound, ActiveRecord::RecordInvalid => e
+ # do nothing
+ end
if @like
respond_to do |format|
diff --git a/app/controllers/messages_controller.rb b/app/controllers/messages_controller.rb
index 752ffd573..e2f435af4 100644
--- a/app/controllers/messages_controller.rb
+++ b/app/controllers/messages_controller.rb
@@ -3,7 +3,7 @@
# the COPYRIGHT file.
class MessagesController < ApplicationController
- before_filter :authenticate_user!
+ before_action :authenticate_user!
respond_to :html, :mobile
respond_to :json, :only => :show
diff --git a/app/controllers/notifications_controller.rb b/app/controllers/notifications_controller.rb
index 4354093bc..a9a873c2e 100644
--- a/app/controllers/notifications_controller.rb
+++ b/app/controllers/notifications_controller.rb
@@ -3,10 +3,7 @@
# the COPYRIGHT file.
class NotificationsController < ApplicationController
- before_filter :authenticate_user!
-
- layout ->(c) { request.format == :mobile ? "application" : "with_header_with_footer" }
- use_bootstrap_for :index
+ before_action :authenticate_user!
def update
note = Notification.where(:recipient_id => current_user.id, :id => params[:id]).first
@@ -33,20 +30,18 @@ class NotificationsController < ApplicationController
page = params[:page] || 1
per_page = params[:per_page] || 25
@notifications = WillPaginate::Collection.create(page, per_page, Notification.where(conditions).count ) do |pager|
- result = Notification.find(:all,
- :conditions => conditions,
- :order => 'created_at desc',
- :include => [:target, {:actors => :profile}],
- :limit => pager.per_page,
- :offset => pager.offset
- )
+ result = Notification.where(conditions)
+ .includes(:target, :actors => :profile)
+ .order('created_at desc')
+ .limit(pager.per_page)
+ .offset(pager.offset)
pager.replace(result)
end
- @notifications.each do |n|
- n.note_html = render_to_string( :partial => 'notify_popup_item', :locals => { :n => n } )
+ @notifications.each do |note|
+ note.note_html = render_to_string( :partial => 'notification', :locals => { :note => note } )
end
- @group_days = @notifications.group_by{|note| I18n.l(note.created_at, :format => I18n.t('date.formats.fullmonth_day')) }
+ @group_days = @notifications.group_by{|note| note.created_at.strftime('%Y-%m-%d')}
@unread_notification_count = current_user.unread_notifications.count
diff --git a/app/controllers/participations_controller.rb b/app/controllers/participations_controller.rb
new file mode 100644
index 000000000..95e8a2c03
--- /dev/null
+++ b/app/controllers/participations_controller.rb
@@ -0,0 +1,23 @@
+class ParticipationsController < ApplicationController
+ before_action :authenticate_user!
+
+ def create
+ post = current_user.find_visible_shareable_by_id(Post, params[:post_id])
+ if post
+ current_user.participate! post
+ render nothing: true, status: :created
+ else
+ render nothing: true, status: :forbidden
+ end
+ end
+
+ def destroy
+ participation = current_user.participations.find_by target_id: params[:post_id]
+ if participation
+ participation.destroy
+ render nothing: true, status: :ok
+ else
+ render nothing: true, status: :unprocessable_entity
+ end
+ end
+end
diff --git a/app/controllers/passwords_controller.rb b/app/controllers/passwords_controller.rb
deleted file mode 100644
index 657f89809..000000000
--- a/app/controllers/passwords_controller.rb
+++ /dev/null
@@ -1,4 +0,0 @@
-class PasswordsController < Devise::PasswordsController
- layout "application", :only => [:new]
- before_filter -> { @css_framework = :bootstrap }, only: [:new, :create, :edit]
-end
diff --git a/app/controllers/people_controller.rb b/app/controllers/people_controller.rb
index 1616c80f2..57c18fa7b 100644
--- a/app/controllers/people_controller.rb
+++ b/app/controllers/people_controller.rb
@@ -3,9 +3,8 @@
# the COPYRIGHT file.
class PeopleController < ApplicationController
- before_filter :authenticate_user!, :except => [:show, :last_post]
-
- use_bootstrap_for :index
+ before_action :authenticate_user!, except: [:show, :stream]
+ before_action :find_person, only: [:show, :stream, :hovercard]
respond_to :html, :except => [:tag_index]
respond_to :json, :only => [:index, :show]
@@ -74,47 +73,47 @@ class PeopleController < ApplicationController
# renders the persons user profile page
def show
- @person = Person.find_from_guid_or_username(params)
-
- authenticate_user! if remote_profile_with_no_user_session?
- raise Diaspora::AccountClosed if @person.closed_account?
-
mark_corresponding_notifications_read if user_signed_in?
- @post_type = :all
- @aspect = :profile
- @stream = Stream::Person.new(current_user, @person, :max_time => max_time)
- @profile = @person.profile
- @photos = photos_from(@person)
-
- unless params[:format] == "json" # hovercard
- if current_user
- @block = current_user.blocks.where(:person_id => @person.id).first
- @contact = current_user.contact_for(@person)
- if @contact && !params[:only_posts]
- @contacts_of_contact_count = @contact.contacts.count
- @contacts_of_contact = @contact.contacts.limit(8)
- else
- @contact ||= Contact.new
- end
- end
- end
+ @person_json = PersonPresenter.new(@person, current_user).full_hash_with_profile
respond_to do |format|
format.all do
- respond_with @person, :locals => {:post_type => :all}
+ if user_signed_in?
+ @contact = current_user.contact_for(@person)
+ end
+ gon.preloads[:person] = @person_json
+ gon.preloads[:photos] = {
+ count: photos_from(@person, :all).count(:all)
+ }
+ gon.preloads[:contacts] = {
+ count: Contact.contact_contacts_for(current_user, @person).count(:all),
+ }
+ respond_with @person, layout: "with_header"
+ end
+
+ format.mobile do
+ @post_type = :all
+ person_stream
+ respond_with @person
end
- format.json { render :json => @stream.stream_posts.map { |p| LastThreeCommentsDecorator.new(PostPresenter.new(p, current_user)) }}
+ format.json { render json: @person_json }
+ end
+ end
+
+ def stream
+ respond_to do |format|
+ format.all { redirect_to person_path(@person) }
+ format.json {
+ render json: person_stream.stream_posts.map { |p| LastThreeCommentsDecorator.new(PostPresenter.new(p, current_user)) }
+ }
end
end
# hovercards fetch some the persons public profile data via json and display
# it next to the avatar image in a nice box
def hovercard
- @person = Person.find_from_guid_or_username({:id => params[:person_id]})
- raise Diaspora::AccountClosed if @person.closed_account?
-
respond_to do |format|
format.all do
redirect_to :action => "show", :id => params[:person_id]
@@ -126,12 +125,6 @@ class PeopleController < ApplicationController
end
end
- def last_post
- @person = Person.find_from_guid_or_username(params)
- last_post = Post.visible_from_author(@person, current_user).order('posts.created_at DESC').first
- redirect_to post_path(last_post)
- end
-
def retrieve_remote
if params[:diaspora_handle]
Webfinger.in_background(params[:diaspora_handle], :single_aspect_form => true)
@@ -143,12 +136,20 @@ class PeopleController < ApplicationController
def contacts
@person = Person.find_by_guid(params[:person_id])
+
if @person
@contact = current_user.contact_for(@person)
- @aspect = :profile
- @contacts_of_contact = @contact.contacts.paginate(:page => params[:page], :per_page => (params[:limit] || 15))
- @contacts_of_contact_count = @contact.contacts.count
+ @contacts_of_contact = Contact.contact_contacts_for(current_user, @person)
+ gon.preloads[:person] = PersonPresenter.new(@person, current_user).full_hash_with_profile
+ gon.preloads[:photos] = {
+ count: photos_from(@person, :all).count(:all)
+ }
+ gon.preloads[:contacts] = {
+ count: @contacts_of_contact.count(:all),
+ }
+ @contacts_of_contact = @contacts_of_contact.paginate(:page => params[:page], :per_page => (params[:limit] || 15))
@hashes = hashes_for_people @contacts_of_contact, @aspects
+ respond_with @person, layout: "with_header"
else
flash[:error] = I18n.t 'people.show.does_not_exist'
redirect_to people_path
@@ -164,12 +165,33 @@ class PeopleController < ApplicationController
return render :text => I18n.t('people.person.thats_you') if @person == current_user.person
@contact = current_user.contact_for(@person) || Contact.new
- bootstrap = params[:bootstrap] || false
- render :partial => 'aspect_membership_dropdown', :locals => {:contact => @contact, :person => @person, :hang => 'left', :bootstrap => bootstrap}
+ @aspect = :profile if params[:create] # let aspect dropdown create new aspects
+ size = params[:size] || "small"
+
+ render :partial => 'aspect_membership_dropdown', :locals => {:contact => @contact, :person => @person, :hang => 'left', :size => size}
end
private
+ def find_person
+ username = params[:username]
+ @person = if diaspora_id?(username)
+ Person.where({
+ diaspora_handle: username.downcase
+ }).first
+ else
+ Person.find_from_guid_or_username({
+ id: params[:id] || params[:person_id],
+ username: username
+ })
+ end
+
+ # view this profile on the home pod, if you don't want to sign in...
+ authenticate_user! if remote_profile_with_no_user_session?
+ raise ActiveRecord::RecordNotFound if @person.nil?
+ raise Diaspora::AccountClosed if @person.closed_account?
+ end
+
def hashes_for_people(people, aspects)
ids = people.map{|p| p.id}
contacts = {}
@@ -196,14 +218,12 @@ class PeopleController < ApplicationController
@person.try(:remote?) && !user_signed_in?
end
- def photos_from(person)
- photos = if user_signed_in?
- current_user.photos_from(person)
+ def photos_from(person, limit)
+ @photos ||= if user_signed_in?
+ current_user.photos_from(person, limit: limit)
else
Photo.where(author_id: person.id, public: true)
- end
-
- photos.order('created_at desc')
+ end.order('created_at desc')
end
def mark_corresponding_notifications_read
@@ -211,4 +231,8 @@ class PeopleController < ApplicationController
n.set_read_state( true )
end
end
+
+ def person_stream
+ @stream ||= Stream::Person.new(current_user, @person, max_time: max_time)
+ end
end
diff --git a/app/controllers/photos_controller.rb b/app/controllers/photos_controller.rb
index 18203d8c9..7c543c140 100644
--- a/app/controllers/photos_controller.rb
+++ b/app/controllers/photos_controller.rb
@@ -3,8 +3,7 @@
# the COPYRIGHT file.
class PhotosController < ApplicationController
- before_filter :authenticate_user!, :except => :show
-
+ before_action :authenticate_user!, :except => :show
respond_to :html, :json
def show
@@ -23,21 +22,20 @@ class PhotosController < ApplicationController
if @person
@contact = current_user.contact_for(@person)
-
- if @contact
- @contacts_of_contact = @contact.contacts
- @contacts_of_contact_count = @contact.contacts.count
- else
- @contact = Contact.new
- end
-
- @posts = current_user.photos_from(@person, max_time: max_time)
-
+ @posts = current_user.photos_from(@person, max_time: max_time).order('created_at desc')
respond_to do |format|
- format.all { render 'people/show' }
+ format.all do
+ gon.preloads[:person] = PersonPresenter.new(@person, current_user).full_hash_with_profile
+ gon.preloads[:photos] = {
+ count: current_user.photos_from(@person, limit: :all).count(:all)
+ }
+ gon.preloads[:contacts] = {
+ count: Contact.contact_contacts_for(current_user, @person).count(:all),
+ }
+ render "people/show", layout: "with_header"
+ end
format.json{ render_for_api :backbone, :json => @posts, :root => :photos }
end
-
else
flash[:error] = I18n.t 'people.show.does_not_exist'
redirect_to people_path
diff --git a/app/controllers/posts_controller.rb b/app/controllers/posts_controller.rb
index 2f14fb638..ec31639b3 100644
--- a/app/controllers/posts_controller.rb
+++ b/app/controllers/posts_controller.rb
@@ -5,11 +5,9 @@
class PostsController < ApplicationController
include PostsHelper
- before_filter :authenticate_user!, :except => [:show, :iframe, :oembed, :interactions]
- before_filter :set_format_if_malformed_from_status_net, :only => :show
- before_filter :find_post, :only => [:show, :interactions]
-
- use_bootstrap_for :show
+ before_action :authenticate_user!, :except => [:show, :iframe, :oembed, :interactions]
+ before_action :set_format_if_malformed_from_status_net, :only => :show
+ before_action :find_post, :only => [:show, :interactions]
respond_to :html,
:mobile,
@@ -18,7 +16,7 @@ class PostsController < ApplicationController
rescue_from Diaspora::NonPublic do |exception|
respond_to do |format|
- format.all { @css_framework = :bootstrap; render :template=>'errors/not_public', :status=>404, :layout => "application"}
+ format.all { render :template=>'errors/not_public', :status=>404, :layout => "application"}
end
end
@@ -26,10 +24,13 @@ class PostsController < ApplicationController
mark_corresponding_notifications_read if user_signed_in?
respond_to do |format|
- format.html{ gon.post = PostPresenter.new(@post, current_user); render 'posts/show', layout: 'with_header_with_footer' }
- format.xml{ render :xml => @post.to_diaspora_xml }
- format.mobile{render 'posts/show' }
- format.json{ render :json => PostPresenter.new(@post, current_user) }
+ format.html {
+ gon.post = PostPresenter.new(@post, current_user)
+ render "posts/show"
+ }
+ format.xml { render xml: @post.to_diaspora_xml }
+ format.mobile { render "posts/show" }
+ format.json { render json: PostPresenter.new(@post, current_user) }
end
end
diff --git a/app/controllers/profiles_controller.rb b/app/controllers/profiles_controller.rb
index 4a78e21d4..2c2bdf2c2 100644
--- a/app/controllers/profiles_controller.rb
+++ b/app/controllers/profiles_controller.rb
@@ -3,10 +3,7 @@
# the COPYRIGHT file.
class ProfilesController < ApplicationController
- before_filter :authenticate_user!, :except => ['show']
- before_filter -> { @css_framework = :bootstrap }, only: [:show, :edit]
-
- layout ->(c) { request.format == :mobile ? "application" : "with_header_with_footer" }, only: [:show, :edit]
+ before_action :authenticate_user!, :except => ['show']
respond_to :html, :except => [:show]
respond_to :js, :only => :update
@@ -28,7 +25,7 @@ class ProfilesController < ApplicationController
@tags = @profile.tags
@tags_array = []
- @tags.each do |obj|
+ @tags.each do |obj|
@tags_array << { :name => ("#"+obj.name),
:value => ("#"+obj.name)}
end
@@ -37,7 +34,7 @@ class ProfilesController < ApplicationController
def update
# upload and set new profile photo
@profile_attrs = profile_params
-
+
munge_tag_string
#checkbox tags wtf
@@ -57,7 +54,6 @@ class ProfilesController < ApplicationController
respond_to do |format|
format.js { render :nothing => true, :status => 200 }
format.any {
- flash[:notice] = I18n.t 'profiles.update.updated'
if current_user.getting_started?
redirect_to getting_started_path
else
diff --git a/app/controllers/publics_controller.rb b/app/controllers/publics_controller.rb
index c0724190e..3609bdefa 100644
--- a/app/controllers/publics_controller.rb
+++ b/app/controllers/publics_controller.rb
@@ -5,10 +5,10 @@
class PublicsController < ApplicationController
include Diaspora::Parser
- skip_before_filter :set_header_data
- skip_before_filter :set_grammatical_gender
- before_filter :check_for_xml, :only => [:receive, :receive_public]
- before_filter :authenticate_user!, :only => [:index]
+ skip_before_action :set_header_data
+ skip_before_action :set_grammatical_gender
+ before_action :check_for_xml, :only => [:receive, :receive_public]
+ before_action :authenticate_user!, :only => [:index]
respond_to :html
respond_to :xml, :only => :post
diff --git a/app/controllers/registrations_controller.rb b/app/controllers/registrations_controller.rb
index c1e24e91e..66dd0614d 100644
--- a/app/controllers/registrations_controller.rb
+++ b/app/controllers/registrations_controller.rb
@@ -3,10 +3,9 @@
# the COPYRIGHT file.
class RegistrationsController < Devise::RegistrationsController
- before_filter :check_registrations_open_or_valid_invite!, :check_valid_invite!
+ before_action :check_registrations_open_or_valid_invite!, :check_valid_invite!
layout ->(c) { request.format == :mobile ? "application" : "with_header" }, :only => [:new]
- before_filter -> { @css_framework = :bootstrap }, only: [:new, :create]
def create
@user = User.build(user_params)
diff --git a/app/controllers/report_controller.rb b/app/controllers/report_controller.rb
index 3d9c4a5a4..5d8d7c338 100644
--- a/app/controllers/report_controller.rb
+++ b/app/controllers/report_controller.rb
@@ -6,10 +6,8 @@ class ReportController < ApplicationController
before_filter :authenticate_user!
before_filter :redirect_unless_admin, :except => [:create]
- use_bootstrap_for :index
-
def index
- @reports = Report.where(reviewed: false).all
+ @reports = Report.where(reviewed: false)
end
def update
diff --git a/app/controllers/reshares_controller.rb b/app/controllers/reshares_controller.rb
index 5748386e1..1e49a5aa0 100644
--- a/app/controllers/reshares_controller.rb
+++ b/app/controllers/reshares_controller.rb
@@ -1,9 +1,15 @@
class ResharesController < ApplicationController
- before_filter :authenticate_user!
+ before_action :authenticate_user!
respond_to :json
def create
- @reshare = current_user.build_post(:reshare, :root_guid => params[:root_guid])
+ post = Post.where(:guid => params[:root_guid]).first
+ if post.is_a? Reshare
+ @reshare = current_user.build_post(:reshare, :root_guid => post.absolute_root.guid)
+ else
+ @reshare = current_user.build_post(:reshare, :root_guid => params[:root_guid])
+ end
+
if @reshare.save
current_user.add_to_streams(@reshare, current_user.aspects)
current_user.dispatch_post(@reshare, :url => post_url(@reshare), :additional_subscribers => @reshare.root_author)
diff --git a/app/controllers/search_controller.rb b/app/controllers/search_controller.rb
index cc510215f..f3a320615 100644
--- a/app/controllers/search_controller.rb
+++ b/app/controllers/search_controller.rb
@@ -1,5 +1,5 @@
class SearchController < ApplicationController
- before_filter :authenticate_user!
+ before_action :authenticate_user!
def search
if search_query.starts_with?('#')
@@ -20,7 +20,7 @@ class SearchController < ApplicationController
private
def search_query
- @search_query ||= params[:q] || params[:term] || ''
+ @search_query ||= (params[:q] || params[:term] || '').strip
end
end
diff --git a/app/controllers/services_controller.rb b/app/controllers/services_controller.rb
index 69fc83a0e..ccc82c28d 100644
--- a/app/controllers/services_controller.rb
+++ b/app/controllers/services_controller.rb
@@ -1,16 +1,13 @@
# Copyright (c) 2010-2011, Diaspora Inc. This file is
-# licensed under the Affero General Public License version 3 or later. See
+# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
class ServicesController < ApplicationController
# We need to take a raw POST from an omniauth provider with no authenticity token.
# See https://github.com/intridea/omniauth/issues/203
# See also http://www.communityguides.eu/articles/16
- skip_before_filter :verify_authenticity_token, :only => :create
- before_filter :authenticate_user!
- before_filter :abort_if_already_authorized, :abort_if_read_only_access, :only => :create
- before_filter -> { @css_framework = :bootstrap }, only: [:index]
-
- layout ->(c) { request.format == :mobile ? "application" : "with_header_with_footer" }, only: [:index]
+ skip_before_action :verify_authenticity_token, :only => :create
+ before_action :authenticate_user!
+ before_action :abort_if_already_authorized, :abort_if_read_only_access, :only => :create
respond_to :html
respond_to :json, :only => :inviter
@@ -19,13 +16,13 @@ class ServicesController < ApplicationController
@services = current_user.services
end
- def create
+ def create
service = Service.initialize_from_omniauth( omniauth_hash )
-
- if current_user.services << service
- current_user.update_profile_with_omniauth( service.info )
- fetch_photo(service) if no_profile_image?
+ if current_user.services << service
+ no_profile_image_before_update = no_profile_image?
+ current_user.update_profile_with_omniauth(service.info)
+ fetch_photo(service) if no_profile_image_before_update
flash[:notice] = I18n.t 'services.create.success'
else
@@ -66,9 +63,9 @@ class ServicesController < ApplicationController
end
def redirect_to_origin
- if origin
+ if origin
redirect_to origin
- else
+ else
render(text: "<script>window.close()</script>")
end
end
@@ -85,7 +82,7 @@ class ServicesController < ApplicationController
request.env['omniauth.origin']
end
- def omniauth_hash
+ def omniauth_hash
request.env['omniauth.auth']
end
diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb
index 5f11f48bf..05016d2a7 100644
--- a/app/controllers/sessions_controller.rb
+++ b/app/controllers/sessions_controller.rb
@@ -3,8 +3,10 @@
# the COPYRIGHT file.
class SessionsController < Devise::SessionsController
+ after_filter :reset_authentication_token, :only => [:create]
+ before_filter :reset_authentication_token, :only => [:destroy]
- layout ->(c) { request.format == :mobile ? "application" : "with_header_with_footer" }, :only => [:new]
- use_bootstrap_for :new
-
+ def reset_authentication_token
+ current_user.reset_authentication_token!
+ end
end
diff --git a/app/controllers/share_visibilities_controller.rb b/app/controllers/share_visibilities_controller.rb
index 005b0288a..bbc7bba16 100644
--- a/app/controllers/share_visibilities_controller.rb
+++ b/app/controllers/share_visibilities_controller.rb
@@ -4,7 +4,7 @@
#
class ShareVisibilitiesController < ApplicationController
- before_filter :authenticate_user!
+ before_action :authenticate_user!
def update
#note :id references a postvisibility
diff --git a/app/controllers/statistics_controller.rb b/app/controllers/statistics_controller.rb
index 61c999877..567a81745 100644
--- a/app/controllers/statistics_controller.rb
+++ b/app/controllers/statistics_controller.rb
@@ -3,13 +3,13 @@
# the COPYRIGHT file.
class StatisticsController < ApplicationController
+ respond_to :html, :json
- respond_to :json
-
def statistics
+ @statistics = StatisticsPresenter.new
respond_to do |format|
- format.json { render :json => StatisticsPresenter.new }
+ format.json { render json: @statistics }
+ format.all
end
end
-
end
diff --git a/app/controllers/status_messages_controller.rb b/app/controllers/status_messages_controller.rb
index 06790768b..f830fbf9b 100644
--- a/app/controllers/status_messages_controller.rb
+++ b/app/controllers/status_messages_controller.rb
@@ -3,11 +3,9 @@
# the COPYRIGHT file.
class StatusMessagesController < ApplicationController
- before_filter :authenticate_user!
+ before_action :authenticate_user!
- before_filter :remove_getting_started, :only => [:create]
-
- use_bootstrap_for :bookmarklet
+ before_action :remove_getting_started, :only => [:create]
respond_to :html,
:mobile,
@@ -95,7 +93,8 @@ class StatusMessagesController < ApplicationController
respond_to do |format|
format.html { redirect_to :back }
format.mobile { redirect_to stream_path }
- format.json { render :nothing => true, :status => 403 }
+ #there are some errors, so we report the first one to the user
+ format.json { render :text => @status_message.errors.messages.values.first.to_sentence, :status => 403 }
end
end
end
diff --git a/app/controllers/streams_controller.rb b/app/controllers/streams_controller.rb
index 6ce788a17..52edbe5ec 100644
--- a/app/controllers/streams_controller.rb
+++ b/app/controllers/streams_controller.rb
@@ -3,9 +3,11 @@
# the COPYRIGHT file.
class StreamsController < ApplicationController
- before_filter :authenticate_user!
- before_filter :save_selected_aspects, :only => :aspects
- before_filter :redirect_unless_admin, :only => :public
+ before_action :authenticate_user!
+ before_action :save_selected_aspects, :only => :aspects
+ before_action :redirect_unless_admin, :only => :public
+
+ layout proc { request.format == :mobile ? "application" : "with_header" }
respond_to :html,
:mobile,
@@ -50,6 +52,7 @@ class StreamsController < ApplicationController
private
def stream_responder(stream_klass=nil)
+
if stream_klass.present?
@stream ||= stream_klass.new(current_user, :max_time => max_time)
end
diff --git a/app/controllers/tag_followings_controller.rb b/app/controllers/tag_followings_controller.rb
index c447d9e92..34c35184f 100644
--- a/app/controllers/tag_followings_controller.rb
+++ b/app/controllers/tag_followings_controller.rb
@@ -4,7 +4,7 @@
#
class TagFollowingsController < ApplicationController
- before_filter :authenticate_user!
+ before_action :authenticate_user!
respond_to :json
@@ -16,7 +16,7 @@ class TagFollowingsController < ApplicationController
if name_normalized.nil? || name_normalized.empty?
render :nothing => true, :status => 403
else
- @tag = ActsAsTaggableOn::Tag.find_or_create_by_name(name_normalized)
+ @tag = ActsAsTaggableOn::Tag.find_or_create_by(name: name_normalized)
@tag_following = current_user.tag_followings.new(:tag_id => @tag.id)
if @tag_following.save
@@ -31,7 +31,7 @@ class TagFollowingsController < ApplicationController
# DELETE /tag_followings/1.xml
def destroy
tag_following = current_user.tag_followings.find_by_tag_id( params['id'] )
-
+
if tag_following && tag_following.destroy
respond_to do |format|
format.any(:js, :json) { render :nothing => true, :status => 204 }
diff --git a/app/controllers/tags_controller.rb b/app/controllers/tags_controller.rb
index 86b095975..e8d25dd73 100644
--- a/app/controllers/tags_controller.rb
+++ b/app/controllers/tags_controller.rb
@@ -3,11 +3,13 @@
# the COPYRIGHT file.
class TagsController < ApplicationController
- skip_before_filter :set_grammatical_gender
- before_filter :ensure_page, :only => :show
+ skip_before_action :set_grammatical_gender
+ before_action :ensure_page, :only => :show
helper_method :tag_followed?
+ layout proc { request.format == :mobile ? "application" : "with_header" }, only: :show
+
respond_to :html, :only => [:show]
respond_to :json, :only => [:index, :show]
@@ -57,9 +59,9 @@ class TagsController < ApplicationController
end
def prep_tags_for_javascript
- @tags.map! do |tag|
+ @tags = @tags.map {|tag|
{ :name => ("#" + tag.name) }
- end
+ }
@tags << { :name => ('#' + params[:q]) }
@tags.uniq!
diff --git a/app/controllers/terms_controller.rb b/app/controllers/terms_controller.rb
index 552e26b74..bf2e5da28 100644
--- a/app/controllers/terms_controller.rb
+++ b/app/controllers/terms_controller.rb
@@ -7,7 +7,6 @@ class TermsController < ApplicationController
respond_to :html, :mobile
def index
- @css_framework = :bootstrap
partial_dir = Rails.root.join('app', 'views', 'terms')
if partial_dir.join('terms.haml').exist? ||
partial_dir.join('terms.erb').exist?
@@ -16,5 +15,5 @@ class TermsController < ApplicationController
render :default
end
end
-
+
end
diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb
index ef0ec6d14..00932312a 100644
--- a/app/controllers/users_controller.rb
+++ b/app/controllers/users_controller.rb
@@ -3,22 +3,13 @@
# the COPYRIGHT file.
class UsersController < ApplicationController
- before_filter :authenticate_user!, :except => [:new, :create, :public, :user_photo]
- before_filter -> { @css_framework = :bootstrap }, only: [:privacy_settings, :edit]
-
- layout ->(c) { request.format == :mobile ? "application" : "with_header_with_footer" }, only: [:privacy_settings, :edit]
-
- use_bootstrap_for :getting_started
-
+ before_action :authenticate_user!, :except => [:new, :create, :public, :user_photo]
respond_to :html
def edit
@aspect = :user_edit
- @user = current_user
- @email_prefs = Hash.new(true)
- @user.user_preferences.each do |pref|
- @email_prefs[pref.email_type] = false
- end
+ @user = current_user
+ set_email_preferences
end
def privacy_settings
@@ -30,16 +21,13 @@ class UsersController < ApplicationController
@user = current_user
if u = user_params
- u.delete(:password) if u[:password].blank?
- u.delete(:password_confirmation) if u[:password].blank? and u[:password_confirmation].blank?
- u.delete(:language) if u[:language].blank?
# change email notifications
if u[:email_preferences]
@user.update_user_preferences(u[:email_preferences])
flash[:notice] = I18n.t 'users.update.email_notifications_changed'
# change password
- elsif u[:current_password] && u[:password] && u[:password_confirmation]
+ elsif params[:change_password]
if @user.update_with_password(u)
password_changed = true
flash[:notice] = I18n.t 'users.update.password_changed'
@@ -52,6 +40,12 @@ class UsersController < ApplicationController
else
flash[:notice] = I18n.t 'users.update.settings_not_updated'
end
+ elsif u[:strip_exif]
+ if @user.update_attributes(u)
+ flash[:notice] = I18n.t 'users.update.settings_updated'
+ else
+ flash[:notice] = I18n.t 'users.update.settings_not_updated'
+ end
elsif u[:language]
if @user.update_attributes(u)
I18n.locale = @user.language
@@ -77,10 +71,17 @@ class UsersController < ApplicationController
end
end
end
+ set_email_preferences
respond_to do |format|
format.js { render :nothing => true, :status => 204 }
- format.all { redirect_to password_changed ? new_user_session_path : edit_user_path }
+ format.all do
+ if password_changed
+ redirect_to new_user_session_path
+ else
+ render :edit
+ end
+ end
end
end
@@ -122,10 +123,7 @@ class UsersController < ApplicationController
@person = @user.person
@profile = @user.profile
- respond_to do |format|
- format.mobile { render "users/getting_started" }
- format.all { render "users/getting_started", layout: "with_header_with_footer" }
- end
+ render "users/getting_started"
end
def getting_started_completed
@@ -135,14 +133,24 @@ class UsersController < ApplicationController
redirect_to stream_path
end
- def export
- exporter = Diaspora::Exporter.new(Diaspora::Exporters::XML)
- send_data exporter.execute(current_user), :filename => "#{current_user.username}_diaspora_data.xml", :type => :xml
+ def export_profile
+ current_user.queue_export
+ flash[:notice] = I18n.t('users.edit.export_in_progress')
+ redirect_to edit_user_path
+ end
+
+ def download_profile
+ redirect_to current_user.export.url
end
def export_photos
- tar_path = PhotoMover::move_photos(current_user)
- send_data( File.open(tar_path).read, :filename => "#{current_user.id}.tar" )
+ current_user.queue_export_photos
+ flash[:notice] = I18n.t('users.edit.export_photos_in_progress')
+ redirect_to edit_user_path
+ end
+
+ def download_photos
+ redirect_to current_user.exported_photos_file.url
end
def user_photo
@@ -177,6 +185,7 @@ class UsersController < ApplicationController
:invitation_service,
:invitation_identifier,
:show_community_spotlight_in_stream,
+ :strip_exif,
:auto_follow_back,
:auto_follow_back_aspect_id,
:remember_me,
@@ -193,4 +202,12 @@ class UsersController < ApplicationController
]
)
end
+
+ def set_email_preferences
+ @email_prefs = Hash.new(true)
+
+ @user.user_preferences.each do |pref|
+ @email_prefs[pref.email_type] = false
+ end
+ end
end
diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb
index 354c09fed..e0952ff4c 100644
--- a/app/helpers/application_helper.rb
+++ b/app/helpers/application_helper.rb
@@ -4,11 +4,11 @@
module ApplicationHelper
def pod_name
- AppConfig.settings.pod_name.present? ? AppConfig.settings.pod_name : "diaspora*"
+ AppConfig.settings.pod_name
end
def pod_version
- AppConfig.version.number.present? ? AppConfig.version.number : ""
+ AppConfig.version.number
end
def changelog_url
@@ -17,20 +17,16 @@ module ApplicationHelper
url
end
- def timeago(time, options={})
- timeago_tag(time, options.merge(:class => 'timeago', :title => time.iso8601, :force => true)) if time
- end
-
- def bookmarklet
- raw_bookmarklet
+ def source_url
+ AppConfig.settings.source_url.presence || "#{root_path.chomp('/')}/source.tar.gz"
end
- def raw_bookmarklet( height = 400, width = 620)
- "javascript:(function(){f='#{AppConfig.pod_uri.to_s}bookmarklet?url='+encodeURIComponent(window.location.href)+'&title='+encodeURIComponent(document.title)+'&notes='+encodeURIComponent(''+(window.getSelection?window.getSelection():document.getSelection?document.getSelection():document.selection.createRange().text))+'&v=1&';a=function(){if(!window.open(f+'noui=1&jump=doclose','diasporav1','location=yes,links=no,scrollbars=no,toolbar=no,width=#{width},height=#{height}'))location.href=f+'jump=yes'};if(/Firefox/.test(navigator.userAgent)){setTimeout(a,0)}else{a()}})()"
+ def timeago(time, options={})
+ timeago_tag(time, options.merge(:class => 'timeago', :title => time.iso8601, :force => true)) if time
end
- def magic_bookmarklet_link
- bookmarklet
+ def bookmarklet_url( height = 400, width = 620)
+ "javascript:(function(){f='#{AppConfig.pod_uri.to_s}bookmarklet?url='+encodeURIComponent(window.location.href)+'&title='+encodeURIComponent(document.title)+'&notes='+encodeURIComponent(''+(window.getSelection?window.getSelection():document.getSelection?document.getSelection():document.selection.createRange().text))+'&v=1&';a=function(){if(!window.open(f+'noui=1&jump=doclose','diasporav1','location=yes,links=no,scrollbars=yes,toolbar=no,width=#{width},height=#{height}'))location.href=f+'jump=yes'};if(/Firefox/.test(navigator.userAgent)){setTimeout(a,0)}else{a()}})()"
end
def contacts_link
@@ -46,7 +42,7 @@ module ApplicationHelper
end
def popover_with_close_html(without_close_html)
- without_close_html + link_to(content_tag(:div, nil, :class => 'icons-deletelabel'), "#", :class => 'close')
+ without_close_html + link_to('&times;'.html_safe, "#", :class => 'close')
end
# Require jQuery from CDN if possible, falling back to vendored copy, and require
diff --git a/app/helpers/aspect_global_helper.rb b/app/helpers/aspect_global_helper.rb
index c525ebf9b..d51fa0528 100644
--- a/app/helpers/aspect_global_helper.rb
+++ b/app/helpers/aspect_global_helper.rb
@@ -3,7 +3,7 @@
# the COPYRIGHT file.
module AspectGlobalHelper
- def aspect_membership_dropdown(contact, person, hang, aspect=nil, force_bootstrap=false)
+ def aspect_membership_dropdown(contact, person, hang, aspect=nil, size="small")
aspect_membership_ids = {}
selected_aspects = all_aspects.select{|aspect| contact.in_aspect?(aspect)}
@@ -12,28 +12,32 @@ module AspectGlobalHelper
aspect_membership_ids[a.id] = record.id
end
- if bootstrap? || force_bootstrap
- render "aspect_memberships/aspect_membership_dropdown",
- :selected_aspects => selected_aspects,
- :aspect_membership_ids => aspect_membership_ids,
- :person => person,
- :hang => hang,
- :dropdown_class => "aspect_membership"
- else
- render "aspect_memberships/aspect_membership_dropdown_blueprint",
- :selected_aspects => selected_aspects,
- :aspect_membership_ids => aspect_membership_ids,
- :person => person,
- :hang => hang,
- :dropdown_class => "aspect_membership"
- end
+ button_class = selected_aspects.size>0 ? "green" : "btn-default"
+ button_class << case size
+ when "small"
+ " btn-small"
+ when "normal"
+ ""
+ when "large"
+ " btn-large"
+ else
+ raise ArgumentError, "unknown size #{size}"
+ end
+
+ render "aspect_memberships/aspect_membership_dropdown",
+ :selected_aspects => selected_aspects,
+ :aspect_membership_ids => aspect_membership_ids,
+ :person => person,
+ :hang => hang,
+ :dropdown_class => "aspect_membership",
+ :button_class => button_class
end
def aspect_dropdown_list_item(aspect, am_id=nil)
klass = am_id.present? ? "selected" : ""
str = <<LISTITEM
-<li data-aspect_id="#{aspect.id}" data-membership_id="#{am_id}" class="#{klass} aspect_selector">
+<li data-aspect_id="#{aspect.id}" data-membership_id="#{am_id}" class="#{klass} aspect_selector" tabindex="0">
#{aspect.name}
</li>
LISTITEM
@@ -51,4 +55,20 @@ LISTITEM
end
options
end
+
+ def publisher_aspects_for(stream=nil)
+ if stream
+ aspects = stream.aspects
+ aspect = stream.aspect
+ aspect_ids = stream.aspect_ids
+ elsif current_user
+ aspects = current_user.aspects
+ aspect = aspects.first
+ aspect_ids = current_user.aspect_ids
+ else
+ return {}
+ end
+
+ { selected_aspects: aspects, aspect: aspect, aspect_ids: aspect_ids }
+ end
end
diff --git a/app/helpers/aspects_helper.rb b/app/helpers/aspects_helper.rb
deleted file mode 100644
index 0c781e986..000000000
--- a/app/helpers/aspects_helper.rb
+++ /dev/null
@@ -1,58 +0,0 @@
-# Copyright (c) 2010-2011, Diaspora Inc. This file is
-# licensed under the Affero General Public License version 3 or later. See
-# the COPYRIGHT file.
-
-module AspectsHelper
- def add_to_aspect_button(aspect_id, person_id)
- link_to content_tag(:div, nil, :class => 'icons-monotone_plus_add_round'),
- { :controller => 'aspect_memberships',
- :action => 'create',
- :format => :json,
- :aspect_id => aspect_id,
- :person_id => person_id
- },
- :method => 'post',
- :class => 'add btn',
- 'data-aspect_id' => aspect_id,
- 'data-person_id' => person_id
- end
-
- def remove_from_aspect_button(membership_id, aspect_id, person_id)
- link_to content_tag(:div, nil, :class => 'icons-monotone_check_yes'),
- { :controller => "aspect_memberships",
- :action => 'destroy',
- :id => membership_id
- },
- :method => 'delete',
- :class => 'added btn',
- 'data-membership_id' => membership_id,
- 'data-aspect_id' => aspect_id,
- 'data-person_id' => person_id
- end
-
- def aspect_membership_button(aspect, contact, person)
- return if person && person.closed_account?
-
- membership = contact.aspect_memberships.where(:aspect_id => aspect.id).first
- if contact.nil? || membership.nil?
- add_to_aspect_button(aspect.id, person.id)
- else
- remove_from_aspect_button(membership.id, aspect.id, person.id)
- end
- end
-
- def aspect_visibility_link(aspect)
- if aspect.contacts_visible?
- icon = 'icons-padlock-open'
- title = t('aspects.edit.aspect_list_is_visible');
- else
- icon = 'icons-padlock-closed'
- title = t('aspects.edit.aspect_list_is_not_visible');
- end
-
- link_to aspect_toggle_contact_visibility_path(@aspect), class: 'contact_visibility_link btn', title: title, method: :put, remote: true do
- concat t('aspects.edit.set_visibility')
- concat content_tag(:span, nil, class: "contact_visibility_padlock " + icon)
- end
- end
-end
diff --git a/app/helpers/contacts_helper.rb b/app/helpers/contacts_helper.rb
index 53edbc6e0..6409d2571 100644
--- a/app/helpers/contacts_helper.rb
+++ b/app/helpers/contacts_helper.rb
@@ -1,35 +1,16 @@
module ContactsHelper
def contact_aspect_dropdown(contact)
- membership = contact.aspect_memberships.where(:aspect_id => @aspect.id).first unless @aspect.nil?
-
- if membership
- link_to(content_tag(:div, nil, :class => 'icons-monotone_close_exit_delete'),
- { :controller => "aspect_memberships",
- :action => 'destroy',
- :id => membership.id
- },
- :title => t('contacts.index.remove_person_from_aspect', :person_name => contact.person_first_name, :aspect_name => @aspect.name),
- :class => 'contact_remove-from-aspect',
- :method => 'delete',
- 'data-membership_id' => membership.id
- )
-
- else
- render :partial => 'people/relationship_action',
- :locals => { :person => contact.person,
- :contact => contact,
- :current_user => current_user }
- end
+ render :partial => 'people/relationship_action',
+ :locals => { :person => contact.person,
+ :contact => contact,
+ :current_user => current_user }
end
def start_a_conversation_link(aspect, contacts_size)
- suggested_limit = 16
- conv_opts = { class: "btn conversation_button", rel: "facebox"}
- conv_opts[:title] = t('.many_people_are_you_sure', suggested_limit: suggested_limit) if contacts_size > suggested_limit
-
- link_to new_conversation_path(aspect_id: aspect.id, name: aspect.name), conv_opts do
- concat t('.start_a_conversation')
- concat content_tag(:span, nil, class: "icons-mail")
+ conv_opts = { class: "conversation_button contacts_button"}
+
+ content_tag :span, conv_opts do
+ content_tag(:i, nil, :class => 'entypo mail contacts-header-icon', :title => t('contacts.index.start_a_conversation'), 'data-toggle' => 'modal', 'data-target' => '#conversationModal')
end
end
end
diff --git a/app/helpers/conversations_helper.rb b/app/helpers/conversations_helper.rb
new file mode 100644
index 000000000..3c00a2b9d
--- /dev/null
+++ b/app/helpers/conversations_helper.rb
@@ -0,0 +1,9 @@
+module ConversationsHelper
+ def conversation_class(conversation, unread_count, selected_conversation_id)
+ conv_class = unread_count > 0 ? "unread " : ""
+ if selected_conversation_id && conversation.id == selected_conversation_id
+ conv_class << "selected"
+ end
+ conv_class
+ end
+end
diff --git a/app/helpers/error_messages_helper.rb b/app/helpers/error_messages_helper.rb
index 2d76c5269..46480b1d3 100644
--- a/app/helpers/error_messages_helper.rb
+++ b/app/helpers/error_messages_helper.rb
@@ -6,11 +6,10 @@ module ErrorMessagesHelper
# Render error messages for the given objects. The :message and :header_message options are allowed.
def error_messages_for(*objects)
options = objects.extract_options!
- options[:header_message] ||= I18n.t('error_messages.helper.invalid_fields')
options[:message] ||= I18n.t('error_messages.helper.correct_the_following_errors_and_try_again')
messages = objects.compact.map { |o| o.errors.full_messages }.flatten
unless messages.empty?
- content_tag(:div, :class => "error_messages") do
+ content_tag(:div, class: "text-error") do
list_items = messages.map { |msg| content_tag(:li, msg) }
content_tag(:h2, options[:header_message]) + content_tag(:p, options[:message]) + content_tag(:ul, list_items.join.html_safe)
end
diff --git a/app/helpers/jsxc_helper.rb b/app/helpers/jsxc_helper.rb
new file mode 100644
index 000000000..168faf0ed
--- /dev/null
+++ b/app/helpers/jsxc_helper.rb
@@ -0,0 +1,13 @@
+module JsxcHelper
+ def get_bosh_endpoint
+ port = AppConfig.chat.server.bosh.port
+ bind = AppConfig.chat.server.bosh.bind
+ host = AppConfig.pod_uri.host
+ scheme = AppConfig.pod_uri.scheme
+
+ unless AppConfig.chat.server.bosh.proxy?
+ return "http://#{host}:#{port}#{bind}"
+ end
+ return "#{scheme}://#{host}#{bind}"
+ end
+end
diff --git a/app/helpers/layout_helper.rb b/app/helpers/layout_helper.rb
index 346046511..f5740f54f 100644
--- a/app/helpers/layout_helper.rb
+++ b/app/helpers/layout_helper.rb
@@ -19,15 +19,6 @@ module LayoutHelper
pod_name
end
- def set_asset_host
- path = AppConfig.environment.assets.host.to_s + '/assets/'
- content_tag(:script) do
- <<-JS.html_safe
- if(window.app) app.baseImageUrl("#{path}")
- JS
- end
- end
-
def load_javascript_locales(section = 'javascripts')
content_tag(:script) do
<<-JS.html_safe
@@ -56,12 +47,8 @@ module LayoutHelper
end
end
- def include_base_css_framework(use_bootstrap=false)
- if use_bootstrap || @aspect == :getting_started
- stylesheet_link_tag('bootstrap-complete')
- else
- stylesheet_link_tag 'blueprint', :media => 'screen'
- end
+ def include_base_css_framework
+ stylesheet_link_tag('bootstrap-complete')
end
def old_browser_js_support
@@ -86,8 +73,4 @@ module LayoutHelper
end
end.join(' ').html_safe
end
-
- def bootstrap?
- @css_framework == :bootstrap
- end
end
diff --git a/app/helpers/mobile_helper.rb b/app/helpers/mobile_helper.rb
index fb9364c63..470038b4a 100644
--- a/app/helpers/mobile_helper.rb
+++ b/app/helpers/mobile_helper.rb
@@ -42,7 +42,7 @@ module MobileHelper
def additional_photos
if photo.status_message_guid?
- @additional_photos ||= photo.status_message.photos
+ @additional_photos ||= photo.status_message.photos.order(:created_at)
end
end
diff --git a/app/helpers/notifications_helper.rb b/app/helpers/notifications_helper.rb
index 6db4e46e4..af9578f62 100644
--- a/app/helpers/notifications_helper.rb
+++ b/app/helpers/notifications_helper.rb
@@ -55,12 +55,27 @@ module NotificationsHelper
object_link(note, notification_people_link(note))
end
- def the_day(i18n)
- i18n[0].match(/\d/) ? i18n[0].gsub('.', '') : i18n[1].gsub('.', '')
+ def the_day(date)
+ date.split('-')[2].to_i
end
- def the_month(i18n)
- i18n[0].match(/\d/) ? i18n[1] : i18n[0]
+ def the_month(date)
+ I18n.l(Date.strptime(date, '%Y-%m-%d'), :format => '%B')
+ end
+
+ def the_year(date)
+ date.split('-')[0].to_i
+ end
+
+ def locale_date(date)
+ I18n.l(Date.strptime(date, '%Y-%m-%d'), :format => I18n.t('date.formats.fullmonth_day'))
end
-end
+ def display_year?(year, date)
+ unless year
+ Date.current.year != the_year(date)
+ else
+ year != the_year(date)
+ end
+ end
+end
diff --git a/app/helpers/notifier_helper.rb b/app/helpers/notifier_helper.rb
index 44de54f1c..ee62c5a44 100644
--- a/app/helpers/notifier_helper.rb
+++ b/app/helpers/notifier_helper.rb
@@ -2,19 +2,24 @@ module NotifierHelper
# @param post [Post] The post object.
# @param opts [Hash] Optional hash. Accepts :length parameters.
- # @return [String] The truncated and formatted post.
+ # @return [String] The formatted post.
def post_message(post, opts={})
- if post.respond_to? :message
- post.message.plain_text_without_markdown truncate: opts.fetch(:length, 200)
+ if !post.public?
+ I18n.translate 'notifier.a_private_message'
+ elsif post.respond_to? :message
+ post.message.plain_text_without_markdown
else
I18n.translate 'notifier.a_post_you_shared'
end
end
# @param comment [Comment] The comment to process.
- # @param opts [Hash] Optional hash. Accepts :length parameters.
- # @return [String] The truncated and formatted comment.
+ # @return [String] The formatted comment.
def comment_message(comment, opts={})
- comment.message.plain_text_without_markdown truncate: opts.fetch(:length, 600)
+ if comment.post.public?
+ comment.message.plain_text_without_markdown
+ else
+ I18n.translate 'notifier.a_limited_post_comment'
+ end
end
end
diff --git a/app/helpers/open_graph_helper.rb b/app/helpers/open_graph_helper.rb
index 4ee10a7a0..8fa72e378 100644
--- a/app/helpers/open_graph_helper.rb
+++ b/app/helpers/open_graph_helper.rb
@@ -1,43 +1,78 @@
module OpenGraphHelper
- def og_title(post)
- meta_tag_with_property('og:title', post_page_title(post, :length => 140))
+ def og_title(title)
+ meta_tag_with_property('og:title', title)
end
def og_type(post)
meta_tag_with_property('og:type', 'article')
end
- def og_url(post)
- meta_tag_with_property('og:url', post_url(post))
+ def og_url(url)
+ meta_tag_with_property('og:url', url)
end
- def og_image(post)
- tags = post.photos.map{|x| meta_tag_with_property('og:image', x.url(:thumb_large))}
+ def og_image(post=nil)
+ tags = []
+ tags = post.photos.map{|x| meta_tag_with_property('og:image', x.url(:thumb_large))} if post
tags << meta_tag_with_property('og:image', default_image_url) if tags.empty?
tags.join(' ')
end
- def og_description(post)
- meta_tag_with_property('og:description', post_page_title(post, :length => 1000))
+ def og_description(description)
+ meta_tag_with_property('og:description', description)
end
- def og_type
- meta_tag_with_property('og:type', og_namespace('frame'))
+ def og_type(type='website')
+ meta_tag_with_property('og:type', type)
end
- def og_namespace(object)
- namespace = AppConfig.services.facebook.open_graph_namespace.present? ? AppConfig.services.facebook.open_graph_namespace : 'joindiaspora'
- "#{namespace}:frame"
+ def og_namespace
+ AppConfig.services.facebook.open_graph_namespace
end
- def og_page_specific_tags(post)
- [og_title(post), og_type,
- og_url(post), og_image(post),
- og_description(post)].join(' ').html_safe
+ def og_site_name
+ meta_tag_with_property('og:site_name', AppConfig.settings.pod_name)
+ end
+
+ def og_common_tags
+ [og_site_name]
+ end
+
+ def og_general_tags
+ [
+ *og_common_tags,
+ og_type,
+ og_title('diaspora* social network'),
+ og_image,
+ og_url(AppConfig.environment.url),
+ og_description('diaspora* is the online social world where you are in control.')
+ ].join("\n").html_safe
+ end
+
+ def og_page_post_tags(post)
+ tags = og_common_tags
+
+
+ if post.message
+ tags.concat [
+ *tags,
+ og_type("#{og_namespace}:frame"),
+ og_title(post_page_title(post, :length => 140)),
+ og_url(post_url(post)),
+ og_image(post),
+ og_description(post.message.plain_text_without_markdown truncate: 1000)
+ ]
+ end
+
+ tags.join("\n").html_safe
+ end
+
+ def og_prefix
+ "og: http://ogp.me/ns# #{og_namespace}: https://diasporafoundation.org/ns/joindiaspora#"
end
def meta_tag_with_property(name, content)
- content_tag(:meta, '', :property => name, :content => content)
+ tag(:meta, :property => name, :content => content)
end
def og_html(cache)
@@ -45,7 +80,7 @@ module OpenGraphHelper
" <div>" +
" <img src=\"#{cache.image}\" />" +
" <strong>#{cache.title}</strong>" +
- " <p>#{cache.description}</p>" +
+ " <p>#{truncate(cache.description, length: 250, separator: ' ')}</p>" +
" </div>" +
"</a>"
end
@@ -53,7 +88,7 @@ module OpenGraphHelper
def link_to_oembed_image(cache, prefix = 'thumbnail_')
link_to(oembed_image_tag(cache, prefix), cache.url, :target => '_blank')
end
-
+
def oembed_image_tag(cache, prefix)
image_tag(cache.data["#{prefix}url"], cache.options_hash(prefix))
end
diff --git a/app/helpers/people_helper.rb b/app/helpers/people_helper.rb
index fd426f9f6..63d39af21 100644
--- a/app/helpers/people_helper.rb
+++ b/app/helpers/people_helper.rb
@@ -14,7 +14,7 @@ module PeopleHelper
end
end
end
-
+
def birthday_format(bday)
if bday.year == 1000
I18n.l bday, :format => I18n.t('date.formats.birthday')
@@ -77,30 +77,4 @@ module PeopleHelper
return Rails.application.routes.url_helpers.person_path(person, opts)
end
end
-
- def sharing_message(person, contact)
- if contact.sharing?
- content_tag(:div, :class => 'sharing_message_container', :title => I18n.t('people.helper.is_sharing', :name => person.name)) do
- content_tag(:div, nil, :class => 'icons-check_yes_ok', :id => 'sharing_message')
- end
- else
- content_tag(:div, :class => 'sharing_message_container', :title => I18n.t('people.helper.is_not_sharing', :name => person.name)) do
- content_tag(:div, nil, :class => 'icons-circle', :id => 'sharing_message')
- end
- end
- end
-
- def profile_buttons_class(contact, block)
- if block.present?
- 'blocked'
- elsif contact.mutual?
- 'mutual'
- elsif contact.sharing?
- 'only_sharing'
- elsif contact.receiving?
- 'receiving'
- else
- 'not_sharing'
- end
- end
end
diff --git a/app/helpers/profile_helper.rb b/app/helpers/profile_helper.rb
new file mode 100644
index 000000000..20351d620
--- /dev/null
+++ b/app/helpers/profile_helper.rb
@@ -0,0 +1,15 @@
+# Copyright (c) 2010-2011, Diaspora Inc. This file is
+# licensed under the Affero General Public License version 3 or later. See
+# the COPYRIGHT file.
+
+module ProfileHelper
+ def upper_limit_date_of_birth
+ minimum_year = AppConfig.settings.terms.minimum_age.get
+ minimum_year = minimum_year ? minimum_year.to_i : 13
+ minimum_year.years.ago.year
+ end
+
+ def lower_limit_date_of_birth
+ 125.years.ago.year
+ end
+end
diff --git a/app/helpers/report_helper.rb b/app/helpers/report_helper.rb
index 10509ccfd..2170e3665 100644
--- a/app/helpers/report_helper.rb
+++ b/app/helpers/report_helper.rb
@@ -9,7 +9,7 @@ module ReportHelper
elsif type == 'comment' && !(comment = Comment.find_by_id(id)).nil?
# comment_message is not html_safe. To prevent
# cross-site-scripting we have to escape html
- raw t('report.comment_label', data: h(comment_message(comment)))
+ raw t('report.comment_label', data: link_to(h(comment_message(comment)), post_path(comment.post.id, anchor: comment.guid)))
else
raw t('report.not_found')
end
diff --git a/app/helpers/services_helper.rb b/app/helpers/services_helper.rb
index e164a6957..9fbe7bd29 100644
--- a/app/helpers/services_helper.rb
+++ b/app/helpers/services_helper.rb
@@ -1,6 +1,11 @@
module ServicesHelper
- @@contact_proxy = Contact.new(:aspects => [])
def contact_proxy(friend)
- friend.contact || @@contact_proxy.dup.tap{|c| c.person = friend.person}
+ friend.contact || contact_proxy_template.dup.tap {|c| c.person = friend.person }
+ end
+
+ private
+
+ def contact_proxy_template
+ @@contact_proxy ||= Contact.new(:aspects => [])
end
end
diff --git a/app/helpers/statistics_helper.rb b/app/helpers/statistics_helper.rb
new file mode 100644
index 000000000..1cbe5aff3
--- /dev/null
+++ b/app/helpers/statistics_helper.rb
@@ -0,0 +1,37 @@
+# Copyright (c) 2010-2011, Diaspora Inc. This file is
+# licensed under the Affero General Public License version 3 or later. See
+# the COPYRIGHT file.
+
+module StatisticsHelper
+ def registrations_status statistics
+ if statistics.open_registrations?
+ I18n.t('statistics.open')
+ else
+ I18n.t('statistics.closed')
+ end
+ end
+
+ def registrations_status_class statistics
+ if statistics.open_registrations?
+ "serv-enabled"
+ else
+ "serv-disabled"
+ end
+ end
+
+ def service_status service, available_services
+ if available_services.include? service.to_s
+ I18n.t('statistics.enabled')
+ else
+ I18n.t('statistics.disabled')
+ end
+ end
+
+ def service_class service, available_services
+ if available_services.include? service.to_s
+ "serv-enabled"
+ else
+ "serv-disabled"
+ end
+ end
+end \ No newline at end of file
diff --git a/app/helpers/tags_helper.rb b/app/helpers/tags_helper.rb
index a01acd361..28f46f719 100644
--- a/app/helpers/tags_helper.rb
+++ b/app/helpers/tags_helper.rb
@@ -1,17 +1,16 @@
module TagsHelper
def looking_for_tag_link
- return if search_query.include?('@') || normalized_tag_name.blank?
+ return if search_query.include?('@') || normalize_tag_name(search_query).blank?
content_tag('small') do
- t('people.index.looking_for', :tag_link => tag_link).html_safe
+ t('people.index.looking_for', tag_link: tag_link(search_query)).html_safe
end
end
- def normalized_tag_name
- ActsAsTaggableOn::Tag.normalize(search_query)
+ def normalize_tag_name(tag)
+ ActsAsTaggableOn::Tag.normalize(tag.to_s)
end
- def tag_link
- tag = normalized_tag_name
- link_to("##{tag}", tag_path(:name => tag))
+ def tag_link(tag)
+ link_to("##{tag}", tag_path(name: normalize_tag_name(tag)))
end
end
diff --git a/app/mailers/export_mailer.rb b/app/mailers/export_mailer.rb
new file mode 100644
index 000000000..a0bc8b5e5
--- /dev/null
+++ b/app/mailers/export_mailer.rb
@@ -0,0 +1,39 @@
+class ExportMailer < ActionMailer::Base
+ default from: AppConfig.mail.sender_address
+
+ def export_complete_for(user)
+ @user = user
+
+ mail(to: @user.email, subject: I18n.t('notifier.export_email.subject', name: @user.name)) do |format|
+ format.html { render 'users/export_email' }
+ format.text { render 'users/export_email' }
+ end
+ end
+
+ def export_failure_for(user)
+ @user = user
+
+ mail(to: @user.email, subject: I18n.t('notifier.export_failure_email.subject', name: @user.name)) do |format|
+ format.html { render 'users/export_failure_email' }
+ format.text { render 'users/export_failure_email' }
+ end
+ end
+
+ def export_photos_complete_for(user)
+ @user = user
+
+ mail(to: @user.email, subject: I18n.t('notifier.export_photos_email.subject', name: @user.name)) do |format|
+ format.html { render 'users/export_photos_email' }
+ format.text { render 'users/export_photos_email' }
+ end
+ end
+
+ def export_photos_failure_for(user)
+ @user = user
+
+ mail(to: @user.email, subject: I18n.t('notifier.export_photos_failure_email.subject', name: @user.name)) do |format|
+ format.html { render 'users/export_photos_failure_email' }
+ format.text { render 'users/export_photos_failure_email' }
+ end
+ end
+end
diff --git a/app/mailers/maintenance.rb b/app/mailers/maintenance.rb
new file mode 100644
index 000000000..052fd7c78
--- /dev/null
+++ b/app/mailers/maintenance.rb
@@ -0,0 +1,15 @@
+class Maintenance < ActionMailer::Base
+ default :from => AppConfig.mail.sender_address
+
+ def account_removal_warning(user)
+ @user = user
+ @login_url = new_user_session_url
+ @pod_url = AppConfig.environment.url
+ @after_days = AppConfig.settings.maintenance.remove_old_users.after_days.to_s
+ @remove_after = @user.remove_after
+ mail(:to => @user.email, :subject => I18n.t('notifier.remove_old_user.subject')) do |format|
+ format.text
+ format.html
+ end
+ end
+end
diff --git a/app/mailers/notification_mailers/base.rb b/app/mailers/notification_mailers/base.rb
index ec2950bfb..086228b06 100644
--- a/app/mailers/notification_mailers/base.rb
+++ b/app/mailers/notification_mailers/base.rb
@@ -23,7 +23,7 @@ module NotificationMailers
end
def name_and_address(name, email)
- address = Mail::Address.new email
+ address = Mail::Address.new Addressable::IDNA.to_ascii(email)
address.display_name = name
address.format
end
diff --git a/app/mailers/notifier.rb b/app/mailers/notifier.rb
index 00dd5e109..e92795a18 100644
--- a/app/mailers/notifier.rb
+++ b/app/mailers/notifier.rb
@@ -43,11 +43,11 @@ class Notifier < ActionMailer::Base
@locale = locale
@invitation_code = invitation_code
- mail_opts = {:to => email, :from => AppConfig.mail.sender_address,
+ I18n.with_locale(locale) do
+ mail_opts = {:to => email, :from => AppConfig.mail.sender_address,
:subject => I18n.t('notifier.invited_you', :name => @inviter.name),
:host => AppConfig.pod_uri.host}
- I18n.with_locale(locale) do
mail(mail_opts) do |format|
format.text { render :layout => nil }
format.html { render :layout => nil }
diff --git a/app/mailers/report_mailer.rb b/app/mailers/report_mailer.rb
index 57359cc68..b3479cc74 100644
--- a/app/mailers/report_mailer.rb
+++ b/app/mailers/report_mailer.rb
@@ -7,13 +7,14 @@ class ReportMailer < ActionMailer::Base
:type => I18n.t('notifier.report_email.type.' + type),
:id => id
}
+
Role.admins.each do |role|
person = Person.find(role.person_id)
if person.local?
user = User.find_by_id(person.owner_id)
unless user.user_preferences.exists?(:email_type => :someone_reported)
resource[:email] = user.email
- format(resource).deliver
+ format(resource)
end
end
end
diff --git a/app/models/account_deletion.rb b/app/models/account_deletion.rb
index 7b1886269..a8918d587 100644
--- a/app/models/account_deletion.rb
+++ b/app/models/account_deletion.rb
@@ -5,6 +5,7 @@
class AccountDeletion < ActiveRecord::Base
include Diaspora::Federated::Base
+ scope :uncompleted, -> { where('completed_at is null') }
belongs_to :person
after_commit :queue_delete_account, :on => :create
diff --git a/app/models/comment.rb b/app/models/comment.rb
index 5fe754c8b..aa86daedb 100644
--- a/app/models/comment.rb
+++ b/app/models/comment.rb
@@ -30,8 +30,8 @@ class Comment < ActiveRecord::Base
validates :text, :presence => true, :length => {:maximum => 65535}
validates :parent, :presence => true #should be in relayable (pending on fixing Message)
- scope :including_author, includes(:author => :profile)
- scope :for_a_stream, including_author.merge(order('created_at ASC'))
+ scope :including_author, -> { includes(:author => :profile) }
+ scope :for_a_stream, -> { including_author.merge(order('created_at ASC')) }
before_save do
self.text.strip! unless self.text.nil?
@@ -60,7 +60,7 @@ class Comment < ActiveRecord::Base
def notification_type(user, person)
if self.post.author == user.person
return Notifications::CommentOnPost
- elsif self.post.comments.where(:author_id => user.person.id) != [] && self.author_id != user.person.id
+ elsif user.participations.where(:target_id => self.post).exists? && self.author_id != user.person.id
return Notifications::AlsoCommented
else
return false
diff --git a/app/models/contact.rb b/app/models/contact.rb
index 1a428a898..861ec0771 100644
--- a/app/models/contact.rb
+++ b/app/models/contact.rb
@@ -7,7 +7,7 @@ class Contact < ActiveRecord::Base
belongs_to :person
validates :person, :presence => true
-
+
delegate :name, :diaspora_handle, :guid, :first_name,
to: :person, prefix: true
@@ -26,26 +26,20 @@ class Contact < ActiveRecord::Base
before_destroy :destroy_notifications
- scope :all_contacts_of_person, lambda {|x| where(:person_id => x.id)}
+ scope :all_contacts_of_person, ->(x) { where(:person_id => x.id) }
# contact.sharing is true when contact.person is sharing with contact.user
- scope :sharing, lambda {
- where(:sharing => true)
- }
+ scope :sharing, -> { where(:sharing => true) }
# contact.receiving is true when contact.user is sharing with contact.person
- scope :receiving, lambda {
- where(:receiving => true)
- }
+ scope :receiving, -> { where(:receiving => true) }
- scope :for_a_stream, lambda {
+ scope :for_a_stream, -> {
includes(:aspects, :person => :profile).
order('profiles.last_name ASC')
}
- scope :only_sharing, lambda {
- sharing.where(:receiving => false)
- }
+ scope :only_sharing, -> { sharing.where(:receiving => false) }
def destroy_notifications
Notification.where(:target_type => "Person",
@@ -95,6 +89,17 @@ class Contact < ActiveRecord::Base
end
end
+ def self.contact_contacts_for(user, person)
+ return none unless user
+
+ if person == user.person
+ user.contact_people
+ else
+ contact = user.contact_for(person)
+ contact.try(:contacts) || none
+ end
+ end
+
private
def not_contact_with_closed_account
if person_id && person.closed_account?
diff --git a/app/models/conversation.rb b/app/models/conversation.rb
index fee57d81f..dbf1fb774 100644
--- a/app/models/conversation.rb
+++ b/app/models/conversation.rb
@@ -10,16 +10,27 @@ class Conversation < ActiveRecord::Base
has_many :conversation_visibilities, :dependent => :destroy
has_many :participants, :class_name => 'Person', :through => :conversation_visibilities, :source => :person
- has_many :messages, :order => 'created_at ASC'
+ has_many :messages, -> { order('created_at ASC') }
belongs_to :author, :class_name => 'Person'
validate :max_participants
+ validate :local_recipients
def max_participants
errors.add(:max_participants, "too many participants") if participants.count > 20
end
+ def local_recipients
+ recipients.each do |recipient|
+ if recipient.local?
+ if recipient.owner.contacts.where(:person_id => self.author.id).count == 0
+ errors.add(:all_recipients, "recipient not allowed")
+ end
+ end
+ end
+ end
+
accepts_nested_attributes_for :messages
def recipients
@@ -36,7 +47,14 @@ class Conversation < ActiveRecord::Base
def first_unread_message(user)
if visibility = self.conversation_visibilities.where(:person_id => user.person.id).where('unread > 0').first
- self.messages.all[-visibility.unread]
+ self.messages.to_a[-visibility.unread]
+ end
+ end
+
+ def set_read(user)
+ if visibility = self.conversation_visibilities.where(:person_id => user.person.id).first
+ visibility.unread = 0
+ visibility.save
end
end
@@ -68,10 +86,10 @@ class Conversation < ActiveRecord::Base
end
def receive(user, person)
- cnv = Conversation.find_or_create_by_guid(self.attributes)
+ cnv = Conversation.create_with(self.attributes).find_or_create_by!(guid: guid)
self.participants.each do |participant|
- ConversationVisibility.find_or_create_by_conversation_id_and_person_id(cnv.id, participant.id)
+ ConversationVisibility.find_or_create_by(conversation_id: cnv.id, person_id: participant.id)
end
self.messages.each do |msg|
diff --git a/app/models/conversation_visibility.rb b/app/models/conversation_visibility.rb
index da398c724..9c0afb2bd 100644
--- a/app/models/conversation_visibility.rb
+++ b/app/models/conversation_visibility.rb
@@ -3,4 +3,14 @@ class ConversationVisibility < ActiveRecord::Base
belongs_to :conversation
belongs_to :person
+ after_destroy :check_orphan_conversation
+
+ private
+
+ def check_orphan_conversation
+ conversation = Conversation.find_by_id(self.conversation.id)
+ if conversation
+ conversation.destroy if conversation.participants.count == 0
+ end
+ end
end
diff --git a/app/models/o_embed_cache.rb b/app/models/o_embed_cache.rb
index 9aee6d00b..17e6f073f 100644
--- a/app/models/o_embed_cache.rb
+++ b/app/models/o_embed_cache.rb
@@ -10,10 +10,10 @@ class OEmbedCache < ActiveRecord::Base
t.add :data
end
- def self.find_or_create_by_url(url)
- cache = OEmbedCache.find_or_initialize_by_url(url)
+ def self.find_or_create_by(opts)
+ cache = OEmbedCache.find_or_initialize_by(opts)
return cache if cache.persisted?
- cache.fetch_and_save_oembed_data!
+ cache.fetch_and_save_oembed_data! # make after create callback and drop this method ?
cache
end
diff --git a/app/models/open_graph_cache.rb b/app/models/open_graph_cache.rb
index 8ec435719..7bf381f01 100644
--- a/app/models/open_graph_cache.rb
+++ b/app/models/open_graph_cache.rb
@@ -1,10 +1,4 @@
class OpenGraphCache < ActiveRecord::Base
- attr_accessible :title
- attr_accessible :ob_type
- attr_accessible :image
- attr_accessible :url
- attr_accessible :description
-
validates :title, :presence => true
validates :ob_type, :presence => true
validates :image, :presence => true
@@ -21,23 +15,32 @@ class OpenGraphCache < ActiveRecord::Base
t.add :url
end
- def self.find_or_create_by_url(url)
- cache = OpenGraphCache.find_or_initialize_by_url(url)
+ def image
+ if AppConfig.privacy.camo.proxy_opengraph_thumbnails?
+ Diaspora::Camo.image_url(self[:image])
+ else
+ self[:image]
+ end
+ end
+
+ def self.find_or_create_by(opts)
+ cache = OpenGraphCache.find_or_initialize_by(opts)
cache.fetch_and_save_opengraph_data! unless cache.persisted?
- cache if cache.persisted?
+ cache if cache.persisted? # Make this an after create callback and drop this method ?
end
def fetch_and_save_opengraph_data!
- response = OpenGraph.new(self.url)
+ object = OpenGraphReader.fetch!(self.url)
- return if response.blank? || response.type.blank?
+ return unless object
- self.title = response.title
- self.ob_type = response.type
- self.image = response.images[0]
- self.url = response.url
- self.description = response.description
+ self.title = object.og.title.truncate(255)
+ self.ob_type = object.og.type
+ self.image = object.og.image.url
+ self.url = object.og.url
+ self.description = object.og.description
self.save
+ rescue OpenGraphReader::NoOpenGraphDataError, OpenGraphReader::InvalidObjectError
end
end
diff --git a/app/models/person.rb b/app/models/person.rb
index 765a8539a..7dd83df26 100644
--- a/app/models/person.rb
+++ b/app/models/person.rb
@@ -63,32 +63,40 @@ class Person < ActiveRecord::Base
validates :serialized_public_key, :presence => true
validates :diaspora_handle, :uniqueness => true
- scope :searchable, joins(:profile).where(:profiles => {:searchable => true})
- scope :remote, where('people.owner_id IS NULL')
- scope :local, where('people.owner_id IS NOT NULL')
- scope :for_json, select('DISTINCT people.id, people.guid, people.diaspora_handle').includes(:profile)
+ scope :searchable, -> { joins(:profile).where(:profiles => {:searchable => true}) }
+ scope :remote, -> { where('people.owner_id IS NULL') }
+ scope :local, -> { where('people.owner_id IS NOT NULL') }
+ scope :for_json, -> {
+ select('DISTINCT people.id, people.guid, people.diaspora_handle')
+ .includes(:profile)
+ }
# @note user is passed in here defensively
- scope :all_from_aspects, lambda { |aspect_ids, user|
+ scope :all_from_aspects, ->(aspect_ids, user) {
joins(:contacts => :aspect_memberships).
where(:contacts => {:user_id => user.id}).
where(:aspect_memberships => {:aspect_id => aspect_ids})
}
- scope :unique_from_aspects, lambda{ |aspect_ids, user|
+ scope :unique_from_aspects, ->(aspect_ids, user) {
all_from_aspects(aspect_ids, user).select('DISTINCT people.*')
}
#not defensive
- scope :in_aspects, lambda { |aspect_ids|
+ scope :in_aspects, ->(aspect_ids) {
joins(:contacts => :aspect_memberships).
where(:aspect_memberships => {:aspect_id => aspect_ids})
}
- scope :profile_tagged_with, lambda{|tag_name| joins(:profile => :tags).where(:tags => {:name => tag_name}).where('profiles.searchable IS TRUE') }
+ scope :profile_tagged_with, ->(tag_name) {
+ joins(:profile => :tags)
+ .where(:tags => {:name => tag_name})
+ .where('profiles.searchable IS TRUE')
+ }
- scope :who_have_reshared_a_users_posts, lambda{|user|
- joins(:posts).where(:posts => {:root_guid => StatusMessage.guids_for_author(user.person), :type => 'Reshare'} )
+ scope :who_have_reshared_a_users_posts, ->(user) {
+ joins(:posts)
+ .where(:posts => {:root_guid => StatusMessage.guids_for_author(user.person), :type => 'Reshare'} )
}
def self.community_spotlight
@@ -193,12 +201,12 @@ class Person < ActiveRecord::Base
def url
begin
- uri = URI.parse(@attributes['url'])
+ uri = URI.parse(self[:url])
url = "#{uri.scheme}://#{uri.host}"
url += ":#{uri.port}" unless ["80", "443"].include?(uri.port.to_s)
url += "/"
rescue => e
- url = @attributes['url']
+ url = self[:url]
end
url
end
diff --git a/app/models/photo.rb b/app/models/photo.rb
index 60494cc06..b652093e7 100644
--- a/app/models/photo.rb
+++ b/app/models/photo.rb
@@ -48,8 +48,13 @@ class Photo < ActiveRecord::Base
after_commit :on => :create do
queue_processing_job if self.author.local?
+
end
+ scope :on_statuses, ->(post_guids) {
+ where(:status_message_guid => post_guids)
+ }
+
def clear_empty_status_message
if self.status_message && self.status_message.text_and_photos_blank?
self.status_message.destroy
@@ -76,10 +81,13 @@ class Photo < ActiveRecord::Base
photo.random_string = SecureRandom.hex(10)
+ if photo.author.local?
+ photo.unprocessed_image.strip_exif = photo.author.owner.strip_exif
+ end
+
if params[:user_file]
image_file = params.delete(:user_file)
photo.unprocessed_image.store! image_file
-
elsif params[:image_url]
photo.remote_unprocessed_image_url = params[:image_url]
photo.unprocessed_image.store!
@@ -109,7 +117,12 @@ class Photo < ActiveRecord::Base
def url(name = nil)
if remote_photo_path
name = name.to_s + '_' if name
- remote_photo_path + name.to_s + remote_photo_name
+ image_url = remote_photo_path + name.to_s + remote_photo_name
+ if AppConfig.privacy.camo.proxy_remote_pod_images?
+ Diaspora::Camo.image_url(image_url)
+ else
+ image_url
+ end
elsif processed?
processed_image.url(name)
else
@@ -132,8 +145,4 @@ class Photo < ActiveRecord::Base
def mutable?
true
end
-
- scope :on_statuses, lambda { |post_guids|
- where(:status_message_guid => post_guids)
- }
end
diff --git a/app/models/pod.rb b/app/models/pod.rb
index fb5f35477..dcd23b310 100644
--- a/app/models/pod.rb
+++ b/app/models/pod.rb
@@ -1,7 +1,7 @@
class Pod < ActiveRecord::Base
- def self.find_or_create_by_url(url)
- u = URI.parse(url)
- pod = self.find_or_initialize_by_host(u.host)
+ def self.find_or_create_by(opts) # Rename this method to not override an AR method
+ u = URI.parse(opts.fetch(:url))
+ pod = self.find_or_initialize_by(host: u.host)
unless pod.persisted?
pod.ssl = (u.scheme == 'https')? true : false
pod.save
diff --git a/app/models/poll.rb b/app/models/poll.rb
index e2fe845a3..cf6f0f452 100644
--- a/app/models/poll.rb
+++ b/app/models/poll.rb
@@ -1,9 +1,9 @@
class Poll < ActiveRecord::Base
include Diaspora::Federated::Base
include Diaspora::Guid
- attr_accessible :question, :poll_answers
+
belongs_to :status_message
- has_many :poll_answers
+ has_many :poll_answers, -> { order 'id ASC' }
has_many :poll_participations
xml_attr :question
@@ -14,7 +14,7 @@ class Poll < ActiveRecord::Base
validate :enough_poll_answers
validates :question, presence: true
-
+
self.include_root_in_json = false
def enough_poll_answers
diff --git a/app/models/post.rb b/app/models/post.rb
index 0cbc9f07d..cd3f369b0 100644
--- a/app/models/post.rb
+++ b/app/models/post.rb
@@ -26,19 +26,29 @@ class Post < ActiveRecord::Base
belongs_to :o_embed_cache
belongs_to :open_graph_cache
- after_commit :on => :create do
+ validates_uniqueness_of :id
+
+ after_create do
self.touch(:interacted_at)
end
#scopes
- scope :includes_for_a_stream, includes(:o_embed_cache, :open_graph_cache, {:author => :profile}, :mentions => {:person => :profile}) #note should include root and photos, but i think those are both on status_message
+ scope :includes_for_a_stream, -> {
+ includes(:o_embed_cache,
+ :open_graph_cache,
+ {:author => :profile},
+ :mentions => {:person => :profile}
+ ) #note should include root and photos, but i think those are both on status_message
+ }
- scope :commented_by, lambda { |person|
- select('DISTINCT posts.*').joins(:comments).where(:comments => {:author_id => person.id})
+ scope :commented_by, ->(person) {
+ select('DISTINCT posts.*')
+ .joins(:comments)
+ .where(:comments => {:author_id => person.id})
}
- scope :liked_by, lambda { |person|
+ scope :liked_by, ->(person) {
joins(:likes).where(:likes => {:author_id => person.id})
}
@@ -77,7 +87,7 @@ class Post < ActiveRecord::Base
def self.excluding_blocks(user)
people = user.blocks.map{|b| b.person_id}
- scope = scoped
+ scope = all
if people.any?
scope = scope.where("posts.author_id NOT IN (?)", people)
@@ -87,7 +97,7 @@ class Post < ActiveRecord::Base
end
def self.excluding_hidden_shareables(user)
- scope = scoped
+ scope = all
if user.has_hidden_shareables_of_type?
scope = scope.where('posts.id NOT IN (?)', user.hidden_shareables["#{self.base_class}"])
end
diff --git a/app/models/profile.rb b/app/models/profile.rb
index 3e0e425e1..8e7e3e4e5 100644
--- a/app/models/profile.rb
+++ b/app/models/profile.rb
@@ -32,6 +32,7 @@ class Profile < ActiveRecord::Base
validates :first_name, :length => { :maximum => 32 }
validates :last_name, :length => { :maximum => 32 }
+ validates :location, :length => { :maximum =>255 }
validates_format_of :first_name, :with => /\A[^;]+\z/, :allow_blank => true
validates_format_of :last_name, :with => /\A[^;]+\z/, :allow_blank => true
@@ -41,6 +42,7 @@ class Profile < ActiveRecord::Base
belongs_to :person
before_validation do
self.tag_string = self.tag_string.split[0..4].join(' ')
+ self.build_tags
end
before_save do
@@ -53,6 +55,7 @@ class Profile < ActiveRecord::Base
end
def receive(user, person)
+ person.reload # make sure to have old profile referenced
Rails.logger.info("event=receive payload_type=profile sender=#{person} to=#{user}")
profiles_attr = self.attributes.merge('tag_string' => self.tag_string).slice('diaspora_handle', 'first_name', 'last_name', 'image_url', 'image_url_small', 'image_url_medium', 'birthday', 'gender', 'bio', 'location', 'searchable', 'nsfw', 'tag_string')
person.profile.update_attributes(profiles_attr)
@@ -73,7 +76,16 @@ class Profile < ActiveRecord::Base
else
self[:image_url]
end
- result || '/assets/user/default.png'
+
+ unless result
+ ActionController::Base.helpers.image_path('user/default.png')
+ else
+ if AppConfig.privacy.camo.proxy_remote_pod_images?
+ Diaspora::Camo.image_url(result)
+ else
+ result
+ end
+ end
end
def from_omniauth_hash(omniauth_user_hash)
@@ -144,8 +156,8 @@ class Profile < ActiveRecord::Base
if @tag_string
@tag_string
else
- rows = connection.select_rows( self.tags.scoped.to_sql )
- rows.inject(""){|string, row| string << "##{row[1]} " }
+ tags = self.tags.pluck(:name)
+ tags.inject(""){|string, tag| string << "##{tag} " }
end
end
@@ -186,7 +198,7 @@ class Profile < ActiveRecord::Base
private
def clearable_fields
- self.attributes.keys - Profile.protected_attributes.to_a - ["created_at", "updated_at", "person_id"]
+ self.attributes.keys - ["id", "created_at", "updated_at", "person_id"]
end
def absolutify_local_url url
diff --git a/app/models/reshare.rb b/app/models/reshare.rb
index 5bb5326d5..c10cde1f0 100644
--- a/app/models/reshare.rb
+++ b/app/models/reshare.rb
@@ -18,7 +18,7 @@ class Reshare < Post
end
after_commit :on => :create do
- self.root.update_reshares_counter
+ self.root.update_reshares_counter if self.root.present?
end
after_destroy do
@@ -49,6 +49,10 @@ class Reshare < Post
absolute_root.try(:location).try(:address)
end
+ def poll
+ absolute_root.try(:poll) || super
+ end
+
def receive(recipient, sender)
local_reshare = Reshare.where(:guid => self.guid).first
if local_reshare && local_reshare.root.author_id == recipient.person.id
@@ -62,7 +66,7 @@ class Reshare < Post
end
def notification_type(user, person)
- Notifications::Reshared if root.author == user.person
+ Notifications::Reshared if root.try(:author) == user.person
end
def absolute_root
@@ -74,35 +78,16 @@ class Reshare < Post
private
def after_parse
- root_author = Webfinger.new(@root_diaspora_id).fetch
- root_author.save! unless root_author.persisted?
-
- return if Post.exists?(:guid => self.root_guid)
-
- fetched_post = self.class.fetch_post(root_author, self.root_guid)
-
- if fetched_post
- #Why are we checking for this?
- if root_author.diaspora_handle != fetched_post.diaspora_handle
- raise "Diaspora ID (#{fetched_post.diaspora_handle}) in the root does not match the Diaspora ID (#{root_author.diaspora_handle}) specified in the reshare!"
+ if root.blank?
+ self.root = Diaspora::Fetcher::Single.find_or_fetch_from_remote root_guid, @root_diaspora_id do |fetched_post, author|
+ # why do we check this?
+ if fetched_post.diaspora_handle != author.diaspora_handle
+ raise Diaspora::PostNotFetchable, "Diaspora ID (#{fetched_post.diaspora_handle}) in the root does not match the Diaspora ID (#{author.diaspora_handle}) specified in the reshare!"
+ end
end
-
- fetched_post.save!
end
end
- # Fetch a remote public post, used for receiving reshares of unknown posts
- # @param [Person] author the remote post's author
- # @param [String] guid the remote post's guid
- # @return [Post] an unsaved remote post or false if the post was not found
- def self.fetch_post author, guid
- url = author.url + "/p/#{guid}.xml"
- response = Faraday.get(url)
- return false if response.status == 404 # Old pod, friendika
- raise "Failed to get #{url}" unless response.success? # Other error, N/A for example
- Diaspora::Parser.from_xml(response.body)
- end
-
def root_must_be_public
if self.root && !self.root.public
errors[:base] << "Only posts which are public may be reshared."
diff --git a/app/models/role.rb b/app/models/role.rb
index 40438a035..dafc33f37 100644
--- a/app/models/role.rb
+++ b/app/models/role.rb
@@ -1,18 +1,23 @@
#NOTE add the person object you want to attach role to...
+
class Role < ActiveRecord::Base
belongs_to :person
- scope :admins, -> { where(name: 'admin') }
+ validates :person, presence: true
+ validates :name, uniqueness: {scope: :person_id}
+ validates :name, inclusion: {in: %w(admin spotlight)}
+
+ scope :admins, -> { where(name: "admin") }
def self.is_admin?(person)
- find_by_person_id_and_name(person.id, 'admin')
+ exists?(person_id: person.id, name: "admin")
end
def self.add_admin(person)
- find_or_create_by_person_id_and_name(person.id, 'admin')
+ find_or_create_by(person_id: person.id, name: "admin")
end
def self.add_spotlight(person)
- find_or_create_by_person_id_and_name(person.id, 'spotlight')
+ find_or_create_by(person_id: person.id, name: "spotlight")
end
end
diff --git a/app/models/services/facebook.rb b/app/models/services/facebook.rb
index f49fd2e51..65d1006c3 100644
--- a/app/models/services/facebook.rb
+++ b/app/models/services/facebook.rb
@@ -29,7 +29,7 @@ class Services::Facebook < Service
{message: message,
access_token: access_token,
- link: URI.extract(message, ['https', 'http']).first
+ link: post.message.urls.first
}
end
diff --git a/app/models/share_visibility.rb b/app/models/share_visibility.rb
index 67f42661a..060f65cd2 100644
--- a/app/models/share_visibility.rb
+++ b/app/models/share_visibility.rb
@@ -6,10 +6,11 @@ class ShareVisibility < ActiveRecord::Base
belongs_to :contact
belongs_to :shareable, :polymorphic => :true
- scope :for_a_users_contacts, lambda { |user|
+ scope :for_a_users_contacts, ->(user) {
where(:contact_id => user.contacts.map {|c| c.id})
}
- scope :for_contacts_of_a_person, lambda { |person|
+
+ scope :for_contacts_of_a_person, ->(person) {
where(:contact_id => person.contacts.map {|c| c.id})
}
@@ -25,7 +26,11 @@ class ShareVisibility < ActiveRecord::Base
if AppConfig.postgres?
contact_ids.each do |contact_id|
- ShareVisibility.find_or_create_by_contact_id_and_shareable_id_and_shareable_type(contact_id, share.id, share.class.base_class.to_s)
+ ShareVisibility.find_or_create_by(
+ contact_id: contact_id,
+ shareable_id: share.id,
+ shareable_type: share.class.base_class.to_s
+ )
end
else
new_share_visibilities_data = contact_ids.map do |contact_id|
diff --git a/app/models/status_message.rb b/app/models/status_message.rb
index 5f10f6aef..5d857c640 100644
--- a/app/models/status_message.rb
+++ b/app/models/status_message.rb
@@ -10,7 +10,7 @@ class StatusMessage < Post
acts_as_taggable_on :tags
extract_tags_from :raw_message
- validates_length_of :text, :maximum => 65535, :message => I18n.t('status_messages.too_long', :count => 65535)
+ validates_length_of :text, :maximum => 65535, :message => proc {|p, v| I18n.t('status_messages.too_long', :count => 65535, :current_length => v[:value].length)}
# don't allow creation of empty status messages
validate :presence_of_content, on: :create, if: proc { |sm| sm.author.local? }
@@ -40,7 +40,7 @@ class StatusMessage < Post
after_commit :queue_gather_open_graph_data, :on => :create, :if => :contains_open_graph_url_in_text?
#scopes
- scope :where_person_is_mentioned, lambda { |person|
+ scope :where_person_is_mentioned, ->(person) {
joins(:mentions).where(:mentions => {:person_id => person.id})
}
@@ -68,7 +68,7 @@ class StatusMessage < Post
def attach_photos_by_ids(photo_ids)
return [] unless photo_ids.present?
- self.photos << Photo.where(:id => photo_ids, :author_id => self.author_id).all
+ self.photos << Photo.where(:id => photo_ids, :author_id => self.author_id)
end
def nsfw
@@ -98,7 +98,7 @@ class StatusMessage < Post
def create_mentions
ppl = Diaspora::Mentionable.people_from_string(self.raw_message)
ppl.each do |person|
- self.mentions.find_or_create_by_person_id(person.id)
+ self.mentions.find_or_create_by(person_id: person.id)
end
end
@@ -116,14 +116,14 @@ class StatusMessage < Post
def update_and_dispatch_attached_photos(sender)
if self.photos.any?
- self.photos.update_all(:public => self.public)
+ Photo.where(status_message_guid: guid).update_all(:public => self.public)
self.photos.each do |photo|
if photo.pending
sender.add_to_streams(photo, self.aspects)
sender.dispatch_post(photo)
end
end
- self.photos.update_all(:pending => false)
+ Photo.where(status_message_guid: guid).update_all(:pending => false)
end
end
@@ -148,13 +148,13 @@ class StatusMessage < Post
end
def contains_oembed_url_in_text?
- urls = URI.extract(self.raw_message, ['http', 'https'])
+ urls = self.message.urls
self.oembed_url = urls.find{ |url| !TRUSTED_OEMBED_PROVIDERS.find(url).nil? }
end
def contains_open_graph_url_in_text?
return nil if self.contains_oembed_url_in_text?
- self.open_graph_url = URI.extract(self.raw_message, ['http', 'https'])[0]
+ self.open_graph_url = self.message.urls[0]
end
def address
@@ -187,5 +187,10 @@ class StatusMessage < Post
def self.tag_stream(tag_ids)
joins(:taggings).where('taggings.tag_id IN (?)', tag_ids)
end
+
+ def after_parse
+ # Make sure already received photos don't invalidate the model
+ self.photos = photos.select(&:valid?)
+ end
end
diff --git a/app/models/user.rb b/app/models/user.rb
index 2e9168a80..de6cc79df 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -10,13 +10,14 @@ class User < ActiveRecord::Base
apply_simple_captcha :message => I18n.t('simple_captcha.message.failed'), :add_to_base => true
- scope :logged_in_since, lambda { |time| where('last_seen > ?', time) }
- scope :monthly_actives, lambda { |time = Time.now| logged_in_since(time - 1.month) }
- scope :daily_actives, lambda { |time = Time.now| logged_in_since(time - 1.day) }
- scope :yearly_actives, lambda { |time = Time.now| logged_in_since(time - 1.year) }
- scope :halfyear_actives, lambda { |time = Time.now| logged_in_since(time - 6.month) }
-
- devise :database_authenticatable, :registerable,
+ scope :logged_in_since, ->(time) { where('last_seen > ?', time) }
+ scope :monthly_actives, ->(time = Time.now) { logged_in_since(time - 1.month) }
+ scope :daily_actives, ->(time = Time.now) { logged_in_since(time - 1.day) }
+ scope :yearly_actives, ->(time = Time.now) { logged_in_since(time - 1.year) }
+ scope :halfyear_actives, ->(time = Time.now) { logged_in_since(time - 6.month) }
+ scope :active, -> { joins(:person).where(people: {closed_account: false}).where.not(username: nil) }
+
+ devise :token_authenticatable, :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable,
:lockable, :lastseenable, :lock_strategy => :none, :unlock_strategy => :none
@@ -37,6 +38,8 @@ class User < ActiveRecord::Base
serialize :hidden_shareables, Hash
has_one :person, :foreign_key => :owner_id
+ has_one :profile, through: :person
+
delegate :guid, :public_key, :posts, :photos, :owns?, :image_url,
:diaspora_handle, :name, :public_url, :profile, :url,
:first_name, :last_name, :gender, :participations, to: :person
@@ -44,7 +47,7 @@ class User < ActiveRecord::Base
has_many :invitations_from_me, :class_name => 'Invitation', :foreign_key => :sender_id
has_many :invitations_to_me, :class_name => 'Invitation', :foreign_key => :recipient_id
- has_many :aspects, :order => 'order_id ASC'
+ has_many :aspects, -> { order('order_id ASC') }
belongs_to :auto_follow_back_aspect, :class_name => 'Aspect'
belongs_to :invited_by, :class_name => 'User'
@@ -59,13 +62,13 @@ class User < ActiveRecord::Base
has_many :user_preferences
has_many :tag_followings
- has_many :followed_tags, :through => :tag_followings, :source => :tag, :order => 'tags.name'
+ has_many :followed_tags, -> { order('tags.name') }, :through => :tag_followings, :source => :tag
has_many :blocks
has_many :ignored_people, :through => :blocks, :source => :person
- has_many :conversation_visibilities, through: :person, order: 'updated_at DESC'
- has_many :conversations, through: :conversation_visibilities, order: 'updated_at DESC'
+ has_many :conversation_visibilities, -> { order 'updated_at DESC' }, through: :person
+ has_many :conversations, -> { order 'updated_at DESC' }, through: :conversation_visibilities
has_many :notifications, :foreign_key => :recipient_id
@@ -83,7 +86,7 @@ class User < ActiveRecord::Base
end
def unread_message_count
- ConversationVisibility.sum(:unread, :conditions => "person_id = #{self.person.id}")
+ ConversationVisibility.where(person_id: self.person_id).sum(:unread)
end
#@deprecated
@@ -102,7 +105,7 @@ class User < ActiveRecord::Base
def invitation_code
- InvitationCode.find_or_create_by_user_id(self.id)
+ InvitationCode.find_or_create_by(user_id: self.id)
end
def hidden_shareables
@@ -163,14 +166,14 @@ class User < ActiveRecord::Base
def update_user_preferences(pref_hash)
if self.disable_mail
- UserPreference::VALID_EMAIL_TYPES.each{|x| self.user_preferences.find_or_create_by_email_type(x)}
+ UserPreference::VALID_EMAIL_TYPES.each{|x| self.user_preferences.find_or_create_by(email_type: x)}
self.disable_mail = false
self.save
end
pref_hash.keys.each do |key|
if pref_hash[key] == 'true'
- self.user_preferences.find_or_create_by_email_type(key)
+ self.user_preferences.find_or_create_by(email_type: key)
else
block = self.user_preferences.where(:email_type => key).first
if block
@@ -256,7 +259,7 @@ class User < ActiveRecord::Base
if aspect_ids == "all" || aspect_ids == :all
self.aspects
else
- aspects.where(:id => aspect_ids)
+ aspects.where(:id => aspect_ids).to_a
end
end
@@ -289,6 +292,67 @@ class User < ActiveRecord::Base
end
end
+ ######### Data export ##################
+ mount_uploader :export, ExportedUser
+
+ def queue_export
+ update exporting: true
+ Workers::ExportUser.perform_async(id)
+ end
+
+ def perform_export!
+ export = Tempfile.new([username, '.json.gz'], encoding: 'ascii-8bit')
+ export.write(compressed_export) && export.close
+ if export.present?
+ update exporting: false, export: export, exported_at: Time.zone.now
+ else
+ update exporting: false
+ end
+ end
+
+ def compressed_export
+ ActiveSupport::Gzip.compress Diaspora::Exporter.new(self).execute
+ end
+
+ ######### Photos export ##################
+ mount_uploader :exported_photos_file, ExportedPhotos
+
+ def queue_export_photos
+ update exporting_photos: true
+ Workers::ExportPhotos.perform_async(id)
+ end
+
+ def perform_export_photos!
+ temp_zip = Tempfile.new([username, '_photos.zip'])
+ begin
+ Zip::ZipOutputStream.open(temp_zip.path) do |zos|
+ photos.each do |photo|
+ begin
+ photo_file = photo.unprocessed_image.file
+ if photo_file
+ photo_data = photo_file.read
+ zos.put_next_entry(photo.remote_photo_name)
+ zos.print(photo_data)
+ else
+ logger.info "Export photos error: No file for #{photo.remote_photo_name} not found"
+ end
+ rescue Errno::ENOENT
+ logger.info "Export photos error: #{photo.unprocessed_image.file.path} not found"
+ end
+ end
+ end
+ ensure
+ temp_zip.close
+ end
+
+ begin
+ update exported_photos_file: temp_zip, exported_photos_at: Time.zone.now if temp_zip.present?
+ ensure
+ restore_attributes if invalid? || temp_zip.present?
+ update exporting_photos: false
+ end
+ end
+
######### Mailer #######################
def mail(job, *args)
pref = job.to_s.gsub('Workers::Mail::', '').underscore
@@ -355,7 +419,7 @@ class User < ActiveRecord::Base
###Helpers############
def self.build(opts = {})
- u = User.new(opts.except(:person))
+ u = User.new(opts.except(:person, :id))
u.setup(opts)
u
end
@@ -369,7 +433,7 @@ class User < ActiveRecord::Base
errors = self.errors
errors.delete :person
return if errors.size > 0
- self.set_person(Person.new(opts[:person] || {} ))
+ self.set_person(Person.new((opts[:person] || {}).except(:id)))
self.generate_keys
self
end
@@ -456,15 +520,20 @@ class User < ActiveRecord::Base
AccountDeletion.create(:person => self.person)
end
+ def closed_account?
+ self.person.closed_account
+ end
+
def clear_account!
clearable_fields.each do |field|
self[field] = nil
end
[:getting_started,
- :disable_mail,
:show_community_spotlight_in_stream].each do |field|
self[field] = false
end
+ self[:disable_mail] = true
+ self[:strip_exif] = true
self[:email] = "deletedaccount_#{self[:id]}@example.org"
random_password = SecureRandom.hex(20)
@@ -480,13 +549,32 @@ class User < ActiveRecord::Base
save
end
end
-
+
+ def flag_for_removal(remove_after)
+ # flag inactive user for future removal
+ if AppConfig.settings.maintenance.remove_old_users.enable?
+ self.remove_after = remove_after
+ self.save
+ end
+ end
+
+ def after_database_authentication
+ # remove any possible remove_after timestamp flag set by maintenance.remove_old_users
+ unless self.remove_after.nil?
+ self.remove_after = nil
+ self.save
+ end
+ end
+
private
+
def clearable_fields
self.attributes.keys - ["id", "username", "encrypted_password",
"created_at", "updated_at", "locked_at",
"serialized_private_key", "getting_started",
"disable_mail", "show_community_spotlight_in_stream",
- "email"]
+ "strip_exif", "email", "remove_after",
+ "export", "exporting", "exported_at",
+ "exported_photos_file", "exporting_photos", "exported_photos_at"]
end
end
diff --git a/app/models/user/connecting.rb b/app/models/user/connecting.rb
index e90133330..507a27079 100644
--- a/app/models/user/connecting.rb
+++ b/app/models/user/connecting.rb
@@ -8,7 +8,7 @@ module User::Connecting
# @param [Aspect] aspect The aspect to add them to.
# @return [Contact] The newly made contact for the passed in person.
def share_with(person, aspect)
- contact = self.contacts.find_or_initialize_by_person_id(person.id)
+ contact = self.contacts.find_or_initialize_by(person_id: person.id)
return false unless contact.valid?
unless contact.receiving?
@@ -22,7 +22,7 @@ module User::Connecting
if notification = Notification.where(:target_id => person.id).first
notification.update_attributes(:unread=>false)
end
-
+
deliver_profile_update
register_share_visibilities(contact)
contact
@@ -42,8 +42,6 @@ module User::Connecting
end
def remove_contact(contact, opts={:force => false, :retracted => false})
- posts = contact.posts.all
-
if !contact.mutual? || opts[:force]
contact.destroy
elsif opts[:retracted]
diff --git a/app/models/user/querying.rb b/app/models/user/querying.rb
index ac5a800df..a307e8a42 100644
--- a/app/models/user/querying.rb
+++ b/app/models/user/querying.rb
@@ -27,7 +27,7 @@ module User::Querying
opts[:klass] = klass
opts[:by_members_of] ||= self.aspect_ids
- post_ids = klass.connection.select_values(visible_shareable_sql(klass, opts)).map { |id| id.to_i }
+ post_ids = klass.connection.select_values(visible_shareable_sql(klass, opts)).map(&:to_i)
post_ids += klass.connection.select_values("#{construct_public_followings_sql(opts).to_sql} LIMIT #{opts[:limit]}").map {|id| id.to_i }
end
@@ -69,7 +69,7 @@ module User::Querying
def construct_public_followings_sql(opts)
Rails.logger.debug("[EVIL-QUERY] user.construct_public_followings_sql")
-
+
# For PostgreSQL and MySQL/MariaDB we use a different query
# see issue: https://github.com/diaspora/diaspora/issues/5014
if AppConfig.postgres?
@@ -88,9 +88,9 @@ module User::Querying
end
def construct_shareable_from_self_query(opts)
- conditions = {:pending => false }
+ conditions = {:pending => false, :author_id => self.person_id }
conditions[:type] = opts[:type] if opts.has_key?(:type)
- query = self.person.send(opts[:klass].to_s.tableize).where(conditions)
+ query = opts[:klass].where(conditions)
if opts[:by_members_of]
query = query.joins(:aspect_visibilities).where(:aspect_visibilities => {:aspect_id => opts[:by_members_of]})
@@ -104,6 +104,11 @@ module User::Querying
contact_for_person_id(person.id)
end
+ def block_for(person)
+ return nil unless person
+ self.blocks.where(person_id: person.id).first
+ end
+
def aspects_with_shareable(base_class_name_or_class, shareable_id)
base_class_name = base_class_name_or_class
base_class_name = base_class_name_or_class.base_class.to_s if base_class_name_or_class.is_a?(Class)
@@ -160,6 +165,9 @@ module User::Querying
}
defaults[:type] = Stream::Base::TYPES_OF_POST_IN_STREAM if klass == Post
opts = defaults.merge(opts)
+ if opts[:limit] == :all
+ opts.delete(:limit)
+ end
opts[:order_field] = opts[:order].split.first.to_sym
opts[:order_with_table] = klass.table_name + '.' + opts[:order]
diff --git a/app/presenters/aspect_membership_presenter.rb b/app/presenters/aspect_membership_presenter.rb
new file mode 100644
index 000000000..28a96e38f
--- /dev/null
+++ b/app/presenters/aspect_membership_presenter.rb
@@ -0,0 +1,11 @@
+class AspectMembershipPresenter < BasePresenter
+ def initialize(membership)
+ @membership = membership
+ end
+
+ def base_hash
+ { id: @membership.id,
+ aspect: AspectPresenter.new(@membership.aspect).as_json,
+ }
+ end
+end
diff --git a/app/presenters/avatar_presenter.rb b/app/presenters/avatar_presenter.rb
new file mode 100644
index 000000000..5cb0060d8
--- /dev/null
+++ b/app/presenters/avatar_presenter.rb
@@ -0,0 +1,12 @@
+
+class AvatarPresenter < BasePresenter
+
+ DEFAULT_IMAGE = ActionController::Base.helpers.image_path('user/default.png')
+
+ def base_hash
+ { small: image_url_small || DEFAULT_IMAGE,
+ medium: image_url_medium || DEFAULT_IMAGE,
+ large: image_url || DEFAULT_IMAGE
+ }
+ end
+end
diff --git a/app/presenters/base_presenter.rb b/app/presenters/base_presenter.rb
index 8f83962e9..122a505b6 100644
--- a/app/presenters/base_presenter.rb
+++ b/app/presenters/base_presenter.rb
@@ -1,5 +1,29 @@
class BasePresenter
- def self.as_collection(collection)
- collection.map{|object| self.new(object).as_json}
+ attr_reader :current_user
+
+ class << self
+ def new(*args)
+ return NilPresenter.new if args[0].nil?
+ super *args
+ end
+
+ def as_collection(collection, method=:as_json, *args)
+ collection.map{|object| self.new(object, *args).send(method) }
+ end
+ end
+
+ def initialize(presentable, curr_user=nil)
+ @presentable = presentable
+ @current_user = curr_user
+ end
+
+ def method_missing(method, *args)
+ @presentable.public_send(method, *args)
+ end
+
+ class NilPresenter
+ def method_missing(method, *args)
+ nil
+ end
end
end
diff --git a/app/presenters/block_presenter.rb b/app/presenters/block_presenter.rb
new file mode 100644
index 000000000..937d057b6
--- /dev/null
+++ b/app/presenters/block_presenter.rb
@@ -0,0 +1,6 @@
+
+class BlockPresenter < BasePresenter
+ def base_hash
+ { id: id }
+ end
+end
diff --git a/app/presenters/comment_presenter.rb b/app/presenters/comment_presenter.rb
index 725d206c3..95eef095c 100644
--- a/app/presenters/comment_presenter.rb
+++ b/app/presenters/comment_presenter.rb
@@ -7,9 +7,9 @@ class CommentPresenter < BasePresenter
{
:id => @comment.id,
:guid => @comment.guid,
- :text => @comment.text,
+ :text => @comment.message.plain_text_for_json,
:author => @comment.author.as_api_response(:backbone),
:created_at => @comment.created_at
}
end
-end \ No newline at end of file
+end
diff --git a/app/presenters/contact_presenter.rb b/app/presenters/contact_presenter.rb
new file mode 100644
index 000000000..9ab8b2d26
--- /dev/null
+++ b/app/presenters/contact_presenter.rb
@@ -0,0 +1,17 @@
+class ContactPresenter < BasePresenter
+ def base_hash
+ { id: id,
+ person_id: person_id
+ }
+ end
+
+ def full_hash
+ base_hash.merge({
+ aspect_memberships: aspect_memberships.map{ |membership| AspectMembershipPresenter.new(membership).base_hash }
+ })
+ end
+
+ def full_hash_with_person
+ full_hash.merge({person: PersonPresenter.new(person).full_hash_with_profile})
+ end
+end
diff --git a/app/presenters/person_presenter.rb b/app/presenters/person_presenter.rb
index 7b635125a..37f759353 100644
--- a/app/presenters/person_presenter.rb
+++ b/app/presenters/person_presenter.rb
@@ -1,33 +1,80 @@
-class PersonPresenter
- def initialize(person, current_user = nil)
- @person = person
- @current_user = current_user
+class PersonPresenter < BasePresenter
+ def base_hash
+ { id: id,
+ guid: guid,
+ name: name,
+ diaspora_id: diaspora_handle
+ }
+ end
+
+ def full_hash
+ base_hash.merge({
+ relationship: relationship,
+ block: is_blocked? ? BlockPresenter.new(current_user_person_block).base_hash : false,
+ contact: (!own_profile? && has_contact?) ? { id: current_user_person_contact.id } : false,
+ is_own_profile: own_profile?
+ })
+ end
+
+ def full_hash_with_avatar
+ full_hash.merge({avatar: AvatarPresenter.new(profile).base_hash})
+ end
+
+ def full_hash_with_profile
+ full_hash.merge({profile: ProfilePresenter.new(profile).full_hash})
end
def as_json(options={})
- attrs = @person.as_api_response(:backbone).merge(
- {
- :is_own_profile => is_own_profile
- })
+ attrs = full_hash_with_avatar
- if is_own_profile || person_is_following_current_user
+ if own_profile? || person_is_following_current_user
attrs.merge!({
- :location => @person.location,
- :birthday => @person.formatted_birthday,
- :bio => @person.bio
+ :location => @presentable.location,
+ :birthday => @presentable.formatted_birthday,
+ :bio => @presentable.bio
})
end
attrs
end
- def is_own_profile
- @current_user.try(:person) == @person
+ protected
+
+ def own_profile?
+ current_user.try(:person) == @presentable
end
- protected
+ def relationship
+ return false unless current_user
+ return :blocked if is_blocked?
+
+ contact = current_user_person_contact
+ return :not_sharing unless contact
+
+ [:mutual, :sharing, :receiving].find do |status|
+ contact.public_send("#{status}?")
+ end || :not_sharing
+ end
def person_is_following_current_user
- @person.shares_with(@current_user)
+ @presentable.shares_with(current_user)
+ end
+
+ private
+
+ def current_user_person_block
+ @block ||= (current_user ? current_user.block_for(@presentable) : Block.none)
+ end
+
+ def current_user_person_contact
+ @contact ||= (current_user ? current_user.contact_for(@presentable) : Contact.none)
+ end
+
+ def has_contact?
+ current_user_person_contact.present?
+ end
+
+ def is_blocked?
+ current_user_person_block.present?
end
end
diff --git a/app/presenters/photo_presenter.rb b/app/presenters/photo_presenter.rb
new file mode 100644
index 000000000..defed1d9b
--- /dev/null
+++ b/app/presenters/photo_presenter.rb
@@ -0,0 +1,16 @@
+class PhotoPresenter < BasePresenter
+ def base_hash
+ { id: id,
+ guid: guid,
+ dimensions: {
+ height: height,
+ width: width
+ },
+ sizes: {
+ small: url(:thumb_small),
+ medium: url(:thumb_medium),
+ large: url(:scaled_full)
+ }
+ }
+ end
+end
diff --git a/app/presenters/post_presenter.rb b/app/presenters/post_presenter.rb
index e95b05632..90e074a6f 100644
--- a/app/presenters/post_presenter.rb
+++ b/app/presenters/post_presenter.rb
@@ -13,10 +13,15 @@ class PostPresenter
end
def as_json(options={})
+ text = if @post.message
+ @post.message.plain_text_for_json
+ else
+ @post.raw_message
+ end
{
:id => @post.id,
:guid => @post.guid,
- :text => @post.raw_message,
+ :text => text,
:public => @post.public,
:created_at => @post.created_at,
:interacted_at => @post.interacted_at,
@@ -36,13 +41,14 @@ class PostPresenter
:address => @post.address,
:poll => @post.poll(),
:already_participated_in_poll => already_participated_in_poll,
+ :participation => participate?,
:interactions => {
:likes => [user_like].compact,
:reshares => [user_reshare].compact,
:comments_count => @post.comments_count,
:likes_count => @post.likes_count,
- :reshares_count => @post.reshares_count,
+ :reshares_count => @post.reshares_count
}
}
end
@@ -81,6 +87,10 @@ class PostPresenter
end
end
+ def participate?
+ user_signed_in? && @current_user.participations.where(:target_id => @post).exists?
+ end
+
end
class PostInteractionPresenter
@@ -91,15 +101,18 @@ class PostInteractionPresenter
def as_json(options={})
{
- :likes => as_api(@post.likes),
- :reshares => PostPresenter.collection_json(@post.reshares, @current_user),
- :comments => CommentPresenter.as_collection(@post.comments.order('created_at ASC')),
- :participations => as_api(@post.participations)
+ likes: as_api(@post.likes),
+ reshares: PostPresenter.collection_json(@post.reshares, @current_user),
+ comments: CommentPresenter.as_collection(@post.comments.order("created_at ASC")),
+ participations: as_api(@post.participations),
+ comments_count: @post.comments_count,
+ likes_count: @post.likes_count,
+ reshares_count: @post.reshares_count
}
end
def as_api(collection)
- collection.includes(:author => :profile).all.map do |element|
+ collection.includes(:author => :profile).map do |element|
element.as_api_response(:backbone)
end
end
diff --git a/app/presenters/profile_presenter.rb b/app/presenters/profile_presenter.rb
new file mode 100644
index 000000000..3581ef9f9
--- /dev/null
+++ b/app/presenters/profile_presenter.rb
@@ -0,0 +1,24 @@
+class ProfilePresenter < BasePresenter
+ include PeopleHelper
+
+ def base_hash
+ { id: id,
+ tags: tags.pluck(:name),
+ bio: bio_message.plain_text_for_json,
+ location: location_message.plain_text_for_json,
+ gender: gender,
+ birthday: formatted_birthday,
+ searchable: searchable
+ }
+ end
+
+ def full_hash
+ base_hash.merge({
+ avatar: AvatarPresenter.new(@presentable).base_hash,
+ })
+ end
+
+ def formatted_birthday
+ birthday_format(birthday) if birthday
+ end
+end
diff --git a/app/presenters/statistics_presenter.rb b/app/presenters/statistics_presenter.rb
index e07dcc6e0..51d2b367c 100644
--- a/app/presenters/statistics_presenter.rb
+++ b/app/presenters/statistics_presenter.rb
@@ -1,37 +1,122 @@
+# Copyright (c) 2010-2011, Diaspora Inc. This file is
+# licensed under the Affero General Public License version 3 or later. See
+# the COPYRIGHT file.
+
class StatisticsPresenter
- def as_json(options={})
- result = {
- 'name' => AppConfig.settings.pod_name,
- 'version' => AppConfig.version_string,
- 'registrations_open' => AppConfig.settings.enable_registrations
+ def as_json options={}
+ base_data.merge(user_counts)
+ .merge(post_counts)
+ .merge(comment_counts)
+ .merge(all_services)
+ .merge(legacy_services) # Remove in 0.6
+ end
+
+ def base_data
+ {
+ 'name' => name,
+ 'network' => 'Diaspora',
+ 'version' => version,
+ 'registrations_open' => open_registrations?,
+ 'services' => available_services
}
- if AppConfig.privacy.statistics.user_counts?
- result['total_users'] = User.count
- result['active_users_halfyear'] = User.halfyear_actives.count
- result['active_users_monthly'] = User.monthly_actives.count
- end
- if AppConfig.privacy.statistics.post_counts?
- result['local_posts'] = self.local_posts
- end
- if AppConfig.privacy.statistics.comment_counts?
- result['local_comments'] = self.local_comments
- end
-
- AppConfig.services.each do |service, options|
- result[service] = options ? !!options["enable"] : false
-
- end
+ end
- result
+ def name
+ AppConfig.settings.pod_name
+ end
+
+ def version
+ AppConfig.version_string
+ end
+
+ def open_registrations?
+ AppConfig.settings.enable_registrations?
+ end
+
+ def user_counts
+ return {} unless expose_user_counts?
+ {
+ 'total_users' => total_users,
+ 'active_users_monthly' => monthly_users,
+ 'active_users_halfyear' => halfyear_users
+ }
+ end
+
+ def expose_user_counts?
+ AppConfig.privacy.statistics.user_counts?
+ end
+
+ def total_users
+ @total_users ||= User.active.count
+ end
+
+ def monthly_users
+ @monthly_users ||= User.monthly_actives.count
+ end
+
+ def halfyear_users
+ @halfyear_users ||= User.halfyear_actives.count
+ end
+
+ def post_counts
+ return {} unless expose_posts_counts?
+ {
+ 'local_posts' => local_posts
+ }
end
def local_posts
- Post.where(:type => "StatusMessage").joins(:author).where("owner_id IS NOT null").count
+ @local_posts ||= Post.where(type: "StatusMessage")
+ .joins(:author)
+ .where("owner_id IS NOT null")
+ .count
+ end
+
+ def expose_posts_counts?
+ AppConfig.privacy.statistics.post_counts?
+ end
+
+ def comment_counts
+ return {} unless expose_comment_counts?
+ {
+ 'local_comments' => local_comments
+ }
end
+ def expose_comment_counts?
+ AppConfig.privacy.statistics.comment_counts?
+ end
+
+
def local_comments
- Comment.joins(:author).where("owner_id IS NOT null").count
+ @local_comments ||= Comment.joins(:author)
+ .where("owner_id IS NOT null")
+ .count
end
-
+
+ def all_services_helper
+ result = {}
+ Configuration::KNOWN_SERVICES.each {|service, options|
+ result[service.to_s] = AppConfig["services.#{service}.enable"]
+ }
+ result
+ end
+
+ def all_services
+ @all_services ||= all_services_helper
+ end
+
+ def available_services
+ Configuration::KNOWN_SERVICES.select {|service|
+ AppConfig["services.#{service}.enable"]
+ }.map(&:to_s)
+ end
+
+ def legacy_services
+ Configuration::KNOWN_SERVICES.each_with_object({}) {|service, result|
+ result[service.to_s] = AppConfig["services.#{service}.enable"]
+ }
+ end
+
end
diff --git a/app/serializers/export/aspect_serializer.rb b/app/serializers/export/aspect_serializer.rb
new file mode 100644
index 000000000..5507e516a
--- /dev/null
+++ b/app/serializers/export/aspect_serializer.rb
@@ -0,0 +1,7 @@
+module Export
+ class AspectSerializer < ActiveModel::Serializer
+ attributes :name,
+ :contacts_visible,
+ :chat_enabled
+ end
+end
diff --git a/app/serializers/export/comment_serializer.rb b/app/serializers/export/comment_serializer.rb
new file mode 100644
index 000000000..72e9ccbf5
--- /dev/null
+++ b/app/serializers/export/comment_serializer.rb
@@ -0,0 +1,10 @@
+module Export
+ class CommentSerializer < ActiveModel::Serializer
+ attributes :text,
+ :post_guid
+
+ def post_guid
+ object.post.guid
+ end
+ end
+end
diff --git a/app/serializers/export/contact_serializer.rb b/app/serializers/export/contact_serializer.rb
new file mode 100644
index 000000000..be025304f
--- /dev/null
+++ b/app/serializers/export/contact_serializer.rb
@@ -0,0 +1,12 @@
+module Export
+ class ContactSerializer < ActiveModel::Serializer
+ attributes :sharing,
+ :receiving,
+ :person_guid,
+ :person_name,
+ :person_first_name,
+ :person_diaspora_handle
+
+ has_many :aspects, each_serializer: Export::AspectSerializer
+ end
+end
diff --git a/app/serializers/export/post_serializer.rb b/app/serializers/export/post_serializer.rb
new file mode 100644
index 000000000..0a19d30b7
--- /dev/null
+++ b/app/serializers/export/post_serializer.rb
@@ -0,0 +1,15 @@
+module Export
+ class PostSerializer < ActiveModel::Serializer
+ attributes :text,
+ :public,
+ :diaspora_handle,
+ :type,
+ :image_url,
+ :image_height,
+ :image_width,
+ :likes_count,
+ :comments_count,
+ :reshares_count,
+ :created_at
+ end
+end
diff --git a/app/serializers/export/profile_serializer.rb b/app/serializers/export/profile_serializer.rb
new file mode 100644
index 000000000..b8eb2001f
--- /dev/null
+++ b/app/serializers/export/profile_serializer.rb
@@ -0,0 +1,14 @@
+module Export
+ class ProfileSerializer < ActiveModel::Serializer
+ attributes :first_name,
+ :last_name,
+ :gender,
+ :bio,
+ :birthday,
+ :location,
+ :image_url,
+ :diaspora_handle,
+ :searchable,
+ :nsfw
+ end
+end
diff --git a/app/serializers/export/user_serializer.rb b/app/serializers/export/user_serializer.rb
new file mode 100644
index 000000000..a7563cc27
--- /dev/null
+++ b/app/serializers/export/user_serializer.rb
@@ -0,0 +1,23 @@
+module Export
+ class UserSerializer < ActiveModel::Serializer
+ attributes :name,
+ :email,
+ :language,
+ :username,
+ :disable_mail,
+ :show_community_spotlight_in_stream,
+ :auto_follow_back,
+ :auto_follow_back_aspect,
+ :strip_exif
+ has_one :profile, serializer: Export::ProfileSerializer
+ has_many :aspects, each_serializer: Export::AspectSerializer
+ has_many :contacts, each_serializer: Export::ContactSerializer
+ has_many :posts, each_serializer: Export::PostSerializer
+ has_many :comments, each_serializer: Export::CommentSerializer
+
+ def comments
+ object.person.comments
+ end
+
+ end
+end
diff --git a/app/uploaders/exported_photos.rb b/app/uploaders/exported_photos.rb
new file mode 100644
index 000000000..0e4465cdd
--- /dev/null
+++ b/app/uploaders/exported_photos.rb
@@ -0,0 +1,17 @@
+# Copyright (c) 2010-2011, Diaspora Inc. This file is
+# licensed under the Affero General Public License version 3 or later. See
+# the COPYRIGHT file.
+
+class ExportedPhotos < SecureUploader
+
+ def store_dir
+ "uploads/users"
+ end
+
+ def filename
+ "#{model.username}_photos_#{secure_token}.zip" if original_filename.present?
+ end
+
+
+
+end
diff --git a/app/uploaders/exported_user.rb b/app/uploaders/exported_user.rb
new file mode 100644
index 000000000..a7c4d5a2b
--- /dev/null
+++ b/app/uploaders/exported_user.rb
@@ -0,0 +1,19 @@
+# Copyright (c) 2010-2011, Diaspora Inc. This file is
+# licensed under the Affero General Public License version 3 or later. See
+# the COPYRIGHT file.
+
+class ExportedUser < SecureUploader
+
+ def store_dir
+ "uploads/users"
+ end
+
+ def extension_white_list
+ %w(gz)
+ end
+
+ def filename
+ "#{model.username}_diaspora_data_#{secure_token}.json.gz"
+ end
+
+end
diff --git a/app/uploaders/processed_image.rb b/app/uploaders/processed_image.rb
index 89750f336..71bae76a1 100644
--- a/app/uploaders/processed_image.rb
+++ b/app/uploaders/processed_image.rb
@@ -19,27 +19,15 @@ class ProcessedImage < CarrierWave::Uploader::Base
version :thumb_small do
process :resize_to_fill => [50,50]
- process :strip
end
version :thumb_medium do
process :resize_to_limit => [100,100]
- process :strip
end
version :thumb_large do
process :resize_to_limit => [300,300]
- process :strip
end
version :scaled_full do
process :resize_to_limit => [700,nil]
- process :strip
- end
-
- def strip
- manipulate! do |img|
- img.strip
- img = yield(img) if block_given?
- img
- end
end
end
diff --git a/app/uploaders/secure_uploader.rb b/app/uploaders/secure_uploader.rb
new file mode 100644
index 000000000..08bbed1c7
--- /dev/null
+++ b/app/uploaders/secure_uploader.rb
@@ -0,0 +1,7 @@
+class SecureUploader < CarrierWave::Uploader::Base
+ protected
+ def secure_token(bytes = 16)
+ var = :"@#{mounted_as}_secure_token"
+ model.instance_variable_get(var) or model.instance_variable_set(var, SecureRandom.urlsafe_base64(bytes))
+ end
+end
diff --git a/app/uploaders/unprocessed_image.rb b/app/uploaders/unprocessed_image.rb
index 8de9ed0f3..86d425eb2 100644
--- a/app/uploaders/unprocessed_image.rb
+++ b/app/uploaders/unprocessed_image.rb
@@ -5,6 +5,12 @@
class UnprocessedImage < CarrierWave::Uploader::Base
include CarrierWave::MiniMagick
+ attr_accessor :strip_exif
+
+ def strip_exif
+ @strip_exif || false
+ end
+
def store_dir
"uploads/images"
end
@@ -17,11 +23,13 @@ class UnprocessedImage < CarrierWave::Uploader::Base
model.random_string + File.extname(@filename) if @filename
end
- process :orient_image
+ process :basic_process
- def orient_image
+ def basic_process
manipulate! do |img|
img.auto_orient
+ img.strip if strip_exif
+ img = yield(img) if block_given?
img
end
end
diff --git a/app/views/admins/_user_entry.haml b/app/views/admins/_user_entry.haml
index d6223f2cc..5fa76beaa 100644
--- a/app/views/admins/_user_entry.haml
+++ b/app/views/admins/_user_entry.haml
@@ -24,6 +24,12 @@
- unless user.person.closed_account
%li= link_to t('admins.user_search.close_account'), admin_close_account_path(user), method: :post, data: { confirm: t('admins.user_search.are_you_sure') }, class: 'btn btn-danger btn-mini'
+ - unless user.closed_account?
+ - unless user.access_locked?
+ %li= link_to t('admins.user_search.lock_account'), admin_lock_account_path(user), method: :post, data: { confirm: t('admins.user_search.are_you_sure_lock_account') }, class: 'btn btn-danger btn-mini'
+ - else
+ %li= link_to t('admins.user_search.unlock_account'), admin_unlock_account_path(user), method: :post, data: { confirm: t('admins.user_search.are_you_sure_unlock_account') }, class: 'btn btn-danger btn-mini'
+
%div.row
%div.span5
%dl.dl-horizontal
diff --git a/app/views/admins/correlations.haml b/app/views/admins/correlations.haml
index ce50f5010..703f96af7 100644
--- a/app/views/admins/correlations.haml
+++ b/app/views/admins/correlations.haml
@@ -1,12 +1,12 @@
+.container
+ %div
+ = render :partial => 'admins/admin_bar'
-%div
- = render :partial => 'admins/admin_bar'
-
-%div.row
- %div.span12
- %h1
- = t('.correlations_count')
- %ul
- - @correlations_hash.keys.each do |k|
- %li
- = "#{k.to_s}, #{@correlations_hash[k]}"
+ %div.row
+ %div.span12
+ %h1
+ = t('.correlations_count')
+ %ul
+ - @correlations_hash.keys.each do |k|
+ %li
+ = "#{k.to_s}, #{@correlations_hash[k]}"
diff --git a/app/views/admins/stats.html.haml b/app/views/admins/stats.html.haml
index b30c86304..470ce97b2 100644
--- a/app/views/admins/stats.html.haml
+++ b/app/views/admins/stats.html.haml
@@ -1,56 +1,56 @@
-
-%div
- = render :partial => 'admins/admin_bar'
-
-%h1
- = t('.usage_statistic')
-
-%div.pull-right
- = form_tag('/admins/stats', :method => 'get', class: 'form-inline') do
- %select{:name => 'range'}
- %option{:value => 'daily', :selected => ('selected' if params[:range] == 'daily')}
- = t('.daily')
- %option{:value => 'week', :selected => ('selected' if params[:range] == 'week')}
- = t('.week')
- %option{:value => '2weeks', :selected => ('selected' if params[:range] == '2weeks')}
- = t('.2weeks')
- %option{:value => 'month', :selected => ('selected' if params[:range] == 'month')}
- = t('.month')
-
- = submit_tag t('.go'), class: 'btn btn-primary'
-
-%h3
- != t('.display_results', :segment => @segment)
-
-%div.row
- - [:posts, :comments, :aspect_memberships, :users].each do |name|
- - model = eval("@#{name.to_s}")
- - if name == :aspect_memberships
- - name = t('.shares', :count => model[:yesterday])
- - if name == :posts
- - name = t('.posts', :count => model[:yesterday])
- - if name == :comments
- - name = t('.comments', :count => model[:yesterday])
- - if name == :users
- - name = t('.users', :count => model[:yesterday])
-
- .span3
- %h2{:style => 'font-weight:bold;'}
- = name.to_s
- %h4
- = model[:day_before]
- %span.percent_change{:class => (model[:change] > 0 ? "green" : "red")}
- = "(#{model[:change]}%)"
-
-%div.row
- %div.span12
- %p.alert.alert-info.text-center
- != t('.current_segment', :post_yest => @posts[:yesterday]/@user_count.to_f, :post_day => @posts[:day_before]/@user_count.to_f)
-
-%div.row
- %div.span12
- %h3= t('.50_most')
- %ul
- - @popular_tags.each do |name,count|
- %li
- != t('.tag_name', :name_tag => name, :count_tag => count)
+.container
+ %div
+ = render :partial => 'admins/admin_bar'
+
+ %h1
+ = t('.usage_statistic')
+
+ %div.pull-right
+ = form_tag('/admins/stats', :method => 'get', class: 'form-inline') do
+ %select{:name => 'range'}
+ %option{:value => 'daily', :selected => ('selected' if params[:range] == 'daily')}
+ = t('.daily')
+ %option{:value => 'week', :selected => ('selected' if params[:range] == 'week')}
+ = t('.week')
+ %option{:value => '2weeks', :selected => ('selected' if params[:range] == '2weeks')}
+ = t('.2weeks')
+ %option{:value => 'month', :selected => ('selected' if params[:range] == 'month')}
+ = t('.month')
+
+ = submit_tag t('.go'), class: 'btn btn-primary'
+
+ %h3
+ != t('.display_results', :segment => @segment)
+
+ %div.row
+ - [:posts, :comments, :aspect_memberships, :users].each do |name|
+ - model = eval("@#{name.to_s}")
+ - if name == :aspect_memberships
+ - name = t('.shares', :count => model[:yesterday])
+ - if name == :posts
+ - name = t('.posts', :count => model[:yesterday])
+ - if name == :comments
+ - name = t('.comments', :count => model[:yesterday])
+ - if name == :users
+ - name = t('.users', :count => model[:yesterday])
+
+ .span3
+ %h2{:style => 'font-weight:bold;'}
+ = name.to_s
+ %h4
+ = model[:day_before]
+ %span.percent_change{:class => (model[:change] > 0 ? "green" : "red")}
+ = "(#{model[:change]}%)"
+
+ %div.row
+ %div.span12
+ %p.alert.alert-info.text-center
+ != t('.current_segment', :post_yest => @posts[:yesterday]/@user_count.to_f, :post_day => @posts[:day_before]/@user_count.to_f)
+
+ %div.row
+ %div.span12
+ %h3= t('.50_most')
+ %ul
+ - @popular_tags.each do |name,count|
+ %li
+ != t('.tag_name', :name_tag => name, :count_tag => count)
diff --git a/app/views/admins/user_search.html.haml b/app/views/admins/user_search.html.haml
index 89f03e442..1db5ea218 100644
--- a/app/views/admins/user_search.html.haml
+++ b/app/views/admins/user_search.html.haml
@@ -1,49 +1,49 @@
-
-%div
- = render :partial => 'admins/admin_bar'
-
-%div.row
- %div.user_search.span9
- %h3= t('admins.admin_bar.user_search')
- = form_for @search, url: {action: 'user_search'}, html: {method: :get, class: 'form-horizontal'} do |f|
- %div.control-group
- = f.label :username, t('username'), class: 'control-label'
- %div.controls
- = f.text_field :username
-
- %div.control-group
- = f.label :email, t('email'), class: 'control-label'
- %div.controls
- = f.text_field :email
-
- %div.control-group
- = f.label :guid, t('admins.user_entry.guid'), class: 'control-label'
- %div.controls
- = f.text_field :guid
-
- %div.control-group
- %div.controls
- = f.label :under13 do
- = f.check_box :under13
- = t('.under_13')
- = submit_tag t('admins.stats.go')
-
- %div.more_invites.span3
- %h3= t('shared.invitations.invites')
-
- != t('.you_currently', :count => current_user.invitation_code.count, :link => link_to(t(".add_invites"), add_invites_path(current_user.invitation_code)))
-
- = form_tag 'admin_inviter', method: :get do
- = t('.email_to')
- = text_field_tag 'identifier'
- = submit_tag t('services.remote_friend.invite')
-
-%div.row
- %div.span12
- %div.alert.alert-info.text-center= t('.users', :count => @users.count)
-
-%div.row
- %div.users.span12
- %ul.media-list
- - @users.each do |user|
- = render partial: 'user_entry', locals: { user: user }
+.container
+ %div
+ = render :partial => 'admins/admin_bar'
+
+ %div.row
+ %div.user_search.span9
+ %h3= t('admins.admin_bar.user_search')
+ = form_for @search, url: {action: 'user_search'}, html: {method: :get, class: 'form-horizontal'} do |f|
+ %div.control-group
+ = f.label :username, t('username'), class: 'control-label'
+ %div.controls
+ = f.text_field :username
+
+ %div.control-group
+ = f.label :email, t('email'), class: 'control-label'
+ %div.controls
+ = f.text_field :email
+
+ %div.control-group
+ = f.label :guid, t('admins.user_entry.guid'), class: 'control-label'
+ %div.controls
+ = f.text_field :guid
+
+ %div.control-group
+ %div.controls
+ = f.label :under13 do
+ = f.check_box :under13
+ = t(".under_13")
+ = submit_tag t("admins.stats.go"), class: "btn btn-primary"
+
+ %div.more_invites.span3
+ %h3= t("shared.invitations.invites")
+
+ != t(".you_currently", count: current_user.invitation_code.count, link: link_to(t(".add_invites"), add_invites_path(current_user.invitation_code)))
+
+ = form_tag "admin_inviter", method: :get do
+ = t(".email_to")
+ = text_field_tag "identifier"
+ = submit_tag t("services.remote_friend.invite"), class: "btn btn-default"
+
+ %div.row
+ %div.span12
+ %div.alert.alert-info.text-center= t('.users', :count => @users.count)
+
+ %div.row
+ %div.users.span12
+ %ul.media-list
+ - @users.each do |user|
+ = render partial: 'user_entry', locals: { user: user }
diff --git a/app/views/admins/weekly_user_stats.haml b/app/views/admins/weekly_user_stats.haml
index 2a56d2b8d..47e5a1a81 100644
--- a/app/views/admins/weekly_user_stats.haml
+++ b/app/views/admins/weekly_user_stats.haml
@@ -1,17 +1,17 @@
+.container
+ %div
+ = render :partial => 'admins/admin_bar'
-%div
- = render :partial => 'admins/admin_bar'
+ %h2
+ = t('.current_server', date: Time.now.to_date)
-%h2
- = t('.current_server', date: Time.now.to_date)
+ %div.pull-right
+ = form_tag('/admins/weekly_user_stats', method: 'get', class: 'form-inline') do
+ = select_tag(:week, options_for_select(@created_users_by_week.keys.reverse), selected: @selected_week)
+ = submit_tag t('admins.stats.go'), class: 'btn btn-primary'
-%div.pull-right
- = form_tag('/admins/weekly_user_stats', method: 'get', class: 'form-inline') do
- = select_tag(:week, options_for_select(@created_users_by_week.keys), selected: @selected_week)
- = submit_tag t('admins.stats.go'), class: 'btn btn-primary'
-
-= t('.amount_of', count: @counter)
-%br
-- @created_users_by_week[@selected_week].each do |m|
- = link_to m, "/u/#{m}"
+ = t('.amount_of', count: @counter)
%br
+ - @created_users_by_week[@selected_week].each do |m|
+ = link_to m, "/u/#{m}"
+ %br
diff --git a/app/views/aspect_memberships/_add_to_aspect.haml b/app/views/aspect_memberships/_add_to_aspect.haml
deleted file mode 100644
index 8012ec4b7..000000000
--- a/app/views/aspect_memberships/_add_to_aspect.haml
+++ /dev/null
@@ -1,7 +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.
-
-
-= remove_from_aspect_button(aspect_id,person_id)
-
diff --git a/app/views/aspect_memberships/_aspect_membership_dropdown.html.haml b/app/views/aspect_memberships/_aspect_membership_dropdown.haml
index 49ec355ab..04650a4d8 100644
--- a/app/views/aspect_memberships/_aspect_membership_dropdown.html.haml
+++ b/app/views/aspect_memberships/_aspect_membership_dropdown.haml
@@ -1,5 +1,5 @@
.btn-group.aspect_dropdown.aspect_membership_dropdown
- %button.btn.btn-small.dropdown-toggle{:class => selected_aspects.size>0 ? "green" : "btn-default", "data-toggle" => "dropdown"}
+ %button.btn.dropdown-toggle{:class => button_class, "data-toggle" => "dropdown", :tabindex => '0'}
%span.text
- if selected_aspects.size == all_aspects.size
= t('all_aspects')
@@ -11,7 +11,7 @@
%ul.dropdown-menu{:class => ["pull-#{hang}", defined?(dropdown_class) && dropdown_class], :unSelectable => 'on', 'data-person_id' => (person.id if defined?(person) && person), 'data-service_uid' => (service_uid if defined?(service_uid)), 'data-person-short-name' => (person.first_name if defined?(person) && person)}
- for aspect in all_aspects
- %li.aspect_selector{ :class => ('selected' if aspect_membership_ids[aspect.id].present?), 'data-aspect_id' => aspect.id, 'data-membership_id' => aspect_membership_ids[aspect.id] }
+ %li.aspect_selector{ :class => ('selected' if aspect_membership_ids[aspect.id].present?), 'data-aspect_id' => aspect.id, 'data-membership_id' => aspect_membership_ids[aspect.id], :tabindex => '0' }
%a
%span.status_indicator
%i.icon-ok
diff --git a/app/views/aspect_memberships/_aspect_membership_dropdown.mobile.haml b/app/views/aspect_memberships/_aspect_membership_dropdown.mobile.haml
new file mode 100644
index 000000000..b7a8ffc1e
--- /dev/null
+++ b/app/views/aspect_memberships/_aspect_membership_dropdown.mobile.haml
@@ -0,0 +1,13 @@
+%div
+ %select{:name => 'user_aspects', :class => 'user_aspects', 'data-person-id' => @person.id}
+ %option{:value => 'list_cover', :class => 'list_cover', :disabled => 'true', :selected => 'true'}
+ = t("add_contact")
+ - contact = current_user.contact_for(@person)
+ - current_user.aspects.each do |aspect|
+ - if contact.try(:in_aspect?, aspect)
+ - membership_id = contact.aspect_memberships.where(:aspect_id => aspect.id).limit(1).pluck(:id).first
+ %option{:value => aspect.id, 'data-name' => aspect.name, 'data-membership_id' => membership_id, :class => 'selected'}
+ = "✓ #{t('shared.aspect_dropdown.mobile_row_checked', name: aspect.name)}"
+ - else
+ %option{:value => aspect.id, 'data-name' => aspect.name}
+ = "– #{t('shared.aspect_dropdown.mobile_row_unchecked', name: aspect.name)}"
diff --git a/app/views/aspect_memberships/_aspect_membership_dropdown_blueprint.html.haml b/app/views/aspect_memberships/_aspect_membership_dropdown_blueprint.html.haml
deleted file mode 100644
index baed2c0c3..000000000
--- a/app/views/aspect_memberships/_aspect_membership_dropdown_blueprint.html.haml
+++ /dev/null
@@ -1,19 +0,0 @@
-.dropdown{:class => ["hang_#{hang}", defined?(dropdown_class) && dropdown_class]}
- .button.toggle{:class => ("in_aspects" if selected_aspects.size > 0)}
- - if selected_aspects.size == all_aspects.size
- = t('all_aspects')
- - elsif selected_aspects.size == 1
- = selected_aspects.first.name
- - else
- = t('shared.aspect_dropdown.toggle', :count => selected_aspects.size)
- &#9660;
-
- .wrapper
- %ul.dropdown_list{:unSelectable => 'on', 'data-person_id' => (person.id if defined?(person) && person), 'data-service_uid' => (service_uid if defined?(service_uid)), 'data-person-short-name' => (person.first_name if defined?(person) && person)}
- - for aspect in all_aspects
- = aspect_dropdown_list_item(aspect, aspect_membership_ids[aspect.id] )
-
- - if (dropdown_may_create_new_aspect && defined?(person) && person)
- %li.newItem
- .add_aspect
- = link_to t('contacts.index.add_a_new_aspect'), new_aspect_path(:person_id => person.id, :remote => true), :rel => 'facebox'
diff --git a/app/views/aspect_memberships/_remove_from_aspect.haml b/app/views/aspect_memberships/_remove_from_aspect.haml
deleted file mode 100644
index 02a76b07c..000000000
--- a/app/views/aspect_memberships/_remove_from_aspect.haml
+++ /dev/null
@@ -1,7 +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.
-
-
-= aspect_membership_button(aspect, contact, person)
-
diff --git a/app/views/aspect_memberships/add_to_aspect.js.haml b/app/views/aspect_memberships/add_to_aspect.js.haml
deleted file mode 100644
index 86ad128d9..000000000
--- a/app/views/aspect_memberships/add_to_aspect.js.haml
+++ /dev/null
@@ -1,7 +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.
-
-
-= remove_from_aspect_button(@aspect_id,@person_id)
-
diff --git a/app/views/aspect_memberships/create.js.erb b/app/views/aspect_memberships/create.js.erb
deleted file mode 100644
index 69abb4b4b..000000000
--- a/app/views/aspect_memberships/create.js.erb
+++ /dev/null
@@ -1,20 +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.
-
-// TODO handle this completely in Backbone.js, then remove this view!
-
-var element = $(".add[data-aspect_id=<%= @aspect.id %>][data-person_id=<%= @contact.person_id%>]");
-
-if( $("#no_contacts").is(':visible') ) {
- $("#no_contacts").fadeOut(200);
-}
-
-element.parent().html("<%= escape_javascript(render('aspect_memberships/add_to_aspect', :aspect_id => @aspect.id, :person_id => @person.id)) %>");
-
-if($('#aspects_list').length == 1) {
- $('.aspect_list').attr('data-contact_id', "<%= @contact_id %>");
- $('.aspect_list ul').find('.add').each(function(a,b){$(b).attr('href', $(b).attr('href').replace('contacts','aspect_memberships'));})
-};
-
-element.fadeTo(200,1);
diff --git a/app/views/aspect_memberships/destroy.js.erb b/app/views/aspect_memberships/destroy.js.erb
deleted file mode 100644
index 8c7eb4106..000000000
--- a/app/views/aspect_memberships/destroy.js.erb
+++ /dev/null
@@ -1,10 +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.
-
-// TODO handle this completely in Backbone.js, then remove this view!
-
-var element = $(".added[data-aspect_id=<%= @aspect.id %>][data-person_id=<%= @contact.person_id%>]");
-element.parent().html("<%= escape_javascript(render('aspect_memberships/remove_from_aspect', :aspect => @aspect, :person => @contact.person, :contact => @contact)) %>");
-element.fadeTo(200,1);
-
diff --git a/app/views/aspect_memberships/remove_from_aspect.js.haml b/app/views/aspect_memberships/remove_from_aspect.js.haml
deleted file mode 100644
index a5ddc290c..000000000
--- a/app/views/aspect_memberships/remove_from_aspect.js.haml
+++ /dev/null
@@ -1,7 +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.
-
-
-= aspect_membership_button(aspect, person, contact)
-
diff --git a/app/views/aspects/_aspect_stream.haml b/app/views/aspects/_aspect_stream.haml
index 46528920c..87e6af915 100644
--- a/app/views/aspects/_aspect_stream.haml
+++ b/app/views/aspects/_aspect_stream.haml
@@ -6,7 +6,7 @@
%h3#aspect_stream_header.stream_title
= stream.title
-= render 'publisher/publisher', :selected_aspects => stream.aspects, :aspect_ids => stream.aspect_ids, :aspect => stream.aspect
+= render 'publisher/publisher', publisher_aspects_for(stream)
= render 'aspects/no_posts_message'
#gs-shim{:title => popover_with_close_html("3. #{t('.stay_updated')}"), 'data-content' => t('.stay_updated_explanation')}
diff --git a/app/views/aspects/_no_contacts_message.haml b/app/views/aspects/_no_contacts_message.haml
index 30aa0d3bd..a3977ddc1 100644
--- a/app/views/aspects/_no_contacts_message.haml
+++ b/app/views/aspects/_no_contacts_message.haml
@@ -7,5 +7,6 @@
%br
%br
= t('.try_adding_some_more_contacts')
- != t('.or_spotlight', :link => link_to(t(".community_spotlight") , community_spotlight_path))
+ - if AppConfig.settings.community_spotlight.enable?
+ != t('.or_spotlight', :link => link_to(t(".community_spotlight") , community_spotlight_path))
diff --git a/app/views/aspects/create.js.erb b/app/views/aspects/create.js.erb
index 71976d074..0004d8e52 100644
--- a/app/views/aspects/create.js.erb
+++ b/app/views/aspects/create.js.erb
@@ -12,6 +12,8 @@ if( app.aspectMemberships ) {
app.aspectMemberships.dropdown = dropdown;
app.aspectMemberships.updateSummary();
- $.facebox.close();
$('#profile .dropdown').toggleClass("active");
}
+
+$.facebox.close();
+app.events.trigger('aspect:create', "<%= escape_javascript(@aspect.id) =>");
diff --git a/app/views/aspects/edit.html.haml b/app/views/aspects/edit.html.haml
deleted file mode 100644
index f2c2d7d75..000000000
--- a/app/views/aspects/edit.html.haml
+++ /dev/null
@@ -1,24 +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.
-
-#aspect_edit_pane
- #facebox_header{:data=>{:guid=>@aspect.id}}
- %h3#aspect_name_title
- %span.name= @aspect
- %span.tiny_text
- = link_to t('.rename'), '#', :id => 'rename_aspect_link'
-
- #aspect_name_edit.hidden
- = form_for @aspect, :remote => true do |aspect|
- = aspect.text_field :name, :maxlength => 20
- = aspect.submit t('.update'), 'data-disable-with' => t('.updating'), :class => 'btn'
-
- - if @contacts.count > 0
- = render 'shared/contact_list', :aspect => @aspect, :contacts => @contacts
-
- .bottom_submit_section
- = button_to t('delete'), @aspect, :method => "delete", :data => { :confirm => t('.confirm_remove_aspect') }, :class => 'btn delete'
- = aspect_visibility_link(@aspect)
- = submit_tag t('.done'), :class => 'btn creation', :rel => 'close'
-
diff --git a/app/views/aspects/new.haml b/app/views/aspects/new.haml
index 82a90bdb3..54d1ffae9 100644
--- a/app/views/aspects/new.haml
+++ b/app/views/aspects/new.haml
@@ -2,27 +2,25 @@
-# licensed under the Affero General Public License version 3 or later. See
-# the COPYRIGHT file.
--# TODO: remove Blueprint classes when everything is ported to Bootstrap
+-# Using row to enforce a non-percentual width on span6
+.row
+ .span6
+ #facebox_header
+ %h3
+ = t('contacts.index.add_a_new_aspect')
-.span6.span-12.last
- #facebox_header
- %h3
- = t('contacts.index.add_a_new_aspect')
+ = form_for(Aspect.new, :remote => @remote) do |aspect|
+ = aspect.error_messages
+ - if @person_id
+ = aspect.hidden_field :person_id, :value => @person_id
+ %p
+ = aspect.label :name , t('.name')
+ = aspect.text_field :name, :maxlength => 20
- = form_for(Aspect.new, :remote => @remote) do |aspect|
- = aspect.error_messages
- - if @person_id
- = aspect.hidden_field :person_id, :value => @person_id
- %p
- = aspect.label :name , t('.name')
- = aspect.text_field :name, :maxlength => 20
+ %p.checkbox_select
+ = aspect.check_box :contacts_visible, :checked => false, class: 'checkbox'
+ = aspect.label :contacts_visible, t('aspects.edit.make_aspect_list_visible')
- %p.checkbox_select
- = aspect.check_box :contacts_visible, :checked => false, class: 'checkbox'
- = aspect.label :contacts_visible, t('aspects.edit.make_aspect_list_visible')
-
- %br
-
- .bottom_submit_section
- = submit_tag t('cancel'), :class => 'button btn', :type => :reset, :rel => "close"
- = aspect.submit t('.create'), :class => 'button btn creation'
+ .bottom_submit_section
+ = submit_tag t('cancel'), :class => 'btn', :type => :reset, :rel => "close"
+ = aspect.submit t('.create'), :class => 'btn creation'
diff --git a/app/views/aspects/toggle_contact_visibility.js.erb b/app/views/aspects/toggle_contact_visibility.js.erb
deleted file mode 100644
index 1470cadb1..000000000
--- a/app/views/aspects/toggle_contact_visibility.js.erb
+++ /dev/null
@@ -1,15 +0,0 @@
-$(document).ready(function() {
-
- var padlockImg = $(".contact_visibility_padlock");
- var linkText = $(".contact_visibility_link");
-
- if (padlockImg.hasClass('icons-padlock-open')) {
- padlockImg.removeClass('icons-padlock-open');
- padlockImg.addClass('icons-padlock-closed');
- linkText.attr('title', "<%= t('aspects.edit.aspect_list_is_not_visible') %>");
- } else {
- padlockImg.removeClass('icons-padlock-closed');
- padlockImg.addClass('icons-padlock-open');
- linkText.attr('title', "<%= t('aspects.edit.aspect_list_is_visible') %>");
- }
-});
diff --git a/app/views/comments/index.mobile.haml b/app/views/comments/index.mobile.haml
index 76dde1db8..b644ae77a 100644
--- a/app/views/comments/index.mobile.haml
+++ b/app/views/comments/index.mobile.haml
@@ -1,14 +1 @@
-.comment_container
- .post_stats
- %span.comment_count
- = @post.comments.size
- %span.like_count
- = @post.likes.size
-
- %ul.comments
- = render :partial => 'comments/comment', :collection => @comments, :locals => {:post => @post}
-
- %li.comment.add_comment_bottom_link_container
- = link_to "#", :class => "show_comments bottom_collapse active" do
- = image_tag 'icons/arrow_up_small.png'
- = link_to t('comments.new_comment.comment'), new_post_comment_path(@post), :class => 'add_comment_bottom_link btn comment_action inactive'
+= render :partial => 'shared/post_stats', :locals => { :post => @post} \ No newline at end of file
diff --git a/app/views/community_spotlight/_user.html.haml b/app/views/community_spotlight/_user.html.haml
deleted file mode 100644
index 3b7ae837d..000000000
--- a/app/views/community_spotlight/_user.html.haml
+++ /dev/null
@@ -1,13 +0,0 @@
-.user_card
- = person_image_link(person, :size => :thumb_large)
- %h4
- = person.name
-
- .tags
- - person.tags.each do |tag|
- = link_to "##{tag}", tag_path(:name => tag.name)
-
- .add_user_to_aspect
- = render :partial => 'people/relationship_action',
- :locals => { :person => person, :contact => current_user.contact_for(person),
- :current_user => current_user }
diff --git a/app/views/contacts/_aspect_listings.haml b/app/views/contacts/_aspect_listings.haml
index bdad07996..a9b9be9b8 100644
--- a/app/views/contacts/_aspect_listings.haml
+++ b/app/views/contacts/_aspect_listings.haml
@@ -1,36 +1,31 @@
--# Copyright (c) 2010-2011, Diaspora Inc. This file is
--# licensed under the Affero General Public License version 3 or later. See
--# the COPYRIGHT file.
+#aspect_nav
+ %ul.nav.nav-tabs.nav-stacked
+ %li.all_contacts{:class => ("active" if params["set"] == "all")}
+ %a{:href => contacts_path(:set => "all")}
+ = t('contacts.index.all_contacts')
+ .badge.badge-default.pull-right
+ = all_contacts_count
-%ul#aspect_nav
- %li.all_aspects{:class => ("active" if params["set"] != "all" && params["set"] != "only_sharing" && !@spotlight)}
- %a.home_selector.hoverable{:href => contacts_path, :class => ("sub_selected" if params["a_id"])}
- = t('contacts.index.my_contacts')
- .label.pull-right
- = my_contacts_count
+ %li.all_aspects{:class => ("active" if !params["set"] && !params["a_id"] && !@spotlight)}
+ %a{:href => contacts_path}
+ = t('contacts.index.my_contacts')
+ .badge.badge-default.pull-right
+ = my_contacts_count
- %ul.sub_nav#aspects_list
- - all_aspects.each do |aspect|
- %li.hoverable{:data => {:aspect_id => aspect.id}, :class => ("active" if params["a_id"].to_i == aspect.id)}
- .label.pull-right
+ - all_aspects.each do |aspect|
+ %li.aspect{:data => {:aspect_id => aspect.id}, :class => ("active" if params["a_id"].to_i == aspect.id)}
+ %a{:href => contacts_path(:a_id => aspect.id)}
+ .badge.badge-default.pull-right
= aspect.contacts.size
- .icons-check_yes_ok{:class => ("selected" if params["a_id"].to_i == aspect.id) }
- %a.selectable{:href => contacts_path(:a_id => aspect.id)}
+ .name
= aspect
- %li.hoverable
- = link_to t('aspects.aspect_listings.add_an_aspect'), new_aspect_path, :class => "selectable new_aspect", :rel => "facebox"
+ %li.new_aspect
+ %a{:href => new_aspect_path, :rel => "facebox"}
+ = t('aspects.aspect_listings.add_an_aspect')
- %li.all_contacts{:class => ("active" if params["set"] == "all" || params["set"] == "only_sharing")}
- %a.home_selector.hoverable{:href => contacts_path(:set => "all"), :class => ("sub_selected" if params["set"] == "only_sharing")}
- = t('contacts.index.all_contacts')
- .label.pull-right
- = all_contacts_count
-
- %ul.sub_nav
- %li.hoverable{:class => ("active" if params["set"] == "only_sharing")}
- .icons-check_yes_ok{:class => ("invisible" if params["set"] == "only_sharing")}
- %a.selectable{:href => contacts_path(:set => "only_sharing")}
- = t('contacts.index.only_sharing_with_me')
- .label.pull-right
- = only_sharing_count
+ %li.only_sharing{:class => ("active" if params["set"] == "only_sharing")}
+ %a{:href => contacts_path(:set => "only_sharing")}
+ = t('contacts.index.only_sharing_with_me')
+ .badge.badge-default.pull-right
+ = only_sharing_count
diff --git a/app/views/contacts/_contact.html.haml b/app/views/contacts/_contact.html.haml
deleted file mode 100644
index bc7a9756f..000000000
--- a/app/views/contacts/_contact.html.haml
+++ /dev/null
@@ -1,10 +0,0 @@
-.stream_element{:id => contact.person_id}
- .media
- .pull-right
- = contact_aspect_dropdown(contact)
- .img
- = person_image_link(contact.person, :size => :thumb_small)
- .bd
- = person_link(contact.person)
- .info
- = contact.person_diaspora_handle
diff --git a/app/views/contacts/_header.html.haml b/app/views/contacts/_header.html.haml
new file mode 100644
index 000000000..6d879c1ab
--- /dev/null
+++ b/app/views/contacts/_header.html.haml
@@ -0,0 +1,42 @@
+.header
+ - if @aspect
+ #aspect_controls.pull-right
+ - if @aspect.contacts.size > 0 && @aspect.contacts.size < 20
+ = start_a_conversation_link(@aspect, @aspect.contacts.size)
+
+ = link_to aspect_toggle_contact_visibility_path(@aspect), id: "contacts_visibility_toggle", class: "contacts_button", method: :put, remote: true do
+ -if @aspect.contacts_visible?
+ %i.entypo.lock-open.contacts-header-icon{:title => t('aspects.edit.aspect_list_is_visible')}
+ -else
+ %i.entypo.lock.contacts-header-icon{:title => t('aspects.edit.aspect_list_is_not_visible')}
+
+ -if AppConfig.chat.enabled?
+ = link_to aspect_toggle_chat_privilege_path(@aspect), id: "chat_privilege_toggle", class: "contacts_button", method: :put, remote: true do
+ -if @aspect.chat_enabled?
+ %i.entypo.chat.enabled.contacts-header-icon{:title => t('aspects.edit.aspect_chat_is_enabled')}
+ -else
+ %i.entypo.chat.contacts-header-icon{:title => t('aspects.edit.aspect_chat_is_not_enabled')}
+
+ = link_to @aspect, method: "delete", data: { confirm: t('aspects.edit.confirm_remove_aspect') }, class: 'delete contacts_button', id: 'delete_aspect' do
+ %i.entypo.trash.contacts-header-icon{:title => t('delete')}
+ .pull-right
+ = search_field_tag :contact_search, "", id: "contact_list_search", class: "search-query", placeholder: t('contacts.index.user_search')
+ %h3
+ %span#aspect_name
+ = @aspect.name
+ %span#change_aspect_name.contacts_button
+ %i.entypo.pencil.contacts-header-icon{:title => t('aspects.edit.rename')}
+ #aspect_name_form
+ = form_for @aspect, :remote => true do |aspect|
+ = aspect.text_field :name, :maxlength => 20
+ = aspect.submit t('aspects.edit.update'), 'data-disable-with' => t('aspects.edit.updating'), :class => "btn"
+
+ - else
+ %h3
+ - case params["set"]
+ - when "only_sharing"
+ = t('contacts.index.only_sharing_with_me')
+ - when "all"
+ = t('contacts.index.all_contacts')
+ - else
+ = t('contacts.index.my_contacts')
diff --git a/app/views/contacts/_sidebar.html.haml b/app/views/contacts/_sidebar.html.haml
new file mode 100644
index 000000000..45d14e1ce
--- /dev/null
+++ b/app/views/contacts/_sidebar.html.haml
@@ -0,0 +1,14 @@
+%h3
+ = t('contacts.index.title')
+= render 'contacts/aspect_listings'
+%hr
+- if AppConfig.settings.community_spotlight.enable?
+ .text-center.spotlight
+ = link_to t('contacts.spotlight.community_spotlight'), community_spotlight_path, :class => "btn btn-link"
+.text-center
+ .btn.btn-link{ 'data-toggle' => 'modal', 'data-target' => '#invitationsModal'}
+ = t('invitations.new.invite_someone_to_join')
+ = render 'shared/modal',
+ :path => new_user_invitation_path,
+ :id => 'invitationsModal',
+ :title => t('invitations.new.invite_someone_to_join')
diff --git a/app/views/contacts/index.html.haml b/app/views/contacts/index.html.haml
index 0fc1a81c9..44d6232b6 100644
--- a/app/views/contacts/index.html.haml
+++ b/app/views/contacts/index.html.haml
@@ -1,49 +1,36 @@
--# 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 :page_title do
= t('.title')
-- content_for :head do
- = javascript_include_tag :people
-
-.row
- .span12
- #section_header
- %h3
- = t('.title')
+.container-fluid#contacts_container
+ .row-fluid
+ .span3
+ = render 'contacts/sidebar'
-.row
- = render 'shared/contact_sidebar'
+ .span9
+ #people_stream.stream.contacts
+ = render 'contacts/header'
- .span9
- #people_stream.stream.contacts
- - if @aspect
- #aspect_controls
- - if @contacts_size > 0 && @contacts_size < 20
- = start_a_conversation_link(@aspect, @contacts_size)
- = link_to edit_aspect_path(@aspect), rel: "facebox", class: "btn" do
- = t('aspects.edit.manage')
- %span.modify_aspect
- = aspect_visibility_link(@aspect)
- = link_to @aspect, method: "delete", data: { confirm: t('aspects.edit.confirm_remove_aspect') }, class: 'btn delete' do
- = t('delete')
- %span.icons-monotone_close_exit_delete
+ - if @contacts_size > 0
+ - if @aspect && @aspect.contacts.length == 0
+ .well
+ = t('.no_contacts_in_aspect')
+ #contact_stream
+ -# JS
- - if @contacts_size > 0
- = render @contacts
-
- = will_paginate @contacts
- - else
- .no_contacts
- %h3
- = t('.no_contacts')
- %p
- - if @aspect
- != t('.no_contacts_message_with_aspect',
- :community_spotlight => link_to(t('.community_spotlight'), community_spotlight_path),
- :add_to_aspect_link => link_to(t('.add_to_aspect_link', :name => @aspect.name), edit_aspect_path(@aspect), :rel => "facebox"))
- - else
+ - else
+ .no_contacts
+ %h3
+ = t('.no_contacts')
+ %p
!= t('.no_contacts_message',
:community_spotlight => link_to(t('.community_spotlight'), community_spotlight_path))
+ %p
+ .btn.btn-link{ 'data-toggle' => 'modal', 'data-target' => '#invitationsModal'}
+ = t('invitations.new.invite_someone_to_join')
+
+-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'
diff --git a/app/views/contacts/index.mobile.haml b/app/views/contacts/index.mobile.haml
index 788a116d8..3bf6e537e 100644
--- a/app/views/contacts/index.mobile.haml
+++ b/app/views/contacts/index.mobile.haml
@@ -5,9 +5,6 @@
- content_for :page_title do
= t('.title')
-- content_for :head do
- = javascript_include_tag :people
-
#section_header
%h2
= t('.title')
diff --git a/app/views/contacts/sharing.haml b/app/views/contacts/sharing.haml
deleted file mode 100644
index b35f3fa1a..000000000
--- a/app/views/contacts/sharing.haml
+++ /dev/null
@@ -1,30 +0,0 @@
--# Copyright (c) 2010-2011, Diaspora Inc. This file is
--# licensed under the Affero General Public License version 3 or later. See
--# the COPYRIGHT file.
-
-#aspect_edit_pane
- #facebox_header
- .right
- = t('contacts', :count =>@contacts.count)
-
- %h3#aspect_name_title
- %span.name= t('.people_sharing')
-
- - if @contacts.count > 0
- .contact_list
- = search_field_tag :contact_search, "", :id => 'contact_list_search', :class => 'contact_list_search', :results => 5, :placeholder => "People sharing with you"
- %ul
- - for contact in @contacts
- %li{:data=>{:contact_id=>contact.id}}
- = person_image_tag contact.person
- %h4.name
- = link_to contact.person_name, contact.person
- .description
- = contact.person_diaspora_handle
-
- .right
- = aspect_membership_dropdown(contact, contact.person, 'right')
-
- %br
- %div{:style => "text-align:right;"}
- = link_to t('aspects.edit.done'), '#', :class => 'btn', :rel => 'close'
diff --git a/app/views/contacts/spotlight.haml b/app/views/contacts/spotlight.haml
index 53c8515ea..3b69b12f0 100644
--- a/app/views/contacts/spotlight.haml
+++ b/app/views/contacts/spotlight.haml
@@ -1,31 +1,25 @@
--# 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 :page_title do
= t('contacts.spotlight.community_spotlight')
-- content_for :head do
- = javascript_include_tag :people
-
-.row
- .span12
- #section_header
- %h3
- = t('contacts.index.title')
-.row
- = render 'shared/contact_sidebar'
+.container-fluid#contacts_container
+ .row-fluid
+ .span3
+ = render 'contacts/sidebar'
- .span9
- - if AppConfig.settings.community_spotlight.suggest_email.present?
- .right
- = link_to t('contacts.spotlight.suggest_member'), "mailto:#{AppConfig.settings.community_spotlight.suggest_email}", :class => "button"
+ .span9
+ #people_stream.stream.contacts
+ .header
+ - if AppConfig.settings.community_spotlight.suggest_email.present?
+ .pull-right
+ = link_to t('contacts.spotlight.suggest_member'), "mailto:#{AppConfig.settings.community_spotlight.suggest_email}", :class => "btn btn-default", :id => "suggest_member"
+ %h3
+ = t('contacts.spotlight.community_spotlight')
- %h3
- = t('contacts.spotlight.community_spotlight')
+ #community_spotlight
+ - unless @people.blank?
+ - @people.each do |person|
+ = render 'people/person', :person => person, :contact => current_user.contact_for(person)
- #community_spotlight
- - unless @people.blank?
- - @people.each do |person|
- = render 'community_spotlight/user', :person => person
+ -# if @contacts_size > 0
+ = render @contacts
diff --git a/app/views/conversations/_conversation.haml b/app/views/conversations/_conversation.haml
index 97077e322..0fa3d5cff 100644
--- a/app/views/conversations/_conversation.haml
+++ b/app/views/conversations/_conversation.haml
@@ -3,7 +3,7 @@
-# the COPYRIGHT file.
.conversation-wrapper{ :"data-conversation-path" => conversation_path(conversation) }
- .stream_element.conversation{:data=>{:guid=>conversation.id}, :class => ('unread' if unread_counts[conversation.id].to_i > 0)}
+ .stream_element.conversation{:data=>{:guid=>conversation.id}, :class => conversation_class(conversation, unread_counts[conversation.id].to_i, selected_conversation_id)}
.media
.img
- other_participants = ordered_participants[conversation.id] - [current_user.person]
@@ -30,7 +30,8 @@
= authors[conversation.id].name
.last_message
- if conversation.messages.present?
- = '»' + conversation.messages.last.text + '«'
+ %em
+ = conversation.messages.last.text
- if other_participants.count > 1
.participants
- other_participants.drop(1).take(15).each do |participant|
diff --git a/app/views/conversations/_new.haml b/app/views/conversations/_new.haml
new file mode 100644
index 000000000..bc5a559f5
--- /dev/null
+++ b/app/views/conversations/_new.haml
@@ -0,0 +1,18 @@
+= form_for Conversation.new, html: {class: "form-horizontal form_do_not_clear"}, remote: true do |conversation|
+ .control-group
+ %label.control-label{:for => 'contact_ids'}
+ = t('.to')
+ .controls
+ = text_field_tag "contact_autocomplete"
+ .control-group
+ %label.control-label{:for => 'conversation_subject'}
+ = t('.subject')
+ .controls
+ = conversation.text_field :subject, :class => 'input-block-level'
+ .control-group
+ .controls
+ = text_area_tag "conversation[text]", '', :rows => 5, :class => 'input-block-level'
+ .control-group
+ .controls
+ .pull-right
+ = conversation.submit t('.send'), 'data-disable-with' => t('.sending'), :class => 'btn btn-primary creation'
diff --git a/app/views/conversations/_show.haml b/app/views/conversations/_show.haml
index 4609379fd..122f2e1ce 100644
--- a/app/views/conversations/_show.haml
+++ b/app/views/conversations/_show.haml
@@ -3,12 +3,21 @@
-# the COPYRIGHT file.
.conversation_participants
- = link_to(content_tag(:div, nil, :class => 'icons-deletelabel'),
- conversation_visibility_path(conversation),
- :method => 'delete',
- :data => { :confirm => "#{t('.delete')}?" },
- :title => t('.delete'),
- :class => 'close_conversation')
+ .control-icons.pull-right
+ - if conversation.participants.count > 1
+ = link_to(content_tag(:i, nil, :class => 'entypo cross'),
+ conversation_visibility_path(conversation),
+ :method => 'delete',
+ :data => { :confirm => "#{t('.hide')}?" },
+ :title => t('.hide'),
+ :class => 'hide_conversation')
+ - else
+ = link_to(content_tag(:i, nil, :class => 'entypo trash'),
+ conversation_visibility_path(conversation),
+ :method => 'delete',
+ :data => { :confirm => "#{t('.delete')}?" },
+ :title => t('.delete'),
+ :class => 'delete_conversation')
%h3{ :class => direction_for(conversation.subject) }
= conversation.subject
@@ -27,4 +36,4 @@
.bd
= form_for [conversation, Message.new] do |message|
= message.text_area :text, :class => 'span12', :rows => 5, :tabindex => 1
- = message.submit t('.reply').capitalize, 'data-disable-with' => t('.replying'), :class => 'btn btn-primary creation', :tabindex => 2
+ = message.submit t('.reply').capitalize, 'data-disable-with' => t('.replying'), class: 'btn btn-primary pull-right creation', tabindex: 2
diff --git a/app/views/conversations/index.haml b/app/views/conversations/index.haml
index 5252844ec..ecbcb6aff 100644
--- a/app/views/conversations/index.haml
+++ b/app/views/conversations/index.haml
@@ -1,41 +1,38 @@
--# 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 :inbox
- content_for :page_title do
= t('.conversations_inbox')
-.container-fluid.conversations_container
+.container-fluid#conversations_container
.row-fluid
.span4
#left_pane
#left_pane_header
%h3
- .pull-right
- = link_to t('.new_conversation'), new_conversation_path, :class => 'btn btn-default', :rel => 'facebox'
+ .pull-right{ :class => ("hidden" unless @conversation)}
+ = link_to t('.new_conversation'), conversations_path, :class => 'btn btn-default'
= t('.inbox')
#conversation_inbox
.stream.conversations
- if @conversations.count > 0
- = render :partial => 'conversations/conversation', :collection => @conversations, :locals => {:authors => @authors, :ordered_participants => @ordered_participants, :unread_counts => @unread_counts}
+ = render :partial => 'conversations/conversation', :collection => @conversations, :locals => {:authors => @authors, :ordered_participants => @ordered_participants, :unread_counts => @unread_counts, :selected_conversation_id => @conversation.try(:id)}
- else
#no_conversations
= t('.no_messages')
- = will_paginate @conversations, :renderer => WillPaginate::ActionView::BootstrapLinkRenderer
-
+ = will_paginate @conversations, :previous_label => '&laquo;', :next_label => '&raquo;', :inner_window => 1, :renderer => WillPaginate::ActionView::BootstrapLinkRenderer
.span8
- .stream_container
- #conversation_show
- - if @conversation
+ - if @conversation
+ .stream_container
+ #conversation_show
= render 'conversations/show', :conversation => @conversation
- - else
- #no_conversation_text
- = t('.no_conversation_selected')
- #no_conversation_controls
- = link_to t('.create_a_new_conversation'), new_conversation_path, :rel => 'facebox'
+ - else
+ .stream_container.hidden
+ #conversation_show
+ #conversation_new.row-fluid
+ %h3.text-center
+ = t('conversations.index.new_conversation')
+ .span10.offset
+ = render 'conversations/new'
diff --git a/app/views/conversations/index.mobile.haml b/app/views/conversations/index.mobile.haml
index eb1f5f0ce..57341e0d5 100644
--- a/app/views/conversations/index.mobile.haml
+++ b/app/views/conversations/index.mobile.haml
@@ -27,4 +27,4 @@
%i
= t('.no_messages')
- = will_paginate @conversations, :renderer => WillPaginate::ActionView::BootstrapLinkRenderer
+ = will_paginate @conversations, :previous_label => '&laquo;', :next_label => '&raquo;', :inner_window => 1, :outer_window => 0, :renderer => WillPaginate::ActionView::BootstrapLinkRenderer
diff --git a/app/views/conversations/new.html.haml b/app/views/conversations/new.html.haml
new file mode 100644
index 000000000..8462a3990
--- /dev/null
+++ b/app/views/conversations/new.html.haml
@@ -0,0 +1,11 @@
+:javascript
+ $(document).ready(function () {
+ var data = $.parseJSON( "#{escape_javascript(@contacts_json)}" );
+ new app.views.ConversationsForm({
+ contacts: data,
+ prefillName: "#{h params[:name]}",
+ prefillValue: "#{@contact_ids}"
+ });
+ });
+
+= render 'conversations/new'
diff --git a/app/views/conversations/new.haml b/app/views/conversations/new.mobile.haml
index 4d65275cd..160059c8d 100644
--- a/app/views/conversations/new.haml
+++ b/app/views/conversations/new.mobile.haml
@@ -2,9 +2,7 @@
-# licensed under the Affero General Public License version 3 or later. See
-# the COPYRIGHT file.
-- if in_mobile_view?
- = javascript_include_tag :jquery
- = javascript_include_tag :mobile
+= javascript_include_tag :jquery
:javascript
$(document).ready(function () {
diff --git a/app/views/conversations/show.js.erb b/app/views/conversations/show.js.erb
index 743b2197e..70e2a0ed5 100644
--- a/app/views/conversations/show.js.erb
+++ b/app/views/conversations/show.js.erb
@@ -1,22 +1,11 @@
+if($('.stream_container').hasClass('hidden')){
+ $('#conversation_new').hide();
+ $('.stream_container').removeClass('hidden');
+ $('#left_pane_header .pull-right').removeClass('hidden');
+}
+
$('#conversation_show').html("<%= escape_javascript(render('conversations/show', :conversation => @conversation)) %>");
$(".stream_element", "#conversation_inbox").removeClass('selected');
$(".stream_element[data-guid='<%= @conversation.id %>']", "#conversation_inbox").addClass('selected');
-$(".stream_element[data-guid='<%= @conversation.id %>']", "#conversation_inbox").find(".unread_message_count").remove()
-
-$('time.timeago').each(function(i,e) {
- var jqe = $(e);
- jqe.attr('data-original-title', new Date(jqe.attr('datetime')).toLocaleString());
-});
-
-if ($('#first_unread') > 0) {
- $("html").scrollTop($('#first_unread').offset().top-45);
-}
-
-$(".timeago").tooltip();
-$("time.timeago").timeago();
-
-$('time.timeago').each(function(i,e) {
- var jqe = $(e);
- jqe.attr('title', '');
-});
+$('#conversation_show').trigger("conversation:loaded");
diff --git a/app/views/devise/passwords/edit.haml b/app/views/devise/passwords/edit.haml
new file mode 100644
index 000000000..779b9be0a
--- /dev/null
+++ b/app/views/devise/passwords/edit.haml
@@ -0,0 +1,31 @@
+- content_for :page_title do
+ = "#{AppConfig.settings.pod_name} - #{t('devise.passwords.edit.change_password')}"
+
+#reset_password
+ .container-fluid
+ .text-center
+ .branding-asterisk
+ %h1
+ = AppConfig.settings.pod_name
+
+ = form_for(resource, as: resource_name, url: password_path(resource_name), html: {class: "form-horizontal block-form", method: :put }, autocomplete: 'off') do |f|
+ = f.error_messages
+
+ %fieldset
+ %label{for: "user_password"}
+ = t('devise.passwords.edit.new_password')
+ %i.entypo.lock
+ = f.password_field :password, class: "input-block-level form-control", required: true, placeholder: t('devise.passwords.edit.new_password'), autocapitalize: "none", autocorrect: "off", autofocus: true
+
+ = f.hidden_field :reset_password_token
+
+ %label{for: "user_password_confirmation"}
+ = t('devise.passwords.edit.confirm_password')
+ %i.entypo.lock
+ = f.password_field :password_confirmation, class: "input-block-level form-control", required: true, placeholder: t('devise.passwords.edit.confirm_password'), autocapitalize: "none", autocorrect: "off"
+
+ = hidden_field(:user, :remember_me, value: 1)
+ = f.submit t('devise.passwords.edit.change_password'), class: "btn btn-block"
+
+ .text-center
+ = link_to t('devise.shared.links.sign_in'), new_session_path(resource_name)
diff --git a/app/views/passwords/edit.mobile.haml b/app/views/devise/passwords/edit.mobile.haml
index db592f77c..18c97e636 100644
--- a/app/views/passwords/edit.mobile.haml
+++ b/app/views/devise/passwords/edit.mobile.haml
@@ -10,20 +10,20 @@
= f.hidden_field :reset_password_token
%fieldset
%legend
- =t('.change_password')
+ =t('devise.passwords.edit.change_password')
.control-group
- = f.label :password, t('password'), :class => "control-label"
+ = f.label :password, t('devise.passwords.edit.new_password'), :class => "control-label"
.controls
= f.password_field :password
.control-group
- = f.label :password_confirmation, t('password_confirmation'), :class => "control-label"
+ = f.label :password_confirmation, t('devise.passwords.edit.confirm_password'), :class => "control-label"
.controls
= f.password_field :password_confirmation
.controls
- = f.submit t('.change_password'), :class => 'btn primary'
+ = f.submit t('devise.passwords.edit.change_password'), :class => 'btn primary'
%footer
= link_to t('layouts.application.toggle'), toggle_mobile_path
diff --git a/app/views/devise/passwords/new.haml b/app/views/devise/passwords/new.haml
new file mode 100644
index 000000000..286a29d50
--- /dev/null
+++ b/app/views/devise/passwords/new.haml
@@ -0,0 +1,24 @@
+- content_for :page_title do
+ = "#{AppConfig.settings.pod_name} - #{t('devise.passwords.new.forgot_password')}"
+
+#forgot_password
+ .container-fluid
+ .text-center
+ .branding-asterisk
+ %h1
+ = AppConfig.settings.pod_name
+
+ = form_for(resource, as: resource_name, url: password_path(resource_name), html: {class: "form-horizontal block-form"}, autocomplete: 'off') do |f|
+ - if !devise_error_messages!.empty?
+ %legend
+ %i
+ = t('devise.passwords.new.no_account') # this is an error message and should not be displayed as a legend
+ %fieldset
+ %label{for: "user_email"}
+ = t('devise.passwords.new.email')
+ %i.entypo.mail
+ = f.text_field :email, class: "input-block-level form-control", required: true, autocapitalize: "off", placeholder: t('devise.passwords.new.email'), autocorrect: "off", autofocus: true
+ = f.submit t('devise.passwords.new.send_password_instructions'), class: "btn btn-block"
+
+ .text-center
+ = link_to t('devise.shared.links.sign_in'), new_session_path(resource_name)
diff --git a/app/views/passwords/new.mobile.haml b/app/views/devise/passwords/new.mobile.haml
index ea60939b3..dee951b4e 100644
--- a/app/views/passwords/new.mobile.haml
+++ b/app/views/devise/passwords/new.mobile.haml
@@ -8,17 +8,17 @@
= form_for(resource, :as => resource_name, :url => password_path(resource_name)) do |f|
%fieldset
%legend
- =t('.forgot_password')
+ =t('devise.passwords.new.forgot_password')
- unless devise_error_messages!.empty?
- %i= t('.no_account')
+ %i= t('devise.passwords.new.no_account')
.control-group
- = f.label :email, t('email'), :class => "control-label"
+ = f.label :email, t('devise.passwords.new.email'), :class => "control-label"
.controls
= f.text_field :email
.controls
- = f.submit t('.send_password_instructions'), :class => 'btn'
+ = f.submit t('devise.passwords.new.send_password_instructions'), :class => 'btn'
%footer
- if display_registration_link?
diff --git a/app/views/errors/error_404.haml b/app/views/errors/error_404.haml
new file mode 100644
index 000000000..e66451207
--- /dev/null
+++ b/app/views/errors/error_404.haml
@@ -0,0 +1,10 @@
+- content_for(:page_title) do
+ The page you were looking for doesn't exist (404)
+
+#big-number.transparent
+ 404
+%p
+ These are not the kittens you're looking for. Move along.
+%p
+ %a{href: "javascript:history.back()"}
+ Go Back?
diff --git a/app/views/errors/error_422.haml b/app/views/errors/error_422.haml
new file mode 100644
index 000000000..f602b05d0
--- /dev/null
+++ b/app/views/errors/error_422.haml
@@ -0,0 +1,8 @@
+- content_for(:page_title) do
+ The change you wanted was rejected (422)
+
+.dialog
+ %h1
+ The change you wanted was rejected.
+ %p
+ Maybe you tried to change something you didn't have access to.
diff --git a/app/views/errors/error_500.haml b/app/views/errors/error_500.haml
new file mode 100644
index 000000000..c7bee9257
--- /dev/null
+++ b/app/views/errors/error_500.haml
@@ -0,0 +1,10 @@
+- content_for(:page_title) do
+ We're sorry, but something went wrong (500)
+
+%header
+ = image_tag "branding/white2x.png", id: "diaspora_logo"
+
+%h1
+ 500: Internal server error.
+%h3
+ Our bad! Sorry about that. :(
diff --git a/app/views/errors/not_public.haml b/app/views/errors/not_public.haml
index e1f5f13d1..c330cb28e 100644
--- a/app/views/errors/not_public.haml
+++ b/app/views/errors/not_public.haml
@@ -5,10 +5,10 @@
- content_for :head do
= stylesheet_link_tag :error_pages, :media => 'all'
- #big-number.transparent
- 404
+#big-number.transparent
+ 404
- #content
- = t('error_messages.post_not_public_or_not_exist')
- %br
- = t('error_messages.login_try_again', :login_link => new_user_session_path).html_safe
+#content
+ = t('error_messages.post_not_public_or_not_exist')
+ %br
+ = t('error_messages.login_try_again', :login_link => new_user_session_path).html_safe
diff --git a/app/views/home/default.haml b/app/views/home/default.haml
new file mode 100644
index 000000000..e2ba79087
--- /dev/null
+++ b/app/views/home/default.haml
@@ -0,0 +1,64 @@
+- content_for(:head) do
+ = stylesheet_link_tag :home, media: "all"
+
+#page.container
+ %header#header
+ %a#login-link.btn{href: "login"} Log In
+ = image_tag "branding/logo.png"
+
+ #banner.row
+ %h1 Welcome, friend.
+ %h3 You're about to change the Internet. Let's get you set up, shall we?
+
+ #steps.row
+ .span4
+ %h2
+ Configure your
+ %abbr.helpful{title: "A Diaspora installation"} pod
+ = image_tag "icons/cog.png"
+
+ %p
+ Look at
+ %code.helpful{title: "General pod configuration (location to upload photos, SSL certs, etc.)"}
+ config/diaspora.yml.example
+ and
+ %code.helpful{title: "MySQL username/password"}
+ config/database.yml.example
+ for help.
+
+ .span4
+ %h2 Try it out
+ = image_tag "icons/smiley_laughing.png"
+
+ %p
+ Start by
+ = link_to "creating an account", new_user_registration_path
+
+ .span4
+ %h2 Make a contribution!
+ = image_tag "icons/pen_write.png"
+
+ %p
+ Make Diaspora even better! Fork the project on
+ = link_to "Github", "http://github.com/diaspora/diaspora"
+ make some changes, and submit a pull request.
+
+ %footer
+ %h3 Useful Resources
+ %ul#links
+ %ul.section
+ %li= link_to "Codebase", "http://github.com/diaspora/diaspora", title: "Git repository"
+ %li= link_to "Documentation", "http://wiki.diasporafoundation.org", title: "Wiki on github"
+ %ul.section
+ %li= link_to "IRC - General", "http://webchat.freenode.net/?channels=diaspora", title: "#diaspora"
+ %li= link_to "IRC - Development", "http://webchat.freenode.net/?channels=diaspora-dev", title: "#diaspora-dev"
+ %ul.section
+ %li= link_to "Discussion - General", "http://groups.google.com/group/diaspora-discuss", title: "General discussion mailing list"
+ %li= link_to "Discussion - Development", "http://groups.google.com/group/diaspora-dev", title: "Dev mailing list"
+ %ul.section
+ %li= link_to "Find & Report bugs", "https://github.com/diaspora/diaspora/issues", title: "Bug tracker"
+ %li= link_to "Learn more about Ruby On Rails!", "http://guides.rubyonrails.org/"
+
+ #change-page
+ This page can be changed to a custom landing page by creating
+ %code app/views/home/_show.html.haml
diff --git a/app/views/invitations/new.html.haml b/app/views/invitations/new.html.haml
index ff972bf5a..b39bb12b0 100644
--- a/app/views/invitations/new.html.haml
+++ b/app/views/invitations/new.html.haml
@@ -26,4 +26,4 @@
.control-group
.controls
- = submit_tag t('.send_an_invitation'), :class => 'btn btn-primary creation', :disable_with => t('.sending_invitation')
+ = submit_tag t('.send_an_invitation'), class: 'btn btn-primary creation', data: {disable_with: t('.sending_invitation')}
diff --git a/app/views/invitations/new.mobile.haml b/app/views/invitations/new.mobile.haml
deleted file mode 100644
index 8debbdd71..000000000
--- a/app/views/invitations/new.mobile.haml
+++ /dev/null
@@ -1,28 +0,0 @@
-:javascript
- $(function() {
- $("#user_email").focus();
- });
-
-%h2
- = t('.invite_someone_to_join')
-
-#email_invitation
- = form_for User.new, :url => invitation_path(User) do |invite|
- %h4
- = t('email')
- = invite.text_field :email, :title => t('.comma_seperated_plz')
- %br
-
- %h4
- = t('.aspect')
- = invite.select(:aspects, options_from_collection_for_select(all_aspects, 'id', 'name'))
-
- %br
- %br
-
- %h4
- = t('.personal_message')
- = invite.text_area :invite_messages, :rows => 3, :value => ""
-
- %p
- = invite.submit t('.send_an_invitation')
diff --git a/app/views/invitations/new_blueprint.html.haml b/app/views/invitations/new_blueprint.html.haml
deleted file mode 100644
index ac9cc323f..000000000
--- a/app/views/invitations/new_blueprint.html.haml
+++ /dev/null
@@ -1,34 +0,0 @@
-.span-15.last
- .span-3
- .icons-monotone_email_letter_round
-
- .span-12.last
- %h2
- = t('invitations.new.invite_someone_to_join')
- %br
- .span-7.append-1.last
- %b= t('invitations.new.paste_link')
- %br
- %br
- = invite_link(@invite_code)
- = t('invitations.new.codes_left', :count => @invite_code.count)
- %br
- %br
- #email_invitation
-
- = form_tag new_user_invitation_path do
- %h4
- = t('email')
- = text_field_tag 'email_inviter[emails]', @invalid_emails, :title => t('invitations.new.comma_separated_plz'), :placeholder => 'foo@bar.com, max@foo.com...'
- %p
- = t('invitations.create.note_already_sent', :emails => @valid_emails) unless @valid_emails.empty?
- %br
-
- %h4
- = t('invitaitons.new.language')
- = select_tag('email_inviter[locale]', options_from_collection_for_select(available_language_options, "second", "first", :selected => current_user.language))
-
- %br
-
- %p
- = submit_tag t('invitations.new.send_an_invitation'), :disable_with => t('invitations.new.sending_invitation')
diff --git a/app/views/layouts/_header.html.haml b/app/views/layouts/_header.html.haml
index 3c77464db..d9a1b079e 100644
--- a/app/views/layouts/_header.html.haml
+++ b/app/views/layouts/_header.html.haml
@@ -8,7 +8,7 @@
= link_to content_tag(:div, nil, class: 'diaspora_header_logo branding-header-logo'), root_path
%ul#landing_nav
- - unless current_page?(controller: :registrations, action: :new)
+ - if AppConfig.settings.enable_registrations? && !current_page?(controller: '/registrations', action: :new)
%li= link_to t('devise.shared.links.sign_up'), new_user_registration_path, class: 'login'
%li= link_to t('devise.shared.links.sign_in'), new_user_session_path, class: 'login'
#lightbox
diff --git a/app/views/layouts/_open_graph.haml b/app/views/layouts/_open_graph.haml
new file mode 100644
index 000000000..ff70913df
--- /dev/null
+++ b/app/views/layouts/_open_graph.haml
@@ -0,0 +1,5 @@
+- if @post.present?
+ %link{:rel => 'alternate', :type => "application/json+oembed", :href => "#{oembed_url(:url => post_url(@post))}"}
+ = og_page_post_tags(@post)
+- else
+ = og_general_tags
diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml
index 0bac3a096..12b09b559 100644
--- a/app/views/layouts/application.html.haml
+++ b/app/views/layouts/application.html.haml
@@ -4,7 +4,7 @@
!!!
%html{:lang => I18n.locale.to_s, :dir => (rtl?) ? 'rtl' : 'ltr'}
- %head
+ %head{:prefix => og_prefix}
%title
= page_title yield(:page_title)
@@ -12,19 +12,17 @@
%meta{"http-equiv"=>"Content-Type", :content=>"text/html; charset=utf-8"}/
%meta{:name => "description", :content => "diaspora*"}/
%meta{:name => "author", :content => "Diaspora, Inc."}/
- %meta{:property => "og:site_name", :content => "#{AppConfig.settings.pod_name}"}/
%link{:rel => 'shortcut icon', :href => "#{image_path('favicon.png')}" }
%link{:rel => 'apple-touch-icon', :href => "#{image_path('apple-touch-icon.png')}"}
+ = render 'layouts/open_graph'
+
= chartbeat_head_block
= include_mixpanel
- = include_base_css_framework(@css_framework)
- - if @css_framework == :bootstrap && !@include_application_css
- = stylesheet_link_tag :default, 'new-templates', :media => 'all'
- - else
- = stylesheet_link_tag 'application', 'default'
+ = include_base_css_framework
+ = stylesheet_link_tag 'application', :media => 'all'
- if rtl?
= stylesheet_link_tag :rtl, :media => 'all'
@@ -40,29 +38,21 @@
= javascript_include_tag :main, :templates
= load_javascript_locales
- = set_asset_host
= translation_missing_warnings
= current_user_atom_tag
= yield(:head)
= csrf_meta_tag
- - if @post.present?
- %link{:rel => 'alternate', :type => "application/json+oembed", :href => "#{oembed_url(:url => post_url(@post))}"}
- = og_page_specific_tags(@post)
= include_gon(:camel_case => true)
- %body
+ %body{ :class => "page-#{controller_name} action-#{action_name}" }
= flash_messages
= yield :before_content
- - if content_for?(:container_content)
- .container
- = yield(:container_content)
- - else
- = content_for?(:content) ? yield(:content) : yield
+ = content_for?(:content) ? yield(:content) : yield
= yield :after_content
diff --git a/app/views/layouts/application.mobile.haml b/app/views/layouts/application.mobile.haml
index 78158a968..4ae09e5b6 100644
--- a/app/views/layouts/application.mobile.haml
+++ b/app/views/layouts/application.mobile.haml
@@ -4,14 +4,13 @@
!!!
%html{:lang => I18n.locale.to_s, :dir => (rtl?) ? 'rtl' : 'ltr'}
- %head
+ %head{:prefix => og_prefix}
%title
= pod_name
%meta{:name => "description", :content => "diaspora* mobile"}/
%meta{:name => "author", :content => "Diaspora, Inc."}/
%meta{:charset => 'utf-8'}/
- %meta{:property => "og:site_name", :content => "#{AppConfig.settings.pod_name}"}/
/ Viewport scale
%meta{:name =>'viewport', :content => "width=device-width, minimum-scale=1 maximum-scale=1"}/
@@ -21,15 +20,17 @@
%meta{'http-equiv' => "cleartype", :content => 'on'}/
/ Home screen icon (sized for retina displays)
- %link{:rel => 'apple-touch-icon', :href => '/apple-touch-icon.png'}
+ %link{rel: "apple-touch-icon", href: image_path("apple-touch-icon.png")}
/ For Nokia devices
- %link{:rel => 'shortcut icon', :href => '/apple-touch-icon.png'}
+ %link{rel: "shortcut icon", href: image_path("apple-touch-icon.png")}
/ 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"}
+ = render 'layouts/open_graph'
+
= chartbeat_head_block
/ Stylesheets
@@ -45,10 +46,11 @@
= yield(:head)
+ = include_gon(:camel_case => true)
%body
#app
- %header#main_nav
- - if user_signed_in?
+ - if user_signed_in?
+ %header#main_nav
#nav_badges
-# Notifications
= link_to notifications_path, class: "badge", id: "notification_badge" do
@@ -66,8 +68,8 @@
= link_to(image_tag('icons/compose_mobile.png'), new_status_message_path, class: "badge", id: "compose_badge")
-# Menu
= link_to(image_tag('icons/menu.png'), "#", id: "menu_badge", class: "badge")
- = link_to(image_tag('icons/asterisk_white_mobile.png'), stream_path, id: 'header_title')
-
+ = link_to(image_tag('icons/asterisk_white_mobile.png'), stream_path, id: 'header_title')
+
- if user_signed_in?
#drawer
%header
@@ -89,6 +91,13 @@
- current_user.aspects.each do |aspect|
%li
= link_to aspect.name, aspects_stream_path(a_ids: [aspect.id])
+ %li#followed_tags
+ = link_to t('streams.followed_tag.title'), "#"
+ %li.no_border.hide
+ %ul
+ - current_user.followed_tags.each do |tag|
+ %li
+ = tag_link(tag)
%li
= link_to user_profile_path(current_user.username) do
= t('layouts.header.profile')
@@ -110,5 +119,6 @@
/ javascripts at the bottom
= jquery_include_tag
- = javascript_include_tag :mobile
+ = javascript_include_tag "mobile/mobile"
+ = load_javascript_locales
= include_chartbeat
diff --git a/app/views/layouts/centered_with_header_with_footer.html.haml b/app/views/layouts/centered_with_header_with_footer.html.haml
deleted file mode 100644
index 223cbce09..000000000
--- a/app/views/layouts/centered_with_header_with_footer.html.haml
+++ /dev/null
@@ -1,9 +0,0 @@
-- if @css_framework == :bootstrap
- - content_for :container_content do
- = yield
-- else
- - content_for :container_content do
- .span-24.last
- = yield
-
-= render template: "layouts/with_header_with_footer"
diff --git a/app/views/layouts/error_page.haml b/app/views/layouts/error_page.haml
new file mode 100644
index 000000000..5f7fee3d2
--- /dev/null
+++ b/app/views/layouts/error_page.haml
@@ -0,0 +1,14 @@
+!!!
+%html
+ %head
+ %title= page_title yield(:page_title)
+
+ %link{rel: "shortcut icon", href: image_path("favicon.png")}
+ %link{rel: "apple-touch-icon", href: image_path("apple-touch-icon.png")}
+
+ = stylesheet_link_tag :error_pages, media: "all"
+
+ = yield(:head)
+
+ %body{id: "error_#{@code}"}
+ = yield
diff --git a/app/views/maintenance/account_removal_warning.markerb b/app/views/maintenance/account_removal_warning.markerb
new file mode 100644
index 000000000..7303bafae
--- /dev/null
+++ b/app/views/maintenance/account_removal_warning.markerb
@@ -0,0 +1,2 @@
+<%= t('notifier.remove_old_user.body', pod_url: @pod_url, login_url: @login_url, after_days: @after_days, remove_after: @remove_after) %>
+
diff --git a/app/views/notifications/_notification.html.haml b/app/views/notifications/_notification.haml
index b4bf4e90f..b4bf4e90f 100644
--- a/app/views/notifications/_notification.html.haml
+++ b/app/views/notifications/_notification.haml
diff --git a/app/views/notifications/_notification.mobile.haml b/app/views/notifications/_notification.mobile.haml
new file mode 100644
index 000000000..5c18ed6cd
--- /dev/null
+++ b/app/views/notifications/_notification.mobile.haml
@@ -0,0 +1,7 @@
+.notification_element{:data=>{:guid => note.id, :type => (Notification.types.key(note.type) || '')}, :class => (note.unread ? "unread" : "read")}
+ .pull-right.unread-toggle
+ %i.entypo.eye{ :title => (note.unread ? t('notifications.index.mark_read') : t('notifications.index.mark_unread')) }
+ = person_image_tag note.actors.first, :thumb_small
+ .notification_message
+ = notification_message_for(note)
+ %div= timeago(note.created_at)
diff --git a/app/views/notifications/_notify_popup_item.haml b/app/views/notifications/_notify_popup_item.haml
deleted file mode 100644
index ab7a43868..000000000
--- a/app/views/notifications/_notify_popup_item.haml
+++ /dev/null
@@ -1,7 +0,0 @@
-.notification_element{:data=>{:guid => n.id, :type => (Notification.types.key(n.type) || '')}, :class => (n.unread ? "unread" : "read")}
- .pull-right.unread-toggle
- %i.entypo.eye{ :title => (n.unread ? t('notifications.index.mark_read') : t('notifications.index.mark_unread')) }
- = person_image_tag n.actors.first, :thumb_small
- .notification_message
- = notification_message_for(n)
- %div= timeago(n.created_at)
diff --git a/app/views/notifications/index.html.haml b/app/views/notifications/index.html.haml
index 19033fe7a..4d3d4cde0 100644
--- a/app/views/notifications/index.html.haml
+++ b/app/views/notifications/index.html.haml
@@ -20,11 +20,12 @@
- when 'liked'
%i.entypo.heart
- when 'mentioned'
- %i.entypo.pencil
+ %span.mentionIcon
+ @
- when 'reshared'
%i.entypo.retweet
- when 'started_sharing'
- %i.entypo.users
+ %i.entypo.add-user
= t('.'+key)
.span9.stream.notifications
@@ -41,17 +42,29 @@
= t('.mark_all_shown_as_read')
-else
= t('.mark_all_as_read')
- - @group_days.each do |day, notes|
- .day_group.row-fluid
- .date.span2
- .day= the_day(day.split(' '))
- .month= the_month(day.split(' '))
+ - if @group_days.length > 0
+ - year = nil
+ - @group_days.each do |date, notes|
+ - if display_year?(year, date)
+ - year = the_year(date)
+ .row-fluid.year_container
+ .span4.offset4.year= year
- .notifications_for_day.span10
- - notes.each do |note|
- = render :partial => 'notifications/notification', :locals => { :note => note }
+ .day_group.row-fluid
+ .date.span2
+ .day= the_day(date)
+ .month= the_month(date)
- = will_paginate @notifications, :renderer => WillPaginate::ActionView::BootstrapLinkRenderer
+ .notifications_for_day.span10
+ - notes.each do |note|
+ = render :partial => 'notifications/notification', :locals => { :note => note }
+
+ = will_paginate @notifications, :renderer => WillPaginate::ActionView::BootstrapLinkRenderer
+
+ - else
+ .no_notifications.well
+ %h4
+ = t('.no_notifications')
:javascript
$(document).ready(function(){
diff --git a/app/views/notifications/index.mobile.haml b/app/views/notifications/index.mobile.haml
index 498ee29a4..7258fc418 100644
--- a/app/views/notifications/index.mobile.haml
+++ b/app/views/notifications/index.mobile.haml
@@ -7,11 +7,11 @@
-else
= link_to t('.mark_all_as_read'), read_all_notifications_path, :class => 'btn'
%ul.notifications
- - @group_days.each do |day, notes|
+ - @group_days.each do |date, notes|
%li
.notification_day_header
%span.label
- = day
+ = locale_date(date)
%ul.notifications_for_day
- notes.each do |note|
.stream_element{:data=>{:guid => note.id}, :class => "#{note.unread ? 'unread' : 'read'}"}
diff --git a/app/views/notifier/mentioned.markerb b/app/views/notifier/mentioned.markerb
index 9be69b95a..43264d365 100644
--- a/app/views/notifier/mentioned.markerb
+++ b/app/views/notifier/mentioned.markerb
@@ -1,4 +1,4 @@
-<%= post_message(@notification.post, :process_newlines => true, :length => 600) %>
+<%= post_message(@notification.post, :process_newlines => true) %>
[<%= t('notifier.comment_on_post.reply', :name => @notification.post_author_name) %>][1]
diff --git a/app/views/notifier/private_message.markerb b/app/views/notifier/private_message.markerb
index 0099546d4..b9b6cbd81 100644
--- a/app/views/notifier/private_message.markerb
+++ b/app/views/notifier/private_message.markerb
@@ -1,4 +1,4 @@
-<%= post_message(@notification.message, :process_newlines => true, :length => 2000) %>
+<%= post_message(@notification.message, :process_newlines => true) %>
[<%= t('.reply_to_or_view') %>][1]
diff --git a/app/views/passwords/edit.haml b/app/views/passwords/edit.haml
deleted file mode 100644
index e4316a94c..000000000
--- a/app/views/passwords/edit.haml
+++ /dev/null
@@ -1,27 +0,0 @@
-- content_for :page_title do
- = "#{AppConfig.settings.pod_name} / #{t('devise.passwords.edit.change_password')}"
-
-#reset_password
- %h1{id: "huge-text"}= AppConfig.settings.pod_name
-
- = form_for(resource, :as => resource_name, :url => password_path(resource_name), :html => {:class => "form-horizontal block-form", :method => :put }, :autocomplete => 'off') do |f|
- %fieldset
- = f.hidden_field :reset_password_token
- .control-group
- %label{class: "control-label", for: "user_password", style: "width: 45%; text-align: right; padding: 10px 0; overflow: hidden"}
- = t('devise.passwords.edit.new_password')
- .controls
- = f.password_field :password, :required => true, :placeholder => "••••••••", :autocapitalize => "off", :autocorrect => "off", :autofocus => true, :style => "width: 55%;"
- .control-group
- %label{class: "control-label", for: "user_password_confirmation", style: "width: 45%; text-align: right; padding: 10px 0; overflow: hidden"}
- = t('devise.passwords.edit.confirm_password')
- .controls
- = f.password_field :password_confirmation, :required => true, :placeholder => "••••••••", :autocapitalize => "off", :autocorrect => "off", :style => "width: 55%;"
- = hidden_field(:user, :remember_me, :value => 1)
- = f.submit t('devise.passwords.edit.change_password'), :class => "new-btn"
-
- %br/
- %br/
- %br/
- = link_to t('devise.shared.links.sign_in'), new_session_path(resource_name)
-
diff --git a/app/views/passwords/new.haml b/app/views/passwords/new.haml
deleted file mode 100644
index 9ffcca124..000000000
--- a/app/views/passwords/new.haml
+++ /dev/null
@@ -1,20 +0,0 @@
-- content_for :page_title do
- = "#{AppConfig.settings.pod_name} / #{t('devise.passwords.new.forgot_password')}"
-
-#forgot_password
- %h1{id: "huge-text"}= AppConfig.settings.pod_name
-
- = form_for(resource, :as => resource_name, :url => password_path(resource_name), :html => {:class => "form-horizontal block-form"}, :autocomplete => 'off') do |f|
- %fieldset
- .control-group
- %label{class: "control-label", for: "user_email", style: "width: 40%; text-align: center; padding: 10px 0; overflow: hidden"}
- = t('devise.passwords.new.email')
- .controls
- = f.text_field :email, :required => true, :autocapitalize => "off", :placeholder => "••••••••", :autocorrect => "off", :autofocus => true, :style => "width: 60%;"
- = f.submit t('devise.passwords.new.send_password_instructions'), :class => "new-btn"
-
- %br/
- %br/
- %br/
- = link_to t('devise.shared.links.sign_in'), new_session_path(resource_name)
-
diff --git a/app/views/people/_add_contact.html.haml b/app/views/people/_add_contact.haml
index 156f32e88..13e1184bb 100644
--- a/app/views/people/_add_contact.html.haml
+++ b/app/views/people/_add_contact.haml
@@ -1,8 +1,8 @@
.well
= t('.invited_by')
.media
- .float-right
+ .pull-right
= aspect_membership_dropdown(contact, inviter, false)
- = person_image_link(inviter, :class => 'img')
+ = person_image_link(inviter, :size => :thumb_small, :class => 'img')
.bd
= person_link(inviter)
diff --git a/app/views/people/_aspect_membership_dropdown.haml b/app/views/people/_aspect_membership_dropdown.haml
index 7efd9f1f3..a66b4c54e 100644
--- a/app/views/people/_aspect_membership_dropdown.haml
+++ b/app/views/people/_aspect_membership_dropdown.haml
@@ -1 +1 @@
-= aspect_membership_dropdown(@contact, @person, 'left', nil, bootstrap)
+= aspect_membership_dropdown(@contact, @person, 'right', nil, size)
diff --git a/app/views/people/_index.html.haml b/app/views/people/_index.html.haml
index 0c90823e6..82c069364 100644
--- a/app/views/people/_index.html.haml
+++ b/app/views/people/_index.html.haml
@@ -1,11 +1,13 @@
-.people_stream
+#people_stream
- people.each do |person|
- .stream_element{:id => person.id}
- .media
- .img
- = person_image_tag(person)
- .bg
- %span.from
- = person_link(person, :class => "hovercardable")
+ .media.stream_element{:id => person.id}
+ .media-object.pull-left
+ = person_image_link(person, :size => :thumb_small)
+ .media-body
+ = person_link(person, :class => 'name')
+ .info.diaspora_handle
+ = person.diaspora_handle
+ .info.tags
+ = Diaspora::Taggable.format_tags(person.profile.tag_string)
- = will_paginate people, :inner_window => 3
+ = will_paginate people, :renderer => WillPaginate::ActionView::BootstrapLinkRenderer
diff --git a/app/views/people/_person.html.haml b/app/views/people/_person.html.haml
index 3b52a18dc..15f4ca690 100644
--- a/app/views/people/_person.html.haml
+++ b/app/views/people/_person.html.haml
@@ -1,20 +1,13 @@
--# Copyright (c) 2010-2011, Diaspora Inc. This file is
--# licensed under the Affero General Public License version 3 or later. See
--# the COPYRIGHT file.
-
-.stream_element{:id => person.id}
- %div{:style => "float:right;margin-top:2px;"}
+.media.stream_element{:id => person.id}
+ .pull-right
= render :partial => 'people/relationship_action',
:locals => { :person => person, :contact => contact,
:current_user => current_user }
-
- .media
- .img
- = person_image_link(person)
-
- .bd
- =person_link(person)
-
- .info
- = Diaspora::Taggable.format_tags(person.profile.tag_string)
-
+ .media-object.pull-left
+ = person_image_link(person)
+ .media-body
+ = person_link(person)
+ .info.diaspora_handle
+ = person.diaspora_handle
+ .info.tags
+ = Diaspora::Taggable.format_tags(person.profile.tag_string)
diff --git a/app/views/people/_profile_sidebar.html.haml b/app/views/people/_profile_sidebar.html.haml
deleted file mode 100644
index 1cb71e448..000000000
--- a/app/views/people/_profile_sidebar.html.haml
+++ /dev/null
@@ -1,92 +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.
-
-#profile
- .profile_photo
- = person_image_link(person, :size => :thumb_large, :to => :photos)
-
- - if user_signed_in?
- - if person != current_user.person
- %div#profile_buttons{ :class => profile_buttons_class(@contact, @block) }
- = sharing_message(@person, @contact)
-
- - if @contact.receiving?
- .profile_button
- = link_to content_tag(:div, nil, :class => 'icons-mention', :title => t('people.show.mention'), :id => 'mention_button'), new_status_message_path(:person_id => @person.id), :rel => 'facebox'
- .white_bar
-
- - if @contact.mutual?
-
-
- .profile_button
- = link_to content_tag(:div, nil, :class => 'icons-message', :title => t('people.show.message'), :id => 'message_button'), new_conversation_path(:contact_id => @contact.id, :name => @contact.person.name), :rel => 'facebox'
- .white_bar
-
- .profile_button
- = link_to content_tag(:div, nil, :class => 'icons-ignoreuser block_user', :title => t('ignore'), :id => 'block_user_button', :data => { :person_id => @person.id }), '#', :rel => "nofollow" if @block.blank?
-
-
- %br
-
- -if contact.sharing? || person == current_user.person
- %ul#profile_information
-
- - unless person.bio.blank?
- %li
- %h4
- =t('.bio')
- %div{ :class => direction_for(person.bio) }
- = person.profile.bio_message.markdownified
- - unless person.profile.location.blank?
- %li
- %h4
- =t('.location')
- %div{ :class => direction_for(person.location) }
- = person.profile.location_message.markdownified
-
- - unless person.gender.blank?
- %li
- %h4
- =t('.gender')
- = person.gender
-
- - unless person.birthday.blank?
- %li
- %h4
- =t('.born')
- = birthday_format(person.birthday)
- - if @photos.present?
- %li.image_list
- %h4
- = t('.photos')
- .item_count
- = "#{@photos.count}"
- - @photos.limit(8).each do |photo|
- = image_tag(photo.url(:thumb_small))
- %br
- = link_to t('layouts.header.view_all'), person_photos_path(person)
-
- - if person == current_user.person
- %li.image_list
- %h4
- = t('_contacts')
- .item_count
- = all_contacts_count
- .section.contact_pictures
- - current_user.contacts.limit(8).each do |contact|
- = person_image_link contact.person, :size => :thumb_small
- %p.see_all= link_to t('layouts.header.view_all'), contacts_path
- - elsif @contact.persisted? && @contacts_of_contact_count > 0
- %li.image_list
- %h4
- = t('_contacts')
- .item_count
- = @contacts_of_contact_count
- .section.contact_pictures
- -@contacts_of_contact.limit(8).each do |person|
- = person_image_link person, :size => :thumb_small
- %p.see_all= link_to t('layouts.header.view_all'), person_contacts_path(@person)
-
- %br
- %br
diff --git a/app/views/people/_relationship_action.haml b/app/views/people/_relationship_action.haml
index 8a73875b5..b4ab1df04 100644
--- a/app/views/people/_relationship_action.haml
+++ b/app/views/people/_relationship_action.haml
@@ -3,4 +3,5 @@
- contact ||= Contact.new(:person => person)
= aspect_membership_dropdown(contact, person, 'right')
-else
- = t('people.person.thats_you')
+ %span.thats_you
+ = t('people.person.thats_you')
diff --git a/app/views/people/_sub_header.html.haml b/app/views/people/_sub_header.html.haml
deleted file mode 100644
index a8e4f0575..000000000
--- a/app/views/people/_sub_header.html.haml
+++ /dev/null
@@ -1,34 +0,0 @@
-#author_info
- .right
- - if user_signed_in? && current_user.person != person
- - if @block.present?
- = link_to t('users.privacy_settings.stop_ignoring'), block_path(@block),
- :method => :delete,
- :class => "button"
-
- - else
- = aspect_membership_dropdown(contact, person, 'right')
- - elsif user_signed_in? && current_user.person == person
- = link_to t('people.profile_sidebar.edit_my_profile'), edit_profile_path, :class => 'button creation'
-
- %h2
- = person.name
- %span.diaspora_handle
- = person.diaspora_handle
-
- .description
- - if !person.tag_string.blank? && user_signed_in?
- = Diaspora::Taggable.format_tags(person.profile.tag_string)
- - if user_signed_in? && person == current_user.person
- %span.hover_edit
- = link_to t('.edit'), edit_profile_path
- - else
- - if user_signed_in? && person == current_user.person
- %i
- = t('.you_have_no_tags')
- %span.add_tags
- = link_to t('.add_some'), edit_profile_path
- - if user_signed_in? && person == current_user.person && current_page?(controller: :people, action: :show)
- %hr
- = render 'aspects/aspect_stream', :stream => @stream
-%hr
diff --git a/app/views/people/contacts.haml b/app/views/people/contacts.haml
index c53f15781..4046fdb47 100644
--- a/app/views/people/contacts.haml
+++ b/app/views/people/contacts.haml
@@ -1,21 +1,41 @@
--# Copyright (c) 2010-2011, Diaspora Inc. This file is
--# licensed under the Affero General Public License version 3 or later. See
--# the COPYRIGHT file.
-
-
+-# TODO this should happen in the js app
- content_for :head do
- = javascript_include_tag :people
+ - if user_signed_in? && @person != current_user.person
+ :javascript
+ Mentions.options.prefillMention = Mentions._contactToMention(#{j @person.to_json});
- content_for :page_title do
= @person.name
-.span-6
- = render :partial => 'people/profile_sidebar', :locals => {:person => @person, :contact => @contact }
+.container-fluid#profile_container
+ .row-fluid
+ .span3
+ #profile
+ -# here be JS
+
+ .span9
+ .profile_header
+ -# more JS
+
+ .stream_container
+ #people_stream.stream
+ - @hashes.each do |hash|
+ = render :partial => 'people/person', :locals => hash
+ = will_paginate @contacts_of_contact, :renderer => WillPaginate::ActionView::BootstrapLinkRenderer
+
+ %a{:id=>"back-to-top", :title=>"#{t('layouts.application.back_to_top')}", :href=>"#"}
+ &#8679;
-.span-18.last
- = render 'people/sub_header', :person => @person, :contact => @contact
+-if user_signed_in? && @person
+ #new_status_message_pane
+ = render 'shared/modal',
+ :path => new_status_message_path(:person_id => @person.id),
+ :title => t('status_messages.new.mentioning', :person => @person.name),
+ :id => 'mentionModal'
- #people_stream.stream
- - @hashes.each do |hash|
- = render :partial => 'people/person', :locals => hash
- = will_paginate @contacts_of_contact
+ -if @contact
+ #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'),
+ :id => 'conversationModal'
diff --git a/app/views/people/index.html.haml b/app/views/people/index.html.haml
index ced29ec28..a4a90ee7c 100644
--- a/app/views/people/index.html.haml
+++ b/app/views/people/index.html.haml
@@ -6,7 +6,6 @@
= t('search')
- content_for :head do
- = javascript_include_tag :people
= javascript_include_tag 'contact-list'
.container-fluid#people_search
diff --git a/app/views/people/show.html.haml b/app/views/people/show.html.haml
index cfa4994a3..235c22ccc 100644
--- a/app/views/people/show.html.haml
+++ b/app/views/people/show.html.haml
@@ -2,9 +2,8 @@
-# licensed under the Affero General Public License version 3 or later. See
-# the COPYRIGHT file.
-
+-# TODO this should happen in the js app
- content_for :head do
- = javascript_include_tag :people
- if user_signed_in? && @person != current_user.person
:javascript
Mentions.options.prefillMention = Mentions._contactToMention(#{j @person.to_json});
@@ -12,19 +11,40 @@
- content_for :page_title do
= @person.name
-.span-6
- = render :partial => 'people/profile_sidebar', :locals => {:person => @person, :contact => @contact }
+.container-fluid#profile_container
+ .row-fluid
+ .span3
+ #profile
+ -# here be JS
+
+ .span9
+ .profile_header
+ -# more JS
+
+ .stream_container
+
+ -if user_signed_in? && current_page?(person_path(current_user.person))
+ = render 'publisher/publisher', publisher_aspects_for(nil)
+
+ #main_stream.stream
+ -# JS
-.span-18.last
- .stream_container
- = render 'people/sub_header', :person => @person, :contact => @contact
+ #paginate
+ %span.loader.hidden
- #main_stream.stream
- - if @block.present?
- .dull
- = t('.ignoring', :name => @person.first_name)
+ %a{:id=>"back-to-top", :title=>"#{t('layouts.application.back_to_top')}", :href=>"#"}
+ &#8679;
- #paginate
+-if user_signed_in? && @person
+ #new_status_message_pane
+ = render 'shared/modal',
+ :path => new_status_message_path(:person_id => @person.id),
+ :title => t('status_messages.new.mentioning', :person => @person.name),
+ :id => 'mentionModal'
- %a{:id=>"back-to-top", :title=>"#{t('layouts.application.back_to_top')}", :href=>"#"}
- &#8679;
+ -if @contact
+ #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'),
+ :id => 'conversationModal'
diff --git a/app/views/people/show.mobile.haml b/app/views/people/show.mobile.haml
index f7fdd3233..db85990ae 100644
--- a/app/views/people/show.mobile.haml
+++ b/app/views/people/show.mobile.haml
@@ -10,6 +10,12 @@
= @person.name
%span.description
= @person.diaspora_handle
+ - if user_signed_in? && @person != current_user.person
+ = render 'aspect_memberships/aspect_membership_dropdown'
+ .clear
+ .bottom_bar
+ - if !@person.tag_string.blank? && user_signed_in?
+ = Diaspora::Taggable.format_tags(@person.tag_string)
.span12.profile_stream
- if @stream.stream_posts.length > 0
@@ -18,13 +24,11 @@
- else
#main_stream.stream
= render 'shared/stream', :posts => @stream.stream_posts
- #pagination
- %a.more-link.paginate{:href => next_page_path}
- %h1
- = t("more")
+ = render 'shared/stream_more_button'
- else
#main_stream
.dull
- - if user_signed_in? && (current_user.person != @person)
+ - if @block.present?
+ = t('.ignoring', :name => @person.first_name)
+ - elsif user_signed_in? && (current_user.person != @person)
= t('.has_not_shared_with_you_yet', :name => @person.first_name)
-
diff --git a/app/views/people/tag_index.js.erb b/app/views/people/tag_index.js.erb
index a683b2227..c30450e3e 100644
--- a/app/views/people/tag_index.js.erb
+++ b/app/views/people/tag_index.js.erb
@@ -1 +1 @@
-$(".people_stream").html("<%= escape_javascript(render("index", :people => @people)) %>");
+$("#people_stream").html("<%= escape_javascript(render("index", :people => @people)) %>");
diff --git a/app/views/photos/_new_profile_photo.haml b/app/views/photos/_new_profile_photo.haml
index 2c6b50b0c..af526be04 100644
--- a/app/views/photos/_new_profile_photo.haml
+++ b/app/views/photos/_new_profile_photo.haml
@@ -58,7 +58,7 @@
window.onload = createUploader;
#profile_photo_upload
- = owner_image_tag(:thumb_medium)
+ = owner_image_tag(:thumb_large)
.clearfix
diff --git a/app/views/profiles/_edit.haml b/app/views/profiles/_edit.haml
index e8d71d505..6c1f63dce 100644
--- a/app/views/profiles/_edit.haml
+++ b/app/views/profiles/_edit.haml
@@ -35,7 +35,7 @@
= t('profiles.edit.your_birthday')
.row-fluid
- = select_date profile.birthday, { :prompt => true, :default => true, :order => t('date.order'), :start_year => 2000, :end_year => 1910, :prefix => 'profile[date]' }, { :class => 'span4' }
+ = select_date profile.birthday, { :prompt => true, :default => true, :order => t('date.order'), :start_year => upper_limit_date_of_birth, :end_year => lower_limit_date_of_birth, :prefix => 'profile[date]' }, { :class => 'span4' }
.small-horizontal-spacer
diff --git a/app/views/profiles/_edit_public.haml b/app/views/profiles/_edit_public.haml
index 3bda5e12b..83e46ba85 100644
--- a/app/views/profiles/_edit_public.haml
+++ b/app/views/profiles/_edit_public.haml
@@ -1,10 +1,4 @@
--# 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 :profile
-
:javascript
$(document).ready(function () {
var data = $.parseJSON( '#{@tags_array.to_json.gsub("'", "\\\\'")}' ),
diff --git a/app/views/profiles/edit.haml b/app/views/profiles/edit.haml
index 62f3050fc..4dc0bc846 100644
--- a/app/views/profiles/edit.haml
+++ b/app/views/profiles/edit.haml
@@ -2,24 +2,21 @@
-# licensed under the Affero General Public License version 3 or later. See
-# the COPYRIGHT file.
-.bootstrap_header_padding
-
.container
.row-fluid
.span12
#section_header
%h2
- = t('settings')
- = render 'shared/settings_nav'
+ = t("settings")
+ = render "shared/settings_nav"
.container
.row-fluid
.span3
.span6
- content_for :submit_block do
- = link_to t('cancel'), local_or_remote_person_path(current_user.person), :class => "btn"
- = submit_tag t('.update_profile'), :class => "creation", :id => "update_profile", :class => "btn"
- = render :partial => 'edit', :locals => {:person => @person,
- :profile => @profile, :aspect => @aspect, :step => @step}
+ = link_to t("cancel"), local_or_remote_person_path(current_user.person), :class => "btn"
+ = submit_tag t(".update_profile"), class: "btn creation", id: "update_profile"
+ = render partial: "edit", locals: {person: @person, profile: @profile, aspect: @aspect, step: @step}
.span3
diff --git a/app/views/publisher/_aspect_dropdown.html.haml b/app/views/publisher/_aspect_dropdown.html.haml
index f50e33d9e..792a76e87 100644
--- a/app/views/publisher/_aspect_dropdown.html.haml
+++ b/app/views/publisher/_aspect_dropdown.html.haml
@@ -1,14 +1,18 @@
.btn-group.aspect_dropdown
%button.btn.btn-default.dropdown-toggle{ ! current_user.getting_started? ? {'data-toggle' => 'dropdown'} : {'data-toggle' => 'dropdown', :title => popover_with_close_html("2. #{t('shared.public_explain.control_your_audience')}"), 'data-content'=> t('shared.public_explain.visibility_dropdown')} }
- %span.text
- - if publisher_public
+ - if publisher_public
+ %i#visibility-icon.entypo.small.globe
+ %span.text
= t('public')
- - elsif all_aspects_selected?(selected_aspects)
- = t('all_aspects')
- - elsif selected_aspects.size == 1
- = selected_aspects.first.name
- - else
- = t('shared.aspect_dropdown.toggle', :count => selected_aspects.size)
+ - else
+ %i#visibility-icon.entypo.small.lock
+ %span.text
+ - if all_aspects_selected?(selected_aspects)
+ = t('all_aspects')
+ - elsif selected_aspects.size == 1
+ = selected_aspects.first.name
+ - else
+ = t('shared.aspect_dropdown.toggle', count: selected_aspects.size)
%span.caret
%ul.dropdown-menu.pull-right{ :unSelectable => 'on' }
diff --git a/app/views/publisher/_publisher.html.haml b/app/views/publisher/_publisher.html.haml
index 4948bef7d..64b4bb194 100644
--- a/app/views/publisher/_publisher.html.haml
+++ b/app/views/publisher/_publisher.html.haml
@@ -1,4 +1,80 @@
-- if bootstrap?
- = render :partial => 'publisher/publisher_bootstrap', :locals => { :aspect => aspect, :selected_aspects => selected_aspects, :aspect_ids => aspect_ids }
-- else
- = render :partial => 'publisher/publisher_blueprint', :locals => { :aspect => aspect, :selected_aspects => selected_aspects, :aspect_ids => aspect_ids }
+-if publisher_explain
+ :javascript
+ $(document).ready(function() {
+ if( app.publisher ) app.publisher.triggerGettingStarted();
+ });
+
+.row-fluid#publisher{:class => ((aspect == :profile || publisher_open) ? "mention_popup" : "closed")}
+ .content_creation
+ = form_for(StatusMessage.new) do |status|
+ = status.error_messages
+ %params
+ #publisher_textarea_wrapper
+ - if current_user.getting_started?
+ = status.text_area :fake_text, :rows => 2, :value => h(publisher_formatted_text), :tabindex => 1, :placeholder => "#{t('contacts.index.start_a_conversation')}...",
+ 'data-title' => popover_with_close_html( '1. ' + t('shared.public_explain.share') ),
+ 'data-content' => t('shared.public_explain.new_user_welcome_message')
+ - else
+ = status.text_area :fake_text, :rows => 2, :value => h(publisher_formatted_text), :tabindex => 1, :placeholder => "#{t('contacts.index.start_a_conversation')}..."
+ = status.hidden_field :text, :value => h(publisher_hidden_text), :class => 'clear_on_submit'
+
+ .row-fluid#photodropzone_container
+ %ul#photodropzone
+ .row-fluid#location_container
+ = hidden_field :location, :coords
+ .row-fluid#poll_creator_container
+ -# handlebars template
+ .row-fluid#button_container
+ #publisher-images.pull-right
+ #poll_creator.btn.btn-link{:title => t('shared.publisher.poll.add_a_poll')}
+ %i.entypo.bar-graph
+ #file-upload.btn.btn-link{:title => t('shared.publisher.upload_photos')}
+ %i.entypo.camera.publisher_image
+ #locator.btn.btn-link{:title => t('shared.publisher.get_location')}
+ %i.entypo.location.publisher_image
+ #hide_location.btn.btn-link{:title => t('shared.publisher.remove_location')}
+ %i.entypo.cross.publisher_image
+ %span.help-block.markdownIndications
+ != t('shared.publisher.formatWithMarkdown', markdown_link: link_to(t('help.markdown'), 'https://diasporafoundation.org/formatting', target: :blank))
+
+ - if publisher_public
+ = hidden_field_tag 'aspect_ids[]', "public"
+ - elsif all_aspects_selected?(selected_aspects)
+ = hidden_field_tag 'aspect_ids[]', "all_aspects"
+ - else
+ - for aspect_id in aspect_ids
+ = hidden_field_tag 'aspect_ids[]', aspect_id.to_s
+
+ .row-fluid#publisher_spinner{:class => 'hidden'}
+ = image_tag 'ajax-loader.gif'
+ .row-fluid.options_and_submit
+ .public_toggle
+ .btn.btn-default.pull-left#hide_publisher{:title => t('shared.publisher.discard_post')}
+ %span.text
+ =t('cancel')
+
+ .btn-toolbar.pull-right
+ %span#publisher_service_icons
+ - if current_user.services
+ - for service in current_user.services
+ = service_button(service)
+ %a.btn.btn-link{ :href => "#question_mark_pane", :class => 'question_mark', :rel => 'facebox', :title => t('shared.public_explain.manage') }
+ %i.entypo.small.cog
+
+ = render :partial => "publisher/aspect_dropdown", :locals => { :selected_aspects => selected_aspects }
+
+ %button{:class => 'btn btn-default post_preview_button'}
+ %span.text
+ = t('shared.publisher.preview')
+
+ %button#submit.btn.btn-primary.creation{:tabindex => 2}
+ %span.text
+ = t('shared.publisher.share')
+
+ .facebox_content
+ #question_mark_pane
+ = render 'shared/public_explain'
+ = link_to '', contacts_path(:aspect_ids => aspect_ids), :class => 'selected_contacts_link hidden'
+
+
+ #publisher_photo_upload
diff --git a/app/views/publisher/_publisher.mobile.haml b/app/views/publisher/_publisher.mobile.haml
index dca0f8cf2..6a1d72f78 100644
--- a/app/views/publisher/_publisher.mobile.haml
+++ b/app/views/publisher/_publisher.mobile.haml
@@ -2,12 +2,6 @@
-# licensed under the Affero General Public License version 3 or later. See
-# the COPYRIGHT file.
-- content_for :head do
- = jquery_include_tag
- = javascript_include_tag :main
- = load_javascript_locales
- = include_gon
-
= form_for StatusMessage.new, {:data => {:ajax => false}} do |status|
= status.hidden_field :provider_display_name, :value => 'mobile'
= status.text_area :text, :placeholder => t('shared.publisher.whats_on_your_mind'), :rows => 4, :autofocus => "autofocus"
@@ -39,4 +33,4 @@
#publisher_mobile
= submit_tag t('shared.publisher.share'), :class => 'btn primary', :id => "submit_new_message"
- #publisher_photo_upload \ No newline at end of file
+ #publisher_photo_upload
diff --git a/app/views/publisher/_publisher_blueprint.html.haml b/app/views/publisher/_publisher_blueprint.html.haml
deleted file mode 100644
index a97beb2e7..000000000
--- a/app/views/publisher/_publisher_blueprint.html.haml
+++ /dev/null
@@ -1,100 +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.
-
--if publisher_explain
- :javascript
- $(document).ready(function() {
- if( app.publisher ) app.publisher.triggerGettingStarted();
- });
-
-#publisher{:class => ((aspect == :profile || publisher_open) ? "mention_popup" : "closed")}
- .content_creation
- = form_for(StatusMessage.new) do |status|
- = status.error_messages
- %div
- %params
- #publisher_textarea_wrapper
- = link_to(content_tag(:div, nil, :class => 'icons-deletelabel'), "#", :id => "hide_publisher", :title => t('shared.publisher.discard_post'))
- %ul#photodropzone
- - if current_user.getting_started?
- = status.text_area :fake_text, :rows => 2, :value => h(publisher_formatted_text), :tabindex => 1, :placeholder => "#{t('contacts.index.start_a_conversation')}...",
- :title => popover_with_close_html( '1. ' + t('shared.public_explain.share') ),
- 'data-content' => t('shared.public_explain.new_user_welcome_message')
- - else
- = status.text_area :fake_text, :rows => 2, :value => h(publisher_formatted_text), :tabindex => 1, :placeholder => "#{t('contacts.index.start_a_conversation')}..."
- = status.hidden_field :text, :value => h(publisher_hidden_text), :class => 'clear_on_submit'
-
- %span#publisher-images
- %span.markdownIndications
- != t('shared.publisher.formatWithMarkdown', markdown_link: link_to(t('help.markdown'), 'https://diasporafoundation.org/formatting', target: :blank))
- #poll_creator.btn{:title => t('shared.publisher.poll.add_a_poll')}
- %i.entypo.bar-graph{:class => "publisher_image"}
-
- #locator.btn{:title => t('shared.publisher.get_location')}
- = image_tag 'icons/marker.png', :alt => t('shared.publisher.get_location').titleize, :class => 'publisher_image'
- #file-upload.btn{:title => t('shared.publisher.upload_photos')}
- = image_tag 'icons/camera.png', :alt => t('shared.publisher.upload_photos').titleize, :class => 'publisher_image'
- = hidden_field :location, :coords
- #location_container
- #publisher-poll-creator
-
- - if publisher_public
- = hidden_field_tag 'aspect_ids[]', "public"
- - elsif all_aspects_selected?(selected_aspects)
- = hidden_field_tag 'aspect_ids[]', "all_aspects"
- - else
- - for aspect_id in aspect_ids
- = hidden_field_tag 'aspect_ids[]', aspect_id.to_s
-
- #publisher_spinner{:class => 'hidden'}
- = image_tag 'ajax-loader.gif'
- .options_and_submit
- .public_toggle
- %span#publisher_service_icons
- - if current_user.services
- - for service in current_user.services
- = content_tag :div, nil,
- :title => "#{service.provider.titleize} (#{service.nickname})",
- :class => "social_media_logos-#{service.provider}-16x16 service_icon dim",
- :id => "#{service.provider}",
- :maxchar => "#{service.class::MAX_CHARACTERS}",
- :data => {:toggle=>'tooltip', :placement=>'bottom'}
- %a{ :href => "#question_mark_pane", :class => 'question_mark', :rel => 'facebox', :title => t('shared.public_explain.manage') }
- .icons-monotone_wrench_settings
-
- .dropdown{ ! current_user.getting_started? ? {:class => "hang_right"} : { :class => "hang_right", :title => popover_with_close_html("2. #{t('shared.public_explain.control_your_audience')}"), 'data-content'=> t('shared.public_explain.visibility_dropdown')} }
- .button.toggle.publisher
- - if publisher_public
- = t('public')
- - elsif all_aspects_selected?(selected_aspects)
- = t('all_aspects')
- - elsif selected_aspects.size == 1
- = selected_aspects.first.name
- - else
- = t('shared.aspect_dropdown.toggle', :count => selected_aspects.size)
- &#9660;
-
- .wrapper
- %ul.dropdown_list{:unSelectable => 'on', 'data-person_id' => (person.id if defined?(person) && person), 'data-service_uid' => (service_uid if defined?(service_uid))}
- %li.public.radio{"data-aspect_id" => "public", :class => ("selected" if publisher_public)}
- = t('public')
-
- %li.divider.all_aspects.radio{:style => "padding-bottom: 5px; border-bottom: 1px solid #ddd;", "data-aspect_id" => "all_aspects", :class => ("selected" if (!publisher_public && all_aspects_selected?(selected_aspects)))}
- = t('all_aspects')
-
- - for aspect in all_aspects
- = aspect_dropdown_list_item(aspect, !all_aspects_selected?(selected_aspects) && selected_aspects.include?(aspect) )
-
- %button{ :disabled => ("disabled" if publisher_hidden_text.blank?), :class => 'button post_preview_button'}
- = t('shared.publisher.preview')
-
- = status.submit t('shared.publisher.share'), :disabled => publisher_hidden_text.blank?, :class => 'button creation', :tabindex => 2
-
- .facebox_content
- #question_mark_pane
- = render 'shared/public_explain'
- = link_to '', contacts_path(:aspect_ids => aspect_ids), :class => 'selected_contacts_link hidden'
-
-
- #publisher_photo_upload
diff --git a/app/views/publisher/_publisher_bootstrap.html.haml b/app/views/publisher/_publisher_bootstrap.html.haml
deleted file mode 100644
index 3c2478cb9..000000000
--- a/app/views/publisher/_publisher_bootstrap.html.haml
+++ /dev/null
@@ -1,88 +0,0 @@
--if publisher_explain
- :javascript
- $(document).ready(function() {
- if( app.publisher ) app.publisher.triggerGettingStarted();
- });
-
-.row-fluid#publisher{:class => ((aspect == :profile || publisher_open) ? "mention_popup" : "closed")}
- .content_creation
- = form_for(StatusMessage.new) do |status|
- = status.error_messages
- %params
- #publisher_textarea_wrapper
- - if current_user.getting_started?
- = status.text_area :fake_text, :rows => 2, :value => h(publisher_formatted_text), :tabindex => 1, :placeholder => "#{t('contacts.index.start_a_conversation')}...",
- 'data-title' => popover_with_close_html( '1. ' + t('shared.public_explain.share') ),
- 'data-content' => t('shared.public_explain.new_user_welcome_message')
- - else
- = status.text_area :fake_text, :rows => 2, :value => h(publisher_formatted_text), :tabindex => 1, :placeholder => "#{t('contacts.index.start_a_conversation')}..."
- = status.hidden_field :text, :value => h(publisher_hidden_text), :class => 'clear_on_submit'
-
- .row-fluid#photodropzone_container
- %ul#photodropzone
- .row-fluid#location_container
- = hidden_field :location, :coords
- .row-fluid#poll_creator_wrapper
- #poll_question_wrapper{:class => "input-block-level"}
- %input{:id => 'poll_question', :placeholder => t('shared.publisher.poll.question'), :name => 'poll_question', :class=> "form-control"}
- .poll_answer
- %input{:class => 'form-control poll_answer_input', :placeholder => t('shared.publisher.poll.option'), :name => 'poll_answers[]'}
- .remove_poll_answer.btn.btn-link{:title => t('shared.publisher.poll.remove_poll_answer')}
- %i.entypo.trash
- #add_poll_answer_wrapper
- #add_poll_answer{:class => 'btn btn-default'}
- = t('shared.publisher.poll.add_poll_answer')
- .row-fluid#button_container
- #publisher-images.pull-right
- #poll_creator.btn.btn-link{:title => t('shared.publisher.poll.add_a_poll')}
- %i.entypo.bar-graph
- #file-upload.btn.btn-link{:title => t('shared.publisher.upload_photos')}
- %i.entypo.camera.publisher_image
- #locator.btn.btn-link{:title => t('shared.publisher.get_location')}
- %i.entypo.location.publisher_image
- #hide_location.btn.btn-link{:title => t('shared.publisher.remove_location')}
- %i.entypo.cross.publisher_image
- %span.help-block.markdownIndications
- != t('shared.publisher.formatWithMarkdown', markdown_link: link_to(t('help.markdown'), 'https://diasporafoundation.org/formatting', target: :blank))
-
- - if publisher_public
- = hidden_field_tag 'aspect_ids[]', "public"
- - elsif all_aspects_selected?(selected_aspects)
- = hidden_field_tag 'aspect_ids[]', "all_aspects"
- - else
- - for aspect_id in aspect_ids
- = hidden_field_tag 'aspect_ids[]', aspect_id.to_s
-
- .row-fluid#publisher_spinner{:class => 'hidden'}
- = image_tag 'ajax-loader.gif'
- .row-fluid.options_and_submit
- .public_toggle
- %button.btn.btn-default.pull-left#hide_publisher{:title => t('shared.publisher.discard_post')}
- %span.text
- =t('cancel')
-
- .btn-toolbar.pull-right
- %span#publisher_service_icons
- - if current_user.services
- - for service in current_user.services
- = service_button(service)
- %a.btn.btn-link{ :href => "#question_mark_pane", :class => 'question_mark', :rel => 'facebox', :title => t('shared.public_explain.manage') }
- %i.entypo.small.cog
-
- = render :partial => "publisher/aspect_dropdown", :locals => { :selected_aspects => selected_aspects }
-
- %button{ :disabled => ("disabled" if publisher_hidden_text.blank?), :class => 'btn btn-default post_preview_button'}
- %span.text
- = t('shared.publisher.preview')
-
- %button#submit.btn.btn-primary.creation{ :disabled => ("disabled" if publisher_hidden_text.blank?), :tabindex => 2}
- %span.text
- = t('shared.publisher.share')
-
- .facebox_content
- #question_mark_pane
- = render 'shared/public_explain'
- = link_to '', contacts_path(:aspect_ids => aspect_ids), :class => 'selected_contacts_link hidden'
-
-
- #publisher_photo_upload
diff --git a/app/views/registrations/_form.haml b/app/views/registrations/_form.haml
new file mode 100644
index 000000000..ea851bae8
--- /dev/null
+++ b/app/views/registrations/_form.haml
@@ -0,0 +1,33 @@
+= form_for(resource, url: registration_path(resource_name), html: {class: "form-horizontal block-form", autocomplete: "off"}) do |f|
+
+ %fieldset
+ %label
+ = f.label :user_email, t('registrations.new.email'), class: 'control-label'
+ %i.entypo.mail
+ = f.email_field :email, class: "input-block-level form-control", placeholder: t('registrations.new.email'), title: t('registrations.new.enter_email'), required: true
+
+ %label.control-label{for: "user_username"}
+ = t('registrations.new.username')
+ %i.entypo.user
+ = f.text_field :username, class: "input-block-level form-control", placeholder: t('registrations.new.username'), title: t('registrations.new.enter_username'), required: true, pattern: "[A-Za-z0-9_]+"
+
+ %label.control-label{for: "user_password"}
+ = t('registrations.new.password')
+ %i.entypo.lock
+ = f.password_field :password, class: "input-block-level form-control", placeholder: t('registrations.new.password'), title: t('registrations.new.enter_password'), required: true, pattern: "......+"
+
+ %label.control-label{for: "user_password_confirmation"}
+ = t('registrations.new.password_confirmation')
+ %i.entypo.lock
+ = f.password_field :password_confirmation, class: "input-block-level form-control", placeholder: t('registrations.new.password_confirmation'), title: t('registrations.new.enter_password_again'), required: true, pattern: "......+"
+
+ - if AppConfig.settings.captcha.enable?
+ = show_simple_captcha :object => 'user', :code_type => 'numeric'
+
+ = invite_hidden_tag(invite)
+
+ - if AppConfig.settings.terms.enable?
+ %p#terms.text-center
+ = t('registrations.new.terms', terms_link: link_to(t('registrations.new.terms_link'), terms_path, target: "_blank")).html_safe
+
+ = f.submit t('registrations.new.sign_up'), class: "btn btn-block btn-large", data: {disable_with: t('registrations.new.submitting')}
diff --git a/app/views/registrations/edit.html.haml b/app/views/registrations/edit.html.haml
deleted file mode 100644
index adcdf2468..000000000
--- a/app/views/registrations/edit.html.haml
+++ /dev/null
@@ -1,28 +0,0 @@
-%h2
- = t('.edit', :name => resource_name.to_s.humanize)
-= form_for(resource, :as => resource_name, :url => registration_path(resource_name), :html => { :method => :put }) do |f|
- = devise_error_messages!
- %p
- = f.label :email
- %br/
- = f.text_field :email
- %p
- = f.label :password
- %i = t('.leave_blank')
- %br/
- = f.password_field :password
- %p
- = f.label :password_confirmation
- %br/
- = f.password_field :password_confirmation
- %p
- = f.label :current_password
- %i = t('.password_to_confirm')
- %br/
- = f.password_field :current_password
- %p
- = f.submit t('.update')
-%h3 t('.cancel_my_account')
-%p
- = t('.unhappy') #{link_to t('.cancel_my_account'), registration_path(resource_name), :data => { :confirm => t('are_you_sure') }, :method => :delete}.
-= link_to t('back'), :back
diff --git a/app/views/registrations/new.haml b/app/views/registrations/new.haml
new file mode 100644
index 000000000..6164b1d46
--- /dev/null
+++ b/app/views/registrations/new.haml
@@ -0,0 +1,12 @@
+#registration
+ .container-fluid
+ .row-fluid
+ .span10.offset1
+ .span7.hidden-phone
+ %h1.ball
+ .span5.v-center
+ .content.text-center
+ %h2#pod-name
+ = AppConfig.settings.pod_name
+
+ = render partial: 'form'
diff --git a/app/views/registrations/new.html.erb b/app/views/registrations/new.html.erb
deleted file mode 100644
index e43a98c76..000000000
--- a/app/views/registrations/new.html.erb
+++ /dev/null
@@ -1,81 +0,0 @@
-<div id="registration">
- <div class="container">
-
- <div class="row">
- <div class="span4" id="image-container">
- <%= image_tag('signupimages@2x_mini.jpg', :id => "collage") %>
- </div>
-
- <div class="span8">
- <h1 id="create-something-text">
- <%= t('.hey_make').html_safe %>
- </h1>
-
- <h3 id="diaspora-hearts">
- <%= t('.diaspora') %>
- </h3>
-
- <h4 id="sign-up-text">
- <%= t('.sign_up') %>
- </h4>
-
- <%= form_for(resource, :url => registration_path(resource_name), :html => {:class => "form-horizontal block-form", :autocomplete => "off"}) do |f| %>
- <fieldset>
- <div class="control-group">
- <label class="control-label" for="user_email">
- <%= t('.email') %>
- </label>
-
- <div class="controls">
- <%= f.email_field :email, :placeholder => "luke@hoth.net", :title => t('registrations.new.enter_email'), :required => true %>
- </div>
- </div>
-
- <div class="control-group">
- <label class="control-label" for="user_username">
- <%= t('.username') %>
- </label>
-
- <div class="controls">
- <%= f.text_field :username, :placeholder => "jedi_guy", :title => t('registrations.new.enter_username'), :required => true, :pattern => "[A-Za-z0-9_]+" %>
- </div>
- </div>
-
- <div class="control-group">
- <label class="control-label" for="user_password">
- <%= t('.password') %>
- </label>
-
- <div class="controls">
- <%= f.password_field :password, :placeholder => "••••••••", :title => t('registrations.new.enter_password'), :required => true, :pattern => "......+" %>
- </div>
- </div>
-
- <div class="control-group">
- <label class="control-label" for="user_password_confirmation">
- <%= t('.password_confirmation') %>
- </label>
-
- <div class="controls">
- <%= f.password_field :password_confirmation, :placeholder => "••••••••", :title => t('registrations.new.enter_password_again'), :required => true, :pattern => "......+" %>
- </div>
- </div>
-
- <% if AppConfig.settings.captcha.enable? %>
- <div class="control-group" id="captcha">
- <%= show_simple_captcha(:object => 'user', :code_type => 'numeric') %>
- </div>
- <% end %>
- <%= invite_hidden_tag(invite) %>
- </fieldset>
- <% if AppConfig.settings.terms.enable? %>
- <div id="terms" class="text-center">
- <%= t('.terms', terms_link: link_to(t('.terms_link'), terms_path, target: "_blank")).html_safe %>
- </div>
- <% end %>
- <%= f.submit t('.continue'), :class => "new-btn", :disable_with => t('.submitting') %>
- <% end %>
- </div>
- </div>
- </div>
-</div>
diff --git a/app/views/registrations/new.mobile.haml b/app/views/registrations/new.mobile.haml
index 33f31e89a..3813a6625 100644
--- a/app/views/registrations/new.mobile.haml
+++ b/app/views/registrations/new.mobile.haml
@@ -18,37 +18,39 @@
%fieldset
%legend
= image_tag('branding/header-logo2x.png', :height => 40, :width => 40)
- = t('aspects.aspect_stream.make_something').upcase
+ = t('aspects.aspect_stream.make_something')
.control-group
- = f.label :username, t('username').upcase
+ = f.label :username, t('username')
.controls
= f.text_field :username, :placeholder => "jedi_guy"
.control-group
- = f.label :email, t('email').upcase
+ = f.label :email, t('email')
.controls
= f.text_field :email, :placeholder => "luke@hoth.net"
.control-group
- = f.label :password, t('password').upcase
+ = f.label :password, t('password')
.controls
= f.password_field :password, :placeholder => "••••••••"
-
+
.control-group
- = f.label :password_confirmation, t('password_confirmation').upcase
+ = f.label :password_confirmation, t('password_confirmation')
.controls
= f.password_field :password_confirmation, :placeholder => "••••••••"
-
+
- if AppConfig.settings.captcha.enable?
= show_simple_captcha(:object => 'user', :code_type => 'numeric')
-
+
+ = invite_hidden_tag(invite)
+
- if AppConfig.settings.terms.enable?
= t('registrations.new.terms', terms_link: link_to(t('registrations.new.terms_link'), terms_path, target: "_blank")).html_safe
.controls
= f.submit t('registrations.new.create_my_account'), :class => 'btn primary', :disable_with => t('registrations.new.submitting')
- = link_to t('devise.sessions.new.sign_in'), new_user_session_path(), :class => 'btn primary', :style => "float: right;"
+ = link_to t('devise.sessions.new.sign_in'), new_user_session_path(), :class => 'btn btn-link', :style => "float: right;"
%footer
= link_to t('layouts.application.toggle'), toggle_mobile_path
diff --git a/app/views/report/index.html.haml b/app/views/report/index.html.haml
index e659721cc..d9a3e4eae 100644
--- a/app/views/report/index.html.haml
+++ b/app/views/report/index.html.haml
@@ -1,29 +1,29 @@
+.container
+ %div
+ = render :partial => 'admins/admin_bar'
-%div
- = render :partial => 'admins/admin_bar'
-
-%div.row
- %div.span12
- %h1
- = t('report.title')
- %div#reports
- - @reports.each do |r|
- - username = User.find_by_id(r.user_id).username
- %div.content
- %span.text
- = report_content(r.item_id, r.item_type)
- %span
- = raw t('report.reported_label', person: link_to(username, user_profile_path(username)))
- %span
- = t('report.reason_label', text: r.text)
- %div.options.text-right
- %span
- = button_to t('report.review_link'), report_path(r.id, :type => r.item_type),
- :class => "btn btn-info btn-small",
- method: :put
- %span
- = button_to t('report.delete_link'), report_path(r.id, :type => r.item_type),
- :data => { :confirm => t('report.confirm_deletion') },
- :class => "btn btn-danger btn-small",
- method: :delete
- %div.clear
+ %div.row
+ %div.span12
+ %h1
+ = t('report.title')
+ %div#reports
+ - @reports.each do |r|
+ - username = User.find_by_id(r.user_id).username
+ %div.content
+ %span.text
+ = report_content(r.item_id, r.item_type)
+ %span
+ = raw t('report.reported_label', person: link_to(username, user_profile_path(username)))
+ %span
+ = t('report.reason_label', text: r.text)
+ %div.options.text-right
+ %span
+ = button_to t('report.review_link'), report_path(r.id, :type => r.item_type),
+ :class => "btn btn-info btn-small",
+ method: :put
+ %span
+ = button_to t('report.delete_link'), report_path(r.id, :type => r.item_type),
+ :data => { :confirm => t('report.confirm_deletion') },
+ :class => "btn btn-danger btn-small",
+ method: :delete
+ %div.clear
diff --git a/app/views/services/index.html.haml b/app/views/services/index.html.haml
index 65780fdcd..16c8cf1dc 100644
--- a/app/views/services/index.html.haml
+++ b/app/views/services/index.html.haml
@@ -5,8 +5,6 @@
- content_for :page_title do
= t('.edit_services')
-.bootstrap_header_padding
-
.container
.row-fluid
.span12
diff --git a/app/views/sessions/new.html.haml b/app/views/sessions/new.html.haml
index 48337eaf0..97d6a67f1 100644
--- a/app/views/sessions/new.html.haml
+++ b/app/views/sessions/new.html.haml
@@ -1,40 +1,42 @@
- content_for :page_title do
- = AppConfig.settings.pod_name + " / " + t('devise.sessions.new.sign_in')
+ = AppConfig.settings.pod_name + " - " + t('devise.sessions.new.sign_in')
.container-fluid#login
- .row-fluid
- .span12.text-center
- .branding-asterisk
- %h1
- = AppConfig.settings.pod_name
+ .text-center
+ .branding-asterisk
+ %h1
+ = AppConfig.settings.pod_name
- .row-fluid
- .span4.offset4
- = form_for resource, :as => resource_name, :url => session_path(resource_name), :html => {:class => 'form-signin'}, :autocomplete => 'off' do |f|
- %fieldset
- = f.text_field :username,
- :placeholder => t('registrations.new.username'),
- :class => 'input-block-level form-control',
- :required => true,
- :pattern => '[A-Za-z0-9_.@\-]+',
- :autocapitalize => 'off',
- :autocorrect => 'off',
- :autofocus => true
- %i.entypo.user
+ = form_for resource, as: resource_name, url: session_path(resource_name), html: {class: 'block-form'}, autocomplete: 'off' do |f|
+ %fieldset
+ %label{for: "user_username"}
+ = t('registrations.new.username')
+ %i.entypo.user
+ = f.text_field :username,
+ placeholder: t('registrations.new.username'),
+ class: 'input-block-level form-control',
+ required: true,
+ pattern: '[A-Za-z0-9_.@\-]+',
+ autocapitalize: 'none',
+ autocorrect: 'off',
+ autofocus: true
- = f.password_field :password,
- :placeholder => t('registrations.new.password'),
- :class => 'input-block-level form-control',
- :required => true
- %i.entypo.lock
+ %label{for: "user_password"}
+ = t('registrations.new.password')
+ %i.entypo.lock
+ = f.password_field :password,
+ placeholder: t('registrations.new.password'),
+ class: 'input-block-level form-control',
+ required: true,
+ autocapitalize: 'none',
+ autocorrect: 'off'
- = f.hidden_field :remember_me, :value => 1
- = f.submit t('devise.sessions.new.sign_in'), :class => 'btn btn-large btn-block green'
+ = f.hidden_field :remember_me, value: 1
+ = f.submit t('devise.sessions.new.sign_in'), class: 'btn btn-large btn-block'
- - if display_password_reset_link?
- .text-center
- = link_to t('devise.shared.links.forgot_your_password'), new_password_path(resource_name), :id => "forgot_password_link"
-
- - if display_registration_link?
- .text-center
- = link_to t('devise.shared.links.sign_up'), new_registration_path(resource_name)
+ .text-center
+ - if display_password_reset_link?
+ = link_to t('devise.shared.links.forgot_your_password'), new_password_path(resource_name), id: "forgot_password_link"
+ %br
+ - if display_registration_link?
+ = link_to t('devise.shared.links.sign_up'), new_registration_path(resource_name)
diff --git a/app/views/sessions/new.mobile.haml b/app/views/sessions/new.mobile.haml
index 04cf6308c..02a680339 100644
--- a/app/views/sessions/new.mobile.haml
+++ b/app/views/sessions/new.mobile.haml
@@ -22,15 +22,15 @@
%fieldset
%legend
= image_tag('branding/header-logo2x.png', :height => 40, :width => 40)
- = t('devise.sessions.new.login').upcase
-
+ = t('devise.sessions.new.login')
+
.control-group
- = f.label :username, t('username').upcase
+ = f.label :username, t('username')
.controls
= f.text_field :username, :autofocus => true
.control-group
- = f.label :password , t('password').upcase
+ = f.label :password , t('password')
.controls
= f.password_field :password
@@ -39,7 +39,7 @@
.controls
= f.submit t('devise.sessions.new.sign_in'), :class => 'btn primary'
- if display_registration_link?
- = link_to t('devise.shared.links.sign_up'), new_registration_path(resource_name), :class => 'btn primary', :style => "float: right;"
+ = link_to t('devise.shared.links.sign_up'), new_registration_path(resource_name), :class => 'btn btn-link', :style => "float: right;"
%footer
- if display_password_reset_link?
diff --git a/app/views/shared/_contact_list.html.haml b/app/views/shared/_contact_list.html.haml
deleted file mode 100644
index 44e0eb18d..000000000
--- a/app/views/shared/_contact_list.html.haml
+++ /dev/null
@@ -1,19 +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.
-
-
-.contact_list_controls
- = search_field_tag :contact_search, "", id: "contact_list_search", class: 'contact_list_search', results: 5, placeholder: t('.all_contacts')
- = t('contacts', count: @aspect_contacts_count)
-
-.contact_list.searchable
- %ul.contacts
- - for contact in contacts
- %li.contact{:data=>{:contact_id=>contact.id}}
- = person_image_tag contact.person
- %h4.name
- = link_to contact.person.name, contact.person
- .pull-right
- = aspect_membership_button(aspect, contact, contact.person)
-
diff --git a/app/views/shared/_contact_sidebar.html.haml b/app/views/shared/_contact_sidebar.html.haml
deleted file mode 100644
index 4a8fd9335..000000000
--- a/app/views/shared/_contact_sidebar.html.haml
+++ /dev/null
@@ -1,13 +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.
-
-#leftNavBar.span3
- = render 'contacts/aspect_listings'
-
- - if AppConfig.settings.community_spotlight.enable?
- %hr
-
- %ul.left_nav
- %li{:class => ("active" if @spotlight)}
- = link_to t('contacts.spotlight.community_spotlight'), community_spotlight_path, :class => "element_selector"
diff --git a/app/views/shared/_donatepod.html.haml b/app/views/shared/_donatepod.html.haml
index 89b1fe7f2..430525e6f 100644
--- a/app/views/shared/_donatepod.html.haml
+++ b/app/views/shared/_donatepod.html.haml
@@ -1,16 +1,15 @@
-- if AppConfig.settings.paypal_hosted_button_id.present?
+- if AppConfig.settings.paypal_donations.enable?
PayPal:
- %form{:action => "https://www.paypal.com/cgi-bin/webscr", :method => "post"}
- %input{:name => "cmd", :type => "hidden", :value => "_s-xclick"}
- %input{:name => "hosted_button_id", :type => "hidden", :value => AppConfig.settings.paypal_hosted_button_id}
- %input{:name => "on0", :type => "hidden", :value => "Type"}
- %input{:name => "modify", :type => "hidden", :value => "2"}
- %select{:name => "os0"}
- %option{:value => "Mocha"} Mocha : $3.00USD
- %option{:value => "Americano"} Americano : $5.00USD
- %option{:value => "Box o' Joe"} Box o' Joe : $20.00USD
- %input{:name => "currency_code", :type => "hidden", :value => "USD"}
- %input{:name => "submit", :type => "submit", :value => t('aspects.index.donate')}
+ %form{action: "https://www.paypal.com/cgi-bin/webscr", method: "post", target: "_blank"}
+ %input{name: "cmd", type: "hidden", value: "_s-xclick"}
+ - if AppConfig.settings.paypal_donations.paypal_hosted_button_id.present?
+ %input{name: "hosted_button_id", type: "hidden", value: AppConfig.settings.paypal_donations.paypal_hosted_button_id}
+ -if AppConfig.settings.paypal_donations.paypal_unhosted_button_encrypted.present?
+ %input{name: "encrypted", type: "hidden", value: AppConfig.settings.paypal_donations.paypal_unhosted_button_encrypted}
+ %input{name: "currency_code", type: "hidden", value: AppConfig.settings.paypal_donations.currency}
+ %input{name: "submit", type: "submit", value: t("aspects.index.donate"), class: "btn btn-default"}
+
- if AppConfig.bitcoin_donation_address
Bitcoin:
- %input{:type => "text", :id => "bitcoin_address", :value => AppConfig.bitcoin_donation_address, :readonly => true}
+ %input{type: "text", id: "bitcoin_address", value: AppConfig.bitcoin_donation_address, readonly: true}
+
diff --git a/app/views/shared/_invitations.haml b/app/views/shared/_invitations.haml
index 9c2a51a9b..346f5d572 100644
--- a/app/views/shared/_invitations.haml
+++ b/app/views/shared/_invitations.haml
@@ -1,6 +1,6 @@
= t('.share_this')
= invite_link(current_user.invitation_code)
-.btn.btn-link{ 'data-toggle' => 'modal', 'data-target' => '#invitationsModal'}
+.btn-link{ 'data-toggle' => 'modal', 'data-target' => '#invitationsModal'}
= t('.by_email')
= render 'shared/modal',
diff --git a/app/views/shared/_invitations_blueprint.haml b/app/views/shared/_invitations_blueprint.haml
deleted file mode 100644
index dbdd24a61..000000000
--- a/app/views/shared/_invitations_blueprint.haml
+++ /dev/null
@@ -1,3 +0,0 @@
-= t('shared.invitations.share_this')
-= invite_link(current_user.invitation_code)
-= link_to t('shared.invitations.by_email'), new_user_invitation_path(blueprint: true), :title => t('shared.invitations.invite_someone'), :rel => 'facebox'
diff --git a/app/views/shared/_links.haml b/app/views/shared/_links.haml
index 0607a3e82..9287c3e3d 100644
--- a/app/views/shared/_links.haml
+++ b/app/views/shared/_links.haml
@@ -1,7 +1,7 @@
%li= link_to 'diasporafoundation.org', "https://diasporafoundation.org"
%li= link_to 'wiki', "https://wiki.diasporafoundation.org"
%li= link_to t('layouts.application.whats_new'), changelog_url
-%li= link_to(t('layouts.header.code') + " " + pod_version, "#{root_path.chomp('/')}/source.tar.gz", {:title => t('layouts.application.source_package')}) unless request.url.match(/joindiaspora.com/)
+%li= link_to t('layouts.header.code') + " " + pod_version, "#{source_url}", {:title => t('layouts.application.source_package')}
%li= link_to(t('layouts.application.toggle'), toggle_mobile_path)
- if AppConfig.settings.terms.enable?
%li= link_to(t('_terms'), terms_path)
diff --git a/app/views/shared/_post_stats.mobile.haml b/app/views/shared/_post_stats.mobile.haml
new file mode 100644
index 000000000..f4dd8390b
--- /dev/null
+++ b/app/views/shared/_post_stats.mobile.haml
@@ -0,0 +1,21 @@
+.comment_container
+ .post_stats
+ - if @post.public?
+ %span.reshare_count
+ = @post.reshares.size
+
+ %span.comment_count
+ = @post.comments.size
+
+ %span.like_count
+ = @post.likes.size
+
+ %ul.comments
+ = render partial: "comments/comment", collection: @post.comments.for_a_stream, locals: {post: @post}
+
+ %li.comment.add_comment_bottom_link_container
+ = link_to "#", class: "show_comments bottom_collapse active" do
+ = image_tag "icons/arrow_up_small.png"
+
+ - if user_signed_in?
+ = link_to t("comments.new_comment.comment"), new_post_comment_path(@post), class: "add_comment_bottom_link btn comment_action inactive" \ No newline at end of file
diff --git a/app/views/shared/_right_sections.html.haml b/app/views/shared/_right_sections.html.haml
index 6e08a54c2..fb64a3e83 100644
--- a/app/views/shared/_right_sections.html.haml
+++ b/app/views/shared/_right_sections.html.haml
@@ -6,16 +6,16 @@
- if AppConfig.settings.invitations.open?
.section
.title
- .icons-plus
%h5.title-header
+ %i.entypo.plus
= t('shared.invitations.invite_your_friends')
.content
- = render "shared/invitations_blueprint"
+ = render "shared/invitations"
.section
.title
- .icons-heart
%h5.title-header
+ %i.entypo.users
= t('aspects.index.new_here.title')
.content
!= t('aspects.index.new_here.follow', link: link_to("#"+t('shared.publisher.new_user_prefill.newhere'), tag_path(name: t('shared.publisher.new_user_prefill.newhere'))))
@@ -24,8 +24,8 @@
.section
.title
- .icons-question
%h5.title-header
+ %i.entypo.circled-help
= t('aspects.index.help.need_help')
.content
%p
@@ -48,8 +48,8 @@
- unless AppConfig.configured_services.blank? || all_services_connected?
.section
.title
- .icons-monotone_wrench_settings
%h5.title-header
+ %i.entypo.cog
= t('aspects.index.services.heading')
.content
%div
@@ -62,17 +62,17 @@
.section
.title
- .icons-bookmark
%h5.title-header
+ %i.entypo.bookmark
= t('bookmarklet.heading')
.content
- != t('bookmarklet.explanation', :link => link_to(t('bookmarklet.post_something'), magic_bookmarklet_link))
+ != t('bookmarklet.explanation', :link => link_to(t('bookmarklet.post_something'), bookmarklet_url))
-- if AppConfig.settings.paypal_hosted_button_id.present? || AppConfig.bitcoin_donation_address
+- if AppConfig.settings.paypal_donations.enable? || AppConfig.bitcoin_donation_address
.section
.title
- .icons-coffee
%h5.title-header
+ %i.entypo.heart
= t('aspects.index.donate')
.content
%p
@@ -82,8 +82,8 @@
- if AppConfig.admins.podmin_email.present?
.section
.title
- .icons-mail
%h5.title-header
+ %i.entypo.mail
= t('aspects.index.help.any_problem')
.content
%p
@@ -93,6 +93,7 @@
.section
.title
- %ul.content
- = render "shared/links"
+ .content
+ %ul
+ = render "shared/links"
diff --git a/app/views/shared/_stream_element.mobile.haml b/app/views/shared/_stream_element.mobile.haml
index 18c5bf68e..eda9c75ab 100644
--- a/app/views/shared/_stream_element.mobile.haml
+++ b/app/views/shared/_stream_element.mobile.haml
@@ -2,24 +2,24 @@
-# licensed under the Affero General Public License version 3 or later. See
-# the COPYRIGHT file.
-.stream_element{:data=>{:guid=>post.id}}
+.stream_element{data: {guid: post.id}}
- if post.respond_to?(:nsfw) && post.nsfw
.shield_wrapper
.shield
%strong #NSFW
|
- = link_to t('javascripts.stream.show_nsfw_post'), '#'
+ = link_to t("javascripts.stream.show_nsfw_post"), "#"
- if post.is_a?(Reshare)
- = render 'reshares/reshare', :reshare => post, :post => post.absolute_root
+ = render "reshares/reshare", reshare: post, post: post.absolute_root
- = render 'shared/photo_area', :post => post
+ = render "shared/photo_area", post: post
.content
- = render 'shared/post_info', :post => post
+ = render "shared/post_info", post: post
- if post.is_a?(StatusMessage)
- = render 'status_messages/status_message', :post => post, :photos => post.photos
+ = render "status_messages/status_message", post: post, photos: post.photos
.bottom_bar
.floater
@@ -30,22 +30,5 @@
!= reactions_link(post)
- if defined?(expanded_info) && expanded_info
- .comment_container
- .post_stats
- - if post.public?
- %span.comment_count
- = post.reshares.size
-
- %span.comment_count
- = post.comments.size
-
- %span.like_count
- = post.likes.size
-
- %ul.comments
- = render :partial => 'comments/comment', :collection => post.comments.order('created_at ASC')
-
- %li.comment.add_comment_bottom_link_container
- - if user_signed_in?
- = link_to t('comments.new_comment.comment'), new_post_comment_path(post), :class => 'add_comment_bottom_link btn comment_action inactive'
+ = render partial: "shared/post_stats", locals: {post: @post}
diff --git a/app/views/shared/_stream_more_button.mobile.haml b/app/views/shared/_stream_more_button.mobile.haml
new file mode 100644
index 000000000..20f5f879a
--- /dev/null
+++ b/app/views/shared/_stream_more_button.mobile.haml
@@ -0,0 +1,15 @@
+-if @stream.stream_posts.length == 15
+ #pagination
+ %a.more-link.paginate{:href => next_page_path}
+ %h1
+ = t("more")
+-elsif params[:max_time].present?
+ #pagination
+ %div.no-more-posts
+ %h2
+ = t("stream_helper.no_more_posts")
+-else
+ #pagination
+ %div.no-more-posts
+ %h2
+ = t("stream_helper.no_posts_yet")
diff --git a/app/views/simple_captcha/_simple_captcha.haml b/app/views/simple_captcha/_simple_captcha.haml
index bc7d70bc4..f8adfb468 100644
--- a/app/views/simple_captcha/_simple_captcha.haml
+++ b/app/views/simple_captcha/_simple_captcha.haml
@@ -1,4 +1,3 @@
-.control-label
+.captcha_img
= simple_captcha_options[:image]
-.controls
- = simple_captcha_options[:field] \ No newline at end of file
+= simple_captcha_options[:field]
diff --git a/app/views/statistics/_statistic.haml b/app/views/statistics/_statistic.haml
new file mode 100644
index 000000000..130dc6c1a
--- /dev/null
+++ b/app/views/statistics/_statistic.haml
@@ -0,0 +1,5 @@
+.span-3
+ %h3{:class => activated}
+ = name
+ .data
+ = value \ No newline at end of file
diff --git a/app/views/statistics/_statistics.haml b/app/views/statistics/_statistics.haml
new file mode 100644
index 000000000..28626eed3
--- /dev/null
+++ b/app/views/statistics/_statistics.haml
@@ -0,0 +1,23 @@
+-# Copyright (c) 2010-2011, Diaspora Inc. This file is
+-# licensed under the Affero General Public License version 3 or later. See
+-# the COPYRIGHT file.
+
+.row-fluid
+ %h1
+ = t('_statistics')
+ = render 'statistics/statistic', name: t('statistics.name'), value: @statistics.name, activated: "serv-enabled"
+ = render 'statistics/statistic', name: t('statistics.version'), value: @statistics.version, activated: "serv-enabled"
+ = render 'statistics/statistic', name: t('statistics.registrations'), value: registrations_status(@statistics), activated: registrations_status_class(@statistics)
+ - if @statistics.expose_user_counts?
+ = render 'statistics/statistic', name: t('statistics.total_users'), value: @statistics.total_users, activated: "serv-enabled"
+ = render 'statistics/statistic', name: t('statistics.active_users_halfyear'), value: @statistics.halfyear_users, activated: "serv-enabled"
+ = render 'statistics/statistic', name: t('statistics.active_users_monthly'), value: @statistics.monthly_users, activated: "serv-enabled"
+ - if @statistics.expose_posts_counts?
+ = render 'statistics/statistic', name: t('statistics.local_posts'), value: @statistics.local_posts, activated: "serv-enabled"
+ - if @statistics.expose_comment_counts?
+ = render 'statistics/statistic', name: t('statistics.local_comments'), value: @statistics.local_comments, activated: "serv-enabled"
+.row-fluid
+ %h1
+ = t('statistics.services')
+ - Configuration::KNOWN_SERVICES.each do |service|
+ = render 'statistics/statistic', name: "#{service.capitalize}", value: service_status(service, @statistics.available_services), activated: service_class(service, @statistics.available_services) \ No newline at end of file
diff --git a/app/views/statistics/statistics.html.haml b/app/views/statistics/statistics.html.haml
new file mode 100644
index 000000000..a55da7893
--- /dev/null
+++ b/app/views/statistics/statistics.html.haml
@@ -0,0 +1 @@
+= render('statistics/statistics') \ No newline at end of file
diff --git a/app/views/statistics/statistics.mobile.haml b/app/views/statistics/statistics.mobile.haml
new file mode 100644
index 000000000..a55da7893
--- /dev/null
+++ b/app/views/statistics/statistics.mobile.haml
@@ -0,0 +1 @@
+= render('statistics/statistics') \ No newline at end of file
diff --git a/app/views/status_messages/bookmarklet.html.haml b/app/views/status_messages/bookmarklet.html.haml
index 835138c19..90958364a 100644
--- a/app/views/status_messages/bookmarklet.html.haml
+++ b/app/views/status_messages/bookmarklet.html.haml
@@ -1,9 +1,3 @@
--# Copyright (c) 2010-2012, Diaspora Inc. This file is
--# licensed under the Affero General Public License version 3 or later. See
--# the COPYRIGHT file.
-
-= javascript_include_tag :home
-
.container-fluid#bookmarklet
.row-fluid
%h4
diff --git a/app/views/status_messages/bookmarklet.mobile.haml b/app/views/status_messages/bookmarklet.mobile.haml
index 7fea219b9..31279a386 100644
--- a/app/views/status_messages/bookmarklet.mobile.haml
+++ b/app/views/status_messages/bookmarklet.mobile.haml
@@ -21,4 +21,4 @@
});
- content_for(:head) do
- = javascript_include_tag :jquery, :mobile
+ = javascript_include_tag :jquery
diff --git a/app/views/status_messages/new.html.haml b/app/views/status_messages/new.html.haml
index 44a50b7bd..88e150b9f 100644
--- a/app/views/status_messages/new.html.haml
+++ b/app/views/status_messages/new.html.haml
@@ -1,21 +1,18 @@
--# Copyright (c) 2010-2011, Diaspora Inc. This file is
--# licensed under the Affero General Public License version 3 or later. See
--# the COPYRIGHT file.
-
-= javascript_include_tag :home
-
-#new_status_message_pane
- .span-15.last
- #facebox_header
- %h3
- = t('.mentioning', :person => @person.name)
-
- = render :partial => 'publisher/publisher', :locals => { :aspect => @aspect, :aspect_ids => @aspect_ids, :selected_aspects => @aspects_with_person, :person => @person}
+= render :partial => 'publisher/publisher',
+ :locals => { :aspect => @aspect,
+ :aspect_ids => @aspect_ids,
+ :selected_aspects => @aspects_with_person,
+ :person => @person }
:javascript
$(function() {
app.publisher = new app.views.Publisher({
standalone: true
});
- $("#publisher").bind('ajax:success', function(){ location.reload(); });
+ app.publisher.open();
+ $("#publisher").bind('ajax:success', function(){
+ $("#mentionModal").modal('hide');
+ app.publisher.clear();
+ location.reload();
+ });
});
diff --git a/app/views/streams/main_stream.html.haml b/app/views/streams/main_stream.html.haml
index 82458ace6..ba2e90e5f 100644
--- a/app/views/streams/main_stream.html.haml
+++ b/app/views/streams/main_stream.html.haml
@@ -2,58 +2,56 @@
-# licensed under the Affero General Public License version 3 or later. See
-# the COPYRIGHT file.
-
- content_for :head do
- = javascript_include_tag :home
+ - if AppConfig.chat.enabled?
+ = javascript_include_tag :jsxc, :id => 'jsxc',
+ :data => { :endpoint => get_bosh_endpoint }
- if current_user.getting_started?
#welcome-to-diaspora
- .container{:style => "position: relative;"}
- .right
- = link_to image_tag('close_label.png'), getting_started_completed_path, :id => "gs-skip-x"
- .span-23
- %h1
- = t('aspects.index.welcome_to_diaspora', :name => current_user.first_name)
- %h3
- = t('aspects.index.introduce_yourself')
- %br
- %br
- %br
- %br
- %br
-
-.span-5#leftNavBar
- #home_user_badge
- = owner_image_link
- %h4
- = link_to current_user.first_name, local_or_remote_person_path(current_user.person)
-
- %ul#stream_selection
- %li.hoverable{:data => {:stream => 'stream'}}
- = link_to t("streams.multi.title"), stream_path, :rel => 'backbone'
- %li.hoverable{:data => {:stream => 'activity'}}
- = link_to t("streams.activity.title"), activity_stream_path, :rel => 'backbone'
- %li.hoverable{:data => {:stream => 'mentions'}}
- = link_to t('streams.mentions.title'), mentioned_stream_path, :rel => 'backbone'
- %li.all_aspects
- = render 'aspects/aspect_listings', :stream => @stream
- %li
- = render 'tags/followed_tags_listings'
-
-
-
-.span-13.append-1
- #aspect_stream_container.stream_container
- = render 'aspects/aspect_stream', :stream => @stream
-
-.span-5.rightBar.last
- #selected_aspect_contacts.section
- .title.no_icon
- %h5.stream_title
- = @stream.title
- .content
-
- = render 'shared/right_sections'
-
- %a{:id=>"back-to-top", :title=>"#{t('layouts.application.back_to_top')}", :href=>"#"}
- &#8679;
+ .container-fluid
+ .row-fluid
+ .span8.offset1
+ %h1
+ = t('aspects.index.welcome_to_diaspora', :name => current_user.first_name)
+ %h3
+ = t('aspects.index.introduce_yourself')
+ .span2
+ .pull-right
+ = link_to '&times;'.html_safe, getting_started_completed_path, :id => "gs-skip-x", :class => "close"
+
+.container-fluid
+ .row-fluid
+ .offset1.span2#leftNavBar
+ #home_user_badge
+ = owner_image_link
+ %h4
+ = link_to current_user.first_name, local_or_remote_person_path(current_user.person)
+
+ %ul#stream_selection
+ %li.hoverable{:data => {:stream => 'stream'}}
+ = link_to t("streams.multi.title"), stream_path, :rel => 'backbone'
+ %li.hoverable{:data => {:stream => 'activity'}}
+ = link_to t("streams.activity.title"), activity_stream_path, :rel => 'backbone'
+ %li.hoverable{:data => {:stream => 'mentions'}}
+ = link_to t('streams.mentions.title'), mentioned_stream_path, :rel => 'backbone'
+ %li.all_aspects
+ = render 'aspects/aspect_listings', :stream => @stream
+ %li
+ = render 'tags/followed_tags_listings'
+
+ .span6
+ #aspect_stream_container.stream_container
+ = render 'aspects/aspect_stream', :stream => @stream
+
+ .span2.rightBar
+ #selected_aspect_contacts.section
+ .title.no_icon
+ %h5.stream_title
+ = @stream.title
+ .content
+
+ = render 'shared/right_sections'
+
+ %a{:id=>"back-to-top", :title=>"#{t('layouts.application.back_to_top')}", :href=>"#"}
+ &#8679;
diff --git a/app/views/streams/main_stream.mobile.haml b/app/views/streams/main_stream.mobile.haml
index 7aeb527fe..2cd8c0dbc 100644
--- a/app/views/streams/main_stream.mobile.haml
+++ b/app/views/streams/main_stream.mobile.haml
@@ -10,8 +10,4 @@
#main_stream.stream
= render 'shared/stream', :posts => @stream.stream_posts
- -if @stream.stream_posts.length > 0
- #pagination
- %a.more-link.paginate{:href => next_page_path}
- %h1
- = t("more")
+ = render 'shared/stream_more_button'
diff --git a/app/views/tags/show.haml b/app/views/tags/show.haml
index 4f0cc3469..e65ee419e 100644
--- a/app/views/tags/show.haml
+++ b/app/views/tags/show.haml
@@ -8,37 +8,30 @@
- else
= t('.whatup', :pod => @pod_url)
+.container-fluid#tags_show
+ .row-fluid
+ .span3.offset1
+ %h4
+ = t('.tagged_people', :count => @stream.tagged_people_count, :tag => @stream.display_tag_name)
-- content_for :body_class do
- = "tags_show"
+ .side_stream.stream
+ = render :partial => 'people/index', :locals => {:people => @stream.tagged_people}
-#leftNavBar
- %h3
- = t('people', :count => @stream.tagged_people_count)
+ .span7
+ .stream_container
+ #author_info
+ %h2
+ = @stream.display_tag_name
- .side_stream.stream
- = render :partial => 'people/index', :locals => {:people => @stream.tagged_people}
+ - if current_user
+ = render 'publisher/publisher', :selected_aspects => @stream.aspect_ids, :aspect_ids => @stream.aspect_ids, :aspect => @stream.aspect
- %br
+ %hr
- - if user_signed_in?
- = render "tags/followed_tags_listings"
+ #main_stream.stream
-.span-15.last
- .stream_container
- #author_info
- %h2
- = @stream.display_tag_name
+ #paginate
+ %span.loader.hidden
- - if current_user
- = render 'publisher/publisher', :selected_aspects => @stream.aspect_ids, :aspect_ids => @stream.aspect_ids, :aspect => @stream.aspect
-
- %hr
-
- #main_stream.stream
-
- #paginate
- %span.loader.hidden
-
- %a{:id=>"back-to-top", :title=>"#{t('layouts.application.back_to_top')}", :href=>"#"}
- &#8679;
+ %a{:id=>"back-to-top", :title=>"#{t('layouts.application.back_to_top')}", :href=>"#"}
+ &#8679;
diff --git a/app/views/tags/show.mobile.haml b/app/views/tags/show.mobile.haml
index a99d0387c..581af773a 100644
--- a/app/views/tags/show.mobile.haml
+++ b/app/views/tags/show.mobile.haml
@@ -7,9 +7,5 @@
#main_stream.stream
= render 'shared/stream', :posts => @stream.stream_posts
- -if @stream.stream_posts.length > 0
- #pagination
- %a.more-link.paginate{:href => next_page_path}
- %h1
- = t("more")
+ = render 'shared/stream_more_button'
diff --git a/app/views/users/edit.html.haml b/app/views/users/edit.html.haml
index 64b7cd5f1..d94681dbc 100644
--- a/app/views/users/edit.html.haml
+++ b/app/views/users/edit.html.haml
@@ -5,8 +5,6 @@
- content_for :page_title do
= t('.edit_account')
-.bootstrap_header_padding
-
.container
.row-fluid
.span12
@@ -41,10 +39,11 @@
.row-fluid
.span12
- %h3
+ %h3
= t('.change_password')
- = form_for 'user', :url => user_path, :html => { :method => :put } do |f|
- = f.error_messages
+ = form_for @user, :url => user_path, :html => { :method => :put } do |f|
+ - if (@user.errors.keys & [:password, :password_confirmation, :current_password]).present?
+ = f.error_messages
%p
= f.label :current_password, t('.current_password')
= f.password_field :current_password, :placeholder => t('.current_password_expl')
@@ -58,17 +57,15 @@
.submit_block
= link_to t('cancel'), edit_user_path
= t('or')
- = f.submit t('.change_password'), :class => "btn"
+ = f.submit t('.change_password'), class: "btn", name: 'change_password'
%hr
.row-fluid
.span-12
- %h3
+ %h3
= t('.change_language')
= form_for 'user', :url => user_path, :html => { :method => :put } do |f|
- = f.error_messages
-
.form-inline
= f.select :language, available_language_options
= f.submit t('.change_language'), :class => "btn"
@@ -81,13 +78,13 @@
%h3#stream-preferences
= t('.stream_preferences')
= form_for current_user, :url => user_path, :html => { :method => :put } do |f|
- = f.error_messages
= f.fields_for :stream_preferences do |type|
#stream_prefs
- = f.label :show_community_spotlight_in_stream, :class => "checkbox" do
- = f.check_box :show_community_spotlight_in_stream
- = t('.show_community_spotlight')
+ - if AppConfig.settings.community_spotlight.enable?
+ = f.label :show_community_spotlight_in_stream, :class => "checkbox" do
+ = f.check_box :show_community_spotlight_in_stream
+ = t('.show_community_spotlight')
.small-horizontal-spacer
= f.label :getting_started, :class => "checkbox" do
@@ -101,12 +98,10 @@
.row-fluid
.span-12
-
+
%h3#auto-follow-back-preferences
= t('.following')
= form_for current_user, :url => user_path, :html => { :method => :put } do |f|
- = f.error_messages
-
= f.label :auto_follow_back, :class => "checkbox" do
= f.check_box :auto_follow_back
= t('.auto_follow_back')
@@ -122,11 +117,9 @@
.row-fluid
.span-12
- %h3
+ %h3
= t('.receive_email_notifications')
= form_for 'user', :url => user_path, :html => { :method => :put } do |f|
- = f.error_messages
-
= f.fields_for :email_preferences do |type|
#email_prefs
- if current_user.admin?
@@ -145,49 +138,68 @@
= type.check_box :mentioned, {:checked => @email_prefs['mentioned']}, false, true
= t('.mentioned')
.small-horizontal-spacer
-
+
= type.label :liked, :class => "checkbox" do
= type.check_box :liked, {:checked => @email_prefs['liked']}, false, true
= t('.liked')
.small-horizontal-spacer
-
+
= type.label :reshared, :class => "checkbox" do
= type.check_box :reshared, {:checked => @email_prefs['reshared']}, false, true
= t('.reshared')
.small-horizontal-spacer
-
+
= type.label :comment_on_post, :class => "checkbox" 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" 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" do
= type.check_box :private_message, {:checked => @email_prefs['private_message']}, false, true
= t('.private_message')
.small-horizontal-spacer
-
- = f.submit t('.change'), :class => "btn"
+
+ = f.submit t('.change'), :class => "btn", :id => "change_email_preferences"
%hr
.row-fluid
#account_data.span6
- %h3
+ %h3
= t('.export_data')
- = link_to t('.download_xml'), export_user_path, :class => "button"
- .small-horizontal-spacer
- = link_to t('.download_photos'), "#", :class => "button", :id => "photo-export-button", :title => t('.photo_export_unavailable')
+ - if current_user.exporting
+ .export-in-progress= t('.export_in_progress')
+ - elsif current_user.export.present?
+ = link_to t('.download_export'), download_profile_user_path, class: "btn btn-success"
+ %h6
+ = t('.last_exported_at', timestamp: current_user.exported_at)
+ = link_to t(".request_export_update"), export_profile_user_path, method: :post, class: "btn"
+ - else
+ = link_to t(".request_export"), export_profile_user_path, method: :post, class: "btn"
+
+ - if current_user.exporting_photos
+ .small-horizontal-spacer
+ .export-in-progress= t('.export_photos_in_progress')
+ - elsif current_user.exported_photos_file.present?
+ .small-horizontal-spacer
+ = link_to t('.download_export_photos'), download_photos_user_path, class: "btn btn-success"
+ %h6
+ = t('.last_exported_at', timestamp: current_user.exported_photos_at)
+ = link_to t(".request_export_photos_update"), export_photos_user_path, method: :post, class: "btn"
+ - else
+ .small-horizontal-spacer
+ = link_to t(".request_export_photos"), export_photos_user_path, method: :post, class: "btn"
.span6
%h3
= t('.close_account_text')
- =link_to t('.close_account_text'), '#close_account_pane', :rel => 'facebox', :class => "button", :id => "close_account"
+ =link_to t('.close_account_text'), '#close_account_pane', :rel => 'facebox', :class => "btn btn-danger", :id => "close_account"
.hidden#close_account_pane{:rel => 'facebox'}
#inner_account_delete
diff --git a/app/views/users/edit.mobile.haml b/app/views/users/edit.mobile.haml
index d71ce824a..688db8b18 100644
--- a/app/views/users/edit.mobile.haml
+++ b/app/views/users/edit.mobile.haml
@@ -161,15 +161,32 @@
#account_data.span-5.append-2
%h4
= t('.export_data')
- = link_to t('.download_xml'), export_user_path, :class => "btn"
+ - if current_user.exporting
+ .export-in-progress= t('.export_in_progress')
+ - elsif current_user.export.present?
+ = link_to t('.download_export'), download_profile_user_path, class: "btn btn-success"
+ %h6
+ = t('.last_exported_at', timestamp: current_user.exported_at)
+ = link_to t('.request_export_update'), export_profile_user_path, class: "btn"
+ - else
+ = link_to t('.request_export'), export_profile_user_path, :class => "btn"
%br
%br
- = link_to t('.download_photos'), "#", :class => "btn", :id => "photo-export-button", :title => t('.photo_export_unavailable')
+ - if current_user.exporting_photos
+ .export-in-progress= t('.export_photos_in_progress')
+ - elsif current_user.exported_photos_file.present?
+ = link_to t('.download_export_photos'), download_photos_user_path, class: "btn btn-success"
+ %h6
+ = t('.last_exported_at', timestamp: current_user.exported_photos_at)
+ = link_to t('.request_export_photos_update'), export_photos_user_path, class: "btn"
+ - else
+ = link_to t('.request_export_photos'), export_photos_user_path, :class => "btn"
+ %hr
.span-5.last
%h4
= t('.close_account_text')
- =link_to t('.close_account_text'), '#close_account_pane', :rel => 'facebox', :class => "btn", :id => "close_account"
+ =link_to t('.close_account_text'), '#close_account_pane', :rel => 'facebox', :class => "btn btn-danger", :id => "close_account"
.hidden#close_account_pane{:rel => 'facebox'}
#inner_account_delete
@@ -204,3 +221,4 @@
= f.password_field :current_password, :id => :close_account_password
%p
= f.submit t('.close_account_text'), :id => "close_account_confirm", :data => { :confirm => t('are_you_sure_delete_account') }
+ %br
diff --git a/app/views/users/export_email.markerb b/app/views/users/export_email.markerb
new file mode 100644
index 000000000..c345ae67a
--- /dev/null
+++ b/app/views/users/export_email.markerb
@@ -0,0 +1 @@
+<%= t('notifier.export_email.body', url: download_profile_user_url, name: @user.first_name) %>
diff --git a/app/views/users/export_failure_email.markerb b/app/views/users/export_failure_email.markerb
new file mode 100644
index 000000000..33da52efb
--- /dev/null
+++ b/app/views/users/export_failure_email.markerb
@@ -0,0 +1 @@
+<%= t('notifier.export_failure_email.body', name: @user.first_name) %>
diff --git a/app/views/users/export_photos_email.markerb b/app/views/users/export_photos_email.markerb
new file mode 100644
index 000000000..24bc4fd1d
--- /dev/null
+++ b/app/views/users/export_photos_email.markerb
@@ -0,0 +1 @@
+<%= t('notifier.export_photos_email.body', url: download_photos_user_url, name: @user.first_name) %>
diff --git a/app/views/users/export_photos_failure_email.markerb b/app/views/users/export_photos_failure_email.markerb
new file mode 100644
index 000000000..2067327c9
--- /dev/null
+++ b/app/views/users/export_photos_failure_email.markerb
@@ -0,0 +1 @@
+<%= t('notifier.export_photos_failure_email.body', name: @user.first_name) %>
diff --git a/app/views/users/getting_started.haml b/app/views/users/getting_started.haml
index 828cce11d..0da1ed832 100644
--- a/app/views/users/getting_started.haml
+++ b/app/views/users/getting_started.haml
@@ -1,10 +1,3 @@
--# 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 :profile
-
.container
.row
%section#hello-there.span12
diff --git a/app/views/users/privacy_settings.html.haml b/app/views/users/privacy_settings.html.haml
index 9ed9c8d0d..82b724f5c 100644
--- a/app/views/users/privacy_settings.html.haml
+++ b/app/views/users/privacy_settings.html.haml
@@ -5,8 +5,6 @@
- content_for :page_title do
= t('.title')
-.bootstrap_header_padding
-
.container
.row-fluid
.span12
@@ -19,8 +17,31 @@
.span3
.span5
%h3
+ = t('.title')
+
+ = form_for current_user, :url => user_path, :html => { :method => :put } do |f|
+ = f.error_messages
+
+ = f.fields_for :stream_preferences do |type|
+ #stream_prefs
+ = f.label :strip_exif, :class => "checkbox" do
+ = f.check_box :strip_exif
+ = t('.strip_exif')
+
+ .small-horizontal-spacer
+ = f.submit t('users.edit.change'), :class => 'btn'
+
+ %hr
+
+ .row-fluid
+ .span3
+ .span5
+ %h3
= t('.ignored_users')
+ - if @blocks.length.zero?
+ = t('.no_user_ignored_message')
+
- @blocks.each do |block|
= block.person_name
\-
diff --git a/app/workers/base.rb b/app/workers/base.rb
index 1e6d4718e..c43f60929 100644
--- a/app/workers/base.rb
+++ b/app/workers/base.rb
@@ -12,7 +12,9 @@ module Workers
def suppress_annoying_errors(&block)
yield
rescue Diaspora::ContactRequiredUnlessRequest,
- Diaspora::RelayableObjectWithoutParent => e
+ Diaspora::RelayableObjectWithoutParent,
+ # Friendica seems to provoke these
+ Diaspora::AuthorXMLAuthorMismatch => e
Rails.logger.info("error on receive: #{e.class}")
rescue ActiveRecord::RecordInvalid => e
Rails.logger.info("failed to save received object: #{e.record.errors.full_messages}")
diff --git a/app/workers/deferred_dispatch.rb b/app/workers/deferred_dispatch.rb
index 1833ce9b9..46fa894c3 100644
--- a/app/workers/deferred_dispatch.rb
+++ b/app/workers/deferred_dispatch.rb
@@ -10,13 +10,14 @@ module Workers
user = User.find(user_id)
object = object_class_name.constantize.find(object_id)
opts = HashWithIndifferentAccess.new(opts)
- opts[:services] = user.services.where(:type => opts.delete(:service_types)).all
+ opts[:services] = user.services.where(:type => opts.delete(:service_types))
if opts[:additional_subscribers].present?
opts[:additional_subscribers] = Person.where(:id => opts[:additional_subscribers])
end
Postzord::Dispatcher.build(user, object, opts).post
+ rescue ActiveRecord::RecordNotFound # The target got deleted before the job was run
end
end
end
diff --git a/app/workers/export_photos.rb b/app/workers/export_photos.rb
new file mode 100644
index 000000000..a0f2471e9
--- /dev/null
+++ b/app/workers/export_photos.rb
@@ -0,0 +1,21 @@
+# Copyright (c) 2010-2011, Diaspora Inc. This file is
+# licensed under the Affero General Public License version 3 or later. See
+# the COPYRIGHT file.
+
+
+module Workers
+ class ExportPhotos < Base
+ sidekiq_options queue: :export
+
+ def perform(user_id)
+ @user = User.find(user_id)
+ @user.perform_export_photos!
+
+ if @user.reload.exported_photos_file.present?
+ ExportMailer.export_photos_complete_for(@user)
+ else
+ ExportMailer.export_photos_failure_for(@user)
+ end
+ end
+ end
+end
diff --git a/app/workers/export_user.rb b/app/workers/export_user.rb
new file mode 100644
index 000000000..2e1e55aa8
--- /dev/null
+++ b/app/workers/export_user.rb
@@ -0,0 +1,21 @@
+# Copyright (c) 2010-2011, Diaspora Inc. This file is
+# licensed under the Affero General Public License version 3 or later. See
+# the COPYRIGHT file.
+
+
+module Workers
+ class ExportUser < Base
+ sidekiq_options queue: :export
+
+ def perform(user_id)
+ @user = User.find(user_id)
+ @user.perform_export!
+
+ if @user.reload.export.present?
+ ExportMailer.export_complete_for(@user).deliver_now
+ else
+ ExportMailer.export_failure_for(@user).deliver_now
+ end
+ end
+ end
+end
diff --git a/app/workers/gather_o_embed_data.rb b/app/workers/gather_o_embed_data.rb
index 2f8c90119..cb0ad0819 100644
--- a/app/workers/gather_o_embed_data.rb
+++ b/app/workers/gather_o_embed_data.rb
@@ -9,7 +9,7 @@ module Workers
def perform(post_id, url, retry_count=1)
post = Post.find(post_id)
- post.o_embed_cache = OEmbedCache.find_or_create_by_url(url)
+ post.o_embed_cache = OEmbedCache.find_or_create_by(url: url)
post.save
rescue ActiveRecord::RecordNotFound
# User created a post and deleted it right afterwards before we
diff --git a/app/workers/gather_open_graph_data.rb b/app/workers/gather_open_graph_data.rb
index d73954d86..18c97ab8b 100644
--- a/app/workers/gather_open_graph_data.rb
+++ b/app/workers/gather_open_graph_data.rb
@@ -9,7 +9,7 @@ module Workers
def perform(post_id, url, retry_count=1)
post = Post.find(post_id)
- post.open_graph_cache = OpenGraphCache.find_or_create_by_url(url)
+ post.open_graph_cache = OpenGraphCache.find_or_create_by(url: url)
post.save
rescue ActiveRecord::RecordNotFound
# User created a post and deleted it right afterwards before we
diff --git a/app/workers/mail/also_commented.rb b/app/workers/mail/also_commented.rb
index 617c1961a..2197c8e25 100644
--- a/app/workers/mail/also_commented.rb
+++ b/app/workers/mail/also_commented.rb
@@ -5,7 +5,7 @@ module Workers
def perform(recipient_id, sender_id, comment_id)
if email = Notifier.also_commented(recipient_id, sender_id, comment_id)
- email.deliver
+ email.deliver_now
end
end
end
diff --git a/app/workers/mail/comment_on_post.rb b/app/workers/mail/comment_on_post.rb
index 5ec07782a..fc397518d 100644
--- a/app/workers/mail/comment_on_post.rb
+++ b/app/workers/mail/comment_on_post.rb
@@ -4,7 +4,7 @@ module Workers
sidekiq_options queue: :mail
def perform(recipient_id, sender_id, comment_id)
- Notifier.comment_on_post(recipient_id, sender_id, comment_id).deliver
+ Notifier.comment_on_post(recipient_id, sender_id, comment_id).deliver_now
end
end
end
diff --git a/app/workers/mail/confirm_email.rb b/app/workers/mail/confirm_email.rb
index ec7c6742e..05a9cef5e 100644
--- a/app/workers/mail/confirm_email.rb
+++ b/app/workers/mail/confirm_email.rb
@@ -4,7 +4,7 @@ module Workers
sidekiq_options queue: :mail
def perform(user_id)
- Notifier.confirm_email(user_id).deliver
+ Notifier.confirm_email(user_id).deliver_now
end
end
end
diff --git a/app/workers/mail/liked.rb b/app/workers/mail/liked.rb
index 195c73622..a80555859 100644
--- a/app/workers/mail/liked.rb
+++ b/app/workers/mail/liked.rb
@@ -4,7 +4,7 @@ module Workers
sidekiq_options queue: :mail
def perform(recipient_id, sender_id, like_id)
- Notifier.liked(recipient_id, sender_id, like_id).deliver
+ Notifier.liked(recipient_id, sender_id, like_id).deliver_now
end
end
end
diff --git a/app/workers/mail/mentioned.rb b/app/workers/mail/mentioned.rb
index 950063ec6..06dac676b 100644
--- a/app/workers/mail/mentioned.rb
+++ b/app/workers/mail/mentioned.rb
@@ -9,7 +9,7 @@ module Workers
sidekiq_options queue: :mail
def perform(recipient_id, actor_id, target_id)
- Notifier.mentioned( recipient_id, actor_id, target_id).deliver
+ Notifier.mentioned( recipient_id, actor_id, target_id).deliver_now
end
end
end
diff --git a/app/workers/mail/private_message.rb b/app/workers/mail/private_message.rb
index 3fe953539..6d48d5dbf 100644
--- a/app/workers/mail/private_message.rb
+++ b/app/workers/mail/private_message.rb
@@ -9,7 +9,7 @@ module Workers
sidekiq_options queue: :mail
def perform(recipient_id, actor_id, target_id)
- Notifier.private_message( recipient_id, actor_id, target_id).deliver
+ Notifier.private_message( recipient_id, actor_id, target_id).deliver_now
end
end
end
diff --git a/app/workers/mail/report_worker.rb b/app/workers/mail/report_worker.rb
index 92c201dcb..6d272f486 100644
--- a/app/workers/mail/report_worker.rb
+++ b/app/workers/mail/report_worker.rb
@@ -4,7 +4,7 @@ module Workers
sidekiq_options queue: :mail
def perform(type, id)
- ReportMailer.new_report(type, id)
+ ReportMailer.new_report(type, id).deliver_now
end
end
end
diff --git a/app/workers/mail/reshared.rb b/app/workers/mail/reshared.rb
index 97d74bb61..20df36ac0 100644
--- a/app/workers/mail/reshared.rb
+++ b/app/workers/mail/reshared.rb
@@ -4,7 +4,7 @@ module Workers
sidekiq_options queue: :mail
def perform(recipient_id, sender_id, reshare_id)
- Notifier.reshared(recipient_id, sender_id, reshare_id).deliver
+ Notifier.reshared(recipient_id, sender_id, reshare_id).deliver_now
end
end
end
diff --git a/app/workers/mail/started_sharing.rb b/app/workers/mail/started_sharing.rb
index 6ca50f96a..3bc4938c8 100644
--- a/app/workers/mail/started_sharing.rb
+++ b/app/workers/mail/started_sharing.rb
@@ -9,7 +9,7 @@ module Workers
sidekiq_options queue: :mail
def perform(recipient_id, sender_id, target_id)
- Notifier.started_sharing(recipient_id, sender_id).deliver
+ Notifier.started_sharing(recipient_id, sender_id).deliver_now
end
end
end
diff --git a/app/workers/process_photo.rb b/app/workers/process_photo.rb
index 00d959962..2fcdd3943 100644
--- a/app/workers/process_photo.rb
+++ b/app/workers/process_photo.rb
@@ -16,6 +16,7 @@ module Workers
photo.processed_image.store!(unprocessed_image)
photo.save!
+ rescue ActiveRecord::RecordNotFound # Deleted before the job was run
end
end
end
diff --git a/app/workers/queue_users_for_removal.rb b/app/workers/queue_users_for_removal.rb
new file mode 100644
index 000000000..6d98837d6
--- /dev/null
+++ b/app/workers/queue_users_for_removal.rb
@@ -0,0 +1,41 @@
+# Copyright (c) 2010-2011, Diaspora Inc. This file is
+# licensed under the Affero General Public License version 3 or later. See
+# the COPYRIGHT file.
+
+module Workers
+ class QueueUsersForRemoval < Base
+ include Sidetiq::Schedulable
+
+ sidekiq_options queue: :maintenance
+
+ recurrence { daily }
+
+ def perform
+ # Queue users for removal due to inactivity
+ if AppConfig.settings.maintenance.remove_old_users.enable?
+ users = User.where("last_seen < ? and locked_at is null and remove_after is null",
+ Time.now - (AppConfig.settings.maintenance.remove_old_users.after_days.to_i).days)
+ .order(:last_seen)
+ .limit(AppConfig.settings.maintenance.remove_old_users.limit_removals_to_per_day)
+
+ # deliver to be closed emails to account holders
+ # and queue accounts for closing to sidekiq
+ # for those who have not signed in, skip warning and queue removal
+ # in +1 days
+ users.find_each do |user|
+ if user.sign_in_count > 0
+ remove_at = Time.now + AppConfig.settings.maintenance.remove_old_users.warn_days.to_i.days
+ else
+ remove_at = Time.now
+ end
+ user.flag_for_removal(remove_at)
+ if user.sign_in_count > 0
+ # send a warning
+ Maintenance.account_removal_warning(user).deliver_now
+ end
+ Workers::RemoveOldUser.perform_in(remove_at+1.day, user.id)
+ end
+ end
+ end
+ end
+end \ No newline at end of file
diff --git a/app/workers/receive_local_batch.rb b/app/workers/receive_local_batch.rb
index 81d8a9ecf..e243edf5c 100644
--- a/app/workers/receive_local_batch.rb
+++ b/app/workers/receive_local_batch.rb
@@ -10,6 +10,7 @@ module Workers
object = object_class_string.constantize.find(object_id)
receiver = Postzord::Receiver::LocalBatch.new(object, recipient_user_ids)
receiver.perform!
+ rescue ActiveRecord::RecordNotFound # Already deleted before the job could run
end
end
end
diff --git a/app/workers/remove_old_user.rb b/app/workers/remove_old_user.rb
new file mode 100644
index 000000000..d8619b4bf
--- /dev/null
+++ b/app/workers/remove_old_user.rb
@@ -0,0 +1,27 @@
+# Copyright (c) 2010-2011, Diaspora Inc. This file is
+# licensed under the Affero General Public License version 3 or later. See
+# the COPYRIGHT file.
+
+module Workers
+ class RemoveOldUser < Base
+ sidekiq_options queue: :maintenance
+
+ def safe_remove_after
+ # extra safety time to compare in addition to remove_after
+ Time.now-
+ (AppConfig.settings.maintenance.remove_old_users.after_days.to_i).days-
+ (AppConfig.settings.maintenance.remove_old_users.warn_days.to_i).days
+ end
+
+ def perform(user_id)
+ # if user has been flagged as to be removed (see settings.maintenance.remove_old_users)
+ # and hasn't logged in since that flag has been set, we remove the user
+ if AppConfig.settings.maintenance.remove_old_users.enable?
+ user = User.find(user_id)
+ if user.remove_after < Time.now and user.last_seen < self.safe_remove_after
+ user.close_account!
+ end
+ end
+ end
+ end
+end \ No newline at end of file
diff --git a/bin/bundle b/bin/bundle
new file mode 100755
index 000000000..66e9889e8
--- /dev/null
+++ b/bin/bundle
@@ -0,0 +1,3 @@
+#!/usr/bin/env ruby
+ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
+load Gem.bin_path('bundler', 'bundle')
diff --git a/bin/cucumber b/bin/cucumber
new file mode 100755
index 000000000..12971cdce
--- /dev/null
+++ b/bin/cucumber
@@ -0,0 +1,7 @@
+#!/usr/bin/env ruby
+begin
+ load File.expand_path("../spring", __FILE__)
+rescue LoadError
+end
+require 'bundler/setup'
+load Gem.bin_path('cucumber', 'cucumber')
diff --git a/bin/guard b/bin/guard
new file mode 100755
index 000000000..0c1a532bd
--- /dev/null
+++ b/bin/guard
@@ -0,0 +1,16 @@
+#!/usr/bin/env ruby
+#
+# This file was generated by Bundler.
+#
+# The application 'guard' is installed as part of a gem, and
+# this file is here to facilitate running it.
+#
+
+require 'pathname'
+ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
+ Pathname.new(__FILE__).realpath)
+
+require 'rubygems'
+require 'bundler/setup'
+
+load Gem.bin_path('guard', 'guard')
diff --git a/bin/rails b/bin/rails
new file mode 100755
index 000000000..7feb6a30e
--- /dev/null
+++ b/bin/rails
@@ -0,0 +1,8 @@
+#!/usr/bin/env ruby
+begin
+ load File.expand_path("../spring", __FILE__)
+rescue LoadError
+end
+APP_PATH = File.expand_path('../../config/application', __FILE__)
+require_relative '../config/boot'
+require 'rails/commands'
diff --git a/bin/rake b/bin/rake
new file mode 100755
index 000000000..8017a0271
--- /dev/null
+++ b/bin/rake
@@ -0,0 +1,8 @@
+#!/usr/bin/env ruby
+begin
+ load File.expand_path("../spring", __FILE__)
+rescue LoadError
+end
+require_relative '../config/boot'
+require 'rake'
+Rake.application.run
diff --git a/bin/rspec b/bin/rspec
new file mode 100755
index 000000000..20060ebd7
--- /dev/null
+++ b/bin/rspec
@@ -0,0 +1,7 @@
+#!/usr/bin/env ruby
+begin
+ load File.expand_path("../spring", __FILE__)
+rescue LoadError
+end
+require 'bundler/setup'
+load Gem.bin_path('rspec-core', 'rspec')
diff --git a/bin/spring b/bin/spring
new file mode 100755
index 000000000..de6070b2a
--- /dev/null
+++ b/bin/spring
@@ -0,0 +1,18 @@
+#!/usr/bin/env ruby
+
+# This file loads spring without using Bundler, in order to be fast
+# It gets overwritten when you run the `spring binstub` command
+
+unless defined?(Spring)
+ require "rubygems"
+ require "bundler"
+
+ if match = Bundler.default_lockfile.read.match(/^GEM$.*?^ (?: )*spring \((.*?)\)$.*?^$/m)
+ ENV["GEM_PATH"] = ([Bundler.bundle_path.to_s] + Gem.path).join(File::PATH_SEPARATOR)
+ ENV["GEM_HOME"] = nil
+ Gem.paths = ENV
+
+ gem "spring", match[1]
+ require "spring/binstub"
+ end
+end
diff --git a/browserlist b/browserlist
new file mode 100644
index 000000000..16f871167
--- /dev/null
+++ b/browserlist
@@ -0,0 +1,2 @@
+last 2 version
+> 1%
diff --git a/config/.jshint.json b/config/.jshint.json
new file mode 100644
index 000000000..72b2a4dea
--- /dev/null
+++ b/config/.jshint.json
@@ -0,0 +1,68 @@
+{
+ "bitwise": true,
+ "camelcase": true,
+ "curly": true,
+ "eqeqeq": true,
+ "forin": true,
+ "freeze": true,
+ "immed": true,
+ "indent": 2,
+ "latedef": true,
+ "maxlen": 120,
+ "newcap": true,
+ "noarg": true,
+ "noempty": true,
+ "nonbsp": true,
+ "nonew": false,
+ "quotmark": "double",
+ "undef": true,
+ "unused": true,
+
+ "asi": false,
+ "boss": false,
+ "browser": true,
+ "devel": true,
+ "eqnull": true,
+ "evil": false,
+ "expr": false,
+ "jasmine": true,
+ "jquery": true,
+ "lastsemic": true,
+ "laxbreak": false,
+ "laxcomma": false,
+ "loopfunc": false,
+ "notypeof": false,
+ "scripturl": false,
+ "sub": false,
+ "supernew": true,
+
+ "predef": [
+ "_",
+ "Backbone",
+ "gon",
+ "Handlebars",
+ "HandlebarsTemplates",
+ "ImagePaths",
+ "jsxc",
+ "MBP",
+ "Routes",
+ "OSM",
+ "parse_url",
+ "punycode",
+ "qq",
+
+ "loginAs",
+ "logout",
+ "spec",
+ "context",
+ "factory",
+ "stubView",
+ "exports",
+ "spyOn",
+
+ "app",
+ "Diaspora",
+ "Mentions",
+ "PosixBracketExpressions"
+ ]
+}
diff --git a/config/.jshint_ignore b/config/.jshint_ignore
new file mode 100644
index 000000000..59dc22151
--- /dev/null
+++ b/config/.jshint_ignore
@@ -0,0 +1,4 @@
+vendor/assets/javascripts/**.js
+lib/assets/javascripts/fileuploader-custom.js
+lib/assets/javascripts/jquery.autoresize.js
+lib/assets/javascripts/jquery.mentionsInput.js
diff --git a/config/application.rb b/config/application.rb
index a33413f0d..616f2ed6f 100644
--- a/config/application.rb
+++ b/config/application.rb
@@ -1,7 +1,23 @@
require_relative 'boot'
require 'rails/all'
-Bundler.require(*Rails.groups(:assets => %w(development test))) if defined?(Bundler)
+Bundler.require(:default, Rails.env)
+
+# Do not dump the limit of boolean fields on MySQL,
+# since that generates a db/schema.rb that's incompatible
+# with PostgreSQL
+require 'active_record/connection_adapters/abstract_mysql_adapter'
+module ActiveRecord
+ module ConnectionAdapters
+ class Mysql2Adapter < AbstractMysqlAdapter
+ def prepare_column_options(column, *_)
+ super.tap {|spec|
+ spec.delete(:limit) if column.type == :boolean
+ }
+ end
+ end
+ end
+end
# Load asset_sync early
require_relative 'asset_sync'
@@ -34,9 +50,6 @@ module Diaspora
# Configure the default encoding used in templates for Ruby 1.9.
config.encoding = "utf-8"
- # Configure sensitive parameters which will be filtered from the log file.
- config.filter_parameters += [:password, :xml,:message, :text, :bio]
-
# Enable escaping HTML in JSON.
config.active_support.escape_html_entities_in_json = true
@@ -45,12 +58,6 @@ module Diaspora
# like if you have constraints or database-specific column types
# config.active_record.schema_format = :sql
- # Enforce whitelist mode for mass assignment.
- # This will create an empty whitelist of attributes available for mass-assignment for all models
- # in your app. As such, your models will need to explicitly whitelist or blacklist accessible
- # parameters by using an attr_accessible or attr_protected declaration.
- #config.active_record.whitelist_attributes = false
-
# Enable the asset pipeline
config.assets.enabled = true
@@ -59,34 +66,29 @@ module Diaspora
# Precompile additional assets (application.js, application.css, and all non-JS/CSS are already added)
config.assets.precompile += %w{
- aspect-contacts.js
+ aspect-contacts.js
contact-list.js
- home.js
ie.js
inbox.js
jquery.js
jquery_ujs.js
- jquery.textchange.js
- mailchimp.js
+ jquery-textchange.js
main.js
- mobile.js
- profile.js
+ jsxc.js
+ mobile/mobile.js
people.js
- profile.js
publisher.js
templates.js
validation.js
- blueprint.css
bootstrap.css
bootstrap-complete.css
bootstrap-responsive.css
- default.css
error_pages.css
admin.css
mobile/mobile.css
- new-templates.css
rtl.css
+ home.css
}
# Version of your assets, change this if you want to expire all your assets
@@ -97,5 +99,15 @@ module Diaspora
g.template_engine :haml
g.test_framework :rspec
end
+
+ # Will be default with Rails 5
+ config.active_record.raise_in_transactional_callbacks = true
+
+ # Setup action mailer early
+ config.action_mailer.default_url_options = {
+ protocol: AppConfig.pod_uri.scheme,
+ host: AppConfig.pod_uri.authority
+ }
+ config.action_mailer.asset_host = AppConfig.pod_uri.to_s
end
end
diff --git a/config/boot.rb b/config/boot.rb
index 0eee595af..6e3d23427 100644
--- a/config/boot.rb
+++ b/config/boot.rb
@@ -1,5 +1,3 @@
-require 'rubygems'
-
# Set up gems listed in the Gemfile.
ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
require 'bundler/setup' if File.exists?(ENV['BUNDLE_GEMFILE'])
diff --git a/config/database.yml.example b/config/database.yml.example
index baec2fbbf..f5a1e08cd 100644
--- a/config/database.yml.example
+++ b/config/database.yml.example
@@ -5,8 +5,8 @@ mysql: &mysql
username: "root"
password: ""
# socket: /tmp/mysql.sock
- charset: utf8
- collation: utf8_bin
+ encoding: utf8mb4
+ collation: utf8mb4_bin
postgres: &postgres
adapter: postgresql
@@ -25,7 +25,7 @@ common: &common
# Should match environment.sidekiq.concurrency
#pool: 25
-
+
##################################################
#### CONFIGURE ABOVE #############################
##################################################
diff --git a/config/defaults.yml b/config/defaults.yml
index bd6d1f42a..008ce9661 100644
--- a/config/defaults.yml
+++ b/config/defaults.yml
@@ -4,7 +4,7 @@
defaults:
version:
- number: "0.4.1.3" # Do not touch unless doing a release, do not backport the version number that's in master but keep develop to always say "head"
+ number: "0.5.0.0" # Do not touch unless doing a release, do not backport the version number that's in master but keep develop to always say "head"
heroku: false
environment:
url: "http://localhost:3000/"
@@ -40,8 +40,36 @@ defaults:
unicorn_timeout: 90
embed_sidekiq_worker: false
sidekiq_workers: 1
+ chat:
+ enabled: false
+ server:
+ enabled: true
+ certs: 'config/vines'
+ accept_self_signed: false
+ cross_domain_messages: true
+ max_offline_msgs: 150
+ c2s:
+ address: '0.0.0.0'
+ port: 5222
+ max_stanza_size: 65536
+ max_resources_per_account: 5
+ s2s:
+ address: '0.0.0.0'
+ port: 5269
+ max_stanza_size: 131072
+ blacklist: []
+ bosh:
+ proxy: false
+ address: '0.0.0.0'
+ port: 5280
+ bind: '/http-bind'
+ max_stanza_size: 65536
+ max_resources_per_account: 5
+ log:
+ file: 'log/vines.log'
+ level: 'info'
privacy:
- jquery_cdn: true
+ jquery_cdn: false
google_analytics_key:
piwik:
enable: false
@@ -53,6 +81,12 @@ defaults:
user_counts: false
post_counts: false
comment_counts: false
+ camo:
+ proxy_markdown_images: false
+ proxy_opengraph_thumbnails: false
+ proxy_remote_pod_images: false
+ root:
+ key:
settings:
pod_name: 'diaspora*'
enable_registrations: true
@@ -61,7 +95,11 @@ defaults:
invitations:
open: true
count: 25
- paypal_hosted_button_id:
+ paypal_donations:
+ enable: false
+ currency: USD
+ paypal_hosted_button_id:
+ paypal_unhosted_button_encrypted:
bitcoin_address:
community_spotlight:
enable: false
@@ -93,11 +131,19 @@ defaults:
enable: false
jurisdiction: false
minimum_age: false
+ maintenance:
+ remove_old_users:
+ enable: false
+ after_days: 730
+ warn_days: 30
+ limit_removals_to_per_day: 100
+ source_url:
services:
facebook:
enable: false
app_id:
secret:
+ open_graph_namespace: 'joindiaspora'
twitter:
enable: false
key:
diff --git a/config/diaspora.yml.example b/config/diaspora.yml.example
index 6d03d8bc5..aab2d49b4 100644
--- a/config/diaspora.yml.example
+++ b/config/diaspora.yml.example
@@ -24,11 +24,11 @@
## heroku config:set SERVICES_FACEBOOK_APP_ID=yourappid SERVICES_FACEBOOK_SECRET=yourappsecret
configuration: ## Section
-
+
## You need to change or at least review the settings in this section
- ## in order for your pod to work
+ ## in order for your pod to work.
environment: ## Section
-
+
## Set the hostname of the machine you're running Diaspora on, as seen
## from the internet. This should be the URL you want to use to
## access the pod. So if you plan to use a reverse proxy, it should be
@@ -37,7 +37,7 @@ configuration: ## Section
## If you do change the URL, you will have to start again as the URL
## will be hardcoded into the database.
#url: "https://example.org/"
-
+
## Set the bundle of certificate authorities (CA) certificates.
## This is specific to your operating system.
## Examples (uncomment the relevant one or add your own):
@@ -45,39 +45,41 @@ configuration: ## Section
#certificate_authorities: '/etc/ssl/certs/ca-certificates.crt'
## For CentOS, Fedora:
#certificate_authorities: '/etc/pki/tls/certs/ca-bundle.crt'
-
- ## URL for a remote Redis (default=localhost)
+
+ ## URL for a remote Redis (default=localhost).
## Don't forget to restrict IP access if you uncomment these!
#redis: 'redis://example_host'
#redis: 'redis://username:password@host:6379/0'
#redis: 'unix:///tmp/redis.sock'
-
- ## Require SSL (default=true)
- ## When set, your pod will force the use of HTTPS in production mode. Since
- ## OAuth2 requires SSL Diaspora's future API might not work if you're not using
- ## SSL. Also there is no guarantee that posting to services will be possible
- ## if SSL is disabled. Do not change this default unless you are sure!
+
+ ## Require SSL (default=true).
+ ## When set, your pod will force the use of HTTPS in production mode.
+ ## Since OAuth2 requires SSL, Diaspora's future API might not work if
+ ## you're not using SSL. Also there is no guarantee that posting to
+ ## services will be possible if SSL is disabled.
+ ## Do not change this default unless you are sure!
#require_ssl: true
-
- ## Single-process mode (default=false)
- ## If set to true Diaspora will work with just the appserver (Unicorn by default)
- ## running. However, this makes it quite slow as intensive jobs must be run
- ## all the time inside the request cycle. We strongly recommended you leave
- ## this disabled for production setups. Set to true to enable.
+
+ ## Single-process mode (default=false).
+ ## If set to true, Diaspora will work with just the appserver (Unicorn by
+ ## default) running. However, this makes it quite slow as intensive jobs
+ ## must be run all the time inside the request cycle. We strongly
+ ## recommended you leave this disabled for production setups.
+ ## Set to true to enable.
#single_process_mode: false
## Sidekiq - background processing
sidekiq: ## Section
- ## Number of parallel threads Sidekiq uses (default=5)
- ## If you touch this please set the pool setting in your database.yml to
- ## a value that's at minimum close to this! You can safely increase it
- ## to 25 and more on a medium-sized pod. This applies per started Sidekiq
- ## worker, so if you set it to 25 and start two workers you'll process
- ## up to 50 jobs in parallel.
+ ## Number of parallel threads Sidekiq uses (default=5).
+ ## If you touch this, please set the pool setting in your database.yml
+ ## to a value that's at minimum close to this! You can safely increase
+ ## it to 25 and more on a medium-sized pod. This applies per started
+ ## Sidekiq worker, so if you set it to 25 and start two workers, you'll
+ ## process up to 50 jobs in parallel.
#concurrency: 5
- ## Number of times a job is retried (default=10)
+ ## Number of times a job is retried (default=10).
## There's an exponential effect to this: if you set this too high you
## might get too many jobs building up in the queue.
## Set it to false to disable it completely.
@@ -87,16 +89,16 @@ configuration: ## Section
## multiple instances of Diaspora using the same Redis instance.
#namespace: "diaspora"
- ## Lines of backtrace that are stored on failure (default=15)
+ ## Lines of backtrace that are stored on failure (default=15).
## Set n to the required value. Set this to false to reduce memory
## usage (and log size) if you're not interested in this data.
#backtrace: 15
## Log file for Sidekiq (default="log/sidekiq.log")
#log: "log/sidekiq.log"
-
+
## Use Amazon S3 instead of your local filesystem
- ## to handle uploaded pictures (disabled by default)
+ ## to handle uploaded pictures (disabled by default).
s3: ## Section
#enable: true
@@ -105,84 +107,203 @@ configuration: ## Section
#bucket: 'my_photos'
#region: 'us-east-1'
- ## Use max-age header on Amazon S3 resources (default=true)
+ ## Use max-age header on Amazon S3 resources (default=true).
## When true, this allows locally cached images to be served for up to
- ## 1 year. This can improve load speed and save requests to the image host.
- ## Set to false to revert to browser defaults (usually less than 1 year).
+ ## one year. This can improve load speed and save requests to the image
+ ## host. Set to false to revert to browser defaults (usually less than
+ ## one year).
#cache : true
-
- ## Set redirect URL for an external image host (Amazon S3 or other)
+
+ ## Set redirect URL for an external image host (Amazon S3 or other).
## If hosting images for your pod on an external server (even your own),
## add its URL here. All requests made to images under /uploads/images
## will be redirected to https://yourhost.tld/uploads/images/
#image_redirect_url: 'https://images.example.org'
-
+
assets: ## Section
- ## Serve static assets via the appserver (default=false)
+ ## Serve static assets via the appserver (default=false).
## This is highly discouraged for production use. Let your reverse
## proxy/webserver do it by serving the files under public/ directly.
#serve: false
-
- ## Upload your assets to S3 (default=false)
+
+ ## Upload your assets to S3 (default=false).
#upload: false
-
+
## Specify an asset host. Ensure it does not have a trailing slash (/).
#host: http://cdn.example.org/diaspora
- ## Pubsub server (default='https://pubsubhubbub.appspot.com/')
+ ## Pubsub server (default='https://pubsubhubbub.appspot.com/').
## Diaspora is only tested against the default pubsub server.
## You probably don't want to uncomment or change this.
#pubsub_server: 'https://pubsubhubbub.appspot.com/'
-
+
## Settings affecting how ./script/server behaves.
server: ## Section
- ## The port on which the appserver should listen (default=3000):
+ ## The port on which the appserver should listen (default=3000).
#port: 3000
- ## Rails environment (default='development')
+ ## Rails environment (default='development').
## The environment in which the server should be started by default.
- ## Change this if you wish to run a production environment.
+ ## Change this to 'production' if you wish to run a production environment.
#rails_environment: 'development'
-
- ## Write unicorn stderr and stdout log
+
+ ## Write unicorn stderr and stdout log.
#stderr_log: '/usr/local/app/diaspora/log/unicorn-stderr.log'
#stdout_log: '/usr/local/app/diaspora/log/unicorn-stdout.log'
-
- ## Number of Unicorn worker processes (default=2)
+
+ ## Number of Unicorn worker processes (default=2).
## Increase this if you have many users.
#unicorn_worker: 2
- ## Number of seconds before a request is aborted (default=90)
+ ## Number of seconds before a request is aborted (default=90).
## Increase if you get empty responses, or if large image uploads fail.
## Decrease if you're under heavy load and don't care if some
## requests fail.
#unicorn_timeout: 90
-
- ## Embed a Sidekiq worker inside the unicorn process (default=false)
+
+ ## Embed a Sidekiq worker inside the unicorn process (default=false).
## Useful for minimal Heroku setups.
#embed_sidekiq_worker: false
- ## Number of Sidekiq worker processes (default=1)
+ ## Number of Sidekiq worker processes (default=1).
## In most cases it is better to
## increase environment.sidekiq.concurrency instead!
#sidekiq_workers: 1
-
- ## Settings potentially affecting the privacy of your users
+
+ ## Diaspora has an internal XMPP server. If you want to enable the chat
+ ## functionality or want to use a custom XMPP server, then you should edit
+ ## the following configuration.
+ ##
+ ## The internal XMPP server does not support https
+ ## and even if we implement it, we would ran into certificate issues.
+ ## The problem with mixed-content is described here:
+ ## https://github.com/Zauberstuhl/diaspora/issues/6
+ ##
+ ## The easiest way of avoiding certificate and mixed-content issues
+ ## is to use a proxy, e.g.:
+ ##
+ ## Apache: https://gist.github.com/Zauberstuhl/2d09330961614b12b642
+ ## Nginx: https://gist.github.com/Zauberstuhl/ee95e1eacefa6ddbec6e
+ ##
+ ## If you configured your proxy correctly, you should adjust
+ ## the configuration in the BOSH section.
+ chat: ## Section
+
+ ## Enable the chat service and all its components.
+ #enabled: true
+
+ ## Custom XMPP server configuration goes here.
+ server: ## Section
+
+ ## Start built-in XMPP server (default=true).
+ ## In case you want to run your own server, you should disable it.
+ #enabled: false
+
+ ## Set the directory in which to look for virtual hosts'
+ ## TLS certificates.
+ #certs: 'config/vines'
+
+ ## The server accepts by default only valid certificates.
+ ## Any connection which uses self-signed ones will be closed.
+ ## If you'd like to accept self-signed certificates
+ ## on your server, set the next option to true.
+ #accept_self_signed: true
+
+ ## Only edit the next option if you'd like to deny
+ ## your users to exchange messages between other XMPP servers.
+ #cross_domain_messages: false
+
+ ## Set the maximum of offline messages stored per user (default=150).
+ ## If it exceeds, it will start deleting old messages. You can disable
+ ## offline message support completely by setting the option to zero.
+ #max_offline_msgs: 150
+
+ ## Client to server
+ c2s: ## Section
+
+ ## Configure the address that vines should listen on.
+ #address: '0.0.0.0'
+
+ ## Configure the client-to-server port.
+ #port: 5222
+
+ ## The maximum we'd like to allow for stanza size.
+ #max_stanza_size: 65536
+
+ ## The max_resources_per_account attribute, limits how many
+ ## concurrent connections one user can have to the server.
+ #max_resources_per_account: 5
+
+ ## Server to server
+ s2s: ## Section
+
+ ## Configure the address that vines should listen on.
+ #address: '0.0.0.0'
+
+ ## Configure the server-to-server port.
+ #port: 5269
+
+ ## The max_stanza_size attribute should be
+ ## much larger than the setting for client-to-server.
+ #max_stanza_size: 131072
+
+ ## By default every XMPP server with a valid certificate
+ ## is able to communicate with your server. In case of a
+ ## malicious server (e.g. spam reason), you can black-list them.
+ #blacklist:
+ # - 'example.com'
+ # - 'malicous.net'
+
+ ## XEP-0124 BOSH requests
+ bosh: ## Section
+
+ ## If you'd like to use a proxy, you should set the proxy
+ ## option to true, otherwise jsxc always tries to
+ ## connect directly to the port specified below.
+ #proxy: true
+
+ ## Configure the address that vines should listen on.
+ #address: '0.0.0.0'
+
+ ## Configure the BOSH port.
+ #port: 5280
+
+ ## Configure the bind endpoint.
+ #bind: '/http-bind'
+
+ ## The maximum we'd like to allow for stanza size.
+ #max_stanza_size: 65536
+
+ ## The max_resources_per_account attribute, limits how many
+ ## concurrent connections one user can have to the server.
+ #max_resources_per_account: 5
+
+ ## Specify log behaviour here.
+ log: ## Section
+
+ ## Log file location.
+ #file: 'log/vines.log'
+
+ ## Set the logging level to debug, info, warn, error, or fatal.
+ ## The debug level logs all XML sent and received by the server.
+ #level: 'info'
+
+ ## Settings potentially affecting the privacy of your users.
privacy: ## Section
-
- ## Include jQuery from jquery.com's CDN (default=true)
- ## This can save you some traffic and speeds up load time since most
- ## clients already have this one cached. Set this to false if you want
- ## the jQuery library to be loaded from your pod's own resources.
- #jquery_cdn: true
-
- ## Google Analytics (disabled by default)
- ## Provide a key to enable tracking by Google Analytics
+
+ ## Include jQuery from jquery.com's CDN (default=false).
+ ## Enabling this can reduce traffic and speed up load time since most
+ ## clients already have this one cached. When set to false (the default),
+ ## the jQuery library will be loaded from your pod's own resources.
+ #jquery_cdn: false
+
+ ## Google Analytics (disabled by default).
+ ## Provide a key to enable tracking by Google Analytics.
#google_analytics_key:
-
- ## Piwik Tracking (disabled by default)
+
+ ## Piwik Tracking (disabled by default).
## Provide a site ID and the host piwik is running on to enable
## tracking through Piwik.
piwik: ## Section
@@ -190,45 +311,76 @@ configuration: ## Section
#enable: true
#host: 'stats.example.org'
#site_id: 1
-
- ## Mixpanel event tracking (disabled by default)
+
+ ## Mixpanel event tracking (disabled by default).
#mixpanel_uid:
-
- ## Chartbeat tracking (disabled by default)
+
+ ## Chartbeat tracking (disabled by default).
#chartbeat_uid:
-
+
## Statistics
## Your pod will report its name, software version and whether
## or not registrations are open via /statistics.json.
- ## Uncomment the options below to enable more statistics.
+ ## Uncomment the options below to enable more statistics.
statistics: ## Section
- ## Local user total and 6 month active counts
+ ## Local user total and 6 month active counts.
#user_counts: true
- ## Local post total count
+ ## Local post total count.
#post_counts: true
#comment_counts: true
-
+
+ ## Use Camo to proxy embedded remote images.
+ ## Do not enable this setting unless you have a working Camo setup. Using
+ ## camo to proxy embedded images will improve the privacy and security of
+ ## your pod's frontend, but it will increase the traffic on your server.
+ ## Check out https://wiki.diasporafoundation.org/Installation/Camo for
+ ## more details and installation instructions.
+ camo: ## Section
+
+ ## Proxy images embedded via markdown (default=false).
+ ## Embedded images are quite often from non-SSL sites and may cause a
+ ## partial content warning, so this is recommended.
+ #proxy_markdown_images: true
+
+ ## Proxy Open Graph thumbnails (default=false).
+ ## Open Graph thumbnails may or may not be encrypted and loaded from
+ ## servers outside the network. Recommended.
+ #proxy_opengraph_thumbnails: true
+
+ ## Proxy remote pod's images (default=false).
+ ## Profile pictures and photos from other pods usually are encrypted,
+ ## so enabling this is only useful if you want to avoid HTTP requests to
+ ## third-party servers. This will create a lot of traffic on your camo
+ ## instance. You have been warned.
+ #proxy_remote_pod_images: true
+
+ ## Root of your Camo installation
+ #root: "https://example.com/camo/"
+
+ ## Shared key of your Camo installation
+ #key: "example123example456example!"
+
## General settings
settings: ## Section
-
+
## Pod name (default="diaspora*")
## The pod name displayed in various locations, including the header.
#pod_name: "diaspora*"
## Allow registrations (default=true)
- ## Set this to false to prevent people from signing up for your pod
+ ## Set this to false to prevent people from signing up to your pod
## without an invitation. Note that this needs to be set to true
## (or commented out) to enable the first registration (you).
#enable_registrations: true
-
+
## Auto-follow on sign-up (default=true)
## Users will automatically follow a specified account on creation.
## Set this to false if you don't want your users to automatically
## follow an account upon creation.
#autofollow_on_join: true
-
+
## Auto-follow account (default='diasporahq@joindiaspora.com')
## The diaspora* HQ account keeps users up to date with news about Diaspora.
## If you set another auto-follow account (for example your podmin account),
@@ -237,26 +389,38 @@ configuration: ## Section
## Invitation settings
invitations: ## Section
-
+
## Enable invitations (default=true)
## Set this to false if you don't want users to be able to send invites.
#open: true
-
+
## Number of invitations per invite link (default=25)
- ## Every user will see such a link if you have enabled invitations on your pod.
+ ## Every user will see such a link if you have enabled
+ ## invitations on your pod.
#count: 25
+
+ ## Paypal donations (disabled by default)
+ ## You can set details for a Paypal button here to allow donations
+ ## towards running the pod.
+ ## First, enable the function, then set the currency in which you
+ ## wish to receive donations, and **either** a hosted button id
+ ## **or** an encrypted key for an unhosted button.
+ paypal_donations: ## Section
+ #enable: false
- ## Paypal donations
- ## You can provide the ID of a hosted Paypal button here to allow your users
- ## to send donations to help run their pod. If you leave this out your users
- ## will see a button to donate to the Diaspora Foundation instead :)
- #paypal_hosted_button_id: "change_me"
+ ## Currency used (USD, EUR...)
+ #currency: USD
+ ## hosted Paypal button id
+ #paypal_hosted_button_id: "change_me"
+ ## OR encrypted key of unhosted button
+ #paypal_unhosted_button_encrypted: "-----BEGIN PKCS7-----"
+
## Bitcoin donations
## You can provide a bitcoin address here to allow your users to provide
## donations towards the running of their pod.
#bitcoin_address: "change_me"
-
+
## Community spotlight (disabled by default)
## The community spotlight shows new users public posts from people you
## think are interesting in Diaspora's community. To add an account
@@ -268,12 +432,12 @@ configuration: ## Section
## E-mail address to which users can make suggestions about who
## should be in the community spotlight (optional).
#suggest_email: 'admin@example.org'
-
+
## CURL debug (default=false)
## Turn on extra verbose output when sending stuff. Note: you
## don't need to touch this unless explicitly told to.
#typhoeus_verbose: false
-
+
## Maximum number of parallel HTTP requests made to other pods (default=20)
## Be careful, raising this setting will heavily increase the memory usage
## of your Sidekiq workers.
@@ -289,20 +453,20 @@ configuration: ## Section
## Captcha image size (default='120x20')
#image_size: '120x20'
- ## Length of captcha text (default=5)
+ ## Length of captcha text (default=5)(max=12)
#captcha_length: 5
## Captcha image style (default='simply_green')
## Available options for captcha image styles are: 'simply_blue',
## 'simply_red' 'simply_green', 'charcoal_grey', 'embossed_silver',
- ## 'all_black', 'distorted_black', 'almost_invisible', 'random'
+ ## 'all_black', 'distorted_black', 'almost_invisible', 'random'.
#image_style: 'simply_green'
## Captcha image distortion (default='low')
## Sets the level of image distortion used in the captcha.
- ## Available options are: 'low', 'medium', 'high', 'random'
+ ## Available options are: 'low', 'medium', 'high', 'random'.
#distortion: 'low'
-
+
## Terms of Service
## Show a default or customized terms of service for users.
## You can create a custom Terms of Service by placing a template
@@ -317,8 +481,10 @@ configuration: ## Section
## can communicate to users easily via the diaspora* server software.
## Uncomment to enable this feature.
terms: ## Section
- # First enable it by uncommenting
+
+ ## First enable it by uncommenting below.
#enable: true
+
## Important! If you enable the terms, you should always
## set a location under which laws any disputes are governed
## under. For example, country or state/country, depending
@@ -326,57 +492,82 @@ configuration: ## Section
## If this is not set, the whole paragraph about governing
## laws *is not shown* in the terms page.
#jurisdiction: ""
- ## Age limit for signups
+
+ ## Age limit for signups.
## Set a number to activate this setting. This age limit is shown
## in the default ToS document.
#minimum_age: false
- ## Posting from Diaspora to external services (all are disabled by default)
+ ## Maintenance
+ ## Various pod maintenance related settings are controlled from here.
+ maintenance: ## Section
+
+ ## Removing old inactive users can be done automatically by background
+ ## processing. The amount of inactivity is set by `after_days`. A warning
+ ## email will be sent to the user and after an additional `warn_days`, the
+ ## account will be automatically closed.
+ ## This maintenance is not enabled by default.
+ remove_old_users: ## Section
+
+ #enable: true
+ #after_days: 730
+ #warn_days: 30
+
+ ## Limit queuing for removal per day.
+ #limit_removals_to_per_day: 100
+
+ ## Source code URL
+ ## URL to the source code your pod is currently running.
+ ## If not set your pod will provide a downloadable archive.
+ #source_url: 'https://example.org/username/diaspora'
+
+ ## Posting from Diaspora to external services (all are disabled by default).
services: ## Section
- ## OAuth credentials for Facebook:
+ ## OAuth credentials for Facebook
facebook: ## Section
#enable: true
#app_id: 'abcdef'
#secret: 'change_me'
-
- ## OAuth credentials for Twitter:
+
+ ## OAuth credentials for Twitter
twitter: ## Section
#enable: true
#key: 'abcdef'
#secret: 'change_me'
-
+
## OAuth credentials for Tumblr
tumblr: ## Section
#enable: true
#key: 'abcdef'
#secret: 'change_me'
-
+
## OAuth credentials for Wordpress
wordpress: ## Section
#enable: true
#client_id: 'abcdef'
#secret: 'change_me'
-
- ## Enable pod users to send e-mails from Diaspora (disabled by default)
+
+ ## Allow your pod to send emails for notifications, password recovery
+ ## and other purposes (disabled by default).
mail: ## Section
-
+
## First you need to enable it.
#enable: true
-
- ## Sender address used in mail sent by Diaspora
+
+ ## Sender address used in mail sent by Diaspora.
#sender_address: 'no-reply@example.org'
-
+
## This selects which mailer should be used. Use 'smtp' for a smtp
## connection, 'sendmail' to use the sendmail binary or
## 'messagebus' to use the messagebus service.
#method: 'smtp'
-
- ## Ignore if method isn't 'smtp'
+
+ ## Ignore if method isn't 'smtp'.
smtp: ## Section
## Host and port of the smtp server handling outgoing mail.
@@ -384,59 +575,59 @@ configuration: ## Section
## the SMTP server, if it sends one. (default port=587)
#host: 'smtp.example.org'
#port: 587
-
- ## Authentication required to send mail (default='plain')
+
+ ## Authentication required to send mail (default='plain').
## Use one of 'plain', 'login' or 'cram_md5'. Use 'none'
## if server does not support authentication.
#authentication: 'plain'
-
- ## Credentials to log in to the SMTP server
+
+ ## Credentials to log in to the SMTP server.
## May be necessary if authentication is not 'none'.
#username: 'change_me'
#password: 'change_me'
-
- ## Automatically enable TLS (default=true)
+
+ ## Automatically enable TLS (default=true).
## Leave this commented out if authentication is set to 'none'.
#starttls_auto: true
-
- ## The domain for the HELO command, if needed
+
+ ## The domain for the HELO command, if needed.
#domain: 'smtp.example.org'
-
- ## OpenSSL verify mode used when connecting to a SMTP server with TLS
+
+ ## OpenSSL verify mode used when connecting to a SMTP server with TLS.
## Set this to 'none' if you have a self-signed certificate. Possible
## values: 'none', 'peer', 'client_once', 'fail_if_no_peer_cert'.
#openssl_verify_mode: 'none'
-
+
## Ignore if method isn't 'sendmail'
sendmail: ## Section
## The path to the sendmail binary (default='/usr/sbin/sendmail')
#location: '/usr/sbin/sendmail'
-
+
## Use exim and sendmail (default=false)
#exim_fix: false
-
+
## Ignore if method isn't 'messagebus'
#message_bus_api_key: 'abcdef'
-
+
## Administrator settings
admins: ## Section
-
- ## Set the admin account
+
+ ## Set the admin account.
## This doesn't make the user an admin but is used when a generic
## admin contact is needed, much like the postmaster role in mail
## systems. Set only the username, NOT the full ID.
#account: "podmaster"
- ## E-mail address to contact the administrator
+ ## E-mail address to contact the administrator.
#podmin_email: 'podmin@example.org'
-
+
## Here you can override settings defined above if you need
## to have them different in different environments.
production: ## Section
environment: ## Section
#redis_url: 'redis://production.example.org:6379'
-
+
development: ## Section
environment: ## Section
#redis_url: 'redis://production.example.org:6379'
diff --git a/config/environments/development.rb b/config/environments/development.rb
index 309cbce28..138c8ccd5 100644
--- a/config/environments/development.rb
+++ b/config/environments/development.rb
@@ -6,8 +6,8 @@ Diaspora::Application.configure do
# since you don't have to restart the web server when you make code changes.
config.cache_classes = false
- # Log error messages when you accidentally call methods on nil.
- config.whiny_nils = true
+ # Do not eager load code on boot.
+ config.eager_load = false
# Show full error reports and disable caching
config.consider_all_requests_local = true
@@ -16,18 +16,15 @@ Diaspora::Application.configure do
# Don't care if the mailer can't send
config.action_mailer.raise_delivery_errors = false
+ # Raise an error on page load if there are pending migrations
+ config.active_record.migration_error = :page_load
+
# Print deprecation notices to the Rails logger
config.active_support.deprecation = :log
# Only use best-standards-support built into browsers
config.action_dispatch.best_standards_support = :builtin
- # Raise exception on mass assignment protection for Active Record models
- #config.active_record.mass_assignment_sanitizer = :strict
-
- # Log the query plan for queries taking more than this (works
- # with SQLite, MySQL, and PostgreSQL)
- # config.active_record.auto_explain_threshold_in_seconds = 0.5
# Do not compress assets
config.assets.compress = false
diff --git a/config/environments/integration.rb b/config/environments/integration.rb
index 0a1b06f80..0fc42e916 100644
--- a/config/environments/integration.rb
+++ b/config/environments/integration.rb
@@ -1,6 +1,4 @@
require Rails.root.join('config', 'environment', 'development')
Diaspora::Application.configure do
- # Enable threaded mode
- config.threadsafe!
end
diff --git a/config/environments/production.rb b/config/environments/production.rb
index 666622309..3adcc72d5 100644
--- a/config/environments/production.rb
+++ b/config/environments/production.rb
@@ -4,15 +4,22 @@ Diaspora::Application.configure do
# Code is not reloaded between requests
config.cache_classes = true
+ # Eager load code on boot. This eager loads most of Rails and
+ # your application in memory, allowing both thread web servers
+ # and those relying on copy on write to perform better.
+ # Rake tasks automatically ignore this option for performance.
+ config.eager_load = true
+
# Full error reports are disabled and caching is turned on
config.consider_all_requests_local = false
config.action_controller.perform_caching = true
# Disable Rails's static asset server (Apache or nginx will already do this)
- config.serve_static_assets = false
+ config.serve_static_files = false
- # Compress JavaScripts and CSS
- config.assets.compress = true
+ # Compress JavaScripts and CSS.
+ config.assets.js_compressor = :uglifier
+ # config.assets.css_compressor = :sass
# Don't fallback to assets pipeline if a precompiled asset is missed
config.assets.compile = false
@@ -20,9 +27,6 @@ Diaspora::Application.configure do
# Generate digests for assets URLs
config.assets.digest = true
- # Defaults to nil and saved in location specified by config.assets.prefix
- # config.assets.manifest = YOUR_PATH
-
# Specifies the header that your server uses for sending files
# config.action_dispatch.x_sendfile_header = "X-Sendfile" # for apache
# config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for nginx
@@ -30,8 +34,8 @@ Diaspora::Application.configure do
# Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies.
# config.force_ssl = true
- # See everything in the log (default is :info)
- # config.log_level = :debug
+ # Log level
+ config.log_level = :info
# Prepend all log lines with the following tags
# config.log_tags = [ :subdomain, :uuid ]
@@ -51,9 +55,6 @@ Diaspora::Application.configure do
# Disable delivery errors, bad email addresses will be ignored
# config.action_mailer.raise_delivery_errors = false
- # Enable threaded mode
- config.threadsafe!
-
# Enable autoload for rake tasks
config.dependency_loading = true if $rails_rake_task
@@ -64,10 +65,6 @@ Diaspora::Application.configure do
# Send deprecation notices to registered listeners
config.active_support.deprecation = :notify
- # Log the query plan for queries taking more than this (works
- # with SQLite, MySQL, and PostgreSQL)
- # config.active_record.auto_explain_threshold_in_seconds = 0.5
-
# For nginx:
config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect'
diff --git a/config/environments/test.rb b/config/environments/test.rb
index 074be4cca..083683b3c 100644
--- a/config/environments/test.rb
+++ b/config/environments/test.rb
@@ -7,13 +7,15 @@ Diaspora::Application.configure do
# and recreated between test runs. Don't rely on the data there!
config.cache_classes = true
+ # Do not eager load code on boot. This avoids loading your whole application
+ # just for the purpose of running a single test. If you are using a tool that
+ # preloads Rails for running tests, you may have to set it to true.
+ config.eager_load = false
+
# Configure static asset server for tests with Cache-Control for performance
- config.serve_static_assets = true
+ config.serve_static_files = true
config.static_cache_control = "public, max-age=3600"
- # Log error messages when you accidentally call methods on nil
- config.whiny_nils = true
-
# Show full error reports and disable caching
config.consider_all_requests_local = true
config.action_controller.perform_caching = false
@@ -29,9 +31,6 @@ Diaspora::Application.configure do
# ActionMailer::Base.deliveries array.
config.action_mailer.delivery_method = :test
- # Raise exception on mass assignment protection for Active Record models
- #config.active_record.mass_assignment_sanitizer = :strict
-
# Print deprecation notices to the stderr
config.active_support.deprecation = :stderr
end
diff --git a/config/initializers/assets.rb b/config/initializers/assets.rb
index 246e2771e..9f3f8cd92 100644
--- a/config/initializers/assets.rb
+++ b/config/initializers/assets.rb
@@ -3,6 +3,6 @@
# the COPYRIGHT file.
Diaspora::Application.configure do
- config.serve_static_assets = AppConfig.environment.assets.serve?
+ config.serve_static_files = AppConfig.environment.assets.serve?
# config.static_cache_control = "public, max-age=3600" if AppConfig[:serve_static_assets].to_s == 'true'
end
diff --git a/config/initializers/faraday.rb b/config/initializers/faraday.rb
index 274a998b5..a1f57bb21 100644
--- a/config/initializers/faraday.rb
+++ b/config/initializers/faraday.rb
@@ -1,14 +1,24 @@
# Copyright (c) 2010-2011, Diaspora Inc. This file is
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
+
+# Use net_http in test, that's better supported by webmock
+unless Rails.env.test?
+ require 'typhoeus/adapters/faraday'
+ Faraday.default_adapter = :typhoeus
+end
+
options = {
- timeout: 25,
+ request: {
+ timeout: 25
+ },
ssl: {
ca_file: AppConfig.environment.certificate_authorities.get
}
}
Faraday.default_connection = Faraday::Connection.new(options) do |b|
- b.use FaradayMiddleware::FollowRedirects
+ b.use FaradayMiddleware::FollowRedirects, limit: 8
+ b.use :cookie_jar
b.adapter Faraday.default_adapter
end
diff --git a/config/initializers/filter_parameter_logging.rb b/config/initializers/filter_parameter_logging.rb
new file mode 100644
index 000000000..cd871780d
--- /dev/null
+++ b/config/initializers/filter_parameter_logging.rb
@@ -0,0 +1,4 @@
+# Be sure to restart your server when you modify this file.
+
+# Configure sensitive parameters which will be filtered from the log file.
+Rails.application.config.filter_parameters += [:password, :xml,:message, :text, :bio]
diff --git a/config/initializers/json_escape.rb b/config/initializers/json_escape.rb
index a27bf2dd5..0a5ee2b6e 100644
--- a/config/initializers/json_escape.rb
+++ b/config/initializers/json_escape.rb
@@ -1,5 +1,5 @@
# From http://jfire.io/blog/2012/04/30/how-to-securely-bootstrap-json-in-a-rails-view/
-# Review on Rails 4 update, might be built in by then!
+# Remove on Rails 4.1 update
class ActionView::Base
def json_escape(s)
diff --git a/config/initializers/load_libraries.rb b/config/initializers/load_libraries.rb
index 29ddab022..b83911b87 100644
--- a/config/initializers/load_libraries.rb
+++ b/config/initializers/load_libraries.rb
@@ -3,7 +3,6 @@ require 'cgi'
require 'uri'
# Not auto required gems
-require 'active_support/base64'
require 'builder/xchar'
require 'carrierwave/orm/activerecord'
require 'erb'
@@ -14,7 +13,6 @@ require 'typhoeus'
require 'post_presenter'
# Our libs
-require 'collect_user_photos'
require 'diaspora'
require 'direction_detector'
require 'email_inviter'
diff --git a/config/initializers/mailer_config.rb b/config/initializers/mailer_config.rb
index c667fe372..ace05544a 100644
--- a/config/initializers/mailer_config.rb
+++ b/config/initializers/mailer_config.rb
@@ -4,11 +4,6 @@
require Rails.root.join('lib', 'messagebus', 'mailer')
Diaspora::Application.configure do
- config.action_mailer.default_url_options = {
- protocol: AppConfig.pod_uri.scheme,
- host: AppConfig.pod_uri.authority
- }
- config.action_mailer.asset_host = AppConfig.pod_uri.to_s
config.action_mailer.perform_deliveries = AppConfig.mail.enable?
unless Rails.env == 'test' || !AppConfig.mail.enable?
@@ -36,7 +31,7 @@ Diaspora::Application.configure do
enable_starttls_auto: false,
openssl_verify_mode: AppConfig.mail.smtp.openssl_verify_mode.get
}
-
+
if AppConfig.mail.smtp.authentication != "none"
smtp_settings.merge!({
authentication: AppConfig.mail.smtp.authentication.gsub('-', '_').to_sym,
@@ -45,7 +40,7 @@ Diaspora::Application.configure do
enable_starttls_auto: AppConfig.mail.smtp.starttls_auto?
})
end
-
+
config.action_mailer.smtp_settings = smtp_settings
else
$stderr.puts "WARNING: Mailer turned on with unknown method #{AppConfig.mail.method}. Mail won't work."
diff --git a/config/initializers/maintenance.rb b/config/initializers/maintenance.rb
new file mode 100644
index 000000000..76bc58aae
--- /dev/null
+++ b/config/initializers/maintenance.rb
@@ -0,0 +1,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.
+
+unless AppConfig.mail.enable?
+ if AppConfig.settings.maintenance.remove_old_users.enable?
+ # The maintenance job remove_old_users will warn users
+ # of inactivity removal before removing the users.
+ # Warn podmins here that enable it but don't have mail enabled.
+ puts "
+WARNING: Maintenance that removes inactive users is enabled
+but mail is disabled! This means there will be no warning email
+sent to users whose accounts are flagged for removal!
+See configuration setting 'settings.maintenance.remove_old_users'."
+ end
+end \ No newline at end of file
diff --git a/config/initializers/oembed.rb b/config/initializers/oembed.rb
index bf0fc2092..e8334cdad 100644
--- a/config/initializers/oembed.rb
+++ b/config/initializers/oembed.rb
@@ -15,8 +15,6 @@ oembed_provider_list = [
OEmbed::Providers::Flickr
]
-OEmbed::Providers::Youtube.endpoint += "?scheme=https"
-
oembed_providers = YAML.load_file(Rails.root.join("config", "oembed_providers.yml"))
oembed_providers.each do |provider_name, provider|
diff --git a/config/initializers/open_graph_reader.rb b/config/initializers/open_graph_reader.rb
new file mode 100644
index 000000000..c23e874ba
--- /dev/null
+++ b/config/initializers/open_graph_reader.rb
@@ -0,0 +1,6 @@
+OpenGraphReader.configure do |config|
+ config.synthesize_title = true
+ config.synthesize_url = true
+ config.synthesize_image_url = true
+ config.guess_datetime_format = true
+end
diff --git a/config/initializers/rails_admin.rb b/config/initializers/rails_admin.rb
index a0b7c6ce8..158aa991f 100644
--- a/config/initializers/rails_admin.rb
+++ b/config/initializers/rails_admin.rb
@@ -40,10 +40,41 @@ if Rails.env.production?
# ==> Included models
# Add all excluded models here:
- config.excluded_models = [AspectMembership, AspectVisibility, ShareVisibility, ConversationVisibility, NotificationActor, Notifications::AlsoCommented, Notifications::CommentOnPost, Notifications::Liked, Notifications::Mentioned, Notifications::PrivateMessage, Notifications::RequestAccepted, Notifications::Reshared, Notifications::StartedSharing, Reshare, Services::Facebook, Services::Tumblr, Services::Twitter, UserPreference, ActsAsTaggableOn::Tag]
+ #config.excluded_models = []
# Add models here if you want to go 'whitelist mode':
- # config.included_models = [AccountDeletion, ActsAsTaggableOn::Tag, Aspect, AspectMembership, AspectVisibility, Block, Comment, Contact, Conversation, ConversationVisibility, Invitation, InvitationCode, Like, Mention, Message, Notification, NotificationActor, Notifications::AlsoCommented, Notifications::CommentOnPost, Notifications::Liked, Notifications::Mentioned, Notifications::PrivateMessage, Notifications::RequestAccepted, Notifications::Reshared, Notifications::StartedSharing, OEmbedCache, Participation, Person, Photo, Pod, Post, Profile, Reshare, Service, ServiceUser, Services::Facebook, Services::Tumblr, Services::Twitter, ShareVisibility, StatusMessage, TagFollowing, User, UserPreference]
+ config.included_models = %w[
+ AccountDeletion
+ Aspect
+ AspectMembership
+ Block
+ Comment
+ Contact
+ Conversation
+ Invitation
+ InvitationCode
+ Like
+ Location
+ Mention
+ Message
+ OEmbedCache
+ OpenGraphCache
+ Person
+ Photo
+ Profile
+ Pod
+ Poll
+ PollAnswer
+ Post
+ Profile
+ Report
+ Reshare
+ Role
+ Service
+ StatusMessage
+ User
+ UserPreference
+ ]
# Application wide tried label methods for models' instances
# config.label_methods << :description # Default is [:name, :title]
diff --git a/config/initializers/session_store.rb b/config/initializers/session_store.rb
index e46823d17..d2e9c4e29 100644
--- a/config/initializers/session_store.rb
+++ b/config/initializers/session_store.rb
@@ -1,12 +1,3 @@
-# Copyright (c) 2010-2011, Diaspora Inc. This file is
-# licensed under the Affero General Public License version 3 or later. See
-# the COPYRIGHT file.
-
# Be sure to restart your server when you modify this file.
-Rails.application.config.session_store :cookie_store, key: '_diaspora_session', httponly: false
-
-# Use the database for sessions instead of the cookie-based default,
-# which shouldn't be used to store highly confidential information
-# (create the session table with "rake db:sessions:create")
-# Rails.application.config.session_store :active_record_store
+Diaspora::Application.config.session_store :cookie_store, key: '_diaspora_session', httponly: false
diff --git a/config/initializers/setup_simple_captcha.rb b/config/initializers/setup_simple_captcha.rb
index 69ce517c4..cdcb6c2a0 100644
--- a/config/initializers/setup_simple_captcha.rb
+++ b/config/initializers/setup_simple_captcha.rb
@@ -1,7 +1,6 @@
SimpleCaptcha.setup do |sc|
sc.image_size = AppConfig.settings.captcha.image_size
- sc.length = AppConfig.settings.captcha.captcha_length.to_i
+ sc.length = [1, [AppConfig.settings.captcha_length.to_i, 12].min].max
sc.image_style = AppConfig.settings.captcha.image_style
sc.distortion = AppConfig.settings.captcha.distortion
- p AppConfig.settings.captcha
-end \ No newline at end of file
+end
diff --git a/config/initializers/sidekiq.rb b/config/initializers/sidekiq.rb
index a1ff43592..529297778 100644
--- a/config/initializers/sidekiq.rb
+++ b/config/initializers/sidekiq.rb
@@ -11,40 +11,20 @@ if AppConfig.environment.single_process_mode? && Rails.env != "test"
require 'sidekiq/testing/inline'
end
-
Sidekiq.configure_server do |config|
config.redis = AppConfig.get_redis_options
- config.options = config.options.merge({
- concurrency: AppConfig.environment.sidekiq.concurrency.to_i,
- queues: %w{
- socket_webfinger
- photos
- http_service
- dispatch
- mail
- delete_account
- receive_local
- receive
- receive_salmon
- http
- default
- }
- })
-
config.server_middleware do |chain|
chain.add SidekiqMiddlewares::CleanAndShortBacktraces
end
- Sidekiq::Logging.initialize_logger AppConfig.sidekiq_log unless AppConfig.heroku?
-
# Set connection pool on Heroku
database_url = ENV['DATABASE_URL']
if(database_url)
ENV['DATABASE_URL'] = "#{database_url}?pool=#{AppConfig.environment.sidekiq.concurrency.get}"
ActiveRecord::Base.establish_connection
end
-
+
# Make sure each Sidekiq process has its own sequence of UUIDs
UUID.generator.next_sequence
end
diff --git a/config/initializers/strong_parameters.rb b/config/initializers/strong_parameters.rb
deleted file mode 100644
index 69fdcd47c..000000000
--- a/config/initializers/strong_parameters.rb
+++ /dev/null
@@ -1,2 +0,0 @@
-# Please remove when migrating to Rails 4
-ActiveRecord::Base.send(:include, ActiveModel::ForbiddenAttributesProtection)
diff --git a/config/initializers/wrap_parameters.rb b/config/initializers/wrap_parameters.rb
new file mode 100644
index 000000000..ddd9dd5ab
--- /dev/null
+++ b/config/initializers/wrap_parameters.rb
@@ -0,0 +1,14 @@
+# Be sure to restart your server when you modify this file.
+
+# This file contains settings for ActionController::ParamsWrapper which
+# is enabled by default.
+
+# Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array.
+ActiveSupport.on_load(:action_controller) do
+ wrap_parameters format: [:json] if respond_to?(:wrap_parameters)
+end
+
+# To enable root element in JSON for ActiveRecord objects.
+ActiveSupport.on_load(:active_record) do
+ self.include_root_in_json = true
+end
diff --git a/config/load_config.rb b/config/load_config.rb
index faef94b60..fd4742259 100644
--- a/config/load_config.rb
+++ b/config/load_config.rb
@@ -1,13 +1,18 @@
+require 'pathname'
+require 'bundler/setup'
require 'configurate'
-rails_root = File.expand_path('../../', __FILE__)
-rails_env = ENV['RACK_ENV']
-rails_env ||= ENV['RAILS_ENV']
-rails_env ||= 'development'
+rails_env = ENV['RAILS_ENV'] || ENV['RACK_ENV'] || 'development'
-require File.join(rails_root, 'lib', 'configuration_methods')
+module Rails
+ def self.root
+ @__root ||= Pathname.new File.expand_path('../../', __FILE__)
+ end
+end
+
+require Rails.root.join 'lib', 'configuration_methods'
-config_dir = File.join rails_root, 'config'
+config_dir = Rails.root.join('config').to_s
AppConfig ||= Configurate::Settings.create do
diff --git a/config/locale_settings.yml b/config/locale_settings.yml
index 06bb80667..7b87609dd 100644
--- a/config/locale_settings.yml
+++ b/config/locale_settings.yml
@@ -15,6 +15,7 @@ available:
en_1337: "3n6l15h (English 1337)"
en_pirate: "English (Pirate)"
en_shaw: "𐑦𐑙𐑤𐑦𐑖"
+ en_valspeak: "English (Valley Girl)"
eo: "Esperanto"
es: "Castellano"
es-AR: "Castellano - Argentina"
@@ -45,6 +46,7 @@ available:
ml: "മലയാളം"
ms: "بهاس ملايو‎"
nb: "Norske"
+ nds: "Niederdeutsch"
nl: "Nederlands"
nn: "Nynorsk"
pa: "ਪੰਜਾਬੀ"
@@ -86,6 +88,10 @@ fallbacks:
- "en"
- "en-GB"
- "en-US"
+ en_valspeak:
+ - "en"
+ - "en-GB"
+ - "en-US"
sv:
- "sv-SE"
he:
@@ -109,6 +115,8 @@ fallbacks:
- "ur"
de_formal:
- "de"
+ nds:
+ - "de"
art_nvi:
- "art-nvi"
pt-BR:
diff --git a/config/locales/cldr/plurals.rb b/config/locales/cldr/plurals.rb
index 632030f45..861af9786 100644
--- a/config/locales/cldr/plurals.rb
+++ b/config/locales/cldr/plurals.rb
@@ -1,56 +1,59 @@
{
- :'art-nvi' => { :i18n => {:plural => { :keys => [:zero, :one, :two, :few, :other], :rule => lambda { |n| n == 0 ? :zero : n == 1 ? :one : n == 2 ? :two : n == 3 ? :few : :other }, :js_rule => 'function (n) { return n == 0 ? "zero" : n == 1 ? "one" : n == 2 ? "two" : n == 3 ? "few" : "other" }' } } },
- :ar => { :i18n => {:plural => { :keys => [:zero, :one, :two, :few, :many, :other], :rule => lambda { |n| n == 0 ? :zero : n == 1 ? :one : n == 2 ? :two : [3, 4, 5, 6, 7, 8, 9, 10].include?(n % 100) ? :few : [11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99].include?(n % 100) ? :many : :other }, :js_rule => 'function (n) { return n == 0 ? "zero" : n == 1 ? "one" : n == 2 ? "two" : jQuery.inArray(n % 100, [3, 4, 5, 6, 7, 8, 9, 10]) != -1 ? "few" : jQuery.inArray(n % 100, [11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99]) != -1 ? "many" : "other" }' } } },
- :bg => { :i18n => {:plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other }, :js_rule => 'function (n) { return n == 1 ? "one" : "other" }' } } },
- :br => { :i18n => {:plural => { :keys => [:one, :two, :few, :many, :other], :rule => lambda { |n| n % 10 == 1 && n ? :one : n % 10 == 2 && n ? :two : [3, 4].include?(n % 10) && ![10, 11, 12, 13, 14, 15, 16, 17, 18, 19].include?(n % 100) ? :few : n != 0 && n % 1000000 == 0 ? :many : :other }, :js_rule => 'function (n) { return n % 10 == 1 && n ? "one" : n % 10 == 2 && n ? "two" : jQuery.inArray(n % 10, [3, 4]) != -1 && !jQuery.inArray(n % 100, [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]) != -1 ? "few" : n != 0 && n % 1000000 == 0 ? "many" : "other" }' } } },
- :bs => { :i18n => {:plural => { :keys => [:one, :few, :many, :other], :rule => lambda { |n| n % 10 == 1 && n % 100 != 11 ? :one : [2, 3, 4].include?(n % 10) && ![12, 13, 14].include?(n % 100) ? :few : n % 10 == 0 || [5, 6, 7, 8, 9].include?(n % 10) || [11, 12, 13, 14].include?(n % 100) ? :many : :other }, :js_rule => 'function (n) { return n % 10 == 1 && n % 100 != 11 ? "one" : jQuery.inArray(n % 10, [2, 3, 4]) != -1 && !jQuery.inArray(n % 100, [12, 13, 14]) != -1 ? "few" : n % 10 == 0 || jQuery.inArray(n % 10, [5, 6, 7, 8, 9]) != -1 || jQuery.inArray(n % 100, [11, 12, 13, 14]) != -1 ? "many" : "other" }' } } },
- :ca => { :i18n => {:plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other }, :js_rule => 'function (n) { return n == 1 ? "one" : "other" }' } } },
- :cs => { :i18n => {:plural => { :keys => [:one, :few, :other], :rule => lambda { |n| n == 1 ? :one : [2, 3, 4].include?(n) ? :few : :other }, :js_rule => 'function (n) { return n == 1 ? "one" : jQuery.inArray(n, [2, 3, 4]) != -1 ? "few" : "other" }' } } },
- :cy => { :i18n => {:plural => { :keys => [:zero, :one, :two, :few, :many, :other], :rule => lambda { |n| n == 0 ? :zero : n == 1 ? :one : n == 2 ? :two : n == 3 ? :few : n == 6 ? :many : :other }, :js_rule => 'function (n) { return n == 0 ? "zero" : n == 1 ? "one" : n == 2 ? "two" : n == 3 ? "few" : n == 6 ? "many" : "other" }' } } },
- :da => { :i18n => {:plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other }, :js_rule => 'function (n) { return n == 1 ? "one" : "other" }' } } },
- :de => { :i18n => {:plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other }, :js_rule => 'function (n) { return n == 1 ? "one" : "other" }' } } },
- :el => { :i18n => {:plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other }, :js_rule => 'function (n) { return n == 1 ? "one" : "other" }' } } },
- :en => { :i18n => {:plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other }, :js_rule => 'function (n) { return n == 1 ? "one" : "other" }' } } },
- :eo => { :i18n => {:plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other }, :js_rule => 'function (n) { return n == 1 ? "one" : "other" }' } } },
- :es => { :i18n => {:plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other }, :js_rule => 'function (n) { return n == 1 ? "one" : "other" }' } } },
- :et => { :i18n => {:plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other }, :js_rule => 'function (n) { return n == 1 ? "one" : "other" }' } } },
- :eu => { :i18n => {:plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other }, :js_rule => 'function (n) { return n == 1 ? "one" : "other" }' } } },
- :fi => { :i18n => {:plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other }, :js_rule => 'function (n) { return n == 1 ? "one" : "other" }' } } },
- :fil => { :i18n => {:plural => { :keys => [:one, :other], :rule => lambda { |n| [0, 1].include?(n) ? :one : :other }, :js_rule => 'function (n) { return jQuery.inArray(n, [0, 1]) != -1 ? "one" : "other" }' } } },
- :fr => { :i18n => {:plural => { :keys => [:one, :other], :rule => lambda { |n| n.between?(0, 2) && n != 2 ? :one : :other }, :js_rule => 'function (n) { return n >= 0 && n <= 2 && n != 2 ? "one" : "other" }' } } },
- :fy => { :i18n => {:plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other }, :js_rule => 'function (n) { return n == 1 ? "one" : "other" }' } } },
- :ga => { :i18n => {:plural => { :keys => [:one, :two, :few, :many, :other], :rule => lambda { |n| n == 1 ? :one : n == 2 ? :two : [3, 4, 5, 6].include?(n) ? :few : [7, 8, 9, 10].include?(n) ? :many : :other }, :js_rule => 'function (n) { return n == 1 ? "one" : n == 2 ? "two" : jQuery.inArray(n, [3, 4, 5, 6]) != -1 ? "few" : jQuery.inArray(n, [7, 8, 9, 10]) != -1 ? "many" : "other" }' } } },
- :gl => { :i18n => {:plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other }, :js_rule => 'function (n) { return n == 1 ? "one" : "other" }' } } },
- :he => { :i18n => {:plural => { :keys => [:one, :two, :many, :other], :rule => lambda { |n| n == 1 ? :one : n == 2 ? :two : n != 0 && n % 10 == 0 ? :many : :other }, :js_rule => 'function (n) { return n == 1 ? "one" : n == 2 ? "two" : n != 0 && n % 10 == 0 ? "many" : "other" }' } } },
- :hu => { :i18n => {:plural => { :keys => [:other], :rule => lambda { |n| :other }, :js_rule => 'function (n) { return "other" }' } } },
- :hy => { :i18n => {:plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other }, :js_rule => 'function (n) { return n == 1 ? "one" : "other" }' } } },
- :id => { :i18n => {:plural => { :keys => [:other], :rule => lambda { |n| :other }, :js_rule => 'function (n) { return "other" }' } } },
- :is => { :i18n => {:plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other }, :js_rule => 'function (n) { return n == 1 ? "one" : "other" }' } } },
- :it => { :i18n => {:plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other }, :js_rule => 'function (n) { return n == 1 ? "one" : "other" }' } } },
- :ja => { :i18n => {:plural => { :keys => [:other], :rule => lambda { |n| :other }, :js_rule => 'function (n) { return "other" }' } } },
- :ka => { :i18n => {:plural => { :keys => [:other], :rule => lambda { |n| :other }, :js_rule => 'function (n) { return "other" }' } } },
- :ko => { :i18n => {:plural => { :keys => [:other], :rule => lambda { |n| :other }, :js_rule => 'function (n) { return "other" }' } } },
- :lt => { :i18n => {:plural => { :keys => [:one, :few, :other], :rule => lambda { |n| n % 10 == 1 && ![11, 12, 13, 14, 15, 16, 17, 18, 19].include?(n % 100) ? :one : [2, 3, 4, 5, 6, 7, 8, 9].include?(n % 10) && ![11, 12, 13, 14, 15, 16, 17, 18, 19].include?(n % 100) ? :few : :other }, :js_rule => 'function (n) { return n % 10 == 1 && !jQuery.inArray(n % 100, [11, 12, 13, 14, 15, 16, 17, 18, 19]) != -1 ? "one" : jQuery.inArray(n % 10, [2, 3, 4, 5, 6, 7, 8, 9]) != -1 && !jQuery.inArray(n % 100, [11, 12, 13, 14, 15, 16, 17, 18, 19]) != -1 ? "few" : "other" }' } } },
- :mk => { :i18n => {:plural => { :keys => [:one, :other], :rule => lambda { |n| n % 10 == 1 && n != 11 ? :one : :other }, :js_rule => 'function (n) { return n % 10 == 1 && n != 11 ? "one" : "other" }' } } },
- :ml => { :i18n => {:plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other }, :js_rule => 'function (n) { return n == 1 ? "one" : "other" }' } } },
- :ms => { :i18n => {:plural => { :keys => [:other], :rule => lambda { |n| :other }, :js_rule => 'function (n) { return "other" }' } } },
- :nb => { :i18n => {:plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other }, :js_rule => 'function (n) { return n == 1 ? "one" : "other" }' } } },
- :nl => { :i18n => {:plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other }, :js_rule => 'function (n) { return n == 1 ? "one" : "other" }' } } },
- :nn => { :i18n => {:plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other }, :js_rule => 'function (n) { return n == 1 ? "one" : "other" }' } } },
- :pa => { :i18n => {:plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other }, :js_rule => 'function (n) { return n == 1 ? "one" : "other" }' } } },
- :pl => { :i18n => {:plural => { :keys => [:one, :few, :many, :other], :rule => lambda { |n| n == 1 ? :one : [2, 3, 4].include?(n % 10) && ![12, 13, 14].include?(n % 100) ? :few : n != 1 && [0, 1].include?(n % 10) || [5, 6, 7, 8, 9].include?(n % 10) || [12, 13, 14].include?(n % 100) ? :many : :other }, :js_rule => 'function (n) { return n == 1 ? "one" : jQuery.inArray(n % 10, [2, 3, 4]) != -1 && !jQuery.inArray(n % 100, [12, 13, 14]) != -1 ? "few" : n != 1 && jQuery.inArray(n % 10, [0, 1]) != -1 || jQuery.inArray(n % 10, [5, 6, 7, 8, 9]) != -1 || jQuery.inArray(n % 100, [12, 13, 14]) != -1 ? "many" : "other" }' } } },
- :pt => { :i18n => {:plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other }, :js_rule => 'function (n) { return n == 1 ? "one" : "other" }' } } },
- :ro => { :i18n => {:plural => { :keys => [:one, :few, :other], :rule => lambda { |n| n == 1 ? :one : n == 0 || n != 1 && [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19].include?(n % 100) ? :few : :other }, :js_rule => 'function (n) { return n == 1 ? "one" : n == 0 || n != 1 && jQuery.inArray(n % 100, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]) != -1 ? "few" : "other" }' } } },
- :ru => { :i18n => {:plural => { :keys => [:one, :few, :many, :other], :rule => lambda { |n| n % 10 == 1 && n % 100 != 11 ? :one : [2, 3, 4].include?(n % 10) && ![12, 13, 14].include?(n % 100) ? :few : n % 10 == 0 || [5, 6, 7, 8, 9].include?(n % 10) || [11, 12, 13, 14].include?(n % 100) ? :many : :other }, :js_rule => 'function (n) { return n % 10 == 1 && n % 100 != 11 ? "one" : jQuery.inArray(n % 10, [2, 3, 4]) != -1 && !jQuery.inArray(n % 100, [12, 13, 14]) != -1 ? "few" : n % 10 == 0 || jQuery.inArray(n % 10, [5, 6, 7, 8, 9]) != -1 || jQuery.inArray(n % 100, [11, 12, 13, 14]) != -1 ? "many" : "other" }' } } },
- :sk => { :i18n => {:plural => { :keys => [:one, :few, :other], :rule => lambda { |n| n == 1 ? :one : [2, 3, 4].include?(n) ? :few : :other }, :js_rule => 'function (n) { return n == 1 ? "one" : jQuery.inArray(n, [2, 3, 4]) != -1 ? "few" : "other" }' } } },
- :sl => { :i18n => {:plural => { :keys => [:one, :two, :few, :other], :rule => lambda { |n| n % 100 == 1 ? :one : n % 100 == 2 ? :two : [3, 4].include?(n % 100) ? :few : :other }, :js_rule => 'function (n) { return n % 100 == 1 ? "one" : n % 100 == 2 ? "two" : jQuery.inArray(n % 100, [3, 4]) != -1 ? "few" : "other" }' } } },
- :sq => { :i18n => {:plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other }, :js_rule => 'function (n) { return n == 1 ? "one" : "other" }' } } },
- :sr => { :i18n => {:plural => { :keys => [:one, :few, :many, :other], :rule => lambda { |n| n % 10 == 1 && n % 100 != 11 ? :one : [2, 3, 4].include?(n % 10) && ![12, 13, 14].include?(n % 100) ? :few : n % 10 == 0 || [5, 6, 7, 8, 9].include?(n % 10) || [11, 12, 13, 14].include?(n % 100) ? :many : :other }, :js_rule => 'function (n) { return n % 10 == 1 && n % 100 != 11 ? "one" : jQuery.inArray(n % 10, [2, 3, 4]) != -1 && !jQuery.inArray(n % 100, [12, 13, 14]) != -1 ? "few" : n % 10 == 0 || jQuery.inArray(n % 10, [5, 6, 7, 8, 9]) != -1 || jQuery.inArray(n % 100, [11, 12, 13, 14]) != -1 ? "many" : "other" }' } } },
- :sv => { :i18n => {:plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other }, :js_rule => 'function (n) { return n == 1 ? "one" : "other" }' } } },
- :te => { :i18n => {:plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other }, :js_rule => 'function (n) { return n == 1 ? "one" : "other" }' } } },
- :tr => { :i18n => {:plural => { :keys => [:other], :rule => lambda { |n| :other }, :js_rule => 'function (n) { return "other" }' } } },
- :uk => { :i18n => {:plural => { :keys => [:one, :few, :many, :other], :rule => lambda { |n| n % 10 == 1 && n % 100 != 11 ? :one : [2, 3, 4].include?(n % 10) && ![12, 13, 14].include?(n % 100) ? :few : n % 10 == 0 || [5, 6, 7, 8, 9].include?(n % 10) || [11, 12, 13, 14].include?(n % 100) ? :many : :other }, :js_rule => 'function (n) { return n % 10 == 1 && n % 100 != 11 ? "one" : jQuery.inArray(n % 10, [2, 3, 4]) != -1 && !jQuery.inArray(n % 100, [12, 13, 14]) != -1 ? "few" : n % 10 == 0 || jQuery.inArray(n % 10, [5, 6, 7, 8, 9]) != -1 || jQuery.inArray(n % 100, [11, 12, 13, 14]) != -1 ? "many" : "other" }' } } },
- :ur => { :i18n => {:plural => { :keys => [:one, :other], :rule => lambda { |n| n == 1 ? :one : :other }, :js_rule => 'function (n) { return n == 1 ? "one" : "other" }' } } },
- :vi => { :i18n => {:plural => { :keys => [:other], :rule => lambda { |n| :other }, :js_rule => 'function (n) { return "other" }' } } },
- :zh => { :i18n => {:plural => { :keys => [:other], :rule => lambda { |n| :other }, :js_rule => 'function (n) { return "other" }' } } }
-}
+ :ar => {:i18n => {:plural => {:keys => [:zero, :one, :two, :few, :many, :other],:rule => ->(input) { to_num = ->(str) { str.include?('.') ? str.to_f : str.to_i }; _n = ->(str) { str.gsub(/(-)(.*)/, '\2') }; _i = ->(str) { _n.(str).gsub(/([\d]+)(..*)/, '\1') }; _f = ->(str) { _n.(str).gsub(/([\d]+\.?)(.*)/, '\2') }; _t = ->(str) { _f.(str).gsub(/([0]+\z)/, '') }; _v = ->(str) { _f.(str).length.to_s }; _w = ->(str) { _t.(str).length.to_s }; __n = ->(str) { to_num.(str.include?('.') ? _n.(str).gsub(/([0]+\z)/, '').chomp('.') : _n.(str)) }; __i = ->(str) { to_num.(_i.(str)) }; __f = ->(str) { to_num.(_f.(str)) }; __t = ->(str) { to_num.(_t.(str)) }; __v = ->(str) { to_num.(_v.(str)) }; __w = ->(str) { to_num.(_w.(str)) }; num = input.to_s; n = __n.(num); i = __i.(num); v = __v.(num); w = __w.(num); f = __f.(num); t = __t.(num); (n == 0 ? :zero : (n == 1 ? :one : (n == 2 ? :two : ((3..10).include?(n % 100) ? :few : ((11..99).include?(n % 100) ? :many : :other))))) },:js_rule => "(function(input) { var runtime = (function(){return this.buildArgsFor=function(t){return[this.n(t),this.i(t),this.f(t),this.t(t),this.v(t),this.w(t)]},this.n=function(t){return this.toNum(t.indexOf(\".\")>-1?this._n(t).replace(/([0]+\\.$)/,\"\"):this._n(t))},this.i=function(t){return this.toNum(this._i(t))},this.f=function(t){return this.toNum(this._f(t))},this.t=function(t){return this.toNum(this._t(t))},this.v=function(t){return this.toNum(this._v(t))},this.w=function(t){return this.toNum(this._w(t))},this.toNum=function(t){return 0==t.length?0:t.indexOf(\".\")>-1?parseFloat(t):parseInt(t)},this._n=function(t){return/(-)?(.*)/.exec(t)[2]},this._i=function(t){return/([\\d]+)(\\..*)?/.exec(this._n(t))[1]},this._f=function(t){return/([\\d]+\\.?)(.*)/.exec(this._n(t))[2]},this._t=function(t){return this._f(t).replace(/([0]+$)/,\"\")},this._v=function(t){return this._f(t).length.toString()},this._w=function(t){return this._t(t).length.toString()},this}).call({}); var num = input.toString(); var n = runtime.n(num); var i = runtime.i(num); var v = runtime.v(num); var w = runtime.w(num); var f = runtime.f(num); var t = runtime.t(num); return (n == 0 ? 'zero' : (n == 1 ? 'one' : (n == 2 ? 'two' : (((n % 100 >= 3) && (n % 100 <= 10)) ? 'few' : (((n % 100 >= 11) && (n % 100 <= 99)) ? 'many' : 'other'))))); })"}}},
+ :bg => {:i18n => {:plural => {:keys => [:one, :other],:rule => ->(input) { to_num = ->(str) { str.include?('.') ? str.to_f : str.to_i }; _n = ->(str) { str.gsub(/(-)(.*)/, '\2') }; _i = ->(str) { _n.(str).gsub(/([\d]+)(..*)/, '\1') }; _f = ->(str) { _n.(str).gsub(/([\d]+\.?)(.*)/, '\2') }; _t = ->(str) { _f.(str).gsub(/([0]+\z)/, '') }; _v = ->(str) { _f.(str).length.to_s }; _w = ->(str) { _t.(str).length.to_s }; __n = ->(str) { to_num.(str.include?('.') ? _n.(str).gsub(/([0]+\z)/, '').chomp('.') : _n.(str)) }; __i = ->(str) { to_num.(_i.(str)) }; __f = ->(str) { to_num.(_f.(str)) }; __t = ->(str) { to_num.(_t.(str)) }; __v = ->(str) { to_num.(_v.(str)) }; __w = ->(str) { to_num.(_w.(str)) }; num = input.to_s; n = __n.(num); i = __i.(num); v = __v.(num); w = __w.(num); f = __f.(num); t = __t.(num); (n == 1 ? :one : :other) },:js_rule => "(function(input) { var runtime = (function(){return this.buildArgsFor=function(t){return[this.n(t),this.i(t),this.f(t),this.t(t),this.v(t),this.w(t)]},this.n=function(t){return this.toNum(t.indexOf(\".\")>-1?this._n(t).replace(/([0]+\\.$)/,\"\"):this._n(t))},this.i=function(t){return this.toNum(this._i(t))},this.f=function(t){return this.toNum(this._f(t))},this.t=function(t){return this.toNum(this._t(t))},this.v=function(t){return this.toNum(this._v(t))},this.w=function(t){return this.toNum(this._w(t))},this.toNum=function(t){return 0==t.length?0:t.indexOf(\".\")>-1?parseFloat(t):parseInt(t)},this._n=function(t){return/(-)?(.*)/.exec(t)[2]},this._i=function(t){return/([\\d]+)(\\..*)?/.exec(this._n(t))[1]},this._f=function(t){return/([\\d]+\\.?)(.*)/.exec(this._n(t))[2]},this._t=function(t){return this._f(t).replace(/([0]+$)/,\"\")},this._v=function(t){return this._f(t).length.toString()},this._w=function(t){return this._t(t).length.toString()},this}).call({}); var num = input.toString(); var n = runtime.n(num); var i = runtime.i(num); var v = runtime.v(num); var w = runtime.w(num); var f = runtime.f(num); var t = runtime.t(num); return (n == 1 ? 'one' : 'other'); })"}}},
+ :br => {:i18n => {:plural => {:keys => [:one, :two, :few, :many, :other],:rule => ->(input) { to_num = ->(str) { str.include?('.') ? str.to_f : str.to_i }; _n = ->(str) { str.gsub(/(-)(.*)/, '\2') }; _i = ->(str) { _n.(str).gsub(/([\d]+)(..*)/, '\1') }; _f = ->(str) { _n.(str).gsub(/([\d]+\.?)(.*)/, '\2') }; _t = ->(str) { _f.(str).gsub(/([0]+\z)/, '') }; _v = ->(str) { _f.(str).length.to_s }; _w = ->(str) { _t.(str).length.to_s }; __n = ->(str) { to_num.(str.include?('.') ? _n.(str).gsub(/([0]+\z)/, '').chomp('.') : _n.(str)) }; __i = ->(str) { to_num.(_i.(str)) }; __f = ->(str) { to_num.(_f.(str)) }; __t = ->(str) { to_num.(_t.(str)) }; __v = ->(str) { to_num.(_v.(str)) }; __w = ->(str) { to_num.(_w.(str)) }; num = input.to_s; n = __n.(num); i = __i.(num); v = __v.(num); w = __w.(num); f = __f.(num); t = __t.(num); ((n % 10 == 1 && ((n % 100 != 11) && (n % 100 != 71) && (n % 100 != 91))) ? :one : ((n % 10 == 2 && ((n % 100 != 12) && (n % 100 != 72) && (n % 100 != 92))) ? :two : ((((3..4).include?(n % 10) || (n % 10 == 9)) && (!(10..19).include?(n % 100) && !(70..79).include?(n % 100) && !(90..99).include?(n % 100))) ? :few : ((n != 0 && n % 1000000 == 0) ? :many : :other)))) },:js_rule => "(function(input) { var runtime = (function(){return this.buildArgsFor=function(t){return[this.n(t),this.i(t),this.f(t),this.t(t),this.v(t),this.w(t)]},this.n=function(t){return this.toNum(t.indexOf(\".\")>-1?this._n(t).replace(/([0]+\\.$)/,\"\"):this._n(t))},this.i=function(t){return this.toNum(this._i(t))},this.f=function(t){return this.toNum(this._f(t))},this.t=function(t){return this.toNum(this._t(t))},this.v=function(t){return this.toNum(this._v(t))},this.w=function(t){return this.toNum(this._w(t))},this.toNum=function(t){return 0==t.length?0:t.indexOf(\".\")>-1?parseFloat(t):parseInt(t)},this._n=function(t){return/(-)?(.*)/.exec(t)[2]},this._i=function(t){return/([\\d]+)(\\..*)?/.exec(this._n(t))[1]},this._f=function(t){return/([\\d]+\\.?)(.*)/.exec(this._n(t))[2]},this._t=function(t){return this._f(t).replace(/([0]+$)/,\"\")},this._v=function(t){return this._f(t).length.toString()},this._w=function(t){return this._t(t).length.toString()},this}).call({}); var num = input.toString(); var n = runtime.n(num); var i = runtime.i(num); var v = runtime.v(num); var w = runtime.w(num); var f = runtime.f(num); var t = runtime.t(num); return ((n % 10 == 1 && ((n % 100 != 11) && (n % 100 != 71) && (n % 100 != 91))) ? 'one' : ((n % 10 == 2 && ((n % 100 != 12) && (n % 100 != 72) && (n % 100 != 92))) ? 'two' : (((((n % 10 >= 3) && (n % 10 <= 4)) || (n % 10 == 9)) && (!((n % 100 >= 10) && (n % 100 <= 19)) && !((n % 100 >= 70) && (n % 100 <= 79)) && !((n % 100 >= 90) && (n % 100 <= 99)))) ? 'few' : ((n != 0 && n % 1000000 == 0) ? 'many' : 'other')))); })"}}},
+ :bs => {:i18n => {:plural => {:keys => [:one, :few, :other],:rule => ->(input) { to_num = ->(str) { str.include?('.') ? str.to_f : str.to_i }; _n = ->(str) { str.gsub(/(-)(.*)/, '\2') }; _i = ->(str) { _n.(str).gsub(/([\d]+)(..*)/, '\1') }; _f = ->(str) { _n.(str).gsub(/([\d]+\.?)(.*)/, '\2') }; _t = ->(str) { _f.(str).gsub(/([0]+\z)/, '') }; _v = ->(str) { _f.(str).length.to_s }; _w = ->(str) { _t.(str).length.to_s }; __n = ->(str) { to_num.(str.include?('.') ? _n.(str).gsub(/([0]+\z)/, '').chomp('.') : _n.(str)) }; __i = ->(str) { to_num.(_i.(str)) }; __f = ->(str) { to_num.(_f.(str)) }; __t = ->(str) { to_num.(_t.(str)) }; __v = ->(str) { to_num.(_v.(str)) }; __w = ->(str) { to_num.(_w.(str)) }; num = input.to_s; n = __n.(num); i = __i.(num); v = __v.(num); w = __w.(num); f = __f.(num); t = __t.(num); ((((v == 0 && i % 10 == 1) && i % 100 != 11) || (f % 10 == 1 && f % 100 != 11)) ? :one : ((((v == 0 && (2..4).include?(i % 10)) && !(12..14).include?(i % 100)) || ((2..4).include?(f % 10) && !(12..14).include?(f % 100))) ? :few : :other)) },:js_rule => "(function(input) { var runtime = (function(){return this.buildArgsFor=function(t){return[this.n(t),this.i(t),this.f(t),this.t(t),this.v(t),this.w(t)]},this.n=function(t){return this.toNum(t.indexOf(\".\")>-1?this._n(t).replace(/([0]+\\.$)/,\"\"):this._n(t))},this.i=function(t){return this.toNum(this._i(t))},this.f=function(t){return this.toNum(this._f(t))},this.t=function(t){return this.toNum(this._t(t))},this.v=function(t){return this.toNum(this._v(t))},this.w=function(t){return this.toNum(this._w(t))},this.toNum=function(t){return 0==t.length?0:t.indexOf(\".\")>-1?parseFloat(t):parseInt(t)},this._n=function(t){return/(-)?(.*)/.exec(t)[2]},this._i=function(t){return/([\\d]+)(\\..*)?/.exec(this._n(t))[1]},this._f=function(t){return/([\\d]+\\.?)(.*)/.exec(this._n(t))[2]},this._t=function(t){return this._f(t).replace(/([0]+$)/,\"\")},this._v=function(t){return this._f(t).length.toString()},this._w=function(t){return this._t(t).length.toString()},this}).call({}); var num = input.toString(); var n = runtime.n(num); var i = runtime.i(num); var v = runtime.v(num); var w = runtime.w(num); var f = runtime.f(num); var t = runtime.t(num); return ((((v == 0 && i % 10 == 1) && i % 100 != 11) || (f % 10 == 1 && f % 100 != 11)) ? 'one' : ((((v == 0 && ((i % 10 >= 2) && (i % 10 <= 4))) && !((i % 100 >= 12) && (i % 100 <= 14))) || (((f % 10 >= 2) && (f % 10 <= 4)) && !((f % 100 >= 12) && (f % 100 <= 14)))) ? 'few' : 'other')); })"}}},
+ :ca => {:i18n => {:plural => {:keys => [:one, :other],:rule => ->(input) { to_num = ->(str) { str.include?('.') ? str.to_f : str.to_i }; _n = ->(str) { str.gsub(/(-)(.*)/, '\2') }; _i = ->(str) { _n.(str).gsub(/([\d]+)(..*)/, '\1') }; _f = ->(str) { _n.(str).gsub(/([\d]+\.?)(.*)/, '\2') }; _t = ->(str) { _f.(str).gsub(/([0]+\z)/, '') }; _v = ->(str) { _f.(str).length.to_s }; _w = ->(str) { _t.(str).length.to_s }; __n = ->(str) { to_num.(str.include?('.') ? _n.(str).gsub(/([0]+\z)/, '').chomp('.') : _n.(str)) }; __i = ->(str) { to_num.(_i.(str)) }; __f = ->(str) { to_num.(_f.(str)) }; __t = ->(str) { to_num.(_t.(str)) }; __v = ->(str) { to_num.(_v.(str)) }; __w = ->(str) { to_num.(_w.(str)) }; num = input.to_s; n = __n.(num); i = __i.(num); v = __v.(num); w = __w.(num); f = __f.(num); t = __t.(num); ((i == 1 && v == 0) ? :one : :other) },:js_rule => "(function(input) { var runtime = (function(){return this.buildArgsFor=function(t){return[this.n(t),this.i(t),this.f(t),this.t(t),this.v(t),this.w(t)]},this.n=function(t){return this.toNum(t.indexOf(\".\")>-1?this._n(t).replace(/([0]+\\.$)/,\"\"):this._n(t))},this.i=function(t){return this.toNum(this._i(t))},this.f=function(t){return this.toNum(this._f(t))},this.t=function(t){return this.toNum(this._t(t))},this.v=function(t){return this.toNum(this._v(t))},this.w=function(t){return this.toNum(this._w(t))},this.toNum=function(t){return 0==t.length?0:t.indexOf(\".\")>-1?parseFloat(t):parseInt(t)},this._n=function(t){return/(-)?(.*)/.exec(t)[2]},this._i=function(t){return/([\\d]+)(\\..*)?/.exec(this._n(t))[1]},this._f=function(t){return/([\\d]+\\.?)(.*)/.exec(this._n(t))[2]},this._t=function(t){return this._f(t).replace(/([0]+$)/,\"\")},this._v=function(t){return this._f(t).length.toString()},this._w=function(t){return this._t(t).length.toString()},this}).call({}); var num = input.toString(); var n = runtime.n(num); var i = runtime.i(num); var v = runtime.v(num); var w = runtime.w(num); var f = runtime.f(num); var t = runtime.t(num); return ((i == 1 && v == 0) ? 'one' : 'other'); })"}}},
+ :cs => {:i18n => {:plural => {:keys => [:one, :few, :many, :other],:rule => ->(input) { to_num = ->(str) { str.include?('.') ? str.to_f : str.to_i }; _n = ->(str) { str.gsub(/(-)(.*)/, '\2') }; _i = ->(str) { _n.(str).gsub(/([\d]+)(..*)/, '\1') }; _f = ->(str) { _n.(str).gsub(/([\d]+\.?)(.*)/, '\2') }; _t = ->(str) { _f.(str).gsub(/([0]+\z)/, '') }; _v = ->(str) { _f.(str).length.to_s }; _w = ->(str) { _t.(str).length.to_s }; __n = ->(str) { to_num.(str.include?('.') ? _n.(str).gsub(/([0]+\z)/, '').chomp('.') : _n.(str)) }; __i = ->(str) { to_num.(_i.(str)) }; __f = ->(str) { to_num.(_f.(str)) }; __t = ->(str) { to_num.(_t.(str)) }; __v = ->(str) { to_num.(_v.(str)) }; __w = ->(str) { to_num.(_w.(str)) }; num = input.to_s; n = __n.(num); i = __i.(num); v = __v.(num); w = __w.(num); f = __f.(num); t = __t.(num); ((i == 1 && v == 0) ? :one : (((2..4).include?(i) && v == 0) ? :few : (v != 0 ? :many : :other))) },:js_rule => "(function(input) { var runtime = (function(){return this.buildArgsFor=function(t){return[this.n(t),this.i(t),this.f(t),this.t(t),this.v(t),this.w(t)]},this.n=function(t){return this.toNum(t.indexOf(\".\")>-1?this._n(t).replace(/([0]+\\.$)/,\"\"):this._n(t))},this.i=function(t){return this.toNum(this._i(t))},this.f=function(t){return this.toNum(this._f(t))},this.t=function(t){return this.toNum(this._t(t))},this.v=function(t){return this.toNum(this._v(t))},this.w=function(t){return this.toNum(this._w(t))},this.toNum=function(t){return 0==t.length?0:t.indexOf(\".\")>-1?parseFloat(t):parseInt(t)},this._n=function(t){return/(-)?(.*)/.exec(t)[2]},this._i=function(t){return/([\\d]+)(\\..*)?/.exec(this._n(t))[1]},this._f=function(t){return/([\\d]+\\.?)(.*)/.exec(this._n(t))[2]},this._t=function(t){return this._f(t).replace(/([0]+$)/,\"\")},this._v=function(t){return this._f(t).length.toString()},this._w=function(t){return this._t(t).length.toString()},this}).call({}); var num = input.toString(); var n = runtime.n(num); var i = runtime.i(num); var v = runtime.v(num); var w = runtime.w(num); var f = runtime.f(num); var t = runtime.t(num); return ((i == 1 && v == 0) ? 'one' : ((((i >= 2) && (i <= 4)) && v == 0) ? 'few' : (v != 0 ? 'many' : 'other'))); })"}}},
+ :cy => {:i18n => {:plural => {:keys => [:zero, :one, :two, :few, :many, :other],:rule => ->(input) { to_num = ->(str) { str.include?('.') ? str.to_f : str.to_i }; _n = ->(str) { str.gsub(/(-)(.*)/, '\2') }; _i = ->(str) { _n.(str).gsub(/([\d]+)(..*)/, '\1') }; _f = ->(str) { _n.(str).gsub(/([\d]+\.?)(.*)/, '\2') }; _t = ->(str) { _f.(str).gsub(/([0]+\z)/, '') }; _v = ->(str) { _f.(str).length.to_s }; _w = ->(str) { _t.(str).length.to_s }; __n = ->(str) { to_num.(str.include?('.') ? _n.(str).gsub(/([0]+\z)/, '').chomp('.') : _n.(str)) }; __i = ->(str) { to_num.(_i.(str)) }; __f = ->(str) { to_num.(_f.(str)) }; __t = ->(str) { to_num.(_t.(str)) }; __v = ->(str) { to_num.(_v.(str)) }; __w = ->(str) { to_num.(_w.(str)) }; num = input.to_s; n = __n.(num); i = __i.(num); v = __v.(num); w = __w.(num); f = __f.(num); t = __t.(num); (n == 0 ? :zero : (n == 1 ? :one : (n == 2 ? :two : (n == 3 ? :few : (n == 6 ? :many : :other))))) },:js_rule => "(function(input) { var runtime = (function(){return this.buildArgsFor=function(t){return[this.n(t),this.i(t),this.f(t),this.t(t),this.v(t),this.w(t)]},this.n=function(t){return this.toNum(t.indexOf(\".\")>-1?this._n(t).replace(/([0]+\\.$)/,\"\"):this._n(t))},this.i=function(t){return this.toNum(this._i(t))},this.f=function(t){return this.toNum(this._f(t))},this.t=function(t){return this.toNum(this._t(t))},this.v=function(t){return this.toNum(this._v(t))},this.w=function(t){return this.toNum(this._w(t))},this.toNum=function(t){return 0==t.length?0:t.indexOf(\".\")>-1?parseFloat(t):parseInt(t)},this._n=function(t){return/(-)?(.*)/.exec(t)[2]},this._i=function(t){return/([\\d]+)(\\..*)?/.exec(this._n(t))[1]},this._f=function(t){return/([\\d]+\\.?)(.*)/.exec(this._n(t))[2]},this._t=function(t){return this._f(t).replace(/([0]+$)/,\"\")},this._v=function(t){return this._f(t).length.toString()},this._w=function(t){return this._t(t).length.toString()},this}).call({}); var num = input.toString(); var n = runtime.n(num); var i = runtime.i(num); var v = runtime.v(num); var w = runtime.w(num); var f = runtime.f(num); var t = runtime.t(num); return (n == 0 ? 'zero' : (n == 1 ? 'one' : (n == 2 ? 'two' : (n == 3 ? 'few' : (n == 6 ? 'many' : 'other'))))); })"}}},
+ :da => {:i18n => {:plural => {:keys => [:one, :other],:rule => ->(input) { to_num = ->(str) { str.include?('.') ? str.to_f : str.to_i }; _n = ->(str) { str.gsub(/(-)(.*)/, '\2') }; _i = ->(str) { _n.(str).gsub(/([\d]+)(..*)/, '\1') }; _f = ->(str) { _n.(str).gsub(/([\d]+\.?)(.*)/, '\2') }; _t = ->(str) { _f.(str).gsub(/([0]+\z)/, '') }; _v = ->(str) { _f.(str).length.to_s }; _w = ->(str) { _t.(str).length.to_s }; __n = ->(str) { to_num.(str.include?('.') ? _n.(str).gsub(/([0]+\z)/, '').chomp('.') : _n.(str)) }; __i = ->(str) { to_num.(_i.(str)) }; __f = ->(str) { to_num.(_f.(str)) }; __t = ->(str) { to_num.(_t.(str)) }; __v = ->(str) { to_num.(_v.(str)) }; __w = ->(str) { to_num.(_w.(str)) }; num = input.to_s; n = __n.(num); i = __i.(num); v = __v.(num); w = __w.(num); f = __f.(num); t = __t.(num); ((n == 1 || (t != 0 && ((i == 0) || (i == 1)))) ? :one : :other) },:js_rule => "(function(input) { var runtime = (function(){return this.buildArgsFor=function(t){return[this.n(t),this.i(t),this.f(t),this.t(t),this.v(t),this.w(t)]},this.n=function(t){return this.toNum(t.indexOf(\".\")>-1?this._n(t).replace(/([0]+\\.$)/,\"\"):this._n(t))},this.i=function(t){return this.toNum(this._i(t))},this.f=function(t){return this.toNum(this._f(t))},this.t=function(t){return this.toNum(this._t(t))},this.v=function(t){return this.toNum(this._v(t))},this.w=function(t){return this.toNum(this._w(t))},this.toNum=function(t){return 0==t.length?0:t.indexOf(\".\")>-1?parseFloat(t):parseInt(t)},this._n=function(t){return/(-)?(.*)/.exec(t)[2]},this._i=function(t){return/([\\d]+)(\\..*)?/.exec(this._n(t))[1]},this._f=function(t){return/([\\d]+\\.?)(.*)/.exec(this._n(t))[2]},this._t=function(t){return this._f(t).replace(/([0]+$)/,\"\")},this._v=function(t){return this._f(t).length.toString()},this._w=function(t){return this._t(t).length.toString()},this}).call({}); var num = input.toString(); var n = runtime.n(num); var i = runtime.i(num); var v = runtime.v(num); var w = runtime.w(num); var f = runtime.f(num); var t = runtime.t(num); return ((n == 1 || (t != 0 && ((i == 0) || (i == 1)))) ? 'one' : 'other'); })"}}},
+ :de => {:i18n => {:plural => {:keys => [:one, :other],:rule => ->(input) { to_num = ->(str) { str.include?('.') ? str.to_f : str.to_i }; _n = ->(str) { str.gsub(/(-)(.*)/, '\2') }; _i = ->(str) { _n.(str).gsub(/([\d]+)(..*)/, '\1') }; _f = ->(str) { _n.(str).gsub(/([\d]+\.?)(.*)/, '\2') }; _t = ->(str) { _f.(str).gsub(/([0]+\z)/, '') }; _v = ->(str) { _f.(str).length.to_s }; _w = ->(str) { _t.(str).length.to_s }; __n = ->(str) { to_num.(str.include?('.') ? _n.(str).gsub(/([0]+\z)/, '').chomp('.') : _n.(str)) }; __i = ->(str) { to_num.(_i.(str)) }; __f = ->(str) { to_num.(_f.(str)) }; __t = ->(str) { to_num.(_t.(str)) }; __v = ->(str) { to_num.(_v.(str)) }; __w = ->(str) { to_num.(_w.(str)) }; num = input.to_s; n = __n.(num); i = __i.(num); v = __v.(num); w = __w.(num); f = __f.(num); t = __t.(num); ((i == 1 && v == 0) ? :one : :other) },:js_rule => "(function(input) { var runtime = (function(){return this.buildArgsFor=function(t){return[this.n(t),this.i(t),this.f(t),this.t(t),this.v(t),this.w(t)]},this.n=function(t){return this.toNum(t.indexOf(\".\")>-1?this._n(t).replace(/([0]+\\.$)/,\"\"):this._n(t))},this.i=function(t){return this.toNum(this._i(t))},this.f=function(t){return this.toNum(this._f(t))},this.t=function(t){return this.toNum(this._t(t))},this.v=function(t){return this.toNum(this._v(t))},this.w=function(t){return this.toNum(this._w(t))},this.toNum=function(t){return 0==t.length?0:t.indexOf(\".\")>-1?parseFloat(t):parseInt(t)},this._n=function(t){return/(-)?(.*)/.exec(t)[2]},this._i=function(t){return/([\\d]+)(\\..*)?/.exec(this._n(t))[1]},this._f=function(t){return/([\\d]+\\.?)(.*)/.exec(this._n(t))[2]},this._t=function(t){return this._f(t).replace(/([0]+$)/,\"\")},this._v=function(t){return this._f(t).length.toString()},this._w=function(t){return this._t(t).length.toString()},this}).call({}); var num = input.toString(); var n = runtime.n(num); var i = runtime.i(num); var v = runtime.v(num); var w = runtime.w(num); var f = runtime.f(num); var t = runtime.t(num); return ((i == 1 && v == 0) ? 'one' : 'other'); })"}}},
+ :el => {:i18n => {:plural => {:keys => [:one, :other],:rule => ->(input) { to_num = ->(str) { str.include?('.') ? str.to_f : str.to_i }; _n = ->(str) { str.gsub(/(-)(.*)/, '\2') }; _i = ->(str) { _n.(str).gsub(/([\d]+)(..*)/, '\1') }; _f = ->(str) { _n.(str).gsub(/([\d]+\.?)(.*)/, '\2') }; _t = ->(str) { _f.(str).gsub(/([0]+\z)/, '') }; _v = ->(str) { _f.(str).length.to_s }; _w = ->(str) { _t.(str).length.to_s }; __n = ->(str) { to_num.(str.include?('.') ? _n.(str).gsub(/([0]+\z)/, '').chomp('.') : _n.(str)) }; __i = ->(str) { to_num.(_i.(str)) }; __f = ->(str) { to_num.(_f.(str)) }; __t = ->(str) { to_num.(_t.(str)) }; __v = ->(str) { to_num.(_v.(str)) }; __w = ->(str) { to_num.(_w.(str)) }; num = input.to_s; n = __n.(num); i = __i.(num); v = __v.(num); w = __w.(num); f = __f.(num); t = __t.(num); (n == 1 ? :one : :other) },:js_rule => "(function(input) { var runtime = (function(){return this.buildArgsFor=function(t){return[this.n(t),this.i(t),this.f(t),this.t(t),this.v(t),this.w(t)]},this.n=function(t){return this.toNum(t.indexOf(\".\")>-1?this._n(t).replace(/([0]+\\.$)/,\"\"):this._n(t))},this.i=function(t){return this.toNum(this._i(t))},this.f=function(t){return this.toNum(this._f(t))},this.t=function(t){return this.toNum(this._t(t))},this.v=function(t){return this.toNum(this._v(t))},this.w=function(t){return this.toNum(this._w(t))},this.toNum=function(t){return 0==t.length?0:t.indexOf(\".\")>-1?parseFloat(t):parseInt(t)},this._n=function(t){return/(-)?(.*)/.exec(t)[2]},this._i=function(t){return/([\\d]+)(\\..*)?/.exec(this._n(t))[1]},this._f=function(t){return/([\\d]+\\.?)(.*)/.exec(this._n(t))[2]},this._t=function(t){return this._f(t).replace(/([0]+$)/,\"\")},this._v=function(t){return this._f(t).length.toString()},this._w=function(t){return this._t(t).length.toString()},this}).call({}); var num = input.toString(); var n = runtime.n(num); var i = runtime.i(num); var v = runtime.v(num); var w = runtime.w(num); var f = runtime.f(num); var t = runtime.t(num); return (n == 1 ? 'one' : 'other'); })"}}},
+ :en => {:i18n => {:plural => {:keys => [:one, :other],:rule => ->(input) { to_num = ->(str) { str.include?('.') ? str.to_f : str.to_i }; _n = ->(str) { str.gsub(/(-)(.*)/, '\2') }; _i = ->(str) { _n.(str).gsub(/([\d]+)(..*)/, '\1') }; _f = ->(str) { _n.(str).gsub(/([\d]+\.?)(.*)/, '\2') }; _t = ->(str) { _f.(str).gsub(/([0]+\z)/, '') }; _v = ->(str) { _f.(str).length.to_s }; _w = ->(str) { _t.(str).length.to_s }; __n = ->(str) { to_num.(str.include?('.') ? _n.(str).gsub(/([0]+\z)/, '').chomp('.') : _n.(str)) }; __i = ->(str) { to_num.(_i.(str)) }; __f = ->(str) { to_num.(_f.(str)) }; __t = ->(str) { to_num.(_t.(str)) }; __v = ->(str) { to_num.(_v.(str)) }; __w = ->(str) { to_num.(_w.(str)) }; num = input.to_s; n = __n.(num); i = __i.(num); v = __v.(num); w = __w.(num); f = __f.(num); t = __t.(num); ((i == 1 && v == 0) ? :one : :other) },:js_rule => "(function(input) { var runtime = (function(){return this.buildArgsFor=function(t){return[this.n(t),this.i(t),this.f(t),this.t(t),this.v(t),this.w(t)]},this.n=function(t){return this.toNum(t.indexOf(\".\")>-1?this._n(t).replace(/([0]+\\.$)/,\"\"):this._n(t))},this.i=function(t){return this.toNum(this._i(t))},this.f=function(t){return this.toNum(this._f(t))},this.t=function(t){return this.toNum(this._t(t))},this.v=function(t){return this.toNum(this._v(t))},this.w=function(t){return this.toNum(this._w(t))},this.toNum=function(t){return 0==t.length?0:t.indexOf(\".\")>-1?parseFloat(t):parseInt(t)},this._n=function(t){return/(-)?(.*)/.exec(t)[2]},this._i=function(t){return/([\\d]+)(\\..*)?/.exec(this._n(t))[1]},this._f=function(t){return/([\\d]+\\.?)(.*)/.exec(this._n(t))[2]},this._t=function(t){return this._f(t).replace(/([0]+$)/,\"\")},this._v=function(t){return this._f(t).length.toString()},this._w=function(t){return this._t(t).length.toString()},this}).call({}); var num = input.toString(); var n = runtime.n(num); var i = runtime.i(num); var v = runtime.v(num); var w = runtime.w(num); var f = runtime.f(num); var t = runtime.t(num); return ((i == 1 && v == 0) ? 'one' : 'other'); })"}}},
+ :eo => {:i18n => {:plural => {:keys => [:one, :other],:rule => ->(input) { to_num = ->(str) { str.include?('.') ? str.to_f : str.to_i }; _n = ->(str) { str.gsub(/(-)(.*)/, '\2') }; _i = ->(str) { _n.(str).gsub(/([\d]+)(..*)/, '\1') }; _f = ->(str) { _n.(str).gsub(/([\d]+\.?)(.*)/, '\2') }; _t = ->(str) { _f.(str).gsub(/([0]+\z)/, '') }; _v = ->(str) { _f.(str).length.to_s }; _w = ->(str) { _t.(str).length.to_s }; __n = ->(str) { to_num.(str.include?('.') ? _n.(str).gsub(/([0]+\z)/, '').chomp('.') : _n.(str)) }; __i = ->(str) { to_num.(_i.(str)) }; __f = ->(str) { to_num.(_f.(str)) }; __t = ->(str) { to_num.(_t.(str)) }; __v = ->(str) { to_num.(_v.(str)) }; __w = ->(str) { to_num.(_w.(str)) }; num = input.to_s; n = __n.(num); i = __i.(num); v = __v.(num); w = __w.(num); f = __f.(num); t = __t.(num); (n == 1 ? :one : :other) },:js_rule => "(function(input) { var runtime = (function(){return this.buildArgsFor=function(t){return[this.n(t),this.i(t),this.f(t),this.t(t),this.v(t),this.w(t)]},this.n=function(t){return this.toNum(t.indexOf(\".\")>-1?this._n(t).replace(/([0]+\\.$)/,\"\"):this._n(t))},this.i=function(t){return this.toNum(this._i(t))},this.f=function(t){return this.toNum(this._f(t))},this.t=function(t){return this.toNum(this._t(t))},this.v=function(t){return this.toNum(this._v(t))},this.w=function(t){return this.toNum(this._w(t))},this.toNum=function(t){return 0==t.length?0:t.indexOf(\".\")>-1?parseFloat(t):parseInt(t)},this._n=function(t){return/(-)?(.*)/.exec(t)[2]},this._i=function(t){return/([\\d]+)(\\..*)?/.exec(this._n(t))[1]},this._f=function(t){return/([\\d]+\\.?)(.*)/.exec(this._n(t))[2]},this._t=function(t){return this._f(t).replace(/([0]+$)/,\"\")},this._v=function(t){return this._f(t).length.toString()},this._w=function(t){return this._t(t).length.toString()},this}).call({}); var num = input.toString(); var n = runtime.n(num); var i = runtime.i(num); var v = runtime.v(num); var w = runtime.w(num); var f = runtime.f(num); var t = runtime.t(num); return (n == 1 ? 'one' : 'other'); })"}}},
+ :es => {:i18n => {:plural => {:keys => [:one, :other],:rule => ->(input) { to_num = ->(str) { str.include?('.') ? str.to_f : str.to_i }; _n = ->(str) { str.gsub(/(-)(.*)/, '\2') }; _i = ->(str) { _n.(str).gsub(/([\d]+)(..*)/, '\1') }; _f = ->(str) { _n.(str).gsub(/([\d]+\.?)(.*)/, '\2') }; _t = ->(str) { _f.(str).gsub(/([0]+\z)/, '') }; _v = ->(str) { _f.(str).length.to_s }; _w = ->(str) { _t.(str).length.to_s }; __n = ->(str) { to_num.(str.include?('.') ? _n.(str).gsub(/([0]+\z)/, '').chomp('.') : _n.(str)) }; __i = ->(str) { to_num.(_i.(str)) }; __f = ->(str) { to_num.(_f.(str)) }; __t = ->(str) { to_num.(_t.(str)) }; __v = ->(str) { to_num.(_v.(str)) }; __w = ->(str) { to_num.(_w.(str)) }; num = input.to_s; n = __n.(num); i = __i.(num); v = __v.(num); w = __w.(num); f = __f.(num); t = __t.(num); (n == 1 ? :one : :other) },:js_rule => "(function(input) { var runtime = (function(){return this.buildArgsFor=function(t){return[this.n(t),this.i(t),this.f(t),this.t(t),this.v(t),this.w(t)]},this.n=function(t){return this.toNum(t.indexOf(\".\")>-1?this._n(t).replace(/([0]+\\.$)/,\"\"):this._n(t))},this.i=function(t){return this.toNum(this._i(t))},this.f=function(t){return this.toNum(this._f(t))},this.t=function(t){return this.toNum(this._t(t))},this.v=function(t){return this.toNum(this._v(t))},this.w=function(t){return this.toNum(this._w(t))},this.toNum=function(t){return 0==t.length?0:t.indexOf(\".\")>-1?parseFloat(t):parseInt(t)},this._n=function(t){return/(-)?(.*)/.exec(t)[2]},this._i=function(t){return/([\\d]+)(\\..*)?/.exec(this._n(t))[1]},this._f=function(t){return/([\\d]+\\.?)(.*)/.exec(this._n(t))[2]},this._t=function(t){return this._f(t).replace(/([0]+$)/,\"\")},this._v=function(t){return this._f(t).length.toString()},this._w=function(t){return this._t(t).length.toString()},this}).call({}); var num = input.toString(); var n = runtime.n(num); var i = runtime.i(num); var v = runtime.v(num); var w = runtime.w(num); var f = runtime.f(num); var t = runtime.t(num); return (n == 1 ? 'one' : 'other'); })"}}},
+ :et => {:i18n => {:plural => {:keys => [:one, :other],:rule => ->(input) { to_num = ->(str) { str.include?('.') ? str.to_f : str.to_i }; _n = ->(str) { str.gsub(/(-)(.*)/, '\2') }; _i = ->(str) { _n.(str).gsub(/([\d]+)(..*)/, '\1') }; _f = ->(str) { _n.(str).gsub(/([\d]+\.?)(.*)/, '\2') }; _t = ->(str) { _f.(str).gsub(/([0]+\z)/, '') }; _v = ->(str) { _f.(str).length.to_s }; _w = ->(str) { _t.(str).length.to_s }; __n = ->(str) { to_num.(str.include?('.') ? _n.(str).gsub(/([0]+\z)/, '').chomp('.') : _n.(str)) }; __i = ->(str) { to_num.(_i.(str)) }; __f = ->(str) { to_num.(_f.(str)) }; __t = ->(str) { to_num.(_t.(str)) }; __v = ->(str) { to_num.(_v.(str)) }; __w = ->(str) { to_num.(_w.(str)) }; num = input.to_s; n = __n.(num); i = __i.(num); v = __v.(num); w = __w.(num); f = __f.(num); t = __t.(num); ((i == 1 && v == 0) ? :one : :other) },:js_rule => "(function(input) { var runtime = (function(){return this.buildArgsFor=function(t){return[this.n(t),this.i(t),this.f(t),this.t(t),this.v(t),this.w(t)]},this.n=function(t){return this.toNum(t.indexOf(\".\")>-1?this._n(t).replace(/([0]+\\.$)/,\"\"):this._n(t))},this.i=function(t){return this.toNum(this._i(t))},this.f=function(t){return this.toNum(this._f(t))},this.t=function(t){return this.toNum(this._t(t))},this.v=function(t){return this.toNum(this._v(t))},this.w=function(t){return this.toNum(this._w(t))},this.toNum=function(t){return 0==t.length?0:t.indexOf(\".\")>-1?parseFloat(t):parseInt(t)},this._n=function(t){return/(-)?(.*)/.exec(t)[2]},this._i=function(t){return/([\\d]+)(\\..*)?/.exec(this._n(t))[1]},this._f=function(t){return/([\\d]+\\.?)(.*)/.exec(this._n(t))[2]},this._t=function(t){return this._f(t).replace(/([0]+$)/,\"\")},this._v=function(t){return this._f(t).length.toString()},this._w=function(t){return this._t(t).length.toString()},this}).call({}); var num = input.toString(); var n = runtime.n(num); var i = runtime.i(num); var v = runtime.v(num); var w = runtime.w(num); var f = runtime.f(num); var t = runtime.t(num); return ((i == 1 && v == 0) ? 'one' : 'other'); })"}}},
+ :eu => {:i18n => {:plural => {:keys => [:one, :other],:rule => ->(input) { to_num = ->(str) { str.include?('.') ? str.to_f : str.to_i }; _n = ->(str) { str.gsub(/(-)(.*)/, '\2') }; _i = ->(str) { _n.(str).gsub(/([\d]+)(..*)/, '\1') }; _f = ->(str) { _n.(str).gsub(/([\d]+\.?)(.*)/, '\2') }; _t = ->(str) { _f.(str).gsub(/([0]+\z)/, '') }; _v = ->(str) { _f.(str).length.to_s }; _w = ->(str) { _t.(str).length.to_s }; __n = ->(str) { to_num.(str.include?('.') ? _n.(str).gsub(/([0]+\z)/, '').chomp('.') : _n.(str)) }; __i = ->(str) { to_num.(_i.(str)) }; __f = ->(str) { to_num.(_f.(str)) }; __t = ->(str) { to_num.(_t.(str)) }; __v = ->(str) { to_num.(_v.(str)) }; __w = ->(str) { to_num.(_w.(str)) }; num = input.to_s; n = __n.(num); i = __i.(num); v = __v.(num); w = __w.(num); f = __f.(num); t = __t.(num); (n == 1 ? :one : :other) },:js_rule => "(function(input) { var runtime = (function(){return this.buildArgsFor=function(t){return[this.n(t),this.i(t),this.f(t),this.t(t),this.v(t),this.w(t)]},this.n=function(t){return this.toNum(t.indexOf(\".\")>-1?this._n(t).replace(/([0]+\\.$)/,\"\"):this._n(t))},this.i=function(t){return this.toNum(this._i(t))},this.f=function(t){return this.toNum(this._f(t))},this.t=function(t){return this.toNum(this._t(t))},this.v=function(t){return this.toNum(this._v(t))},this.w=function(t){return this.toNum(this._w(t))},this.toNum=function(t){return 0==t.length?0:t.indexOf(\".\")>-1?parseFloat(t):parseInt(t)},this._n=function(t){return/(-)?(.*)/.exec(t)[2]},this._i=function(t){return/([\\d]+)(\\..*)?/.exec(this._n(t))[1]},this._f=function(t){return/([\\d]+\\.?)(.*)/.exec(this._n(t))[2]},this._t=function(t){return this._f(t).replace(/([0]+$)/,\"\")},this._v=function(t){return this._f(t).length.toString()},this._w=function(t){return this._t(t).length.toString()},this}).call({}); var num = input.toString(); var n = runtime.n(num); var i = runtime.i(num); var v = runtime.v(num); var w = runtime.w(num); var f = runtime.f(num); var t = runtime.t(num); return (n == 1 ? 'one' : 'other'); })"}}},
+ :fi => {:i18n => {:plural => {:keys => [:one, :other],:rule => ->(input) { to_num = ->(str) { str.include?('.') ? str.to_f : str.to_i }; _n = ->(str) { str.gsub(/(-)(.*)/, '\2') }; _i = ->(str) { _n.(str).gsub(/([\d]+)(..*)/, '\1') }; _f = ->(str) { _n.(str).gsub(/([\d]+\.?)(.*)/, '\2') }; _t = ->(str) { _f.(str).gsub(/([0]+\z)/, '') }; _v = ->(str) { _f.(str).length.to_s }; _w = ->(str) { _t.(str).length.to_s }; __n = ->(str) { to_num.(str.include?('.') ? _n.(str).gsub(/([0]+\z)/, '').chomp('.') : _n.(str)) }; __i = ->(str) { to_num.(_i.(str)) }; __f = ->(str) { to_num.(_f.(str)) }; __t = ->(str) { to_num.(_t.(str)) }; __v = ->(str) { to_num.(_v.(str)) }; __w = ->(str) { to_num.(_w.(str)) }; num = input.to_s; n = __n.(num); i = __i.(num); v = __v.(num); w = __w.(num); f = __f.(num); t = __t.(num); ((i == 1 && v == 0) ? :one : :other) },:js_rule => "(function(input) { var runtime = (function(){return this.buildArgsFor=function(t){return[this.n(t),this.i(t),this.f(t),this.t(t),this.v(t),this.w(t)]},this.n=function(t){return this.toNum(t.indexOf(\".\")>-1?this._n(t).replace(/([0]+\\.$)/,\"\"):this._n(t))},this.i=function(t){return this.toNum(this._i(t))},this.f=function(t){return this.toNum(this._f(t))},this.t=function(t){return this.toNum(this._t(t))},this.v=function(t){return this.toNum(this._v(t))},this.w=function(t){return this.toNum(this._w(t))},this.toNum=function(t){return 0==t.length?0:t.indexOf(\".\")>-1?parseFloat(t):parseInt(t)},this._n=function(t){return/(-)?(.*)/.exec(t)[2]},this._i=function(t){return/([\\d]+)(\\..*)?/.exec(this._n(t))[1]},this._f=function(t){return/([\\d]+\\.?)(.*)/.exec(this._n(t))[2]},this._t=function(t){return this._f(t).replace(/([0]+$)/,\"\")},this._v=function(t){return this._f(t).length.toString()},this._w=function(t){return this._t(t).length.toString()},this}).call({}); var num = input.toString(); var n = runtime.n(num); var i = runtime.i(num); var v = runtime.v(num); var w = runtime.w(num); var f = runtime.f(num); var t = runtime.t(num); return ((i == 1 && v == 0) ? 'one' : 'other'); })"}}},
+ :fil => {:i18n => {:plural => {:keys => [:one, :other],:rule => ->(input) { to_num = ->(str) { str.include?('.') ? str.to_f : str.to_i }; _n = ->(str) { str.gsub(/(-)(.*)/, '\2') }; _i = ->(str) { _n.(str).gsub(/([\d]+)(..*)/, '\1') }; _f = ->(str) { _n.(str).gsub(/([\d]+\.?)(.*)/, '\2') }; _t = ->(str) { _f.(str).gsub(/([0]+\z)/, '') }; _v = ->(str) { _f.(str).length.to_s }; _w = ->(str) { _t.(str).length.to_s }; __n = ->(str) { to_num.(str.include?('.') ? _n.(str).gsub(/([0]+\z)/, '').chomp('.') : _n.(str)) }; __i = ->(str) { to_num.(_i.(str)) }; __f = ->(str) { to_num.(_f.(str)) }; __t = ->(str) { to_num.(_t.(str)) }; __v = ->(str) { to_num.(_v.(str)) }; __w = ->(str) { to_num.(_w.(str)) }; num = input.to_s; n = __n.(num); i = __i.(num); v = __v.(num); w = __w.(num); f = __f.(num); t = __t.(num); ((((v == 0 && ((i == 1) || (i == 2) || (i == 3))) || (v == 0 && ((i % 10 != 4) && (i % 10 != 6) && (i % 10 != 9)))) || (v != 0 && ((f % 10 != 4) && (f % 10 != 6) && (f % 10 != 9)))) ? :one : :other) },:js_rule => "(function(input) { var runtime = (function(){return this.buildArgsFor=function(t){return[this.n(t),this.i(t),this.f(t),this.t(t),this.v(t),this.w(t)]},this.n=function(t){return this.toNum(t.indexOf(\".\")>-1?this._n(t).replace(/([0]+\\.$)/,\"\"):this._n(t))},this.i=function(t){return this.toNum(this._i(t))},this.f=function(t){return this.toNum(this._f(t))},this.t=function(t){return this.toNum(this._t(t))},this.v=function(t){return this.toNum(this._v(t))},this.w=function(t){return this.toNum(this._w(t))},this.toNum=function(t){return 0==t.length?0:t.indexOf(\".\")>-1?parseFloat(t):parseInt(t)},this._n=function(t){return/(-)?(.*)/.exec(t)[2]},this._i=function(t){return/([\\d]+)(\\..*)?/.exec(this._n(t))[1]},this._f=function(t){return/([\\d]+\\.?)(.*)/.exec(this._n(t))[2]},this._t=function(t){return this._f(t).replace(/([0]+$)/,\"\")},this._v=function(t){return this._f(t).length.toString()},this._w=function(t){return this._t(t).length.toString()},this}).call({}); var num = input.toString(); var n = runtime.n(num); var i = runtime.i(num); var v = runtime.v(num); var w = runtime.w(num); var f = runtime.f(num); var t = runtime.t(num); return ((((v == 0 && ((i == 1) || (i == 2) || (i == 3))) || (v == 0 && ((i % 10 != 4) && (i % 10 != 6) && (i % 10 != 9)))) || (v != 0 && ((f % 10 != 4) && (f % 10 != 6) && (f % 10 != 9)))) ? 'one' : 'other'); })"}}},
+ :fr => {:i18n => {:plural => {:keys => [:one, :other],:rule => ->(input) { to_num = ->(str) { str.include?('.') ? str.to_f : str.to_i }; _n = ->(str) { str.gsub(/(-)(.*)/, '\2') }; _i = ->(str) { _n.(str).gsub(/([\d]+)(..*)/, '\1') }; _f = ->(str) { _n.(str).gsub(/([\d]+\.?)(.*)/, '\2') }; _t = ->(str) { _f.(str).gsub(/([0]+\z)/, '') }; _v = ->(str) { _f.(str).length.to_s }; _w = ->(str) { _t.(str).length.to_s }; __n = ->(str) { to_num.(str.include?('.') ? _n.(str).gsub(/([0]+\z)/, '').chomp('.') : _n.(str)) }; __i = ->(str) { to_num.(_i.(str)) }; __f = ->(str) { to_num.(_f.(str)) }; __t = ->(str) { to_num.(_t.(str)) }; __v = ->(str) { to_num.(_v.(str)) }; __w = ->(str) { to_num.(_w.(str)) }; num = input.to_s; n = __n.(num); i = __i.(num); v = __v.(num); w = __w.(num); f = __f.(num); t = __t.(num); (((i == 0) || (i == 1)) ? :one : :other) },:js_rule => "(function(input) { var runtime = (function(){return this.buildArgsFor=function(t){return[this.n(t),this.i(t),this.f(t),this.t(t),this.v(t),this.w(t)]},this.n=function(t){return this.toNum(t.indexOf(\".\")>-1?this._n(t).replace(/([0]+\\.$)/,\"\"):this._n(t))},this.i=function(t){return this.toNum(this._i(t))},this.f=function(t){return this.toNum(this._f(t))},this.t=function(t){return this.toNum(this._t(t))},this.v=function(t){return this.toNum(this._v(t))},this.w=function(t){return this.toNum(this._w(t))},this.toNum=function(t){return 0==t.length?0:t.indexOf(\".\")>-1?parseFloat(t):parseInt(t)},this._n=function(t){return/(-)?(.*)/.exec(t)[2]},this._i=function(t){return/([\\d]+)(\\..*)?/.exec(this._n(t))[1]},this._f=function(t){return/([\\d]+\\.?)(.*)/.exec(this._n(t))[2]},this._t=function(t){return this._f(t).replace(/([0]+$)/,\"\")},this._v=function(t){return this._f(t).length.toString()},this._w=function(t){return this._t(t).length.toString()},this}).call({}); var num = input.toString(); var n = runtime.n(num); var i = runtime.i(num); var v = runtime.v(num); var w = runtime.w(num); var f = runtime.f(num); var t = runtime.t(num); return (((i == 0) || (i == 1)) ? 'one' : 'other'); })"}}},
+ :fy => {:i18n => {:plural => {:keys => [:one, :other],:rule => ->(input) { to_num = ->(str) { str.include?('.') ? str.to_f : str.to_i }; _n = ->(str) { str.gsub(/(-)(.*)/, '\2') }; _i = ->(str) { _n.(str).gsub(/([\d]+)(..*)/, '\1') }; _f = ->(str) { _n.(str).gsub(/([\d]+\.?)(.*)/, '\2') }; _t = ->(str) { _f.(str).gsub(/([0]+\z)/, '') }; _v = ->(str) { _f.(str).length.to_s }; _w = ->(str) { _t.(str).length.to_s }; __n = ->(str) { to_num.(str.include?('.') ? _n.(str).gsub(/([0]+\z)/, '').chomp('.') : _n.(str)) }; __i = ->(str) { to_num.(_i.(str)) }; __f = ->(str) { to_num.(_f.(str)) }; __t = ->(str) { to_num.(_t.(str)) }; __v = ->(str) { to_num.(_v.(str)) }; __w = ->(str) { to_num.(_w.(str)) }; num = input.to_s; n = __n.(num); i = __i.(num); v = __v.(num); w = __w.(num); f = __f.(num); t = __t.(num); ((i == 1 && v == 0) ? :one : :other) },:js_rule => "(function(input) { var runtime = (function(){return this.buildArgsFor=function(t){return[this.n(t),this.i(t),this.f(t),this.t(t),this.v(t),this.w(t)]},this.n=function(t){return this.toNum(t.indexOf(\".\")>-1?this._n(t).replace(/([0]+\\.$)/,\"\"):this._n(t))},this.i=function(t){return this.toNum(this._i(t))},this.f=function(t){return this.toNum(this._f(t))},this.t=function(t){return this.toNum(this._t(t))},this.v=function(t){return this.toNum(this._v(t))},this.w=function(t){return this.toNum(this._w(t))},this.toNum=function(t){return 0==t.length?0:t.indexOf(\".\")>-1?parseFloat(t):parseInt(t)},this._n=function(t){return/(-)?(.*)/.exec(t)[2]},this._i=function(t){return/([\\d]+)(\\..*)?/.exec(this._n(t))[1]},this._f=function(t){return/([\\d]+\\.?)(.*)/.exec(this._n(t))[2]},this._t=function(t){return this._f(t).replace(/([0]+$)/,\"\")},this._v=function(t){return this._f(t).length.toString()},this._w=function(t){return this._t(t).length.toString()},this}).call({}); var num = input.toString(); var n = runtime.n(num); var i = runtime.i(num); var v = runtime.v(num); var w = runtime.w(num); var f = runtime.f(num); var t = runtime.t(num); return ((i == 1 && v == 0) ? 'one' : 'other'); })"}}},
+ :ga => {:i18n => {:plural => {:keys => [:one, :two, :few, :many, :other],:rule => ->(input) { to_num = ->(str) { str.include?('.') ? str.to_f : str.to_i }; _n = ->(str) { str.gsub(/(-)(.*)/, '\2') }; _i = ->(str) { _n.(str).gsub(/([\d]+)(..*)/, '\1') }; _f = ->(str) { _n.(str).gsub(/([\d]+\.?)(.*)/, '\2') }; _t = ->(str) { _f.(str).gsub(/([0]+\z)/, '') }; _v = ->(str) { _f.(str).length.to_s }; _w = ->(str) { _t.(str).length.to_s }; __n = ->(str) { to_num.(str.include?('.') ? _n.(str).gsub(/([0]+\z)/, '').chomp('.') : _n.(str)) }; __i = ->(str) { to_num.(_i.(str)) }; __f = ->(str) { to_num.(_f.(str)) }; __t = ->(str) { to_num.(_t.(str)) }; __v = ->(str) { to_num.(_v.(str)) }; __w = ->(str) { to_num.(_w.(str)) }; num = input.to_s; n = __n.(num); i = __i.(num); v = __v.(num); w = __w.(num); f = __f.(num); t = __t.(num); (n == 1 ? :one : (n == 2 ? :two : ((3..6).include?(n) ? :few : ((7..10).include?(n) ? :many : :other)))) },:js_rule => "(function(input) { var runtime = (function(){return this.buildArgsFor=function(t){return[this.n(t),this.i(t),this.f(t),this.t(t),this.v(t),this.w(t)]},this.n=function(t){return this.toNum(t.indexOf(\".\")>-1?this._n(t).replace(/([0]+\\.$)/,\"\"):this._n(t))},this.i=function(t){return this.toNum(this._i(t))},this.f=function(t){return this.toNum(this._f(t))},this.t=function(t){return this.toNum(this._t(t))},this.v=function(t){return this.toNum(this._v(t))},this.w=function(t){return this.toNum(this._w(t))},this.toNum=function(t){return 0==t.length?0:t.indexOf(\".\")>-1?parseFloat(t):parseInt(t)},this._n=function(t){return/(-)?(.*)/.exec(t)[2]},this._i=function(t){return/([\\d]+)(\\..*)?/.exec(this._n(t))[1]},this._f=function(t){return/([\\d]+\\.?)(.*)/.exec(this._n(t))[2]},this._t=function(t){return this._f(t).replace(/([0]+$)/,\"\")},this._v=function(t){return this._f(t).length.toString()},this._w=function(t){return this._t(t).length.toString()},this}).call({}); var num = input.toString(); var n = runtime.n(num); var i = runtime.i(num); var v = runtime.v(num); var w = runtime.w(num); var f = runtime.f(num); var t = runtime.t(num); return (n == 1 ? 'one' : (n == 2 ? 'two' : (((n >= 3) && (n <= 6)) ? 'few' : (((n >= 7) && (n <= 10)) ? 'many' : 'other')))); })"}}},
+ :gl => {:i18n => {:plural => {:keys => [:one, :other],:rule => ->(input) { to_num = ->(str) { str.include?('.') ? str.to_f : str.to_i }; _n = ->(str) { str.gsub(/(-)(.*)/, '\2') }; _i = ->(str) { _n.(str).gsub(/([\d]+)(..*)/, '\1') }; _f = ->(str) { _n.(str).gsub(/([\d]+\.?)(.*)/, '\2') }; _t = ->(str) { _f.(str).gsub(/([0]+\z)/, '') }; _v = ->(str) { _f.(str).length.to_s }; _w = ->(str) { _t.(str).length.to_s }; __n = ->(str) { to_num.(str.include?('.') ? _n.(str).gsub(/([0]+\z)/, '').chomp('.') : _n.(str)) }; __i = ->(str) { to_num.(_i.(str)) }; __f = ->(str) { to_num.(_f.(str)) }; __t = ->(str) { to_num.(_t.(str)) }; __v = ->(str) { to_num.(_v.(str)) }; __w = ->(str) { to_num.(_w.(str)) }; num = input.to_s; n = __n.(num); i = __i.(num); v = __v.(num); w = __w.(num); f = __f.(num); t = __t.(num); ((i == 1 && v == 0) ? :one : :other) },:js_rule => "(function(input) { var runtime = (function(){return this.buildArgsFor=function(t){return[this.n(t),this.i(t),this.f(t),this.t(t),this.v(t),this.w(t)]},this.n=function(t){return this.toNum(t.indexOf(\".\")>-1?this._n(t).replace(/([0]+\\.$)/,\"\"):this._n(t))},this.i=function(t){return this.toNum(this._i(t))},this.f=function(t){return this.toNum(this._f(t))},this.t=function(t){return this.toNum(this._t(t))},this.v=function(t){return this.toNum(this._v(t))},this.w=function(t){return this.toNum(this._w(t))},this.toNum=function(t){return 0==t.length?0:t.indexOf(\".\")>-1?parseFloat(t):parseInt(t)},this._n=function(t){return/(-)?(.*)/.exec(t)[2]},this._i=function(t){return/([\\d]+)(\\..*)?/.exec(this._n(t))[1]},this._f=function(t){return/([\\d]+\\.?)(.*)/.exec(this._n(t))[2]},this._t=function(t){return this._f(t).replace(/([0]+$)/,\"\")},this._v=function(t){return this._f(t).length.toString()},this._w=function(t){return this._t(t).length.toString()},this}).call({}); var num = input.toString(); var n = runtime.n(num); var i = runtime.i(num); var v = runtime.v(num); var w = runtime.w(num); var f = runtime.f(num); var t = runtime.t(num); return ((i == 1 && v == 0) ? 'one' : 'other'); })"}}},
+ :he => {:i18n => {:plural => {:keys => [:one, :two, :many, :other],:rule => ->(input) { to_num = ->(str) { str.include?('.') ? str.to_f : str.to_i }; _n = ->(str) { str.gsub(/(-)(.*)/, '\2') }; _i = ->(str) { _n.(str).gsub(/([\d]+)(..*)/, '\1') }; _f = ->(str) { _n.(str).gsub(/([\d]+\.?)(.*)/, '\2') }; _t = ->(str) { _f.(str).gsub(/([0]+\z)/, '') }; _v = ->(str) { _f.(str).length.to_s }; _w = ->(str) { _t.(str).length.to_s }; __n = ->(str) { to_num.(str.include?('.') ? _n.(str).gsub(/([0]+\z)/, '').chomp('.') : _n.(str)) }; __i = ->(str) { to_num.(_i.(str)) }; __f = ->(str) { to_num.(_f.(str)) }; __t = ->(str) { to_num.(_t.(str)) }; __v = ->(str) { to_num.(_v.(str)) }; __w = ->(str) { to_num.(_w.(str)) }; num = input.to_s; n = __n.(num); i = __i.(num); v = __v.(num); w = __w.(num); f = __f.(num); t = __t.(num); ((i == 1 && v == 0) ? :one : ((i == 2 && v == 0) ? :two : (((v == 0 && !(0..10).include?(n)) && n % 10 == 0) ? :many : :other))) },:js_rule => "(function(input) { var runtime = (function(){return this.buildArgsFor=function(t){return[this.n(t),this.i(t),this.f(t),this.t(t),this.v(t),this.w(t)]},this.n=function(t){return this.toNum(t.indexOf(\".\")>-1?this._n(t).replace(/([0]+\\.$)/,\"\"):this._n(t))},this.i=function(t){return this.toNum(this._i(t))},this.f=function(t){return this.toNum(this._f(t))},this.t=function(t){return this.toNum(this._t(t))},this.v=function(t){return this.toNum(this._v(t))},this.w=function(t){return this.toNum(this._w(t))},this.toNum=function(t){return 0==t.length?0:t.indexOf(\".\")>-1?parseFloat(t):parseInt(t)},this._n=function(t){return/(-)?(.*)/.exec(t)[2]},this._i=function(t){return/([\\d]+)(\\..*)?/.exec(this._n(t))[1]},this._f=function(t){return/([\\d]+\\.?)(.*)/.exec(this._n(t))[2]},this._t=function(t){return this._f(t).replace(/([0]+$)/,\"\")},this._v=function(t){return this._f(t).length.toString()},this._w=function(t){return this._t(t).length.toString()},this}).call({}); var num = input.toString(); var n = runtime.n(num); var i = runtime.i(num); var v = runtime.v(num); var w = runtime.w(num); var f = runtime.f(num); var t = runtime.t(num); return ((i == 1 && v == 0) ? 'one' : ((i == 2 && v == 0) ? 'two' : (((v == 0 && !((n >= 0) && (n <= 10))) && n % 10 == 0) ? 'many' : 'other'))); })"}}},
+ :hu => {:i18n => {:plural => {:keys => [:one, :other],:rule => ->(input) { to_num = ->(str) { str.include?('.') ? str.to_f : str.to_i }; _n = ->(str) { str.gsub(/(-)(.*)/, '\2') }; _i = ->(str) { _n.(str).gsub(/([\d]+)(..*)/, '\1') }; _f = ->(str) { _n.(str).gsub(/([\d]+\.?)(.*)/, '\2') }; _t = ->(str) { _f.(str).gsub(/([0]+\z)/, '') }; _v = ->(str) { _f.(str).length.to_s }; _w = ->(str) { _t.(str).length.to_s }; __n = ->(str) { to_num.(str.include?('.') ? _n.(str).gsub(/([0]+\z)/, '').chomp('.') : _n.(str)) }; __i = ->(str) { to_num.(_i.(str)) }; __f = ->(str) { to_num.(_f.(str)) }; __t = ->(str) { to_num.(_t.(str)) }; __v = ->(str) { to_num.(_v.(str)) }; __w = ->(str) { to_num.(_w.(str)) }; num = input.to_s; n = __n.(num); i = __i.(num); v = __v.(num); w = __w.(num); f = __f.(num); t = __t.(num); (n == 1 ? :one : :other) },:js_rule => "(function(input) { var runtime = (function(){return this.buildArgsFor=function(t){return[this.n(t),this.i(t),this.f(t),this.t(t),this.v(t),this.w(t)]},this.n=function(t){return this.toNum(t.indexOf(\".\")>-1?this._n(t).replace(/([0]+\\.$)/,\"\"):this._n(t))},this.i=function(t){return this.toNum(this._i(t))},this.f=function(t){return this.toNum(this._f(t))},this.t=function(t){return this.toNum(this._t(t))},this.v=function(t){return this.toNum(this._v(t))},this.w=function(t){return this.toNum(this._w(t))},this.toNum=function(t){return 0==t.length?0:t.indexOf(\".\")>-1?parseFloat(t):parseInt(t)},this._n=function(t){return/(-)?(.*)/.exec(t)[2]},this._i=function(t){return/([\\d]+)(\\..*)?/.exec(this._n(t))[1]},this._f=function(t){return/([\\d]+\\.?)(.*)/.exec(this._n(t))[2]},this._t=function(t){return this._f(t).replace(/([0]+$)/,\"\")},this._v=function(t){return this._f(t).length.toString()},this._w=function(t){return this._t(t).length.toString()},this}).call({}); var num = input.toString(); var n = runtime.n(num); var i = runtime.i(num); var v = runtime.v(num); var w = runtime.w(num); var f = runtime.f(num); var t = runtime.t(num); return (n == 1 ? 'one' : 'other'); })"}}},
+ :hy => {:i18n => {:plural => {:keys => [:one, :other],:rule => ->(input) { to_num = ->(str) { str.include?('.') ? str.to_f : str.to_i }; _n = ->(str) { str.gsub(/(-)(.*)/, '\2') }; _i = ->(str) { _n.(str).gsub(/([\d]+)(..*)/, '\1') }; _f = ->(str) { _n.(str).gsub(/([\d]+\.?)(.*)/, '\2') }; _t = ->(str) { _f.(str).gsub(/([0]+\z)/, '') }; _v = ->(str) { _f.(str).length.to_s }; _w = ->(str) { _t.(str).length.to_s }; __n = ->(str) { to_num.(str.include?('.') ? _n.(str).gsub(/([0]+\z)/, '').chomp('.') : _n.(str)) }; __i = ->(str) { to_num.(_i.(str)) }; __f = ->(str) { to_num.(_f.(str)) }; __t = ->(str) { to_num.(_t.(str)) }; __v = ->(str) { to_num.(_v.(str)) }; __w = ->(str) { to_num.(_w.(str)) }; num = input.to_s; n = __n.(num); i = __i.(num); v = __v.(num); w = __w.(num); f = __f.(num); t = __t.(num); (((i == 0) || (i == 1)) ? :one : :other) },:js_rule => "(function(input) { var runtime = (function(){return this.buildArgsFor=function(t){return[this.n(t),this.i(t),this.f(t),this.t(t),this.v(t),this.w(t)]},this.n=function(t){return this.toNum(t.indexOf(\".\")>-1?this._n(t).replace(/([0]+\\.$)/,\"\"):this._n(t))},this.i=function(t){return this.toNum(this._i(t))},this.f=function(t){return this.toNum(this._f(t))},this.t=function(t){return this.toNum(this._t(t))},this.v=function(t){return this.toNum(this._v(t))},this.w=function(t){return this.toNum(this._w(t))},this.toNum=function(t){return 0==t.length?0:t.indexOf(\".\")>-1?parseFloat(t):parseInt(t)},this._n=function(t){return/(-)?(.*)/.exec(t)[2]},this._i=function(t){return/([\\d]+)(\\..*)?/.exec(this._n(t))[1]},this._f=function(t){return/([\\d]+\\.?)(.*)/.exec(this._n(t))[2]},this._t=function(t){return this._f(t).replace(/([0]+$)/,\"\")},this._v=function(t){return this._f(t).length.toString()},this._w=function(t){return this._t(t).length.toString()},this}).call({}); var num = input.toString(); var n = runtime.n(num); var i = runtime.i(num); var v = runtime.v(num); var w = runtime.w(num); var f = runtime.f(num); var t = runtime.t(num); return (((i == 0) || (i == 1)) ? 'one' : 'other'); })"}}},
+ :id => {:i18n => {:plural => {:keys => [:other],:rule => ->(input) { to_num = ->(str) { str.include?('.') ? str.to_f : str.to_i }; _n = ->(str) { str.gsub(/(-)(.*)/, '\2') }; _i = ->(str) { _n.(str).gsub(/([\d]+)(..*)/, '\1') }; _f = ->(str) { _n.(str).gsub(/([\d]+\.?)(.*)/, '\2') }; _t = ->(str) { _f.(str).gsub(/([0]+\z)/, '') }; _v = ->(str) { _f.(str).length.to_s }; _w = ->(str) { _t.(str).length.to_s }; __n = ->(str) { to_num.(str.include?('.') ? _n.(str).gsub(/([0]+\z)/, '').chomp('.') : _n.(str)) }; __i = ->(str) { to_num.(_i.(str)) }; __f = ->(str) { to_num.(_f.(str)) }; __t = ->(str) { to_num.(_t.(str)) }; __v = ->(str) { to_num.(_v.(str)) }; __w = ->(str) { to_num.(_w.(str)) }; num = input.to_s; n = __n.(num); i = __i.(num); v = __v.(num); w = __w.(num); f = __f.(num); t = __t.(num); :other },:js_rule => "(function(input) { var runtime = (function(){return this.buildArgsFor=function(t){return[this.n(t),this.i(t),this.f(t),this.t(t),this.v(t),this.w(t)]},this.n=function(t){return this.toNum(t.indexOf(\".\")>-1?this._n(t).replace(/([0]+\\.$)/,\"\"):this._n(t))},this.i=function(t){return this.toNum(this._i(t))},this.f=function(t){return this.toNum(this._f(t))},this.t=function(t){return this.toNum(this._t(t))},this.v=function(t){return this.toNum(this._v(t))},this.w=function(t){return this.toNum(this._w(t))},this.toNum=function(t){return 0==t.length?0:t.indexOf(\".\")>-1?parseFloat(t):parseInt(t)},this._n=function(t){return/(-)?(.*)/.exec(t)[2]},this._i=function(t){return/([\\d]+)(\\..*)?/.exec(this._n(t))[1]},this._f=function(t){return/([\\d]+\\.?)(.*)/.exec(this._n(t))[2]},this._t=function(t){return this._f(t).replace(/([0]+$)/,\"\")},this._v=function(t){return this._f(t).length.toString()},this._w=function(t){return this._t(t).length.toString()},this}).call({}); var num = input.toString(); var n = runtime.n(num); var i = runtime.i(num); var v = runtime.v(num); var w = runtime.w(num); var f = runtime.f(num); var t = runtime.t(num); return 'other'; })"}}},
+ :is => {:i18n => {:plural => {:keys => [:one, :other],:rule => ->(input) { to_num = ->(str) { str.include?('.') ? str.to_f : str.to_i }; _n = ->(str) { str.gsub(/(-)(.*)/, '\2') }; _i = ->(str) { _n.(str).gsub(/([\d]+)(..*)/, '\1') }; _f = ->(str) { _n.(str).gsub(/([\d]+\.?)(.*)/, '\2') }; _t = ->(str) { _f.(str).gsub(/([0]+\z)/, '') }; _v = ->(str) { _f.(str).length.to_s }; _w = ->(str) { _t.(str).length.to_s }; __n = ->(str) { to_num.(str.include?('.') ? _n.(str).gsub(/([0]+\z)/, '').chomp('.') : _n.(str)) }; __i = ->(str) { to_num.(_i.(str)) }; __f = ->(str) { to_num.(_f.(str)) }; __t = ->(str) { to_num.(_t.(str)) }; __v = ->(str) { to_num.(_v.(str)) }; __w = ->(str) { to_num.(_w.(str)) }; num = input.to_s; n = __n.(num); i = __i.(num); v = __v.(num); w = __w.(num); f = __f.(num); t = __t.(num); ((((t == 0 && i % 10 == 1) && i % 100 != 11) || t != 0) ? :one : :other) },:js_rule => "(function(input) { var runtime = (function(){return this.buildArgsFor=function(t){return[this.n(t),this.i(t),this.f(t),this.t(t),this.v(t),this.w(t)]},this.n=function(t){return this.toNum(t.indexOf(\".\")>-1?this._n(t).replace(/([0]+\\.$)/,\"\"):this._n(t))},this.i=function(t){return this.toNum(this._i(t))},this.f=function(t){return this.toNum(this._f(t))},this.t=function(t){return this.toNum(this._t(t))},this.v=function(t){return this.toNum(this._v(t))},this.w=function(t){return this.toNum(this._w(t))},this.toNum=function(t){return 0==t.length?0:t.indexOf(\".\")>-1?parseFloat(t):parseInt(t)},this._n=function(t){return/(-)?(.*)/.exec(t)[2]},this._i=function(t){return/([\\d]+)(\\..*)?/.exec(this._n(t))[1]},this._f=function(t){return/([\\d]+\\.?)(.*)/.exec(this._n(t))[2]},this._t=function(t){return this._f(t).replace(/([0]+$)/,\"\")},this._v=function(t){return this._f(t).length.toString()},this._w=function(t){return this._t(t).length.toString()},this}).call({}); var num = input.toString(); var n = runtime.n(num); var i = runtime.i(num); var v = runtime.v(num); var w = runtime.w(num); var f = runtime.f(num); var t = runtime.t(num); return ((((t == 0 && i % 10 == 1) && i % 100 != 11) || t != 0) ? 'one' : 'other'); })"}}},
+ :it => {:i18n => {:plural => {:keys => [:one, :other],:rule => ->(input) { to_num = ->(str) { str.include?('.') ? str.to_f : str.to_i }; _n = ->(str) { str.gsub(/(-)(.*)/, '\2') }; _i = ->(str) { _n.(str).gsub(/([\d]+)(..*)/, '\1') }; _f = ->(str) { _n.(str).gsub(/([\d]+\.?)(.*)/, '\2') }; _t = ->(str) { _f.(str).gsub(/([0]+\z)/, '') }; _v = ->(str) { _f.(str).length.to_s }; _w = ->(str) { _t.(str).length.to_s }; __n = ->(str) { to_num.(str.include?('.') ? _n.(str).gsub(/([0]+\z)/, '').chomp('.') : _n.(str)) }; __i = ->(str) { to_num.(_i.(str)) }; __f = ->(str) { to_num.(_f.(str)) }; __t = ->(str) { to_num.(_t.(str)) }; __v = ->(str) { to_num.(_v.(str)) }; __w = ->(str) { to_num.(_w.(str)) }; num = input.to_s; n = __n.(num); i = __i.(num); v = __v.(num); w = __w.(num); f = __f.(num); t = __t.(num); ((i == 1 && v == 0) ? :one : :other) },:js_rule => "(function(input) { var runtime = (function(){return this.buildArgsFor=function(t){return[this.n(t),this.i(t),this.f(t),this.t(t),this.v(t),this.w(t)]},this.n=function(t){return this.toNum(t.indexOf(\".\")>-1?this._n(t).replace(/([0]+\\.$)/,\"\"):this._n(t))},this.i=function(t){return this.toNum(this._i(t))},this.f=function(t){return this.toNum(this._f(t))},this.t=function(t){return this.toNum(this._t(t))},this.v=function(t){return this.toNum(this._v(t))},this.w=function(t){return this.toNum(this._w(t))},this.toNum=function(t){return 0==t.length?0:t.indexOf(\".\")>-1?parseFloat(t):parseInt(t)},this._n=function(t){return/(-)?(.*)/.exec(t)[2]},this._i=function(t){return/([\\d]+)(\\..*)?/.exec(this._n(t))[1]},this._f=function(t){return/([\\d]+\\.?)(.*)/.exec(this._n(t))[2]},this._t=function(t){return this._f(t).replace(/([0]+$)/,\"\")},this._v=function(t){return this._f(t).length.toString()},this._w=function(t){return this._t(t).length.toString()},this}).call({}); var num = input.toString(); var n = runtime.n(num); var i = runtime.i(num); var v = runtime.v(num); var w = runtime.w(num); var f = runtime.f(num); var t = runtime.t(num); return ((i == 1 && v == 0) ? 'one' : 'other'); })"}}},
+ :ja => {:i18n => {:plural => {:keys => [:other],:rule => ->(input) { to_num = ->(str) { str.include?('.') ? str.to_f : str.to_i }; _n = ->(str) { str.gsub(/(-)(.*)/, '\2') }; _i = ->(str) { _n.(str).gsub(/([\d]+)(..*)/, '\1') }; _f = ->(str) { _n.(str).gsub(/([\d]+\.?)(.*)/, '\2') }; _t = ->(str) { _f.(str).gsub(/([0]+\z)/, '') }; _v = ->(str) { _f.(str).length.to_s }; _w = ->(str) { _t.(str).length.to_s }; __n = ->(str) { to_num.(str.include?('.') ? _n.(str).gsub(/([0]+\z)/, '').chomp('.') : _n.(str)) }; __i = ->(str) { to_num.(_i.(str)) }; __f = ->(str) { to_num.(_f.(str)) }; __t = ->(str) { to_num.(_t.(str)) }; __v = ->(str) { to_num.(_v.(str)) }; __w = ->(str) { to_num.(_w.(str)) }; num = input.to_s; n = __n.(num); i = __i.(num); v = __v.(num); w = __w.(num); f = __f.(num); t = __t.(num); :other },:js_rule => "(function(input) { var runtime = (function(){return this.buildArgsFor=function(t){return[this.n(t),this.i(t),this.f(t),this.t(t),this.v(t),this.w(t)]},this.n=function(t){return this.toNum(t.indexOf(\".\")>-1?this._n(t).replace(/([0]+\\.$)/,\"\"):this._n(t))},this.i=function(t){return this.toNum(this._i(t))},this.f=function(t){return this.toNum(this._f(t))},this.t=function(t){return this.toNum(this._t(t))},this.v=function(t){return this.toNum(this._v(t))},this.w=function(t){return this.toNum(this._w(t))},this.toNum=function(t){return 0==t.length?0:t.indexOf(\".\")>-1?parseFloat(t):parseInt(t)},this._n=function(t){return/(-)?(.*)/.exec(t)[2]},this._i=function(t){return/([\\d]+)(\\..*)?/.exec(this._n(t))[1]},this._f=function(t){return/([\\d]+\\.?)(.*)/.exec(this._n(t))[2]},this._t=function(t){return this._f(t).replace(/([0]+$)/,\"\")},this._v=function(t){return this._f(t).length.toString()},this._w=function(t){return this._t(t).length.toString()},this}).call({}); var num = input.toString(); var n = runtime.n(num); var i = runtime.i(num); var v = runtime.v(num); var w = runtime.w(num); var f = runtime.f(num); var t = runtime.t(num); return 'other'; })"}}},
+ :ka => {:i18n => {:plural => {:keys => [:one, :other],:rule => ->(input) { to_num = ->(str) { str.include?('.') ? str.to_f : str.to_i }; _n = ->(str) { str.gsub(/(-)(.*)/, '\2') }; _i = ->(str) { _n.(str).gsub(/([\d]+)(..*)/, '\1') }; _f = ->(str) { _n.(str).gsub(/([\d]+\.?)(.*)/, '\2') }; _t = ->(str) { _f.(str).gsub(/([0]+\z)/, '') }; _v = ->(str) { _f.(str).length.to_s }; _w = ->(str) { _t.(str).length.to_s }; __n = ->(str) { to_num.(str.include?('.') ? _n.(str).gsub(/([0]+\z)/, '').chomp('.') : _n.(str)) }; __i = ->(str) { to_num.(_i.(str)) }; __f = ->(str) { to_num.(_f.(str)) }; __t = ->(str) { to_num.(_t.(str)) }; __v = ->(str) { to_num.(_v.(str)) }; __w = ->(str) { to_num.(_w.(str)) }; num = input.to_s; n = __n.(num); i = __i.(num); v = __v.(num); w = __w.(num); f = __f.(num); t = __t.(num); (n == 1 ? :one : :other) },:js_rule => "(function(input) { var runtime = (function(){return this.buildArgsFor=function(t){return[this.n(t),this.i(t),this.f(t),this.t(t),this.v(t),this.w(t)]},this.n=function(t){return this.toNum(t.indexOf(\".\")>-1?this._n(t).replace(/([0]+\\.$)/,\"\"):this._n(t))},this.i=function(t){return this.toNum(this._i(t))},this.f=function(t){return this.toNum(this._f(t))},this.t=function(t){return this.toNum(this._t(t))},this.v=function(t){return this.toNum(this._v(t))},this.w=function(t){return this.toNum(this._w(t))},this.toNum=function(t){return 0==t.length?0:t.indexOf(\".\")>-1?parseFloat(t):parseInt(t)},this._n=function(t){return/(-)?(.*)/.exec(t)[2]},this._i=function(t){return/([\\d]+)(\\..*)?/.exec(this._n(t))[1]},this._f=function(t){return/([\\d]+\\.?)(.*)/.exec(this._n(t))[2]},this._t=function(t){return this._f(t).replace(/([0]+$)/,\"\")},this._v=function(t){return this._f(t).length.toString()},this._w=function(t){return this._t(t).length.toString()},this}).call({}); var num = input.toString(); var n = runtime.n(num); var i = runtime.i(num); var v = runtime.v(num); var w = runtime.w(num); var f = runtime.f(num); var t = runtime.t(num); return (n == 1 ? 'one' : 'other'); })"}}},
+ :ko => {:i18n => {:plural => {:keys => [:other],:rule => ->(input) { to_num = ->(str) { str.include?('.') ? str.to_f : str.to_i }; _n = ->(str) { str.gsub(/(-)(.*)/, '\2') }; _i = ->(str) { _n.(str).gsub(/([\d]+)(..*)/, '\1') }; _f = ->(str) { _n.(str).gsub(/([\d]+\.?)(.*)/, '\2') }; _t = ->(str) { _f.(str).gsub(/([0]+\z)/, '') }; _v = ->(str) { _f.(str).length.to_s }; _w = ->(str) { _t.(str).length.to_s }; __n = ->(str) { to_num.(str.include?('.') ? _n.(str).gsub(/([0]+\z)/, '').chomp('.') : _n.(str)) }; __i = ->(str) { to_num.(_i.(str)) }; __f = ->(str) { to_num.(_f.(str)) }; __t = ->(str) { to_num.(_t.(str)) }; __v = ->(str) { to_num.(_v.(str)) }; __w = ->(str) { to_num.(_w.(str)) }; num = input.to_s; n = __n.(num); i = __i.(num); v = __v.(num); w = __w.(num); f = __f.(num); t = __t.(num); :other },:js_rule => "(function(input) { var runtime = (function(){return this.buildArgsFor=function(t){return[this.n(t),this.i(t),this.f(t),this.t(t),this.v(t),this.w(t)]},this.n=function(t){return this.toNum(t.indexOf(\".\")>-1?this._n(t).replace(/([0]+\\.$)/,\"\"):this._n(t))},this.i=function(t){return this.toNum(this._i(t))},this.f=function(t){return this.toNum(this._f(t))},this.t=function(t){return this.toNum(this._t(t))},this.v=function(t){return this.toNum(this._v(t))},this.w=function(t){return this.toNum(this._w(t))},this.toNum=function(t){return 0==t.length?0:t.indexOf(\".\")>-1?parseFloat(t):parseInt(t)},this._n=function(t){return/(-)?(.*)/.exec(t)[2]},this._i=function(t){return/([\\d]+)(\\..*)?/.exec(this._n(t))[1]},this._f=function(t){return/([\\d]+\\.?)(.*)/.exec(this._n(t))[2]},this._t=function(t){return this._f(t).replace(/([0]+$)/,\"\")},this._v=function(t){return this._f(t).length.toString()},this._w=function(t){return this._t(t).length.toString()},this}).call({}); var num = input.toString(); var n = runtime.n(num); var i = runtime.i(num); var v = runtime.v(num); var w = runtime.w(num); var f = runtime.f(num); var t = runtime.t(num); return 'other'; })"}}},
+ :lt => {:i18n => {:plural => {:keys => [:one, :few, :many, :other],:rule => ->(input) { to_num = ->(str) { str.include?('.') ? str.to_f : str.to_i }; _n = ->(str) { str.gsub(/(-)(.*)/, '\2') }; _i = ->(str) { _n.(str).gsub(/([\d]+)(..*)/, '\1') }; _f = ->(str) { _n.(str).gsub(/([\d]+\.?)(.*)/, '\2') }; _t = ->(str) { _f.(str).gsub(/([0]+\z)/, '') }; _v = ->(str) { _f.(str).length.to_s }; _w = ->(str) { _t.(str).length.to_s }; __n = ->(str) { to_num.(str.include?('.') ? _n.(str).gsub(/([0]+\z)/, '').chomp('.') : _n.(str)) }; __i = ->(str) { to_num.(_i.(str)) }; __f = ->(str) { to_num.(_f.(str)) }; __t = ->(str) { to_num.(_t.(str)) }; __v = ->(str) { to_num.(_v.(str)) }; __w = ->(str) { to_num.(_w.(str)) }; num = input.to_s; n = __n.(num); i = __i.(num); v = __v.(num); w = __w.(num); f = __f.(num); t = __t.(num); ((n % 10 == 1 && !(11..19).include?(n % 100)) ? :one : (((2..9).include?(n % 10) && !(11..19).include?(n % 100)) ? :few : (f != 0 ? :many : :other))) },:js_rule => "(function(input) { var runtime = (function(){return this.buildArgsFor=function(t){return[this.n(t),this.i(t),this.f(t),this.t(t),this.v(t),this.w(t)]},this.n=function(t){return this.toNum(t.indexOf(\".\")>-1?this._n(t).replace(/([0]+\\.$)/,\"\"):this._n(t))},this.i=function(t){return this.toNum(this._i(t))},this.f=function(t){return this.toNum(this._f(t))},this.t=function(t){return this.toNum(this._t(t))},this.v=function(t){return this.toNum(this._v(t))},this.w=function(t){return this.toNum(this._w(t))},this.toNum=function(t){return 0==t.length?0:t.indexOf(\".\")>-1?parseFloat(t):parseInt(t)},this._n=function(t){return/(-)?(.*)/.exec(t)[2]},this._i=function(t){return/([\\d]+)(\\..*)?/.exec(this._n(t))[1]},this._f=function(t){return/([\\d]+\\.?)(.*)/.exec(this._n(t))[2]},this._t=function(t){return this._f(t).replace(/([0]+$)/,\"\")},this._v=function(t){return this._f(t).length.toString()},this._w=function(t){return this._t(t).length.toString()},this}).call({}); var num = input.toString(); var n = runtime.n(num); var i = runtime.i(num); var v = runtime.v(num); var w = runtime.w(num); var f = runtime.f(num); var t = runtime.t(num); return ((n % 10 == 1 && !((n % 100 >= 11) && (n % 100 <= 19))) ? 'one' : ((((n % 10 >= 2) && (n % 10 <= 9)) && !((n % 100 >= 11) && (n % 100 <= 19))) ? 'few' : (f != 0 ? 'many' : 'other'))); })"}}},
+ :mk => {:i18n => {:plural => {:keys => [:one, :other],:rule => ->(input) { to_num = ->(str) { str.include?('.') ? str.to_f : str.to_i }; _n = ->(str) { str.gsub(/(-)(.*)/, '\2') }; _i = ->(str) { _n.(str).gsub(/([\d]+)(..*)/, '\1') }; _f = ->(str) { _n.(str).gsub(/([\d]+\.?)(.*)/, '\2') }; _t = ->(str) { _f.(str).gsub(/([0]+\z)/, '') }; _v = ->(str) { _f.(str).length.to_s }; _w = ->(str) { _t.(str).length.to_s }; __n = ->(str) { to_num.(str.include?('.') ? _n.(str).gsub(/([0]+\z)/, '').chomp('.') : _n.(str)) }; __i = ->(str) { to_num.(_i.(str)) }; __f = ->(str) { to_num.(_f.(str)) }; __t = ->(str) { to_num.(_t.(str)) }; __v = ->(str) { to_num.(_v.(str)) }; __w = ->(str) { to_num.(_w.(str)) }; num = input.to_s; n = __n.(num); i = __i.(num); v = __v.(num); w = __w.(num); f = __f.(num); t = __t.(num); (((v == 0 && i % 10 == 1) || f % 10 == 1) ? :one : :other) },:js_rule => "(function(input) { var runtime = (function(){return this.buildArgsFor=function(t){return[this.n(t),this.i(t),this.f(t),this.t(t),this.v(t),this.w(t)]},this.n=function(t){return this.toNum(t.indexOf(\".\")>-1?this._n(t).replace(/([0]+\\.$)/,\"\"):this._n(t))},this.i=function(t){return this.toNum(this._i(t))},this.f=function(t){return this.toNum(this._f(t))},this.t=function(t){return this.toNum(this._t(t))},this.v=function(t){return this.toNum(this._v(t))},this.w=function(t){return this.toNum(this._w(t))},this.toNum=function(t){return 0==t.length?0:t.indexOf(\".\")>-1?parseFloat(t):parseInt(t)},this._n=function(t){return/(-)?(.*)/.exec(t)[2]},this._i=function(t){return/([\\d]+)(\\..*)?/.exec(this._n(t))[1]},this._f=function(t){return/([\\d]+\\.?)(.*)/.exec(this._n(t))[2]},this._t=function(t){return this._f(t).replace(/([0]+$)/,\"\")},this._v=function(t){return this._f(t).length.toString()},this._w=function(t){return this._t(t).length.toString()},this}).call({}); var num = input.toString(); var n = runtime.n(num); var i = runtime.i(num); var v = runtime.v(num); var w = runtime.w(num); var f = runtime.f(num); var t = runtime.t(num); return (((v == 0 && i % 10 == 1) || f % 10 == 1) ? 'one' : 'other'); })"}}},
+ :ml => {:i18n => {:plural => {:keys => [:one, :other],:rule => ->(input) { to_num = ->(str) { str.include?('.') ? str.to_f : str.to_i }; _n = ->(str) { str.gsub(/(-)(.*)/, '\2') }; _i = ->(str) { _n.(str).gsub(/([\d]+)(..*)/, '\1') }; _f = ->(str) { _n.(str).gsub(/([\d]+\.?)(.*)/, '\2') }; _t = ->(str) { _f.(str).gsub(/([0]+\z)/, '') }; _v = ->(str) { _f.(str).length.to_s }; _w = ->(str) { _t.(str).length.to_s }; __n = ->(str) { to_num.(str.include?('.') ? _n.(str).gsub(/([0]+\z)/, '').chomp('.') : _n.(str)) }; __i = ->(str) { to_num.(_i.(str)) }; __f = ->(str) { to_num.(_f.(str)) }; __t = ->(str) { to_num.(_t.(str)) }; __v = ->(str) { to_num.(_v.(str)) }; __w = ->(str) { to_num.(_w.(str)) }; num = input.to_s; n = __n.(num); i = __i.(num); v = __v.(num); w = __w.(num); f = __f.(num); t = __t.(num); (n == 1 ? :one : :other) },:js_rule => "(function(input) { var runtime = (function(){return this.buildArgsFor=function(t){return[this.n(t),this.i(t),this.f(t),this.t(t),this.v(t),this.w(t)]},this.n=function(t){return this.toNum(t.indexOf(\".\")>-1?this._n(t).replace(/([0]+\\.$)/,\"\"):this._n(t))},this.i=function(t){return this.toNum(this._i(t))},this.f=function(t){return this.toNum(this._f(t))},this.t=function(t){return this.toNum(this._t(t))},this.v=function(t){return this.toNum(this._v(t))},this.w=function(t){return this.toNum(this._w(t))},this.toNum=function(t){return 0==t.length?0:t.indexOf(\".\")>-1?parseFloat(t):parseInt(t)},this._n=function(t){return/(-)?(.*)/.exec(t)[2]},this._i=function(t){return/([\\d]+)(\\..*)?/.exec(this._n(t))[1]},this._f=function(t){return/([\\d]+\\.?)(.*)/.exec(this._n(t))[2]},this._t=function(t){return this._f(t).replace(/([0]+$)/,\"\")},this._v=function(t){return this._f(t).length.toString()},this._w=function(t){return this._t(t).length.toString()},this}).call({}); var num = input.toString(); var n = runtime.n(num); var i = runtime.i(num); var v = runtime.v(num); var w = runtime.w(num); var f = runtime.f(num); var t = runtime.t(num); return (n == 1 ? 'one' : 'other'); })"}}},
+ :ms => {:i18n => {:plural => {:keys => [:other],:rule => ->(input) { to_num = ->(str) { str.include?('.') ? str.to_f : str.to_i }; _n = ->(str) { str.gsub(/(-)(.*)/, '\2') }; _i = ->(str) { _n.(str).gsub(/([\d]+)(..*)/, '\1') }; _f = ->(str) { _n.(str).gsub(/([\d]+\.?)(.*)/, '\2') }; _t = ->(str) { _f.(str).gsub(/([0]+\z)/, '') }; _v = ->(str) { _f.(str).length.to_s }; _w = ->(str) { _t.(str).length.to_s }; __n = ->(str) { to_num.(str.include?('.') ? _n.(str).gsub(/([0]+\z)/, '').chomp('.') : _n.(str)) }; __i = ->(str) { to_num.(_i.(str)) }; __f = ->(str) { to_num.(_f.(str)) }; __t = ->(str) { to_num.(_t.(str)) }; __v = ->(str) { to_num.(_v.(str)) }; __w = ->(str) { to_num.(_w.(str)) }; num = input.to_s; n = __n.(num); i = __i.(num); v = __v.(num); w = __w.(num); f = __f.(num); t = __t.(num); :other },:js_rule => "(function(input) { var runtime = (function(){return this.buildArgsFor=function(t){return[this.n(t),this.i(t),this.f(t),this.t(t),this.v(t),this.w(t)]},this.n=function(t){return this.toNum(t.indexOf(\".\")>-1?this._n(t).replace(/([0]+\\.$)/,\"\"):this._n(t))},this.i=function(t){return this.toNum(this._i(t))},this.f=function(t){return this.toNum(this._f(t))},this.t=function(t){return this.toNum(this._t(t))},this.v=function(t){return this.toNum(this._v(t))},this.w=function(t){return this.toNum(this._w(t))},this.toNum=function(t){return 0==t.length?0:t.indexOf(\".\")>-1?parseFloat(t):parseInt(t)},this._n=function(t){return/(-)?(.*)/.exec(t)[2]},this._i=function(t){return/([\\d]+)(\\..*)?/.exec(this._n(t))[1]},this._f=function(t){return/([\\d]+\\.?)(.*)/.exec(this._n(t))[2]},this._t=function(t){return this._f(t).replace(/([0]+$)/,\"\")},this._v=function(t){return this._f(t).length.toString()},this._w=function(t){return this._t(t).length.toString()},this}).call({}); var num = input.toString(); var n = runtime.n(num); var i = runtime.i(num); var v = runtime.v(num); var w = runtime.w(num); var f = runtime.f(num); var t = runtime.t(num); return 'other'; })"}}},
+ :nb => {:i18n => {:plural => {:keys => [:one, :other],:rule => ->(input) { to_num = ->(str) { str.include?('.') ? str.to_f : str.to_i }; _n = ->(str) { str.gsub(/(-)(.*)/, '\2') }; _i = ->(str) { _n.(str).gsub(/([\d]+)(..*)/, '\1') }; _f = ->(str) { _n.(str).gsub(/([\d]+\.?)(.*)/, '\2') }; _t = ->(str) { _f.(str).gsub(/([0]+\z)/, '') }; _v = ->(str) { _f.(str).length.to_s }; _w = ->(str) { _t.(str).length.to_s }; __n = ->(str) { to_num.(str.include?('.') ? _n.(str).gsub(/([0]+\z)/, '').chomp('.') : _n.(str)) }; __i = ->(str) { to_num.(_i.(str)) }; __f = ->(str) { to_num.(_f.(str)) }; __t = ->(str) { to_num.(_t.(str)) }; __v = ->(str) { to_num.(_v.(str)) }; __w = ->(str) { to_num.(_w.(str)) }; num = input.to_s; n = __n.(num); i = __i.(num); v = __v.(num); w = __w.(num); f = __f.(num); t = __t.(num); (n == 1 ? :one : :other) },:js_rule => "(function(input) { var runtime = (function(){return this.buildArgsFor=function(t){return[this.n(t),this.i(t),this.f(t),this.t(t),this.v(t),this.w(t)]},this.n=function(t){return this.toNum(t.indexOf(\".\")>-1?this._n(t).replace(/([0]+\\.$)/,\"\"):this._n(t))},this.i=function(t){return this.toNum(this._i(t))},this.f=function(t){return this.toNum(this._f(t))},this.t=function(t){return this.toNum(this._t(t))},this.v=function(t){return this.toNum(this._v(t))},this.w=function(t){return this.toNum(this._w(t))},this.toNum=function(t){return 0==t.length?0:t.indexOf(\".\")>-1?parseFloat(t):parseInt(t)},this._n=function(t){return/(-)?(.*)/.exec(t)[2]},this._i=function(t){return/([\\d]+)(\\..*)?/.exec(this._n(t))[1]},this._f=function(t){return/([\\d]+\\.?)(.*)/.exec(this._n(t))[2]},this._t=function(t){return this._f(t).replace(/([0]+$)/,\"\")},this._v=function(t){return this._f(t).length.toString()},this._w=function(t){return this._t(t).length.toString()},this}).call({}); var num = input.toString(); var n = runtime.n(num); var i = runtime.i(num); var v = runtime.v(num); var w = runtime.w(num); var f = runtime.f(num); var t = runtime.t(num); return (n == 1 ? 'one' : 'other'); })"}}},
+ :nl => {:i18n => {:plural => {:keys => [:one, :other],:rule => ->(input) { to_num = ->(str) { str.include?('.') ? str.to_f : str.to_i }; _n = ->(str) { str.gsub(/(-)(.*)/, '\2') }; _i = ->(str) { _n.(str).gsub(/([\d]+)(..*)/, '\1') }; _f = ->(str) { _n.(str).gsub(/([\d]+\.?)(.*)/, '\2') }; _t = ->(str) { _f.(str).gsub(/([0]+\z)/, '') }; _v = ->(str) { _f.(str).length.to_s }; _w = ->(str) { _t.(str).length.to_s }; __n = ->(str) { to_num.(str.include?('.') ? _n.(str).gsub(/([0]+\z)/, '').chomp('.') : _n.(str)) }; __i = ->(str) { to_num.(_i.(str)) }; __f = ->(str) { to_num.(_f.(str)) }; __t = ->(str) { to_num.(_t.(str)) }; __v = ->(str) { to_num.(_v.(str)) }; __w = ->(str) { to_num.(_w.(str)) }; num = input.to_s; n = __n.(num); i = __i.(num); v = __v.(num); w = __w.(num); f = __f.(num); t = __t.(num); ((i == 1 && v == 0) ? :one : :other) },:js_rule => "(function(input) { var runtime = (function(){return this.buildArgsFor=function(t){return[this.n(t),this.i(t),this.f(t),this.t(t),this.v(t),this.w(t)]},this.n=function(t){return this.toNum(t.indexOf(\".\")>-1?this._n(t).replace(/([0]+\\.$)/,\"\"):this._n(t))},this.i=function(t){return this.toNum(this._i(t))},this.f=function(t){return this.toNum(this._f(t))},this.t=function(t){return this.toNum(this._t(t))},this.v=function(t){return this.toNum(this._v(t))},this.w=function(t){return this.toNum(this._w(t))},this.toNum=function(t){return 0==t.length?0:t.indexOf(\".\")>-1?parseFloat(t):parseInt(t)},this._n=function(t){return/(-)?(.*)/.exec(t)[2]},this._i=function(t){return/([\\d]+)(\\..*)?/.exec(this._n(t))[1]},this._f=function(t){return/([\\d]+\\.?)(.*)/.exec(this._n(t))[2]},this._t=function(t){return this._f(t).replace(/([0]+$)/,\"\")},this._v=function(t){return this._f(t).length.toString()},this._w=function(t){return this._t(t).length.toString()},this}).call({}); var num = input.toString(); var n = runtime.n(num); var i = runtime.i(num); var v = runtime.v(num); var w = runtime.w(num); var f = runtime.f(num); var t = runtime.t(num); return ((i == 1 && v == 0) ? 'one' : 'other'); })"}}},
+ :nn => {:i18n => {:plural => {:keys => [:one, :other],:rule => ->(input) { to_num = ->(str) { str.include?('.') ? str.to_f : str.to_i }; _n = ->(str) { str.gsub(/(-)(.*)/, '\2') }; _i = ->(str) { _n.(str).gsub(/([\d]+)(..*)/, '\1') }; _f = ->(str) { _n.(str).gsub(/([\d]+\.?)(.*)/, '\2') }; _t = ->(str) { _f.(str).gsub(/([0]+\z)/, '') }; _v = ->(str) { _f.(str).length.to_s }; _w = ->(str) { _t.(str).length.to_s }; __n = ->(str) { to_num.(str.include?('.') ? _n.(str).gsub(/([0]+\z)/, '').chomp('.') : _n.(str)) }; __i = ->(str) { to_num.(_i.(str)) }; __f = ->(str) { to_num.(_f.(str)) }; __t = ->(str) { to_num.(_t.(str)) }; __v = ->(str) { to_num.(_v.(str)) }; __w = ->(str) { to_num.(_w.(str)) }; num = input.to_s; n = __n.(num); i = __i.(num); v = __v.(num); w = __w.(num); f = __f.(num); t = __t.(num); (n == 1 ? :one : :other) },:js_rule => "(function(input) { var runtime = (function(){return this.buildArgsFor=function(t){return[this.n(t),this.i(t),this.f(t),this.t(t),this.v(t),this.w(t)]},this.n=function(t){return this.toNum(t.indexOf(\".\")>-1?this._n(t).replace(/([0]+\\.$)/,\"\"):this._n(t))},this.i=function(t){return this.toNum(this._i(t))},this.f=function(t){return this.toNum(this._f(t))},this.t=function(t){return this.toNum(this._t(t))},this.v=function(t){return this.toNum(this._v(t))},this.w=function(t){return this.toNum(this._w(t))},this.toNum=function(t){return 0==t.length?0:t.indexOf(\".\")>-1?parseFloat(t):parseInt(t)},this._n=function(t){return/(-)?(.*)/.exec(t)[2]},this._i=function(t){return/([\\d]+)(\\..*)?/.exec(this._n(t))[1]},this._f=function(t){return/([\\d]+\\.?)(.*)/.exec(this._n(t))[2]},this._t=function(t){return this._f(t).replace(/([0]+$)/,\"\")},this._v=function(t){return this._f(t).length.toString()},this._w=function(t){return this._t(t).length.toString()},this}).call({}); var num = input.toString(); var n = runtime.n(num); var i = runtime.i(num); var v = runtime.v(num); var w = runtime.w(num); var f = runtime.f(num); var t = runtime.t(num); return (n == 1 ? 'one' : 'other'); })"}}},
+ :pa => {:i18n => {:plural => {:keys => [:one, :other],:rule => ->(input) { to_num = ->(str) { str.include?('.') ? str.to_f : str.to_i }; _n = ->(str) { str.gsub(/(-)(.*)/, '\2') }; _i = ->(str) { _n.(str).gsub(/([\d]+)(..*)/, '\1') }; _f = ->(str) { _n.(str).gsub(/([\d]+\.?)(.*)/, '\2') }; _t = ->(str) { _f.(str).gsub(/([0]+\z)/, '') }; _v = ->(str) { _f.(str).length.to_s }; _w = ->(str) { _t.(str).length.to_s }; __n = ->(str) { to_num.(str.include?('.') ? _n.(str).gsub(/([0]+\z)/, '').chomp('.') : _n.(str)) }; __i = ->(str) { to_num.(_i.(str)) }; __f = ->(str) { to_num.(_f.(str)) }; __t = ->(str) { to_num.(_t.(str)) }; __v = ->(str) { to_num.(_v.(str)) }; __w = ->(str) { to_num.(_w.(str)) }; num = input.to_s; n = __n.(num); i = __i.(num); v = __v.(num); w = __w.(num); f = __f.(num); t = __t.(num); ((0..1).include?(n) ? :one : :other) },:js_rule => "(function(input) { var runtime = (function(){return this.buildArgsFor=function(t){return[this.n(t),this.i(t),this.f(t),this.t(t),this.v(t),this.w(t)]},this.n=function(t){return this.toNum(t.indexOf(\".\")>-1?this._n(t).replace(/([0]+\\.$)/,\"\"):this._n(t))},this.i=function(t){return this.toNum(this._i(t))},this.f=function(t){return this.toNum(this._f(t))},this.t=function(t){return this.toNum(this._t(t))},this.v=function(t){return this.toNum(this._v(t))},this.w=function(t){return this.toNum(this._w(t))},this.toNum=function(t){return 0==t.length?0:t.indexOf(\".\")>-1?parseFloat(t):parseInt(t)},this._n=function(t){return/(-)?(.*)/.exec(t)[2]},this._i=function(t){return/([\\d]+)(\\..*)?/.exec(this._n(t))[1]},this._f=function(t){return/([\\d]+\\.?)(.*)/.exec(this._n(t))[2]},this._t=function(t){return this._f(t).replace(/([0]+$)/,\"\")},this._v=function(t){return this._f(t).length.toString()},this._w=function(t){return this._t(t).length.toString()},this}).call({}); var num = input.toString(); var n = runtime.n(num); var i = runtime.i(num); var v = runtime.v(num); var w = runtime.w(num); var f = runtime.f(num); var t = runtime.t(num); return (((n >= 0) && (n <= 1)) ? 'one' : 'other'); })"}}},
+ :pl => {:i18n => {:plural => {:keys => [:one, :few, :many, :other],:rule => ->(input) { to_num = ->(str) { str.include?('.') ? str.to_f : str.to_i }; _n = ->(str) { str.gsub(/(-)(.*)/, '\2') }; _i = ->(str) { _n.(str).gsub(/([\d]+)(..*)/, '\1') }; _f = ->(str) { _n.(str).gsub(/([\d]+\.?)(.*)/, '\2') }; _t = ->(str) { _f.(str).gsub(/([0]+\z)/, '') }; _v = ->(str) { _f.(str).length.to_s }; _w = ->(str) { _t.(str).length.to_s }; __n = ->(str) { to_num.(str.include?('.') ? _n.(str).gsub(/([0]+\z)/, '').chomp('.') : _n.(str)) }; __i = ->(str) { to_num.(_i.(str)) }; __f = ->(str) { to_num.(_f.(str)) }; __t = ->(str) { to_num.(_t.(str)) }; __v = ->(str) { to_num.(_v.(str)) }; __w = ->(str) { to_num.(_w.(str)) }; num = input.to_s; n = __n.(num); i = __i.(num); v = __v.(num); w = __w.(num); f = __f.(num); t = __t.(num); ((i == 1 && v == 0) ? :one : (((v == 0 && (2..4).include?(i % 10)) && !(12..14).include?(i % 100)) ? :few : (((((v == 0 && i != 1) && (0..1).include?(i % 10)) || (v == 0 && (5..9).include?(i % 10))) || (v == 0 && (12..14).include?(i % 100))) ? :many : :other))) },:js_rule => "(function(input) { var runtime = (function(){return this.buildArgsFor=function(t){return[this.n(t),this.i(t),this.f(t),this.t(t),this.v(t),this.w(t)]},this.n=function(t){return this.toNum(t.indexOf(\".\")>-1?this._n(t).replace(/([0]+\\.$)/,\"\"):this._n(t))},this.i=function(t){return this.toNum(this._i(t))},this.f=function(t){return this.toNum(this._f(t))},this.t=function(t){return this.toNum(this._t(t))},this.v=function(t){return this.toNum(this._v(t))},this.w=function(t){return this.toNum(this._w(t))},this.toNum=function(t){return 0==t.length?0:t.indexOf(\".\")>-1?parseFloat(t):parseInt(t)},this._n=function(t){return/(-)?(.*)/.exec(t)[2]},this._i=function(t){return/([\\d]+)(\\..*)?/.exec(this._n(t))[1]},this._f=function(t){return/([\\d]+\\.?)(.*)/.exec(this._n(t))[2]},this._t=function(t){return this._f(t).replace(/([0]+$)/,\"\")},this._v=function(t){return this._f(t).length.toString()},this._w=function(t){return this._t(t).length.toString()},this}).call({}); var num = input.toString(); var n = runtime.n(num); var i = runtime.i(num); var v = runtime.v(num); var w = runtime.w(num); var f = runtime.f(num); var t = runtime.t(num); return ((i == 1 && v == 0) ? 'one' : (((v == 0 && ((i % 10 >= 2) && (i % 10 <= 4))) && !((i % 100 >= 12) && (i % 100 <= 14))) ? 'few' : (((((v == 0 && i != 1) && ((i % 10 >= 0) && (i % 10 <= 1))) || (v == 0 && ((i % 10 >= 5) && (i % 10 <= 9)))) || (v == 0 && ((i % 100 >= 12) && (i % 100 <= 14)))) ? 'many' : 'other'))); })"}}},
+ :pt => {:i18n => {:plural => {:keys => [:one, :other],:rule => ->(input) { to_num = ->(str) { str.include?('.') ? str.to_f : str.to_i }; _n = ->(str) { str.gsub(/(-)(.*)/, '\2') }; _i = ->(str) { _n.(str).gsub(/([\d]+)(..*)/, '\1') }; _f = ->(str) { _n.(str).gsub(/([\d]+\.?)(.*)/, '\2') }; _t = ->(str) { _f.(str).gsub(/([0]+\z)/, '') }; _v = ->(str) { _f.(str).length.to_s }; _w = ->(str) { _t.(str).length.to_s }; __n = ->(str) { to_num.(str.include?('.') ? _n.(str).gsub(/([0]+\z)/, '').chomp('.') : _n.(str)) }; __i = ->(str) { to_num.(_i.(str)) }; __f = ->(str) { to_num.(_f.(str)) }; __t = ->(str) { to_num.(_t.(str)) }; __v = ->(str) { to_num.(_v.(str)) }; __w = ->(str) { to_num.(_w.(str)) }; num = input.to_s; n = __n.(num); i = __i.(num); v = __v.(num); w = __w.(num); f = __f.(num); t = __t.(num); (((0..2).include?(n) && n != 2) ? :one : :other) },:js_rule => "(function(input) { var runtime = (function(){return this.buildArgsFor=function(t){return[this.n(t),this.i(t),this.f(t),this.t(t),this.v(t),this.w(t)]},this.n=function(t){return this.toNum(t.indexOf(\".\")>-1?this._n(t).replace(/([0]+\\.$)/,\"\"):this._n(t))},this.i=function(t){return this.toNum(this._i(t))},this.f=function(t){return this.toNum(this._f(t))},this.t=function(t){return this.toNum(this._t(t))},this.v=function(t){return this.toNum(this._v(t))},this.w=function(t){return this.toNum(this._w(t))},this.toNum=function(t){return 0==t.length?0:t.indexOf(\".\")>-1?parseFloat(t):parseInt(t)},this._n=function(t){return/(-)?(.*)/.exec(t)[2]},this._i=function(t){return/([\\d]+)(\\..*)?/.exec(this._n(t))[1]},this._f=function(t){return/([\\d]+\\.?)(.*)/.exec(this._n(t))[2]},this._t=function(t){return this._f(t).replace(/([0]+$)/,\"\")},this._v=function(t){return this._f(t).length.toString()},this._w=function(t){return this._t(t).length.toString()},this}).call({}); var num = input.toString(); var n = runtime.n(num); var i = runtime.i(num); var v = runtime.v(num); var w = runtime.w(num); var f = runtime.f(num); var t = runtime.t(num); return ((((n >= 0) && (n <= 2)) && n != 2) ? 'one' : 'other'); })"}}},
+ :"pt-PT" => {:i18n => {:plural => {:keys => [:one, :other],:rule => ->(input) { to_num = ->(str) { str.include?('.') ? str.to_f : str.to_i }; _n = ->(str) { str.gsub(/(-)(.*)/, '\2') }; _i = ->(str) { _n.(str).gsub(/([\d]+)(..*)/, '\1') }; _f = ->(str) { _n.(str).gsub(/([\d]+\.?)(.*)/, '\2') }; _t = ->(str) { _f.(str).gsub(/([0]+\z)/, '') }; _v = ->(str) { _f.(str).length.to_s }; _w = ->(str) { _t.(str).length.to_s }; __n = ->(str) { to_num.(str.include?('.') ? _n.(str).gsub(/([0]+\z)/, '').chomp('.') : _n.(str)) }; __i = ->(str) { to_num.(_i.(str)) }; __f = ->(str) { to_num.(_f.(str)) }; __t = ->(str) { to_num.(_t.(str)) }; __v = ->(str) { to_num.(_v.(str)) }; __w = ->(str) { to_num.(_w.(str)) }; num = input.to_s; n = __n.(num); i = __i.(num); v = __v.(num); w = __w.(num); f = __f.(num); t = __t.(num); ((n == 1 && v == 0) ? :one : :other) },:js_rule => "(function(input) { var runtime = (function(){return this.buildArgsFor=function(t){return[this.n(t),this.i(t),this.f(t),this.t(t),this.v(t),this.w(t)]},this.n=function(t){return this.toNum(t.indexOf(\".\")>-1?this._n(t).replace(/([0]+\\.$)/,\"\"):this._n(t))},this.i=function(t){return this.toNum(this._i(t))},this.f=function(t){return this.toNum(this._f(t))},this.t=function(t){return this.toNum(this._t(t))},this.v=function(t){return this.toNum(this._v(t))},this.w=function(t){return this.toNum(this._w(t))},this.toNum=function(t){return 0==t.length?0:t.indexOf(\".\")>-1?parseFloat(t):parseInt(t)},this._n=function(t){return/(-)?(.*)/.exec(t)[2]},this._i=function(t){return/([\\d]+)(\\..*)?/.exec(this._n(t))[1]},this._f=function(t){return/([\\d]+\\.?)(.*)/.exec(this._n(t))[2]},this._t=function(t){return this._f(t).replace(/([0]+$)/,\"\")},this._v=function(t){return this._f(t).length.toString()},this._w=function(t){return this._t(t).length.toString()},this}).call({}); var num = input.toString(); var n = runtime.n(num); var i = runtime.i(num); var v = runtime.v(num); var w = runtime.w(num); var f = runtime.f(num); var t = runtime.t(num); return ((n == 1 && v == 0) ? 'one' : 'other'); })"}}},
+ :ro => {:i18n => {:plural => {:keys => [:one, :few, :other],:rule => ->(input) { to_num = ->(str) { str.include?('.') ? str.to_f : str.to_i }; _n = ->(str) { str.gsub(/(-)(.*)/, '\2') }; _i = ->(str) { _n.(str).gsub(/([\d]+)(..*)/, '\1') }; _f = ->(str) { _n.(str).gsub(/([\d]+\.?)(.*)/, '\2') }; _t = ->(str) { _f.(str).gsub(/([0]+\z)/, '') }; _v = ->(str) { _f.(str).length.to_s }; _w = ->(str) { _t.(str).length.to_s }; __n = ->(str) { to_num.(str.include?('.') ? _n.(str).gsub(/([0]+\z)/, '').chomp('.') : _n.(str)) }; __i = ->(str) { to_num.(_i.(str)) }; __f = ->(str) { to_num.(_f.(str)) }; __t = ->(str) { to_num.(_t.(str)) }; __v = ->(str) { to_num.(_v.(str)) }; __w = ->(str) { to_num.(_w.(str)) }; num = input.to_s; n = __n.(num); i = __i.(num); v = __v.(num); w = __w.(num); f = __f.(num); t = __t.(num); ((i == 1 && v == 0) ? :one : (((v != 0 || n == 0) || (n != 1 && (1..19).include?(n % 100))) ? :few : :other)) },:js_rule => "(function(input) { var runtime = (function(){return this.buildArgsFor=function(t){return[this.n(t),this.i(t),this.f(t),this.t(t),this.v(t),this.w(t)]},this.n=function(t){return this.toNum(t.indexOf(\".\")>-1?this._n(t).replace(/([0]+\\.$)/,\"\"):this._n(t))},this.i=function(t){return this.toNum(this._i(t))},this.f=function(t){return this.toNum(this._f(t))},this.t=function(t){return this.toNum(this._t(t))},this.v=function(t){return this.toNum(this._v(t))},this.w=function(t){return this.toNum(this._w(t))},this.toNum=function(t){return 0==t.length?0:t.indexOf(\".\")>-1?parseFloat(t):parseInt(t)},this._n=function(t){return/(-)?(.*)/.exec(t)[2]},this._i=function(t){return/([\\d]+)(\\..*)?/.exec(this._n(t))[1]},this._f=function(t){return/([\\d]+\\.?)(.*)/.exec(this._n(t))[2]},this._t=function(t){return this._f(t).replace(/([0]+$)/,\"\")},this._v=function(t){return this._f(t).length.toString()},this._w=function(t){return this._t(t).length.toString()},this}).call({}); var num = input.toString(); var n = runtime.n(num); var i = runtime.i(num); var v = runtime.v(num); var w = runtime.w(num); var f = runtime.f(num); var t = runtime.t(num); return ((i == 1 && v == 0) ? 'one' : (((v != 0 || n == 0) || (n != 1 && ((n % 100 >= 1) && (n % 100 <= 19)))) ? 'few' : 'other')); })"}}},
+ :ru => {:i18n => {:plural => {:keys => [:one, :few, :many, :other],:rule => ->(input) { to_num = ->(str) { str.include?('.') ? str.to_f : str.to_i }; _n = ->(str) { str.gsub(/(-)(.*)/, '\2') }; _i = ->(str) { _n.(str).gsub(/([\d]+)(..*)/, '\1') }; _f = ->(str) { _n.(str).gsub(/([\d]+\.?)(.*)/, '\2') }; _t = ->(str) { _f.(str).gsub(/([0]+\z)/, '') }; _v = ->(str) { _f.(str).length.to_s }; _w = ->(str) { _t.(str).length.to_s }; __n = ->(str) { to_num.(str.include?('.') ? _n.(str).gsub(/([0]+\z)/, '').chomp('.') : _n.(str)) }; __i = ->(str) { to_num.(_i.(str)) }; __f = ->(str) { to_num.(_f.(str)) }; __t = ->(str) { to_num.(_t.(str)) }; __v = ->(str) { to_num.(_v.(str)) }; __w = ->(str) { to_num.(_w.(str)) }; num = input.to_s; n = __n.(num); i = __i.(num); v = __v.(num); w = __w.(num); f = __f.(num); t = __t.(num); (((v == 0 && i % 10 == 1) && i % 100 != 11) ? :one : (((v == 0 && (2..4).include?(i % 10)) && !(12..14).include?(i % 100)) ? :few : ((((v == 0 && i % 10 == 0) || (v == 0 && (5..9).include?(i % 10))) || (v == 0 && (11..14).include?(i % 100))) ? :many : :other))) },:js_rule => "(function(input) { var runtime = (function(){return this.buildArgsFor=function(t){return[this.n(t),this.i(t),this.f(t),this.t(t),this.v(t),this.w(t)]},this.n=function(t){return this.toNum(t.indexOf(\".\")>-1?this._n(t).replace(/([0]+\\.$)/,\"\"):this._n(t))},this.i=function(t){return this.toNum(this._i(t))},this.f=function(t){return this.toNum(this._f(t))},this.t=function(t){return this.toNum(this._t(t))},this.v=function(t){return this.toNum(this._v(t))},this.w=function(t){return this.toNum(this._w(t))},this.toNum=function(t){return 0==t.length?0:t.indexOf(\".\")>-1?parseFloat(t):parseInt(t)},this._n=function(t){return/(-)?(.*)/.exec(t)[2]},this._i=function(t){return/([\\d]+)(\\..*)?/.exec(this._n(t))[1]},this._f=function(t){return/([\\d]+\\.?)(.*)/.exec(this._n(t))[2]},this._t=function(t){return this._f(t).replace(/([0]+$)/,\"\")},this._v=function(t){return this._f(t).length.toString()},this._w=function(t){return this._t(t).length.toString()},this}).call({}); var num = input.toString(); var n = runtime.n(num); var i = runtime.i(num); var v = runtime.v(num); var w = runtime.w(num); var f = runtime.f(num); var t = runtime.t(num); return (((v == 0 && i % 10 == 1) && i % 100 != 11) ? 'one' : (((v == 0 && ((i % 10 >= 2) && (i % 10 <= 4))) && !((i % 100 >= 12) && (i % 100 <= 14))) ? 'few' : ((((v == 0 && i % 10 == 0) || (v == 0 && ((i % 10 >= 5) && (i % 10 <= 9)))) || (v == 0 && ((i % 100 >= 11) && (i % 100 <= 14)))) ? 'many' : 'other'))); })"}}},
+ :si => {:i18n => {:plural => {:keys => [:one, :other],:rule => ->(input) { to_num = ->(str) { str.include?('.') ? str.to_f : str.to_i }; _n = ->(str) { str.gsub(/(-)(.*)/, '\2') }; _i = ->(str) { _n.(str).gsub(/([\d]+)(..*)/, '\1') }; _f = ->(str) { _n.(str).gsub(/([\d]+\.?)(.*)/, '\2') }; _t = ->(str) { _f.(str).gsub(/([0]+\z)/, '') }; _v = ->(str) { _f.(str).length.to_s }; _w = ->(str) { _t.(str).length.to_s }; __n = ->(str) { to_num.(str.include?('.') ? _n.(str).gsub(/([0]+\z)/, '').chomp('.') : _n.(str)) }; __i = ->(str) { to_num.(_i.(str)) }; __f = ->(str) { to_num.(_f.(str)) }; __t = ->(str) { to_num.(_t.(str)) }; __v = ->(str) { to_num.(_v.(str)) }; __w = ->(str) { to_num.(_w.(str)) }; num = input.to_s; n = __n.(num); i = __i.(num); v = __v.(num); w = __w.(num); f = __f.(num); t = __t.(num); ((((n == 0) || (n == 1)) || (i == 0 && f == 1)) ? :one : :other) },:js_rule => "(function(input) { var runtime = (function(){return this.buildArgsFor=function(t){return[this.n(t),this.i(t),this.f(t),this.t(t),this.v(t),this.w(t)]},this.n=function(t){return this.toNum(t.indexOf(\".\")>-1?this._n(t).replace(/([0]+\\.$)/,\"\"):this._n(t))},this.i=function(t){return this.toNum(this._i(t))},this.f=function(t){return this.toNum(this._f(t))},this.t=function(t){return this.toNum(this._t(t))},this.v=function(t){return this.toNum(this._v(t))},this.w=function(t){return this.toNum(this._w(t))},this.toNum=function(t){return 0==t.length?0:t.indexOf(\".\")>-1?parseFloat(t):parseInt(t)},this._n=function(t){return/(-)?(.*)/.exec(t)[2]},this._i=function(t){return/([\\d]+)(\\..*)?/.exec(this._n(t))[1]},this._f=function(t){return/([\\d]+\\.?)(.*)/.exec(this._n(t))[2]},this._t=function(t){return this._f(t).replace(/([0]+$)/,\"\")},this._v=function(t){return this._f(t).length.toString()},this._w=function(t){return this._t(t).length.toString()},this}).call({}); var num = input.toString(); var n = runtime.n(num); var i = runtime.i(num); var v = runtime.v(num); var w = runtime.w(num); var f = runtime.f(num); var t = runtime.t(num); return ((((n == 0) || (n == 1)) || (i == 0 && f == 1)) ? 'one' : 'other'); })"}}},
+ :sk => {:i18n => {:plural => {:keys => [:one, :few, :many, :other],:rule => ->(input) { to_num = ->(str) { str.include?('.') ? str.to_f : str.to_i }; _n = ->(str) { str.gsub(/(-)(.*)/, '\2') }; _i = ->(str) { _n.(str).gsub(/([\d]+)(..*)/, '\1') }; _f = ->(str) { _n.(str).gsub(/([\d]+\.?)(.*)/, '\2') }; _t = ->(str) { _f.(str).gsub(/([0]+\z)/, '') }; _v = ->(str) { _f.(str).length.to_s }; _w = ->(str) { _t.(str).length.to_s }; __n = ->(str) { to_num.(str.include?('.') ? _n.(str).gsub(/([0]+\z)/, '').chomp('.') : _n.(str)) }; __i = ->(str) { to_num.(_i.(str)) }; __f = ->(str) { to_num.(_f.(str)) }; __t = ->(str) { to_num.(_t.(str)) }; __v = ->(str) { to_num.(_v.(str)) }; __w = ->(str) { to_num.(_w.(str)) }; num = input.to_s; n = __n.(num); i = __i.(num); v = __v.(num); w = __w.(num); f = __f.(num); t = __t.(num); ((i == 1 && v == 0) ? :one : (((2..4).include?(i) && v == 0) ? :few : (v != 0 ? :many : :other))) },:js_rule => "(function(input) { var runtime = (function(){return this.buildArgsFor=function(t){return[this.n(t),this.i(t),this.f(t),this.t(t),this.v(t),this.w(t)]},this.n=function(t){return this.toNum(t.indexOf(\".\")>-1?this._n(t).replace(/([0]+\\.$)/,\"\"):this._n(t))},this.i=function(t){return this.toNum(this._i(t))},this.f=function(t){return this.toNum(this._f(t))},this.t=function(t){return this.toNum(this._t(t))},this.v=function(t){return this.toNum(this._v(t))},this.w=function(t){return this.toNum(this._w(t))},this.toNum=function(t){return 0==t.length?0:t.indexOf(\".\")>-1?parseFloat(t):parseInt(t)},this._n=function(t){return/(-)?(.*)/.exec(t)[2]},this._i=function(t){return/([\\d]+)(\\..*)?/.exec(this._n(t))[1]},this._f=function(t){return/([\\d]+\\.?)(.*)/.exec(this._n(t))[2]},this._t=function(t){return this._f(t).replace(/([0]+$)/,\"\")},this._v=function(t){return this._f(t).length.toString()},this._w=function(t){return this._t(t).length.toString()},this}).call({}); var num = input.toString(); var n = runtime.n(num); var i = runtime.i(num); var v = runtime.v(num); var w = runtime.w(num); var f = runtime.f(num); var t = runtime.t(num); return ((i == 1 && v == 0) ? 'one' : ((((i >= 2) && (i <= 4)) && v == 0) ? 'few' : (v != 0 ? 'many' : 'other'))); })"}}},
+ :sl => {:i18n => {:plural => {:keys => [:one, :two, :few, :other],:rule => ->(input) { to_num = ->(str) { str.include?('.') ? str.to_f : str.to_i }; _n = ->(str) { str.gsub(/(-)(.*)/, '\2') }; _i = ->(str) { _n.(str).gsub(/([\d]+)(..*)/, '\1') }; _f = ->(str) { _n.(str).gsub(/([\d]+\.?)(.*)/, '\2') }; _t = ->(str) { _f.(str).gsub(/([0]+\z)/, '') }; _v = ->(str) { _f.(str).length.to_s }; _w = ->(str) { _t.(str).length.to_s }; __n = ->(str) { to_num.(str.include?('.') ? _n.(str).gsub(/([0]+\z)/, '').chomp('.') : _n.(str)) }; __i = ->(str) { to_num.(_i.(str)) }; __f = ->(str) { to_num.(_f.(str)) }; __t = ->(str) { to_num.(_t.(str)) }; __v = ->(str) { to_num.(_v.(str)) }; __w = ->(str) { to_num.(_w.(str)) }; num = input.to_s; n = __n.(num); i = __i.(num); v = __v.(num); w = __w.(num); f = __f.(num); t = __t.(num); ((v == 0 && i % 100 == 1) ? :one : ((v == 0 && i % 100 == 2) ? :two : (((v == 0 && (3..4).include?(i % 100)) || v != 0) ? :few : :other))) },:js_rule => "(function(input) { var runtime = (function(){return this.buildArgsFor=function(t){return[this.n(t),this.i(t),this.f(t),this.t(t),this.v(t),this.w(t)]},this.n=function(t){return this.toNum(t.indexOf(\".\")>-1?this._n(t).replace(/([0]+\\.$)/,\"\"):this._n(t))},this.i=function(t){return this.toNum(this._i(t))},this.f=function(t){return this.toNum(this._f(t))},this.t=function(t){return this.toNum(this._t(t))},this.v=function(t){return this.toNum(this._v(t))},this.w=function(t){return this.toNum(this._w(t))},this.toNum=function(t){return 0==t.length?0:t.indexOf(\".\")>-1?parseFloat(t):parseInt(t)},this._n=function(t){return/(-)?(.*)/.exec(t)[2]},this._i=function(t){return/([\\d]+)(\\..*)?/.exec(this._n(t))[1]},this._f=function(t){return/([\\d]+\\.?)(.*)/.exec(this._n(t))[2]},this._t=function(t){return this._f(t).replace(/([0]+$)/,\"\")},this._v=function(t){return this._f(t).length.toString()},this._w=function(t){return this._t(t).length.toString()},this}).call({}); var num = input.toString(); var n = runtime.n(num); var i = runtime.i(num); var v = runtime.v(num); var w = runtime.w(num); var f = runtime.f(num); var t = runtime.t(num); return ((v == 0 && i % 100 == 1) ? 'one' : ((v == 0 && i % 100 == 2) ? 'two' : (((v == 0 && ((i % 100 >= 3) && (i % 100 <= 4))) || v != 0) ? 'few' : 'other'))); })"}}},
+ :sq => {:i18n => {:plural => {:keys => [:one, :other],:rule => ->(input) { to_num = ->(str) { str.include?('.') ? str.to_f : str.to_i }; _n = ->(str) { str.gsub(/(-)(.*)/, '\2') }; _i = ->(str) { _n.(str).gsub(/([\d]+)(..*)/, '\1') }; _f = ->(str) { _n.(str).gsub(/([\d]+\.?)(.*)/, '\2') }; _t = ->(str) { _f.(str).gsub(/([0]+\z)/, '') }; _v = ->(str) { _f.(str).length.to_s }; _w = ->(str) { _t.(str).length.to_s }; __n = ->(str) { to_num.(str.include?('.') ? _n.(str).gsub(/([0]+\z)/, '').chomp('.') : _n.(str)) }; __i = ->(str) { to_num.(_i.(str)) }; __f = ->(str) { to_num.(_f.(str)) }; __t = ->(str) { to_num.(_t.(str)) }; __v = ->(str) { to_num.(_v.(str)) }; __w = ->(str) { to_num.(_w.(str)) }; num = input.to_s; n = __n.(num); i = __i.(num); v = __v.(num); w = __w.(num); f = __f.(num); t = __t.(num); (n == 1 ? :one : :other) },:js_rule => "(function(input) { var runtime = (function(){return this.buildArgsFor=function(t){return[this.n(t),this.i(t),this.f(t),this.t(t),this.v(t),this.w(t)]},this.n=function(t){return this.toNum(t.indexOf(\".\")>-1?this._n(t).replace(/([0]+\\.$)/,\"\"):this._n(t))},this.i=function(t){return this.toNum(this._i(t))},this.f=function(t){return this.toNum(this._f(t))},this.t=function(t){return this.toNum(this._t(t))},this.v=function(t){return this.toNum(this._v(t))},this.w=function(t){return this.toNum(this._w(t))},this.toNum=function(t){return 0==t.length?0:t.indexOf(\".\")>-1?parseFloat(t):parseInt(t)},this._n=function(t){return/(-)?(.*)/.exec(t)[2]},this._i=function(t){return/([\\d]+)(\\..*)?/.exec(this._n(t))[1]},this._f=function(t){return/([\\d]+\\.?)(.*)/.exec(this._n(t))[2]},this._t=function(t){return this._f(t).replace(/([0]+$)/,\"\")},this._v=function(t){return this._f(t).length.toString()},this._w=function(t){return this._t(t).length.toString()},this}).call({}); var num = input.toString(); var n = runtime.n(num); var i = runtime.i(num); var v = runtime.v(num); var w = runtime.w(num); var f = runtime.f(num); var t = runtime.t(num); return (n == 1 ? 'one' : 'other'); })"}}},
+ :sr => {:i18n => {:plural => {:keys => [:one, :few, :other],:rule => ->(input) { to_num = ->(str) { str.include?('.') ? str.to_f : str.to_i }; _n = ->(str) { str.gsub(/(-)(.*)/, '\2') }; _i = ->(str) { _n.(str).gsub(/([\d]+)(..*)/, '\1') }; _f = ->(str) { _n.(str).gsub(/([\d]+\.?)(.*)/, '\2') }; _t = ->(str) { _f.(str).gsub(/([0]+\z)/, '') }; _v = ->(str) { _f.(str).length.to_s }; _w = ->(str) { _t.(str).length.to_s }; __n = ->(str) { to_num.(str.include?('.') ? _n.(str).gsub(/([0]+\z)/, '').chomp('.') : _n.(str)) }; __i = ->(str) { to_num.(_i.(str)) }; __f = ->(str) { to_num.(_f.(str)) }; __t = ->(str) { to_num.(_t.(str)) }; __v = ->(str) { to_num.(_v.(str)) }; __w = ->(str) { to_num.(_w.(str)) }; num = input.to_s; n = __n.(num); i = __i.(num); v = __v.(num); w = __w.(num); f = __f.(num); t = __t.(num); ((((v == 0 && i % 10 == 1) && i % 100 != 11) || (f % 10 == 1 && f % 100 != 11)) ? :one : ((((v == 0 && (2..4).include?(i % 10)) && !(12..14).include?(i % 100)) || ((2..4).include?(f % 10) && !(12..14).include?(f % 100))) ? :few : :other)) },:js_rule => "(function(input) { var runtime = (function(){return this.buildArgsFor=function(t){return[this.n(t),this.i(t),this.f(t),this.t(t),this.v(t),this.w(t)]},this.n=function(t){return this.toNum(t.indexOf(\".\")>-1?this._n(t).replace(/([0]+\\.$)/,\"\"):this._n(t))},this.i=function(t){return this.toNum(this._i(t))},this.f=function(t){return this.toNum(this._f(t))},this.t=function(t){return this.toNum(this._t(t))},this.v=function(t){return this.toNum(this._v(t))},this.w=function(t){return this.toNum(this._w(t))},this.toNum=function(t){return 0==t.length?0:t.indexOf(\".\")>-1?parseFloat(t):parseInt(t)},this._n=function(t){return/(-)?(.*)/.exec(t)[2]},this._i=function(t){return/([\\d]+)(\\..*)?/.exec(this._n(t))[1]},this._f=function(t){return/([\\d]+\\.?)(.*)/.exec(this._n(t))[2]},this._t=function(t){return this._f(t).replace(/([0]+$)/,\"\")},this._v=function(t){return this._f(t).length.toString()},this._w=function(t){return this._t(t).length.toString()},this}).call({}); var num = input.toString(); var n = runtime.n(num); var i = runtime.i(num); var v = runtime.v(num); var w = runtime.w(num); var f = runtime.f(num); var t = runtime.t(num); return ((((v == 0 && i % 10 == 1) && i % 100 != 11) || (f % 10 == 1 && f % 100 != 11)) ? 'one' : ((((v == 0 && ((i % 10 >= 2) && (i % 10 <= 4))) && !((i % 100 >= 12) && (i % 100 <= 14))) || (((f % 10 >= 2) && (f % 10 <= 4)) && !((f % 100 >= 12) && (f % 100 <= 14)))) ? 'few' : 'other')); })"}}},
+ :sv => {:i18n => {:plural => {:keys => [:one, :other],:rule => ->(input) { to_num = ->(str) { str.include?('.') ? str.to_f : str.to_i }; _n = ->(str) { str.gsub(/(-)(.*)/, '\2') }; _i = ->(str) { _n.(str).gsub(/([\d]+)(..*)/, '\1') }; _f = ->(str) { _n.(str).gsub(/([\d]+\.?)(.*)/, '\2') }; _t = ->(str) { _f.(str).gsub(/([0]+\z)/, '') }; _v = ->(str) { _f.(str).length.to_s }; _w = ->(str) { _t.(str).length.to_s }; __n = ->(str) { to_num.(str.include?('.') ? _n.(str).gsub(/([0]+\z)/, '').chomp('.') : _n.(str)) }; __i = ->(str) { to_num.(_i.(str)) }; __f = ->(str) { to_num.(_f.(str)) }; __t = ->(str) { to_num.(_t.(str)) }; __v = ->(str) { to_num.(_v.(str)) }; __w = ->(str) { to_num.(_w.(str)) }; num = input.to_s; n = __n.(num); i = __i.(num); v = __v.(num); w = __w.(num); f = __f.(num); t = __t.(num); ((i == 1 && v == 0) ? :one : :other) },:js_rule => "(function(input) { var runtime = (function(){return this.buildArgsFor=function(t){return[this.n(t),this.i(t),this.f(t),this.t(t),this.v(t),this.w(t)]},this.n=function(t){return this.toNum(t.indexOf(\".\")>-1?this._n(t).replace(/([0]+\\.$)/,\"\"):this._n(t))},this.i=function(t){return this.toNum(this._i(t))},this.f=function(t){return this.toNum(this._f(t))},this.t=function(t){return this.toNum(this._t(t))},this.v=function(t){return this.toNum(this._v(t))},this.w=function(t){return this.toNum(this._w(t))},this.toNum=function(t){return 0==t.length?0:t.indexOf(\".\")>-1?parseFloat(t):parseInt(t)},this._n=function(t){return/(-)?(.*)/.exec(t)[2]},this._i=function(t){return/([\\d]+)(\\..*)?/.exec(this._n(t))[1]},this._f=function(t){return/([\\d]+\\.?)(.*)/.exec(this._n(t))[2]},this._t=function(t){return this._f(t).replace(/([0]+$)/,\"\")},this._v=function(t){return this._f(t).length.toString()},this._w=function(t){return this._t(t).length.toString()},this}).call({}); var num = input.toString(); var n = runtime.n(num); var i = runtime.i(num); var v = runtime.v(num); var w = runtime.w(num); var f = runtime.f(num); var t = runtime.t(num); return ((i == 1 && v == 0) ? 'one' : 'other'); })"}}},
+ :te => {:i18n => {:plural => {:keys => [:one, :other],:rule => ->(input) { to_num = ->(str) { str.include?('.') ? str.to_f : str.to_i }; _n = ->(str) { str.gsub(/(-)(.*)/, '\2') }; _i = ->(str) { _n.(str).gsub(/([\d]+)(..*)/, '\1') }; _f = ->(str) { _n.(str).gsub(/([\d]+\.?)(.*)/, '\2') }; _t = ->(str) { _f.(str).gsub(/([0]+\z)/, '') }; _v = ->(str) { _f.(str).length.to_s }; _w = ->(str) { _t.(str).length.to_s }; __n = ->(str) { to_num.(str.include?('.') ? _n.(str).gsub(/([0]+\z)/, '').chomp('.') : _n.(str)) }; __i = ->(str) { to_num.(_i.(str)) }; __f = ->(str) { to_num.(_f.(str)) }; __t = ->(str) { to_num.(_t.(str)) }; __v = ->(str) { to_num.(_v.(str)) }; __w = ->(str) { to_num.(_w.(str)) }; num = input.to_s; n = __n.(num); i = __i.(num); v = __v.(num); w = __w.(num); f = __f.(num); t = __t.(num); (n == 1 ? :one : :other) },:js_rule => "(function(input) { var runtime = (function(){return this.buildArgsFor=function(t){return[this.n(t),this.i(t),this.f(t),this.t(t),this.v(t),this.w(t)]},this.n=function(t){return this.toNum(t.indexOf(\".\")>-1?this._n(t).replace(/([0]+\\.$)/,\"\"):this._n(t))},this.i=function(t){return this.toNum(this._i(t))},this.f=function(t){return this.toNum(this._f(t))},this.t=function(t){return this.toNum(this._t(t))},this.v=function(t){return this.toNum(this._v(t))},this.w=function(t){return this.toNum(this._w(t))},this.toNum=function(t){return 0==t.length?0:t.indexOf(\".\")>-1?parseFloat(t):parseInt(t)},this._n=function(t){return/(-)?(.*)/.exec(t)[2]},this._i=function(t){return/([\\d]+)(\\..*)?/.exec(this._n(t))[1]},this._f=function(t){return/([\\d]+\\.?)(.*)/.exec(this._n(t))[2]},this._t=function(t){return this._f(t).replace(/([0]+$)/,\"\")},this._v=function(t){return this._f(t).length.toString()},this._w=function(t){return this._t(t).length.toString()},this}).call({}); var num = input.toString(); var n = runtime.n(num); var i = runtime.i(num); var v = runtime.v(num); var w = runtime.w(num); var f = runtime.f(num); var t = runtime.t(num); return (n == 1 ? 'one' : 'other'); })"}}},
+ :tr => {:i18n => {:plural => {:keys => [:one, :other],:rule => ->(input) { to_num = ->(str) { str.include?('.') ? str.to_f : str.to_i }; _n = ->(str) { str.gsub(/(-)(.*)/, '\2') }; _i = ->(str) { _n.(str).gsub(/([\d]+)(..*)/, '\1') }; _f = ->(str) { _n.(str).gsub(/([\d]+\.?)(.*)/, '\2') }; _t = ->(str) { _f.(str).gsub(/([0]+\z)/, '') }; _v = ->(str) { _f.(str).length.to_s }; _w = ->(str) { _t.(str).length.to_s }; __n = ->(str) { to_num.(str.include?('.') ? _n.(str).gsub(/([0]+\z)/, '').chomp('.') : _n.(str)) }; __i = ->(str) { to_num.(_i.(str)) }; __f = ->(str) { to_num.(_f.(str)) }; __t = ->(str) { to_num.(_t.(str)) }; __v = ->(str) { to_num.(_v.(str)) }; __w = ->(str) { to_num.(_w.(str)) }; num = input.to_s; n = __n.(num); i = __i.(num); v = __v.(num); w = __w.(num); f = __f.(num); t = __t.(num); (n == 1 ? :one : :other) },:js_rule => "(function(input) { var runtime = (function(){return this.buildArgsFor=function(t){return[this.n(t),this.i(t),this.f(t),this.t(t),this.v(t),this.w(t)]},this.n=function(t){return this.toNum(t.indexOf(\".\")>-1?this._n(t).replace(/([0]+\\.$)/,\"\"):this._n(t))},this.i=function(t){return this.toNum(this._i(t))},this.f=function(t){return this.toNum(this._f(t))},this.t=function(t){return this.toNum(this._t(t))},this.v=function(t){return this.toNum(this._v(t))},this.w=function(t){return this.toNum(this._w(t))},this.toNum=function(t){return 0==t.length?0:t.indexOf(\".\")>-1?parseFloat(t):parseInt(t)},this._n=function(t){return/(-)?(.*)/.exec(t)[2]},this._i=function(t){return/([\\d]+)(\\..*)?/.exec(this._n(t))[1]},this._f=function(t){return/([\\d]+\\.?)(.*)/.exec(this._n(t))[2]},this._t=function(t){return this._f(t).replace(/([0]+$)/,\"\")},this._v=function(t){return this._f(t).length.toString()},this._w=function(t){return this._t(t).length.toString()},this}).call({}); var num = input.toString(); var n = runtime.n(num); var i = runtime.i(num); var v = runtime.v(num); var w = runtime.w(num); var f = runtime.f(num); var t = runtime.t(num); return (n == 1 ? 'one' : 'other'); })"}}},
+ :uk => {:i18n => {:plural => {:keys => [:one, :few, :many, :other],:rule => ->(input) { to_num = ->(str) { str.include?('.') ? str.to_f : str.to_i }; _n = ->(str) { str.gsub(/(-)(.*)/, '\2') }; _i = ->(str) { _n.(str).gsub(/([\d]+)(..*)/, '\1') }; _f = ->(str) { _n.(str).gsub(/([\d]+\.?)(.*)/, '\2') }; _t = ->(str) { _f.(str).gsub(/([0]+\z)/, '') }; _v = ->(str) { _f.(str).length.to_s }; _w = ->(str) { _t.(str).length.to_s }; __n = ->(str) { to_num.(str.include?('.') ? _n.(str).gsub(/([0]+\z)/, '').chomp('.') : _n.(str)) }; __i = ->(str) { to_num.(_i.(str)) }; __f = ->(str) { to_num.(_f.(str)) }; __t = ->(str) { to_num.(_t.(str)) }; __v = ->(str) { to_num.(_v.(str)) }; __w = ->(str) { to_num.(_w.(str)) }; num = input.to_s; n = __n.(num); i = __i.(num); v = __v.(num); w = __w.(num); f = __f.(num); t = __t.(num); (((v == 0 && i % 10 == 1) && i % 100 != 11) ? :one : (((v == 0 && (2..4).include?(i % 10)) && !(12..14).include?(i % 100)) ? :few : ((((v == 0 && i % 10 == 0) || (v == 0 && (5..9).include?(i % 10))) || (v == 0 && (11..14).include?(i % 100))) ? :many : :other))) },:js_rule => "(function(input) { var runtime = (function(){return this.buildArgsFor=function(t){return[this.n(t),this.i(t),this.f(t),this.t(t),this.v(t),this.w(t)]},this.n=function(t){return this.toNum(t.indexOf(\".\")>-1?this._n(t).replace(/([0]+\\.$)/,\"\"):this._n(t))},this.i=function(t){return this.toNum(this._i(t))},this.f=function(t){return this.toNum(this._f(t))},this.t=function(t){return this.toNum(this._t(t))},this.v=function(t){return this.toNum(this._v(t))},this.w=function(t){return this.toNum(this._w(t))},this.toNum=function(t){return 0==t.length?0:t.indexOf(\".\")>-1?parseFloat(t):parseInt(t)},this._n=function(t){return/(-)?(.*)/.exec(t)[2]},this._i=function(t){return/([\\d]+)(\\..*)?/.exec(this._n(t))[1]},this._f=function(t){return/([\\d]+\\.?)(.*)/.exec(this._n(t))[2]},this._t=function(t){return this._f(t).replace(/([0]+$)/,\"\")},this._v=function(t){return this._f(t).length.toString()},this._w=function(t){return this._t(t).length.toString()},this}).call({}); var num = input.toString(); var n = runtime.n(num); var i = runtime.i(num); var v = runtime.v(num); var w = runtime.w(num); var f = runtime.f(num); var t = runtime.t(num); return (((v == 0 && i % 10 == 1) && i % 100 != 11) ? 'one' : (((v == 0 && ((i % 10 >= 2) && (i % 10 <= 4))) && !((i % 100 >= 12) && (i % 100 <= 14))) ? 'few' : ((((v == 0 && i % 10 == 0) || (v == 0 && ((i % 10 >= 5) && (i % 10 <= 9)))) || (v == 0 && ((i % 100 >= 11) && (i % 100 <= 14)))) ? 'many' : 'other'))); })"}}},
+ :ur => {:i18n => {:plural => {:keys => [:one, :other],:rule => ->(input) { to_num = ->(str) { str.include?('.') ? str.to_f : str.to_i }; _n = ->(str) { str.gsub(/(-)(.*)/, '\2') }; _i = ->(str) { _n.(str).gsub(/([\d]+)(..*)/, '\1') }; _f = ->(str) { _n.(str).gsub(/([\d]+\.?)(.*)/, '\2') }; _t = ->(str) { _f.(str).gsub(/([0]+\z)/, '') }; _v = ->(str) { _f.(str).length.to_s }; _w = ->(str) { _t.(str).length.to_s }; __n = ->(str) { to_num.(str.include?('.') ? _n.(str).gsub(/([0]+\z)/, '').chomp('.') : _n.(str)) }; __i = ->(str) { to_num.(_i.(str)) }; __f = ->(str) { to_num.(_f.(str)) }; __t = ->(str) { to_num.(_t.(str)) }; __v = ->(str) { to_num.(_v.(str)) }; __w = ->(str) { to_num.(_w.(str)) }; num = input.to_s; n = __n.(num); i = __i.(num); v = __v.(num); w = __w.(num); f = __f.(num); t = __t.(num); ((i == 1 && v == 0) ? :one : :other) },:js_rule => "(function(input) { var runtime = (function(){return this.buildArgsFor=function(t){return[this.n(t),this.i(t),this.f(t),this.t(t),this.v(t),this.w(t)]},this.n=function(t){return this.toNum(t.indexOf(\".\")>-1?this._n(t).replace(/([0]+\\.$)/,\"\"):this._n(t))},this.i=function(t){return this.toNum(this._i(t))},this.f=function(t){return this.toNum(this._f(t))},this.t=function(t){return this.toNum(this._t(t))},this.v=function(t){return this.toNum(this._v(t))},this.w=function(t){return this.toNum(this._w(t))},this.toNum=function(t){return 0==t.length?0:t.indexOf(\".\")>-1?parseFloat(t):parseInt(t)},this._n=function(t){return/(-)?(.*)/.exec(t)[2]},this._i=function(t){return/([\\d]+)(\\..*)?/.exec(this._n(t))[1]},this._f=function(t){return/([\\d]+\\.?)(.*)/.exec(this._n(t))[2]},this._t=function(t){return this._f(t).replace(/([0]+$)/,\"\")},this._v=function(t){return this._f(t).length.toString()},this._w=function(t){return this._t(t).length.toString()},this}).call({}); var num = input.toString(); var n = runtime.n(num); var i = runtime.i(num); var v = runtime.v(num); var w = runtime.w(num); var f = runtime.f(num); var t = runtime.t(num); return ((i == 1 && v == 0) ? 'one' : 'other'); })"}}},
+ :vi => {:i18n => {:plural => {:keys => [:other],:rule => ->(input) { to_num = ->(str) { str.include?('.') ? str.to_f : str.to_i }; _n = ->(str) { str.gsub(/(-)(.*)/, '\2') }; _i = ->(str) { _n.(str).gsub(/([\d]+)(..*)/, '\1') }; _f = ->(str) { _n.(str).gsub(/([\d]+\.?)(.*)/, '\2') }; _t = ->(str) { _f.(str).gsub(/([0]+\z)/, '') }; _v = ->(str) { _f.(str).length.to_s }; _w = ->(str) { _t.(str).length.to_s }; __n = ->(str) { to_num.(str.include?('.') ? _n.(str).gsub(/([0]+\z)/, '').chomp('.') : _n.(str)) }; __i = ->(str) { to_num.(_i.(str)) }; __f = ->(str) { to_num.(_f.(str)) }; __t = ->(str) { to_num.(_t.(str)) }; __v = ->(str) { to_num.(_v.(str)) }; __w = ->(str) { to_num.(_w.(str)) }; num = input.to_s; n = __n.(num); i = __i.(num); v = __v.(num); w = __w.(num); f = __f.(num); t = __t.(num); :other },:js_rule => "(function(input) { var runtime = (function(){return this.buildArgsFor=function(t){return[this.n(t),this.i(t),this.f(t),this.t(t),this.v(t),this.w(t)]},this.n=function(t){return this.toNum(t.indexOf(\".\")>-1?this._n(t).replace(/([0]+\\.$)/,\"\"):this._n(t))},this.i=function(t){return this.toNum(this._i(t))},this.f=function(t){return this.toNum(this._f(t))},this.t=function(t){return this.toNum(this._t(t))},this.v=function(t){return this.toNum(this._v(t))},this.w=function(t){return this.toNum(this._w(t))},this.toNum=function(t){return 0==t.length?0:t.indexOf(\".\")>-1?parseFloat(t):parseInt(t)},this._n=function(t){return/(-)?(.*)/.exec(t)[2]},this._i=function(t){return/([\\d]+)(\\..*)?/.exec(this._n(t))[1]},this._f=function(t){return/([\\d]+\\.?)(.*)/.exec(this._n(t))[2]},this._t=function(t){return this._f(t).replace(/([0]+$)/,\"\")},this._v=function(t){return this._f(t).length.toString()},this._w=function(t){return this._t(t).length.toString()},this}).call({}); var num = input.toString(); var n = runtime.n(num); var i = runtime.i(num); var v = runtime.v(num); var w = runtime.w(num); var f = runtime.f(num); var t = runtime.t(num); return 'other'; })"}}},
+ :wo => {:i18n => {:plural => {:keys => [:other],:rule => ->(input) { to_num = ->(str) { str.include?('.') ? str.to_f : str.to_i }; _n = ->(str) { str.gsub(/(-)(.*)/, '\2') }; _i = ->(str) { _n.(str).gsub(/([\d]+)(..*)/, '\1') }; _f = ->(str) { _n.(str).gsub(/([\d]+\.?)(.*)/, '\2') }; _t = ->(str) { _f.(str).gsub(/([0]+\z)/, '') }; _v = ->(str) { _f.(str).length.to_s }; _w = ->(str) { _t.(str).length.to_s }; __n = ->(str) { to_num.(str.include?('.') ? _n.(str).gsub(/([0]+\z)/, '').chomp('.') : _n.(str)) }; __i = ->(str) { to_num.(_i.(str)) }; __f = ->(str) { to_num.(_f.(str)) }; __t = ->(str) { to_num.(_t.(str)) }; __v = ->(str) { to_num.(_v.(str)) }; __w = ->(str) { to_num.(_w.(str)) }; num = input.to_s; n = __n.(num); i = __i.(num); v = __v.(num); w = __w.(num); f = __f.(num); t = __t.(num); :other },:js_rule => "(function(input) { var runtime = (function(){return this.buildArgsFor=function(t){return[this.n(t),this.i(t),this.f(t),this.t(t),this.v(t),this.w(t)]},this.n=function(t){return this.toNum(t.indexOf(\".\")>-1?this._n(t).replace(/([0]+\\.$)/,\"\"):this._n(t))},this.i=function(t){return this.toNum(this._i(t))},this.f=function(t){return this.toNum(this._f(t))},this.t=function(t){return this.toNum(this._t(t))},this.v=function(t){return this.toNum(this._v(t))},this.w=function(t){return this.toNum(this._w(t))},this.toNum=function(t){return 0==t.length?0:t.indexOf(\".\")>-1?parseFloat(t):parseInt(t)},this._n=function(t){return/(-)?(.*)/.exec(t)[2]},this._i=function(t){return/([\\d]+)(\\..*)?/.exec(this._n(t))[1]},this._f=function(t){return/([\\d]+\\.?)(.*)/.exec(this._n(t))[2]},this._t=function(t){return this._f(t).replace(/([0]+$)/,\"\")},this._v=function(t){return this._f(t).length.toString()},this._w=function(t){return this._t(t).length.toString()},this}).call({}); var num = input.toString(); var n = runtime.n(num); var i = runtime.i(num); var v = runtime.v(num); var w = runtime.w(num); var f = runtime.f(num); var t = runtime.t(num); return 'other'; })"}}},
+ :zh => {:i18n => {:plural => {:keys => [:other],:rule => ->(input) { to_num = ->(str) { str.include?('.') ? str.to_f : str.to_i }; _n = ->(str) { str.gsub(/(-)(.*)/, '\2') }; _i = ->(str) { _n.(str).gsub(/([\d]+)(..*)/, '\1') }; _f = ->(str) { _n.(str).gsub(/([\d]+\.?)(.*)/, '\2') }; _t = ->(str) { _f.(str).gsub(/([0]+\z)/, '') }; _v = ->(str) { _f.(str).length.to_s }; _w = ->(str) { _t.(str).length.to_s }; __n = ->(str) { to_num.(str.include?('.') ? _n.(str).gsub(/([0]+\z)/, '').chomp('.') : _n.(str)) }; __i = ->(str) { to_num.(_i.(str)) }; __f = ->(str) { to_num.(_f.(str)) }; __t = ->(str) { to_num.(_t.(str)) }; __v = ->(str) { to_num.(_v.(str)) }; __w = ->(str) { to_num.(_w.(str)) }; num = input.to_s; n = __n.(num); i = __i.(num); v = __v.(num); w = __w.(num); f = __f.(num); t = __t.(num); :other },:js_rule => "(function(input) { var runtime = (function(){return this.buildArgsFor=function(t){return[this.n(t),this.i(t),this.f(t),this.t(t),this.v(t),this.w(t)]},this.n=function(t){return this.toNum(t.indexOf(\".\")>-1?this._n(t).replace(/([0]+\\.$)/,\"\"):this._n(t))},this.i=function(t){return this.toNum(this._i(t))},this.f=function(t){return this.toNum(this._f(t))},this.t=function(t){return this.toNum(this._t(t))},this.v=function(t){return this.toNum(this._v(t))},this.w=function(t){return this.toNum(this._w(t))},this.toNum=function(t){return 0==t.length?0:t.indexOf(\".\")>-1?parseFloat(t):parseInt(t)},this._n=function(t){return/(-)?(.*)/.exec(t)[2]},this._i=function(t){return/([\\d]+)(\\..*)?/.exec(this._n(t))[1]},this._f=function(t){return/([\\d]+\\.?)(.*)/.exec(this._n(t))[2]},this._t=function(t){return this._f(t).replace(/([0]+$)/,\"\")},this._v=function(t){return this._f(t).length.toString()},this._w=function(t){return this._t(t).length.toString()},this}).call({}); var num = input.toString(); var n = runtime.n(num); var i = runtime.i(num); var v = runtime.v(num); var w = runtime.w(num); var f = runtime.f(num); var t = runtime.t(num); return 'other'; })"}}},
+ :"art-nvi" => {:i18n => {:plural => {:keys => [:zero, :one, :two, :few, :other],:rule => ->(input) { to_num = ->(str) { str.include?('.') ? str.to_f : str.to_i }; _n = ->(str) { str.gsub(/(-)(.*)/, '\2') }; _i = ->(str) { _n.(str).gsub(/([\d]+)(..*)/, '\1') }; _f = ->(str) { _n.(str).gsub(/([\d]+\.?)(.*)/, '\2') }; _t = ->(str) { _f.(str).gsub(/([0]+\z)/, '') }; _v = ->(str) { _f.(str).length.to_s }; _w = ->(str) { _t.(str).length.to_s }; __n = ->(str) { to_num.(str.include?('.') ? _n.(str).gsub(/([0]+\z)/, '').chomp('.') : _n.(str)) }; __i = ->(str) { to_num.(_i.(str)) }; __f = ->(str) { to_num.(_f.(str)) }; __t = ->(str) { to_num.(_t.(str)) }; __v = ->(str) { to_num.(_v.(str)) }; __w = ->(str) { to_num.(_w.(str)) }; num = input.to_s; n = __n.(num); i = __i.(num); v = __v.(num); w = __w.(num); f = __f.(num); t = __t.(num); (n == 0 ? :zero : (n == 1 ? :one : (n == 2 ? :two : (n == 3 ? :few : :other)))) },:js_rule => "(function(input) { var runtime = (function(){return this.buildArgsFor=function(t){return[this.n(t),this.i(t),this.f(t),this.t(t),this.v(t),this.w(t)]},this.n=function(t){return this.toNum(t.indexOf(\".\")>-1?this._n(t).replace(/([0]+\\.$)/,\"\"):this._n(t))},this.i=function(t){return this.toNum(this._i(t))},this.f=function(t){return this.toNum(this._f(t))},this.t=function(t){return this.toNum(this._t(t))},this.v=function(t){return this.toNum(this._v(t))},this.w=function(t){return this.toNum(this._w(t))},this.toNum=function(t){return 0==t.length?0:t.indexOf(\".\")>-1?parseFloat(t):parseInt(t)},this._n=function(t){return/(-)?(.*)/.exec(t)[2]},this._i=function(t){return/([\\d]+)(\\..*)?/.exec(this._n(t))[1]},this._f=function(t){return/([\\d]+\\.?)(.*)/.exec(this._n(t))[2]},this._t=function(t){return this._f(t).replace(/([0]+$)/,\"\")},this._v=function(t){return this._f(t).length.toString()},this._w=function(t){return this._t(t).length.toString()},this}).call({}); var num = input.toString(); var n = runtime.n(num); var i = runtime.i(num); var v = runtime.v(num); var w = runtime.w(num); var f = runtime.f(num); var t = runtime.t(num); return (n == 0 ? 'zero' : (n == 1 ? 'one' : (n == 2 ? 'two' : (n == 3 ? 'few' : 'other')))); })"}}}
+} \ No newline at end of file
diff --git a/config/locales/devise/devise.cs.yml b/config/locales/devise/devise.cs.yml
index 12e1d6471..f69a8529a 100644
--- a/config/locales/devise/devise.cs.yml
+++ b/config/locales/devise/devise.cs.yml
@@ -49,9 +49,13 @@ cs:
passwords:
edit:
change_password: "Změnit heslo"
+ confirm_password: "Potvrďte heslo"
+ new_password: "Nové heslo"
new:
+ email: "E-mailová adresa"
forgot_password: "Zapomněli jste heslo?"
no_account: "Neexistuje žádný účet s touto emailovou adresou. Pokud čekáte na pozvání, budeme je vydávat, co nejdříve to bude možné"
+ reset_password: "Znovunastavit heslo"
send_password_instructions: "Zaslat instrukce k nastavení nového hesla."
send_instructions: "Běhěm několika minut obdržíte email s instrukcemi ke změně hesla."
updated: "Vaše heslo bylo úspěšně změněno. Nyní jste přihlášeni"
diff --git a/config/locales/devise/devise.da.yml b/config/locales/devise/devise.da.yml
index a2b015c8c..f76aefb03 100644
--- a/config/locales/devise/devise.da.yml
+++ b/config/locales/devise/devise.da.yml
@@ -16,7 +16,7 @@ da:
invalid: "Forkert brugernavn eller adgangskode."
invalid_token: "Ugyldig token."
locked: "Din konto er låst."
- not_found_in_database: "Forkert e-mail eller kodeord."
+ not_found_in_database: "Forkert e-mail eller adgangskode."
timeout: "Du har været inaktiv for længe. Log ind for at fortsætte."
unauthenticated: "Du skal logge ind eller oprette en konto for at fortsætte."
unconfirmed: "Du skal bekræfte din konto for at fortsætte."
@@ -33,7 +33,7 @@ da:
inviter:
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*."
+ have_invited_you: "%{names} har inviteret dig til at deltage i Diaspora."
reset_password_instructions:
change: "Skift min adgangskode"
ignore: "Hvis du ikke har anmodet om dette, bedes du ignorere denne e-mail."
@@ -49,13 +49,13 @@ da:
passwords:
edit:
change_password: "skift adgangskode"
- confirm_password: "Bekræft kodeord"
+ confirm_password: "Bekræft adgangskode."
new_password: "Nyt kodeord"
new:
email: "E-mail adresse"
forgot_password: "Glemt din adgangskode?"
- no_account: "Ingen konto med den email adresse eksisterer."
- reset_password: "Nulstil kodeord"
+ 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."
diff --git a/config/locales/devise/devise.de_formal.yml b/config/locales/devise/devise.de_formal.yml
index 15fa7e415..2034ff577 100644
--- a/config/locales/devise/devise.de_formal.yml
+++ b/config/locales/devise/devise.de_formal.yml
@@ -33,17 +33,17 @@ de_formal:
inviter:
accept_at: "unter %{url}, können Sie sie über den untenstehenden Link akzeptieren."
has_invited_you: "%{name}"
- have_invited_you: "%{names} hat Sie eingeladen diaspora* beizutreten"
+ have_invited_you: "%{names} hat Sie eingeladen, diaspora* beizutreten"
reset_password_instructions:
change: "Mein Kennwort ändern"
ignore: "Wenn Sie dies nicht angefordert haben, ignorieren Sie bitte diese E-Mail."
- someone_requested: "Jemand hat einen Link angefordert, um Ihr Kennwort zu ändern und Sie können das durch den unten aufgeführten Link tun."
+ someone_requested: "Jemand hat einen Link angefordert, um Ihr Kennwort zu ändern. Wenn Sie das waren, können Sie das durch den unten aufgeführten Link tun."
subject: "Setzen Sie Ihr Passwort zurück"
wont_change: "Ihr Kennwort bleibt unverändert, bis Sie es über den Link ändern und ein neues erstellen."
unlock_instructions:
account_locked: "Ihr Konto wurde aufgrund von zu vielen fehlgeschlagenen Anmeldeversuchen gesperrt."
click_to_unlock: "Folgen Sie dem unten aufgeführten Link, um Ihr Konto zu entsperren:"
- subject: "Anweisungen entsperren"
+ subject: "Anweisungen zum Entsperren"
unlock: "Mein Konto entsperren"
welcome: "Willkommen %{email}!"
passwords:
@@ -54,7 +54,7 @@ de_formal:
new:
email: "E-Mail-Adresse"
forgot_password: "Kennwort vergessen?"
- no_account: "Es existiert kein Benutzerkonto mit dieser E-Mail-Adresse. Falls Sie auf eine Einladung warten, dann geben wir Ihnen sobald wie möglich eine"
+ no_account: "Es existiert kein Benutzerkonto mit dieser E-Mail-Adresse"
reset_password: "Passwort zurücksetzen"
send_password_instructions: "Anleitung zum Zurücksetzen des Кennworts anfordern"
send_instructions: "Sie werden in ein paar Minuten eine E-Mail erhalten, die beschreibt, wie Sie Ihr Kennwort zurücksetzen."
diff --git a/config/locales/devise/devise.el.yml b/config/locales/devise/devise.el.yml
index 2878ca5cd..a3092ad6b 100644
--- a/config/locales/devise/devise.el.yml
+++ b/config/locales/devise/devise.el.yml
@@ -16,6 +16,7 @@ el:
invalid: "Άκυρο όνομα χρήστη ή κωδικός."
invalid_token: "Άκυρο σύμβολο ταυτότητας."
locked: "Ο λογαριασμός σας είναι κλειδωμένος."
+ not_found_in_database: "Λάθος email ή κωδικός πρόσβασης."
timeout: "Η σύνδεσή σας έληξε, παρακαλώ συνδεθείτε ξανά για να συνεχίσετε."
unauthenticated: "Θα πρέπει να συνδεθείτε ή να εγγραφείτε πριν συνεχίσετε."
unconfirmed: "Πρέπει να επιβεβαιώσετε τον λογαριασμό σας πριν συνεχίσετε."
@@ -48,9 +49,13 @@ el:
passwords:
edit:
change_password: "Αλλαγή του κωδικού μου"
+ confirm_password: "Επιβεβαίωση κωδικού"
+ new_password: "Νέος κωδικός πρόσβασης"
new:
+ email: "Διεύθυνση email"
forgot_password: "Ξεχάσατε τον κωδικό σας;"
no_account: "Δεν υπάρχει λογαριασμός με αυτό το email. Αν περιμένετε για πρόσκληση, θα γίνουν αποστολές το συντομότερο δυνατόν"
+ reset_password: "Επαναφορά κωδικού"
send_password_instructions: "Στείλτε μου οδηγίες επαναφοράς κωδικού"
send_instructions: "Θα λάβετε ένα email με οδηγίες για το πως να επαναφέρετε τον κωδικό πρόσβασης σας σε λίγα λεπτά."
updated: "Ο κωδικός σας άλλαξε με επιτυχία. Έχετε πλέον συνδεθεί."
diff --git a/config/locales/devise/devise.en_valspeak.yml b/config/locales/devise/devise.en_valspeak.yml
new file mode 100644
index 000000000..5a1b1081b
--- /dev/null
+++ b/config/locales/devise/devise.en_valspeak.yml
@@ -0,0 +1,93 @@
+# Copyright (c) 2010-2013, Diaspora Inc. This file is
+# licensed under the Affero General Public License version 3 or later. See
+# the COPYRIGHT file.
+
+
+
+en_valspeak:
+ devise:
+ confirmations:
+ confirmed: "Ur account was like... confirmed!!! U r nao signed in!!! YAY! :DDD"
+ new:
+ resend_confirmation: "Resend meh teh stuff to confirm mah stuff plz."
+ send_instructions: "U will like, receive an email tellin u how 2 confirm ur account in a few min. So just liek, chillax n watch netflix r somethin, kay? Kay."
+ failure:
+ inactive: "Ur account is like... not activate yet. U should like, get on that. Kay?"
+ invalid: "Thats like... a invalid usahname or passwerd, kay?"
+ invalid_token: "sry, like, invalid authenty tokennn </3"
+ locked: "Ur account is locked :("
+ not_found_in_database: "sry, this is like... a wrong email or passwerd... sry bout tht... :\\"
+ timeout: "Ur time on d* has like... ended. plz sign in again to continue n stuff."
+ unauthenticated: "U like... need 2 sign in er sign up b4 continuin.."
+ unconfirmed: "U have 2 confirm ur account b4 continuin..."
+ invitations:
+ invitation_token_invalid: "sry bout this but, that invite token is liek, not valid... sry :\\ u mad bro?"
+ send_instructions: "Ur liek, invite was sent n ffuts..."
+ updated: "Ur passwerd was like, set!!! U r nao signed in!!! OMFGBBQ YAAAAAYYYY! :DDDD"
+ mailer:
+ confirmation_instructions:
+ confirm: "Confirm mah account!!"
+ subject: "Stuff liek, tellin u how 2 confirm ur account n stuff..."
+ you_can_confirm: "U can confirm ur account through teh link below:"
+ hello: "Ohai %{email}!!"
+ inviter:
+ accept_at: "so like, @ %{url} u can accept it through the link below. Kay? <3"
+ has_invited_you: "%{name}"
+ have_invited_you: "so like, %{names} have invited u to join diaspora*!!! :DDD"
+ reset_password_instructions:
+ change: "Change mah passwerd"
+ ignore: "So like, if u didnt want this email, plz just like, ignore it. Kthx!!!<33"
+ someone_requested: "Some1 like, wanted a link 2 change ur passwerd. if it like, was u, u can like, do this through the link below. Kay?(:"
+ subject: "Reset passwerd info"
+ wont_change: "Ur passwerd like, wont change until u click the link abov n like, make a new 1."
+ unlock_instructions:
+ account_locked: "So liek, ur account has liek, been locked cuz u liek... tried loggin in 2 many times n it didnt work... sry bout tht :\\"
+ click_to_unlock: "Click teh link below 2 unlock ur account, kay?:"
+ subject: "Unlock ur stuff info"
+ unlock: "Unlock mah account!!!"
+ welcome: "OHAI! %{email}!"
+ passwords:
+ edit:
+ change_password: "Change mah passwerddd"
+ confirm_password: "Cunfirm passwerd"
+ new_password: "New passwerddd"
+ new:
+ email: "Email addy"
+ forgot_password: "Oh noes!? did u like, forget ur passwerd? D:"
+ no_account: "sry but liek, no account that has this email existz... sry bout that :\\"
+ reset_password: "Reset passwerd"
+ send_password_instructions: "Send meh stuff on how 2 reset mah passwerd plz! Kthxbye <3"
+ send_instructions: "U will like, receive an email wit some txt on how 2 liek... reset ur passwerd in a few min, kay? So just chillax till then, kay? Kay. <3"
+ updated: "Ur passwerd was liek... changed!! U r nao liek.. signed in.((:"
+ registrations:
+ destroyed: "Byez! Ur account was trashed. hope we c u again! peace out, cub scout! <33"
+ signed_up: "U have signed up n its all good bro. so like, if enabled, a thingy was sent 2 ur email, kay?"
+ updated: "Ur account was liek, updated!!! YAY! <33333"
+ sessions:
+ new:
+ login: "Check in!!"
+ modern_browsers: "only supports like... browsers that arent like... junk n weird. sry bout that :\\"
+ password: "Passwerd"
+ remember_me: "Remembah me bro!"
+ sign_in: "Check innnn <3"
+ username: "Usahname"
+ signed_in: "Checked in successfully!!! OMG YAY! KITTIES! <3"
+ signed_out: "Bounced successfully! Byez! <3 :*"
+ shared:
+ links:
+ forgot_your_password: "forgot ur passwerd?"
+ receive_confirmation: "didnt get the stuff to confirm ur stuff?"
+ receive_unlock: "didnt get the stuff to unlock ur stuff?"
+ sign_in: "sign innn"
+ sign_up: "sign upppp"
+ sign_up_closed: "sry butt, open signups r closed right nao. sry bout that :\\"
+ unlocks:
+ new:
+ resend_unlock: "Resend the unlock stuff..."
+ send_instructions: "U will liek, get an email tellin u how to unlock ur phone.. erm.. i mean account in a few min, kay?"
+ unlocked: "Ur account was liek, unlocked!!! U r nao signed in!!! YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYYY!!!"
+ errors:
+ messages:
+ already_confirmed: "was like... already confirmed n stuff"
+ not_found: "couldnt find it :\\"
+ not_locked: "was like.. not locked.." \ No newline at end of file
diff --git a/config/locales/devise/devise.fr.yml b/config/locales/devise/devise.fr.yml
index 24655bb2d..a8c646e8b 100644
--- a/config/locales/devise/devise.fr.yml
+++ b/config/locales/devise/devise.fr.yml
@@ -33,15 +33,15 @@ fr:
inviter:
accept_at: "à %{url}, vous pouvez l'accepter à travers le lien ci-dessous."
has_invited_you: "%{name}"
- have_invited_you: "%{names} vous a invité à rejoindre Diaspora"
+ have_invited_you: "%{names} vous a invité à rejoindre diaspora*"
reset_password_instructions:
change: "Changer mon mot de passe"
ignore: "Si vous n'avez pas demandé cela, merci d'ignorer ce courriel."
- someone_requested: "Une personne a demandé la génération d'un lien pour modifier votre mot de passe. Si vous êtes à l'origine de cette demande, vous pouvez le faire en cliquant sur le lien ci-dessous."
+ someone_requested: "Quelqu'un a demandé la génération d'un lien pour modifier votre mot de passe. Si vous êtes à l'origine de cette demande, vous pouvez le faire en cliquant sur le lien ci-dessous."
subject: "Instructions de réinitialisation de mot de passe"
wont_change: "Votre mot de passe ne changera pas tant que vous n'en aurez pas créé un nouveau en accédant au lien ci-dessus."
unlock_instructions:
- account_locked: "Votre compte a été bloqué à cause d'un nombre excessif de tentatives infructueuses de connexion."
+ account_locked: "Votre compte a été verrouillé en raison d'un nombre excessif de tentatives infructueuses de connexion."
click_to_unlock: "Cliquez sur le lien ci-dessous pour débloquer votre compte :"
subject: "Instructions de déverrouillage"
unlock: "Débloquer mon compte"
diff --git a/config/locales/devise/devise.hy.yml b/config/locales/devise/devise.hy.yml
index 6eb43ce8d..57d46cd4c 100644
--- a/config/locales/devise/devise.hy.yml
+++ b/config/locales/devise/devise.hy.yml
@@ -16,8 +16,9 @@ hy:
invalid: "Սխալ օգտանուն կամ գաղտնաբառ։"
invalid_token: "Նույնականացման սխալ։"
locked: "Քո հաշիվն արգելափակված է։"
+ not_found_in_database: "Անվավեր էլ․ հասցե կամ գաղտնաբառ։"
timeout: "Աշխատաշրջանիդ ժամկետն անցել է, խնդրում ենք կրկին մուտք գործիր, որ շարունակես։"
- unauthenticated: "Շարունակելուց առաջ պետք է կա՛մ մուտք գործես, կա՛մ գրանցվես։"
+ unauthenticated: "Շարունակելուց առաջ պետք է մուտք գործես կամ գրանցվես։"
unconfirmed: "Շարունակելուց առաջ պետք է հաստատես հաշիվդ։"
invitations:
invitation_token_invalid: "Հազար ներողություն, բայց այս հրավերը վավեր չէ։"
@@ -48,9 +49,13 @@ hy:
passwords:
edit:
change_password: "Փոխել իմ գաղտնաբառը"
+ confirm_password: "Հաստատել գաղտնաբառը"
+ new_password: "Նոր գաղտնաբառ"
new:
+ email: "Էլ․ հասցե"
forgot_password: "Մոռացե՞լ ես գաղտնաբառդ"
no_account: "Այս էլ.հասցեով հաշիվ չկա։  Եթե հրավերի ես սպասում, մենք փորձում ենք դրանք հնարավորինս արագ աչքի անցկացնել։"
+ reset_password: "Վերականգնել գաղտնաբառը"
send_password_instructions: "Ուղարկեք ինձ գաղտնաբառը փոխելու ցուցումները"
send_instructions: "Րոպեների ընթացքում նամակ կստանաս՝ գաղտնաբառդ վերականգնելու ցուցումներով։"
updated: "Գաղտաբառդ հաջողությամբ փոխվեց։ Հիմա արդեն համակարգում ես։"
@@ -67,7 +72,7 @@ hy:
sign_in: "Մուտք գործել"
username: "Օգտանուն"
signed_in: "Բարեհաջող մուտք գործեցիր։"
- signed_out: "Բարեհաջող դուրս եկար։"
+ signed_out: "Բարեհաջող դուրս եկար։ Մի՜նչ։"
shared:
links:
forgot_your_password: "Մոռացե՞լ ես գաղտնաբառդ"
diff --git a/config/locales/devise/devise.ia.yml b/config/locales/devise/devise.ia.yml
index 8f9e53072..433159229 100644
--- a/config/locales/devise/devise.ia.yml
+++ b/config/locales/devise/devise.ia.yml
@@ -16,6 +16,7 @@ ia:
invalid: "Nomine de usator o contrasigno invalide."
invalid_token: "Indicio de authentication invalide."
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."
unauthenticated: "Tu debe aperir session o crear un conto ante de continuar."
unconfirmed: "Tu debe confirmar tu conto ante de continuar."
@@ -32,15 +33,15 @@ ia:
inviter:
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"
+ have_invited_you: "%{names} te ha invitate a unir te a diaspora*"
reset_password_instructions:
change: "Cambiar mi contrasigno"
ignore: "Si tu non ha demandate isto, per favor ignora iste message."
- someone_requested: "Qualcuno ha demandate un ligamine pro cambiar tu contrasigno. Tu pote facer isto per le ligamine sequente."
+ someone_requested: "Qualcuno ha demandate un ligamine pro cambiar tu contrasigno. Si tu faceva iste demanda, tu pote facer isto per le ligamine sequente."
subject: "Instructiones pro reinitialisar contrasigno"
wont_change: "Le contrasigno non cambiara si tu non clicca sur le ligamine precedente e specifica un nove."
unlock_instructions:
- account_locked: "Tu conto ha essite blocate a causa de un numero excessive de tentativas fallite de accesso a tu conto."
+ account_locked: "Tu conto ha essite blocate a causa de un numero excessive de tentativas fallite de accesso."
click_to_unlock: "Clicca sur le ligamine sequente pro disblocar tu conto:"
subject: "Instructiones pro disblocar"
unlock: "Disblocar mi conto"
@@ -48,14 +49,18 @@ ia:
passwords:
edit:
change_password: "Cambiar mi contrasigno"
+ confirm_password: "Confirmar contrasigno"
+ new_password: "Nove contrasigno"
new:
+ email: "Adresse de e-mail"
forgot_password: "Contrasigno oblidate?"
- no_account: "Nulle conto con iste adresse de e-mail existe. Si tu attende un invitation, nos te lo inviara le plus tosto possibile."
- send_password_instructions: "Inviar me instructiones pro reinitialisar mi contrasigno"
+ no_account: "Nulle conto con iste adresse de e-mail existe."
+ reset_password: "Reinitialisar contrasigno"
+ send_password_instructions: "Inviar instructiones pro reinitialisar contrasigno"
send_instructions: "Tu recipera in pauc minutas un message de e-mail con instructiones pro reinitialisar le contrasigno."
updated: "Le contrasigno ha essite cambiate con successo. Tu ha aperite session."
registrations:
- destroyed: "Adeo! Tu conto ha essite cancellate. Nos spera revider te bentosto."
+ 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."
updated: "Conto actualisate con successo."
sessions:
diff --git a/config/locales/devise/devise.it.yml b/config/locales/devise/devise.it.yml
index f69a28a90..0dde4d6f1 100644
--- a/config/locales/devise/devise.it.yml
+++ b/config/locales/devise/devise.it.yml
@@ -33,7 +33,7 @@ it:
inviter:
accept_at: "su %{url}, puoi accettare dal link qua sotto."
has_invited_you: "%{name} ti ha invitato ad entrare in Diaspora"
- have_invited_you: "%{names} ti hanno invitato ad entrare in Diaspora"
+ have_invited_you: "%{names} ti hanno invitato ad entrare in diaspora*"
reset_password_instructions:
change: "Cambia la mia password"
ignore: "Se non hai effettuato la richiesta, per favore ignora questa email."
@@ -54,7 +54,7 @@ it:
new:
email: "Indirizzo e-mail"
forgot_password: "Hai dimenticato la password?"
- no_account: "Non esiste un account per questo indirizzo email. Se sei in attesa di un invito, considera che li stiamo spedendo il più velocemente possibile."
+ no_account: "Non esiste un account con questo indirizzo email"
reset_password: "Resetta password"
send_password_instructions: "Inviami le istruzioni per reimpostare la password."
send_instructions: "Tra pochi minuti riceverai una email con le istruzioni su come cambiare la tua password."
diff --git a/config/locales/devise/devise.ms.yml b/config/locales/devise/devise.ms.yml
index a20713118..b5cc36d6c 100644
--- a/config/locales/devise/devise.ms.yml
+++ b/config/locales/devise/devise.ms.yml
@@ -16,6 +16,7 @@ ms:
invalid: "Tidak sah nama pengguna atau kata laluan."
invalid_token: "Token pengesahan tidak sah."
locked: "Akaun anda dikunci."
+ not_found_in_database: "Emel atau kata laluan tidak sah."
timeout: "Sesi anda luput, sila mendaftar masuk sekali lagi untuk meneruskan."
unauthenticated: "Anda perlu log masuk atau mendaftar sebelum meneruskan."
unconfirmed: "Anda perlu log masuk atau mendaftar sebelum meneruskan."
@@ -28,6 +29,7 @@ ms:
confirm: "Sahkan akaun saya"
subject: "pengesahan tunjuk-cara"
you_can_confirm: "Anda boleh mengesahkan akaun anda melalui link di bawah:"
+ hello: "Hello %{email}!"
inviter:
accept_at: "pada% {url}, anda boleh menerimanya melalui link di bawah."
have_invited_you: "%{names} telah menjemput anda untuk menyertai Diaspora"
@@ -46,9 +48,13 @@ ms:
passwords:
edit:
change_password: "Tukar kata laluan saya"
+ confirm_password: "Sahkan kata laluan"
+ new_password: "Kata laluan baru"
new:
+ email: "Alamat emel"
forgot_password: "Lupa kata laluan anda?"
no_account: "Tiada akaun dengan e-mel ini wujud. Jika anda sedang menunggu untuk jemputan, kami memusing mereka secepat mungkin"
+ reset_password: "Tetapkan semula kata laluan"
send_password_instructions: "Hantar saya arahan menetap semula kata laluan"
send_instructions: "Anda akan menerima e-mel dengan arahan mengenai cara untuk menetapkan semula kata laluan anda dalam beberapa minit."
updated: "Kata laluan anda telah berubah dengan jayanya. Anda kini ditandatangani."
diff --git a/config/locales/devise/devise.nds.yml b/config/locales/devise/devise.nds.yml
new file mode 100644
index 000000000..6be848d11
--- /dev/null
+++ b/config/locales/devise/devise.nds.yml
@@ -0,0 +1,67 @@
+# Copyright (c) 2010-2013, Diaspora Inc. This file is
+# licensed under the Affero General Public License version 3 or later. See
+# the COPYRIGHT file.
+
+
+
+nds:
+ devise:
+ confirmations:
+ confirmed: "Dien Konto is erfolgriek bestätigt worrn. Du bist nu anmellt."
+ new:
+ resend_confirmation: "Bestätigungsanwiesungen nochmol schicken"
+ failure:
+ inactive: "Dien Konto is noch nich in gang set woorn."
+ locked: "Dien Konto is sparrt."
+ not_found_in_database: "Ungüllige E-Mail-Adress or Passwoort."
+ unauthenticated: "Du muss die anmellen or registreren, bevöör du wiedermokst."
+ unconfirmed: "Du muss dien Konto in gang setten, bevöör du wiedermokst."
+ invitations:
+ send_instructions: "Diene Inladung is afschickt worrn."
+ updated: "Dien Passwoort is erfolgriek set worrn. Du bist nu anmellt."
+ mailer:
+ hello: "Hallo %{email}!"
+ inviter:
+ has_invited_you: "%{name}"
+ reset_password_instructions:
+ change: "Mien Passwoort ännern"
+ unlock_instructions:
+ subject: "Anwisungen ton Entsparrn"
+ unlock: "Mien Konto entsparrn"
+ welcome: "Willkomen %{email}!"
+ passwords:
+ edit:
+ change_password: "Änner mien Passwoort"
+ confirm_password: "Passwoort bestätigen"
+ new_password: "Nee’es Passwoort"
+ new:
+ email: "E-Mail-Adress"
+ forgot_password: "Hest du dien Passwoort vergeten?"
+ no_account: "Dat gift keen Konto mit disse E-Mail-Adress"
+ reset_password: "Passwoort trüchsetten"
+ send_password_instructions: "Schick mi Anwieungen ton Trüchsetten von mien Passwort"
+ updated: "Dien Passwoort is erfolgriek ännert worrn. Du bist nu anmellt."
+ registrations:
+ updated: "Du hest dien Konto erfolgriek ännert."
+ sessions:
+ new:
+ login: "Anmellen"
+ modern_browsers: "ünnerstütt nur moderne Netkieker."
+ password: "Passwoort"
+ remember_me: "Erinner di an mi"
+ sign_in: "Anmellen"
+ username: "Benutternaam"
+ signed_in: "Erfolgriek anmellt."
+ signed_out: "Erfolgriek afmellt."
+ shared:
+ links:
+ sign_in: "Anmellen"
+ sign_up: "Registreren"
+ unlocks:
+ new:
+ resend_unlock: "Anwisungen ton Entsparrn noch mol schicken"
+ errors:
+ messages:
+ already_confirmed: "wöör schon bestätigt"
+ not_found: "nich funnen"
+ not_locked: "wöör nich sparrt" \ No newline at end of file
diff --git a/config/locales/devise/devise.sk.yml b/config/locales/devise/devise.sk.yml
index 9ad8b2b21..fac14b893 100644
--- a/config/locales/devise/devise.sk.yml
+++ b/config/locales/devise/devise.sk.yml
@@ -37,7 +37,7 @@ sk:
reset_password_instructions:
change: "Zmeniť si heslo"
ignore: "Ak si o to nežiadal(a), tento e-mail, prosím, ignoruj."
- someone_requested: "Nieko požiadal o zmenu tvojho hesla. Ak si to bol(a) ty, môžeš to urobiť kliknutím na tento odkaz."
+ someone_requested: "Niekto požiadal o odkaz na zmenu tvojho hesla. Ak si to bol(a) ty, môžeš to urobiť kliknutím na tento odkaz."
subject: "Pokyny na zmenu hesla"
wont_change: "Tvoje heslo sa nezmení, kým neklikneš na odkaz, ktorý je napísaný vyššie, a nevytvoríš si nové."
unlock_instructions:
diff --git a/config/locales/devise/devise.sv.yml b/config/locales/devise/devise.sv.yml
index 65b1e801c..f4501970f 100644
--- a/config/locales/devise/devise.sv.yml
+++ b/config/locales/devise/devise.sv.yml
@@ -33,7 +33,7 @@ sv:
inviter:
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"
+ have_invited_you: "%{names} har bjudit in dig att gå med i Diaspora*"
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."
diff --git a/config/locales/devise/devise.zh-TW.yml b/config/locales/devise/devise.zh-TW.yml
index 1ccab7046..3ada4fd57 100644
--- a/config/locales/devise/devise.zh-TW.yml
+++ b/config/locales/devise/devise.zh-TW.yml
@@ -33,11 +33,11 @@ zh-TW:
inviter:
accept_at: "於 %{url},你可以透過以下連結來接受。"
has_invited_you: "%{name}"
- have_invited_you: "%{names} 邀請你加入 Diaspora"
+ have_invited_you: "%{names} 邀請你加入 diaspora* "
reset_password_instructions:
change: "更改密碼"
ignore: "如果你沒有要求過,請不用管這封信。"
- someone_requested: "有人要求要改變你的密碼,如果是你自己的話,請按以下連結來做。"
+ someone_requested: "如果你要求重設密碼,請點下方連結來重設密碼。"
subject: "密碼重設步驟"
wont_change: "在按了以上連結,並且設定新的密碼後,你的密碼才會改變。"
unlock_instructions:
@@ -49,9 +49,13 @@ zh-TW:
passwords:
edit:
change_password: "更改密碼"
+ confirm_password: "確認密碼"
+ new_password: "新密碼"
new:
+ email: "電子信箱"
forgot_password: "忘記密碼了嗎?"
no_account: "沒有和這個電子信箱關聯的帳號"
+ reset_password: "重設密碼"
send_password_instructions: "傳送密碼重設的步驟給我"
send_instructions: "幾分鐘之內,你會收到一封說明如何重設密碼的信件。"
updated: "密碼更改成功,你已經登入了。"
diff --git a/config/locales/diaspora/ar.yml b/config/locales/diaspora/ar.yml
index f7f85bb83..4be9f5a33 100644
--- a/config/locales/diaspora/ar.yml
+++ b/config/locales/diaspora/ar.yml
@@ -7,26 +7,27 @@
ar:
_applications: "التطبيقات"
_comments: "تعليقات"
- _contacts: "جهات الاتصال"
+ _contacts: "المتراسلون"
_home: "الرئيسية"
_photos: "صور"
_services: "الخدمات"
- account: "الحساب الشخصي"
+ _statistics: "إحصائيّات"
+ account: "الحساب"
activerecord:
errors:
models:
contact:
attributes:
person_id:
- taken: "يجب أن يكون فريدًا من بين جهات اتصال هذا العضو"
+ taken: "يجب أن يكون فريدًا في متراسلي هذا العضو."
person:
attributes:
diaspora_handle:
- taken: "غير متاح"
+ taken: "مأخوذ بالفعل."
request:
attributes:
from_id:
- taken: "نسخة مكررة من طلب موجود مسبقًا."
+ taken: "مكرّر لطلب موجود مسبقًا."
reshare:
attributes:
root_guid:
@@ -34,12 +35,12 @@ ar:
user:
attributes:
email:
- taken: "حُجِزَ بالفعل."
+ taken: "مأخوذ بالفعل."
person:
invalid: "غير صالح."
username:
- invalid: "غير صالح، يـسمح بالحروف، الأرقام وخطوط التأكيد (-_) فقط"
- taken: "حُجِزَ بالفعل."
+ invalid: "غير صالح. نسمح فقط بالأحرف، والأرقام والشرطات السفلية."
+ taken: "مأخوذ بالفعل."
admins:
admin_bar:
pages: "صفحات"
@@ -48,17 +49,31 @@ ar:
stats:
2weeks: "أسبوعين"
daily: "يومياً"
+ display_results: "يعرض النّتائج من الجزء <b>%{segment}</b>"
month: "شهر"
+ usage_statistic: "إحصائيّات الاستخدام"
week: "أسبوع"
+ user_search:
+ are_you_sure_lock_account: "أمتأكّد من قفل هذا الحساب؟"
+ are_you_sure_unlock_account: "أمتأكّد من إزالة قفل هذا الحساب؟"
+ weekly_user_stats:
+ amount_of:
+ few: "عدد المستخدمين الجدد لهذا الأسبوع: ‎%{count}‎"
+ many: "عدد المستخدمين الجدد لهذا الأسبوع: ‎%{count}‎"
+ one: "عدد المستخدمين الجدد لهذا الأسبوع: واحد"
+ other: "عدد المستخدمين الجدد لهذا الأسبوع: ‎%{count}‎"
+ two: "عدد المستخدمين الجدد لهذا الأسبوع: اثنان"
+ zero: "عدد المستخدمين الجدد لهذا الأسبوع: صفر"
+ current_server: "تاريخ الخادوم الحاليّ هو ‎%{date}‎"
ago: "منذ %{time}"
all_aspects: "كل الفئات"
application:
helper:
unknown_person: "شخص مجهول"
video_title:
- unknown: "فيديو غير مُعَنْوَن"
- are_you_sure: "أواثقٌ أنت؟"
- are_you_sure_delete_account: "هل تريد حقا إغلاق حسابك؟ عند إغلاق حسابك تحذف كل معلوماتك ولا يمكن استرجاعهاا!"
+ unknown: "عنوان فيديو مجهول"
+ are_you_sure: "أمتأكّد؟"
+ are_you_sure_delete_account: "أمتأكّد من حذف حسابك؟ هذا إجراء لا عودة فيه!"
aspect_memberships:
destroy:
failure: "فشل في حذف عضو من الفئة"
@@ -68,8 +83,6 @@ ar:
add_to_aspect:
failure: "فشل في إضافة صديق إلى الفئة"
success: "إضافة صديق إلى الفئة بنجاح"
- aspect_contacts:
- done_editing: "اتمام التغييرات"
aspect_listings:
add_an_aspect: "+ أضف فئة جديدة"
deselect_all: "الغاء اختيار الكل"
@@ -87,21 +100,14 @@ ar:
failure: "%{name} ليس خاليا ولا يمكن حذفه"
success: ".بنجاح %{name} تم إزالة"
edit:
- add_existing: "إضافة عضو موجود مسبقا"
aspect_list_is_not_visible: "قائمة الفئة مخفية عن الأعضاء الأخرين في الفئة"
aspect_list_is_visible: "قائمة الفئة مرئية للأعضاء الآخرين في الفئة"
confirm_remove_aspect: "تأكيد حذف هذه الفئة؟"
- done: "تم بنجاح"
make_aspect_list_visible: "فئة مرئية"
remove_aspect: "حذف هذه الفئة"
rename: "إعادة تسمية"
update: "تحديث"
updating: "جارى التحديث"
- few: "%{count} فئة"
- helper:
- are_you_sure: "تأكيد حذف هذه الفئة؟"
- aspect_not_empty: "الفئة ليست فارغة"
- remove: "حذف"
index:
diaspora_id:
content_1: "معرف دياسبرا الخاص بك هو:"
@@ -135,11 +141,6 @@ ar:
heading: "صل حسابك بالخدمات"
unfollow_tag: "أَوقِف متابعة #%{tag}"
welcome_to_diaspora: "مرحبا بك في دياسبرا , %{name} !"
- many: "%{count} فئات"
- move_contact:
- error: "خطأ خلال تحريك عضو: %{inspect}"
- failure: "لم يعمل %{inspect}"
- success: "تم تحريك عضو إلى الفئة الجديدة"
new:
create: "أنشئ"
name: "إسم"
@@ -157,19 +158,11 @@ ar:
family: "العائلة"
friends: "الأصدقاء"
work: "العمل"
- selected_contacts:
- manage_your_aspects: "أَدِر فئاتك."
- no_contacts: "لا تملك أية جهات اتصال هنا بعد."
- view_all_community_spotlight: "شاهد كل أضواء المجتمع"
- view_all_contacts: "عرض كل جهات الاتصال"
- show:
- edit_aspect: "تحرير الفئة"
- two: "%{count} فئتان"
update:
failure: "فئتك, %{name}, اسمها طويل ولا يمكن حفظها."
success: ".بنجاح %{name} تم تعديل"
zero: "لا فئات"
- back: "عودة"
+ back: "ارجع"
blocks:
create:
failure: "لم استطع تجاهل هذا المستخدم. evasion#"
@@ -181,52 +174,40 @@ ar:
heading: "زر المفضلة"
post_something: "انشر شيئا على دياسبرا"
post_success: "تم النشر, إغلاق!"
- cancel: "إلغاء"
+ cancel: "ألغِ"
comments:
- few: "%{count} تعليقات"
- many: "%{count} تعليقًا"
new_comment:
comment: "علِّق"
commenting: "جارى التعليق..."
one: "تعليقٌ واحد"
other: "%{count} تعليق"
- two: "%{count} تعليقان"
zero: "لا تعليقات"
contacts:
create:
failure: "فشل في إنشاء الإتصال"
- few: "%{count} أعضاء"
index:
add_a_new_aspect: "أضف فئة جديدة"
add_to_aspect: "Add contacts to %{name}"
- add_to_aspect_link: "أضف جهات الاتصال إلى %{name}"
all_contacts: "كل جهات الاتصال"
community_spotlight: "ضوء المجتمع"
- many_people_are_you_sure: "هل أنت متأكد من بدأ هذه المحادثة الخاصة مع أكثر من %{suggested_limit} جهات اتصال? من الأفضل إرسال مشاركة لهذه الفئة لتتصل بهم."
my_contacts: "جهات الاتصال الخاصة بي"
no_contacts: "لا توجد جهات اتصال."
no_contacts_message: "انظر في {community_spotlight}%"
- no_contacts_message_with_aspect: "انظر في %{community_spotlight} او %{add_to_aspect_link}"
only_sharing_with_me: "فقط يتشاركون معي"
- remove_person_from_aspect: "احذف %{person_name} من \"%{aspect_name}\""
start_a_conversation: "ابدأ محادثة"
title: "جهات الاتصال"
your_contacts: "جهات الاتصال"
- many: "%{count} أعضاء"
one: "1 عضو"
other: "%{count} أعضاء"
sharing:
people_sharing: "أعضاء يتشاركون معك:"
spotlight:
community_spotlight: "ضوء المجتمع"
- two: "%{count} عضوان"
zero: "جهات الاتصال"
conversations:
create:
fail: "رسالة غير صالحة"
sent: "أُرْسِلَت الرسالة"
- destroy:
- success: "حُذِفَت المحادثة بنجاح"
helper:
new_messages:
few: "%{count} رسائل جديدة"
@@ -254,15 +235,23 @@ ar:
birthday: "%d %B"
birthday_with_year: "%d %B %Y"
fullmonth_day: "%d %B"
- delete: "احذِف"
- email: "بريد إلكتروني"
+ delete: "احذف"
+ email: "البريد الإلكترونيّ"
error_messages:
helper:
- correct_the_following_errors_and_try_again: "صَحِّح الأخطاء التالية ثم أعد المحاولة."
- invalid_fields: "حقولٌ غير صالحة"
- fill_me_out: "إملأني"
- find_people: "ابحث عن الأصدقاء أو #الوسوم"
- hide: "آَخْفِ"
+ correct_the_following_errors_and_try_again: "صحّح الأخطاء الآتية وحاول مجدّدًا."
+ invalid_fields: "حقول غير صالحة"
+ login_try_again: "فضلًا <a href='%{login_link}'>لِج</a> وجرّب مجدّدًا."
+ fill_me_out: "املأني"
+ find_people: "اعثر على أشخاص أو #وسوم"
+ help:
+ keyboard_shortcuts:
+ keyboard_shortcuts_li5: "r - أعد مشاركة التدوينة الحاليّة"
+ keyboard_shortcuts_li6: "m - وسّع التدوينة الحاليّة"
+ keyboard_shortcuts_li7: "o - افتح أوّل وصلة في التدوينة الحاليّة"
+ posts_and_posting:
+ character_limit_a: "65535 محرفًا. هذا أكبر بِـ 65395 محرفًا الذي تحصل عليها في تويتر! ؛)"
+ hide: "أخفِ"
invitations:
a_facebook_user: "مستخدم فايسبوك"
check_token:
@@ -294,6 +283,7 @@ ar:
back_to_top: "الذهاب إلى الاعلى"
powered_by: "بدعم DIASPORA*"
public_feed: "ملقم دياسبرا العام لـ %{name}"
+ source_package: "نزّل حزمة الشِّفرة المصدريّة"
toggle: "حَوِّل لموقع الهواتف المحمولة"
whats_new: "ما الجديد؟"
your_aspects: "فئاتك"
@@ -333,7 +323,7 @@ ar:
limited: "محدود"
more: "أكثر"
next: "التالي"
- no_results: "لا توجد نتائج"
+ no_results: "لم يُعثر على نتائج"
notifications:
also_commented:
few: "%{actors} علق أيضا على %{post_link} %{post_author}."
@@ -375,6 +365,7 @@ ar:
zero: "و لا أحد"
mark_all_as_read: "وضع الجميع كمقروء"
mark_unread: "غير مقروء"
+ no_notifications: "ليس هناك أيّ إخطار بعد."
notifications: "تنبيهات"
liked:
few: "%{actors} أعجبوا لتوهم بـ %{post_link}."
@@ -442,6 +433,27 @@ ar:
click_link: "لتفعيل عنوان بريدك الإلكتروني الجديد %{unconfirmed_email}, من فضلك إتبع هذا الرابط:"
subject: "من فضلك، فَعِّل عنوان بريدك الإلكتروني الجديد %{unconfirmed_email}"
email_sent_by_diaspora: "أُرسِلَت هذه الرسالة بواسطة ديسبورا. إذا أردت إيقاف مثل هذه الرسالة، "
+ export_email:
+ body: |-
+ مرحبًا ‎%{name}‎،
+
+ بياناتك قد عولجت وجاهزة للتنزيل باتباع [هذه الوصلة](‎%{url}‎).
+
+ مع أطيب التحيّات،
+
+ آلة دياسبورا للبريد الإلكترونيّ!
+ subject: "بياناتك الشخصيّة جاهزة للتنزيل يا ‎%{name}‎"
+ export_failure_email:
+ body: |-
+ مرحبًا ‎%{name}‎
+
+ واجهتنا مشكلة أثناء معالجة بياناتك الشخصيّة لتنزيلها.
+ فضلًا حاول مجدّدًا!
+
+ مع أطيب التحيّات،
+
+ آلة دياسبورا للبريد الإلكترونيّ!
+ subject: "آسفون، حدثت مشكلة مع بياناتك يا ‎%{name}‎"
hello: "مرحبا %{name}!"
invite:
message: |-
@@ -475,7 +487,7 @@ ar:
ok: "حسنًا"
or: "أو"
password: "كلمة المرور"
- password_confirmation: "تأكيد كلمة المرور"
+ password_confirmation: "أكّد كلمة المرور"
people:
add_contact:
invited_by: "تمت دعوتك بواسطة"
@@ -483,16 +495,14 @@ ar:
add_contact_from_tag: "إضافة مراسل من tag"
aspect_list:
edit_membership: "تعديل العضويات بالفئات"
- few: "%{count} أعضاء"
helper:
results_for: " نتائج من أجل %{params}"
index:
- looking_for: "تبحث عن مشاركات مَوسومة بـ %{tag_link} ؟"
+ looking_for: "تبحث عن مشاركات موسومة بـ %{tag_link}؟"
no_one_found: "...ولم يعثر على أحد"
no_results: "يجب تحديد شيء للبحث عنه"
results_for: "نتائج البحث عن"
searching: "جارى البحث، كن صبوراً من فضلك..."
- many: "%{count} أعضاء"
one: "1شخص"
other: "%{count} عضو"
person:
@@ -513,7 +523,7 @@ ar:
closed_account: "لقد تم إغلاق هذا الحساب."
does_not_exist: "هذا العضو غير موجود"
has_not_shared_with_you_yet: "%{name} لمْ يشارك أي مشاركة معك بعد"
- ignoring: "أنت تتجاهل جميع المشاركات من %{name}"
+ ignoring: "أنت تتجاهل جميع المشاركات من %{name}."
incoming_request: "%{name} يريد المشاركة معك"
mention: "إشارة"
message: "رسالة"
@@ -528,7 +538,6 @@ ar:
add_some: "أضف بعض"
edit: "عدِّل"
you_have_no_tags: "لا تتوفر على وسوم"
- two: "%{count} عضوان"
webfinger:
fail: "للأسف، لم نجد %{handle}."
zero: "لا أحد"
@@ -584,7 +593,7 @@ ar:
previous: "السابق"
privacy: "الخصوصية"
privacy_policy: "سياسة الخصوصية"
- profile: "الملف الشخصى"
+ profile: "الملف الشخصي"
profiles:
edit:
allow_search: "اسمَح للجميع بالبحث عنك من خلال دياسبرا"
@@ -633,6 +642,7 @@ ar:
enter_username: "اختر معرف (فقط حروف, أرقام, و الإشارات الخطية)"
join_the_movement: "إنضم للرّكب"
password: "كلمة السر"
+ sign_up: "سجّل"
sign_up_message: "Social Networking with a <3"
username: "إسم المستخدم"
requests:
@@ -673,7 +683,7 @@ ar:
reshare_original: "أعد نشر المشاركة الأصلية"
reshared_via: "أعيد مشاركتها عبر"
show_original: "اعرض الأصلية"
- search: "بحث"
+ search: "ابحث"
services:
create:
failure: "فشل التوثيق"
@@ -705,6 +715,7 @@ ar:
share_visibilites:
update:
post_hidden_and_muted: "مشاركة %{name} تم إخفائها والتنبيهات أوقِفت"
+ see_it_on_their_profile: "إن أردت مشاهدة تحديثات هذه المشاركة، زُر صفحة ملفّ ‎%{name}‎ الشخصيّ."
shared:
add_contact:
add_new_contact: "أضف متصل جديد"
@@ -736,6 +747,7 @@ ar:
invite_your_friends: "ادعُ أصدقاءك"
invites: "دعوات"
invites_closed: "الدعوات غير متاحة على هذه المنصة حاليا"
+ share_this: "شارك هذه الوصلة عبر البريد الإلكترونيّ، أو المدوّنات أو الشّبكات الاجتماعيّة!"
notification:
new: "%{type} جديد من %{from}"
public_explain:
@@ -754,7 +766,7 @@ ar:
discard_post: "تجاهل المشاركة"
make_public: "انشرها للجميع"
new_user_prefill:
- hello: "فلينتبه الجمبع انا #%{new_user_tag}. "
+ hello: "مرحبًا جميعًا، أنا #%{new_user_tag}. "
i_like: "I'm interested in %{tags}."
invited_by: "شكراً على الدعوة، "
newhere: "جديد هنا"
@@ -781,6 +793,11 @@ ar:
via: "بواسطة %{link}"
via_mobile: "عبر المحمول"
viewable_to_anyone: "يستطيع أي شخص على الشبكة رؤية هذه المشاركة."
+ statistics:
+ name: "الاسم"
+ network: "الشبكة"
+ services: "الخدمات"
+ total_users: "مجموع المستخدمين"
status_messages:
create:
success: "ذَكَرْتَ بنجاح: %{names}"
@@ -790,13 +807,7 @@ ar:
no_message_to_display: "ﻻ توجد رسائل لعرضها."
new:
mentioning: "ذكر %{person}"
- too_long:
- few: "المرجو ان تكون رسالتك أقل من %{count} حرف"
- many: "المرجو ان تكون رسالتك أقل من %{count} حرف"
- one: "المرجو ان تكون رسالتك أقل من %{count} حروف"
- other: "المرجو ان تكون رسالتك أقل من %{count} حروف"
- two: "المرجو ان تكون رسالتك أقل من %{count} حرف"
- zero: "المرجو ان تكون رسالتك أقل من %{count} حروف"
+ too_long: "{\"few\"=>\"المرجو ان تكون رسالتك أقل من %{count} حرف\", \"many\"=>\"المرجو ان تكون رسالتك أقل من %{count} حرف\", \"one\"=>\"المرجو ان تكون رسالتك أقل من %{count} حروف\", \"other\"=>\"المرجو ان تكون رسالتك أقل من %{count} حروف\", \"two\"=>\"المرجو ان تكون رسالتك أقل من %{count} حرف\", \"zero\"=>\"المرجو ان تكون رسالتك أقل من %{count} حروف\"}"
stream_helper:
hide_comments: "أخْفِ كل التعليقات"
show_comments:
@@ -847,14 +858,11 @@ ar:
show:
follow: "تابع #%{tag}"
following: "أنت تتابع #%{tag}"
- nobody_talking: "لم يتحدث أحدٌ عن %{tag} بعد"
none: "الوسم الفارغ غير موجود!"
- people_tagged_with: "أشخاص موسومون بـ %{tag}"
- posts_tagged_with: "مشاركات موسومة بـ #%{tag}"
stop_following: "أوقف متابعة #%{tag}"
terms_and_conditions: "الشروط والأحكام"
- undo: "أَأَتَرَاجَع؟"
- username: "إسم المستخدم"
+ undo: "أأتراجع؟"
+ username: "اسم المستخدم"
users:
confirm_email:
email_confirmed: "فُعِّل البريد الإلكتروني %{email} بنجاح"
@@ -875,18 +883,21 @@ ar:
close_account_text: "أغلق الحساب"
comment_on_post: "...علق أحدهم على مشاركتك"
current_password: "كلمة المرور الحالية"
+ download_export: "نزّل ملفي الشخصيّ"
download_photos: "تحميل صوري"
- download_xml: "تحميل xml خاصتي"
edit_account: "تعديل الحساب"
email_awaiting_confirmation: "لقد أرسلنا إليك رابط تفعيل إلى %{unconfirmed_email}. وحتى تتبع هذا الرابط وتفعل العنوان الجديد، سنستمر في استخدام بريدك الأساسي %{email}."
export_data: "تصدير البيانات"
+ export_in_progress: "نعالج بياناتك حاليًّا. فضلًا راجعنا بعد بضع لحظات."
following: "إعدادات المتابعة"
+ last_exported_at: "(آخر تحديث كان في ‎%{timestamp}‎)"
liked: "...أعجب أحدهم بمشاركتك"
mentioned: "...تم ذكرك فى رسالة؟"
new_password: "كلمة مرور جديدة"
- photo_export_unavailable: "رفع الصور حاليا غير متاح"
private_message: "...وصلتك رسالة خاصة؟"
receive_email_notifications: "استقبال تنبيهات عبر البريد الإلكتروني؟"
+ request_export: "اطلب بيانات ملفي الشخصيّ"
+ request_export_update: "أنعش بيانات ملفي الشخصيّ"
reshared: "...أعاد أحدهم نشر مشاركتك؟"
started_sharing: "...بدأ أحدهم المشاركة معك؟"
stream_preferences: "تفضيلات ساحة المشاركة"
diff --git a/config/locales/diaspora/art-nvi.yml b/config/locales/diaspora/art-nvi.yml
index 8c7a7a67e..e718a3b96 100644
--- a/config/locales/diaspora/art-nvi.yml
+++ b/config/locales/diaspora/art-nvi.yml
@@ -32,8 +32,6 @@ art-nvi:
aspects:
destroy:
success: "%{name}l 'ìlmaku fìtsengeta."
- edit:
- done: "Hasey"
index:
diaspora_id:
content_1: "Ngeyä Diaspora Tstxo lu:"
@@ -66,11 +64,8 @@ art-nvi:
back: "ne'ìm"
cancel: "Ftang"
comments:
- few: "%{count} aysäplltxevi"
- many: "%{count} aysäplltxevi"
one: "1 säplltxevi"
other: "%{count} aysäplltxevi"
- two: "%{count} mesäplltxevi"
zero: "Kea aysäplltxevi"
contacts:
index:
@@ -176,7 +171,6 @@ art-nvi:
edit: "Latem %{name}it"
unhappy: "Nga lu keftxo srak?"
new:
- continue: "Salew"
sign_up_message: "Tsenge eylanìri tsnì zamunge ♥"
requests:
create:
diff --git a/config/locales/diaspora/ast.yml b/config/locales/diaspora/ast.yml
index df7cdd7c1..dc40b8c1d 100644
--- a/config/locales/diaspora/ast.yml
+++ b/config/locales/diaspora/ast.yml
@@ -57,8 +57,6 @@ ast:
add_to_aspect:
failure: "Nun pudo amestase'l contautu al aspeutu."
success: "Amestóse'l contautu al aspeutu correutamente."
- aspect_contacts:
- done_editing: "edición terminada"
aspect_listings:
add_an_aspect: "+ Amestar un aspeutu"
deselect_all: "Nun seleicionar nada"
@@ -76,21 +74,14 @@ ast:
failure: "%{name} nun ta baleru nun pudo desaniciase."
success: "%{name} desanicióse correutamente."
edit:
- add_existing: "Amestar un contautu esistente"
aspect_list_is_not_visible: "Los contactos d'esti aspeutu nun puen vese unos a otros."
aspect_list_is_visible: "Los contactos d'esti aspeutu puen vese unos a otros."
confirm_remove_aspect: "¿Tas seguru de que quies desaniciar esti aspeutu?"
- done: "Fecho"
make_aspect_list_visible: "¿facer los contactos d'esti aspeutu visibles ente ellos?"
remove_aspect: "Desaniciar esti aspeutu"
rename: "renomar"
update: "anovar"
updating: "anovando"
- few: "%{count} aspeutos"
- helper:
- are_you_sure: "¿Tas seguru de que quies desaniciar esti aspeutu?"
- aspect_not_empty: "L'aspeutu nun ta baleru"
- remove: "desaniciar"
index:
diaspora_id:
content_1: "La to ID de diaspora* ye:"
@@ -123,11 +114,6 @@ ast:
heading: "Coneutar servicios"
unfollow_tag: "Dexar de siguir #%{tag}"
welcome_to_diaspora: "¡Afáyati en diaspora*, %{name}!"
- many: "%{count} aspeutos"
- move_contact:
- error: "Error al mover el contautu: %{inspect}"
- failure: "%{inspect} nun funcionó"
- success: "La persona movióse a un aspeutu nuevu"
new:
create: "Crear"
name: "Nome (visible pa ti namái)"
@@ -145,14 +131,6 @@ ast:
family: "Familia"
friends: "Amigos"
work: "Trabayu"
- selected_contacts:
- manage_your_aspects: "Alministrar los aspeutos."
- no_contacts: "Inda nun tienes contautos equí."
- view_all_community_spotlight: "Ver tolo destacao de la comunidá"
- view_all_contacts: "Ver tolos contautos"
- show:
- edit_aspect: "editar aspeutu"
- two: "%{count} aspeutos"
update:
failure: "El to aspeutu, %{name}, tenía un nome llargu enforma pa poder guardalu."
success: "Editóse correutamente'l to aspeutu, %{name}."
@@ -165,23 +143,17 @@ ast:
post_success: "¡Publicao! Zarrando."
cancel: "Encaboxar"
comments:
- few: "%{count} comentarios"
- many: "%{count} comentarios"
new_comment:
comment: "Comentariu"
commenting: "Comentando..."
one: "1 comentariu"
other: "%{count} comentarios"
- two: "%{count} comentarios"
zero: "nun hai comentarios"
contacts:
create:
failure: "Nun pudo crease'l contautu"
- few: "%{count} contautos"
- many: "%{count} contautos"
one: "1 contautu"
other: "%{count} contautos"
- two: "%{count} contautos"
zero: "contautos"
delete: "Desaniciar"
email: "Corréu electrónicu"
diff --git a/config/locales/diaspora/az.yml b/config/locales/diaspora/az.yml
new file mode 100644
index 000000000..159841290
--- /dev/null
+++ b/config/locales/diaspora/az.yml
@@ -0,0 +1,153 @@
+# Copyright (c) 2010-2013, Diaspora Inc. This file is
+# licensed under the Affero General Public License version 3 or later. See
+# the COPYRIGHT file.
+
+
+
+az:
+ _applications: "Applikasiya"
+ _comments: ""
+ _contacts: ""
+ _home: ""
+ _photos: "Şəkil"
+ _services: "Servis"
+ account: "Akkaunt"
+ activerecord:
+ errors:
+ models:
+ person:
+ attributes:
+ diaspora_handle:
+ taken: ""
+ request:
+ attributes:
+ from_id:
+ taken: ""
+ user:
+ attributes:
+ email:
+ taken: ""
+ person:
+ invalid: ""
+ username:
+ invalid: ""
+ taken: ""
+ ago: "%{time}%{time}"
+ are_you_sure: ""
+ aspects:
+ add_to_aspect:
+ failure: ""
+ success: ""
+ aspect_listings:
+ add_an_aspect: ""
+ deselect_all: ""
+ edit_aspect: ""
+ select_all: ""
+ aspect_stream:
+ stay_updated_explanation: ""
+ contacts_not_visible: ""
+ contacts_visible: ""
+ create:
+ failure: ""
+ success: ""
+ destroy:
+ failure: ""
+ success: ""
+ edit:
+ aspect_list_is_not_visible: ""
+ aspect_list_is_visible: ""
+ confirm_remove_aspect: ""
+ remove_aspect: ""
+ index:
+ diaspora_id:
+ content_1: ""
+ heading: ""
+ donate: ""
+ handle_explanation: ""
+ help:
+ do_you: ""
+ email_feedback: ""
+ feature_suggestion: ""
+ find_a_bug: ""
+ have_a_question: ""
+ here_to_help: ""
+ tag_bug: ""
+ tag_feature: ""
+ tag_question: ""
+ introduce_yourself: ""
+ new_here:
+ follow: ""
+ learn_more: ""
+ no_contacts: ""
+ no_tags: ""
+ people_sharing_with_you: ""
+ services:
+ content: ""
+ unfollow_tag: ""
+ welcome_to_diaspora: ""
+ new:
+ create: ""
+ name: ""
+ no_contacts_message:
+ or_spotlight: ""
+ try_adding_some_more_contacts: ""
+ you_should_add_some_more_contacts: ""
+ no_posts_message:
+ start_talking: ""
+ one: ""
+ other: ""
+ seed:
+ acquaintances: ""
+ family: ""
+ friends: ""
+ work: ""
+ update:
+ failure: ""
+ success: ""
+ back: ""
+ bookmarklet:
+ explanation: ""
+ heading: "ьфпр"
+ post_something: ""
+ post_success: "лPostedClosing"
+ cancel: "Dala"
+ comments:
+ new_comment:
+ comment: ""
+ commenting: ""
+ one: ""
+ other: ""
+ contacts:
+ create:
+ failure: ""
+ index:
+ start_a_conversation: ""
+ one: ""
+ other: ""
+ sharing:
+ people_sharing: ""
+ delete: "Poz"
+ email: ""
+ error_messages:
+ helper:
+ correct_the_following_errors_and_try_again: ""
+ fill_me_out: ""
+ find_people: ""
+ hide: "Öldür"
+ limited: ""
+ more: ""
+ nsfw: ""
+ ok: "OK"
+ or: "və"
+ password: ""
+ password_confirmation: ""
+ privacy: "Gaga"
+ privacy_policy: "gAG"
+ profile: "Profil"
+ public: ""
+ search: ""
+ settings: "Set"
+ terms_and_conditions: "Terms and Conditions"
+ undo: "Undo?"
+ username: ""
+ welcome: "" \ No newline at end of file
diff --git a/config/locales/diaspora/be.yml b/config/locales/diaspora/be.yml
index 7c6fe3e0f..38982a7b6 100644
--- a/config/locales/diaspora/be.yml
+++ b/config/locales/diaspora/be.yml
@@ -52,8 +52,6 @@ be:
add_to_aspect:
failure: "Памылка пры спробе дадаць кантакты да аспекта."
success: "Кантакты паспяхова дададзены ў аспект."
- aspect_contacts:
- done_editing: "падцвердзіць змены"
aspect_listings:
add_an_aspect: "+ дадаць катыгорыю"
deselect_all: "Ачысціць выбранае"
@@ -68,21 +66,14 @@ be:
failure: "%{name} не пустая і не можа быць выдалена."
success: "%{name} паспяхова выдалена"
edit:
- add_existing: "дадаць існуючы кантакт"
aspect_list_is_not_visible: "спіс катыгорый не бачны для ўсіх"
aspect_list_is_visible: "спіс катыгорый бачны для ўсіх"
confirm_remove_aspect: "ты сапраўды жадаешь выдаліць гэтую катыгорыю?"
- done: "гатова"
make_aspect_list_visible: "зрабіць катакты ў гэтай катыгорыі адкрытымі?"
remove_aspect: "выдаліць катыгорыю"
rename: "перайменаваць"
update: "абнавіць"
updating: "абнаўляю ..."
- few: "%{count} катыгорыі"
- helper:
- are_you_sure: "Сапраўды выдаліць гэты аспект?"
- aspect_not_empty: "Аспект не пусты."
- remove: "Выдаліць"
index:
diaspora_id:
content_1: "твой Diaspora ID:"
@@ -103,11 +94,6 @@ be:
post_a_message: "напісаць паведамленне >>"
unfollow_tag: "больш не сачыць за #%{tag}"
welcome_to_diaspora: "Вітаем ў Diaspora, %{name}!"
- many: "%{count} катыгорыі"
- move_contact:
- error: "Памылка пры пераносе кантакта: %{inspect}"
- failure: "не магчыма %{inspect}"
- success: "Кантакт перанесены да новага аспекта."
new:
create: "Стварыць"
name: "імя (бачна толькі табе)"
@@ -125,13 +111,6 @@ be:
family: "сям'я"
friends: "сябры"
work: "праца"
- selected_contacts:
- manage_your_aspects: "упраўленне катыгорыямі"
- no_contacts: "У цябе тут няма кантактаў."
- view_all_contacts: "паказаць ўсе кантакты"
- show:
- edit_aspect: "змяніць катыгорыі"
- two: "%{count} катыгорыі"
update:
failure: "не магчыма захаваць катыгорыю %{name}, занадта дліная назва."
success: "катыгорыя %{name} была паспяхова выдалена"
@@ -139,10 +118,7 @@ be:
back: "назад"
cancel: "адмяніць"
comments:
- few: "%{count} каментароў"
- many: "%{count} каментароў"
one: "1 каментар"
- two: "%{count} каментары"
zero: "каментароў няма"
contacts:
index:
diff --git a/config/locales/diaspora/bg.yml b/config/locales/diaspora/bg.yml
index 45ff8323d..f2ed7112a 100644
--- a/config/locales/diaspora/bg.yml
+++ b/config/locales/diaspora/bg.yml
@@ -54,8 +54,6 @@ bg:
add_to_aspect:
failure: "Контактът не бе добавен към аспекта."
success: "Контактът е добавен към аспекта."
- aspect_contacts:
- done_editing: "готово"
aspect_listings:
add_an_aspect: "+ Създаване на аспект"
deselect_all: "Никой"
@@ -73,21 +71,14 @@ bg:
failure: "%{name} не е празен, затова не може да бъде изтрит."
success: "%{name} бе изтрит."
edit:
- add_existing: "Добавяне на съществуващ контакт"
aspect_list_is_not_visible: "списъкът на аспекта не е видим за останалите в аспекта"
aspect_list_is_visible: "списъкът на аспекта е видим за останалите в аспекта"
confirm_remove_aspect: "Наистина ли желаете аспектът да бъде премахнат?"
- done: "Готово"
make_aspect_list_visible: "нека контактите в аспекта се виждат един друг"
remove_aspect: "Изтриване на аспекта"
rename: "преименуване"
update: "обнови"
updating: "обновяване"
- few: "%{count} аспекта"
- helper:
- are_you_sure: "Наистина ли желаете аспектът да бъде изтрит?"
- aspect_not_empty: "Аспектът не е празен"
- remove: "премахване"
index:
diaspora_id:
content_1: "Вашият адрес в Diaspora е:"
@@ -120,10 +111,6 @@ bg:
heading: "Свързване към услуги"
unfollow_tag: "Прекратяване следенето на #%{tag}"
welcome_to_diaspora: "Добре дошли в Diaspora, %{name}!"
- many: "%{count} аспекта"
- move_contact:
- error: "Грешка при преместване на контакт: %{inspect}"
- success: "Лицето е преместено в нов аспект"
new:
create: "Създаване"
name: "Име (видимо е само за вас)"
@@ -141,14 +128,6 @@ bg:
family: "Семейство"
friends: "Приятели"
work: "Работа"
- selected_contacts:
- manage_your_aspects: "Управление на аспектите."
- no_contacts: "Все още нямате контакти тук."
- view_all_community_spotlight: "Вижте всички отличени потребители"
- view_all_contacts: "Показване на всички контакти"
- show:
- edit_aspect: "редактиране на аспекта"
- two: "%{count} аспекта"
update:
failure: "Аспектът \"%{name}\" има твърде дълго име. Не може да бъде запаметен."
success: "Аспектът \"%{name}\" е успешно редактиран."
@@ -167,48 +146,37 @@ bg:
post_success: "Публикувано!"
cancel: "Отказ"
comments:
- few: "%{count} коментара"
- many: "%{count} коментара"
new_comment:
comment: "Коментар"
commenting: "Коментиране..."
one: "1 коментар"
other: "%{count} коментара"
- two: "%{count} коментара"
zero: "няма коментари"
contacts:
create:
failure: "Контактът не бе създаден"
- few: "%{count} контакта"
index:
add_a_new_aspect: "Създаване на аспект"
add_to_aspect: "добавете някой от контактите си към \"%{name}\""
all_contacts: "Всички контакти"
- many_people_are_you_sure: "Наистина ли желаете да започнете частен разговор с повече от %{suggested_limit} контакта? Публикация в аспекта е по-подходящ начин за свързване с толкова хора."
my_contacts: "Моите контакти"
no_contacts: "Изглежда трябва да добавите контакти!"
no_contacts_message: "Проверете %{community_spotlight}"
- no_contacts_message_with_aspect: "Проверете %{community_spotlight} или %{add_to_aspect_link}"
only_sharing_with_me: "Само споделящите с мен"
- remove_person_from_aspect: "Премахване на %{person_name} от \"%{aspect_name}\""
start_a_conversation: "Начало на разговор"
title: "Контакти"
your_contacts: "Вашите контакти"
- many: "%{count} контакта"
one: "1 контакт"
other: "%{count} контакта"
sharing:
people_sharing: "Хора споделящи с вас:"
spotlight:
community_spotlight: "В центъра на вниманието"
- two: "%{count} контакта"
zero: "контакти"
conversations:
create:
fail: "Невалидно съобщение"
sent: "Съобщението е изпратено"
- destroy:
- success: "Разговорът е премахнат успешно"
helper:
new_messages:
few: "%{count} нови съобщения"
@@ -424,7 +392,6 @@ bg:
add_contact_from_tag: "добавяне на контакт от марка"
aspect_list:
edit_membership: "принадлежност към аспекти"
- few: "%{count} човека"
helper:
results_for: " резултата за %{params}"
index:
@@ -432,7 +399,6 @@ bg:
no_one_found: "...и никой не е намерен."
no_results: "Хей! Въведете нещо за търсене."
results_for: "резултат от търсенето за"
- many: "%{count} човека"
one: "1 човек"
other: "%{count} човека"
person:
@@ -466,7 +432,6 @@ bg:
add_some: "добавете няколко"
edit: "редактиране"
you_have_no_tags: "не сте добавили марки към профила си!"
- two: "%{count} човека"
webfinger:
fail: "За съжаление %{handle} не може да бъде намерен."
zero: "0 човека"
@@ -718,13 +683,7 @@ bg:
no_message_to_display: "Няма съобщение за изобразяване."
new:
mentioning: "Споменаване на %{person}"
- too_long:
- few: ", моля съкратете съобщението си до %{count} знака"
- many: ", моля съкратете съобщението си до %{count} знака"
- one: ", моля съкратете съобщението си до %{count} знака"
- other: ", моля съкратете съобщението си до %{count} знака"
- two: ", моля съкратете съобщението си до %{count} знака"
- zero: ", моля съкратете съобщението си до %{count} знака"
+ too_long: "{\"few\"=>\", моля съкратете съобщението си до %{count} знака\", \"many\"=>\", моля съкратете съобщението си до %{count} знака\", \"one\"=>\", моля съкратете съобщението си до %{count} знака\", \"other\"=>\", моля съкратете съобщението си до %{count} знака\", \"two\"=>\", моля съкратете съобщението си до %{count} знака\", \"zero\"=>\", моля съкратете съобщението си до %{count} знака\"}"
stream_helper:
hide_comments: "Скриване на коментарите"
show_comments:
@@ -763,7 +722,6 @@ bg:
title: "Публична активност"
tags:
contacts_title: "Хора, които харесват марката"
- tag_prefill_text: "Мисля, че %{tag_name}..."
title: "Публикации маркирани с \"%{tags}\""
tag_followings:
create:
@@ -777,10 +735,7 @@ bg:
show:
follow: "Следете #%{tag}"
following: "Следите #%{tag}"
- nobody_talking: "Никой не е говорил за %{tag}."
none: "Не съществува празна марка!"
- people_tagged_with: "Хора маркирани с %{tag}"
- posts_tagged_with: "Публикации с марка #%{tag}"
stop_following: "Прекратяване следването на #%{tag}"
terms_and_conditions: "Общи условия и правила"
undo: "Отмяна?"
@@ -812,7 +767,6 @@ bg:
comment_on_post: "...някой коментира Ваша публикация?"
current_password: "Текуща парола"
download_photos: "снимките ви"
- download_xml: "данните ви (XML формат)"
edit_account: "Настройки на акаунта"
email_awaiting_confirmation: "Изпратена е връзка за активиране до %{unconfirmed_email}. Докато не я активирате ще бъде ползвана старата ел. поща (%{email})."
export_data: "Сваляне на..."
@@ -820,7 +774,6 @@ bg:
liked: "...някой хареса Ваша публикация?"
mentioned: "...бъдете споменат в публикация?"
new_password: "Нова парола"
- photo_export_unavailable: "За момента свалянето на снимки не е възможно"
private_message: "...получите лично съобщение?"
receive_email_notifications: "Получаване на известие по ел. поща когато..."
reshared: "...някой сподели Ваша публикация?"
diff --git a/config/locales/diaspora/br.yml b/config/locales/diaspora/br.yml
index ed6dd755b..048de98ed 100644
--- a/config/locales/diaspora/br.yml
+++ b/config/locales/diaspora/br.yml
@@ -52,6 +52,9 @@ br:
admins:
admin_bar:
pages: "Pajennoù"
+ pod_stats: "Stadegoù ar pod"
+ user_search: "Klask implijerien"
+ weekly_user_stats: "Stadegoù implijer sizhuniek"
stats:
2weeks: "Pemzektez"
50_most: "50 tikedenn vrudetañ"
@@ -91,8 +94,6 @@ br:
add_to_aspect:
failure: "N'eus ket bet gallet ouzhpennañ an darempred d'ar strollad"
success: "Ouzhpennet eo bet an darempred d'ar strollad ervat"
- aspect_contacts:
- done_editing: "graet ar cheñchamantoù"
aspect_listings:
add_an_aspect: "+ Ouzhpennañ ur strollad"
deselect_all: "Diziuzañ pep tra"
@@ -101,6 +102,7 @@ br:
aspect_stream:
make_something: "Grit un dra bennak"
stay_updated: "Heuliañ an nevezenti"
+ stay_updated_explanation: "O red pennañ a zo peurleugniet gant o darempredoù, o tagoù heuliet, ha dre mesajoù izili zo ar rouedad."
contacts_not_visible: "Ne vo ket gouest an darempredoù er strollad-mañ d'en em welet an eil d'egile."
contacts_visible: "Gouest e vo an darempredoù er strollad-mañ d'en em welet an eil d'egile."
create:
@@ -110,22 +112,14 @@ br:
failure: "%{name} n'eo ket goullo ha ne c'hall ket bezañ diverket"
success: "Diverket eo bet %{name} ervat."
edit:
- add_existing: "Ouzhpennañ un darempred zo anezhañ c'hoazh"
aspect_list_is_not_visible: "N'hall ket darempredoù ar strollad-mañ en em welet"
aspect_list_is_visible: "Gallout a ra darempredoù ar strollad-mañ en em welet"
confirm_remove_aspect: "Ha sur oc'h e fell deoc'h diverkañ ar strollad-mañ ?"
- done: "Graet"
make_aspect_list_visible: "lakaat an holl darempredoù er strollad-mañ d'en em welet ?"
- manage: "Merañ"
remove_aspect: "Diverkañ ar strollad-mañ"
rename: "cheñch an anv"
update: "hizivaat"
updating: "oc'h hizivaat"
- few: "%{count} strollad"
- helper:
- are_you_sure: "Ha sur oc'h e fell deoc'h diverkañ ar strollad-mañ ?"
- aspect_not_empty: "N'eo ket goullo ar strollad-mañ"
- remove: "lemel kuit"
index:
diaspora_id:
content_1: "Setu ho kod anaout evit Diaspora:"
@@ -137,13 +131,18 @@ br:
any_problem: "Ur gudenn bennak?"
contact_podmin: "Kit e darempred gant merour ho pod!"
do_you: "Hag:"
+ email_feedback: "Kasit ur roudenn dre %{link}, ma'z e fell gwelloc'h deoc'h."
email_link: "Postel"
+ feature_suggestion: "... ul %{link} ?"
+ find_a_bug: "... kavet ur %{link} ?"
+ have_a_question: "... ul %{link} ?"
here_to_help: "Izili kumuniezh Diaspora zo aze evit sikour !"
need_help: "Ezhomm skoazell ?"
tag_bug: "#draen"
tag_feature: "#perzh"
tag_question: "#goulenn"
introduce_yourself: "Hemañ eo ar red darvoudoù. Kit e-barzh hag en em ginnigit"
+ keep_pod_running: "Sikourit %{pod} da vont en-dro buan ha prenit banneoù kafe d'ho servijerien gant ur roadenn viziek."
new_here:
follow: "Heuilhit %{link} ha roit an degemer mat d'an implijerien nevez war Diapora*!"
learn_more: "Gouzout hiroc'h"
@@ -157,11 +156,6 @@ br:
heading: "Servijoù kevreañ"
unfollow_tag: "Paouez a heuliañ #%{tag}"
welcome_to_diaspora: "Donemat deoc'h e Diaspora, %{name} !"
- many: "%{count} strollad"
- move_contact:
- error: "Ur fazi zo bet en ur zilec'hiañ an darempred: %{inspect}"
- failure: "Ne'z a ket en-dro %{inspect}"
- success: "Den bet kaset d'ur strollad all"
new:
create: "Krouiñ"
name: "Anv (gwelet ganeoc'h hepken)"
@@ -179,18 +173,16 @@ br:
family: "Familh"
friends: "Mignoned"
work: "Labour"
- selected_contacts:
- manage_your_aspects: "Merañ ho strolladoù"
- no_contacts: "N'hoc'h eus darempred ebet amañ evit poent."
- view_all_contacts: "Gwelet an holl zarempredoù"
- show:
- edit_aspect: "aozañ ar strollad"
- two: "%{count} strollad"
update:
failure: "Re hir eo anv ho strollad, %{name}, evit gallout bezañ enrollet"
success: "Kemmet eo bet ho strollad, %{name}, ervat."
zero: "strollad ebet"
back: "Distreiñ"
+ blocks:
+ create:
+ success: "Mat eo, ne vo ket diskouezet an implijer-mañ war ho red en-dro. #silencio"
+ destroy:
+ success: "Sellomp petra ho deus da lavarout ! #lardemat"
bookmarklet:
explanation: "Postit traoù war diaspora* adalek forzh pelec'h dre lakaat ur sined d'al liamm-mañ => %{link}."
heading: "Sinedoù Diaspora"
@@ -198,39 +190,34 @@ br:
post_success: "Embannet ! O serriñ !"
cancel: "Nullañ"
comments:
- few: "%{count} evezhiadenn"
- many: "%{count} evezhiadenn"
new_comment:
comment: "Evezhiadenn"
commenting: "Oc'h embann..."
one: "1 evezhiadenn"
other: "%{count} evezhiadenn"
- two: "%{count} evezhiadenn"
zero: "evezhiadenn ebet"
contacts:
create:
failure: "Dibosupl krouiñ an darempred"
- few: "%{count} darempred"
index:
add_a_new_aspect: "Ouzhpennañ ur strollad nevez"
add_to_aspect: "Ouzhpennañ darempredoù da %{name}"
- add_to_aspect_link: "ouzhpennañ darempredoù da %{name}"
all_contacts: "An holl zarempredoù"
+ community_spotlight: "Nevezenti ar rouedad"
my_contacts: "Ma darempredoù"
no_contacts: "Evit doare hoc'h eus ezhomm da ouzhpennañ un nebeud darempredoù"
+ no_contacts_message: "Klaskit %{community_spotlight}"
only_sharing_with_me: "O rannañ keleier ganin hepken"
- remove_person_from_aspect: "Lemel %{person_name} kuit diwar %{aspect_name}"
start_a_conversation: "Boulc'hañ ur gaoz"
title: "Darempredoù"
your_contacts: "Ho tarempredoù"
- many: "%{count} darempred"
one: "1 darempred"
other: "%{count} darempred"
sharing:
people_sharing: "Tud a rann keleier ganeoc'h:"
spotlight:
+ community_spotlight: "Nevezenti ar rouedad"
suggest_member: "Kinnig anv un ezel"
- two: "%{count} darempred"
zero: "darempred ebet"
conversations:
conversation:
@@ -238,8 +225,6 @@ br:
create:
fail: "kemennadenn direizh"
sent: "Kemennadenn bet kaset"
- destroy:
- success: "Kaoz diverket ervat"
helper:
new_messages:
one: "1 gemennadenn nevez"
@@ -264,6 +249,11 @@ br:
delete: "diverkañ ha kraouiañ ar gaoz"
reply: "respont"
replying: "O respont..."
+ date:
+ formats:
+ birthday: "%B %d"
+ birthday_with_year: "%B %d %Y"
+ fullmonth_day: "%B %d"
delete: "Diverkañ"
email: "Postel"
error_messages:
@@ -314,6 +304,8 @@ br:
wiki: "wiki"
hide: "Kuzhat"
ignore: "Na ober van"
+ invitation_codes:
+ excited: "%{name} a zo laouen da welet ac'hanoc'h amañ"
invitations:
a_facebook_user: "Un implijer eus Facebook"
check_token:
@@ -322,17 +314,26 @@ br:
already_contacts: "Liammet oc'h ouzh an den-mañ c'hoazh"
already_sent: "Kouviet eo bet an den-mañ ganeoc'h c'hoazh."
empty: "Merkit da nebeutañ ur chomlec'h postel."
+ no_more: "N'ho 'peus pedadenn ebet ken."
own_address: "Ne c'hallit ket kas ur gouviadenn deoc'h-c'hwi hoc'h-unan."
rejected: "Kudennoù zo gant ar chomlec'hioù postel-mañ: "
sent: "Pedadennoù zo bet kaset da: %{emails}"
edit:
accept_your_invitation: "Asantiñ d'ar bedadenn"
+ your_account_awaits: "Ho kont a zo o c'hortoz !"
new:
already_invited: "N'eo ket bet asantet d'ho pedadenn gant an dud-mañ:"
aspect: "Strollad"
+ check_out_diaspora: "Sell 'ta ouzh diaspora* !"
+ codes_left:
+ one: "Chom 'ra %{count} pedadenn war ar c'hod-mañ."
+ other: "Chom 'ra %{count} pedadenn war ar c'hod-mañ."
+ zero: "Ne chom pedadenn ebet ar ar c'hod-mañ ken."
comma_separated_plz: "Gallout a rit merkañ meur a chomlec'h postel dispartiet gant skejoù."
+ if_they_accept_info: "ma vez asantet ganto e vint ouzhpennet d'ar strollad lec'h m'ho peus pedet anezho."
invite_someone_to_join: "Kouviit unan bennak da zont e Diaspora !"
language: "Yezh"
+ paste_link: "Ken-rannit al liamm-se gant ho mignoned evit pediñ aneho war disapora*, pe kasit al liamm dre bostel war-eeun."
personal_message: "Kemennadenn brevez"
resend: "Adkas"
send_an_invitation: "Kas ur bedadenn"
@@ -343,6 +344,7 @@ br:
application:
back_to_top: "Distreiñ e krec'h"
powered_by: "KASET EN-DRO GANT DIASPORA*"
+ public_feed: "Gwazh diaspora* foran evit %{name}"
toggle: "gweredekaat/diweredekaat ar stumm evit an hezougoù"
whats_new: "petra nevez ?"
your_aspects: "ho strolladoù"
@@ -405,6 +407,7 @@ br:
liked: "Plijet"
mark_all_as_read: "Merkit pep tra evel lennet"
mark_read: "Merkañ ar re lennet"
+ mark_unread: "Merkañ evel ket lennet"
mentioned: "Meneget"
notifications: "Kemennoù"
reshared: "Rannet pelloc'h"
@@ -445,14 +448,39 @@ br:
other: "%{actors} zo krog da rannañ traoù ganeoc'h"
zero: "N'eus den ebet %{actors} o rannañ udb. ganeoc'h."
notifier:
+ a_post_you_shared: "ur post"
+ accept_invite: "Asantiñ ho pedadenn diaspora*"
click_here: "klikañ amañ"
+ comment_on_post:
+ reply: "Varienn: %{name}"
confirm_email:
click_link: "Evit gweredekaat ho chomlec'h postel nevez %{unconfirmed_email}, klikit war al liamm-mañ:"
subject: "Gweredekait ho chomlec'h postel nevez %{unconfirmed_email}"
+ email_sent_by_diaspora: "Ar postel-mañ a zo bet kaset gant %{pod_name}. M'ho 'peus c'hoant paouez da gaout posteloù evel-se,"
hello: "Ac'hanta %{name} !"
+ invite:
+ message: |-
+ Demat !
+
+ Pedet oc'h bet da zont war diaspora* !
+
+ Klikit war al liamm-mañ evit kregiñ
+
+ [%{invite_url}][1]
+
+
+ A galon,
+
+ Ar robot posteloù diapsora*
+
+ [1]: %{invite_url}
+ invited_you: "Pedet oc'h bet gant %{name} war diaspora*"
liked:
liked: "plijet eo bet %{name} gant ar pezh zo bet skrivet ganeoc'h"
view_post: "Sellet ouzh an embannadenn >"
+ mentioned:
+ mentioned: "en/he deus meneget ac'hanoc'h en ur post :"
+ subject: "%{name} en/he deus meneget ac'hanoc'h war diaspora*"
private_message:
reply_to_or_view: "Respont pe sellet ouzh ar gaoz-mañ >"
reshared:
@@ -475,22 +503,28 @@ br:
people:
add_contact:
invited_by: "kouviet oc'h bet gant"
- few: "%{count} den"
+ add_contact_small:
+ add_contact_from_tag: "ouzhpennañ un darempred adalek un tag"
+ aspect_list:
+ edit_membership: "kemmañ koumanant ar strollad"
helper:
results_for: " disoc'hoù evit %{params}"
index:
couldnt_find_them: "N'eus ket bet gallet kavout anezho ?"
+ looking_for: "O klask war-lec'h embannadennoù taget gant %{tag_link} emaoc'h ?"
no_one_found: "... ha n'eus ket bet kavet den."
+ no_results: "Hopala ! Ret e deoc'h klask un dra bennak."
+ results_for: "Implijerien o klotañ %{search_term}"
search_handle: "Ober gant ho kod anaout diaspora* (username@pod.tld) evit bezañ sur da gavout ho mignoned."
searching: "O klask, gortozit ur pennadig..."
send_invite: "Netra c'hoazh ? Kas ur bedadenn !"
- many: "%{count} den"
one: "1 den"
other: "%{count} den"
person:
add_contact: "Ouzhpennañ an darempred"
already_connected: "Kevreet c'hoazh"
pending_request: "Rekedoù e-skourr"
+ thats_you: "C'hwi eo !"
profile_sidebar:
bio: "Buhez"
born: "Deiziad ganedigezh"
@@ -502,22 +536,33 @@ br:
remove_contact: "dilemel an darempred"
remove_from: "Dilemel %{name} a-ziwar %{aspect}?"
show:
+ closed_account: "Ar c'hont-mañ a zo bet prenet."
does_not_exist: "An den-mañ n'eus ket anezhañ !"
+ has_not_shared_with_you_yet: "N'eo bet rannet embannadenn ebet ganeoc'h a-berzh %{name}"
+ ignoring: "Ne daolit ket evezh eus holl postoù %{name}"
+ incoming_request: "%{name} n'efe c'hoant eskemm diganit"
mention: "Meneg"
message: "Kemmenadenn"
not_connected: "Ne rannit ket keleier gant an den-mañ"
recent_posts: "Embannadennoù diwezhañ"
+ recent_public_posts: "Embannadennoù Foran Nevez"
return_to_aspects: "Distreiñ da bajenn ho strolladoù"
see_all: "Gwelet pep tra"
start_sharing: "Kregiñ da rannañ keleier gant unan bennak."
+ to_accept_or_ignore: "evit asantiñ pe chom hep teurel evezh."
sub_header:
add_some: "ouzhpennañ"
edit: "kemmañ"
- two: "%{count} den"
+ you_have_no_tags: "N'ho peus tag ebet!"
webfinger:
fail: "Siwazh, n'omp ket bet evit kavout %{handle}."
zero: "den ebet"
photos:
+ comment_email_subject: "Skeudenn %{name}"
+ create:
+ integrity_error: "C'hwitet war kargadenn ar skeudenn. Sur oc'h eo ur skeudenn ?"
+ runtime_error: "C'hwitet war kargadenn ar skeudenn. Sur oc'h eo staget ho kouriz surentez ?"
+ type_error: "C'hwitet war kargadenn ar skeudenn. Sur oc'h bezañ bet ouzhpennet ur skeudenn ?"
destroy:
notice: "Dilamet eo bet ar skeudenn"
edit:
@@ -526,34 +571,45 @@ br:
back_to_list: "Distreiñ d'ar roll"
new_photo: "Skeudenn nevez"
post_it: "embann !"
+ 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:
+ or_select_one_existing: "pe diuzit unan a zo diouti %{photos}"
upload: "Kargit ur poltred nevez evit ho profil !"
photo:
view_all: "sellet ouzh holl skeudennoù %{name}"
show:
+ collection_permalink: "peurliamm an dastumad"
delete_photo: "Lemel ar skeudenn kuit"
edit: "kemmañ"
edit_delete_photo: "Kemmañ deskrivadenn ar skeudenn/ dilemel ar skeudenn"
make_profile_photo: "lakaat da boltred"
+ show_original_post: "Diskouez an embannadenn orin"
update_photo: "Hizivaat ar skeudenn"
update:
+ error: "C'hwitet war kemmadur ar skeudenn."
notice: "Skeudenn bet hizivaet ervat."
posts:
presenter:
title: "Un embannadenn a-berzh %{name}"
show:
destroy: "Diverkañ"
+ not_found: "Digarezit, n'eo ket bet kavet an embannadenn."
permalink: "peurliamm"
photos_by:
one: "Ur skeudenn gant %{author}"
other: "%{count} skeudenn gant %{author}"
zero: "Skeudenn ebet gant %{author}"
+ reshare_by: "Adrannet gant %{author}"
previous: "kent"
privacy: "Prevezded"
privacy_policy: "Reolennoù prevezded"
profile: "Profil"
profiles:
edit:
+ allow_search: "Aotren tud da glask ac'hanoc'h war diaspora*"
edit_profile: "Kemmañ ar profil"
first_name: "Anv-bihan"
last_name: "Anv-familh"
@@ -570,6 +626,7 @@ br:
your_tags: "Deskrivit ac'hanoc'h gant 5 ger"
your_tags_placeholder: "evel #sinema #farsus #loened #Breizh #dudioù"
update:
+ failed: "C'hwitet hizivadenn ar brofil"
updated: "Patrom nevesaet"
public: "A-wel d'an holl"
reactions:
@@ -577,6 +634,9 @@ br:
other: "%{count} respont"
zero: "0 respont"
registrations:
+ closed: "Stanket eo an enskrivadur war ar pod diaspora*-mañ"
+ create:
+ success: "Enskrivet oc'h war diaspora* !"
edit:
cancel_my_account: "Nullañ ma c'hont"
edit: "Kemmañ %{name}"
@@ -584,16 +644,14 @@ br:
password_to_confirm: "(rekis eo ho ker-tremen evit kadarnaat ar cheñchamantoù)"
unhappy: "Displijet ?"
update: "Hizivaat"
+ invalid_invite: "Al liamm pedadenn roet ganeoc'h n'eo ket mat ken"
new:
- continue: "Kenderc'hel"
create_my_account: "Krouiñ ma c'hont !"
- diaspora: "<3 diaspora*"
email: "POSTEL"
enter_email: "Skrivit ur postel"
enter_password: "Merkit ur ger-tremen (c'hwec'h arouezenn da nebeutañ)"
enter_password_again: "Skrivit an hevelep ger-tremen hag a-raok"
enter_username: "Dibabit un anv-implijer (lizherennoù, niverennoù hag isvarrennoù nemetken)"
- hey_make: "AC'HANTA,<br/>GRIT<br/>UN DRA BENNAK."
join_the_movement: "Kemerit perzh !"
password: "GER-TREMEN"
password_confirmation: "KADARNAAT AR GER-TREMEN"
@@ -604,17 +662,27 @@ br:
requests:
create:
sending: "O kas"
+ sent: "Goulennet ho peus rannan traoù gant %{name}. Gwelet a raio-se ar wech o tont ma kennasko da diaspora*."
destroy:
+ error: "Diuzit ur strollad mar plij !"
+ ignore: "Chom hep ober van eus ar goulenn darempred"
success: "Mignoned oc'h bremañ."
helper:
new_requests:
one: "Reked nevez !"
other: "%{count} reked nevez !"
zero: "Reked nevez ebet"
+ manage_aspect_contacts:
+ existing: "Darempredoù a zo diouto"
+ manage_within: "Merañ an darempredoù e"
new_request_to_person:
sent: "kaset !"
reshares:
+ comment_email_subject: "Adrannadenn %{resharer} eus embannadenn %{author}"
+ create:
+ failure: "Ur gudenn a zo bet en ur adrannañ an embannadenn."
reshare:
+ deleted: "Embannadenn orin diverket gant an aozer."
reshare:
one: "1 Adrannadenn"
other: "%{count} Adrannadenn"
@@ -625,25 +693,47 @@ br:
show_original: "Diskouez ar stumm orin"
search: "Klask"
services:
+ create:
+ already_authorized: "Un implijer gant an id diaspora %{diaspora_id} en deus aotreet ar c'hont %{service_name} dija."
+ failure: "C'hwitet war ar c'hennask"
+ success: "Kennasket gant berzh"
+ destroy:
+ success: "Diverket ar c'hennask gant berzh."
+ failure:
+ error: "Ur gudenn a zo bet en ur c'hennaskan ar servij"
+ finder:
+ fetching_contacts: "diaspora* a zo o poblekat ho mignoned %{service}, deuit en-dro en un nebeud munutennoù mar plij"
+ no_friends: "Mignoned Facebook ebet kavet"
+ service_friends: "Mignoned %{service}"
index:
connect_to_facebook: "Kevreañ ouzh Facebook"
connect_to_tumblr: "Kevreañ ouzh Tumblr"
connect_to_twitter: "Kevreañ ouzh Twitter"
connect_to_wordpress: "Kevreañ ouzh Wordpress"
disconnect: "digevreañ"
+ edit_services: "Kemmañ ar servijoù"
logged_in_as: "kevreet evel"
+ no_services: "N'ho peus kennasket servij ebet evit ar mare"
really_disconnect: "digevreañ diouzh %{service} ?"
inviter:
click_link_to_accept_invitation: "Klikañ war al liamm-mañ evit asantiñ d'ar bedadenn"
+ join_me_on_diaspora: "Deus ganin war diaspora*"
remote_friend:
invite: "kouviañ"
+ not_on_diaspora: "N'eo ket c'hoazh war diaspora*"
resend: "adkas"
settings: "Arventennoù"
+ share_visibilites:
+ update:
+ post_hidden_and_muted: "Embannadenn %{name} az o bet kuzhet, hag ar c'hemennoù a zo bet mutet."
+ see_it_on_their_profile: "M'ho 'peus c'hoant gwelet hizivadennoù war ar bajenn-mañ, kit da weladenniñ profil %{name}"
shared:
add_contact:
add_new_contact: "Ouzhpennañ un darempred nevez"
create_request: "Kavout dre kod anaout Diaspora"
diaspora_handle: "diaspora@handle.org"
+ enter_a_diaspora_username: "Enlakait ul lesanv diaspora*:"
+ know_email: "Anavezout a rit o chomlec'h postel ? Ret vefe deoc'h pedin anezhe"
your_diaspora_username_is: "Setu hoc'h anv-implijer war Diaspora: %{diaspora_handle}"
aspect_dropdown:
add_to_aspect: "Ouzhpennañ an darempred"
@@ -658,20 +748,34 @@ br:
your_aspects: "ho strolladoù"
invitations:
by_email: "Dre bostel"
+ dont_have_now: "N'ho 'peus hini ebet er mare-mañ, met bez ez eus muioc'h a bedadennoù o tont !"
from_facebook: "Diwar Facebook"
invitations_left: "(%{count} a chom deoc'h)"
invite_someone: "Pediñ unan bennak"
invite_your_friends: "Pediñ mignoned"
invites: "Pedadennoù"
+ invites_closed: "Ar pedadennoù a zo prenet evit ar mare war ar pod diaspora*-mañ"
+ notification:
+ new: "%{type} nevez a-berzh %{from}"
public_explain:
+ atom_feed: "Gwazh atom"
+ control_your_audience: "Mestroniit ho heklev"
+ logged_in: "kennasket da %{service}"
+ manage: "Merañ ar servijoù kennasket"
+ new_user_welcome_message: "Implijit #hashtags evit rummadiñ ho embannadennoù ha kavout tud a rann ho dedennoù. Galvit tud dreist gant @Mentions"
+ outside: "Ar c'hemennadennoù foran a vo gwelet gant tud e diavaez diaspora*."
share: "Rannañ"
title: "Arventenniñ ar servijoù kevreet"
+ visibility_dropdown: "Implijit ar roll disachañ evit kemmañ gwelusted ho embannadenn. (Aliañ a reomp deoc'h da lakaat an hini kentañ-mañ foran.)"
publisher:
all: "an holl"
all_contacts: "an holl zarempredoù"
+ discard_post: "Nullan an embannadenn"
make_public: "diskouez d'an holl"
new_user_prefill:
+ hello: "Demat d'an holl, me zo %{new_user_tag}. "
i_like: "Dedennet on gant %{tags}. "
+ invited_by: "Trug' evit ar bedadenn, "
newhere: "NevezAmañ"
poll:
add_a_poll: "Ouzhpennañ ur votadeg"
@@ -682,20 +786,27 @@ br:
post_a_message_to: "Skrivañ ur gemennadenn da %{aspect}"
posting: "Oc'h embann..."
preview: "Rakwel"
+ publishing_to: "embann da : "
remove_location: "Lemel kuit al lec'hiadur"
share: "Kenrannañ"
share_with: "rannañ gant"
+ upload_photos: "Pellgargañ skeudennoù"
whats_on_your_mind: "E petra emaoc'h o soñjal ?"
reshare:
reshare: "Rannañ pelloc'h"
stream_element:
+ connect_to_comment: "Kennaskit gant an implijer-mañ evit lakaat evezhiadennoù war e embannadennoù"
+ currently_unavailable: "n'eus ket tu lakaat evezhiadennoù evit ar mare"
dislike: "Displijus"
hide_and_mute: "Kuzhat ha lakaat da devel"
like: "Plijus"
+ nsfw: "An embannadenn-mañ a zo bet merket NSFW gant e aozer. %{link}"
shared_with: "Rannet gant: %{aspect_names}"
show: "diskouez"
unlike: "Displijus"
via: "dre %{link}"
+ via_mobile: "dre pellgomzer"
+ viewable_to_anyone: "An embannadenn-mañ a c'hell bezañ gwelet gant an holl dud war ar web"
simple_captcha:
label: "Merkañ ar c'hod er voest:"
message:
@@ -704,12 +815,15 @@ br:
user: "Disheñvel e oa ar skeudenn guzh diouzh ar c'hod"
placeholder: "Merkañ talvoud ar skeudenn"
status_messages:
+ create:
+ success: "Meneget gant berzh : %{names}"
+ destroy:
+ failure: "C'hwitet en ur diverkañ an embannadenn"
helper:
no_message_to_display: "Kemennadenn ebet da ziskouez."
- too_long:
- one: "Lezit ho kemennadennoù statud dindan %{count}"
- other: "Lezit ho kemennadennoù statud dindan %{count}"
- zero: "Lezit ho kemennadennoù statud dindan %{count}"
+ new:
+ mentioning: "Menegiñ : %{person}"
+ too_long: "{\"one\"=>\"Lezit ho kemennadennoù statud dindan %{count}\", \"other\"=>\"Lezit ho kemennadennoù statud dindan %{count}\", \"zero\"=>\"Lezit ho kemennadennoù statud dindan %{count}\"}"
stream_helper:
hide_comments: "Kuzhat an holl evezhiadennoù"
show_comments:
@@ -717,24 +831,41 @@ br:
other: "Diskouez %{count} evezhiadenn ouzhpenn"
zero: "evezhiadenn all ebet"
streams:
+ activity:
+ title: "Ma obererezh"
aspects:
title: "Ma strolladoù"
aspects_stream: "Strolladoù"
+ comment_stream:
+ contacts_title: "Tud lakaet evezhiadennoù war o embannadennoù"
+ title: "Embannadennoù lakaet evezhiadennoù warno"
+ community_spotlight_stream: "Nevezenti ar rouedad"
followed_tag:
add_a_tag: "Ouzhpennañ un dikedenn"
+ contacts_title: "Tud a gav bourrus an tagoù-se"
follow: "Heuliañ"
title: "#Tikedennoù heuliet"
+ followed_tags_stream: "#Tagoù heuliet"
+ like_stream:
+ contacts_title: "Tud gant embannadennoù a blij deoc'h"
+ title: "Red plijus"
mentioned_stream: "@Menegoù"
mentions:
contacts_title: "Tud oc'h bet meneget ganto"
title: "@Menegoù"
multi:
+ contacts_title: "Tud en ho red darvoudoù"
title: "Red keleier"
+ public:
+ contacts_title: "Embannerien nevez"
+ title: "Obererezh Foran"
tags:
contacts_title: "Tud o deus klasket an dikedenn-mañ"
+ title: "Embannadennoù merket : %{tags}"
tag_followings:
create:
failure: "C'hwitet eo bet heuliañ: #%{name}... Heuliañ a rit anezhañ c'hoazh ?"
+ none: "N'eus ket tu deoc'h heuliañ un tag goulo !"
success: "Brav, emaoc'h oc'h heuliañ: #%{name}"
destroy:
failure: "C'hwitet eo bet paouez da heuliañ: #%{name}. Ha n'ho poa ket paouezet d'e heuliañ c'hoazh ?"
@@ -742,13 +873,9 @@ br:
tags:
show:
follow: "Heuliañ #%{tag}"
- followed_by_people:
- one: "heuliet gant un den"
- other: "heuliet gant %{count} den"
- zero: "heuliet gant den"
- nobody_talking: "N'eus den o kaozeal diwar-benn %{tag} c'hoazh."
- people_tagged_with: "Tud bet merket gant %{tag}"
- posts_tagged_with: "Skridoù bet merket gant #%{tag}"
+ following: "Oc'h heuliañ #%{tag}"
+ none: "An tag goulo n'eus ket dioutañ !"
+ stop_following: "Paouez da heuliañ #%{tag}"
terms_and_conditions: "Termenoù ha diferadoù"
undo: "Dizober ?"
username: "Anv-implijer"
@@ -756,7 +883,13 @@ br:
confirm_email:
email_confirmed: "Postel %{email} gweredekaet"
email_not_confirmed: "N'eus ket bet gallet gweredekaat ar chomlec'h. Liamm a-dreuz ?"
+ destroy:
+ no_password: "Enlakait ho ger-kuzh evit prennañ ho kont, mar plij ganeoc'h."
+ success: "Prennet eo bet ho kont. Gellout 'ra kemer un 20 munutenn bennak evit echuiñ ar c'hlozadur. Trugarez deoc'h evit bezañ bet klasket diaspora*."
+ wrong_password: "Ar ger-kuzh bet enlakaet n'eo ket an hini ho 'peus bremañ."
edit:
+ also_commented: "unan bennak a lak evezhiadennoù war un embannadenn lec'h m'ho peus lakaet un evezhiadenn"
+ auto_follow_aspect: "Strollad evit an darempredoù ouzhpennet ez emgefreek"
auto_follow_back: "Rannañ ent emgefre gant an implijerien a grog da rannañ traoù ganeoc'h."
change: "Cheñch"
change_email: "Cheñch postel"
@@ -764,18 +897,42 @@ br:
change_password: "Cheñch ger-tremen"
character_minimum_expl: "a rank bezañ ennañ c'hwec'h arouezenn da vihanañ"
close_account:
+ dont_go: "Hep, n'it ket kuit mar plij !"
+ if_you_want_this: "M'ho 'peus c'hoant e c'hoarvezfe da vat, enlakait ho ger-kuzh dindan ha klikit war \"Prenañ ar gont\""
+ lock_username: "Ho anv implijer a vo stanket. Ne vo ket tu deoc'h krouiñ ur gont nevez war ar pod-mañ gant an hevelep anv."
+ locked_out: "Digennasket ha stanket e vo ho gont betek ma vo diverket"
+ make_diaspora_better: "C'hoant hon eus diadpora* da vezañ gwelloc'h, neuze vefe ret deoc'h sikour ac'hanomp e plas mont kuit. M'ho 'peus c'hoant mont kuit, c'hoant hon eus ouifec'h petra c'hoarvezo goude"
+ mr_wiggles: "Aotrou Wiggles a vo trist gwelet ac'hanoc'h o vont kuit"
+ no_turning_back: "N'eus ket tu nullañ ! Ma 'z oc'h sur da vat, enlakait ho ger-kuzh dindan."
what_we_delete: "Diverket e vo hoc'h embannadennoù hag ho roadennoù profil ken buan ha ma vo posupl en ober. Kavet e vo c'hoazh hoc'h evezhiadennoù strewet amañ hag ahont met stag e vint hiviziken ouzh ho kod anaout Diaspora ha n'eo ket mui ouzh hoc'h anv."
close_account_text: "Klozañ ar gont"
+ comment_on_post: "unan bennak n'eus lakaet un evezhadenn war ho embannadenn"
current_password: "Ho ker-tremen"
+ current_password_expl: "an hini a zo implijet ganeoc'h evit kennaskañ"
download_photos: "pellgargañ ma skeudennoù"
- download_xml: "pellgargañ ma xml"
edit_account: "Kemmañ ar gont"
email_awaiting_confirmation: "Kaset ez eus bet deoc'h ul liamm gweredekaat %{unconfirmed_email}. E-keit ha na vo ket heuliet al liamm-se ha gweredekaet ar chomlec'h nevez ganeoc'h e kendalc'himp da ober gant ho chomlec'h kozh %{email}."
+ export_data: "Ezporzhiañ roadennoù"
+ following: "Arventennoù ar rannadennoù"
+ getting_started: "Arventennoù an implijerien nevez"
+ liked: "unan bennak a zo plijet gant o embannadenn"
+ mentioned: "meneget oc'h en un embannadenn"
new_password: "Ger-tremen nevez"
+ private_message: "resevet ho peus ur gemennadenn prevez"
+ receive_email_notifications: "Resevout kemennoù postel pa"
+ reshared: "unan bennak a adrann ho embannadenn"
+ started_sharing: "unan bennak a grog da rannañ traoù ganeoc'h"
+ stream_preferences: "Dibarzhioù ar gwazh"
your_email: "Ho postel"
your_handle: "Ho kod anaout diaspora"
getting_started:
+ awesome_take_me_to_diaspora: "Dispar ! Kas ac'hanon betek diaspora*"
+ community_welcome: "kumuniezh diaspora* a zo laouen da zegemer ac'hanoc'h !"
+ hashtag_explanation: "Gant an hashtags ez eus tu deoc'h eskemm hag heuliañ ar pezh a zedenn ac'hanoc'h. Un doare dreist da gavout tud nevez war diaspora* eo ivez."
+ hashtag_suggestions: "Klaskit heuliañ klavioù evel #arz, #filmoù, #gif, h.a."
saved: "Enrollet !"
+ well_hello_there: "Hey, demat deoc'h !"
+ what_are_you_in_to: "Petra blij deoc'h ?"
who_are_you: "Piv oc'h-c'hwi ?"
privacy_settings:
title: "Arventennoù prevezded"
@@ -793,6 +950,12 @@ br:
settings_updated: "Nevesaet an arventennoù"
unconfirmed_email_changed: "Cheñchet eo ar chomlec'h postel. Rekis eo gweredekaat."
unconfirmed_email_not_changed: "C'hwitet eo bet ar cheñchamant chomlec'h postel"
+ webfinger:
+ fetch_failed: "N'eus ket bet tu resevout ar profil webfinger evit %{profile_url}"
+ hcard_fetch_failed: "Ur gudenn a zo bet en ur resevout an hcard evit %{account}"
+ no_person_constructed: "N'eus ket bet tu da sevel un den adalek an hcard-mañ"
+ not_enabled: "war a-seblant n'eo ket gweredekaet webfinger evit ostiz %{account}"
+ xrd_fetch_failed: "Ur gudenn a zo bet en ur resevout an xrd evir ar gont %{account}"
welcome: "Donemat deoc'h !"
will_paginate:
next_label: "war-lerc'h &laquo;"
diff --git a/config/locales/diaspora/bs.yml b/config/locales/diaspora/bs.yml
index 1a206fecd..7f97cf356 100644
--- a/config/locales/diaspora/bs.yml
+++ b/config/locales/diaspora/bs.yml
@@ -96,7 +96,8 @@ bs:
one: "%{count} korisnik pronađen"
other: "%{count} korisnika pronađeno"
zero: "%{count} korisnika pronađeno"
- you_currently: "trenutno imate %{user_invitation} pozivnice preostale %{link}"
+ you_currently:
+ other: "trenutno imate %{user_invitation} pozivnice preostale %{link}"
weekly_user_stats:
amount_of:
few: "količina novih korisnika ove sedmice: %{count}"
@@ -123,8 +124,6 @@ bs:
add_to_aspect:
failure: "Neuspješno dodavanje kontakta u aspekt."
success: "Uspješno dodavanje kontakta u aspekt."
- aspect_contacts:
- done_editing: "gotovo uređivanje"
aspect_listings:
add_an_aspect: "+ Dodaj jedan aspekt"
deselect_all: "Odznači sve"
@@ -143,21 +142,14 @@ bs:
failure: "%{name} nije prazno i ne može biti uklonjeno."
success: "%{name} je uspješno uklonjeno."
edit:
- add_existing: "Dodaj jedan postojeći kontakt"
aspect_list_is_not_visible: "lista aspekata je sakrivena od drugih u aspektu"
aspect_list_is_visible: "lista aspekata je vidljiva od drugih u aspektu"
confirm_remove_aspect: "Jeste li sigurni da želite izbrisati ovaj aspekt?"
- done: "Gotovo"
make_aspect_list_visible: "učini kontakte u ovom aspektu vidljive jedan drugome?"
remove_aspect: "Izbriši ovaj aspekt"
rename: "preimenuj"
update: "ažuriraj"
updating: "ažuriram"
- few: "%{count} aspekata"
- helper:
- are_you_sure: "Jeste li sigurni da želite izbrisati ovaj aspekt?"
- aspect_not_empty: "Aspekti nisu prazni"
- remove: "ukloni"
index:
diaspora_id:
content_1: "Vaš Diaspora ID je:"
@@ -198,11 +190,6 @@ bs:
heading: "Servisi Povezivanja"
unfollow_tag: "Prestani slijediti #%{tag}"
welcome_to_diaspora: "Dobrodošli na Diasporu, %{name}!"
- many: "%{count} aspekata"
- move_contact:
- error: "Greška pomjeranja kontakta: %{inspect}"
- failure: "nije uspjelo %{inspect}"
- success: "Osoba pomjerena u novi aspekt"
new:
create: "Kreiraj"
name: "Ime (vidljivo samo vama)"
@@ -220,14 +207,6 @@ bs:
family: "Porodica"
friends: "Prijatelji"
work: "Posao"
- selected_contacts:
- manage_your_aspects: "Upravljaj svoje aspekte."
- no_contacts: "Još uvijek nemate nikakvih kontakata."
- view_all_community_spotlight: "Pogledaj sve što je u centru pažnje"
- view_all_contacts: "Pogledaj sve kontakte"
- show:
- edit_aspect: "uredi aspekt"
- two: "%{count} aspekta"
update:
failure: "Vaš aspekt, %{name}, ima predugo ime da bi se snimilo."
success: "Vaš aspekt, %{name}, je uspješno uređen."
@@ -247,36 +226,27 @@ bs:
post_success: "Objavljeno! Zatvaram!"
cancel: "Otkaži"
comments:
- few: "%{count} komentara"
- many: "%{count} komentara"
new_comment:
comment: "Komentar"
commenting: "Komentarišem..."
one: "1 komentar"
other: "%{count} komentari"
- two: "%{count} komentara"
zero: "nema komentara"
contacts:
create:
failure: "Neuspješno kreiranje kontakta"
- few: "%{count} kontakata"
index:
add_a_new_aspect: "Dodaj novi aspekt"
add_to_aspect: "dodaj kontakte za %{name}"
- add_to_aspect_link: "dodaj kontakte za %{name}"
all_contacts: "Svi Kontakti"
community_spotlight: "U Centru Pažnje"
- many_people_are_you_sure: "Jeste li sigurni da želite pokrenuti privatni razgovor sa više od %{suggested_limit} kontakata? Objavljivanje na ovaj aspekt je možda bolji način da ih kontaktirate."
my_contacts: "Moji Kontakti"
no_contacts: "Izgleda kao morate dodati neke kontakte!"
no_contacts_message: "Probajte %{community_spotlight}"
- no_contacts_message_with_aspect: "Probajte %{community_spotlight} ili %{add_to_aspect_link}"
only_sharing_with_me: "Samo dijele sa mnom"
- remove_person_from_aspect: "Ukloni %{person_name} iz \"%{aspect_name}\""
start_a_conversation: "Započni razgovor"
title: "Kontakti"
your_contacts: "Vaši Kontakti"
- many: "%{count} kontakata"
one: "1 kontakt"
other: "%{count} kontakti"
sharing:
@@ -284,7 +254,6 @@ bs:
spotlight:
community_spotlight: "U Centru Pažnje"
suggest_member: "Preporuči člana"
- two: "%{count} kontakta"
zero: "kontakti"
conversations:
conversation:
@@ -293,8 +262,6 @@ bs:
fail: "Nevažeća poruka"
no_contact: "Hej, morate prvo dodati kontakt!"
sent: "Poruka poslata"
- destroy:
- success: "Razgovor uspješno uklonjen"
helper:
new_messages:
few: "%{count} novih poruka"
@@ -617,7 +584,6 @@ bs:
add_contact_from_tag: "dodaj kontakt sa oznake"
aspect_list:
edit_membership: "uredi članstvo aspekta"
- few: "%{count} ljudi"
helper:
is_not_sharing: "%{name} ne dijeli s vama"
is_sharing: "%{name} dijeli s vama"
@@ -628,7 +594,6 @@ bs:
no_results: "Hej! Trebate tražiti nešto."
results_for: "rezultati pretrage za"
searching: "pretraživanje, molimo budite strpljivi"
- many: "%{count} ljudi"
one: "1 osoba"
other: "%{count} ljudi"
person:
@@ -665,7 +630,6 @@ bs:
add_some: "dodajte neke"
edit: "uredi"
you_have_no_tags: "nemate oznaka!"
- two: "%{count} ljudi"
webfinger:
fail: "Izvinite, nisamo mogli pronaći %{handle}."
zero: "nema ljudi"
@@ -761,15 +725,12 @@ bs:
update: "Ažuriraj"
invalid_invite: "Veza pozivnice koji ste obezbijedili više nije važeća!"
new:
- continue: "Nastavi"
create_my_account: "Kreiraj moj račun!"
- diaspora: "<3 diaspora*"
email: "EMAIL"
enter_email: "Unesite email"
enter_password: "Unesite šifru (šest karaktera minimalno)"
enter_password_again: "Unesite istu šifru kao i maloprije"
enter_username: "Izaberite korisničko ime (samo slova, brojevi i podcrte)"
- hey_make: "HEJ, <br/>UČINI<br/>NEŠTO."
join_the_movement: "Pridružite se pokretu!"
password: "ŠIFRA"
password_confirmation: "POTVRDA ŠIFRE"
@@ -937,12 +898,7 @@ bs:
no_message_to_display: "Nema poruka za prikaz."
new:
mentioning: "Spominje %{person}"
- too_long:
- few: "molimo da vaše poruke statusa sadrže manje nego %{count} karaktera"
- many: "molimo da vaše poruke statusa sadrže manje nego %{count} karaktera"
- one: "molimo da vaše poruke statusa sadrže manje nego %{count} karakter"
- other: "molimo da vaše poruke statusa sadrže manje nego %{count} karaktera"
- zero: "molimo da vaše poruke statusa sadrže manje nego %{count} karaktera"
+ too_long: "{\"few\"=>\"molimo da vaše poruke statusa sadrže manje nego %{count} karaktera\", \"many\"=>\"molimo da vaše poruke statusa sadrže manje nego %{count} karaktera\", \"one\"=>\"molimo da vaše poruke statusa sadrže manje nego %{count} karakter\", \"other\"=>\"molimo da vaše poruke statusa sadrže manje nego %{count} karaktera\", \"zero\"=>\"molimo da vaše poruke statusa sadrže manje nego %{count} karaktera\"}"
stream_helper:
hide_comments: "Sakrij sve komentare"
show_comments:
@@ -982,7 +938,6 @@ bs:
title: "Javna Aktivnost"
tags:
contacts_title: "Ljudi kojima se ova oznaka sviđa"
- tag_prefill_text: "Stvar oko %{tag_name} je... "
title: "Objave označene: %{tags}"
tag_followings:
create:
@@ -996,10 +951,7 @@ bs:
show:
follow: "Prati #%{tag}"
following: "Pratim #%{tag}"
- nobody_talking: "Niko još ne razgovara o %{tag}"
none: "Prazna oznaka ne postoji!"
- people_tagged_with: "Ljudi označeni sa %{tag}"
- posts_tagged_with: "Objave označene sa #%{tag}"
stop_following: "Zaustavi Praćenje #%{tag}"
terms_and_conditions: "Uvjeti i Stanja"
undo: "Poništi?"
@@ -1035,7 +987,6 @@ bs:
current_password: "Trenutna šifra"
current_password_expl: "ona s kojom se prijavljujete..."
download_photos: "preuzmi moje fotografije"
- download_xml: "preuzmi moj xml"
edit_account: "Uredi račun"
email_awaiting_confirmation: "Poslali smo aktivacijsku vezu na %{unconfirmed_email}. Dok ne budete pratili ovu objavu i aktivirali novu adresu, nastavit ćemo koristiti vašu originalnu adresu %{email}."
export_data: "Izvezi Podatke"
@@ -1044,7 +995,6 @@ bs:
liked: "...se nekome sviđa vaša objava?"
mentioned: "...vas neko spomene u objavi?"
new_password: "Nova šifra"
- photo_export_unavailable: "Izvoz fotografija trenutno nedostupan."
private_message: "...primite privatnu poruku?"
receive_email_notifications: "Primite email obavijesti kada..."
reshared: "...neko ponovo dijeli vašu objavu?"
diff --git a/config/locales/diaspora/cs.yml b/config/locales/diaspora/cs.yml
index b55d3764f..aa43a90aa 100644
--- a/config/locales/diaspora/cs.yml
+++ b/config/locales/diaspora/cs.yml
@@ -12,6 +12,8 @@ cs:
_home: "Domů"
_photos: "fotky"
_services: "Služby"
+ _statistics: "Statistiky"
+ _terms: "pojmy"
account: "Účet"
activerecord:
errors:
@@ -24,6 +26,14 @@ cs:
attributes:
diaspora_handle:
taken: "je již obsazen."
+ poll:
+ attributes:
+ poll_answers:
+ not_enough_poll_answers: "Anketa nemá dostatek možností na výběr."
+ poll_participation:
+ attributes:
+ poll:
+ already_participated: "Této ankety jste se již účastnil."
request:
attributes:
from_id:
@@ -46,6 +56,7 @@ cs:
correlations: "Korelace"
pages: "Stránky"
pod_stats: "Statistiky podu"
+ report: "Nahlášení"
sidekiq_monitor: "Monitor Sidekiq"
user_search: "Hledat uživatele"
weekly_user_stats: "Týdenní uživatelské statistiky"
@@ -61,7 +72,7 @@ cs:
zero: "žádný komentář"
current_segment: "Současný segment má v průměru <b>%{post_yest}</b> příspěvků na uživatele, od <b>%{post_day}</b>"
daily: "Denní"
- display_results: "Zobrazují se výsedky z segmentu <b>%{segment}</b>"
+ display_results: "Zobrazují se výsledky ze segmentu <b>%{segment}</b>"
go: "přejít"
month: "Měsíční"
posts:
@@ -82,8 +93,28 @@ cs:
other: "%{count} uživatelů"
zero: "žádný uživatel"
week: "Týdenní"
+ user_entry:
+ account_closed: "účet zrušen"
+ diaspora_handle: "Diaspora ID"
+ email: "E-mail"
+ guid: "GUID"
+ id: "ID"
+ last_seen: "Naposledy navštíveno"
+ ? "no"
+ : ne
+ nsfw: "#nsfw"
+ unknown: "neznámé"
+ ? "yes"
+ : ano
user_search:
+ account_closing_scheduled: "Účet uživatele %{name} bude uzavřen. Prosím, vyčkejte."
+ account_locking_scheduled: "Účet uživatele %{name} bude uzamknut. Prosím, vyčkejte."
+ account_unlocking_scheduled: "Účet uživatele %{name} bude odemknut. Prosím, vyčkejte."
add_invites: "přidat pozvánky"
+ are_you_sure: "Jste si jist/á, že tento účet chcete zrušit ?"
+ are_you_sure_lock_account: "Určitě chcete uzamknout tento účet ?"
+ are_you_sure_unlock_account: "Určitě chcete odemknout teto účet ?"
+ close_account: "zrušit účet"
email_to: "E-mailová adresa, kterou chcete pozvat"
under_13: "Zobrazit uživatele mladší 13 let (COPPA)"
users:
@@ -91,6 +122,7 @@ cs:
one: "Nalezen jeden uživatel"
other: "Nalezeno %{count} uživatelů"
zero: "Žádný uživatel nenalezen"
+ view_profile: "prohlédnout si profil"
you_currently:
few: "zbývají vám %{count} pozvánky %{link}"
one: "zbývá vám jediná pozvánka %{link}"
@@ -121,8 +153,6 @@ cs:
add_to_aspect:
failure: "Přidání kontaktu do aspektu selhalo."
success: "Kontakt byl úspěšně přidán do aspektu."
- aspect_contacts:
- done_editing: "ukončit úpravy"
aspect_listings:
add_an_aspect: "+ Přidat aspekt"
deselect_all: "Zrušit výběr"
@@ -141,28 +171,25 @@ cs:
failure: "%{name} není prázdný a nemůže být odstraněn."
success: "%{name} byl úspěšně odebrán."
edit:
- add_existing: "Přidat existující kontakt"
+ aspect_chat_is_enabled: "Kontakty v tomto aspektu s Vámi mohou chatovat."
+ aspect_chat_is_not_enabled: "Kontakty v tomto aspektu s Vámi nemohou chatovat."
aspect_list_is_not_visible: "seznam kontaktů je skryt ostatním v aspektu"
aspect_list_is_visible: "seznam kontaktů je viditelný pro ostatní v aspektu"
confirm_remove_aspect: "Opravdu chcete odstranit tento aspekt?"
- done: "Hotovo"
+ grant_contacts_chat_privilege: "dát kontaktům v tomto aspektu právo chatovat ?"
make_aspect_list_visible: "umožnit kontaktům v tomto aspektu se vzájemně vidět?"
remove_aspect: "Odstranit tento aspekt"
rename: "přejmenovat"
+ set_visibility: "Nastavit viditelnost"
update: "aktualizovat"
updating: "aktualizace"
- few: "%{count} aspekty"
- helper:
- are_you_sure: "Opravdu chcete odstranit tento aspekt?"
- aspect_not_empty: "Aspekt není prázdný"
- remove: "odebrat"
index:
diaspora_id:
content_1: "Vaše Diaspora ID je:"
content_2: "Dejte to někomu a bude vás moci najít na Diaspoře."
heading: "Diaspora ID"
donate: "Přispějte"
- handle_explanation: "Toto je vaše Diaspora ID. Podobně jako e-mailovou adresu ho můžete dál lidem a budete na něm dostupní."
+ handle_explanation: "Toto je vaše Diaspora ID. Podobně jako e-mailovou adresu ho můžete dát lidem a budete na něm dostupní."
help:
any_problem: "Nějaký problém?"
contact_podmin: "Napište správci vašeho podu!"
@@ -196,11 +223,6 @@ cs:
heading: "Připojit služby"
unfollow_tag: "Přestat odebírat #%{tag}"
welcome_to_diaspora: "Vítejte na Diaspoře, %{name}!"
- many: "%{count} aspektů"
- move_contact:
- error: "Chyba při přesunu kontaktu: %{inspect}"
- failure: "%{inspect} nefunguje"
- success: "Kontakt přesunut do nového aspektu"
new:
create: "Vytvořit"
name: "Název"
@@ -218,14 +240,6 @@ cs:
family: "Rodina"
friends: "Přátelé"
work: "Práce"
- selected_contacts:
- manage_your_aspects: "Spravovat vaše aspekty."
- no_contacts: "Nemáte zde dosud žádné kontakty."
- view_all_community_spotlight: "Zobrazit všechny aktuality z komunity"
- view_all_contacts: "Zobrazit všechny kontakty"
- show:
- edit_aspect: "upravit aspekt"
- two: "%{count} aspekty"
update:
failure: "Váš aspekt %{name} má příliš dlouhý název na to, aby mohl být uložen."
success: "Váš aspekt %{name} byl úspěšně upraven."
@@ -245,36 +259,31 @@ cs:
post_success: "Odesláno! Zavírám!"
cancel: "Zrušit"
comments:
- few: "%{count} komentáře"
- many: "%{count} komentářů"
new_comment:
comment: "komentář"
commenting: "Komentování..."
one: "1 komentář"
other: "%{count} komentářů"
- two: "%{count} komentáře"
zero: "žádné komentáře"
contacts:
create:
failure: "Nepodařilo se vytvořit kontakt"
- few: "%{count} kontaktů"
index:
add_a_new_aspect: "Přidat nový aspekt"
+ add_contact: "Přidej kontakt"
add_to_aspect: "Přidat kontakty do %{name}"
- add_to_aspect_link: "přidat kontakty do %{name}"
all_contacts: "Všechny kontakty"
community_spotlight: "Aktuality z komunity"
- many_people_are_you_sure: "Jste si jisti, že chcete začít soukromý rozhovor s více než %{suggested_limit} kontakty? Posílání zpráv do tohoto aspektu může být lepší způsob, jak s nimi spojit."
my_contacts: "Moje kontakty"
no_contacts: "Zdá se, že si potřebujete přidat nějaké kontakty."
+ no_contacts_in_aspect: "V tomto aspektu ještě nemáte žádné kontakty. Dále najdete seznam Vašich existujících kontaktů, které můžete do tohoto aspektu přidat."
no_contacts_message: "Shlédněte %{community_spotlight}"
- no_contacts_message_with_aspect: "Shlédněte %{community_spotlight} nebo %{add_to_aspect_link}"
only_sharing_with_me: "Pouze sdílejí se mnou"
- remove_person_from_aspect: "Odstranit %{person_name} z \"%{aspect_name}\""
+ remove_contact: "Odstraň kontakt"
start_a_conversation: "Zahájit konverzaci"
title: "Kontakty"
+ user_search: "Hledat uživatele"
your_contacts: "Vaše kontakty"
- many: "%{count} kontaktů"
one: "1 kontakt"
other: "%{count} kontaktů"
sharing:
@@ -282,7 +291,6 @@ cs:
spotlight:
community_spotlight: "Aktuality z komunity"
suggest_member: "Navrhněte člena"
- two: "%{count} kontakty"
zero: "žádné kontakty"
conversations:
conversation:
@@ -292,7 +300,8 @@ cs:
no_contact: "Hej, musíte nejdřív kontakt přidat!"
sent: "Zpráva byla odeslána"
destroy:
- success: "Konverzace úspěšně odstraněna"
+ delete_success: "Konverzace byla úspěšně smazána"
+ hide_success: "Konverzace byla úspěšně skryta"
helper:
new_messages:
few: "%{count} nové zprávy"
@@ -302,7 +311,10 @@ cs:
two: "%{count} nové zprávy"
zero: "Žádné nové zprávy"
index:
+ conversations_inbox: "Konverzace - doručené"
+ create_a_new_conversation: "Zahájit novou konverzaci"
inbox: "Doručená pošta"
+ new_conversation: "Nová konverzace"
no_conversation_selected: "není výbrána žádná konverzace"
no_messages: "žádné zprávy"
new:
@@ -311,8 +323,11 @@ cs:
sending: "Posílám..."
subject: "předmět"
to: "pro"
+ new_conversation:
+ fail: "Neplatná zpráva"
show:
delete: "smazat a blokovat konverzaci"
+ hide: "skrýt a ztlumit konverzaci"
reply: "odpověď"
replying: "Odpovídám…"
date:
@@ -351,7 +366,9 @@ cs:
contacts_know_aspect_q: "Vědí mé kontakty do kterých aspektů jsem je zařadil(a)?"
contacts_visible_a: "Pokud vyberete tuto možnost, tak kontakty z toho aspektu budou moci vidět, kdo jiný v aspektu je, na vašem profilu pod vaší fotkou. Je nejlepší vybrat tuto možnost jen pokud se kontakty v tom aspektu znají. Stále neuvidí název aspektu."
contacts_visible_q: "Co znamená „umožnit kontaktům v tomto aspektu se vzájemně vidět“?"
+ delete_aspect_a: "Ve Vašem seznamu aspektů na levé straně hlavní stránky najeďte myší na aspekt, který chcete smazat. Klikněte na malou tužku, která se objeví napravo. V rámečku, který se objeví, zvolte Smazat."
delete_aspect_q: "Jak lze smazat aspekt?"
+ person_multiple_aspects_a: "Ano. Jděte do své stránky kontaktů a kliněte na Moje kontakty. Každý z kontaktů můžete přidat či odebrat pomocí menu na pravé straně do tolika aspektů, kolik chcete. Nebo můžete kontakt přidat či odebrat z aspektu kliknutím na tlačítko na jejich profilové stránce. Nebo můžete dokonce jen najet myší na jméno kontaktu, když jej vidíte v proudu, a změnit aspekty přímo v okénku, které se objeví."
person_multiple_aspects_q: "Mohu přidat osobu do několika aspektů?"
post_multiple_aspects_a: "Ano. Když vytváříte příspěvek, použijte tlačítko na výběr aspektů pro vybrání nebo odebrání aspektů. Váš příspěvek bude viditelný všem aspektům, které vyberete. Mohli byste také vybrat aspekty, do kterých chcete odeslat v postranní liště. Když přispíváte, aspekt(y), které jste vybral(a) z levého seznamu budou automaticky vybrány pod tlačítkem na výběr aspektů, když začnete vytvářet nový příspěvek."
post_multiple_aspects_q: "Mohu odesílat obsah několika aspektům najednou?"
@@ -366,8 +383,17 @@ cs:
what_is_an_aspect_q: "Co je to aspekt?"
who_sees_post_a: "Pokud vytvoříte omezený příspěvek, bude viditelný jen lidem, které máte v tomto aspektu (nebo aspektech, pokud je určen několika aspektům). Vaše kontakty, které nejsou v tomto aspektu, příspěvek neuvidí, pokud jste ho neudělal(a) veřejným. Vždy jen veřejné příspěvky budou viditelné těm, které jste nezařadil(a) do vašich aspektů."
who_sees_post_q: "Když posílám do určitého aspektu, kdo to vidí?"
+ chat:
+ add_contact_roster_a: |-
+ V první řadě musíte povolit chat s jedním z aspektů, kterého je daný uživatel členem. Za tímto účelem půjdete do %{contacts_page}, vyberete aspekt a kliknete na ikonku chatu.
+ %{toggle_privilege} Můžete, pokud chcete, vytvořit speciální aspekt, který nazvete 'Chat' а uživatele, se kterými chcete moci chatovat přidáte do tohoto aspektu. Poté co toto uděláte, můžete otevřít uživatelské rozhraní chatu a vybrat osobu, se kterou chcete chatovat.
+ add_contact_roster_q: "Jak mohu s někým chatovat na diaspora* ?"
+ contacts_page: "Stránka kontaktů"
+ title: "Chat"
+ faq: "Často kladené otázky"
foundation_website: "webové stránky diaspora foundation"
getting_help:
+ get_support_a_faq: "Čtete naši %{faq} stránku na wiki"
get_support_a_hashtag: "zeptej se ve veřejném příspěvku na diaspoře* použitím hashtagu %{question}"
get_support_a_irc: "přidej se k nám na %{irc} (chat naživo)"
get_support_a_tutorials: "Koukněte na naše %{tutorials}"
@@ -380,6 +406,18 @@ cs:
getting_started_tutorial: "Tutoriály pro nováčky"
here: "zde"
irc: "IRC"
+ keyboard_shortcuts:
+ keyboard_shortcuts_a1: "V pohledu na proud můžete používat následující klávesové zkratky:"
+ keyboard_shortcuts_li1: "j - přejděte na další příspěvek"
+ keyboard_shortcuts_li2: "k - přejděte na předchozí příspěvek"
+ keyboard_shortcuts_li3: "c - komentujte aktuální příspěvek"
+ keyboard_shortcuts_li4: "l - lajkovat aktuální příspěvek"
+ keyboard_shortcuts_li5: "r - znovu zveřejnit současný příspěvek"
+ keyboard_shortcuts_li6: "m - rozšířit současný příspěvek"
+ keyboard_shortcuts_li7: "o - otevřít první odkaz v současném příspěvku"
+ keyboard_shortcuts_li8: "ctrl + enter - pošle zprábu, kterou píšete"
+ keyboard_shortcuts_q: "Jaké klávesové zkratky jsou k dispozici ?"
+ title: "Klávesové zkratky"
markdown: "Markdown"
mentions:
how_to_mention_a: "Napište znak „@“ a začněte psát své jméno. Mělo by se zobrazit rozbalovací menu, které vám umožní je snadněji vybrat. Berte na vědomí, že je možné zmínit jen ty osoby, které máte v aspektech."
@@ -389,6 +427,7 @@ cs:
see_mentions_a: "Ano, klikněte „Zmínky“ v levém sloupci na své domovské stránce"
see_mentions_q: "Je způsob, jak vidět příspěvky, v kterých jsem byl(a) zmíněn(a)?"
title: "Zmínky"
+ what_is_a_mention_a: "Zmínka je odkaz z příspěvku na osobní profil nějakého člověka. Když je někdo zmíněn, dostane na daný příspěvek upozornění."
what_is_a_mention_q: "Co je to „zmínka”?"
miscellaneous:
back_to_top_a: "Ano. Po seskrolování dolu na stránce klikněte na šedou šipku, co se objeví v pravém dolním rohu vašeho prohlížeče."
@@ -397,11 +436,14 @@ cs:
diaspora_app_q: "Existuje aplikace diaspora* pro Android či iOS?"
photo_albums_a: "Ne, zatím ne. Můžete ale shlédnout proud jejich nahraných obrázků v sekci Fotky v postranním panelu jejich profilu."
photo_albums_q: "Jsou zde alba fotek či videí?"
+ subscribe_feed_a: "Ano, ale toto stále není zcela vyladěná funkcionalita a formátování jejích výstupu může být poněkud nedotažené. Pokud ji přece chcete vyzkoušet, jděte do něčí profilové stránky a klikněte na tlačítko RSS zdrojů ve Vašem prohlížeči nebo zkopírujte URL profilu (např. https://joindiaspora.com/people/somenumber) a vložte jej do své RSS čtečky. Výsledná adresa zdroje vypadá asi takto: https://joindiaspora.com/public/username.atom – diaspora* používá Atom a ne RSS."
subscribe_feed_q: "Můžu odebírat něčí veřejné příspěvky pomocí čtečky kanálů?"
title: "Různé"
pods:
+ find_people_a: "Pozvěte své přátele pomocí odkazu 'e-mailem' v pruhu na pravé straně. Sledujte #tags, objevte uživatele, kteří sdílejí Vaše zájmy a ty, jejichž příspěvky Vás zajímají, si přidejte do některého aspektu. Pomocí tagu #newhere ve veřejném příspěvku dejte vědět, že jste odteď na diaspora*."
find_people_q: "Právé jsem se přidal k podu, jak najdu lidi, s kterými sdílet?"
title: "Pody"
+ use_search_box_a: "Pokud znáte jejich plné diaspora* ID (např. jmeno@jmenopodu.cz), můžete je najít vyhledáváním tohoto plného ID. Jste-li na tomtéž podu, stačí hledat jen uživatelské jméno. Alternativně lze hledat jejich profilové jméno (jméno, které vidíte na obrazovce). Pokud nenajdete uživatele na první pokus, zkoušejte to vícekrát."
use_search_box_q: "Jak mám použít vyhledávací pole, abych našel určité osoby?"
what_is_a_pod_a: "Pod je server, na kterém běží software diaspora* a který je připojen k síti diaspory*. \"Pod\", což je anglicky \"lusk\", je metafora, která odkazuje na lusky, které obsahují semínka, podobně jako server obsahuje řadu uživatelských účtů. Je mnoho různých podů. Můžete přidávat kamarády z jiných podů a komunikovat s nimi. (O podu diaspory* můžete přemýšlet jako o něčem podobnému poskytovateli e-mailu: jsou veřejné pody, soukromé pody a s určitým úsilím můžete spustit svůj vlastní.)"
what_is_a_pod_q: "Co je to pod?"
@@ -410,18 +452,33 @@ cs:
char_limit_services_q: "Jaký je limit pro počet znaků v příspěvcích sdílených přes připojenou službu s nižším povoleným počtem znaků?"
character_limit_a: "65 535 znaků. To je o 65 395 znaků více než máte na Twitteru! ;)"
character_limit_q: "Jaký je limit pro počet znaků v příspěvku?"
+ embed_multimedia_a: "Obvykle můžete vložit URL (např. http://www.youtube.com/watch?v=nnnnnnnnnnn) do Vašeho příspěvku a video nebo zvukový záznam budou zasazeny automaticky. Mezi podporované portály patří: YouTube, Vimeo, SoundCloud, Flickd a několik dalších. Diaspora* pro tuto funkcionalitu využívá oEmbed, Stále přidáváme podporu dalších portálů. Ujistěte se, že zadáváje jednoduché, plné odkazy, tedu ne zkrácené odkazy a ne odkazy s operátory za základní URL. Počkejte chvilku než obnovíte stránku po zadání příspěvku, abyste správně viděli předběžný náhled."
+ embed_multimedia_q: "Jak vložím video, zvukovou nahrávku či jiný multimediální obsah do příspěvku ?"
format_text_a: "Použitím zjednodušeného jazyku %{markdown}. Můžete najít plný syntax Markdownu %{here}. Tlačítko pro náhled je v tomto případě opravdu užitečné, neboť uvidíte, jak bude vaše zpráva vypadat předtím, než ji nasdílíte."
format_text_q: "Jak mohu formátovat text ve svých příspěvcích (tučný text, kurzíva apod.)?"
+ hide_posts_a: "Najedete-li myší na něčí příspěvek, objeví se vpravo nahoře malý křížek podobný písmenu x. Kliknutím na křížek příspěvek skryjete a zamezíte i e-mailovým upozorněním na něj. Při návštěvě profilové stránky autora tohot příspěvku však příspěvek stále uvidíte."
+ hide_posts_q: "Jak skrýt příspěvek ? / Jak vypnout zasílání upozornění o příspěvcích, které jsem okomentoval(a) ?"
image_text: "text k obrázku"
image_url: "url obrázku"
+ insert_images_a: "Pro vložení obrázku do příspěvku klikněte na ikonku fotoaparátu vpravo dole. Klikněte na ikonku znova, pokud chcete vložit další obrázek, nebo můźete vybrat několik obrázků najednou."
insert_images_comments_a1: "Následující Markdown kód"
insert_images_comments_a2: "může být užito k vkládání obrázků z webu do komentářů i do příspěvků."
insert_images_comments_q: "Můžu vkládat obrázky do komentářů?"
insert_images_q: "Jak vkládat obrázky do příspěvků?"
+ post_location_a: "Klikněte při publikaci na ikonu špendlíku vedle fotoaparátu. Tím přidáte Vaší geografickou pozici z OpenStreetMap. Svou pozici můžete dále upravit, např. zadat pouze město, ve kterém jste, a ne detailní adresu včetně ulice."
+ post_location_q: "Jak přidat k mojemu příspěvku informaci o mé geografické pozici ?"
+ post_notification_a: "Vedle znaku X v pravé horní části příspěvku najdete ikonku zvonečku. Klikněte na ní, abyste povolil nebo zakázal upozornění na tento příspěvek."
+ post_notification_q: "Jak dostávat upozornění o příspěvku, nebo jejich zasílání naopak zastavit ?"
+ post_poll_a: "Pro vytvoření hlasování klikněte na ikonku grafu. Zadejte otázku a alespoň dvě odpovědi. Nezapomeňte označit příspěvek jako veřejný, pokud chcete, aby se hlasování mohl účastnit kdokoliv."
+ post_poll_q: "Jak přidat k příspěvku hlasování ?"
+ post_report_a: "Chcete-li příspěvek nahlásit podminovi, klikněte na trojúhelníkovou varovnou ikonku v pravé horní části příspěvku. Důvod oznámení popište v následujícím dialogu."
+ post_report_q: "Jak oznámím urážlivý příspěvek ?"
size_of_images_a: "Ne. Obrázkům se automaticky mění velikost, aby se do proudu vešly. Markdown nemá kód pro stanovení velikosti obrázku."
size_of_images_q: "Můžu nastavit velikost obrázků v příspěvcích či komentářích?"
stream_full_of_posts_a1: "Váš proud se skládá ze 3 typů příspěvků:"
+ stream_full_of_posts_li1: "Příspěvky zadané uživateli, se kterými sdílíte obsah, jsou dvou typů: veřejné příspěvky a příspěvky sdílené s aspektem, jehož jste součástí. Tyto příspěvky odstraníte ze svého proudu tím, že přestanete s danou osobou sdílet."
stream_full_of_posts_li2: "Veřejné příspěvky obsahující jeden ze štítků, které odebíráte. Pokud je chcete odstranit, přestaňte štítek odebírat."
+ stream_full_of_posts_li3: "Veřejné příspěvky od uživatelů uvedených v sekci aktuality z komunity. Příspěvky mohou být odstraněny odškrtnutím políčka \"Zobrazovat aktuality z komunity v proudu ?\" na záložce účet ve Vašem Nastavení."
stream_full_of_posts_q: "Proč je můj proud plný příspěvků od lidí, které neznám a s kterými nesdílím?"
title: "Příspěvky a přispívání"
private_posts:
@@ -436,21 +493,39 @@ cs:
who_sees_post_q: "Co když odešlu zprávu aspektu (tj. soukromý příspěvek), kdo ji uvidí?"
private_profiles:
title: "Soukromé profily"
+ whats_in_profile_a: "Něco o Vás, poloha, pohlaví a datum narození. To jsou údaje ve spodní sekci při editaci osobního profilu. Všechny tyto položky jsou nepovinné, je na Vás, zda je vyplníte. Přihlášení uživatelé, kteří jsou v některém z Vašich aspektů, jsou jediní, kteří mohou vidět Váš profil. Při návštěǚe Vašeho profilu také uvidí příspěvky, které jste adresoval/a jejich aspektu společně s Vašimi veřejnými příspěvky."
whats_in_profile_q: "Co je v mém soukromém profilu?"
+ who_sees_profile_a: "Každý přihlášený uživatel, se kterým sdílíte (tj. přidal/a jste jej do jednoho ze svých aspektů). Lidé, kteří Vás sledují, ale které nesledujete Vy, uvidí pouze Vaše veřejné informace."
who_sees_profile_q: "Kdo vidí můj soukromý profil?"
who_sees_updates_a: "Všichni v tvých aspektech vidí změny tvého soukromého profilu. "
who_sees_updates_q: "Kdo vidí aktualizace mého soukromého profilu?"
public_posts:
+ can_comment_reshare_like_a: "Každý přihlášený diaspora* uživatel může komentovat, sdílet či lajkovat Váš veřejný příspěvek."
+ can_comment_reshare_like_q: "Kdo může komentovat, sdílet či lajkovat můj veřejný příspěvek ?"
+ deselect_aspect_posting_a: "Odebrání aspektů nemá vliv na veřejné příspěvky. Veřejný příspěvek se bude tak jako tak objevovat v proudu všech Vašich kontaktů. Aby byl příspěvek viditelný jen některým aspektům, musíte tyto aspekty vybrat z nabídky pod textovým polem při zadávání příspěvku."
+ deselect_aspect_posting_q: "Co se stane, pokud odeberu jeden či více aspektů při zadávání veřejného příspěvku ?"
find_public_post_a: "Vaše veřejné příspěvky se zobrazí v proudu kohokoliv, kdo vás sleduje. Pokud jste zahrnul(a) #štítky ve vašem veřejném příspěvku, kdokoliv, kdo odebírá tyto štítky, najde váš příspěvek ve svém proudu. Každý veřejný příspěvek také má určitou URL, kterou může navštívit každý, i když není přihlášen -- tudíž na příspěvky mohou vést odkazy přímo z Twitteru, blogů apod. Veřejné příspěvky mohou také být indexovány vyhledávači."
find_public_post_q: "Jak mohou jiní lidé najít mé veřejné příspěvky?"
+ see_comment_reshare_like_a: "Jakýkoliv přihlášený uživatel dispora* a kdokoliv jiný na internetu. Komentáře, lajky a sdílení veřejných příspěvků jsou také veřejné."
+ see_comment_reshare_like_q: "Pokud komentuji, sdílím či lajkuji veřejný příspěvek, kdo to může vidět ?"
title: "Veřejné příspěvky"
+ who_sees_post_a: "Každý uživatel internetu může teoreticky vidět příspěvek, který označíte jako veřejný. To je ideální cesta jak oslovit veřejnost."
+ who_sees_post_q: "Pokud posílám veřejný příspěvek, kdo jej můźe vidět ?"
public_profiles:
title: "Veřejné profily"
+ what_do_tags_do_a: "Pomáhají lidem Vás poznat. Vaše profilová fotka se objeví na levé straně stránek těchto konkrétních štítků, společně s fotkami dalších uživatelů, kteří mají štítek na svém veřejném profilu."
what_do_tags_do_q: "Jakou funkci plní štítky na mém veřejném profilu?"
+ whats_in_profile_a: "Vaše jméno, pět štítků, které Vás popisují a Vaše fotografie. To jsou údaje v horní části editace profilové stránky. Tyto údaje můžete zadat velmi identifikujícím či velmi anonymním způsobem, volba je na Vás. Vaše profilová stránka také zobrazuje všechny Vaše veřejné příspěvky."
whats_in_profile_q: "Co je v mém veřejném profilu"
+ who_sees_profile_a: "Profil může vidět jakýkoliv přihlášený uživatel diaspora* a i všichni uživatelé internetu. Každý profil má svou přímou URL, která může být použita i ze stránek mimo diaspora*. Profil také mohou indexovat vyhledávače."
who_sees_profile_q: "Kdo vidí můj veřejný profil?"
+ who_sees_updates_a: "Kdokoliv může vidět změny, pokud navštíví Vaš profil."
who_sees_updates_q: "Kdo vidí aktualizace mého veřejného profilu?"
resharing_posts:
+ reshare_private_post_aspects_a: "Ne, není možné sdílet něčí soukromý příspěvek. Tím je respektován záměr původního autora sdílet příspěvek jen konkrétní skupině lidí."
+ reshare_private_post_aspects_q: "Mohu (znovu)sdílet soukromý příspěvek jen s některými aspekty ?"
+ reshare_public_post_aspects_a: "Ne, když sdílíte něčí veřejný příspěvek, tak se příspěvek stává automaticky Vaším veřejným příspěvkem. Chcete-li jej sdílet jen s některými aspekty, zkopírujte jeho obsah do nového příspěvku."
+ reshare_public_post_aspects_q: "Mohu (znovu)sdílet veřejný příspěvek jen s některými aspekty ?"
title: "Další sdílení příspěvků"
sharing:
add_to_aspect_a1: "Řekněme, že Amy si přidá Bena do aspektu, ale Ben si ještě (zatím) Amy do aspektů nepřidal:"
@@ -462,19 +537,31 @@ cs:
add_to_aspect_li5: "Ale když Ben navštíví profilovou stránku Amy, uvidí soukromé příspěvky Amy, které odesílá aspektům, v kterých Ben je (spolu s veřejnými příspěvky, které může vidět kdokoliv)."
add_to_aspect_li6: "Ben uvidí soukromý profil Amy (životopis, polohu, pohlaví, datum narozenin)."
add_to_aspect_li7: "Amy se zobrazí pod „Pouze sdílejí se mnou“ na stránce kontaktů Bena."
+ add_to_aspect_li8: "Amy bude mít možnost @označit Bena ve svém příspěvku."
+ add_to_aspect_q: "Co se stane, když přidám někoho do jednoho z mých aspektů ? Nebo když mě někdo přidá do jednoho ze svých aspektů ?"
+ list_not_sharing_a: "Ne, ale zjistit jestli s Vámi nějaky uživatel sdílí obsah můžete na jeho profilové stránce. Pokud sdílí, bude pruh pod jejich profilovou fotkou zelený. Pokud ne, bude pruh šedý. Pokaždé, když s Vámi někdo začne sdílet, dostanete o tom notifikaci."
list_not_sharing_q: "Existuje seznam lidí, které jsem přidal do jednoho z mých aspektů, ale kteří si mě nepřidali zpět?"
+ only_sharing_a: "To jsou lidé, kteří Vás přidali do jednoho ze svých aspektů, ale (zatím) nejsou v žádném z Vašic aspektů. Jinými slovy, oni sdílejí s Vámi, ale ne Vy s nimi (asymetrické sdílení). Pokud je přidáte do aspektu, budou se zobrazovat pod tímto aspektem a už ne v sekci \"Pouze sdílejí se mnou\". Viz výše."
only_sharing_q: "Kdo jsou ti uvedeni pod „Pouze sdílejí se mnou“ na mé stránce kontaktů?"
+ see_old_posts_a: "Ne. Budou moci vidět jen nové příspěvky tomuto aspektu. Oni (a kdokoliv jiný) mohou vidět Vaše veřejné příspěvky na Vaší profilové stránce a možná i ve svém proudu."
see_old_posts_q: "Když někoho přidám do aspektu, mohou vidět starší příspěvky, které jsem už odeslal do toho aspektu?"
+ sharing_notification_a: "Měl(a) byste dostat notifikaci, kdykoliv s Vámi někdo začne sdílet."
+ sharing_notification_q: "Jak se dozvím, že se mnou někdo začal sdílet ?"
title: "Sdílení"
tags:
filter_tags_a: "Toto zatím není dostupné přes diasporu*, ale existují některé %{third_party_tools}, co toto mohou poskytnout."
filter_tags_q: "Jak můžu filtrovat/vyloučit některé štítky z mého proudu."
+ followed_tags_a: "Po vyhledání štítků můžete začít \"sledovat\" tento štítek kliknutím na tlačítko nahoře na stránce štítku. Štítek se tím objeví ve Vašem seznamu sledovaných štítků vlevo. Kliknutím na jeden z Vašich sledovaných štítků se dostanete na stránku tohoto štítku a uvidíte seznam nedávných příspěvků, které byly tímto štítkem označeny. Klikněte na #Odebírané štítky a uvidíte seznam příspěvků, které obsahují alespoň jeden z Vámi odebíraných štítků. "
followed_tags_q: "Co jsou „#Odebírané štítky“ a jak můžu odebírat štítek?"
people_tag_page_a: "Jsou to lidé, co použili tento štítek ve svém popisu na svém veřejném profilu."
people_tag_page_q: "Kdo jsou ti uvedení na levé straně stránky štítku?"
+ tags_in_comments_a: "Štítek přidaný do komentáře bude fungovat jako link na stránku tohoto štítku. Komentář (ani jím komentovaný příspěvek) se však na stránce štítku neobjeví. Pouze příspěvky se štítkem se objevují na stránce štítku."
+ tags_in_comments_q: "Smím používat označení i v komentářích nebo jen v příspěvcích ?"
title: "Štítky"
+ what_are_tags_for_a: "Štítky slouží ke kategorizaci příspěvků, typicky podle tématu. Vyhledáváním podle štítku dostanete všechny Vám viditelné příspěvky (jak veřejné, tak soukromé), které tento štítek mají. Takto mohou lidé, kteří mají o nějaké téma zájem, hledat veřejné příspěvky o něm."
what_are_tags_for_q: "K čemu jsou štítky?"
third_party_tools: "Nástroje jiných firem"
+ title_header: "Nápověda"
tutorial: "tutoriál"
tutorials: "tutoriály"
wiki: "wiki"
@@ -582,15 +669,27 @@ cs:
other: "%{count} nových upozornění"
zero: "Žádná nová upozornění"
index:
+ all_notifications: "Všechna upozornění"
+ also_commented: "Také okomentováno"
and: "a"
and_others:
few: "a %{count} další"
one: "a ještě jeden"
other: "a %{count} dalších"
zero: "a nikdo další"
+ comment_on_post: "Komentář příspěvku"
+ liked: "Co se mi líbilo"
mark_all_as_read: "Označit vše jako přečtené"
+ mark_all_shown_as_read: "Vše zobrazené označit jako přečtené"
+ mark_read: "Označit jako přečtené"
mark_unread: "Označit jako nepřečtené"
+ mentioned: "Zmíněno"
+ no_notifications: "Zatím nemáte žádná upozornění."
notifications: "Oznámení"
+ reshared: "Znovusdílené"
+ show_all: "Zobrazit vše"
+ show_unread: "Zobrazit nepřečtené"
+ started_sharing: "Sdílení zahájeno"
liked:
few: "%{actors} se líbí váš %{post_link}."
one: "%{actors} se líbí váš %{post_link}."
@@ -633,7 +732,9 @@ cs:
other: "%{actors} s vámi začali sdílet."
zero: "%{actors} s vámi začali sdílet."
notifier:
+ a_limited_post_comment: "Na soukromém příspěvku v diaspora* je k přečtení nový komentář."
a_post_you_shared: "příspěvek."
+ a_private_message: "Máte v diaspora* novou soukromou zprávu."
accept_invite: "Přijměte vaši pozvánku do Diaspory*!"
click_here: "klikněte zde"
comment_on_post:
@@ -642,6 +743,44 @@ cs:
click_link: "K aktivaci vaší nové e-mailové adresy %{unconfirmed_email} použijte prosím tento odkaz:"
subject: "Prosím aktivujte si svou novou e-mailovou adresu %{unconfirmed_email}"
email_sent_by_diaspora: "Tento e-mail odeslal pod %{pod_name}. Pokud si nepřejete nadále dostávat takovéto e-maily,"
+ export_email:
+ body: |-
+ Dobrý den, %{name}.
+
+ Vaše data byla zpracována a jsou připravena ke stažení na [tomto odkazu](%{url}).
+
+ S pozdravem,
+ e-mailový robot disaspora*
+ subject: "%{name}, Vaše osobní data jsou připravena ke stažení"
+ export_failure_email:
+ body: |-
+ Dobrý den, %{name},
+
+ Při přípravě Vašich osobních dat ke stažení jsme narazili na problémy.
+ Prosím, zkuste to znovu.
+
+ S pozdravem,
+ e-mailový robot disaspora*
+ subject: "Je nám líto, %{name}, ale je nějaký problém s Vašimi daty."
+ export_photos_email:
+ body: |-
+ Dobrý den, %{name},
+
+ Vaše fotky byly zpracovány a jsou k dispozici ke stažení na následujícím [odkazu](%{url})
+
+ S pozdravem,
+ e-mailový robot diaspora*
+ subject: "%{name}, Vaše fotky jsou připraveny ke stažení."
+ export_photos_failure_email:
+ body: |-
+ Dobrý den, %{name},
+
+ došlo k problému s přípravou Vašich fotek ke stažení.
+ Zkuste to, prosím, znovu.
+
+ Omlouvám se,
+ e-mailový robot diaspora*
+ subject: "%{name}, s Vašimi fotografiemi nastal nějaký problém."
hello: "Vítej, %{name}!"
invite:
message: |-
@@ -668,6 +807,43 @@ cs:
subject: "%{name} vás zmínil(a) na Diaspoře*"
private_message:
reply_to_or_view: "Zobrazit konverzaci nebo na ni odpovědět »"
+ remove_old_user:
+ body: |-
+ Dobrý den,
+
+ zdá se, že již nechcete mít účet na %{pod_url}, protože jste jej nepoužil/a posledních %{after_days} dní. Abychom mohli zajistit maximální výkon tohoto diaspora* podu našim aktivním uživatelům, odstraňujeme nechtěné účty z naší databáze.
+
+ Budeme rádi, pokud zůstanete členem diaspora* komunity a ponecháte si Váš účet, pokud o něj stojíte.
+
+ Jediné, co pro jeho zachování musíte udělat, je přihlásit se na něj před %{remove_after}. Až se přihlásíte, doufáme že budete mít čas se po diaspora* trochu poohlédnout. Od doby Vaší poslední návštěvy se toho hodně změnilo a myslíme si, že se Vám naše vylepšení budou líbit. Začněte odebírat nějaké #štítky, tak snadno najdete obsah, který Vás zajímá.
+
+ Přihlaste se zde: %{login_url}. Pokud jste zapoměl/a své přihlašovací údaje, můžete na této stránce požádat o připomenutí.
+
+ Doufáme, že Vás na dispora* znovu uvidíme,
+
+ Váš,
+ diaspora* email robot
+ subject: "Váš diaspora* účet byl navržen k odstranění, protože na něm nejste aktivní."
+ report_email:
+ body: |-
+ Dobrý den,
+
+ %{type} s identifikátorem %{id} byl označen jako urážlivý.
+
+ [%{url}][1]
+
+ Prosím, zkontrolujte jej co nejdříve !
+
+
+ S pozdravem,
+
+ emailový robor diaspora*
+
+ [1]: %{url}
+ subject: "Nový %{type} byl označen jako urážlivý"
+ type:
+ comment: "komentář"
+ post: "příspěvek"
reshared:
reshared: "%{name} právě sdílel(a) váš příspěvek"
view_post: "Zobrazit příspěvek »"
@@ -692,18 +868,19 @@ cs:
add_contact_from_tag: "přidat kontakt ze štítku"
aspect_list:
edit_membership: "upravit člena aspektu"
- few: "%{count} lidi"
helper:
is_not_sharing: "%{name} s vámi nesdílí"
is_sharing: "%{name} s vámi sdílí"
results_for: " výsledky pro %{params}"
index:
+ couldnt_find_them: "Nemůžete je najít?"
looking_for: "Hledáte příspěvky označené %{tag_link}?"
no_one_found: "… a nikdo nebyl nalezen."
no_results: "Hej! Musíte něco hledat."
results_for: "výsledky hledání"
+ search_handle: "Vaše přátelé nejlépe najdete podle jejich diaspora* ID (uzivatel@pod.cz)."
searching: "vyhledávám, prosím čekejte…"
- many: "%{count} lidí"
+ send_invite: "Stále nic ? Pošlete pozvánku !"
one: "1 člověk"
other: "%{count} lidí"
person:
@@ -740,7 +917,6 @@ cs:
add_some: "přidat nějaké"
edit: "upravit"
you_have_no_tags: "nemáte žádný štítek!"
- two: "%{count} lidi"
webfinger:
fail: "Omlouváme se, ale %{handle} nebyl nalezen."
zero: "nikdo"
@@ -801,6 +977,9 @@ cs:
edit_profile: "Upravit profil"
first_name: "Jméno"
last_name: "Příjmení"
+ 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."
update_profile: "Aktualizovat profil"
your_bio: "Něco o vás"
your_birthday: "Vaše narozeniny"
@@ -832,23 +1011,38 @@ cs:
password_to_confirm: "(potřebujeme vaše současné heslo pro potvrzení změn)"
unhappy: "Nešťastný?"
update: "Aktualizovat"
- invalid_invite: "Odkaz na pozvánku který jste poskytli již neplatí!"
+ invalid_invite: "Odkaz na pozvánku, který jste poskytli, již neplatí!"
new:
- continue: "Pokračovat"
create_my_account: "Vytvořte mi účet!"
- diaspora: "<3 diasporu*"
email: "EMAIL"
enter_email: "Zadejte e-mail"
enter_password: "Zadejte heslo (alespoň 6 znaků)"
enter_password_again: "Zadejte stejné heslo jako předtím"
enter_username: "Vyberte si uživatelské jméno (pouze písmena, číslice a podtržítka)"
- hey_make: "HEJ,<br/>VYTVOŘ<br/>NĚCO."
join_the_movement: "Připojte se k nám!"
password: "HESLO"
password_confirmation: "POTVRZENÍ HESLA"
sign_up: "ZAPSAT SE"
sign_up_message: "Sociální síť se ♥"
+ submitting: "Odesílání..."
+ terms: "Vytvořením účtu automaticky přijímáte %{terms_link}."
+ terms_link: "Podmínky použití"
username: "UŽIVATELSKÉ JMÉNO"
+ report:
+ comment_label: "<b>Komentář</b>:<br>%{data}"
+ confirm_deletion: "Určitě chcete smazat tuto položku ?"
+ delete_link: "Smazat položku"
+ not_found: "<u>Příspěvek/komentář nebyl nalezen. Zdá se,že byl svým tvůrcem smazán.</u>"
+ post_label: "<b>Příspěvek</b>: %{title}"
+ reason_label: "Důvod: %{text}"
+ reported_label: "<b>Oznámil/а</b> %{person}"
+ review_link: "Označit jako zkontrolované"
+ status:
+ created: "Nahlášení bylo vytvořeno"
+ destroyed: "Příspěvek byl zničen"
+ failed: "Promiňte, někde se stala chyba."
+ marked: "Zpráva byla označena jako schválená."
+ title: "Přehled nahlášení"
requests:
create:
sending: "Odesílání"
@@ -902,6 +1096,7 @@ cs:
connect_to_facebook: "Připojit na Facebook"
connect_to_tumblr: "Připojit na Tumblr"
connect_to_twitter: "Připojit na Twitter"
+ connect_to_wordpress: "Spojit s wordpressem"
disconnect: "odpojit"
edit_services: "Upravit služby"
logged_in_as: "přihlášen jako"
@@ -930,6 +1125,8 @@ cs:
your_diaspora_username_is: "Vaše uživatelské jméno na Diaspoře: %{diaspora_handle}"
aspect_dropdown:
add_to_aspect: "Přidat do aspektu"
+ mobile_row_checked: "%{name} (odstranit)"
+ mobile_row_unchecked: "%{name} (přidat)"
toggle:
few: "Ve %{count} aspektech"
one: "V jednom aspektu"
@@ -966,6 +1163,7 @@ cs:
all: "všechny"
all_contacts: "všechny kontakty"
discard_post: "Zahodit příspěvek"
+ formatWithMarkdown: "K formátování Vašeho příspěvku můžete používat %{markdown_link}"
get_location: "Získat polohu"
make_public: "vytvořit veřejnou"
new_user_prefill:
@@ -973,10 +1171,17 @@ cs:
i_like: "Moje zájmy jsou %{tags}. "
invited_by: "Díky za pozvání, "
newhere: "Nováček"
+ poll:
+ add_a_poll: "Přidat anketu"
+ add_poll_answer: "Přidat možnost"
+ option: "První možnost"
+ question: "Otázka"
+ remove_poll_answer: "Odebrat možnost"
post_a_message_to: "Poslat příspěvek do %{aspect}"
posting: "Odesílám…"
preview: "Náhled"
publishing_to: "publikování na:"
+ remove_location: "Odstranit pozici"
share: "Sdílet"
share_with: "sdílet s"
upload_photos: "Nahrát fotky"
@@ -998,6 +1203,28 @@ cs:
via: "skrz %{link}"
via_mobile: "z mobilního telefonu"
viewable_to_anyone: "Tento příspěvek je viditelný komukoli na webu"
+ simple_captcha:
+ label: "Zadejte kód do rámečku"
+ message:
+ default: "Tajný kód neodpovídá obrázku"
+ failed: "Nelze ověřit, zda jste člověk."
+ user: "Tajný obrázek je odlišný od kódu"
+ placeholder: "Zadejte hodnotu na obrázku"
+ statistics:
+ active_users_halfyear: "Aktivních uživatelů za půl roku"
+ active_users_monthly: "Aktivních uživatelů měsíčně"
+ closed: "Uzavřený"
+ disabled: "Nedostupný"
+ enabled: "Dostupný"
+ local_comments: "Místní komentáře"
+ local_posts: "Místní příspěvky"
+ name: "Jméno"
+ network: "Síť"
+ open: "Otevřený"
+ registrations: "Registrace"
+ services: "Služby"
+ total_users: "Celkový počet uživatelů"
+ version: "Verze"
status_messages:
create:
success: "Úspěšně zmíněno: %{names}"
@@ -1007,13 +1234,11 @@ cs:
no_message_to_display: "Žádná zpráva k zobrazení."
new:
mentioning: "Zmínka: %{person}"
- too_long:
- few: "prosím zkraťte svou zprávu na méně než %{count} znaky"
- one: "prosím zkraťte svou zprávu na méně než %{count} znak"
- other: "prosím zkraťte svou zprávu na méně než %{count} znaků"
- zero: "prosím zkraťte svou zprávu na méně než %{count} znaků"
+ too_long: "{\"few\"=>\"prosím zkraťte svou zprávu na méně než %{count} znaky\", \"one\"=>\"prosím zkraťte svou zprávu na méně než %{count} znak\", \"other\"=>\"prosím zkraťte svou zprávu na méně než %{count} znaků\", \"zero\"=>\"prosím zkraťte svou zprávu na méně než %{count} znaků\"}"
stream_helper:
hide_comments: "Skrýt všechny komentáře"
+ no_more_posts: "Dosáhl/a jste konce proudu."
+ no_posts_yet: "Zatím zde nejsou žádné příspěvky."
show_comments:
few: "Zobrazit %{count} dalších komentářů"
one: "Zobrazit jeden další komentář"
@@ -1050,7 +1275,6 @@ cs:
title: "Veřejná aktivita"
tags:
contacts_title: "Lidé, kteří navěšují tento štítek"
- tag_prefill_text: "%{tag_name} je o… "
title: "Příspěvky označené: %{tags}"
tag_followings:
create:
@@ -1061,19 +1285,17 @@ cs:
failure: "Nepodařilo se ukončit odebírání #%{name}. Možná jste jej již přestali odebírát?"
success: "Jak chcete! Štítek #%{name} již neodebíráte."
tags:
+ name_too_long: "Ujistěte se, že název tagu má méně než %{count} znaků. Teď jich má %{current_length}."
show:
follow: "Odebírat #%{tag}"
- followed_by_people:
- few: "odebírají %{count} lidé"
- one: "odebírá jeden člověk"
- other: "odebírá %{count} lidí"
- zero: "neodebírá nikdo"
following: "Odebíráte #%{tag}"
- nobody_talking: "Nikdo dosud nemluví o %{tag}."
none: "Prázdný štítek neexistuje!"
- people_tagged_with: "Lidé označení %{tag}"
- posts_tagged_with: "Příspěvky označené #%{tag}"
stop_following: "Přestat odebírat #%{tag}"
+ tagged_people:
+ few: "%{count} osoby jsou označeny štítkem %{tag} "
+ one: "1 osoba je označena štítkem %{tag}."
+ other: "%{count} osob je označeno štítkem %{tag}"
+ zero: "Nikdo není označen štítkem %{tag}"
terms_and_conditions: "Podmínky používání"
undo: "Vrátit zpět?"
username: "Uživatelské jméno"
@@ -1107,22 +1329,30 @@ cs:
comment_on_post: "…někdo komentoval váš příspěvek?"
current_password: "Současné heslo"
current_password_expl: "to, s kterým se přihlašuješ..."
+ download_export: "Stáhnout můj profil"
+ download_export_photos: "Stáhnout moje fotky"
download_photos: "stáhnout moje fotky"
- download_xml: "stáhnout moje xml"
edit_account: "Upravit účet"
email_awaiting_confirmation: "Na adresu %{unconfirmed_email} byl zaslán aktivační odkaz. Dokud tento odkaz neotevřete a svou novou adresu neaktivujete, budeme vás kontaktovat na vaší staré adrese %{email}."
export_data: "Exportovat data"
+ export_in_progress: "Momentálně zpracováváme Vaše data. Dejte nám chvilku."
+ export_photos_in_progress: "Momentálně zpracováváme Vaše fotky. Zkuste to prosím za chvilku."
following: "Nastavení sledování"
getting_started: "Předvolby nového uživatele"
+ last_exported_at: "(Naposledy aktualizováno v %{timestamp})"
liked: "…někomu se zalíbí váš příspěvek?"
mentioned: "…někdo vás zmíní v příspěvku?"
new_password: "Nové heslo"
- photo_export_unavailable: "Exportování fotek zatím nedostupné"
private_message: "…obdržíte soukromou zprávu?"
receive_email_notifications: "Přijímat oznámení e-mailem, když…"
+ request_export: "Vyžádat si má profilová data"
+ request_export_photos: "Vyžádat si moje fotky"
+ request_export_photos_update: "Obnovit moje fotky"
+ request_export_update: "Obnovit má profilová data"
reshared: "…někdo sdílí váš příspěvek?"
show_community_spotlight: "Zobrazovat Aktuality z komunity v Proudu?"
show_getting_started: "Znovu spustit Tutoriály pro nováčky"
+ someone_reported: "někdo nahlásil jako urážlivé"
started_sharing: "…někdo začne sdílet s vámi?"
stream_preferences: "Předvolby proudu"
your_email: "Váš e-mail"
@@ -1140,13 +1370,15 @@ cs:
who_are_you: "Kdo jste?"
privacy_settings:
ignored_users: "Ignorovaní uživatelé"
+ no_user_ignored_message: "Momentálně neignorujete žádné uživatele"
stop_ignoring: "Přestat ignorovat"
+ strip_exif: "Odstranit metadata typu lokace, autor a model fotoaparátu z nahrávaných obrázků (doporučeno)"
title: "Nastavení soukromí"
public:
does_not_exist: "Uživatel %{username} neexistuje!"
update:
email_notifications_changed: "Oznámení e-mailem změněno"
- follow_settings_changed: "Následující nastavení se změnily"
+ follow_settings_changed: "Následující nastavení se změnila"
follow_settings_not_changed: "Následující nastavení se nepodařilo změnit"
language_changed: "Jazyk změněn"
language_not_changed: "Změna jazyka selhala"
diff --git a/config/locales/diaspora/cy.yml b/config/locales/diaspora/cy.yml
index 8f4b703c9..23df29235 100644
--- a/config/locales/diaspora/cy.yml
+++ b/config/locales/diaspora/cy.yml
@@ -34,10 +34,6 @@ cy:
confirm_remove_aspect: "A ydych yn siŵr eich bod am ddileu yr agwedd hon?"
make_aspect_list_visible: "make aspect list visible?"
remove_aspect: "Dileu yr agwedd hwn"
- few: "%{count} agweddau"
- helper:
- are_you_sure: "A ydych yn siŵr eich bod am ddileu yr agwedd hon?"
- aspect_not_empty: "Agwedd nid ar wag"
index:
diaspora_id:
heading: "ID Diaspora"
@@ -52,9 +48,6 @@ cy:
tag_question: "#question"
no_contacts: "Dim cysylltiadau"
no_tags: "No tags"
- many: "%{count} agweddau"
- move_contact:
- success: "Unigolyn wedi symud i agwedd newydd"
new:
name: "Name"
no_contacts_message:
@@ -64,9 +57,6 @@ cy:
start_talking: "Nobody has said anything yet. Get the conversation started!"
one: "1 aspect"
other: "%{count} agweddau"
- selected_contacts:
- view_all_contacts: "Gweld cysylltiadau i gŷd"
- two: "%{count} agweddau"
update:
success: "Eich aspect, %{name}, wedi bod yn golygu yn llwyddiannus."
zero: "dim agweddau"
@@ -79,25 +69,19 @@ cy:
heading: "Diaspora Bookmarklet"
cancel: "Diddymu"
comments:
- few: "%{count} comments"
- many: "%{count} comments"
new_comment:
comment: "Sylw"
contacts:
- few: "%{count} contacts"
index:
add_a_new_aspect: "Ychwanegwch agwedd newydd"
add_to_aspect: "Add contacts to %{name}"
all_contacts: "Cysylltiadau i gŷd"
my_contacts: "Fy nghysylltiadau"
no_contacts: "No contacts."
- remove_person_from_aspect: "Tynnu %{person_name} oddi ar \"%{aspect_name}\""
title: "Cysylltiadau"
your_contacts: "Eich Cysylltiadau chi"
- many: "%{count} contacts"
one: "1 contact"
other: "%{count} contacts"
- two: "%{count} contacts"
zero: "no contacts"
conversations:
create:
@@ -278,8 +262,6 @@ cy:
password: "Cyfrinair"
password_confirmation: "Cadarnhad Cyfrinair"
people:
- few: "%{count} pobl"
- many: "%{count} pobl"
one: "1 unigolyn"
other: "%{count} pobl"
person:
@@ -300,7 +282,6 @@ cy:
start_sharing: "dechrau rhannu"
sub_header:
edit: "golygu"
- two: "%{count} people"
zero: "no people"
photos:
comment_email_subject: "ffoto %{name}"
@@ -445,13 +426,7 @@ cy:
status_messages:
helper:
no_message_to_display: "Dim neges i arddangos."
- too_long:
- few: "please make your status messages less than %{count} characters"
- many: "please make your status messages less than %{count} characters"
- one: "please make your status messages less than %{count} character"
- other: "please make your status messages less than %{count} characters"
- two: "please make your status messages less than %{count} characters"
- zero: "please make your status messages less than %{count} characters"
+ too_long: "{\"few\"=>\"please make your status messages less than %{count} characters\", \"many\"=>\"please make your status messages less than %{count} characters\", \"one\"=>\"please make your status messages less than %{count} character\", \"other\"=>\"please make your status messages less than %{count} characters\", \"two\"=>\"please make your status messages less than %{count} characters\", \"zero\"=>\"please make your status messages less than %{count} characters\"}"
stream_helper:
hide_comments: "hide comments"
show_comments:
@@ -483,9 +458,6 @@ cy:
destroy:
failure: "Failed to stop following: #%{name}"
success: "Successfully stopped following: #%{name}"
- tags:
- show:
- nobody_talking: "Does neb yn siarad am %{tag} eto."
username: "Enw Defnyddiwr"
users:
confirm_email:
@@ -498,7 +470,6 @@ cy:
change_password: "Newid cyfrinair"
close_account:
what_we_delete: "We delete all of your posts, profile data, as soon as humanly possible. Your comments will hang around, but be associated with your Diaspora Handle."
- download_xml: "llwytho i lawr fy xml"
email_awaiting_confirmation: "We have sent you an activation link to %{unconfirmed_email}. Till you follow this link and activate the new address, we will continue to use your original address %{email}."
export_data: "Data Allforio"
new_password: "Cyfrinair newydd "
diff --git a/config/locales/diaspora/da.yml b/config/locales/diaspora/da.yml
index ce0edf7c5..c6f28f81c 100644
--- a/config/locales/diaspora/da.yml
+++ b/config/locales/diaspora/da.yml
@@ -5,13 +5,14 @@
da:
- _applications: "Applikationer"
+ _applications: "Programmer"
_comments: "Kommentarer"
_contacts: "Kontakter"
_help: "Hjælp"
_home: "Hjem"
_photos: "Billeder"
_services: "Tjenester"
+ _statistics: "Statistik"
_terms: "Betingelser"
account: "Konto"
activerecord:
@@ -40,7 +41,7 @@ da:
reshare:
attributes:
root_guid:
- taken: "Er det så godt, hva'? Du har allerede delt indlægget!"
+ taken: "Er det så godt, hva? Du har allerede delt indlægget!"
user:
attributes:
email:
@@ -60,9 +61,9 @@ da:
user_search: "Søg efter brugere"
weekly_user_stats: "Ugentlig bruger-statistik"
correlations:
- correlations_count: "Correlationer med Indmeld i antallet."
+ correlations_count: "Correlationer med indmeld i antallet."
stats:
- 2weeks: "to uger"
+ 2weeks: "2 uger"
50_most: "50 mest populære tags"
comments:
one: "%{count} kommentar"
@@ -89,22 +90,26 @@ da:
zero: "%{count} brugere"
week: "Uge"
user_entry:
- account_closed: "konto lukket"
- diaspora_handle: "Diaspora navn"
+ account_closed: "Konto lukket"
+ diaspora_handle: "Dit Diaspora-navn"
email: "E-mail"
guid: "GUID"
id: "ID"
- last_seen: "sidst set"
+ last_seen: "Sidst set"
? "no"
- : nej
+ : Nej
nsfw: "#nsfw"
- unknown: "ukendt"
+ unknown: "Ukendt"
? "yes"
- : ja
+ : Ja
user_search:
account_closing_scheduled: "Kontoen med navnet: %{name} vil blive lukket om et øjeblik ..."
+ account_locking_scheduled: "Kontoen med navnet: %{name} vil blive lukket om et øjeblik ..."
+ account_unlocking_scheduled: "Kontoen med navnet: %{name} vil blive genåbnet om et øjeblik ..."
add_invites: "Tilføj invitationer"
are_you_sure: "Er du sikker på at du vil lukke denne konto?"
+ are_you_sure_lock_account: "Er du sikker på at du vil låse denne konto?"
+ are_you_sure_unlock_account: "Er du sikker på at du vil genåbne denne konto?"
close_account: "Luk konto"
email_to: "Inviter på e-mail"
under_13: "Vis brugere der er under 13 (COPPA)"
@@ -134,15 +139,13 @@ da:
are_you_sure_delete_account: "Er du helt sikker på at du ønsker at lukke din konto? Det kan ikke fortrydes!"
aspect_memberships:
destroy:
- failure: "Kunne ikke fjerne person fra aspekt"
- no_membership: "Kunne ikke finde den valgte person i det aspekt"
- success: "Personen er fjernet fra aspektet"
+ failure: "Kunne ikke fjerne person fra aspekt."
+ no_membership: "Kunne ikke finde den valgte person i det aspekt."
+ success: "Personen er fjernet fra aspektet."
aspects:
add_to_aspect:
failure: "Kunne ikke tilføje kontakten til aspektet."
success: "Kontakt blev tilføjet aspektet."
- aspect_contacts:
- done_editing: "afslut redigering"
aspect_listings:
add_an_aspect: "+ Tilføj et aspekt"
deselect_all: "Fravælg alle"
@@ -161,30 +164,25 @@ da:
failure: "%{name} er ikke tom, og kan derfor ikke slettes."
success: "%{name} fjernet."
edit:
- add_existing: "Tilføj en eksisterende kontakt "
+ aspect_chat_is_enabled: "Kontakter i dette aspekt kan chatte med dig."
+ aspect_chat_is_not_enabled: "Kontakter i dette aspekt kan ikke chatte med dig."
aspect_list_is_not_visible: "kontakter i dette aspekt er ikke i stand til at se hinanden."
aspect_list_is_visible: "kontakter i dette aspekt er synlige for hinanden."
confirm_remove_aspect: "Er du sikker på du vil slette dette aspekt?"
- done: "Gennemført"
- make_aspect_list_visible: "gør kontakter i dette aspekt synlige for hinanden?"
- manage: "Administrer"
+ grant_contacts_chat_privilege: "Giv kontakter i dette aspekt chat-privilegier?"
+ make_aspect_list_visible: "Gør kontakter i dette aspekt synlige for hinanden?"
remove_aspect: "Slet dette aspekt"
- rename: "omdøb"
+ rename: "Omdøb"
set_visibility: "Indstil synlighed"
update: "Opdater"
- updating: "opdaterer"
- few: "%{count} aspekter"
- helper:
- are_you_sure: "Er du sikker på at du vil fjerne dette aspekt?"
- aspect_not_empty: "Aspektet er ikke tomt"
- remove: "slet"
+ updating: "Opdaterer"
index:
diaspora_id:
- content_1: "Dit Diaspora*-ID er:"
- content_2: "Giv det til hvem som helst og de vil kunne finde dig på Diaspora.*"
- heading: "Diaspora*-ID"
+ content_1: "Dit Diaspora-ID er:"
+ content_2: "Giv det til hvem som helst, og de vil kunne finde dig på Diaspora."
+ heading: "Diaspora-ID"
donate: "Donér"
- handle_explanation: "Dette er dit Diaspora*-ID. Som med en e-mail-adresse, kan du give det til folk, så de kan kontakte dig."
+ handle_explanation: "Dette er dit Diaspora-ID. Som med en e-mail-adresse, kan du give det til folk, så de kan kontakte dig."
help:
any_problem: "Problemer?"
contact_podmin: "Kontakt din pods administrator!"
@@ -194,40 +192,35 @@ da:
feature_suggestion: "... har du et %{link} forslag?"
find_a_bug: "... har du fundet en %{link}?"
have_a_question: "... har du et %{link}?"
- here_to_help: "Diaspora* fællesskabet er her!"
- mail_podmin: "Podmin e-mail"
+ here_to_help: "Diaspora-samfundet er lige her!"
+ mail_podmin: "Podmins e-mail"
need_help: "Brug for hjælp?"
tag_bug: "fejl"
- tag_feature: "funktion"
+ tag_feature: "feature"
tag_question: "spørgsmål"
tutorial_link_text: "Guider"
tutorials_and_wiki: "%{faq}, %{tutorial} og %{wiki}: Hjælp til at komme i gang."
introduce_yourself: "Dette er din strøm. Hop ud i den og introducér dig selv."
- keep_diaspora_running: "Hjælp udviklingen af Diaspora* med en månedlig donation!"
- keep_pod_running: "Hjælp med at få %{pod} til at køre, og sørg for at administratoren kan få sig en håndbajer i ny og næ med en månedlig donation."
+ keep_diaspora_running: "Hjælp udviklingen af Diaspora med en månedlig donation!"
+ keep_pod_running: "Hjælp med at få %{pod} til at køre, og sørg for at administratoren kan få sig en kop kaffe i ny og næ med en månedlig donation."
new_here:
- follow: "Følg %{link} og byd nye brugere velkommen til Diaspora*!"
+ follow: "Følg %{link} og byd nye brugere velkommen til Diaspora!"
learn_more: "Lær mere"
title: "Byd nye brugere velkommen"
no_contacts: "Ingen kontakter"
no_tags: "+ Find et tag at følge"
people_sharing_with_you: "Personer der deler med dig"
- post_a_message: "slå en besked op >>"
+ post_a_message: "Slå en besked op >>"
services:
- content: "Du kan tilslutte følgende tjenester til Diaspora*:"
+ content: "Du kan tilslutte følgende tjenester til Diaspora:"
heading: "Tilslut tjenester"
unfollow_tag: "Hold op med at følge #%{tag}"
welcome_to_diaspora: "Velkommen til Diaspora %{name}!"
- many: "%{count} aspekter"
- move_contact:
- error: "Kunne ikke flytte kontaktperson: %{inspect}"
- failure: "virkede ikke %{inspect}"
- success: "Person flyttet til nyt aspekt"
new:
create: "Opret"
name: "Navn (kun synligt for dig)"
no_contacts_message:
- community_spotlight: "kreative medlemmer"
+ community_spotlight: "Community Spotlight"
or_spotlight: "Eller du kan dele med %{link}"
try_adding_some_more_contacts: "Du kan søge (øverst) eller invitere flere kontakter (til højre)."
you_should_add_some_more_contacts: "Du kan tilføje nogle flere kontakter!"
@@ -240,72 +233,58 @@ da:
family: "Familie"
friends: "Venner"
work: "Arbejde"
- selected_contacts:
- manage_your_aspects: "Administrér dine aspekter."
- no_contacts: "Du har ingen kontakter her endnu."
- view_all_community_spotlight: "Se alle kreative medlemmer"
- view_all_contacts: "Vis alle kontakter"
- show:
- edit_aspect: "redigér aspekt"
- two: "%{count} aspekter"
update:
failure: "Dit aspekt, %{name}, var for langt til at blive gemt."
success: "Dit aspekt, %{name}, er nu blevet redigeret."
- zero: "ingen aspekter"
+ zero: "Ingen aspekter"
back: "Tilbage"
blocks:
create:
- failure: "Ignorering af bruger mislykkedes. #evasion"
- success: "Ignorering succesfuld - du kommer ikke til at se den bruger i din strøm igen. #silencio!"
+ failure: "Jeg kunne ikke ignorere denne bruger. #evasion"
+ success: "Du kommer ikke til at se denne bruger i din strøm igen. #silencio!"
destroy:
- failure: "Fjernelse af ignorering mislykkedes. #evasion"
- success: "Se hvad de har at sige! #sayhello"
+ failure: "Jeg kunne ikke stoppe med at ignorere denne bruger. #evasion"
+ success: "Lad os se hvad de har at sige! #sayhello"
bookmarklet:
- explanation: "Skriv indlæg på Diaspora* fra alle steder ved at bogmærke dette link => %{link}."
+ explanation: "Skriv indlæg på Diaspora fra alle steder ved at bogmærke dette link => %{link}."
heading: "Bogmærke"
- post_something: "Skriv indlæg til Diaspora*"
+ post_something: "Skriv indlæg til Diaspora"
post_success: "Slået op! Lukker!"
cancel: "Annullér"
comments:
- few: "%{count} kommentarer"
- many: "%{count} kommentarer"
new_comment:
comment: "Kommentér"
commenting: "Kommenterer ..."
one: "1 kommentar"
other: "%{count} kommentarer"
- two: "%{count} aspekter"
- zero: "ingen kommentarer"
+ zero: "Ingen kommentarer"
contacts:
create:
failure: "Kunne ikke oprette kontakten"
- few: "%{count} kontaktpersoner"
index:
add_a_new_aspect: "Tilføj nyt aspekt"
- add_to_aspect: "Tilføj kontaktpersoner til %{name}"
- add_to_aspect_link: "tilføj kontakter til %{name}"
+ add_contact: "Tilføj kontakt"
+ add_to_aspect: "Tilføj kontakter til %{name}"
all_contacts: "Alle kontakter"
- community_spotlight: "Kreative medlemmer"
- many_people_are_you_sure: "Er du sikker på du vil starte en privat samtale med mere end %{suggested_limit} kontakter? Et indlæg til dette aspekt kan være en bedre måde at kontakte dem på."
+ community_spotlight: "Community Spotlight"
my_contacts: "Mine kontakter"
no_contacts: "Det ser ud til at du har brug for til at tilføje nogle kontaktpersoner!"
+ no_contacts_in_aspect: "Du har ikke nogen kontakter i dette aspekt endnu. Herunder er en liste over dine eksisterende kontakter som du kan føje til aspektet."
no_contacts_message: "Se %{community_spotlight}"
- no_contacts_message_with_aspect: "Se %{community_spotlight} eller %{add_to_aspect_link}"
only_sharing_with_me: "Deler kun med mig"
- remove_person_from_aspect: "Fjern %{person_name} fra \"%{aspect_name}\""
+ remove_contact: "Fjern kontakt"
start_a_conversation: "Start en samtale"
title: "Kontakter"
+ user_search: "Søg efter brugere"
your_contacts: "Dine kontakter"
- many: "%{count} kontakter"
one: "Én kontaktperson"
other: "%{count} kontaktpersoner"
sharing:
people_sharing: "Personer der deler med dig:"
spotlight:
- community_spotlight: "Kreative medlemmer"
+ community_spotlight: "Community Spotlight"
suggest_member: "Foreslå et medlem"
- two: "%{count} kontakter"
- zero: "kontakter"
+ zero: "Ingen kontakter"
conversations:
conversation:
participants: "Deltagere"
@@ -314,7 +293,8 @@ da:
no_contact: "Hej, du kan tilføje din første kontaktperson!"
sent: "Besked sendt"
destroy:
- success: "Samtale slettet med succes"
+ delete_success: "Konversationen er blevet slettet"
+ hide_success: "Konversationen er blevet skjult"
helper:
new_messages:
few: "%{count} nye beskeder"
@@ -328,18 +308,19 @@ da:
create_a_new_conversation: "Start en ny samtale"
inbox: "Indbakke"
new_conversation: "Nye samtaler"
- no_conversation_selected: "ingen samtale valgt"
- no_messages: "ingen beskeder"
+ no_conversation_selected: "Ingen samtale valgt"
+ no_messages: "Ingen beskeder"
new:
abandon_changes: "Opgiv ændringer?"
send: "Send"
sending: "Sender..."
- subject: "emne"
- to: "til"
+ subject: "Emne"
+ to: "Til"
new_conversation:
fail: "Ugyldig meddelelse"
show:
- delete: "slet og bloker samtalen"
+ delete: "Slet samtalen"
+ hide: "Skjul konversationen og gør den tavs"
reply: "Svar"
replying: "Svarer..."
date:
@@ -362,7 +343,7 @@ da:
account_and_data_management:
close_account_a: "Gå til bunden af ​​dine indstillinger og tryk på knappen \"Luk konto\"."
close_account_q: "Hvordan sletter jeg min seed (konto)?"
- data_other_podmins_a: "Så snart du deler med en person fra en anden pod vil de indlæg du deler med dem og en kopi af din profil blive lagret (cached) på deres pod, og være tilgængelige for denne pods database-administrator. Når du sletter et indlæg eller profildata, bliver den slettet fra din pod og alle andre pods, hvor det tidligere har været gemt."
+ data_other_podmins_a: "Så snart du deler med en person fra en anden pod vil de indlæg du deler med dem og en kopi af din profil blive lagret (cached) på deres pod, og være tilgængelige for denne pods database-administrator. Når du sletter et indlæg eller profildata, bliver den slettet fra din pod og alle andre pods, hvor den tidligere har været gemt."
data_other_podmins_q: "Kan administratorer af andre pods se min information?"
data_visible_to_podmin_a: "Kommunikationen *mellem* pods er altid krypteret (ved hjælp af SSL og Diasporas egen transportkryptering), men lagring af data på pods er ikke krypteret. Hvis de ville, kunne database-administratoren for din pod (normalt den person, der kører din pod) få adgang til alle dine profildata og alle dine indlæg (som det er tilfældet for de fleste hjemmesider der lagrer brugerdata). Kører du din egen pod giver det mere privatliv, da du så styrer adgangen til databasen selv."
data_visible_to_podmin_q: "Hvor meget af min information kan min pod-administrator se?"
@@ -376,11 +357,11 @@ da:
change_aspect_of_post_q: "Når jeg har lagt et indlæg op kan jeg så ændre det aspekt (de aspekter) der kan se det?"
contacts_know_aspect_a: "Nej. De kan ikke under nogen omstændigheder se aspektets navn."
contacts_know_aspect_q: "Ved mine kontakter hvilke aspekter jeg har placeret dem i?"
- contacts_visible_a: "Hvis du vælger denne indstilling så vil kontakter fra dette aspekt på din profil side under dit billede være i stand til at se, hvem der ellers er i aspektet. Det er bedst at vælge denne mulighed, hvis kontakterne alle kender hinanden. De vil stadig ikke være i stand til at se hvad aspektet hedder."
+ contacts_visible_a: "Hvis du vælger denne indstilling så vil kontakter fra dette aspekt på din profil side under dit billede være i stand til at se, hvem der ellers er i aspektet. Det er bedst at vælge denne mulighed, hvis kontakterne alle kender hinanden. De vil stadig ikke være i stand til at se hvad aspektet hedder."
contacts_visible_q: "Hvad betyder: \"gør kontakter i dette aspekt synlige for hinanden?\""
- delete_aspect_a: "I listen med aspekter i venstre side, holder du musen over det aspekt du vil slette. Tryk på den lille blyant der dukker op til højre. Tryk på slet-knappen i den lille boks der dukker op."
+ delete_aspect_a: "I listen med aspekter i venstre side, holder du musen over det aspekt du vil slette. Tryk på den lille blyant der dukker op til højre. Tryk på slet-knappen i den lille boks der dukker op."
delete_aspect_q: "Hvordan sletter jeg et aspekt?"
- person_multiple_aspects_a: "Ja. Gå til din kontaktliste, og tryk på \"mine kontakter\". For hver kontakt kan du bruge menuen til højre for at føje dem til (eller fjerne dem fra) så mange aspekter, som du ønsker. Du kan også føje dem til et nyt aspekt (eller fjerne dem fra et aspekt) ved at klikke på aspektknappen på deres profilside. Eller du kan bare flytte markøren hen over deres navn i din strøm. En \"svæveboks\" vil komme op og du kan ændre deres aspekt der."
+ person_multiple_aspects_a: "Ja. Gå til din kontaktliste, og tryk på \"mine kontakter\". For hver kontakt kan du bruge menuen til højre for at føje dem til (eller fjerne dem fra) så mange aspekter, som du ønsker. Du kan også føje dem til et nyt aspekt (eller fjerne dem fra et aspekt) ved at klikke på aspektknappen på deres profilside. Eller du kan bare flytte markøren hen over deres navn i din strøm. En \"svæveboks\" vil komme op, og du kan ændre deres aspekt der."
person_multiple_aspects_q: "Kan jeg tilføje en person til flere aspekter?"
post_multiple_aspects_a: "Ja. Når du er ved at skrive et indlæg, så brug aspekt-vælgeren for at vælge eller fravælge aspekter. Dit indlæg vil være synligt for alle de aspekter, du vælger. Du kan også vælge de aspekter, du ønsker at skrive dit indlæg til i sidekolonnen. Når du sender, vil det aspekt eller de aspekter du har valgt i listen til venstre automatisk blive valgt i aspekt-vælgeren når du begynder at skrive et nyt indlæg."
post_multiple_aspects_q: "Kan jeg lave et indlæg beregnet til flere aspekter på en gang?"
@@ -391,30 +372,41 @@ da:
restrict_posts_i_see_a: "Ja. Tryk på \"Dine aspekter\" i sidekolonnen og tryk så på de enkelte aspekter i listen for at vælge eller afvælge dem. Så vil kun de indlæg som hører til i de valgte aspekter vises i din strøm."
restrict_posts_i_see_q: "Kan jeg begrænse de indlæg jeg ser til bare at være dem fra visse aspekter?"
title: "Aspekter"
- what_is_an_aspect_a: "Aspekter er den måde du kan gruppere dine kontakter på Diaspora*. Et aspekt er en af de roller du har i verden. Det kan være i forhold til dit arbejde, din familie eller overfor venner du kender gennem en forening."
+ what_is_an_aspect_a: "Aspekter er den måde du kan gruppere dine kontakter på Diaspora. Et aspekt er en af de roller du har i verden. Det kan være i forhold til dit arbejde, din familie eller overfor venner du kender gennem en forening."
what_is_an_aspect_q: "Hvad er et aspekt?"
- who_sees_post_a: "Hvis du laver et begrænset indlæg , vil det kun være synligt for de personer du har lagt i dette aspekt (eller de aspekter, hvis det er lavet til flere aspekter). Kontakter, du har der ikke er i det aspekt kan ikke se indlægget, medmindre du har gjort det offentligt. Kun offentlige indlæg vil nogensinde være synlige for alle, der ikke er placeret i et af ​​dine aspekter."
+ who_sees_post_a: "Hvis du laver et begrænset indlæg, vil det kun være synligt for de personer du har lagt i dette aspekt (eller de aspekter, hvis det er lavet til flere aspekter). Kontakter, du har der ikke er i det aspekt kan ikke se indlægget, medmindre du har gjort det offentligt. Kun offentlige indlæg vil nogensinde være synlige for alle, der ikke er placeret i et af ​​dine aspekter."
who_sees_post_q: "Hvis jeg skriver et indlæg til et aspekt hvem kan så se det?"
- foundation_website: "Diaspora-stiftelsens webside"
+ chat:
+ add_contact_roster_a: "Først skal du slå chat til for det af dine aspekter personen er i. For at gøre det gå til %{contacts_page}, vælg det aspekt du ønsker og klik chat-ikonnet. Herved slår du chat til for det aspekt. %{toggle_privilege} Hvis du ønsker det kan du lave et nyt aspekt kaldet \"Chat\" og så tilføje de personer du er interesseret i at chatte med. Når du har gjort det, åben chat interfacet og vælg den person du vil chatte med."
+ add_contact_roster_q: "Hvordan chatter jeg med nogen i Diaspora?"
+ contacts_page: "kontakt side"
+ title: "Chat"
+ faq: "FAQ"
+ foundation_website: "Diaspora-stiftelsens hjemmeside"
getting_help:
- get_support_a_hashtag: "spørg i et offentlig indlæg på diaspora* og brug %{question} hashtagget"
- get_support_a_irc: "slut dig til os på %{irc} (live chat)"
- get_support_a_tutorials: "check vores %{tutorials}"
- get_support_a_website: "besøg vores %{link}"
- get_support_a_wiki: "søg i %{link}"
+ get_support_a_faq: "Læs vores %{faq} side på wikien"
+ get_support_a_hashtag: "Spørg i et offentlig indlæg på Diaspora og brug %{question} hashtagget"
+ get_support_a_irc: "Slut dig til os på %{irc} (live chat)"
+ get_support_a_tutorials: "Check vores %{tutorials}"
+ get_support_a_website: "Besøg vores %{link}"
+ get_support_a_wiki: "Søg i %{link}"
get_support_q: "Hvad hvis mit spørgsmål ikke besvares i denne FAQ? Hvor kan jeg ellers få hjælp?"
- getting_started_a: "Du er heldig. Prøv %{tutorial_series} på vores projektside. Det vil hjælpe dig gennem registreringsprocessen og lære dig de basale ting du behøver for at kunne bruge Diaspora*."
+ getting_started_a: "Du er heldig. Prøv %{tutorial_series} på vores projektside. Det vil hjælpe dig gennem registreringsprocessen og lære dig de basale ting du behøver for at kunne bruge Diaspora."
getting_started_q: "Hjælp! Jeg skal bruge lidt hjælp for at komme i gang."
title: "Om at få hjælp"
- getting_started_tutorial: "'At komme i gang' en serie af guider"
+ getting_started_tutorial: "\"Kom i gang\" en serie af guider"
here: "her"
irc: "IRC"
keyboard_shortcuts:
keyboard_shortcuts_a1: "På siden med din Strøm kan du bruge følgende tastaturgenveje:"
- keyboard_shortcuts_li1: "j - gå til næste indlæg"
- keyboard_shortcuts_li2: "k - gå til forrige indlæg"
- keyboard_shortcuts_li3: "c - kommenter det nuværende indlæg"
- keyboard_shortcuts_li4: "l - marker at du synes om det nuværende indlæg"
+ keyboard_shortcuts_li1: "j - Gå til næste indlæg"
+ keyboard_shortcuts_li2: "k - Gå til forrige indlæg"
+ keyboard_shortcuts_li3: "c - Kommenter det nuværende indlæg"
+ keyboard_shortcuts_li4: "l - Marker at du synes om det nuværende indlæg"
+ keyboard_shortcuts_li5: "r - Del dette indlæg"
+ keyboard_shortcuts_li6: "m - Udvid dette indlæg"
+ keyboard_shortcuts_li7: "o - Åben det første link i dette indlæg"
+ keyboard_shortcuts_li8: "ctrl + enter - Send den besked du har skrevet"
keyboard_shortcuts_q: "Hvilke tastaturgenveje er til rådighed?"
title: "Tastaturgenveje"
markdown: "Markdown"
@@ -426,32 +418,32 @@ da:
see_mentions_a: "Ja. tryk på knappen \"Dine omtaler\" i venstre kolonne på din startside."
see_mentions_q: "Er der en måde at se de indlæg hvor jeg er blevet nævnt?"
title: "Omtaler"
- what_is_a_mention_a: "At nævne folk betyder at du i et indlæg indsætter et link til en anden Diaspora-brugers profilside. Når en person bliver nævnt på denne måde vil de blive informeret om det i deres meddelelser."
+ what_is_a_mention_a: "At nævne folk betyder at du i et indlæg indsætter et link til en anden Diaspora-brugers profilside. Når en person bliver nævnt på denne måde vil de blive informeret om det i deres notifikationer."
what_is_a_mention_q: "Hvad er en \"omtale?\""
miscellaneous:
back_to_top_a: "Ja. Når du har rullet en hel side ned kan du klikke på den grå pil der vises i nederste højre hjørne af browservinduet."
back_to_top_q: "Er der en hurtig måde at gå tilbage til toppen af siden når jeg har rullet ned?"
- diaspora_app_a: "Der er flere Android-apps under udvikling. Flere er forladte projekter og fungerer derfor ikke godt sammen med den aktuelle version af diaspora *. Forvent ikke meget af disse apps. I øjeblikket er den bedste måde at få adgang til diaspora * fra din mobile enhed, gennem en browser, fordi vi har udviklet en mobil version af hjemmesiden, som bør virke godt på alle enheder. Der er i øjeblikket ingen app til iOS. Igen bør diaspora * fungere fint via din browser."
- diaspora_app_q: "Findes der en Diaspora*-app til Android eller IOS?"
+ diaspora_app_a: "Der er flere Android-apps under udvikling. Flere er forladte projekter og fungerer derfor ikke godt sammen med den aktuelle version af Diaspora. Forvent ikke meget af disse apps. I øjeblikket er den bedste måde at få adgang til Diaspora fra din mobile enhed gennem en browser, fordi vi har udviklet en mobil version af hjemmesiden som bør virke godt på alle enheder. Der er i øjeblikket ingen app til iOS. Igen bør Diaspora fungere fint via din browser."
+ diaspora_app_q: "Findes der en Diaspora-app til Android eller IOS?"
photo_albums_a: "Nej, ikke i øjeblikket. Men du kan se en strøm af deres uploadede billeder fra fotosektionen i sidekolonnen af deres profilside."
photo_albums_q: "Er der billed, eller videoalbums?"
- subscribe_feed_a: "Ja, men denne funktion er stadig ret upoleret og formateringen af resultaterne er stadig temmelig grov. Hvis du ønsker at prøve det alligevel, så gå til en profilside og klik på feed-knappen i din browser. Du kan også kopiere profilens URL (dvs. https://joindiaspora.com/people/etnummer) og indsætte den i en feed-læser. Den resulterende feed-adresse vil se sådan ud: https://joindiaspora.com/public/username.atom - Diaspora* bruger Atom og ikke RSS."
+ subscribe_feed_a: "Ja, men denne funktion er stadig ret upoleret og formateringen af resultaterne er stadig temmelig grov. Hvis du ønsker at prøve det alligevel, så gå til en profilside og klik på feed-knappen i din browser. Du kan også kopiere profilens URL (dvs. https://joindiaspora.com/people/etnummer) og indsætte den i en feed-læser. Den resulterende feed-adresse vil se sådan ud: https://joindiaspora.com/public/username.atom - Diaspora bruger Atom og ikke RSS."
subscribe_feed_q: "Kan jeg abonnere på nogens offentlige indlæg med en feed-læser?"
title: "Diverse"
pods:
find_people_a: "Inviter dine venner ved at bruge e-mail-linket i side-kolonnen. Følg #tags for at finde andre som du deler interesser med, og tilføj dem hvis indlæg interesserer dig til et af dine aspekter. Sørg for at alle ved at du er ny ved at sætte tagget #newhere i et offentligt indlæg."
find_people_q: "Jeg har lige tilsluttet mig en pod, hvordan kan jeg finde folk at dele med?"
title: "Pods"
- use_search_box_a: "Hvis du kender deres fulde diaspora* ID (f.eks brugernavn@podnavn.org), kan du finde dem ved at søge efter det. Hvis du er på samme pod kan du nøjes med at søge efter deres brugernavn. Et alternativ er at søge efter dem ved at søge på deres profilnavn (det navn, du ser på skærmen). Hvis en søgning ikke virker første gang, så prøv igen."
+ use_search_box_a: "Hvis du kender deres fulde Diaspora-ID (f.eks brugernavn@podnavn.org), kan du finde dem ved at søge efter det. Hvis du er på samme pod kan du nøjes med at søge efter deres brugernavn. Et alternativ er at søge efter dem ved at søge på deres profilnavn (det navn, du ser på skærmen). Hvis en søgning ikke virker første gang, så prøv igen."
use_search_box_q: "Hvordan bruger jeg søgefeltet til at finde bestemte personer?"
- what_is_a_pod_a: "En pod er en server, der kører Diaspora*-softwaren og er forbundet til diaspora*-netværket. \"Pod\" er engelsk for en plantebælg, og er således en metafor: En bælg indeholder frø på samme måde som en server indeholder brugerkonti. Der er mange forskellige pods. Du kan tilføje venner fra andre pods og kommunikere med dem. (Du kan tænke på en diaspora* pod som du tænker på en e-mailudbyder: Der er offentlige pods, private pods og med en vis indsats kan du endda køre din egen)."
+ what_is_a_pod_a: "En pod er en server, der kører Diaspora-softwaren og er forbundet til Diaspora-netværket. \"Pod\" er engelsk for en plantebælg, og er således en metafor: En bælg indeholder frø på samme måde som en server indeholder brugerkonti. Der er mange forskellige pods. Du kan tilføje venner fra andre pods og kommunikere med dem. (Du kan tænke på en Diaspora pod som du tænker på en e-mailudbyder: Der er offentlige pods, private pods og med en vis indsats kan du endda køre din egen)."
what_is_a_pod_q: "Hvad er en pod?"
posts_and_posting:
- char_limit_services_a: "I dette tilfælde vil dit indlæg være begrænset til et mindre antal tegn (140 i tilfælde af Twitter, 1000 i tilfælde af Tumblr), og antallet af tegn, du har tilbage vises, når denne tjenestes ikon er fremhævet. Du kan stadig skrive til disse tjenester, hvis dit indlæg er længere end deres grænse, men teksten vil i så fald blive afkortet på disse tjenester."
+ char_limit_services_a: "I dette tilfælde vil dit indlæg være begrænset til et mindre antal tegn (140 tegn hvis det drejer sg om Twitter, 1000 tegn for Tumblr), og antallet af tegn, du har tilbage vises, når denne tjenestes ikon er fremhævet. Du kan stadig skrive til disse tjenester, hvis dit indlæg er længere end deres grænse, men teksten vil i så fald blive afkortet på disse tjenester."
char_limit_services_q: "Hvad er tegngrænsen for indlæg der deles via en tilsluttet tjeneste, der kræver et mindre antal tegn?"
character_limit_a: "65.535 tegn. Det er 65.395 flere tegn end du får på Twitter! ;)"
character_limit_q: "Hvad er grænsen for hvor mange tegn der må være i et indlæg?"
- embed_multimedia_a: "Du kan som regel bare indsætte URL-adressen (f.eks http://www.youtube.com/watch?v=nnnnnnnnnnn) i dit indlæg og så vil video eller lyd blive indlejret automatisk. Nogle af de sider, der understøttes er: YouTube, Vimeo, SoundCloud, Flickr og et par mere. Diaspora * Bruger oEmbed til denne funktion. Vi understøtter løbende nye sider. Husk altid at skrive enkle, fulde links: ingen forkortede links, ingen operatorer efter grund-URLen - og giv det lidt tid, før du opdaterer siden for at se din forhåndsvisning."
+ embed_multimedia_a: "Du kan som regel bare indsætte URL-adressen (f.eks http://www.youtube.com/watch?v=nnnnnnnnnnn) i dit indlæg og så vil video eller lyd blive indlejret automatisk. Nogle af de sider, der understøttes er: YouTube, Vimeo, SoundCloud, Flickr og et par mere. Diaspora bruger oEmbed til denne funktion. Vi understøtter løbende nye sider. Husk altid at skrive enkle, fulde links: ingen forkortede links, ingen operatorer efter grund-URLen - og giv det lidt tid, før du opdaterer siden for at se din forhåndsvisning."
embed_multimedia_q: "Hvordan kan jeg indlejre en video, lyd eller andet multimedieindhold i et indlæg?"
format_text_a: "Ved at bruge et simplificeret system kaldet %{markdown}. Du kan finde en komplet introduktion til Markdown syntaks %{here}. Forhåndsvisning-knappen er virkelig praktisk her, da du kan se hvordan dit indlæg vil komme til at se ud inden du deler det."
format_text_q: "Hvordan kan jeg formatere teksten i mine indlæg (fed, kursiv, osv.)?"
@@ -473,31 +465,31 @@ da:
stream_full_of_posts_q: "Hvorfor er min strøm fuld af indlæg fra personer, jeg ikke kender og ikke deler med?"
title: "Indlæg og om at sende dem"
private_posts:
- can_comment_a: "Kun Diaspora *-brugere der er logget ind og som du har placeret i dette aspekt kan kommentere eller like dine private indlæg."
+ can_comment_a: "Kun Diaspora-brugere der er logget ind og som du har placeret i dette aspekt kan kommentere eller like dine private indlæg."
can_comment_q: "Hvem kan kommentere eller like mine private indlæg?"
- can_reshare_a: "Ingen. Private indlæg kan ikke videresendes. Diaspora *-brugerne der kan se indlægget fordi de er i samme aspekt kan dog potentielt kopiere og indsætte det i et af deres egne indlæg."
+ can_reshare_a: "Ingen. Private indlæg kan ikke videresendes. Diaspora-brugerne der kan se indlægget fordi de er i samme aspekt kan dog potentielt kopiere og indsætte det i et af deres egne indlæg."
can_reshare_q: "Hvem kan videredele mine private indlæg?"
see_comment_a: "Kun de mennesker som indlægget blev delt med (dem der er i det aspekt som den oprindelige forfatter valgte for indlægget) kan se kommentarer og likes. "
see_comment_q: "Når jeg kommenterer eller synes om privat indlæg, hvem kan så se det"
title: "Private indlæg"
- who_sees_post_a: "Kun diaspora*-brugere der er logget ind, og som du har placeret i dette aspekt kan se din private indlæg."
+ who_sees_post_a: "Kun Diaspora-brugere der er logget ind, og som du har placeret i dette aspekt kan se din private indlæg."
who_sees_post_q: "Når jeg sender en besked til et aspekt (dvs. en privat post), hvem kan så se det?"
private_profiles:
title: "Private profiler"
- whats_in_profile_a: "Biografi, placering, køn og fødselsdag. Det er de ting i den nederste del af profilredigeringssiden. Disse oplysninger er valgfri - det er op til dig om du vil udfylde. indloggede brugere som du har føjet til dine aspekter er de eneste, der kan se din private profil. De kan også se de indlæg du har foretaget i de aspekt(er) de er i og dine offentlige indlæg når de besøger din profil side."
+ whats_in_profile_a: "Biografi, placering, køn og fødselsdag. Det er de ting i den nederste del af profilredigeringssiden. Disse oplysninger er valgfri - det er op til dig om du vil udfylde dem. indloggede brugere som du har føjet til dine aspekter er de eneste, der kan se din private profil. De kan også se de indlæg du har foretaget i de aspekt(er) de er i og dine offentlige indlæg når de besøger din profil side."
whats_in_profile_q: "Hvad indeholder min private profil?"
who_sees_profile_a: "Enhver bruger der er logged ind og som du deler med (en du har tilføjet til et aspekt). Folk der følger dig men som du ikke følger, vil dog kun kunne se din offentlige information."
who_sees_profile_q: "Hvem kan se min private profil?"
who_sees_updates_a: "Alle der er i et af dine aspekter kan se ændringer i din private profil. "
who_sees_updates_q: "Hvem kan se når jeg opdaterer min private profil?"
public_posts:
- can_comment_reshare_like_a: "Enhver der er logget på diaspora * kan kommentere, videredele eller like dine offentlige indlæg."
+ can_comment_reshare_like_a: "Enhver der er logget på Diaspora kan kommentere, videredele eller like dine offentlige indlæg."
can_comment_reshare_like_q: "Hvem kan kommentere, videredele eller like mine offentlige indlæg?"
deselect_aspect_posting_a: "Det påvirker ikke offentlige indlæg at fravælge aspekter. Det vil stadig være synligt i strømmen hos alle dine kontakter. For at begrænse adgangen til specifikke aspekter, skal du vælge de aspekter du ønsker skal kunne se indlægget med knapperne under indlægget"
deselect_aspect_posting_q: "Hvad sker der, når jeg fravælger et eller flere aspekter, når jeg laver et offentligt indlæg?"
find_public_post_a: "Dine offentlige indlæg vises i strømmen hos alle der følger dig. Hvis du har inkluderet #tags i dine offentlige indlæg, vil enhver der følger disse tags kunne se dit indlæg i deres strøm. Hvert offentligt indlæg har også en specifik webadresse som alle kan se selvom de er ikke logget ind - og dermed kan man linke offentlige indlæg direkte fra Twitter, blogs osv. Offentlige indlæg bliver også indekseret af søgemaskiner."
find_public_post_q: "Hvordan kan folk finde mine offentlige indlæg?"
- see_comment_reshare_like_a: "Enhver der er logget på diaspora * og andre på internettet. Kommentarer, likes og videredelinger af offentlige indlæg er også offentlige."
+ see_comment_reshare_like_a: "Enhver der er logget på Diaspora og andre på internettet. Kommentarer, likes og videredelinger af offentlige indlæg er også offentlige."
see_comment_reshare_like_q: "Når jeg kommenterer, videredeler eller liker en offentlig post, Hvem kan så se det?"
title: "Offentlige indlæg"
who_sees_post_a: "Alle der bruger internettet vil kunne se dine offentlige indlæg, så vær sikker på at du virkelig ønsker at det skal være offentligt. Det er en fin måde at række hånden ud mod verden."
@@ -506,9 +498,9 @@ da:
title: "Offentlige profiler"
what_do_tags_do_a: "De hjælper folk til at få et indtryk af dig. Dit profilbillede vil også kunne ses i den venstre side af det specifikke tags side sammen med alle de andre der har dem i deres offentlige profil."
what_do_tags_do_q: "Hvad bruges de tags jeg har skrevet på min personlige profil til?"
- whats_in_profile_a: "Du kan vælge fem tags som du synes beskriver dig som person og et billede. Det er det man kan se i den øverste del af siden når du redigerer din profil. Du kan gøre denne information lige så præcis eller anonym som du selv synes. Din profil vil også vise de offentlige indlæg du har lavet."
+ whats_in_profile_a: "Du kan vælge fem tags som du synes beskriver dig som person og et billede. Det er det man kan se i den øverste del af siden når du redigerer din profil. Du kan gøre denne information lige så identificerbar eller anonym som du selv synes. Din profil vil også vise de offentlige indlæg du har lavet."
whats_in_profile_q: "Hvad indeholder min offentlige profil?"
- who_sees_profile_a: "Alle Diaspora*-brugere der er logget ind og hele resten af internettet kan se det. Hver profil har en direkte URL, så man kan linke direkte til siden også fra andre sites. Det kan også indekseres af søgemaskiner."
+ who_sees_profile_a: "Alle Diaspora-brugere der er logget ind og hele resten af internettet kan se det. Hver profil har en direkte URL, så man kan linke direkte til siden også fra andre sites. Det kan også indekseres af søgemaskiner."
who_sees_profile_q: "Hvem kan se min offentlige profil?"
who_sees_updates_a: "Alle kan se ændringer hvis de besøger din profilside."
who_sees_updates_q: "Hvem kan se når jeg opdaterer min offentlige profil?"
@@ -537,18 +529,18 @@ da:
see_old_posts_q: "Når jeg føjer en person til et aspekt, kan de så se ældre indlæg som jeg allerede har lagt op til dette aspekt?"
title: "Deling"
tags:
- filter_tags_a: "Dette er endnu ikke tilgængelig direkte via diaspora *, men der er blevet skrevet %{third_party_tools} som kan tilbyde dette."
+ filter_tags_a: "Dette er endnu ikke tilgængelig direkte via Diaspora, men der er blevet skrevet %{third_party_tools} som kan tilbyde dette."
filter_tags_q: "Hvordan kan jeg filtrere/fjerne tags fra min strøm?"
- followed_tags_a: "Når du har søgt efter et tag, kan du klikke på knappen øverst på tag-siden for at \"følge\" det tag. Det vil herefter blive vist i din liste over #Fulgte tags til venstre. Hvis du klikker på en af ​​dine #Fulgte tags kommer du til det tags side, hvor du kan se de seneste indlæg der indeholder dette tag. Klik på #Fulgte tags for at se en strøm med indlæg, der omfatter et eller flere af ​​dine #Fulgte tags. "
+ followed_tags_a: "Når du har søgt efter et tag, kan du klikke på knappen øverst på tag-siden for at \"følge\" det tag. Det vil herefter blive vist i din liste over fulgte tags til venstre. Hvis du klikker på en af ​​dine fulgte tags kommer du til det tags side, hvor du kan se de seneste indlæg der indeholder dette tag. Klik på #fulgte tags for at se en strøm med indlæg, der omfatter et eller flere af ​​dine fulgte tags. "
followed_tags_q: "Hvad er #Fulgte tags\" og hvordan kan jeg følge et tag?"
people_tag_page_a: "Det er folk der har skrevet det som et tag til at beskrive sig selv i deres offentlige profil."
people_tag_page_q: "Hvem er de mennesker der er anført på den venstre side af en tag-side?"
- tags_in_comments_a: "Et tag som er tilføjet en kommentar vil stadig virke som et link til det tags side, men det vil ikke få indlægget (eller kommentaren) til at optræde på siden. Det er kun hvis tagget er i selve indlægget."
+ tags_in_comments_a: "Et tag som er tilføjet en kommentar vil stadig virke som et link til det tags side, men det vil ikke få indlægget (eller kommentaren) til at optræde på siden. Det er kun hvis tagget findes i selve indlægget."
tags_in_comments_q: "Kan jeg sætte tags i kommentarer eller kan jeg kun gøre det i indlæg?"
title: "Tags"
what_are_tags_for_a: "Tags er en måde at kategorisere indlæg på, normalt efter emne. Hvis du søger efter et tag vil du se alle de indlæg der indeholder tagget og som du har tilladelse til at se (både offentlige og private indlæg). Dette lader folk der er interesserede i et bestemt emne finde offentlige indlæg der handler om netop det."
what_are_tags_for_q: "Hvad bruger man tags til?"
- third_party_tools: "tredjeparts værktøjer"
+ third_party_tools: "Tredjeparts værktøjer"
title_header: "Hjælp"
tutorial: "guide"
tutorials: "guider"
@@ -576,16 +568,16 @@ da:
new:
already_invited: "Følgende personer har ikke accepteret din invitation:"
aspect: "Aspekt"
- check_out_diaspora: "Check Diaspora* ud!"
+ check_out_diaspora: "Check Diaspora ud!"
codes_left:
one: "En invitation tilbage på denne kode"
other: "%{count} invitationer tilbage på denne kode"
zero: "Ikke flere invitationer tilbage på denne kode"
comma_separated_plz: "Du kan indsætte flere emailadresser ved at adskille dem med komma."
if_they_accept_info: "hvis de accepterer, vil de blive tilføjet til det aspekt du inviterede dem til."
- invite_someone_to_join: "Inviter en person til Diaspora*!"
+ invite_someone_to_join: "Inviter en person til Diaspora!"
language: "Sprog"
- paste_link: "Del dette link med sine venner for at invitere dem til Diaspora*, eller email dem linket direkte."
+ paste_link: "Del dette link med sine venner for at invitere dem til Diaspora, eller email dem linket direkte."
personal_message: "Personlig besked"
resend: "Send igen"
send_an_invitation: "Send en invitation"
@@ -595,16 +587,16 @@ da:
layouts:
application:
back_to_top: "Tilbage til toppen"
- powered_by: "DREVET AF DIASPORA*"
- public_feed: "Offentligt Diaspora*-nyhedsfeed for %{name}"
- source_package: "download kildekoden"
- toggle: "skift mobil side"
+ powered_by: "Kører på Diaspora"
+ public_feed: "Offentligt Diaspora-nyhedsfeed for %{name}"
+ source_package: "Download kildekoden"
+ toggle: "Slå mobil side til/fra"
whats_new: "Hvad er nyt?"
- your_aspects: "dine aspekter"
+ your_aspects: "Dine aspekter"
header:
- admin: "admin"
- blog: "blog"
- code: "kode"
+ admin: "Admin"
+ blog: "Blog"
+ code: "Kode"
help: "Hjælp"
login: "Log ind"
logout: "Log ud"
@@ -615,29 +607,26 @@ da:
likes:
likes:
people_dislike_this:
- few: "%{count} synes ikke om"
- many: "%{count} synes ikke om"
one: "Én person synes ikke om"
other: "%{count} synes ikke om"
- two: "%{count} synes ikke om"
- zero: "ingen synes ikke om"
+ zero: "Ingen synes ikke om"
people_like_this:
one: "%{count} synes godt om dette"
other: "%{count} synes godt om dette"
- zero: "ingen synes godt om dette"
+ zero: "Ingen synes godt om dette"
people_like_this_comment:
one: "%{count} synes om det"
other: "%{count} synes om det"
- zero: "ingen synes om det"
+ zero: "Ingen synes om det"
limited: "Begrænset"
more: "Mere"
next: "Næste"
no_results: "Ingen resultater fundet"
notifications:
also_commented:
- one: "%{actors} kommenterede også %{post_author}s indlæg%{post_link}."
- other: "%{actors} kommenterede også %{post_author}s indlæg%{post_link}."
- zero: "%{actors} kommenterede også %{post_author}s indlæg%{post_link}."
+ one: "%{actors} kommenterede også %{post_author}s indlæg %{post_link}."
+ other: "%{actors} kommenterede også %{post_author}s indlæg %{post_link}."
+ zero: "%{actors} kommenterede også %{post_author}s indlæg %{post_link}."
also_commented_deleted:
few: "%{actors} kommenterede et slettet indlæg."
many: "%{actors} kommenterede et slettet indlæg."
@@ -675,10 +664,11 @@ da:
mark_read: "Marker som læst"
mark_unread: "Marker som ulæst"
mentioned: "omtalte"
+ no_notifications: "Du har endnu ikke fået nogen notifikationer."
notifications: "Notifikationer"
reshared: "Delt"
- show_all: "vis alle"
- show_unread: "vis ulæste"
+ show_all: "Vis alle"
+ show_unread: "Vis ulæste"
started_sharing: "Begyndte at dele"
liked:
one: "%{actors} har lige syntes om dit indlæg %{post_link}."
@@ -729,41 +719,101 @@ da:
two: "%{actors} begyndte at dele med dig."
zero: "%{actors} er begyndt at dele med dig."
notifier:
+ a_limited_post_comment: "Der er en ny kommentar til dig i et lukket indlæg i Diaspora."
a_post_you_shared: "et indlæg."
- accept_invite: "Accepter din Diaspora* invitation!"
- click_here: "klik her"
+ a_private_message: "Der er en ny privat besked til dig i Diaspora."
+ accept_invite: "Accepter din Diaspora-invitation!"
+ click_here: "Klik her"
comment_on_post:
- reply: "Besvar eller se %{navn}s indlæg>"
+ reply: "Besvar eller se %{name}s indlæg >"
confirm_email:
click_link: "For at aktivere din nye e-mail adresse %{unconfirmed_email}, skal du følge dette link:"
subject: "Aktiver venligst din nye e-mail adresse %{unconfirmed_email}"
email_sent_by_diaspora: "Denne e-mail blev sendt af %{pod_name}. Hvis du gerne vil holde op med at få e-mails som denne,"
+ export_email:
+ body: |-
+ Hej %{name},
+
+ Dine data er blevet behandlet og er klar til at blive downloadet. Følg [dette link](%{url}).
+
+ Hilsen
+
+ Diasporas email-robot!
+ subject: "Dine personlige data er klar til at blive downloadet, %{name}."
+ export_failure_email:
+ body: |-
+ Hej %{name}
+
+ Der er sket en fejl mens dine personlige data blev behandlet til download.
+ Prøv venligst igen!
+
+ Undskyld,
+
+ Diasporas email-robot!
+ subject: "Vi er kede af det, men der er et problem med dine data, %{name}."
+ export_photos_email:
+ body: |-
+ Hej %{name}
+
+ Dine billeder er blevet behandlet, og er klar til nedhentning ved at klikke [her](%{url})
+
+ Hilsen
+
+ Diasporas email-robot!
+ subject: "Dine billeder er klar til download, %{name}"
+ export_photos_failure_email:
+ body: |-
+ Hej %{name}
+
+ Der er sket en fejl mens vi behandlede dine billeder til download.
+ Prøv venligst igen!
+
+ Unskyld,
+
+ Diasporas email-robot!
+ subject: "Der var et problem med dine billeder, %{name}"
hello: "Hej %{name}!"
invite:
message: |-
Hej!
- Du er blevet inviteret til at deltage på Diaspora*!
+ Du er blevet inviteret til at deltage på Diaspora!
Tryk på dette link for at starte
- %{invite_url}[1]
+ [%{invite_url}][1]
Kærlig hilsen
- Diasporas* emailrobot
+ Diasporas email-robot!
[1]: %{invite_url}
- invited_you: "%{name} inviterede dig til at deltage på Diaspora*"
+ invited_you: "%{name} inviterede dig til at deltage på Diaspora"
liked:
liked: "%{name} har lige syntes om dit indlæg"
view_post: "Vis indlæg >"
mentioned:
mentioned: "omtalte dig i et indlæg:"
- subject: "%{name} har omtalt dig på Diaspora*"
+ subject: "%{name} har omtalt dig på Diaspora"
private_message:
reply_to_or_view: "Besvar eller se denne samtale >"
+ remove_old_user:
+ body: |-
+ Hej,
+
+ Det ser ud til at du ikke længere bruger din Diaspora-konto på %{pod_url}. Det er %{after_days} dage siden du brugte den sidst. For at sikre at vores aktive brugere får det bedste ud af denne Diaspora-pods ressourcer vil vi gerne fjerne ubrugte kontoer fra vores database.
+
+ Vi vil selvfølgelig meget gerne have at du du bliver og er en del af Diaspora, og du er velkommen til at beholde din konto hvis du ønsker det.
+
+ Hvis du gerne vil beholde din konto, er det eneste du skal gøre at logge ind inden %{remove_after}. Hvis du logger indt så se dig lidt omkring på Diaspora. Det har ændret sig en del siden du sidst besøgte det, og vi er sikre på at du vil kunne lide de forbedringer vi har lavet. Prøv at følge forskellige #tags med emner der interesserer dig.
+
+ Du logger ind her: %{login_url}. Har du glemt din kode kan du bede om at få tilsendt et nyt.
+
+ Vi håber at se dig igen,
+
+ Venlig hilsen, Diasporas email-robot!
+ subject: "Din Diaspora-konto er blevet mærket: \"fjernes på grund af inaktivitet.\""
report_email:
body: |-
Hej,
@@ -777,7 +827,7 @@ da:
Venlig hilsen,
- Diasporas email-robot
+ Diasporas email-robot!
[1]:%{url}
subject: "%{type} blev markeret som stødende"
@@ -788,16 +838,16 @@ da:
reshared: "%{name} har lige delt dit indlæg"
view_post: "Vis indlæg >"
single_admin:
- admin: "Din Diaspora* administrator"
- subject: "En besked fra din Diaspora*-konto:"
+ admin: "Din Diaspora-administrator"
+ subject: "En besked fra din Diaspora-konto:"
started_sharing:
sharing: "er begyndt at dele med dig!"
- subject: "%{name} er begyndt at dele med dig på Diaspora*"
+ subject: "%{name} er begyndt at dele med dig på Diaspora"
view_profile: "Vis %{navn}s profil"
thanks: "Tak,"
to_change_your_notification_settings: "for at ændre dine indstillinger for meddelelser"
nsfw: "Uegnet til arbejdsvisning (NSFW)"
- ok: "O.k."
+ ok: "Ok."
or: "eller"
password: "Adgangskode"
password_confirmation: "Adgangskode bekræftelse"
@@ -805,10 +855,9 @@ da:
add_contact:
invited_by: "Du er blevet inviteret af"
add_contact_small:
- add_contact_from_tag: "tilføj kontakt fra tag"
+ add_contact_from_tag: "Tilføj kontakt fra tag"
aspect_list:
- edit_membership: "redigér aspektsmedlemsskab"
- few: "%{count} personer"
+ edit_membership: "Redigér aspektsmedlemsskab"
helper:
is_not_sharing: "%{name} deler ikke med dig."
is_sharing: "%{name} deler med dig"
@@ -819,26 +868,25 @@ da:
no_one_found: "... Og ingen blev fundet."
no_results: "Hey! Du er nødt til at søge efter noget."
results_for: "Brugere der matcher %{search_term}"
- search_handle: "Vær sikker på at finde dine venner - brug deres Diaspora*-id (brugernavn@pod.tld)."
- searching: "søger, vent venligst..."
+ search_handle: "Vær sikker på at finde dine venner - brug deres Diaspora-id (brugernavn@pod.tld)."
+ searching: "Søger, vent venligst..."
send_invite: "Stadig ikke noget? Send en invitation!"
- many: "%{count} personer"
one: "1 person"
other: "%{count} personer"
person:
- add_contact: "tilføj kontaktperson"
+ add_contact: "Tilføj kontaktperson"
already_connected: "Allerede forbundet"
pending_request: "afventende anmodning"
- thats_you: "det er dig!"
+ thats_you: "Det er dig!"
profile_sidebar:
bio: "Biografi"
born: "Fødselsdag"
edit_my_profile: "Redigér min profil"
gender: "Køn"
- in_aspects: "i aspekter"
+ in_aspects: "I aspekter"
location: "Placering"
photos: "Billeder"
- remove_contact: "fjern kontakt"
+ remove_contact: "Fjern kontakt"
remove_from: "Fjern %{name} fra %{aspect}?"
show:
closed_account: "Denne konto er blevet lukket."
@@ -853,16 +901,15 @@ da:
recent_public_posts: "Seneste offentlige indlæg"
return_to_aspects: "Tilbage til aspektsoversigt"
see_all: "Se alle"
- start_sharing: "begynd at dele"
+ start_sharing: "Begynd at dele"
to_accept_or_ignore: "at godkende eller ignorere det."
sub_header:
- add_some: "tilføje nogle"
- edit: "redigér"
- you_have_no_tags: "du har ingen tags!"
- two: "%{count} personer"
+ add_some: "Tilføje nogle"
+ edit: "Redigér"
+ you_have_no_tags: "Du har ingen tags!"
webfinger:
fail: "Undskyld, vi kunne ikke finde %{handle}."
- zero: "ingen personer"
+ zero: "Ingen personer"
photos:
comment_email_subject: "%{name}s billede"
create:
@@ -874,9 +921,9 @@ da:
edit:
editing: "Redigering"
new:
- back_to_list: "Tilbage til liste"
- new_photo: "Nye billeder"
- post_it: "del det!"
+ back_to_list: "Gå tilbage til liste"
+ new_photo: "Nyt billede"
+ post_it: "Del det!"
new_photo:
empty: "{file} er tom. Vælg venligst filer igen uden {file}."
invalid_ext: "{file} har en ugyldig filtype. Kun {udvidelser} er tilladt."
@@ -885,9 +932,9 @@ da:
or_select_one_existing: "eller vælg et fra dine eksisterende %{photos}"
upload: "Upload et nyt profilbillede!"
photo:
- view_all: "se alle %{name}s billeder"
+ view_all: "Se alle %{name}s billeder"
show:
- collection_permalink: "samling permalink"
+ collection_permalink: "Samling permalink"
delete_photo: "Slet billede"
edit: "Redigér"
edit_delete_photo: "Redigér billedbeskrivelse / slet billede"
@@ -903,7 +950,7 @@ da:
show:
destroy: "Slet"
not_found: "Vi kunne desværre ikke finde dette indlæg."
- permalink: "permalink"
+ permalink: "Permalink"
photos_by:
few: "%{count} billeder af %{author}"
many: "%{count} billeder af %{author}"
@@ -918,12 +965,12 @@ da:
profile: "Profil"
profiles:
edit:
- allow_search: "Tillad folk at søge på dig i Diaspora*"
+ allow_search: "Tillad folk at søge på dig i Diaspora"
edit_profile: "Rediger profil"
first_name: "Fornavn"
last_name: "Efternavn"
nsfw_check: "Marker alt det jeg deler som NSFW"
- nsfw_explanation: "NSFW (not safe for work) er Diaspora*s selvregulerede fællesstandard for hvilket indhold der ikke vil være passende at se i en arbejdssituation. Hvis du ønsker at vise den slags indhold ofte, så husk at slå denne valgmulighed til så det du deler vil være skjult fra folks strøm, med mindre de ønsker at se dem."
+ nsfw_explanation: "NSFW (not safe for work) er Diasporas selvregulerede fællesstandard for hvilket indhold der ikke vil være passende at se i en arbejdssituation. Hvis du ønsker at vise den slags indhold ofte, så husk at slå denne valgmulighed til så det du deler vil være skjult fra folks strøm, med mindre de ønsker at se dem."
nsfw_explanation2: "Hvis du vælger ikke at slå denne valgmulighed til, husk at tilføje et #nsfw tag hver gang du deler denne slags materiale."
update_profile: "Opdater profil"
your_bio: "Din bio"
@@ -935,7 +982,7 @@ da:
your_private_profile: "Din private profil"
your_public_profile: "Din offentlige profil"
your_tags: "Beskriv dig selv i fem ord"
- your_tags_placeholder: "som #diaspora #strygning #kattekillinger #musik #hacking"
+ your_tags_placeholder: "Såsom #diaspora #danmark #kattekillinger #musik #hacking"
update:
failed: "Kunne ikke opdatere profil"
updated: "Profil opdateret"
@@ -945,36 +992,33 @@ da:
other: "%{count} reaktioner"
zero: "Ingen reaktioner"
registrations:
- closed: "Der er lukket for tilmeldinger på denne Diaspora* server."
+ closed: "Der er lukket for tilmeldinger på denne Diaspora server."
create:
- success: "Du har tilmeldt dig Diaspora*!"
+ success: "Du er nu en del af Diaspora!"
edit:
cancel_my_account: "Annullér min konto"
edit: "Redigér %{name}"
- leave_blank: "(Lad være tom hvis du ikke ønsker at ændre det)"
+ leave_blank: "(Lad det være tomt hvis du ikke ønsker at ændre det)"
password_to_confirm: "(Vi har brug for din nuværende adgangskode for at bekræfte dine ændringer)"
unhappy: "Ulykkelig?"
update: "Opdatér"
invalid_invite: "Det invitations link som du anvendte er ikke længere gyldigt!"
new:
- continue: "Fortsæt"
create_my_account: "Opret min konto!"
- diaspora: "<3 diaspora*"
- email: "E-MAIL"
+ email: "E-mail"
enter_email: "Indtast e-mail"
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)"
- hey_make: "HEY,<br/>GØR<br/>NOGET."
join_the_movement: "Deltag i bevægelsen!"
- password: "KODEORD"
- password_confirmation: "BEKRÆFTELSE AF ADGANGSKODE"
- sign_up: "TILMELD DIG"
+ password: "Adgangskode"
+ password_confirmation: "Bekræftelse af adgangskoden"
+ sign_up: "Tilmeld dig"
sign_up_message: "Socialt netværk med et <3"
submitting: "Sender ..."
terms: "Ved at oprette en konto accepterer du %{terms_link}."
terms_link: "Servicevilkår"
- username: "BRUGERNAVN"
+ username: "Brugernavn"
report:
comment_label: "<b>Kommentar</b>:<br>%{data}"
confirm_deletion: "Er du sikker på at du vil slette det valgte?"
@@ -993,24 +1037,21 @@ da:
requests:
create:
sending: "Sender"
- sent: "Du har bedt om at dele med %{name}. De vil se det næste gang de logger ind på Diaspora*."
+ sent: "Du har bedt om at dele med %{name}. De vil se det næste gang de logger ind på Diaspora."
destroy:
error: "Vælg venligst et aspekt!"
ignore: "Ignorér kontaktanmodning."
success: "I deler nu."
helper:
new_requests:
- few: "%{count} nye anmodninger!"
- many: "%{Count} nye anmodninger!"
- one: "ny anmodning!"
+ one: "Ny anmodning!"
other: "%{count} nye anmodninger!"
- two: "%{count} nye ansøgninger!"
- zero: "ingen nye anmodninger"
+ zero: "Ingen nye anmodninger"
manage_aspect_contacts:
existing: "Eksisterende kontaktpersoner"
manage_within: "Administrér kontaktpersoner indenfor"
new_request_to_person:
- sent: "afsendt!"
+ sent: "Afsendt!"
reshares:
comment_email_subject: "%{resharer}s deling af %{author}s indlæg"
create:
@@ -1024,9 +1065,9 @@ da:
other: "%{count} delinger"
two: "%{count} delinger"
zero: "Del"
- reshare_confirmation: "Del %{author} - %{text}?"
+ reshare_confirmation: "Del %{author}s indlæg?"
reshare_original: "Del original"
- reshared_via: "delt via"
+ reshared_via: "Delt via"
show_original: "Vis original"
search: "Søg"
services:
@@ -1038,44 +1079,46 @@ da:
destroy:
success: "Godkendelsen er nu blevet slettet."
failure:
- error: "der opstod en fejl i at forbinde til den service"
+ error: "Forbindelsen til denne service fejlede"
finder:
- fetching_contacts: "Diaspora* indsamler dine %{service}-venner. Vent venligst et par minutter."
+ fetching_contacts: "Diaspora indsamler dine %{service}-venner. Vent venligst et øjeblik."
no_friends: "Ingen Facebook-venner fundet."
- service_friends: "%{service} Venner"
+ service_friends: "%{service} venner"
index:
connect_to_facebook: "Tilslut til Facebook"
connect_to_tumblr: "Tilslut til Tumblr"
connect_to_twitter: "Tilslut til Twitter"
connect_to_wordpress: "Forbind til Wordpress"
- disconnect: "afbryd"
+ disconnect: "Afbryd"
edit_services: "Redigér tjenester"
- logged_in_as: "log ind som"
+ logged_in_as: "Loget ind som"
no_services: "Du har ikke tilsluttet nogen tjenester endnu."
- really_disconnect: "afbryd %{service}?"
- services_explanation: "Tilslutning til andre tjenester giver dig mulighed for at sende dine indlæg til dem, samtidig med at du skriver dem i Diaspora*."
+ really_disconnect: "Afbryd %{service}?"
+ services_explanation: "Tilslutning til andre tjenester giver dig mulighed for at sende dine indlæg til dem, samtidig med at du skriver dem i Diaspora."
inviter:
click_link_to_accept_invitation: "Klik på dette link for at acceptere din invitation"
- join_me_on_diaspora: "Deltag sammen med mig på DIASPORA*"
+ join_me_on_diaspora: "Deltag sammen med mig på Diaspora"
remote_friend:
- invite: "inviter"
- not_on_diaspora: "Endnu ikke på Diaspora*"
+ invite: "Inviter"
+ not_on_diaspora: "Er endnu ikke på Diaspora"
resend: "Send igen"
settings: "Indstillinger"
share_visibilites:
update:
- post_hidden_and_muted: "%{name}'s indlæg er nu skjult, og meddelelser er blevet gjort tavse."
- see_it_on_their_profile: "Hvis du ønsker at se opdateringer til dette indlæg, besøg %{name}'s profilside."
+ post_hidden_and_muted: "%{name}s indlæg er nu skjult, og meddelelser er blevet gjort tavse."
+ see_it_on_their_profile: "Hvis du ønsker at se opdateringer til dette indlæg, besøg %{name}s profilside."
shared:
add_contact:
add_new_contact: "Tilføj en ny kontakt"
- create_request: "Find med Diaspora*-ID"
+ create_request: "Find med Diaspora-ID"
diaspora_handle: "diaspora@pod.org"
- enter_a_diaspora_username: "Indsæt et Diaspora*-brugernavn:"
+ enter_a_diaspora_username: "Indsæt et Diaspora-brugernavn:"
know_email: "Kender du deres e-mail adresse? Du burde invitere dem"
- your_diaspora_username_is: "Dit Diaspora*-brugernavn er: %{diaspora_handle}"
+ your_diaspora_username_is: "Dit Diaspora-brugernavn er: %{diaspora_handle}"
aspect_dropdown:
add_to_aspect: "Tilføj kontakt"
+ mobile_row_checked: "%{name} (fjern)"
+ mobile_row_unchecked: "%{name} (tilføj)"
toggle:
few: "I %{count} aspekter"
many: "I %{count} aspekter"
@@ -1096,32 +1139,32 @@ da:
invite_someone: "Invitér en person"
invite_your_friends: "Invitér dine venner"
invites: "Invitationer"
- invites_closed: "Invitationer er i øjeblikket lukkede på denne Diaspora*-server"
+ invites_closed: "Invitationer er i øjeblikket lukkede på denne Diaspora server"
share_this: "Del dette link via e-mail, blog eller dit yndlings-sociale netværk!"
notification:
new: "Ny %{type} fra %{from}"
public_explain:
atom_feed: "Atom feed"
control_your_audience: "Kontrollér dit publikum"
- logged_in: "Log ind til %{service}"
+ logged_in: "Logget på %{service}"
manage: "Administrér tilsluttede tjenester"
new_user_welcome_message: "Brug #tags til at klassificere dine indlæg og til at finde personer der deler dine interesser. Nævn folk ved at kalde dem ved @Navn"
- outside: "Offentlige meddelelser vil kunne ses af folk uden for Diaspora*."
+ outside: "Offentlige meddelelser vil kunne ses af folk uden for Diaspora."
share: "Del"
title: "Opsæt tilsluttede tjenester"
visibility_dropdown: "Brug denne dropdown til at ændre synligheden af ​​dit indlæg. (Vi foreslår, at du gør dette første indlæg offentligt.)"
publisher:
- all: "alle"
- all_contacts: "alle kontaktpersoner"
+ all: "Alle"
+ all_contacts: "Alle kontakter"
discard_post: "Kassér indlæg"
formatWithMarkdown: "Du kan bruge %{markdown_link} til at formatere dine indlæg"
get_location: "Få din placering"
- make_public: "offentliggør"
+ make_public: "Offentliggør"
new_user_prefill:
hello: "Hej allesammen, jeg er #%{new_user_tag}. "
i_like: "Jeg interesserer mig for %{tags}."
invited_by: "Tak for invitationen, "
- newhere: "NewHere"
+ newhere: "newhere"
poll:
add_a_poll: "Tilføj en afstemning"
add_poll_answer: "Tilføj mulighed"
@@ -1131,12 +1174,12 @@ da:
post_a_message_to: "Send en besked til %{aspect}"
posting: "Sender..."
preview: "Forhåndsvisning"
- publishing_to: "del med: "
+ publishing_to: "Del med: "
remove_location: "Fjern placering"
share: "Del"
share_with: "Del med"
upload_photos: "Upload fotos"
- whats_on_your_mind: "Hvad har du på hjerte?"
+ whats_on_your_mind: "Hvad har du på hjertet?"
reshare:
reshare: "Del igen"
stream_element:
@@ -1149,10 +1192,10 @@ da:
like: "Synes om"
nsfw: "Dette indlæg er markeret af forfatteren som 'uegnet til arbejdsvisning'. %{link}"
shared_with: "Delt med: %{aspect_names}"
- show: "vis"
+ show: "Vis"
unlike: "Synes ikke om"
- via: "via %{link}"
- via_mobile: "via mobil"
+ via: "Via %{link}"
+ via_mobile: "Via mobil"
viewable_to_anyone: "Dette indlæg er synlig for alle på internettet"
simple_captcha:
label: "Skriv koden i boksen:"
@@ -1161,6 +1204,21 @@ da:
failed: "Den menneskelige kontrol mislykkedes"
user: "Det hemmelige billede og koden var forskellige"
placeholder: "Indsæt billedværdi"
+ statistics:
+ active_users_halfyear: "Aktive brugere halvårligt"
+ active_users_monthly: "Aktive brugere månedligt"
+ closed: "Lukket"
+ disabled: "Ikke tilgængelig"
+ enabled: "Tilgængelig"
+ local_comments: "Lokale kommentarer"
+ local_posts: "Lokale opslag"
+ name: "Navn"
+ network: "Netværk"
+ open: "Åben"
+ registrations: "Tilmeldinger"
+ services: "Tjenester"
+ total_users: "Antal brugere"
+ version: "Version"
status_messages:
create:
success: "%{names} nævnt med succes"
@@ -1170,12 +1228,11 @@ da:
no_message_to_display: "Ingen beskeder at vise."
new:
mentioning: "Nævnt: %{person}"
- too_long:
- one: "Lav venligst en statusopdatering på under %{count} tegn"
- other: "Lav venligst en statusopdatering på under %{count} tegn"
- zero: "Lav venligst en statusopdatering på under %{count} tegn"
+ too_long: "Lav venligst en statusopdatering på under %{count} tegn. Lige nu er der %{current_length} tegn."
stream_helper:
hide_comments: "Skjul alle kommentarer"
+ no_more_posts: "Du har nået bunden af denne strøm."
+ no_posts_yet: "Der er endnu ingen indlæg."
show_comments:
few: "Vis %{count} flere kommentarer"
many: "Vis %{count} flere kommentarer"
@@ -1192,7 +1249,7 @@ da:
comment_stream:
contacts_title: "Brugere, hvis indlæg du har kommenteret"
title: "Kommenterede indlæg"
- community_spotlight_stream: "Kreative medlemmer"
+ community_spotlight_stream: "Community Spotlight"
followed_tag:
add_a_tag: "Tilføj et tag"
contacts_title: "Personer der følger disse tags"
@@ -1201,20 +1258,19 @@ da:
followed_tags_stream: "#Fulgte tags"
like_stream:
contacts_title: "Brugere hvis indlæg du kan lide"
- title: "Strøm af 'synes om'"
+ title: "'Synes om' strøm"
mentioned_stream: "@Omtaler"
mentions:
contacts_title: "Personer der har nævnt dig"
title: "Dine omtaler"
multi:
- contacts_title: "Personer i din Strøm"
+ contacts_title: "Personer i din strøm"
title: "Strøm"
public:
- contacts_title: "Seneste indlæg"
+ contacts_title: "Har senest slået ting op"
title: "Offentlig Aktivitet"
tags:
contacts_title: "Folk der følger disse tags"
- tag_prefill_text: "Jeg synes at %{tag_name} er... "
title: "Indlæg tagget med: %{tags}"
tag_followings:
create:
@@ -1223,20 +1279,18 @@ da:
success: "Du følger nu #%{name}."
destroy:
failure: "Fejlede med at holde op med at følge #%{name}. Måske har du allerede valgt ikke at følge tag'et?"
- success: "Du følger desværre ikke #%{name} længere."
+ success: "Du følger ikke #%{name} længere."
tags:
+ name_too_long: "Lav venligst et tag-navn på under %{count} tegn. Lige nu er det på %{current_length} tegn."
show:
follow: "Følg #%{tag}"
- followed_by_people:
- one: "fulgt af en person"
- other: "fulgt af %{count} personer"
- zero: "ikke fulgt af nogen"
following: "Følger #%{tag}"
- nobody_talking: "Ingen har talt om %{tag} endnu."
none: "Det tomme tag eksisterer ikke!"
- people_tagged_with: "Personer tagged med %{tag}"
- posts_tagged_with: "Indlæg tagged med #%{tag}"
stop_following: "Hold op med at følge #%{tag}"
+ tagged_people:
+ one: "En person har brugt %{tag} tag"
+ other: "%{count} personer har brugt %{tag} tag"
+ zero: "Ingen har brugt %{tag} tag"
terms_and_conditions: "Regler og vilkår"
undo: "Fortryd?"
username: "Brugernavn"
@@ -1245,11 +1299,11 @@ da:
email_confirmed: "E-mail %{email} aktiveret"
email_not_confirmed: "E-mail kunne ikke aktiveres. Forkert link?"
destroy:
- no_password: "Indtast venligst dit kodeord for at lukke din konto."
- 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*."
+ no_password: "Indtast venligst din adgangskode for at lukke din konto."
+ 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 har kommenteret 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"
@@ -1259,44 +1313,51 @@ da:
character_minimum_expl: "skal være mindst seks tegn"
close_account:
dont_go: "Hey, gå ikke!"
- if_you_want_this: "Hvis du virkelig ønsker dette, indtast da dit kodeord og klik på 'Luk konto'"
- lock_username: "Dette vil låse dit brugernavn til hvis du beslutter at oprettes igen."
- locked_out: "Du vil blive logget ud og låst ude af din konto."
- make_diaspora_better: "Vi ønsker din hjælp til at forbedre Diaspora*, du kan hjælpe os i stedet for at forlade os. Hvis du ønsker at forlade os, så vil vi gerne have at du ved hvad der så sker."
+ if_you_want_this: "Hvis du virkelig ønsker dette, indtast da din adgangskode og klik på \"Luk konto\""
+ lock_username: "Dit brugernavn vil blive låst. Du vil ikke kunne åbne en ny konto på denne pod med det samme ID."
+ locked_out: "Du vil blive logget ud og derefter låst ude af din konto indtil den er blevet slettet."
+ make_diaspora_better: "Vi vlle ønske du blev og hjalp os med at gøre Diaspora til et bedre sted. Men hvis du virkelig ønsker at forlade os, foregår det på denne måde:"
mr_wiggles: "Hr. Wiggles bliver ked af det når du forlader os"
- no_turning_back: "Nu er der ingen vej tilbage."
- what_we_delete: "Vi sletter alle dine indlæg og profildata så hurtigt som overhovedet muligt. Dine kommentarer vil forblive, men være forbundet til dit Diaspora*-ID og ikke dit navn."
+ 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."
current_password: "Nuværende adgangskode"
current_password_expl: "det du loggede ind med..."
+ download_export: "Download min profil"
+ download_export_photos: "Hent mine billeder"
download_photos: "Download mine billeder"
- download_xml: "Download min XML"
edit_account: "Rediger konto"
email_awaiting_confirmation: "Vi har sendt dig et aktiveringslink til %{unconfirmed_email}. Indtil du følger dette link og aktiverer den nye adresse, vil vi fortsætte med at bruge din oprindelige adresse %{email}."
export_data: "Eksportér data"
+ export_in_progress: "Vi er ved at behandle dine data. Vend venligst tilbage om et øjeblik."
+ export_photos_in_progress: "Vi behandler dine billeder. Vend tilbage om et øjeblik."
following: "Delingsindstillinger"
getting_started: "Ny bruger opsætning"
+ last_exported_at: "(sidst opdateret %{timestamp})"
liked: "... nogen synes om dit indlæg."
mentioned: "... du er nævnt i et indlæg."
new_password: "Nyt adgangskode"
- photo_export_unavailable: "Følg"
private_message: "... du har modtaget en privat besked."
receive_email_notifications: "Modtag en besked på e-mail når:"
+ request_export: "Bed om at få mine profil data"
+ request_export_photos: "Anmod om mine billeder"
+ request_export_photos_update: "Opdater mine billeder"
+ request_export_update: "Genopfrisk mine profildata"
reshared: "... nogen deler dit indlæg."
- show_community_spotlight: "Vis kreative medlemmer i din hovedstrøm?"
+ show_community_spotlight: "Vis Community Spotlight i din strøm?"
show_getting_started: "Genaktivér 'Kom godt i gang'"
someone_reported: "Der er en der har sendt en rapport"
started_sharing: "... nogen er begyndt at dele med dig."
stream_preferences: "Opsætning af din Strøm"
your_email: "Din e-mail"
- your_handle: "Dit Diaspora*-ID"
+ your_handle: "Dit Diaspora-ID"
getting_started:
- awesome_take_me_to_diaspora: "Fantastisk! Tag mig til Diaspora*"
- community_welcome: "Diaspora*-samfundet er glad for at have dig ombord!"
+ awesome_take_me_to_diaspora: "Fantastisk! Tag mig til Diaspora"
+ community_welcome: "Diaspora-samfundet er glad for at have dig ombord!"
connect_to_facebook: "Vi kan fremskynde tingene lidt op ved at %{link} til Diaspora. Dit navn og foto vil blive hentet, og videresending aktiveret."
- connect_to_facebook_link: "forbinde din Facebook-konto"
- hashtag_explanation: "Hashtags giver dig mulighed for at tale om og følge dine interesser. De er også en fantastisk måde at finde nye folk på Diaspora*."
+ connect_to_facebook_link: "Forbinde din Facebook-konto"
+ hashtag_explanation: "Hashtags giver dig mulighed for at tale om og følge dine interesser. De er også en fantastisk måde at finde nye folk på Diaspora."
hashtag_suggestions: "Prøv med følgende tags som #kunst, #film, #gif, osv."
saved: "Gemt!"
well_hello_there: "Hejsa!"
@@ -1304,8 +1365,10 @@ da:
who_are_you: "Hvem er du?"
privacy_settings:
ignored_users: "Ignorerede brugere"
- stop_ignoring: "Hold op med at ignorere"
- title: "Privatliv"
+ no_user_ignored_message: "Du ignorerer for tiden ikke andre brugere"
+ stop_ignoring: "hold op med at ignorere"
+ strip_exif: "Fjern metadata såsom: sted, fotografens navn og kameramodel fra mine uploadede billeder (anbefalet)"
+ title: "Privatlivs indstillinger"
public:
does_not_exist: "Brugeren %{username} findes ikke!"
update:
@@ -1321,11 +1384,11 @@ da:
unconfirmed_email_changed: "E-mail ændret. Kræver aktivering."
unconfirmed_email_not_changed: "E-mail ændring mislykkedes"
webfinger:
- fetch_failed: "kunne ikke hente webfinger profil for %{profile_url}"
- hcard_fetch_failed: "der opstod et problem i forbindelse med hentning af hcard for %{account}"
+ fetch_failed: "Kunne ikke hente webfinger profil for %{profile_url}"
+ hcard_fetch_failed: "Der opstod et problem i forbindelse med hentning af hcard for %{account}"
no_person_constructed: "Ingen person kunne konstrueres fra dette hcard."
- not_enabled: "det ser ikke ud til at webfinger er aktiveret på %{account}s domæne"
- xrd_fetch_failed: "der opstod en fejl i forbindelse med hentning af xrd fra kontoen %{account}"
+ not_enabled: "Det ser ikke ud til at webfinger er aktiveret på %{account}s domæne"
+ xrd_fetch_failed: "Der opstod en fejl i forbindelse med hentning af xrd fra kontoen %{account}"
welcome: "Velkommen!"
will_paginate:
next_label: "næste &raquo;"
diff --git a/config/locales/diaspora/de.yml b/config/locales/diaspora/de.yml
index 0e0ccefa4..0e47b71db 100644
--- a/config/locales/diaspora/de.yml
+++ b/config/locales/diaspora/de.yml
@@ -12,6 +12,7 @@ de:
_home: "Startseite"
_photos: "Fotos"
_services: "Dienste"
+ _statistics: "Statistiken"
_terms: "Bedingungen"
account: "Konto"
activerecord:
@@ -40,7 +41,7 @@ de:
reshare:
attributes:
root_guid:
- taken: "Ziemlich gut, was? Du hast diesen Beitrag bereits weitergesagt!"
+ taken: "Ziemlich gut, was? Du hast diesen Beitrag bereits weitergesagt!"
user:
attributes:
email:
@@ -96,15 +97,19 @@ de:
id: "ID"
last_seen: "Zuletzt gesehen"
? "no"
- : Nein
+ : nein
nsfw: "NSFW (unpassend für den Arbeitsplatz)"
- unknown: "Unbekannt"
+ unknown: "unbekannt"
? "yes"
: ja
user_search:
account_closing_scheduled: "Das Konto von %{name} soll geschlossen werden. Dies dauert ein paar Augenblicke..."
+ account_locking_scheduled: "Das Konto von %{name} ist zur Sperrung vorgesehen. Es wird in wenigen Augenblicken verarbeitet..."
+ account_unlocking_scheduled: "Das Konto von %{name} ist zur Entperrung vorgesehen. Es wird in wenigen Augenblicken verarbeitet..."
add_invites: "Einladungen hinzufügen"
are_you_sure: "Möchtest du dein Konto wirklich schließen?"
+ are_you_sure_lock_account: "Bist du dir sicher, dass du dieses Konto sperren möchtest?"
+ are_you_sure_unlock_account: "Bist du dir sicher, dass du dieses Konto entsperren möchtest?"
close_account: "Konto schließen"
email_to: "per E-Mail einladen"
under_13: "Zeige Benutzer, die unter 13 Jahre alt sind (COPPA)"
@@ -112,7 +117,7 @@ de:
one: "%{count} Benutzer gefunden"
other: "%{count} Benutzer gefunden"
zero: "%{count} Benutzer gefunden"
- view_profile: "Profil anzeigen"
+ view_profile: "Profil ansehen"
you_currently:
one: "Du hast noch eine Einladung übrig %{link}"
other: "Du hast noch %{count} Einladungen übrig %{link}"
@@ -141,8 +146,6 @@ de:
add_to_aspect:
failure: "Fehler beim Hinzufügen des Kontakts zum Aspekt."
success: "Kontakt erfolgreich zum Aspekt hinzugefügt."
- aspect_contacts:
- done_editing: "Änderungen abgeschlossen"
aspect_listings:
add_an_aspect: "+ Aspekt hinzufügen"
deselect_all: "Auswahl aufheben"
@@ -161,23 +164,18 @@ de:
failure: "%{name} ist nicht leer und konnte nicht entfernt werden."
success: "%{name} wurde erfolgreich entfernt."
edit:
- add_existing: "Einen bereits bestehenden Kontakt hinzufügen"
- aspect_list_is_not_visible: "Kontakte in diesem Aspekt können einander nicht sehen"
- aspect_list_is_visible: "Kontakte in diesem Aspekt können einander sehen"
+ aspect_chat_is_enabled: "Kontakte in diesem Aspekt können mit dir chatten."
+ aspect_chat_is_not_enabled: "Kontakte in diesem Aspekt können nicht mit dir chatten."
+ aspect_list_is_not_visible: "Kontakte in diesem Aspekt können einander nicht sehen."
+ aspect_list_is_visible: "Kontakte in diesem Aspekt können einander sehen."
confirm_remove_aspect: "Bist du dir sicher, dass du diesen Aspekt löschen möchtest?"
- done: "Fertig"
+ grant_contacts_chat_privilege: "Kontakten im Aspekt das Chatrecht gewähren?"
make_aspect_list_visible: "Kontakte aus diesem Aspekt öffentlich machen?"
- manage: "Verwalten"
remove_aspect: "Diesen Aspekt löschen"
- rename: "umbenennen"
+ rename: "Umbenennen"
set_visibility: "Sichtbarkeit festlegen"
update: "Ändern"
- updating: "Ändere …"
- few: "%{count} Aspekte"
- helper:
- are_you_sure: "Möchtest du diesen Aspekt wirklich löschen?"
- aspect_not_empty: "Aspekt ist nicht leer"
- remove: "entfernen"
+ updating: "Ändere…"
index:
diaspora_id:
content_1: "Deine diaspora* ID ist:"
@@ -218,11 +216,6 @@ de:
heading: "Verbinde Dienste"
unfollow_tag: "#%{tag} nicht mehr folgen"
welcome_to_diaspora: "Willkommen bei diaspora*, %{name}!"
- many: "%{count} Aspekte"
- move_contact:
- error: "Fehler beim Verschieben des Kontakts: %{inspect}"
- failure: "hat nicht funktioniert: %{inspect}"
- success: "Person in neuen Aspekt verschoben"
new:
create: "Erstellen"
name: "Name (nur für dich sichtbar)"
@@ -240,18 +233,10 @@ de:
family: "Familie"
friends: "Freunde"
work: "Arbeit"
- selected_contacts:
- manage_your_aspects: "Verwalte deine Aspekte."
- no_contacts: "Du hast hier noch keine Kontakte."
- view_all_community_spotlight: "Schaukasten der gesamten Gemeinschaft"
- view_all_contacts: "Zeige alle Kontakte"
- show:
- edit_aspect: "Aspekt bearbeiten"
- two: "%{count} Aspekte"
update:
failure: "%{name} ist ein zu langer Name, um gespeichert zu werden."
success: "Aspekt %{name} erfolgreich bearbeitet."
- zero: "keine Aspekte"
+ zero: "Keine Aspekte"
back: "Zurück"
blocks:
create:
@@ -267,36 +252,31 @@ de:
post_success: "Erstellt! Schließen …"
cancel: "Abbrechen"
comments:
- few: "%{count} Kommentare"
- many: "%{count} Kommentare"
new_comment:
comment: "Kommentieren"
commenting: "Kommentieren …"
one: "Ein Kommentar"
other: "%{count} Kommentare"
- two: "%{count} Kommentare"
zero: "Keine Kommentare"
contacts:
create:
failure: "Fehler beim Erstellen des Kontakts"
- few: "%{count} Kontakte"
index:
add_a_new_aspect: "Einen neuen Aspekt hinzufügen"
+ add_contact: "Kontakt hinzufügen"
add_to_aspect: "Füge Kontakte zu %{name} hinzu"
- add_to_aspect_link: "füge Kontakte zu »%{name}« hinzu"
all_contacts: "Alle Kontakte"
community_spotlight: "Gemeinschafts-Focus"
- many_people_are_you_sure: "Bist du dir sicher, dass du eine private Unterhaltung mit mehr als %{suggested_limit} Kontakten beginnen möchtest? Einen Beitrag in diesen Aspekt zu schreiben könnte ein besserer Weg sein, um sie zu kontaktieren."
my_contacts: "Meine Kontakte"
no_contacts: "Sieht so aus, als müsstest du einige Kontakte hinzufügen!"
+ no_contacts_in_aspect: "Du hast noch keine Kontakte in diesem Aspekt. Unten ist eine Liste mit deinen bestehenden Kontakten, die du zu diesem Aspekt hinzufügen kannst."
no_contacts_message: "Guck’ in den %{community_spotlight}"
- no_contacts_message_with_aspect: "Guck’ in den %{community_spotlight} oder %{add_to_aspect_link}"
only_sharing_with_me: "Nur mit dir Teilende"
- remove_person_from_aspect: "Entferne %{person_name} aus \"%{aspect_name}\""
+ remove_contact: "Kontakt entfernen"
start_a_conversation: "Beginne eine Unterhaltung"
title: "Kontakte"
+ user_search: "Nutzersuche"
your_contacts: "Deine Kontakte"
- many: "%{count} Kontakte"
one: "Ein Kontakt"
other: "%{count} Kontakte"
sharing:
@@ -304,8 +284,7 @@ de:
spotlight:
community_spotlight: "Gemeinschafts-Schaukasten"
suggest_member: "Ein Mitglied vorschlagen"
- two: "%{count} Kontakte"
- zero: "Kontakte"
+ zero: "Keine Kontakte"
conversations:
conversation:
participants: "Teilnehmer"
@@ -314,7 +293,8 @@ de:
no_contact: "Hoppla, du musst den Kontakt erst hinzufügen!"
sent: "Nachricht versendet"
destroy:
- success: "Konversation erfolgreich entfernt"
+ delete_success: "Das Gespräch wurde erfolgreich gelöscht."
+ hide_success: "Das Gespräch wurde erfolgreich ausgeblendet."
helper:
new_messages:
few: "%{count} neue Nachrichten"
@@ -324,7 +304,7 @@ de:
two: "%{count} neue Nachrichten"
zero: "Keine neuen Nachrichten"
index:
- conversations_inbox: "Konversationen – Eingang"
+ conversations_inbox: "Konversationen – Posteingang"
create_a_new_conversation: "beginne eine neue Konversation"
inbox: "Eingang"
new_conversation: "Neue Konversation"
@@ -339,7 +319,8 @@ de:
new_conversation:
fail: "Ungültige Nachricht"
show:
- delete: "Diese Konversation löschen und blockieren"
+ delete: "Dieses Gespräch löschen."
+ hide: "Gespräch ausblenden und stumm schalten."
reply: "Antworten"
replying: "Antworten …"
date:
@@ -376,7 +357,7 @@ de:
change_aspect_of_post_q: "Kann ich die Aspekte eines Beitrags nach dem Senden nochmal verändern?"
contacts_know_aspect_a: "Nein. Sie können den Namen des Aspekts, in welchem sie eingeordnet sind, nicht sehen."
contacts_know_aspect_q: "Wissen meine Kontakte in welchem Aspekt von mir sie sind?"
- contacts_visible_a: ""
+ contacts_visible_a: "Wenn du diese Option anwählst, werden die Kontakte dieses Aspekts die Möglichkeit haben, auf Ihrem Profil unter Ihrem Profilbild, zu sehen wer sonst noch in diesem Aspekt ist. Es ist am besten diese Option nur anzuwählen, wenn sich alle Kontakte in diesem Aspekt untereinander kennen. Sie werden aber trotzdem nicht erfahren, wie dieser Aspekt heißt."
contacts_visible_q: "Was bewirkt „Kontakte aus diesem Aspekt öffentlich machen“?"
delete_aspect_a: "Positioniere deinen Mauszeiger links auf der Startseite auf dem Aspekt, den du löschen willst und klicke auf den dann erscheinenden, kleinen „Bearbeiten“-Stift. Klicke anschließend in der erscheinenden Box auf die Schaltfläche „Löschen“."
delete_aspect_q: "Wie kann ich einen Aspekt löschen?"
@@ -395,9 +376,16 @@ de:
what_is_an_aspect_q: "Was sind Aspekte?"
who_sees_post_a: "Wenn du einen begrenzten Beitrag postest, wird dieser nur für Leute sichtbar sein, die sich in dem ausgewählten Aspekt (oder in den ausgewählten Aspekten, falls du mehrere ausgewählt hast) befinden. Deine anderen Kontakte werden ihn nicht sehen, es sei denn, du machst ihn öffentlich. Ausschließlich öffentliche Beiträge werden auch für Leute sichtbar sein, die sich in keinem deiner Aspekte befinden."
who_sees_post_q: "Wenn ich einen Beitrag an einen Aspekt poste, wer sieht ihn dann?"
+ chat:
+ add_contact_roster_a: "Zuerst musst du den Chat für einen der Aspekte aktivieren, in denen sich die Person befindet. Dafür gehst du zur %{contacts_page}, wählst den gewünschten Aspekt aus und klickst auf das Chat-Icon, um den Chat für den Aspekt zu aktivieren. %{toggle_privilege} Wenn es dir lieber ist, kannst du auch einen speziellen Aspekt namens 'Chat' erstellen und zu ihm die Leute hinzufügen, mit denen du chatten willst. Wenn du damit fertig bist, öffnest du die Chatoberfläche und wählst die Person aus, mit der du chatten willst."
+ add_contact_roster_q: "Wie kann ich auf diaspora* mit jemandem chatten?"
+ contacts_page: "Kontaktseite"
+ title: "Chat"
+ faq: "FAQ"
foundation_website: "Webseite der diaspora*-Stiftung"
getting_help:
- get_support_a_hashtag: "frage in einem öffentlichen diaspora* Beitrag mit dem Hashtag %{question}."
+ get_support_a_faq: "Lies unsere %{faq}-Seite im Wiki"
+ get_support_a_hashtag: "Stelle auf diaspora* in einem öffentlichen Beitrag eine Frage anhand des Hashtags %{question}."
get_support_a_irc: "Nehme am %{irc} teil"
get_support_a_tutorials: "Lies unsere %{tutorials}"
get_support_a_website: "Besuche unsere %{link}"
@@ -415,6 +403,10 @@ de:
keyboard_shortcuts_li2: "k - zum vorigen Beitrag springen"
keyboard_shortcuts_li3: "c - den aktuellen Beitrag kommentieren"
keyboard_shortcuts_li4: "l - den aktuellen Beitrag mit „Gefällt mir“ markieren"
+ keyboard_shortcuts_li5: "r - den aktuellen Beitrag teilen"
+ keyboard_shortcuts_li6: "m - den aktuellen Beitrag ausklappen"
+ keyboard_shortcuts_li7: "o - den ersten externen Link des aktuellen Beitrags in neuem Fenster öffnen"
+ keyboard_shortcuts_li8: "Strg + Enter - Sende die Nachricht, die du schreibst"
keyboard_shortcuts_q: "Welche Tastenkürzel gibt es?"
title: "Tastenkürzel"
markdown: "Markdown"
@@ -464,6 +456,14 @@ de:
insert_images_comments_a2: "kann sowohl in Kommentaren, als auch in Beiträgen, dazu benutzt werden, Bilder aus dem Internet einzufügen."
insert_images_comments_q: "Kann ich Bilder in Kommentare einfügen?"
insert_images_q: "Wie füge ich einem Beitrag Fotos hinzu?"
+ post_location_a: "Klicke auf das Stecknadelsymbol neben der Kamera im Eingabefeld für Veröffentlichungen. Das wird deine Position von OpenStreetMap einfügen. Du kannst deine Position bearbeiten – vielleicht möchtest du nur die Stadt, in der du dich befindest, einbinden, und nicht die genaue Adresse."
+ post_location_q: "Wie füge ich einem Beitrag meine Position hinzu?"
+ post_notification_a: "Neben dem X oben rechts an einem Beitrag findest du ein Glockensymbol. Klicke darauf, um Benachrichtigungen für jenen Beitrag zu aktivieren oder zu deaktivieren."
+ post_notification_q: "Wie kann ich Benachrichtigungen über einen Beitrag an- oder ausschalten?"
+ post_poll_a: "Klicke auf das Diagrammsymbol, um eine Umfrage zu erstellen. Gib eine Frage und mindestens zwei Antwortmöglichkeiten ein. Vergiss nicht, deinen Beitrag öffentlich zu machen, wenn jeder daran teilnehmen können soll."
+ post_poll_q: "Wie füge ich meinem Beitrag eine Umfrage hinzu?"
+ post_report_a: "Klicke auf das Warndreieck oben rechts an einem Beitrag, um ihn deinem Podmin zu melden. Gib einen Grund für das Melden des Beitrags in der Dialogbox ein."
+ post_report_q: "Wie melde ich einen anstößigen Beitrag?"
size_of_images_a: "Nein. Bilder werden automatisch auf eine Größe geändert, die in den Stream passt. Markdown bietet keinen Code, um die Größe eines Bildes anzugeben."
size_of_images_q: "Kann ich die Größe von Bildern in Beiträgen oder Kommentaren anpassen?"
stream_full_of_posts_a1: "Dein Stream ist zusammengesetzt aus drei Arten von Beiträgen:"
@@ -528,6 +528,7 @@ de:
add_to_aspect_li5: "Aber wenn Ben sich nun Amys Profil ansieht, dann kann er ihre privaten Beiträge des Aspekts sehen, in welchen sie ihn eingeordnet hat (und natürlich ihre öffentlichen, die jeder sehen kann)."
add_to_aspect_li6: "Ben sieht nun Amys privates Profil (Beschreibung, Ort, Geschlecht, Geburtstag)."
add_to_aspect_li7: "Amy ist nun auf Bens Kontaktseite unter „Nur mit dir teilend“ zu finden."
+ add_to_aspect_li8: "Amy wird Ben auch in einem Beitrag @erwähnen können."
add_to_aspect_q: "Was passiert wenn ich jemanden zu meinen Aspekten hinzufüge? Oder wenn mich jemand zu seinen Aspekten hinzufügt?"
list_not_sharing_a: "Nein, aber du kannst auf den Profilseiten von Leuten nachsehen, ob sie mit dir teilen. Wenn ja, ist die Leiste unter deren Profilbild grün, andernfalls grau. Du solltest zudem immer, wenn jemand mit dir zu teilen beginnt, eine Benachrichtigung bekommen."
list_not_sharing_q: "Gibt es eine Liste mit Leuten, die ich zu einem meiner Aspekte hinzugefügt habe, die mich aber noch nicht zu einem ihrer Aspekte hinzugefügt haben?"
@@ -535,6 +536,8 @@ de:
only_sharing_q: "Wer ist auf der Kontaktseite unter „Nur mit dir teilend“ zu finden?"
see_old_posts_a: "Nein. Er wird ausschließlich neue Beiträge für diesen Aspekt sehen. Er (und alle Anderen) können aber alle älteren, öffentlichen Beiträge von dir auf deiner Profilseite oder in ihrem Stream sehen."
see_old_posts_q: "Wenn ich jemanden zu einem Aspekt hinzufüge, sieht er dann auch ältere, bereits geschriebene Beiträge in diesem Aspekt?"
+ sharing_notification_a: "Du solltest jedes Mal, wenn jemand mit dir zu teilen anfängt, eine Benachrichtigung erhalten."
+ sharing_notification_q: "Wie erfahre ich es, wenn jemand anfängt, mit mir zu teilen?"
title: "Teilen"
tags:
filter_tags_a: "Dass ist in in diaspora* derzeit nicht möglich, aber einige %{third_party_tools} wurde geschrieben um dies zu ermöglichen."
@@ -638,7 +641,7 @@ de:
limited: "Begrenzt"
more: "Mehr"
next: "Nächste"
- no_results: "Keine Ergebnisse gefunden."
+ no_results: "Keine Ergebnisse gefunden"
notifications:
also_commented:
one: "%{actors} hat auch %{post_author}s Beitrag %{post_link} kommentiert."
@@ -665,7 +668,7 @@ de:
zero: "Keine neuen Benachrichtigungen"
index:
all_notifications: "Alle Benachrichtigungen"
- also_commented: "Auch Kommentiert"
+ also_commented: "Auch kommentiert"
and: "und"
and_others:
few: "und %{count} anderen"
@@ -681,6 +684,7 @@ de:
mark_read: "Als gelesen markieren"
mark_unread: "als ungelesen markieren"
mentioned: "Erwähnt"
+ no_notifications: "Du hast noch keine Benachrichtigungen."
notifications: "Benachrichtigungen"
reshared: "Weitergesagt"
show_all: "Alle anzeigen"
@@ -741,7 +745,9 @@ de:
two: "%{actors} haben angefangen mit dir zu teilen."
zero: "Niemand hat angefangen mit dir zu teilen."
notifier:
+ a_limited_post_comment: "Auf diaspora* gibt es einen neuen Kommentar zu einem begrenzten Beitrag."
a_post_you_shared: "ein Beitrag."
+ a_private_message: "Auf diaspora* gibt eine neue Private Nachricht für dich."
accept_invite: "Bestätige deine diaspora* Einladung!"
click_here: "Hier klicken"
comment_on_post:
@@ -750,6 +756,47 @@ de:
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}"
email_sent_by_diaspora: "Diese E-Mail wurde von %{pod_name} verschickt. Falls du solche E-Mails nicht mehr erhalten willst,"
+ export_email:
+ body: |-
+ Hallo %{name},
+
+ Deine Daten wurden verarbeitet und stehen [hier zum Download bereit](%{url}).
+
+ Gruß,
+
+ der diaspora* E-Mail-bot!
+ subject: "Deine persönlichen Daten stehen zum Download bereit, %{name}"
+ export_failure_email:
+ body: |-
+ Hallo %{name},
+
+ Es trat ein Fehler beim Verarbeiten deiner Daten auf.
+ Bitte versuche es noch einmal!
+
+ Gruß,
+ Der diaspora* email bot!
+ subject: "Entschuldige %{name}, es gab einen Fehler beim Verarbeiten deiner Daten."
+ export_photos_email:
+ body: |-
+ Hallo %{name},
+
+ Deine Fotos wurden verarbeitet und können unter [diesem Link](%{url}) heruntergeladen werden.
+
+ Grüße,
+
+ Der diaspora* E-Mail-Roboter!
+ subject: "Deine Fotos sind bereit zum Herunterladen, %{name}"
+ export_photos_failure_email:
+ body: |-
+ Hallo %{name},
+
+ Beim Verarbeiten deiner Fotos zum Herunterladen ist ein Problem aufgetreten.
+ Bitte versuche es noch einmal!
+
+ Entschuldigung,
+
+ Der diaspora* E-Mail-Roboter!
+ subject: "Es gab ein Problem mit deinen Fotos, %{name}"
hello: "Hallo %{name}!"
invite:
message: |-
@@ -775,6 +822,22 @@ de:
subject: "%{name} hat dich auf diaspora* erwähnt"
private_message:
reply_to_or_view: "Antworte oder sieh dir diese Unterhaltung an >"
+ remove_old_user:
+ body: |-
+ Hallo,
+
+ da du dein Konto unter %{pod_url} seit %{after_days} nicht mehr benutzt hast, sieht es so aus, als ob du es nicht mehr möchtest. Um unseren aktiven Nutzern auf diesem Pod die bestmögliche Leistung zu bieten, würden wir ungewollte Konten gerne aus unserer Datenbank entfernen.
+
+ Es würde uns sehr gefallen, wenn du ein Teil der diaspora*-Gemeinschaft bleibst, und wenn du möchtest kannst du dein Konto behalten.
+
+ Wenn du dein Konto behalten möchtest, musst du dich nur vor %{remove_after} anmelden. Wenn du dich angemeldet hast, nimm dir einen Augenblick Zeit, um dich auf diaspora* umzusehen. Es hat sich seit deinem letzten Besuch stark verändert und wir glauben, dass dir die Verbesserungen, die wir vorgenommen haben, gefallen werden. Folge einigen #Tags, um Inhalte zu finden, die dir gefallen.
+
+ Melde dich hier an: %{login_url}. Falls du deine Zugangsdaten vergessen hast, kannst du dir auf der Seite eine Erinnerung zuschicken lassen.
+
+ In Hoffnung dich wiederzusehen,
+
+ Der diaspora* E-Mail-Roboter!
+ subject: "Dein diaspora*-Konto wurde aufgrund von Inaktivität zur Löschung markiert"
report_email:
body: |-
Hallo,
@@ -818,7 +881,6 @@ de:
add_contact_from_tag: "Füge Kontakt über einen Hashtag hinzu"
aspect_list:
edit_membership: "Bearbeite die Aspekt-Zugehörigkeit"
- few: "%{count} Personen"
helper:
is_not_sharing: "%{name} teilt nicht mit dir"
is_sharing: "%{name} teilt mit dir"
@@ -829,14 +891,13 @@ de:
no_one_found: "… und niemand wurde gefunden."
no_results: "Hey! Du musst nach etwas suchen."
results_for: "Suchergebnisse für %{search_term}"
- search_handle: "Nutze die diaspora* ID (nutzername@pod.tld) deiner Freunde um sie leichter zu finden."
+ search_handle: "Nutze die diaspora* ID (nutzername@pod.tld) deiner Freunde, um sie leichter zu finden."
searching: "suche, bitte warten..."
send_invite: "Immer noch nichts? Verschicke eine Einladung!"
- many: "%{count} Personen"
one: "einer Person"
other: "%{count} Personen"
person:
- add_contact: "Kontakt hinzufügen"
+ add_contact: "+ Kontakt hinzufügen"
already_connected: "Bereits verbunden"
pending_request: "Ausstehende Anfrage"
thats_you: "Das bist du!"
@@ -869,7 +930,6 @@ de:
add_some: "Füge neue hinzu"
edit: "Bearbeiten"
you_have_no_tags: "Du hast keine Tags!"
- two: "%{count} Personen"
webfinger:
fail: "Entschuldigung, wir konnten %{handle} nicht finden."
zero: "niemand"
@@ -933,8 +993,8 @@ de:
first_name: "Vorname"
last_name: "Nachname"
nsfw_check: "Markiere alles, was ich teile, als NSFW"
- nsfw_explanation: "NSFW („Not safe for work“, dt. „Unpassend für den Arbeitsplatz“) ist Diasporas sich selbst verwaltender Community-Standard für Inhalte, die für das Ansehen während der Arbeit möglicherweise ungeeignet sind. Bitte aktiviere diese Option, wenn du häufig derartiges Material teilen möchtest, damit es in den Streams anderer Leute, die es nicht sehen wollen, ausgeblendet wird."
- nsfw_explanation2: "Wenn du diese Option nicht verwenden möchtest, markiere entsprechendes Material bitte mit dem Tag #nsfw."
+ nsfw_explanation: "NSFW („Not safe for work“, dt. „Unpassend für den Arbeitsplatz“) ist Diasporas sich selbst verwaltender Gemeinschafts-Standard für Inhalte, die für das Ansehen während der Arbeit möglicherweise ungeeignet sind. Bitte aktiviere diese Option, wenn du häufig derartiges Material teilen möchtest, damit es in den Streams anderer Leute, die es nicht sehen wollen, ausgeblendet wird."
+ nsfw_explanation2: "Wenn du diese Option nicht auswählst, markiere deine entsprechenden Beiträge dann bitte jeweils mit dem Tag #nsfw."
update_profile: "Profil aktualisieren"
your_bio: "Deine Beschreibung"
your_birthday: "Dein Geburtstag"
@@ -958,7 +1018,7 @@ de:
two: "%{count} Reaktionen"
zero: "Keine Reaktionen"
registrations:
- closed: "Neuregistrierungen sind auf diesem Pod geschlossen."
+ closed: "Neuregistrierungen sind auf diesem diaspora*-Pod geschlossen."
create:
success: "Du bist diaspora* beigetreten!"
edit:
@@ -970,29 +1030,26 @@ de:
update: "Aktualisieren"
invalid_invite: "Der von dir erstellte Einladungs-Link ist nicht mehr gültig!"
new:
- continue: "Weiter"
create_my_account: "Konto erstellen!"
- diaspora: "<3 diaspora*"
- email: "EMAIL"
+ email: "E-Mail"
enter_email: "Gib eine E-Mail-Adresse an"
enter_password: "Gib ein Kennwort ein (mindestens sechs Zeichen)"
enter_password_again: "Gib das gleiche Kennwort wie zuvor ein"
enter_username: "Wähle einen Nutzernamen (nur Buchstaben, Nummern und Unterstriche)"
- hey_make: "HEY,<br/>MACHE<br/>ETWAS."
join_the_movement: "Tritt der Bewegung bei!"
- password: "PASSWORT"
- password_confirmation: "PASSWORT BESTÄTIGEN"
- sign_up: "REGISTRIEREN"
+ password: "Passwort"
+ password_confirmation: "Passwort bestätigen"
+ sign_up: "Registrieren"
sign_up_message: "Soziales Netzwerken mit ♥"
submitting: "Absenden…"
terms: "Indem du ein Konto erstellst, akzeptierst du die %{terms_link}."
terms_link: "Nutzungsbedingungen"
- username: "BENUTZERNAME"
+ username: "Benutzername"
report:
comment_label: "<b>Kommentar</b>:<br>%{data}"
confirm_deletion: "Bist du dir sicher, dass du das Objekt löschen willst?"
- delete_link: "Lösche Objekt"
- not_found: "<u>Der Beitrag/Kommentar wurde nicht gefunden. Es sieht so aus, als ob er vom Benutzer gelöscht wurde!</u>"
+ delete_link: "Lösche Element"
+ not_found: "Der Beitrag/Kommentar wurde nicht gefunden. Es sieht so aus, als ob er vom Benutzer gelöscht wurde!"
post_label: "<b>Beitrag</b>: %{title}"
reason_label: "Grund: %{text}"
reported_label: "<b>Gemeldet von</b> %{person}"
@@ -1053,7 +1110,7 @@ de:
failure:
error: "Es gab einen Fehler der Verbindung mit dem Dienst."
finder:
- fetching_contacts: "Deine %{service}-Freunde werden momentan eingeladen. Schau bitte in ein paar Minuten noch einmal vorbei!"
+ fetching_contacts: "Deine %{service}-Freunde werden momentan eingeladen. Schau in ein paar Minuten noch einmal vorbei!"
no_friends: "Keine Facebook-Freunde gefunden."
service_friends: "%{service}-Freunde"
index:
@@ -1089,6 +1146,8 @@ de:
your_diaspora_username_is: "Dein diaspora*-Nutzername ist: %{diaspora_handle}"
aspect_dropdown:
add_to_aspect: "Kontakt hinzufügen"
+ mobile_row_checked: "%{name} (entfernen)"
+ mobile_row_unchecked: "%{name} (hinzufügen)"
toggle:
few: "In %{count} Aspekten"
many: "In %{count} Aspekten"
@@ -1145,7 +1204,7 @@ de:
posting: "Senden …"
preview: "Vorschau"
publishing_to: "Veröffentlichen an: "
- remove_location: "Position entfernen"
+ remove_location: "Ort entfernen"
share: "Teilen"
share_with: "Teile mit"
upload_photos: "Fotos hochladen"
@@ -1172,8 +1231,23 @@ de:
message:
default: "Der Sicherheitsschlüssel entsprach nicht dem aus dem Bild."
failed: "Menschlichkeitsprüfung fehlgeschlagen"
- user: "Der eingegebene Code unterschied sich vom abgebildeten."
- placeholder: "Gebe die dargestellten Zeichen ein"
+ user: "Der eingegebene Code unterschied sich vom Abgebildeten."
+ placeholder: "Gib die dargestellten Zeichen ein"
+ statistics:
+ active_users_halfyear: "Aktive Benutzer innerhalb eines halben Jahres"
+ active_users_monthly: "Aktive Benutzer innerhalb eines Monats"
+ closed: "Geschlossen"
+ disabled: "Nicht verfügbar"
+ enabled: "Verfügbar"
+ local_comments: "Lokale Kommentare"
+ local_posts: "Lokale Beiträge"
+ name: "Name"
+ network: "Netzwerk"
+ open: "Offen"
+ registrations: "Registrierungen"
+ services: "Dienste"
+ total_users: "Gesamtzahl Benutzer"
+ version: "Version"
status_messages:
create:
success: "Erfolgreich erwähnt: %{names}"
@@ -1183,15 +1257,11 @@ de:
no_message_to_display: "Keine Nachricht zum Anzeigen."
new:
mentioning: "Erwähnt: %{person}"
- too_long:
- few: "Bitte kürze deinen Beitrag auf weniger als %{count} Zeichen."
- many: "Bitte kürze deinen Beitrag auf weniger als %{count} Zeichen."
- one: "Bitte kürze deinen Beitrag auf weniger als %{count} Zeichen."
- other: "Bitte kürze deinen Beitrag auf weniger als %{count} Zeichen."
- two: "Bitte kürze deinen Beitrag auf unter %{count} Zeichen."
- zero: "Bitte kürze deinen Beitrag auf weniger als %{count} Zeichen."
+ too_long: "Bitte kürze deinen Beitrag auf weniger als %{count} Zeichen. Im Moment enthält er %{current_length} Zeichen"
stream_helper:
hide_comments: "Alle Kommentare verbergen"
+ no_more_posts: "Du hast das Ende des Streams erreicht."
+ no_posts_yet: "Es existieren bisher keine Beiträge."
show_comments:
few: "Zeige %{count} weitere Kommentare"
many: "Zeige %{count} weitere Kommentare"
@@ -1230,7 +1300,6 @@ de:
title: "Öffentliche Aktivität"
tags:
contacts_title: "Personen, die diesen Tag nutzen"
- tag_prefill_text: "Das Interessante an %{tag_name} ist, dass …"
title: "Getaggte Beiträge: %{tags}"
tag_followings:
create:
@@ -1241,18 +1310,16 @@ de:
failure: "Fehler beim Beenden des Folgens von: #%{name}. Vielleicht hast du schon aufgehört zu folgen?"
success: "Schade! Du folgst #%{name} nun nicht mehr."
tags:
+ name_too_long: "Bitte kürze deinen Tag-Namen auf weniger als %{count} Zeichen. Im Moment enthält er %{current_length} Zeichen"
show:
follow: "#%{tag} folgen"
- followed_by_people:
- one: "von einer Person gefolgt"
- other: "von %{count} Personen gefolgt"
- zero: "von keiner Person gefolgt"
following: "Du folgst #%{tag}"
- nobody_talking: "Niemand hat bisher etwas über %{tag} gesagt."
none: "Der leere Tag existiert nicht!"
- people_tagged_with: "Personen, die mit %{tag} getaggt sind"
- posts_tagged_with: "Beiträge, die mit #%{tag} getaggt sind"
stop_following: "#%{tag} nicht mehr folgen"
+ tagged_people:
+ one: "1 Person ist getaggt mit %{tag}"
+ other: "%{count} Personen sind getaggt mit %{tag}"
+ zero: "Niemand ist getaggt mit %{tag}"
terms_and_conditions: "Allgemeine Geschäftsbedingungen"
undo: "Rückgängig machen?"
username: "Benutzername"
@@ -1265,7 +1332,7 @@ de:
success: "Dein Account wurde gesperrt. Es kann bis zu 20 Minuten dauern, bis dein Account endgültig geschlossen ist. Vielen Dank, dass du diaspora* ausprobiert hast."
wrong_password: "Das eingegebene Kennwort stimmt nicht mit deinem aktuellen Kennwort überein."
edit:
- also_commented: "… jemand ebenfalls den Beitrag eines Kontaktes kommentiert"
+ also_commented: "… jemand ebenfalls den Beitrag, den du kommentiert hast, kommentiert"
auto_follow_aspect: "Aspekt für automatisch gefolgten Benutzern:"
auto_follow_back: "Folge Benutzern automatisch, wenn sie dir folgen"
change: "Ändern"
@@ -1275,35 +1342,42 @@ de:
character_minimum_expl: "bitte mindestens sechs Zeichen eingeben"
close_account:
dont_go: "Hey, bitte geh nicht!"
- if_you_want_this: "Wenn du das wirklich möchtest, gib dein Kennwort ein und klicke auf 'Konto schließen'"
- lock_username: "Das wird deinen Benutzernamen sperren, falls du dich dazu entscheidest, dich neu anzumelden."
- locked_out: "Du wirst abgemeldet und von deinem Account ausgesperrt."
- make_diaspora_better: "Wir möchten, dass du uns dabei hilfst, diaspora* besser zu machen, anstatt zu gehen. Wenn du wirklich gehen möchtest, wollen wir dich auf dem Laufenden halten."
+ if_you_want_this: "Wenn du das wirklich möchtest, gib unten dein Passwort ein und klicke auf 'Konto schließen'"
+ lock_username: "Dein Benutzername wird gesperrt werden. Du wirst auf diesem Pod kein neues Konto mit derselben ID erstellen können."
+ locked_out: "Du wirst abgemeldet und von deinem Konto ausgesperrt, bis es gelöscht wurde."
+ make_diaspora_better: "Wir würden uns freuen, wenn du bleibst und uns hilfst, diaspora* besser zu machen, anstatt uns zu verlassen. Wenn du uns wirklich verlassen möchtest, wird folgendes passieren:"
mr_wiggles: "Mr. Wiggles wird traurig sein, wenn du gehst"
- no_turning_back: "Momentan gibt es kein Zurück."
- what_we_delete: "Wir löschen alle deine Beiträge und dein Profil so schnell wie möglich. Deine Kommentare bleiben hier, werden jedoch mit deiner diaspora* ID anstatt deinem Namen verbunden."
+ no_turning_back: "Es gibt kein Zurück! Wenn du dir wirklich sicher bist, gib unten dein Passwort ein."
+ what_we_delete: "Wir löschen alle deine Beiträge und dein Profil so schnell wie möglich. Deine Kommentare auf anderer Leute Beiträge werden weiterhin angezeigt, aber sie werden mit deiner diaspora*-ID statt mit deinem Namen verknüpft."
close_account_text: "Konto schließen"
comment_on_post: "… jemand deinen Beitrag kommentiert"
current_password: "Derzeitiges Kennwort"
current_password_expl: "das mit dem Du dich anmeldest..."
+ download_export: "Mein Profil herunterladen"
+ download_export_photos: "Meine Fotos herunterladen"
download_photos: "Meine Fotos herunterladen"
- download_xml: "Daten herunterladen (XML)"
edit_account: "Konto bearbeiten"
email_awaiting_confirmation: "Wir haben dir einen Aktivierungslink zu %{unconfirmed_email} geschickt. Solange du dem Link nicht gefolgt bist und die neue Adresse aktiviert hast, werden wir weiterhin deine ursprüngliche E-Mail-Adresse %{email} verwenden."
export_data: "Daten exportieren"
+ export_in_progress: "Wir verarbeiten momentan deine Daten - schau etwas später noch einmal vorbei."
+ export_photos_in_progress: "Wir sind gerade dabei, deine Fotos zu verarbeiten. Bitte guck in ein paar Augenblicken noch mal vorbei."
following: "Folgen-Einstellungen"
getting_started: "Einstellungen für neue Nutzer"
- liked: "… wenn jemandem dein Beitrag gefällt?"
+ last_exported_at: "(Zuletzt aktualisiert: %{timestamp})"
+ liked: "… jemandem dein Beitrag gefällt"
mentioned: "… du in einem Beitrag erwähnt wirst"
new_password: "Neues Kennwort"
- photo_export_unavailable: "Exportieren von Fotos derzeit nicht verfügbar"
private_message: "… du eine private Nachricht erhältst"
receive_email_notifications: "E-Mail-Benachrichtigungen empfangen, wenn …"
- reshared: "… jemand deinen Beitrag weitersagt?"
+ request_export: "Meine Profildaten anfordern"
+ request_export_photos: "Meine Fotos anfragen"
+ request_export_photos_update: "Meine Fotos aktualisieren"
+ request_export_update: "Meine Profildaten aktualisieren"
+ reshared: "… jemand deinen Beitrag weitersagt"
show_community_spotlight: "Gemeinschafts-Schaukasten im Stream anzeigen?"
show_getting_started: "Einstiegshinweise wieder aktivieren"
- someone_reported: "jemand hat eine Meldung gesendet"
- started_sharing: "… jemand mit dir zu teilen anfängt"
+ someone_reported: "... jemand einen Beitrag gemeldet hat"
+ started_sharing: "… jemand anfägt mit dir zu teilen"
stream_preferences: "Stream-Einstellungen"
your_email: "Deine E-Mail-Adresse"
your_handle: "Deine diaspora* ID"
@@ -1320,7 +1394,9 @@ de:
who_are_you: "Wer bist Du?"
privacy_settings:
ignored_users: "Benutzer, die ignoriert werden"
+ no_user_ignored_message: "Du ignorierst momentan keinen anderen Benutzer"
stop_ignoring: "Aufhören, zu ignorieren"
+ strip_exif: "Entferne Metadaten wie Ort, Autor und Kameramodell von hochgeladenen Bildern (empfohlen)"
title: "Privatsphären-Einstellungen"
public:
does_not_exist: "Benutzer %{username} existiert nicht!"
diff --git a/config/locales/diaspora/de_formal.yml b/config/locales/diaspora/de_formal.yml
index 5ed3dca7b..16ceee011 100644
--- a/config/locales/diaspora/de_formal.yml
+++ b/config/locales/diaspora/de_formal.yml
@@ -12,6 +12,8 @@ de_formal:
_home: "Startseite"
_photos: "Fotos"
_services: "Dienste"
+ _statistics: "Statistik"
+ _terms: "Bedingungen"
account: "Konto"
activerecord:
errors:
@@ -102,8 +104,12 @@ de_formal:
: ja
user_search:
account_closing_scheduled: "Das Konto von %{name} soll geschlossen werden. Dies dauert ein paar Augenblicke..."
+ account_locking_scheduled: "Das Konto von %{name} ist zur Sperrung vorgesehen. Es wird in wenigen Augenblicken verarbeitet..."
+ account_unlocking_scheduled: "Das Konto von %{name} ist zur Entsperrung vorgesehen. Es wird in wenigen Augenblicken verarbeitet..."
add_invites: "Einladungen hinzufügen"
are_you_sure: "Möchten Sie Ihr Konto wirklich schließen?"
+ are_you_sure_lock_account: "Sind Sie sicher, dass Sie dieses Konto sperren möchten?"
+ are_you_sure_unlock_account: "Sind Sie sicher, dass Sie dieses Konto entsperren möchten?"
close_account: "Konto schließen"
email_to: "per E-Mail einladen"
under_13: "Zeige Benutzer, die unter 13 Jahre alt sind (COPPA)"
@@ -113,7 +119,7 @@ de_formal:
zero: "%{count} Benutzer gefunden"
view_profile: "Profil anzeigen"
you_currently:
- one: "Sie haben derzeit %{count} Einladung übrig %{link}"
+ one: "Sie haben derzeit eine Einladung übrig %{link}"
other: "Sie haben derzeit %{count} Einladungen übrig %{link}"
zero: "Sie haben derzeit keine Einladung übrig %{link}"
weekly_user_stats:
@@ -140,8 +146,6 @@ de_formal:
add_to_aspect:
failure: "Fehler beim Hinzufügen des Kontakts zum Aspekt."
success: "Kontakt erfolgreich zum Aspekt hinzugefügt."
- aspect_contacts:
- done_editing: "Änderungen abgeschlossen"
aspect_listings:
add_an_aspect: "+ Aspekt hinzufügen"
deselect_all: "Auswahl aufheben"
@@ -160,28 +164,23 @@ de_formal:
failure: "%{name} ist nicht leer und konnte nicht entfernt werden."
success: "%{name} wurde erfolgreich entfernt."
edit:
- add_existing: "Einen bereits bestehenden Kontakt hinzufügen"
- aspect_list_is_not_visible: "Die Aspektliste wird vor anderen im Aspekt versteckt"
- aspect_list_is_visible: "Die Aspektliste ist für andere im Aspekt sichtbar"
+ aspect_chat_is_enabled: "Kontakte in diesem Askekt können mit Ihnen chatten."
+ aspect_chat_is_not_enabled: "Kontakte in diesem Aspekt können nicht mit Ihnen chatten."
+ aspect_list_is_not_visible: "Kontakte in diesem Aspekt können einander nicht sehen."
+ aspect_list_is_visible: "Kontakte in diesem Aspekt können einander sehen."
confirm_remove_aspect: "Sind Sie sich sicher, dass Sie diesen Aspekt löschen möchten?"
- done: "Fertig"
+ grant_contacts_chat_privilege: "Kontakten im Aspekt das Chatrecht gewähren?"
make_aspect_list_visible: "Kontakte aus diesem Aspekt öffentlich machen?"
- manage: "Verwalten"
remove_aspect: "Diesen Aspekt löschen"
- rename: "umbenennen"
+ rename: "Umbenennen"
set_visibility: "Sichtbarkeit festlegen"
update: "Ändern"
- updating: "Ändere …"
- few: "%{count} Aspekte"
- helper:
- are_you_sure: "Möchten Sie diesen Aspekt wirklich löschen?"
- aspect_not_empty: "Aspekt ist nicht leer"
- remove: "entfernen"
+ updating: "Ändere…"
index:
diaspora_id:
- content_1: "Ihre diaspora* ID ist:"
- content_2: "Geben Sie diese weiter und seien Sie somit auf diaspora* leicht zu finden."
- heading: "diaspora* ID"
+ content_1: "Ihre diaspora*-ID ist:"
+ content_2: "Geben Sie diese an andere weiter und sie werden Sie leicht auf diaspora* finden können."
+ heading: "diaspora*-ID"
donate: "Spenden"
handle_explanation: "Das ist Ihre diaspora* ID. Sie können sie wie eine E-Mail-Adresse weitergeben, damit andere Nutzer mit Ihnen Kontakt aufnehmen können."
help:
@@ -207,21 +206,16 @@ de_formal:
new_here:
follow: "Folgen Sie %{link} und heißen Sie neue Benutzer auf diaspora* willkommen!"
learn_more: "Mehr erfahren"
- title: "Willkommen, neuer Benutzer"
+ title: "Heißen Sie neue Benutzer willkommen"
no_contacts: "Keine Kontakte"
no_tags: "+ Finden Sie einen #Tag zum folgen"
people_sharing_with_you: "Leute, die mit Ihnen teilen"
post_a_message: "Schreiben Sie eine Nachricht >>"
services:
content: "Sie können die folgenden Dienste mit diaspora* verbinden:"
- heading: "Verbinde Dienste"
+ heading: "Dienste verbinden"
unfollow_tag: "#%{tag} nicht mehr folgen"
welcome_to_diaspora: "Willkommen bei diaspora*, %{name}!"
- many: "%{count} Aspekte"
- move_contact:
- error: "Fehler beim Verschieben des Kontakts: %{inspect}"
- failure: "hat nicht funktioniert: %{inspect}"
- success: "Person in neuen Aspekt verschoben"
new:
create: "Erstellen"
name: "Name (nur für Sie sichtbar)"
@@ -239,18 +233,10 @@ de_formal:
family: "Familie"
friends: "Freunde"
work: "Arbeit"
- selected_contacts:
- manage_your_aspects: "Verwalten Sie ihre Aspekte."
- no_contacts: "Sie haben hier noch keine Kontakte."
- view_all_community_spotlight: "Schaukasten der gesamten Gemeinschaft"
- view_all_contacts: "Zeige alle Kontakte"
- show:
- edit_aspect: "Aspekt bearbeiten"
- two: "%{count} Aspekte"
update:
failure: "%{name} ist ein zu langer Name, um gespeichert zu werden."
success: "Aspekt %{name} erfolgreich bearbeitet."
- zero: "keine Aspekte"
+ zero: "Keine Aspekte"
back: "Zurück"
blocks:
create:
@@ -266,36 +252,31 @@ de_formal:
post_success: "Erstellt! Schließen …"
cancel: "Abbrechen"
comments:
- few: "%{count} Kommentare"
- many: "%{count} Kommentare"
new_comment:
comment: "Kommentieren"
commenting: "Kommentieren …"
one: "Ein Kommentar"
other: "%{count} Kommentare"
- two: "%{count} Kommentare"
zero: "Keine Kommentare"
contacts:
create:
failure: "Fehler beim Erstellen des Kontakts"
- few: "%{count} Kontakte"
index:
add_a_new_aspect: "Einen neuen Aspekt hinzufügen"
+ add_contact: "Kontakt hinzufügen"
add_to_aspect: "Füge Kontakte zu %{name} hinzu"
- add_to_aspect_link: "Füge Kontakte zu %{name} hinzu"
all_contacts: "Alle Kontakte"
community_spotlight: "Gemeinschafts-Focus"
- many_people_are_you_sure: "Sind Sie sich sicher, dass Sie eine private Unterhaltung mit mehr als %{suggested_limit} Kontakten beginnen möchten? Einen Beitrag in diesen Aspekt zu schreiben könnte ein besserer Weg sein, um sie zu kontaktieren."
my_contacts: "Meine Kontakte"
no_contacts: "Sieht so aus als müssten Sie einige Kontakte hinzufügen!"
+ no_contacts_in_aspect: "Sie haben noch keine Kontakte in diesem Aspekt. Unten befindet sich eine Liste Ihrer bestehenden Kontakte, die Sie zu diesem Aspekt hinzufügen können."
no_contacts_message: "Erkunden Sie den %{community_spotlight}"
- no_contacts_message_with_aspect: "Schauen Sie in den %{community_spotlight} oder %{add_to_aspect_link}"
only_sharing_with_me: "Nur mit Ihnen Teilende"
- remove_person_from_aspect: "Entferne %{person_name} aus \"%{aspect_name}\""
+ remove_contact: "Kontakt entfernen"
start_a_conversation: "Starten Sie eine Unterhaltung"
title: "Kontakte"
+ user_search: "Nutzersuche"
your_contacts: "Ihre Kontakte"
- many: "%{count} Kontakte"
one: "Ein Kontakt"
other: "%{count} Kontakte"
sharing:
@@ -303,7 +284,6 @@ de_formal:
spotlight:
community_spotlight: "Gemeinschafts-Schaukasten"
suggest_member: "Ein Mitglied vorschlagen"
- two: "%{count} Kontakte"
zero: "Kontakte"
conversations:
conversation:
@@ -313,7 +293,8 @@ de_formal:
no_contact: "Hoppla, Sie müssen den Kontakt erst hinzufügen!"
sent: "Nachricht versendet"
destroy:
- success: "Konversation erfolgreich entfernt"
+ delete_success: "Unterhaltung erfolgreich gelöscht"
+ hide_success: "Unterhaltung erfolgreich ausgeblendet"
helper:
new_messages:
few: "%{count} neue Nachrichten"
@@ -339,6 +320,7 @@ de_formal:
fail: "Ungültige Nachricht"
show:
delete: "Diese Konversation löschen und blockieren"
+ hide: "Unterhaltung ausblenden und stummschalten"
reply: "Antworten"
replying: "Antworten …"
date:
@@ -394,8 +376,15 @@ de_formal:
what_is_an_aspect_q: "Was sind Aspekte?"
who_sees_post_a: "Wenn Sie einen begrenzten Beitrag posten, wird dieser nur für Leute sichtbar sein, die sich in dem ausgewählten Aspekt (oder in den ausgewählten Aspekten, falls Sie mehrere ausgewählt haben) befinden. Ihre anderen Kontakte werden ihn nicht sehen, es sei denn, Sie machen ihn öffentlich. Ausschließlich öffentliche Beiträge werden auch für Leute sichtbar sein, die sich in keinem Ihrer Aspekte befinden."
who_sees_post_q: "Wenn ich einen Beitrag an einen Aspekt poste, wer sieht ihn dann?"
+ chat:
+ add_contact_roster_a: "Zuerst müssen Sie den Chat für einen der Aspekte aktivieren, in denen sich die Person befindet. Dafür gehen Sie zur %{contacts_page}, wählen den gewünschten Aspekt aus und klicken auf das Chat-Icon, um den Chat für den Aspekt zu aktivieren. %{toggle_privilege} Wenn es Ihnen lieber ist, können Sie auch einen speziellen Aspekt namens 'Chat' erstellen und zu ihm die Personen hinzufügen, mit denen Sie chatten möchten. Wenn Sie das erledigt haben, öffnen Sie die Chatoberfläche und wählen die Person aus, mit der Sie chatten möchten."
+ add_contact_roster_q: "Wie kann ich auf diaspora* mit jemandem chatten?"
+ contacts_page: "Kontaktseite"
+ title: "Chat"
+ faq: "FAQ"
foundation_website: "Webseite der diaspora*-Stiftung"
getting_help:
+ get_support_a_faq: "Lesen Sie die %{faq}-Seite im Wiki"
get_support_a_hashtag: "fragen Sie in einem öffentlichen diaspora* Beitrag mit dem Hashtag %{question}."
get_support_a_irc: "Nehmen Sie am %{irc} teil"
get_support_a_tutorials: "Lesen Sie unsere %{tutorials}"
@@ -414,6 +403,10 @@ de_formal:
keyboard_shortcuts_li2: "k - zum vorigen Beitrag springen"
keyboard_shortcuts_li3: "c - den aktuellen Beitrag kommentieren"
keyboard_shortcuts_li4: "l - den aktuellen Beitrag mit „Gefällt mir“ markieren"
+ keyboard_shortcuts_li5: "r - den aktuellen Beitrag weitersagen"
+ keyboard_shortcuts_li6: "m - den aktuellen Beitrag ausklappen"
+ keyboard_shortcuts_li7: "o - den ersten externen Link im Beitrag in einem neuen Fenster öffnen"
+ keyboard_shortcuts_li8: "Strg + Enter - Senden Sie die Nachricht, die Sie schreiben"
keyboard_shortcuts_q: "Welche Tastenkürzel gibt es?"
title: "Tastenkürzel"
markdown: "Markdown"
@@ -434,7 +427,7 @@ de_formal:
diaspora_app_q: "Gibt es eine diaspora* App für Android oder iOS?"
photo_albums_a: "Nein, momentan nicht. Aber Sie können sich die hochgeladenen Bilder in der Fotosektion in der linke Leiste auf dem Profil ansehen."
photo_albums_q: "Gibt es Foto- oder Videoalben?"
- subscribe_feed_a: "Ja, allerdings ist diese Funktion noch immer nicht ganz ausgereift und das Ergebnis wird nicht ganz richtig formatiert. Wenn Sie die Funktion dennoch benutzen wollen, gehen Sie einfach zu der Profilseite der Person und klicken Sie auf die Feed-Schaltfläche deines Browsers oder kopieren Sie die Profil-URL (z.B. https://joindiaspora.com/people/irgendeinenummer) und fügen Sie sie in den Feedreader ein. Die resultierenden Feed-Adressen sehen aus wie https://joindiaspora.com/public/benutzername.atom. diaspora* benutzt Atom an Stelle von RSS."
+ subscribe_feed_a: "Ja, allerdings ist diese Funktion noch immer nicht ganz ausgereift und das Ergebnis wird nicht ganz richtig formatiert. Wenn Sie die Funktion dennoch benutzen wollen, gehen Sie einfach zu der Profilseite der Person und klicken Sie auf die Feed-Schaltfläche deines Browsers oder kopieren Sie die Profil-URL (z.B. https://joindiaspora.com/people/irgendeinenummer) und fügen Sie sie in den Feedreader ein. Die resultierenden Feed-Adressen sehen aus wie https://joindiaspora.com/public/benutzername.atom – diaspora* benutzt Atom an Stelle von RSS."
subscribe_feed_q: "Kann ich die öffentlichen Beiträge einer Person mit einem Feedreader verfolgen?"
title: "Diverses"
pods:
@@ -463,6 +456,14 @@ de_formal:
insert_images_comments_a2: "kann sowohl in Kommentaren, als auch in Beiträgen, dazu benutzt werden, Bilder aus dem Internet einzufügen."
insert_images_comments_q: "Kann ich Bilder in Kommentare einfügen?"
insert_images_q: "Wie füge ich zu einem Beitrag Fotos hinzu?"
+ post_location_a: "Klicken Sie auf das Stecknadelsymbol neben der Kamera im Eingabefeld für Veröffentlichungen. Dies wird Ihre Position von OpenStreetMap einfügen. Sie können Ihre Position bearbeiten – möglicherweise möchten Sie nur die Stadt, in der Sie sich befinden, einbinden, und nicht die genaue Adresse."
+ post_location_q: "Wie füge ich einem Beitag meine Position hinzu?"
+ post_notification_a: "Neben dem X oben rechts an einem Beitrag finden Sie ein Glockensymbol. Klicken Sie darauf, um Benachrichtigungen für jenen Beitrag zu aktivieren oder zu deaktivieren."
+ post_notification_q: "Wie kann ich Benachrichtigungen über einen Beitrag ein- oder ausschalten?"
+ post_poll_a: "Klicken Sie auf das Diagrammsymbol, um eine Umfrage zu erstellen. Geben Sie eine Frage und mindestens zwei Antwortmöglichkeiten ein. Vergessen Sie nicht, Ihren Beitrag öffentlich zu machen, wenn jeder daran teilnehmen können soll."
+ post_poll_q: "Wie füge ich meinem Beitrag eine Umfrage hinzu?"
+ post_report_a: "Klicken Sie auf das Warndreieck oben rechts an einem Beitrag, um ihn Ihrem Podmin zu melden. Geben Sie einen Grund für das Melden des Beitrags in der Dialogbox ein."
+ post_report_q: "Wie melde ich einen anstößigen Beitrag?"
size_of_images_a: "Nein. Bilder werden automatisch auf eine Größe geändert, die in den Stream passt. Markdown bietet keinen Code, um die Größe eines Bildes anzugeben."
size_of_images_q: "Kann ich die Größe von Bildern in Beiträgen oder Kommentaren anpassen?"
stream_full_of_posts_a1: "Ihr Stream setzt sich aus drei Arten von Beiträgen zusammen:"
@@ -527,6 +528,7 @@ de_formal:
add_to_aspect_li5: "Aber wenn Ben sich nun Amys Profil ansieht, dann kann er ihre privaten Beiträge des Aspekts sehen, in welchen sie ihn eingeordnet hat (und natürlich ihre öffentlichen, die jeder sehen kann)."
add_to_aspect_li6: "Ben sieht nun Amys privates Profil (Beschreibung, Ort, Geschlecht, Geburtstag)."
add_to_aspect_li7: "Amy ist nun auf Bens Kontaktseite unter „Nur mit dir teilend“ zu finden."
+ add_to_aspect_li8: "Amy wird Ben auch in einem Beitrag @erwähnen können."
add_to_aspect_q: "Was passiert wenn ich jemanden zu meinen Aspekten hinzufüge? Oder wenn mich jemand zu seinen Aspekten hinzufügt?"
list_not_sharing_a: "Nein, aber Sie können auf den Profilseiten von Leuten nachsehen, ob sie mit Ihnen teilen. Wenn ja, ist die Leiste unter deren Profilbild grün, andernfalls grau. Sie sollten zudem immer, wenn jemand mit Ihnen zu teilen beginnt, eine Benachrichtigung bekommen."
list_not_sharing_q: "Gibt es eine Liste mit Leuten, die ich zu einem meiner Aspekte hinzugefügt habe, die mich aber noch nicht zu einem ihrer Aspekte hinzugefügt haben?"
@@ -534,6 +536,8 @@ de_formal:
only_sharing_q: "Wer ist auf der Kontaktseite unter „Nur mit dir teilend“ zu finden?"
see_old_posts_a: "Nein. Er wird ausschließlich neue Beiträge für diesen Aspekt sehen. Er (und alle Anderen) können aber alle älteren öffentlichen Beiträge von Ihnen auf Ihrer Profilseite oder in ihrem Stream sehen."
see_old_posts_q: "Wenn ich jemanden zu einem Aspekt hinzufüge, sieht er dann auch ältere, bereits geschriebene Beiträge in diesem Aspekt?"
+ sharing_notification_a: "Sie sollten jedes Mal, wenn jemand mit Ihnen zu teilen anfängt, eine Benachrichtigung erhalten."
+ sharing_notification_q: "Wie erfahre ich es, wenn jemand anfängt, mit mir zu teilen?"
title: "Teilen"
tags:
filter_tags_a: "Dass ist in in diaspora* derzeit nicht möglich, aber einige %{third_party_tools} wurden geschrieben um dies zu ermöglichen."
@@ -637,15 +641,12 @@ de_formal:
limited: "Begrenzt"
more: "Mehr"
next: "Nächste"
- no_results: "Keine Ergebnisse gefunden."
+ no_results: "Keine Ergebnisse gefunden"
notifications:
also_commented:
- few: "%{actors} haben auch %{post_author}s %{post_link} kommentiert."
- many: "%{actors} haben auch %{post_author}s %{post_link} kommentiert."
- one: "%{actors} hat auch %{post_author}s %{post_link} kommentiert."
- other: "%{actors} haben auch %{post_author}s %{post_link} kommentiert."
- two: "%{actors} haben auch %{post_author}s %{post_link} kommentiert."
- zero: "%{actors} hat auch %{post_author}s %{post_link} kommentiert."
+ one: "%{actors} hat auch %{post_author}s Beitrag %{post_link} kommentiert."
+ other: "%{actors} haben auch %{post_author}s Beitrag %{post_link} kommentiert."
+ zero: "%{actors} hat auch %{post_author}s Beitrag %{post_link} kommentiert."
also_commented_deleted:
few: "%{actors} haben einen inzwischen gelöschten Beitrag kommentiert."
many: "%{actors} haben einen inzwischen gelöschten Beitrag kommentiert."
@@ -654,12 +655,9 @@ de_formal:
two: "%{actors} haben deinen inzwischen gelöschten Beitrag kommentiert."
zero: "Niemand hat einen inzwischen gelöschten Beitrag kommentiert."
comment_on_post:
- few: "%{actors} haben Ihren %{post_link} kommentiert."
- many: "%{actors} haben Ihren %{post_link} kommentiert."
- one: "%{actors} hat Ihren %{post_link} kommentiert."
- other: "%{actors} haben Ihren %{post_link} kommentiert."
- two: "%{actors} hat Ihren %{post_link} kommentiert."
- zero: "Niemand hat Ihren %{post_link} kommentiert."
+ one: "%{actors} hat Ihren Beitrag %{post_link} kommentiert."
+ other: "%{actors} haben Ihren Beitrag %{post_link} kommentiert."
+ zero: "%{actors} hat Ihren Beitrag %{post_link} kommentiert."
helper:
new_notifications:
few: "%{count} neue Benachrichtigungen"
@@ -682,21 +680,20 @@ de_formal:
comment_on_post: "Einen Beitrag Kommentiert"
liked: "Gefällt"
mark_all_as_read: "Markiere alle als gelesen"
+ mark_all_shown_as_read: "Alle angezeigten als gelesen markieren"
mark_read: "Als gelesen markieren"
mark_unread: "als ungelesen markieren"
mentioned: "Erwähnt"
+ no_notifications: "Sie haben noch keine Benachrichtigungen."
notifications: "Benachrichtigungen"
reshared: "Weitergesagt"
show_all: "alle zeigen"
show_unread: "Ungelesene anzeigen"
started_sharing: "Angefangen zu teilen"
liked:
- few: "%{actors} gefällt Ihr %{post_link}."
- many: "%{actors} gefällt Ihr %{post_link}."
- one: "%{actors} gefällt Ihr %{post_link}."
- other: "%{actors} gefällt Ihr %{post_link}."
- two: "%{actors} mag Ihr %{post_link}."
- zero: "Niemandem gefällt Ihr %{post_link}."
+ one: "%{actors} gefällt Ihr Beitrag %{post_link}."
+ other: "%{actors} gefällt Ihr Beitrag %{post_link}."
+ zero: "Niemandem gefällt Ihr Beitrag %{post_link}."
liked_post_deleted:
few: "%{actors} gefällt Ihr gelöschter Beitrag."
many: "%{actors} gefällt Ihr gelöschter Beitrag."
@@ -705,12 +702,9 @@ de_formal:
two: "%{actors} gefällt Ihr gelöschter Beitrag."
zero: "Niemandem gefällt Ihr gelöschter Beitrag."
mentioned:
- few: "%{actors} haben Sie in einem %{post_link} erwähnt."
- many: "%{actors} haben Sie in einem %{post_link} erwähnt."
- one: "%{actors} hat Sie in einem %{post_link} erwähnt."
- other: "%{actors} haben Sie in einem %{post_link} erwähnt."
- two: "%{actors} hat Sie in einem %{post_link} erwähnt."
- zero: "Niemand hat Sie in einem %{post_link} erwähnt."
+ one: "%{actors} hat Sie in dem Beitrag %{post_link} erwähnt."
+ other: "%{actors} haben Sie in dem %{post_link} erwähnt."
+ zero: "Niemand hat Sie in dem Beitrag %{post_link} erwähnt."
mentioned_deleted:
few: "%{actors} haben Sie in einem gelöschten Beitrag erwähnt."
many: "%{actors} haben Sie in einem gelöschten Beitrag erwähnt."
@@ -727,12 +721,9 @@ de_formal:
two: "%{actors} hat Ihnen eine Nachricht geschickt."
zero: "%{actors} hat Ihnen eine Nachricht gesendet."
reshared:
- few: "%{actors} haben Ihren %{post_link} weitergesagt."
- many: "%{actors} haben Ihren %{post_link} weitergesagt."
- one: "%{actors} hat Ihren %{post_link} weitergesagt."
- other: "%{actors} haben Ihren %{post_link} weitergesagt."
- two: "%{actors} hat Ihren %{post_link} weitergeleitet."
- zero: "%{actors} haben Ihren %{post_link} weitergesagt."
+ one: "%{actors} hat Ihren Beitrag %{post_link} weitergesagt."
+ 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."
@@ -748,7 +739,9 @@ de_formal:
two: "%{actors} haben angefangen mit Ihnen zu teilen."
zero: "Niemand hat angefangen mit Ihnen zu teilen."
notifier:
+ a_limited_post_comment: "Auf diaspora* wartet ein neuer Kommentar auf einem begrenzten Beitrag darauf, von Ihnen gelesen zu werden."
a_post_you_shared: "ein Beitrag."
+ a_private_message: "Auf diaspora* wartet eine neue private Nachricht darauf, von Ihnen gelesen zu werden."
accept_invite: "Bestätigen Sie Ihre diaspora* Einladung!"
click_here: "Hier klicken"
comment_on_post:
@@ -757,6 +750,45 @@ de_formal:
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}"
email_sent_by_diaspora: "Diese E-Mail wurde von %{pod_name} verschickt. Falls Sie solche E-Mails nicht mehr erhalten wollen,"
+ export_email:
+ body: |-
+ Hallo %{name},
+
+ Ihre Daten wurden verarbeiten und stehen [hier zum Download bereit](%{url}).
+
+ Gruß,
+ Der diaspora* email bot!
+ subject: "Ihre persönlichen Daten sind bereit zum Download, %{name}"
+ export_failure_email:
+ body: |-
+ Hallo %{name},
+
+ Es trat ein Fehler beim Verarbeiten Ihrer Daten auf, bitte versuchen Sie es später noch einmal.
+
+ Gruß,
+ Der diaspora* email bot!
+ subject: "Entschuldige, es gab einen Fehler beim Verarbeiten Ihrer Daten, %{name}"
+ export_photos_email:
+ body: |-
+ Hallo %{name},
+
+ Ihre Fotos wurden verarbeitet und können nun unter [diesem Link](%{url}) heruntergeladen werden.
+
+ Grüße,
+
+ Der diaspora* E-Mail-Roboter!
+ subject: "Ihre Fotos stehen zum Herunterladen bereit, %{name}"
+ export_photos_failure_email:
+ body: |-
+ Hallo %{name}
+
+ Bei der Verarbeitung Ihrer Fotos zum Herunterladen ist ein Problem aufgetreten.
+ Bitte versuchen Sie es noch einmal!
+
+ Entschuldigung,
+
+ Der diaspora* E-Mail-Roboter!
+ subject: "Es ist ein Problem mit Ihren Fotos aufgetreten, %{name}"
hello: "Hallo %{name}!"
invite:
message: |-
@@ -782,6 +814,22 @@ de_formal:
subject: "%{name} hat Sie auf diaspora* erwähnt"
private_message:
reply_to_or_view: "Antworten Sie oder sehen Sie sich diese Unterhaltung an >"
+ remove_old_user:
+ body: |-
+ Hallo,
+
+ da Sie Ihr Konto unter %{pod_url} seit %{after_days} nicht mehr benutzt haben, sieht es so aus, als ob Sie es nicht mehr möchten. Um unseren aktiven Nutzern auf diesem Pod die bestmögliche Leistung zu bieten, würden wir ungewollte Konten gerne aus unserer Datenbank entfernen.
+
+ Es würde uns sehr gefallen, wenn Sie ein Teil der diaspora*-Gemeinschaft bleiben, und wenn Sie möchten können Sie ihr Konto behalten.
+
+ Wenn Sie Ihr Konto behalten möchten, müssen Sie sich nur vor %{remove_after} anmelden. Wenn Sie sich angemeldet haben, nehmen Sie sich einen Augenblick Zeit, um sich auf diaspora* umzusehen. Es hat sich seit Ihrem letzten Besuch stark verändert und wir glauben, dass Ihnen die Verbesserungen, die wir vorgenommen haben, gefallen werden. Folgen Sie einigen #Tags, um Inhalte zu finden, die Ihnen gefallen.
+
+ Melden Sie sich hier an: %{login_url}. Falls Sie Ihre Zugangsdaten vergessen haben, können Sie sich auf der Seite eine Erinnerung zuschicken lassen.
+
+ In Hoffnung Sie wiederzusehen,
+
+ Der diaspora* E-Mail-Roboter!
+ subject: "Ihr diaspora*-Konto wurde aufgrund von Inaktivität zur Löschung markiert"
report_email:
body: |-
Hallo,
@@ -825,7 +873,6 @@ de_formal:
add_contact_from_tag: "Fügen Sie Kontakt über einen Hashtag hinzu"
aspect_list:
edit_membership: "Bearbeiten Sie die Aspekt-Zugehörigkeit"
- few: "%{count} Personen"
helper:
is_not_sharing: "%{name} teilt nicht mit Ihnen"
is_sharing: "%{name} teilt mit Ihnen"
@@ -835,11 +882,10 @@ de_formal:
looking_for: "Suchen Sie mit %{tag_link} getaggte Beiträge?"
no_one_found: "… und niemand wurde gefunden."
no_results: "Hey! Sie müssen nach etwas suchen."
- results_for: "Suchergebnisse für"
+ results_for: "Suchergebnisse für %{search_term}"
search_handle: "Nutzen Sie die diaspora* ID (nutzername@pod.tld) Ihrer Freunde, um sie leichter zu finden."
searching: "suche, bitte warten..."
send_invite: "Immer noch nichts? Verschicken Sie eine Einladung!"
- many: "%{count} Personen"
one: "Eine Person"
other: "%{count} Personen"
person:
@@ -876,7 +922,6 @@ de_formal:
add_some: "Füge neue hinzu"
edit: "Bearbeiten"
you_have_no_tags: "Sie haben keine Tags!"
- two: "%{count} Personen"
webfinger:
fail: "Entschuldigung, wir konnten %{handle} nicht finden."
zero: "Keine Personen"
@@ -932,7 +977,7 @@ de_formal:
profile: "Profil"
profiles:
edit:
- allow_search: "Erlauben Sie anderen auf diaspora* nach Ihnen zu suchen"
+ allow_search: "Erlauben Sie anderen, auf diaspora* nach Ihnen zu suchen"
edit_profile: "Profil bearbeiten"
first_name: "Vorname"
last_name: "Nachname"
@@ -974,21 +1019,20 @@ de_formal:
update: "Aktualisieren"
invalid_invite: "Der von Ihnen erstellte Einladungs-Link ist nicht mehr gültig!"
new:
- continue: "Weiter"
create_my_account: "Konto erstellen"
- diaspora: "<3 diaspora*"
email: "E-MAIL"
enter_email: "Geben Sie eine E-Mail-Adresse an"
enter_password: "Geben Sie ein Kennwort ein (mindestens sechs Zeichen)"
enter_password_again: "Geben Sie das gleiche Kennwort wie zuvor ein"
enter_username: "Wählen Sie einen Nutzernamen (nur Buchstaben, Nummern und Unterstriche)"
- hey_make: "HEY,<br/>MACHEN SIE<br/>ETWAS."
join_the_movement: "Treten Sie der Bewegung bei!"
password: "PASSWORT"
password_confirmation: "PASSWORT BESTÄTIGEN"
sign_up: "REGISTRIEREN"
sign_up_message: "Soziales Netzwerken mit <3"
submitting: "Absenden..."
+ terms: "Indem Sie ein Konto erstellen, akzeptieren Sie die %{terms_link}."
+ terms_link: "Nutzungsbedingungen"
username: "BENUTZERNAME"
report:
comment_label: "<b>Kommentar</b>:<br>%{data}"
@@ -1085,6 +1129,8 @@ de_formal:
your_diaspora_username_is: "Ihr diaspora*-Nutzername ist: %{diaspora_handle}"
aspect_dropdown:
add_to_aspect: "Kontakt hinzufügen"
+ mobile_row_checked: "%{name} (entfernen)"
+ mobile_row_unchecked: "%{name} (hinzufügen)"
toggle:
few: "In %{count} Aspekten"
many: "In %{count} Aspekten"
@@ -1105,8 +1151,8 @@ de_formal:
invite_someone: "Jemanden einladen"
invite_your_friends: "Laden Sie Ihre Freunde ein"
invites: "Einladungen"
- invites_closed: "Einladungen sind auf diesem diaspora*-Pod derzeit nicht verfügbar."
- share_this: "Teilen Sie diesen Link per E-Mail, Blog oder Ihrem beliebtesten sozialen Netzwerk!"
+ invites_closed: "Einladungen sind auf diesem diaspora*-Pod derzeit geschlossen"
+ share_this: "Teilen Sie diesen Link per E-Mail, Blog oder soziale Netzwerke!"
notification:
new: "Neue %{type} von %{from}"
public_explain:
@@ -1170,6 +1216,21 @@ de_formal:
failed: "Menschlichkeitsprüfung fehlgeschlagen"
user: "Der eingegebene Code unterschied sich vom abgebildeten"
placeholder: "Geben Sie die dargestellten Zeichen ein"
+ statistics:
+ active_users_halfyear: "Aktive Benutzer innerhalb eines halben Jahres"
+ active_users_monthly: "Aktive Benutzer innerhalb eines Monats"
+ closed: "Geschlossen"
+ disabled: "Nicht verfügbar"
+ enabled: "Verfügbar"
+ local_comments: "Lokale Kommentare"
+ local_posts: "Lokale Beiträge"
+ name: "Name"
+ network: "Netzwerk"
+ open: "Offen"
+ registrations: "Registrierungen"
+ services: "Dienste"
+ total_users: "Gesamtzahl Benutzer"
+ version: "Version"
status_messages:
create:
success: "Erfolgreich erwähnt: %{names}"
@@ -1179,15 +1240,11 @@ de_formal:
no_message_to_display: "Keine Nachricht zum Anzeigen."
new:
mentioning: "Erwähnt: %{person}"
- too_long:
- few: "Bitte kürzen Sie Ihren Beitrag auf weniger als %{count} Zeichen."
- many: "Bitte kürzen Sie Ihren Beitrag auf weniger als %{count} Zeichen."
- one: "Bitte kürzen Sie Ihren Beitrag auf weniger als %{count} Zeichen."
- other: "Bitte kürzen Sie Ihren Beitrag auf weniger als %{count} Zeichen."
- two: "Bitte kürzen Sie Ihren Beitrag auf unter %{count} Zeichen."
- zero: "Bitte kürzen Sie Ihren Beitrag auf weniger als %{count} Zeichen."
+ too_long: "Bitte kürzen Sie Ihren Beitrag auf weniger als %{count} Zeichen. Im Moment enthält er %{current_length} Zeichen"
stream_helper:
hide_comments: "Alle Kommentare verbergen"
+ no_more_posts: "Sie haben das Ende des Streams erreicht."
+ no_posts_yet: "Es existieren noch keine Beiträge."
show_comments:
one: "Zeige einen weiteren Kommentar"
other: "Zeige %{count} weitere Kommentare"
@@ -1223,7 +1280,6 @@ de_formal:
title: "Öffentliche Aktivität"
tags:
contacts_title: "Menschen, die diese Tags nutzen"
- tag_prefill_text: "Das Interessante an %{tag_name} ist, dass… "
title: "Getaggte Beiträge: %{tags}"
tag_followings:
create:
@@ -1234,18 +1290,16 @@ de_formal:
failure: "Fehler beim Beenden des Folgens von: #%{name}"
success: "Sie folgen #%{name} nicht mehr"
tags:
+ name_too_long: "Bitte kürzen Sie Ihren Tag-Namen auf weniger als %{count} Zeichen. Im Moment enthält er %{current_length} Zeichen"
show:
follow: "#%{tag} folgen"
- followed_by_people:
- one: "von einer Person gefolgt"
- other: "von %{count} Personen gefolgt"
- zero: "von keiner Person gefolgt"
following: "#%{tag} folgen"
- nobody_talking: "Niemand hat bisher etwas über %{tag} gesagt."
none: "Der leere Tag existiert nicht!"
- people_tagged_with: "Personen, die mit %{tag} getagt sind"
- posts_tagged_with: "Beiträge, die mit #%{tag} getagt sind"
stop_following: "#%{tag} nicht mehr folgen"
+ tagged_people:
+ one: "1 Person getaggt mit %{tag}"
+ other: "%{count} Personen getaggt mit %{tag}"
+ zero: "Keiner getaggt mit %{tag}"
terms_and_conditions: "Nutzungsbedingungen"
undo: "Rückgängig machen?"
username: "Benutzername"
@@ -1258,9 +1312,9 @@ de_formal:
success: "Ihr Account wurde gesperrt. Es kann bis zu 20 Minuten dauern, bis Ihr Account endgültig geschlossen ist. Vielen Dank, dass Sie diaspora* ausprobiert haben."
wrong_password: "Das eingegebene Kennwort stimmt nicht mit Ihrem aktuellen Kennwort überein."
edit:
- also_commented: "… jemand ebenfalls den Beitrag eines Kontaktes kommentiert?"
- auto_follow_aspect: "Aspekt für automatisch gefolgte Benutzer:"
- auto_follow_back: "Automatically follow back if a someone follows you"
+ also_commented: "jemand ebenfalls einen Beitrag kommentiert, den Sie kommentiert haben"
+ auto_follow_aspect: "Aspekt für automatisch gefolgte Kontakte:"
+ auto_follow_back: "Automatisch mit Benutzern teilen, die anfangen, mit Ihnen zu teilen"
change: "Ändern"
change_email: "E-Mail-Adresse ändern"
change_language: "Sprache ändern"
@@ -1268,35 +1322,42 @@ de_formal:
character_minimum_expl: "bitte mindestens sechs Zeichen eingeben"
close_account:
dont_go: "Bitte gehen Sie nicht!"
- if_you_want_this: "Wenn Sie das wirklich möchten, geben Sie Ihr Kennwort ein und klicken Sie auf 'Konto schließen'"
- lock_username: "Das wird Ihren Benutzernamen sperren, falls Sie sich dazu entscheiden, sich neu anzumelden."
- locked_out: "Sie werden abgemeldet und von Ihrem Account ausgesperrt."
- make_diaspora_better: "Wir möchten, dass Sie uns dabei helfen diaspora* zu verbessern, anstatt uns zu verlassen. Falls Sie uns dennoch verlassen möchten, wollen wir Sie auf dem Laufenden halten."
+ if_you_want_this: "Wenn Sie wirklich möchten, dass das passiert, geben Sie Ihr Kennwort ein und klicken Sie auf 'Konto schließen'"
+ lock_username: "Ihr Benutzername wird gesperrt werden. Sie werden auf diesem Pod kein neues Konto mit derselben ID erstellen können."
+ locked_out: "Sie werden abgemeldet und von Ihrem Account ausgesperrt, bis es gelöscht wurde."
+ make_diaspora_better: "Wir würden uns freuen, wenn Sie bleiben und uns helfen, diaspora* besser zu machen, anstatt uns zu verlassen. Wenn Sie uns jedoch wirklich verlassen möchten, wird folgendes passieren:"
mr_wiggles: "Mr. Wiggles wird traurig sein, wenn Sie gehen"
- no_turning_back: "Momentan gibt es kein Zurück."
- what_we_delete: "Wir löschen alle Ihre Beiträge und Ihr Profil so schnell wie möglich. Ihre Kommentare bleiben hier, werden jedoch mit einem diaspora*-Handle verbunden."
+ no_turning_back: "Momentan gibt es kein Zurück. Wenn Sie sich wirklich sicher sind, geben Sie Ihr Passwort unten ein."
+ what_we_delete: "Wir löschen alle Ihre Beiträge und Ihr Profil so schnell wie möglich. Ihre Kommentare auf Beiträge anderer Leute werden noch angezeigt, aber Sie werden mit Ihrer diaspora*-ID anstatt mit Ihrem Namen verknüpft."
close_account_text: "Konto schließen"
- comment_on_post: "… jemand Ihren Beitrag kommentiert?"
+ comment_on_post: "jemand Ihren Beitrag kommentiert"
current_password: "Derzeitiges Kennwort"
current_password_expl: "das mit dem Sie sich anmelden..."
+ download_export: "Mein Profil herunterladen"
+ download_export_photos: "Meine Fotos herunterladen"
download_photos: "Meine Fotos herunterladen"
- download_xml: "Daten herunterladen (XML)"
edit_account: "Konto bearbeiten"
email_awaiting_confirmation: "Wir haben Ihnen einen Aktivierungslink zu %{unconfirmed_email} geschickt. Solange Sie dem Link nicht gefolgt sind und die neue Adresse aktiviert haben, werden wir weiterhin Ihre ursprüngliche E-Mail-Adresse %{email} verwenden."
export_data: "Daten exportieren"
- following: "Folgen-Einstellungen"
+ export_in_progress: "Vorbereitung Ihrer Daten läuft - schauen Sie etwas später noch mal vorbei."
+ export_photos_in_progress: "Ihre Fotos werden derzeit verarbeitet. Bitte sehen Sie in wenigen Augenblicken erneut nach."
+ following: "Teilen-Einstellungen"
getting_started: "Einstellungen für neue Nutzer"
- liked: "… wenn jemandem Ihr Beitrag gefällt?"
- mentioned: "… Sie in einem Beitrag erwähnt werden?"
+ last_exported_at: "(Zuletzt aktualisiert um %{timestamp})"
+ liked: "wenn jemandem Ihr Beitrag gefällt"
+ mentioned: "Sie in einem Beitrag erwähnt werden"
new_password: "Neues Kennwort"
- photo_export_unavailable: "Das Exportieren von Fotos ist derzeit nicht verfügbar"
- private_message: "… Sie eine private Nachricht erhalten?"
- receive_email_notifications: "E-Mail-Benachrichtigungen empfangen, wenn …"
- reshared: "… jemand Ihren Beitrag weitersagt?"
- show_community_spotlight: "Gemeinschafts-Schaukasten im Stream anzeigen?"
- show_getting_started: "Einstieg reaktivieren"
+ private_message: "Sie eine private Nachricht erhalten"
+ receive_email_notifications: "E-Mail-Benachrichtigungen empfangen, wenn:"
+ request_export: "Meine Profildaten anfordern"
+ request_export_photos: "Meine Fotos anfragen"
+ request_export_photos_update: "Meine Fotos aktualisieren"
+ request_export_update: "Meine Profildaten aktualisieren"
+ reshared: "jemand Ihren Beitrag weitersagt"
+ show_community_spotlight: "Gemeinschafts-Schaukasten im Stream anzeigen"
+ show_getting_started: "Einstiegshinweise anzeigen"
someone_reported: "jemand hat eine Meldung gesendet"
- started_sharing: "… jemand mit Ihnen zu teilen anfängt?"
+ started_sharing: "jemand mit Ihnen zu teilen anfängt"
stream_preferences: "Stream-Einstellungen"
your_email: "Ihre E-Mail-Adresse"
your_handle: "Ihre diaspora* ID"
@@ -1313,7 +1374,9 @@ de_formal:
who_are_you: "Wer sind Sie?"
privacy_settings:
ignored_users: "Ignorierte Benutzer"
+ no_user_ignored_message: "Sie ignorieren momentan keinen anderen Benutzer"
stop_ignoring: "Ignorieren beenden"
+ strip_exif: "Entferne Metadaten z.B. Ort, Autor und Kameramodell von hochgeladenen Bildern (empfohlen)"
title: "Privatsphären-Einstellungen"
public:
does_not_exist: "Benutzer %{username} existiert nicht!"
diff --git a/config/locales/diaspora/el.yml b/config/locales/diaspora/el.yml
index 5c5dc026e..dca363908 100644
--- a/config/locales/diaspora/el.yml
+++ b/config/locales/diaspora/el.yml
@@ -31,7 +31,7 @@ el:
reshare:
attributes:
root_guid:
- taken: "Έχετε ήδη κοινοποιήσει αυτή την ανάρτηση!"
+ taken: "Έχεις ήδη κοινοποιήσει αυτή την ανάρτηση!"
user:
attributes:
email:
@@ -46,10 +46,11 @@ el:
correlations: "Συσχετίσεις"
pages: "Σελίδες"
pod_stats: "Στατιστικά του Pod"
+ sidekiq_monitor: "Sidekiq monitor"
user_search: "Αναζήτηση χρηστών"
- weekly_user_stats: "Εβδομαδιαία στατιστηκά χρηστών"
+ weekly_user_stats: "Εβδομαδιαία στατιστικά χρηστών"
correlations:
- correlations_count: "Συσχετίσεις με Είσοδος:"
+ correlations_count: "Συσχετίσεις με αριθμό συνδέσεων:"
stats:
2weeks: "2 εβδομάδων"
50_most: "Οι 50 πιο Δημοφιλείς Ετικέτες"
@@ -77,40 +78,48 @@ el:
other: "%{count} χρήστες"
zero: "%{count} χρήστες"
week: "Εβδομάδας"
+ user_entry:
+ ? "no"
+ : όχι
+ nsfw: "#nsfw"
+ ? "yes"
+ : ναί
user_search:
add_invites: "προσθήκη προσκλήσεων"
- email_to: "Ηλεκτρονικό ταχυδρομείο για Πρόσκληση"
+ email_to: "Email για Πρόσκληση"
+ under_13: "Προβολή χρηστών που είναι κάτω των 13"
users:
one: "%{count} χρήστης βρέθηκε"
other: "%{count} χρήστες βρέθηκαν"
zero: "%{count} χρήστες βρέθηκαν"
- you_currently: "αυτήν την στιγμή σας έχουν μείνει %{user_invitation} προσκλήσεις %{link}"
+ you_currently:
+ one: "σου έχει απομείνει μία πρόσκληση %{link}"
+ other: "σου έχουν απομείνει %{count} προσκλήσεις %{link}"
+ zero: "δεν σου έχει απομείνει καμία πρόσκληση %{link}"
weekly_user_stats:
amount_of:
- one: "πλήθος νέων χρηστών αυτήν την βδομάδα: %{count}"
- other: "πλήθος νέων χρηστών αυτήν την βδομάδα: %{count}"
- zero: "πλήθος νέων χρηστών αυτήν την βδομάδα: κανείς"
+ one: "Σύνολο νέων χρηστών αυτήν την βδομάδα: %{count}"
+ other: "Σύνολο νέων χρηστών αυτήν την βδομάδα: %{count}"
+ zero: "Σύνολο νέων χρηστών αυτήν την βδομάδα: κανείς"
current_server: "Η ημερομηνία στον server είναι %{date}"
- ago: "%{time} πριν"
+ ago: "πριν από %{time}"
all_aspects: "Όλες οι πτυχές"
application:
helper:
unknown_person: "άγνωστο άτομο"
video_title:
unknown: "Άγνωστος τίτλος video"
- are_you_sure: "Είστε σίγουροι;"
- are_you_sure_delete_account: "Σίγουρα θέλετε να κλείσετε τον λογαριασμό σας; Αυτό δεν μπορεί να αναιρεθεί!"
+ are_you_sure: "Είσαι σίγουρος;"
+ are_you_sure_delete_account: "Θέλεις σίγουρα να κλείσεις τον λογαριασμό σου; Αυτό δεν μπορεί να αναιρεθεί!"
aspect_memberships:
destroy:
failure: "Αποτυχία στην αφαίρεση προσώπου από την πτυχή"
no_membership: "Δεν βρέθηκε το επιλεγμένο άτομο σε αυτή την πτυχή"
- success: "Αφαιρέθει επιτυχώς το πρόσωπο από την πτυχή"
+ success: "Αφαιρέθηκε επιτυχώς το πρόσωπο από την πτυχή"
aspects:
add_to_aspect:
failure: "Αποτυχία προσθήκης επαφής στην πτυχή."
success: "Επιτυχής προσθήκη επαφής στην πτυχή."
- aspect_contacts:
- done_editing: "ολοκλήρωση επεξεργασίας"
aspect_listings:
add_an_aspect: "+ Προσθέστε μια πτυχή"
deselect_all: "Αποεπιλογή όλων"
@@ -118,85 +127,77 @@ el:
select_all: "Επιλογή όλων"
aspect_stream:
make_something: "Κάνε κάτι"
- stay_updated: "Μείνετε ενημερωμένοι"
- stay_updated_explanation: "Η κεντρική σας ροή απαρτίζεται από όλες τις επαφές σας, ετικέτες που ακολουθείτε, και αναρτήσεις από μερικά ενεργά μέλη της κοινότητας."
+ stay_updated: "Μείνε ενημερωμένος"
+ stay_updated_explanation: "Η κεντρική σου ροή απαρτίζεται από όλες τις επαφές σου, ετικέτες που ακολουθείς, και αναρτήσεις από μερικά ενεργά μέλη της κοινότητας."
contacts_not_visible: "Οι επαφές σ' αυτήν την πτυχή δεν θα μπορούν να δουν ο ένας τον άλλον."
contacts_visible: "Οι επαφές σ' αυτήν την πτυχή θα μπορούν να δουν ο ένας τον άλλον."
create:
failure: "Η δημιουργία της πτυχής απέτυχε."
- success: "Η νέα σας πτυχή %{name} δημιουργήθηκε"
+ success: "Η νέα σου πτυχή %{name} δημιουργήθηκε"
destroy:
failure: "Το %{name} δεν είναι άδειο και δεν μπορεί να αφαιρεθεί."
success: "Ο/Η %{name} αφαιρέθηκε επιτυχώς."
edit:
- add_existing: "Προσθέστε μια υπάρχουσα επαφή"
- aspect_list_is_not_visible: "η λίστα σας είναι κρυφή στους άλλους στην πτυχή"
- aspect_list_is_visible: "η λίστα σας είναι ορατή στους άλλους στην πτυχή"
- confirm_remove_aspect: "Είστε σίγουροι πως θέλετε να διαγράψετε αυτή την πτυχή;"
- done: "Ολοκληρώθηκε"
- make_aspect_list_visible: "θέλετε οι επαφές αυτής της πτυχής να είναι ορατές μεταξύ τους;"
+ aspect_chat_is_enabled: "Οι επαφές σε αυτήν την πτυχή μπορούν να συνομιλήσουν μαζί σου."
+ aspect_chat_is_not_enabled: "Οι επαφές σε αυτήν την πτυχή δεν μπορούν να συνομιλήσουν μαζί σου."
+ aspect_list_is_not_visible: "η λίστα σου είναι κρυφή στους άλλους στην πτυχή"
+ aspect_list_is_visible: "η λίστα σου είναι ορατή στους άλλους στην πτυχή"
+ confirm_remove_aspect: "Θέλεις σίγουρα να διαγράψεις αυτή την πτυχή;"
+ grant_contacts_chat_privilege: "Θες να δώσεις δικαίωμα συνομιλίας στις επαφές αυτής της πτυχής;"
+ make_aspect_list_visible: "θέλεις οι επαφές αυτής της πτυχής να είναι ορατές μεταξύ τους;"
remove_aspect: "Διαγραφή αυτής της πτυχής"
rename: "μετονομασία"
+ set_visibility: "Ορισμός ορατότητας"
update: "ενημέρωση"
updating: "ενημέρωση"
- few: "%{count} πτυχές"
- helper:
- are_you_sure: "Είστε σίγουροι πως θέλετε να διαγράψετε αυτή την πτυχή;"
- aspect_not_empty: "Η πτυχή δεν είναι άδεια"
- remove: "αφαίρεση"
index:
diaspora_id:
- content_1: "Το Diaspora αναγνωριστικό σας (ID) είναι:"
- content_2: "Δώστε το σε κάποιον και θα μπορεί να σας βρει στο Diaspora."
- heading: "Αναγνωριστικό Diaspora (ID)"
- donate: "Κάντε Δωρεά"
- handle_explanation: "Αυτό είναι το αναγνωριστικό σας στο Diaspora (ID). Όπως και με μια διεύθυνση ηλεκτρονικού ταχυδρομείου, μπορείτε να το δώσετε σε άλλους για να σας βρουν."
+ content_1: "Το diaspora* αναγνωριστικό σου (ID) είναι:"
+ content_2: "Δώσε το σε κάποιον και θα μπορεί να σε βρει στο diaspora*."
+ heading: "Αναγνωριστικό diaspora* (ID)"
+ donate: "Κάνε μια Δωρεά"
+ handle_explanation: "Αυτό είναι το αναγνωριστικό σου στο diaspora* (ID). Όπως και με μια διεύθυνση email, μπορείς να το δώσεις σε άλλους για να σε βρουν."
help:
any_problem: "Υπάρχει πρόβλημα;"
- contact_podmin: "Επικοινωνήστε με τον διαχειριστή του pod!"
+ contact_podmin: "Επικοινώνησε με τον διαχειριστή του pod!"
do_you: "Μήπως.."
- email_feedback: "Αν θέλετε, μπορείτε να στείλετε τα σχόλιά σας με %{link}."
- email_link: "ηλεκτρονικό ταχυδρομείο"
- feature_suggestion: "... έχετε να προτείνετε μία δυνατότητα %{link} ;"
- find_a_bug: "... βρήκατε ένα σφάλμα %{link} ;"
- have_a_question: "... έχετε μία ερώτηση %{link} ;"
- here_to_help: "Η κοινότητα του Diaspora είναι εδώ για να σας βοηθήσει!"
- mail_podmin: "Ηλ. διεύθυνση Διαχειριστή"
- need_help: "Χρειάζεστε βοήθεια;"
+ email_feedback: "Αν θέλεις, μπορείς να στείλεις τα σχόλιά σου με %{link}."
+ email_link: "Email"
+ feature_suggestion: "... έχεις να προτείνεις ένα χαρακτηριστικό %{link} ;"
+ find_a_bug: "... βρήκες ένα σφάλμα %{link} ;"
+ have_a_question: "... έχεις μία ερώτηση %{link} ;"
+ here_to_help: "Η κοινότητα του diaspora* είναι εδώ για να σε βοηθήσει!"
+ mail_podmin: "Email Διαχειριστή"
+ need_help: "Χρειάζεσαι βοήθεια;"
tag_bug: "bug"
tag_feature: "feature"
tag_question: "question"
tutorial_link_text: "Οδηγοί"
- tutorials_and_wiki: "%{tutorial} και %{wiki} : Βοήθεια για τα πρώτα σας βήματα"
- introduce_yourself: "Αυτή είναι η Ροή σας. Μπείτε και συστηθείτε."
- keep_diaspora_running: "Κρατήστε το Diaspora σε γρήγορη ανάπτυξη με μηνιαία δωρεά!"
- keep_pod_running: "Διατηρείστε τη καλή λειτουργία του %{pod}, παρέχοντας στους servers μας τη μηνιαία δωρεά σας!"
+ tutorials_and_wiki: "%{faq}, %{tutorial} και %{wiki} : Βοήθεια για τα πρώτα σας βήματα."
+ introduce_yourself: "Αυτή είναι η Ροή σου. Μπες και συστήσου."
+ keep_diaspora_running: "Κράτησε την ανάπτυξη του diaspora* σε γρήγορους ρυθμούς με μια μηνιαία δωρεά!"
+ keep_pod_running: "Βοήθησε στην ομαλή λειτουργία του %{pod}, προσφέροντας ένα κέρασμα στους διαχειριστές των servers μας!"
new_here:
- follow: "Ακολουθήστε την ετικέτα %{link} και καλωσορίστε νέους χρήστες στο Diaspora*!"
- learn_more: "Μάθετε περισσότερα"
- title: "Καλωσορίστε Νέους Χρήστες"
+ follow: "Ακολούθησε την ετικέτα %{link} και καλωσόρισε νέους χρήστες στο diaspora*!"
+ learn_more: "Μάθε περισσότερα"
+ title: "Καλωσόρισε Νέους Χρήστες"
no_contacts: "Καμία επαφή"
- no_tags: "+ Βρείτε μια ετικέτα να ακολουθείτε"
- people_sharing_with_you: "Άτομα που μοιράζονται μαζί σας"
- post_a_message: "αναρτήστε ένα μήνυμα >>"
+ no_tags: "+ Βρες μια ετικέτα να ακολουθήσεις"
+ people_sharing_with_you: "Άτομα που μοιράζονται μαζί σου"
+ post_a_message: "ανάρτησε ένα μήνυμα >>"
services:
- content: "Μπορείτε να συνδέσετε τις παρακάτω υπηρεσίες στο Diaspora:"
- heading: "Συνδέστε Υπηρεσίες"
- unfollow_tag: "Σταματήστε να ακολουθείτε την ετικέτα #%{tag}"
- welcome_to_diaspora: "Καλωσήρθες στο Diaspora, %{name}!"
- many: "%{count} πτυχές"
- move_contact:
- error: "Σφάλμα μεταφοράς επαφής: %{inspect}"
- failure: "δεν λειτούργησε %{inspect}"
- success: "Το άτομο μετακινήθηκε σε νέα πτυχή"
+ content: "Μπορείς να συνδέσεις τις παρακάτω υπηρεσίες στο diaspora*:"
+ heading: "Σύνδεσε Υπηρεσίες"
+ unfollow_tag: "Σταμάτα να ακολουθείς την ετικέτα #%{tag}"
+ welcome_to_diaspora: "Καλωσήρθες στο diaspora*, %{name}!"
new:
create: "Δημιουργία"
- name: "Όνομα (εμφανίζετε μόνο σε εσάς)"
+ name: "Όνομα (εμφανίζετε μόνο σε σένα)"
no_contacts_message:
community_spotlight: "δημοσιεύσεις κοινότητας"
- or_spotlight: "Ή μπορείτε να το μοιραστείτε με %{link}"
- try_adding_some_more_contacts: "Μπορείτε να ψάξετε ή να προσκαλέσετε περισσότερες επαφές."
- you_should_add_some_more_contacts: "Πρέπει να προσθέσετε περισσότερες επαφές!"
+ or_spotlight: "Ή μπορείς να το μοιραστείς με %{link}"
+ try_adding_some_more_contacts: "Μπορείς να ψάξεις ή να προσκαλέσεις περισσότερες επαφές."
+ you_should_add_some_more_contacts: "Πρέπει να προσθέσεις περισσότερες επαφές!"
no_posts_message:
start_talking: "Κανένας δεν έχει δημοσιεύσει κάτι ακόμα!"
one: "1 πτυχή"
@@ -206,81 +207,61 @@ el:
family: "Οικογένεια"
friends: "Φίλοι"
work: "Εργασία"
- selected_contacts:
- manage_your_aspects: "Διαχείριση των πτυχών."
- no_contacts: "Δεν έχετε ακόμα κάποια επαφή εδώ."
- view_all_community_spotlight: "Εμφάνιση όλων των δημοσιεύσεων κοινότητας"
- view_all_contacts: "Προβολή όλων των επαφών"
- show:
- edit_aspect: "επεξεργασία πτυχής"
- two: "%{count} πτυχές"
update:
- failure: "Η πτυχή σας, %{name}, έχει πολύ μεγάλο όνομα για να αποθηκευτεί."
- success: "Έγινε επιτυχώς η επεξεργασία της πτυχής σας, %{name}."
+ failure: "Η πτυχή σου, %{name}, έχει πολύ μεγάλο όνομα για να αποθηκευτεί."
+ success: "Έγινε επιτυχώς η επεξεργασία της πτυχής σου, %{name}."
zero: "καμία πτυχή"
back: "Πίσω"
blocks:
create:
failure: "Δεν μπόρεσα να αγνοήσω αυτόν τον χρήστη. #evasion"
- success: "Εντάξει, δεν θα ξαναδείτε αυτό το χρήστη στη ροή σας. #σίγαση!"
+ success: "Εντάξει, δεν θα ξαναδείς αυτό το χρήστη στη ροή σας. #σίγαση!"
destroy:
failure: "Δεν μπόρεσα να σταματήσω να αγνοώ αυτό το χρήστη. #evasion"
success: "Για να δούμε τι έχουν να πουν! #sayhello"
bookmarklet:
- explanation: "Αναρτήστε στο Diaspora από οπουδήποτε, σύρετε αυτό τον σύνδεσμο στα αγαπημένα => %{link}."
+ explanation: "ανάρτησε στο diaspora* από οπουδήποτε, σύρε αυτό τον σύνδεσμο στα αγαπημένα => %{link}."
heading: "Εφαρμογή σελιδοδείκτη"
- post_something: "Αναρτήστε στο Diaspora"
+ post_something: "Ανάρτησε στο diaspora*"
post_success: "Αναρτήθηκε! Κλείνει!"
cancel: "Ακύρωση"
comments:
- few: "%{count} σχόλια"
- many: "%{count} σχόλια"
new_comment:
- comment: "Σχολιάστε"
+ comment: "Σχολίασε"
commenting: "Σχολιάζει..."
one: "1 σχόλιο"
other: "%{count} σχόλια"
- two: "%{count} σχόλια"
zero: "κανένα σχόλιο"
contacts:
create:
failure: "Αποτυχία δημιουργίας επαφής"
- few: "%{count} επαφές"
index:
- add_a_new_aspect: "Προσθέστε μια νέα πτυχή"
- add_to_aspect: "Προσθέστε επαφές στο %{name}"
- add_to_aspect_link: "Προσθέστε επαφές στο %{name}"
+ add_a_new_aspect: "Πρόσθεσε μια νέα πτυχή"
+ add_to_aspect: "Πρόσθεσε επαφές στο %{name}"
all_contacts: "Όλες οι Επαφές"
community_spotlight: "Αναρτήσεις κοινότητας"
- many_people_are_you_sure: "Είστε σίγουροι ότι θέλετε να ξεκινήσετε μια ιδιωτική συνομιλία με περισσότερες από %{suggested_limit} επαφές; Η δημοσίευση σε αυτή την πτυχή ίσως είναι ένας καλύτερος τρόπος για να επικοινωνήσετε μαζί τους."
my_contacts: "Οι Επαφές μου"
- no_contacts: "Φαίνεται πως χρειάζεται να προσθέσετε μερικές επαφές! "
+ no_contacts: "Φαίνεται πως χρειάζεται να προσθέσεις μερικές επαφές!"
no_contacts_message: "Δες και %{community_spotlight}"
- no_contacts_message_with_aspect: "Δες και %{community_spotlight} ή %{add_to_aspect_link}"
only_sharing_with_me: "Μοιράζονται μόνο με εμένα"
- remove_person_from_aspect: "Μετακίνηση του χρήστη %{person_name} από την πτυχή \"%{aspect_name}\""
- start_a_conversation: "Ξεκινήστε μια συζήτηση"
+ start_a_conversation: "Ξεκίνα μια συζήτηση"
title: "Επαφές"
- your_contacts: "Οι Επαφές σας"
- many: "%{count} επαφές"
+ your_contacts: "Οι Επαφές σου"
one: "1 επαφή"
other: "%{count} επαφές"
sharing:
- people_sharing: "Άτομα που διαμοιράζονται μαζί σας: "
+ people_sharing: "Άτομα που μοιράζονται μαζί σου:"
spotlight:
community_spotlight: "Δημοσιεύσεις Κοινότητας"
- suggest_member: "Προτείνετε ένα μέλος"
- two: "%{count} επαφές"
+ suggest_member: "Πρότεινε ένα μέλος"
zero: "επαφές"
conversations:
conversation:
participants: "Συμμετέχοντες"
create:
fail: "Μη έγκυρο μήνυμα"
- no_contact: "Ε, πρέπει πρώτα να προσθέσετε μια επαφή!"
+ no_contact: "Πρέπει πρώτα να προσθέσεις μια επαφή!"
sent: "Μήνυμα εστάλη"
- destroy:
- success: "Η συζήτηση αφαιρέθηκε επιτυχώς"
helper:
new_messages:
few: "%{count} νέα μηνύματα"
@@ -312,12 +293,12 @@ el:
email: "Email"
error_messages:
helper:
- correct_the_following_errors_and_try_again: "Διορθώστε τα ακόλουθα σφάλματα και προσπαθήστε ξανά."
+ correct_the_following_errors_and_try_again: "Διόρθωσε τα ακόλουθα σφάλματα και προσπάθησε ξανά."
invalid_fields: "Άκυρα Πεδία"
- login_try_again: "Παρακαλώ <a href='%{login_link}'>συνδεθείτε</a> και ξαναπροσπαθήστε."
- post_not_public: "Η ανάρτηση που προσπαθείτε να δείτε δεν είναι δημόσια!"
+ login_try_again: "Παρακαλώ <a href='%{login_link}'>συνδέσου</a> και ξαναπροσπάθησε."
+ post_not_public: "Η ανάρτηση που προσπαθείς να δεις δεν είναι δημόσια!"
fill_me_out: "Ενημέρωσε με"
- find_people: "Βρείτε άτομα ή #ετικέτες"
+ find_people: "Βρες άτομα ή #ετικέτες"
help:
account_and_data_management:
close_account_a: "Πηγαίνετε στο κάτω μέρος στη σελίδα των ρυθμίσεων και πατήστε το κουμπί \"Κλείσιμο Λογαριασμού\"."
@@ -327,24 +308,47 @@ el:
data_visible_to_podmin_q: "Πόσες από τις πληροφορίες μου μπορεί να δει ο διαχειριστής του εξυπηρετητή μου (pod);"
download_data_a: "Ναι. Στο κάτω μέρος της καρτέλας \"Λογαριασμός\", στην σελίδα των ρυθμίσεων, υπάρχουν δύο κουμπιά για το κατέβασμα των δεδομένων σας."
download_data_q: "Μπορώ να κατεβάσω ένα αντίγραφο όλων των δεδομένων μου που συμπεριλαμβάνονται στον λογαριασμό μου;"
- move_pods_a: "Στο μέλλον θα είναι δυνατόν να εξάγετε τις πληροφορίες του λογαριασμού σας από έναν εξυπηρετητή (pod) και να τις εισάγετε σε έναν άλλον, αλλά αυτό προς το παρόν δεν είναι δυνατό. Θα μπορούσατε να ανοίξετε έναν καινούριο λογαριασμό και να προσθέσετε τις επαφές σας στις πτυχές αυτού κι ύστερα να ζητήσετε από τις επαφές σας να σας προσθέσουν κι αυτοί στις δικές τους πτυχές."
+ move_pods_a: "Στο μέλλον θα είναι δυνατόν να εξάγεις τις πληροφορίες του λογαριασμού σου από έναν εξυπηρετητή (pod) και να τις εισάγεις σε έναν άλλον, αλλά αυτό προς το παρόν δεν είναι δυνατό. Θα μπορούσες να ανοίξεις έναν καινούριο λογαριασμό και να προσθέσεις τις επαφές σου στις πτυχές αυτού κι ύστερα να ζητήσεις από τις επαφές σου να σε προσθέσουν κι αυτοί στις δικές τους πτυχές."
move_pods_q: "Πώς μεταφέρω τον λογαριασμό μου από έναν εξυπηρετητή (pod) σε άλλον;"
title: "Διαχείριση Λογαριασμού και Δεδομένων"
+ aspects:
+ delete_aspect_q: "Πώς μπορώ να διαγράψω μια πτυχή;"
+ person_multiple_aspects_q: "Μπορώ να προσθέσω ένα άτομο σε πολλαπλές πτυχές;"
+ post_multiple_aspects_q: "Μπορώ να αναρτήσω περιεχόμενο σε πολλαπλές πτυχές ταυτόχρονα;"
+ remove_notification_a: "Όχι."
+ rename_aspect_q: "Μπορώ να μετονομάσω μια πτυχή;"
+ title: "Πτυχές"
+ what_is_an_aspect_q: "Τι είναι πτυχή;"
getting_help:
- get_support_a_hashtag: "ρωτήστε σε μια δημόσια δημοσίευση στο diaspora* χρησιμοποιώντας την ετικέτα της ερώτησης ( %{question} )"
- get_support_a_irc: "Συμμετέχετε στο %{irc} μας (ζωντανή συζήτηση)"
- get_support_a_tutorials: "Δείτε τα %{tutorials} μας"
- get_support_a_website: "Επισκεφθείτε τη σελίδα μας %{link}"
+ get_support_a_hashtag: "ρώτησε σε μια δημόσια δημοσίευση στο diaspora* χρησιμοποιώντας την ετικέτα της ερώτησης ( %{question} )"
+ get_support_a_irc: "βρες μας στο %{irc} (ζωντανή συζήτηση)"
+ get_support_a_tutorials: "Δείτε τα %{tutorials} μας"
+ get_support_a_website: "Επισκέψου τη %{link} μας"
get_support_a_wiki: "Αναζήτηση για %{link}"
get_support_q: "Τι γίνεται εάν η ερώτηση μου δεν έχει απαντηθεί στις Συχνές Ερωτήσεις (FAQ); Πού αλλού μπορώ να βρω υποστήριξη;"
getting_started_a: "Είσαστε τυχερός/ή. Δοκιμάστε το %{tutorial_series} στην σελίδα με τα έργα μας. Θα σας δείξει βήμα - βήμα την διαδικασία εγγραφής και θα σας μάθει όλα τα βασικά πράγματα που χρειάζεται να ξέρετε σχετικά με το diaspora*."
getting_started_q: "Βοήθεια! Χρειάζομαι βοήθεια με τα βασικά για να ξεκινήσω!"
+ title: "Λήψη βοήθειας"
here: "εδώ"
irc: "Κανάλι συζήτησης IRC"
+ markdown: "Markdown"
+ miscellaneous:
+ diaspora_app_q: "Υπαρχη εφαρμογή diaspora* για Android ή iOS;"
+ pods:
+ use_search_box_q: "Πώς μπορώ να χρησιμοποιήσω το πλαίσιο αναζήτησης για να βρω συγκεκριμένα άτομα;"
+ posts_and_posting:
+ image_text: "κείμενο εικόνας"
+ insert_images_q: "Πώς μπορώ να εισάγω εικόνες στις αναρτήσεις;"
+ private_posts:
+ title: "Ιδιωτικές αναρτήσεις"
+ private_profiles:
+ title: "Ιδιωτικά προφίλ"
+ title_header: "Βοήθεια"
tutorial: "οδηγός"
tutorials: "οδηγοί"
- wiki: "βικιλεξικό (wiki)"
+ wiki: "wiki"
hide: "Απόκρυψη"
+ ignore: "Αγνόησε"
invitation_codes:
excited: "Ο/Η %{name} χαίρεται που σε βλέπει εδώ."
invitations:
@@ -352,49 +356,50 @@ el:
check_token:
not_found: "Το σύμβολο της πρόσκλησης δεν βρέθηκε"
create:
- already_contacts: "Είστε ήδη συνδεδεμένος με αυτό το άτομο"
- already_sent: "Έχετε ήδη προσκαλέσει αυτό το άτομο."
- empty: "Παρακαλώ εισάγετε μία τουλάχιστον διεύθυνση ηλεκτρονικού ταχυδρομείου."
- no_more: "Δεν έχετε άλλες προσκλήσεις."
+ already_contacts: "Είσαι ήδη συνδεδεμένος με αυτό το άτομο"
+ already_sent: "Έχεις ήδη προσκαλέσει αυτό το άτομο."
+ empty: "Παρακαλώ εισήγαγε τουλάχιστον μία διεύθυνση email."
+ no_more: "Δεν έχεις άλλες προσκλήσεις."
note_already_sent: "Προσκλήσεις έχουν ήδη σταλεί στα: %{emails}"
- own_address: "Δεν μπορείτε να στείλετε πρόσκληση στην διεύθυνση σας."
- rejected: "Οι παρακάτω διευθύνσεις ηλεκτρονικού ταχυδρομείου είχαν προβλήματα:"
- sent: "Η προσκλήσεις σας έχουν σταλεί στα: %{emails}"
+ own_address: "Δεν μπορείς να στείλεις πρόσκληση στη διεύθυνση σου."
+ rejected: "Οι παρακάτω διευθύνσεις email είχαν προβλήματα: "
+ sent: "Η προσκλήσεις σου έχουν σταλεί στα: %{emails}"
edit:
- accept_your_invitation: "Αποδεχτείτε την πρόσκληση"
- your_account_awaits: "Ο λογαριασμός σας περιμένει!"
+ accept_your_invitation: "Αποδέξου την πρόσκληση"
+ your_account_awaits: "Ο λογαριασμός σου περιμένει!"
new:
- already_invited: "Τα παρακάτω άτομα δεν αποδέχτηκαν την πρόσκληση σας:"
+ already_invited: "Τα παρακάτω άτομα δεν αποδέχτηκαν την πρόσκληση σου:"
aspect: "Πτυχή"
- check_out_diaspora: "Δοκίμασε το Diaspora!"
+ check_out_diaspora: "Δοκίμασε το diaspora*!"
codes_left:
one: "Μία πρόσκληση απομένει γι' αυτό τον κωδικό"
other: "%{count} προσκλήσεις απομένουν γι' αυτό τον κωδικό"
zero: "Δεν απομένουν προσκλήσεις γι' αυτό τον κωδικό"
- comma_separated_plz: "Μπορείτε να εισάγετε πολλαπλές διευθύνσεις ηλεκτρονικού ταχυδρομείου χωρισμένες με κόμμα."
- if_they_accept_info: "αν δεχτούν, θα προστεθούν στην πτυχή που τους πρασκαλέσατε. "
- invite_someone_to_join: "Προσκαλέστε κάποιον στο Diaspora!"
+ comma_separated_plz: "Μπορείς να εισάγεις πολλαπλές διευθύνσεις email χωρισμένες με κόμμα."
+ if_they_accept_info: "αν δεχτούν, θα προστεθούν στην πτυχή που τους προσκάλεσες."
+ invite_someone_to_join: "Προσκάλεσε κάποιον στο diaspora*!"
language: "Γλώσσα"
- paste_link: "Μοιραστείτε αυτόν τον σύνδεσμο με τους φίλους σας για να τους προσκαλέσετε στο Diaspora, ή στείλτε τον απευθείας με ηλ.ταχυδρομίο."
+ paste_link: "Μοιράσου αυτόν τον σύνδεσμο με τους φίλους σου για να τους προσκαλέσετε στο diaspora*, ή στείλε τον απευθείας με email."
personal_message: "Προσωπικό μήνυμα"
resend: "Αποστολή ξανά"
- send_an_invitation: "Στείλτε μια πρόσκληση"
- send_invitation: "Στείλτε πρόσκληση"
+ send_an_invitation: "Στείλε μια πρόσκληση"
+ send_invitation: "Στείλε πρόσκληση"
sending_invitation: "Αποστολή πρόσκλησης..."
to: "Στον"
layouts:
application:
back_to_top: "Πίσω στην αρχή"
- powered_by: "POWERED BY DIASPORA*"
- public_feed: "Δημόσια ανατροφοδότηση (feed) του Diaspora για τον χρήστη %{name}"
- source_package: "κατεβάστε τον πηγαίο κώδικα του πακέτου"
+ powered_by: "POWERED BY diaspora*"
+ public_feed: "Δημόσια ανατροφοδότηση (feed) του diaspora* για τον χρήστη %{name}"
+ source_package: "κατέβασε τον πηγαίο κώδικα"
toggle: "εναλλαγή σε κινητό"
whats_new: "τι νέα;"
- your_aspects: "οι πτυχές σας"
+ your_aspects: "οι πτυχές σου"
header:
admin: "διαχειριστής"
blog: "Iστολόγιo"
code: "κώδικας"
+ help: "Βοήθεια"
login: "Είσοδος"
logout: "Αποσύνδεση"
profile: "Προφίλ"
@@ -438,9 +443,9 @@ el:
other: "Οι %{actors} σχολίασαν μια διαγραμμένη δημοσίευση. "
zero: "Ο %{actors} σχολίασε μια διαγεγραμμένη δημοσίευση. "
comment_on_post:
- one: "Ο/Η %{actors} σχολίασε τη %{post_link}."
- other: "Οι %{actors} σχολίασαν τη %{post_link}."
- zero: "Ο/Η %{actors} σχολίασε τη %{post_link}."
+ one: "Ο/Η %{actors} σχολίασε στη δημοσίευση σου %{post_link}."
+ other: "Οι %{actors} σχολίασαν στη δημοσίευση σου %{post_link}."
+ zero: "Ο/Η %{actors} σχολίασε στη δημοσίευση σου %{post_link}."
helper:
new_notifications:
few: "%{count} νέες ειδοποιήσεις"
@@ -459,7 +464,7 @@ el:
two: "και %{count} άλλοι"
zero: "και κανένας άλλος"
mark_all_as_read: "Σήμανση όλων ως διαβασμένα"
- mark_unread: "Σήμανε ως μη διαβασμένο"
+ mark_unread: "Σήμανση ως μη διαβασμένο"
notifications: "Ειδοποιήσεις"
liked:
few: "Η %{post_link} άρεσε στους χρήστες %{actors}."
@@ -469,53 +474,50 @@ el:
two: "Στους χρήστες %{actors} άρεσε το %{post_link}."
zero: "Η %{post_link} άρεσε στους χρήστες %{actors}."
liked_post_deleted:
- few: "Η διαγεγραμμένη δημοσίευσή σας άρεσε στους χρήστες %{actors}."
- many: "Η διαγραμμένη ανάρτησή σας άρεσε στους χρήστες %{actors}."
- one: "Η διαγεγραμμένη δημοσίευσή σας άρεσε στον χρήστη %{actors}."
- other: "Η διαγεγραμμένη δημοσίευσή σας άρεσε στον χρήστη %{actors}."
- two: "Στους χρήστες %{actors} άρεσε η διαγραμμένη ανάρτησή σας."
- zero: "Η διαγεγραμμένη δημοσίευσή σας άρεσε στον χρήστη %{actors}."
+ one: "Η διαγεγραμμένη δημοσίευσή σου άρεσε στον χρήστη %{actors}."
+ other: "Η διαγεγραμμένη δημοσίευσή σου άρεσε στον χρήστη %{actors}."
+ zero: "Η διαγεγραμμένη δημοσίευσή σου άρεσε στον χρήστη %{actors}."
mentioned:
- one: "Ο/Η %{actors} σας ανέφερε στη %{post_link}."
- other: "Οι %{actors} σας ανέφεραν σε μια %{post_link}."
- zero: "Οι %{actors} σας ανέφερε σε μια %{post_link}."
+ one: "Ο/Η %{actors} σε ανέφερε στη %{post_link}."
+ other: "Οι %{actors} σε ανέφεραν σε μια %{post_link}."
+ zero: "Οι %{actors} σε ανέφερε σε μια %{post_link}."
mentioned_deleted:
- one: "Ο/Η %{actors} σας ανέφερε σε μια διαγραμμένη δημοσίευση."
- other: "Οι %{actors} σας ανέφεραν σε μια διαγραμμένη δημοσίευση."
- zero: "Ο/Η %{actors} σας ανέφερε σε μια διαγραμμένη δημοσίευση."
+ one: "Ο/Η %{actors} σου ανέφερε σε μια διαγραμμένη δημοσίευση."
+ other: "Οι %{actors} σου ανέφεραν σε μια διαγραμμένη δημοσίευση."
+ zero: "Ο/Η %{actors} σου ανέφερε σε μια διαγραμμένη δημοσίευση."
post: "ανάρτηση"
private_message:
- one: "Ο/Η %{actors} σας έστειλε ένα μήνυμα."
- other: "Οι %{actors} σας έστειλαν ένα μήνυμα."
- zero: "Ο/Η χρήστης %{actors} σας έστειλε ένα μήνυμα."
+ one: "Ο/Η %{actors} σου έστειλε ένα μήνυμα."
+ other: "Οι %{actors} σου έστειλαν ένα μήνυμα."
+ zero: "Ο/Η χρήστης %{actors} σου έστειλε ένα μήνυμα."
reshared:
one: "Ο/Η %{actors} μοιράστηκε τη %{post_link}."
other: "Οι %{actors} μοιράστηκαν τη %{post_link}."
zero: "Οι %{actors} μοιράστηκαν τη %{post_link}."
reshared_post_deleted:
- one: "Ο/Η %{actors} κοινοποίησε τη διαγραμμένη ανάρτησή σας. "
- other: "Οι %{actors} κοινοποίησαν διαγραμμένη ανάρτησή σας. "
- zero: "Ο/Η %{actors} κοινοποίησε τη διαγραμμένη ανάρτησή σας."
+ one: "Ο/Η %{actors} κοινοποίησε τη διαγραμμένη ανάρτησή σου."
+ other: "Οι %{actors} κοινοποίησαν διαγραμμένη ανάρτησή σου."
+ zero: "Ο/Η %{actors} κοινοποίησε τη διαγραμμένη ανάρτησή σου."
started_sharing:
- one: "Ο/Η %{actors} άρχισε να μοιράζεται μαζί σας."
- other: "Οι %{actors} άρχισαν να μοιράζονται μαζί σας."
- zero: "Ο/Η %{actors} άρχισε να μοιράζεται μαζί σας."
+ one: "Ο/Η %{actors} άρχισε να μοιράζεται μαζί σου."
+ other: "Οι %{actors} άρχισαν να μοιράζονται μαζί σου."
+ zero: "Ο/Η %{actors} άρχισε να μοιράζεται μαζί σου."
notifier:
a_post_you_shared: "μια δημοσίευση."
- accept_invite: "Αποδέξου την πρόσκληση στο Diaspora*!"
- click_here: "πατήστε εδώ"
+ accept_invite: "Αποδέξου την πρόσκληση στο diaspora*!"
+ click_here: "πάτησε εδώ"
comment_on_post:
- reply: "Απαντήστε ή δείτε την ανάρτηση του χρήστη %{name} >"
+ reply: "Απάντησε ή δες την ανάρτηση του χρήστη %{name} >"
confirm_email:
- click_link: "Για να ενεργοποιήσετε την καινούρια διεύθυνση ηλεκτρονικού ταχυδρομείου %{unconfirmed_email}, παρακαλούμε πατήστε στο παρακάτω σύνδεσμο: "
- subject: "Παρακαλούμε ενεργοποιήστε την καινούρια διεύθυνση ηλεκτρονικού ταχυδρομείου %{unconfirmed_email}"
- email_sent_by_diaspora: "Αυτό το μήνυμα εστάλη από το %{pod_name}. Εάν δεν θέλετε να λαμβάνετε πλέον μηνύματα σαν κι αυτό,"
+ click_link: "Για να ενεργοποιήσεις την καινούρια διεύθυνση email %{unconfirmed_email}, παρακαλούμε πάτησε στο παρακάτω σύνδεσμο:"
+ subject: "Παρακαλούμε ενεργοποίησε την καινούρια email διεύθυνση %{unconfirmed_email}"
+ email_sent_by_diaspora: "Αυτό το μήνυμα εστάλη από το %{pod_name}. Εάν δεν θέλεις να λαμβάνεις πλέον μηνύματα σαν κι αυτό,"
hello: "Γειά σου %{name}!"
invite:
message: |-
- Γεια σου!
+ Χαίρετε!
- Έχεις προσκληθεί να συμμετέχεις στο Diapora*
+ Έχεις προσκληθεί να συμμετέχεις στο diaspora*
Κάνε κλικ στο σύνδεσμο για να ξεκινήσεις
@@ -524,30 +526,30 @@ el:
Με Αγάπη,
- Το e-mail ρομπότ του Diaspora*!
+ Το e-mail ρομπότ του diaspora*!
[1]: %{invite_url}
- invited_you: "O/H %{name} σε προσκάλεσε στο Diaspora*"
+ invited_you: "O/H %{name} σε προσκάλεσε στο diaspora*"
liked:
- liked: "στο χρήστη %{name} αρέσει η δημοσίευση σας"
- view_post: "Δείτε την ανάρτηση >"
+ liked: "στο χρήστη %{name} αρέσει η δημοσίευση σου"
+ view_post: "Δες την ανάρτηση >"
mentioned:
- mentioned: "αναφέρεται σε σας σε μια δημοσίευση:"
- subject: "Ο/Η %{name} σας αναφέρει στο Diaspora*"
+ mentioned: "αναφέρεται σε σένα σε μια δημοσίευση:"
+ subject: "Ο/Η %{name} σε ανέφερε στο diaspora*"
private_message:
- reply_to_or_view: "Απαντήστε ή δείτε τη συζήτηση >"
+ reply_to_or_view: "Απάντησε ή δες τη συζήτηση >"
reshared:
- reshared: "Ο/Η %{name} κοινοποίησε τη δημοσίευση σας"
- view_post: "Δείτε την ανάρτηση >"
+ reshared: "Ο/Η %{name} κοινοποίησε τη δημοσίευση σου"
+ view_post: "Δες την ανάρτηση >"
single_admin:
- admin: "Ο διαχειριστής του Diaspora σας"
- subject: "Μήνυμα για τον Diaspora λογαριασμό σας:"
+ admin: "Ο διαχειριστής του diaspora* σου"
+ subject: "Μήνυμα για τον diaspora* λογαριασμό σου:"
started_sharing:
- sharing: "ξεκίνησε το διαμοιρασμό μαζί σας!"
- subject: "Ο/Η %{name} ξεκίνησε το διαμοιρασμό μαζί σας στο Diaspora*"
- view_profile: "Δείτε το προφίλ του χρήστη %{name}"
+ sharing: "ξεκίνησε να μοιράζεται μαζί σου!"
+ subject: "Ο/Η %{name} ξεκίνησε να μοιράζεται μαζί σου στο diaspora*"
+ view_profile: "Δες το προφίλ του χρήστη %{name}"
thanks: "Ευχαριστώ,"
- to_change_your_notification_settings: "για να αλλάξετε τις ρυθμίσεις των ειδοποιήσεων"
+ to_change_your_notification_settings: "για να αλλάξεις τις ρυθμίσεις των ειδοποιήσεων"
nsfw: "NSFW"
ok: "ΟΚ"
or: "ή"
@@ -560,18 +562,16 @@ el:
add_contact_from_tag: "προσθήκη επαφής από ετικέτα"
aspect_list:
edit_membership: "επεξεργασία ιδιοτήτων πτυχής"
- few: "%{count} άτομα"
helper:
- is_not_sharing: "Ο/Η %{name} δεν διαμοιράζεται μαζί σας"
- is_sharing: "Ο/Η %{name} διαμοιράζεται μαζί σας"
+ is_not_sharing: "Ο/Η %{name} δεν διαμοιράζεται μαζί σου"
+ is_sharing: "Ο/Η %{name} διαμοιράζεται μαζί σου"
results_for: "αποτελέσματα για %{params}"
index:
- looking_for: "Ψάχνετε για αναρτήσεις με την ετικέτα %{tag_link};"
- no_one_found: "...κανένας δεν βρέθηκε. "
- no_results: "Επ! Χρειάζεται να ψάξετε για κάτι."
+ looking_for: "Ψάχνεις για αναρτήσεις με την ετικέτα %{tag_link};"
+ no_one_found: "...κανένας δεν βρέθηκε."
+ no_results: "Επ! Χρειάζεται να ψάξεις για κάτι."
results_for: "αποτελέσματα αναζήτησης για"
- searching: "αναζητηση,παρακαλώ περιμένετε..."
- many: "%{count} άτομα"
+ searching: "αναζήτηση, παρακαλώ περίμενε..."
one: "1 άτομο"
other: "%{count} άτομα"
person:
@@ -580,44 +580,43 @@ el:
pending_request: "Αίτημα σε αναμονή"
thats_you: "Εσύ είσαι αυτός!"
profile_sidebar:
- bio: "βιογραφικό"
- born: "γενέθλια"
+ bio: "Βιογραφικό"
+ born: "Γενέθλια"
edit_my_profile: "Επεξεργασία του προφίλ μου"
- gender: "φύλο"
+ gender: "Φύλο"
in_aspects: "στις πτυχές"
- location: "τοποθεσία"
+ location: "Τοποθεσία"
photos: "Φωτογραφίες"
remove_contact: "διαγραφή επαφής"
remove_from: "Αφαίρεση του χρήστη %{name} από τη πτυχή %{aspect};"
show:
closed_account: "Αυτός ο λογαριασμός έχει κλείσει."
does_not_exist: "Δεν υπάρχει τέτοιο άτομα!"
- has_not_shared_with_you_yet: "Ο/Η %{name} δεν μοιράζεται ακόμα κάποια δημοσίευση μαζί σας!"
- ignoring: "Αγνοείτε όλες τις αναρτήσεις από %{name}."
- incoming_request: "Ο/Η %{name} θέλει να μοιραστεί μαζί σας"
+ has_not_shared_with_you_yet: "Ο/Η %{name} δεν μοιράζεται ακόμα κάποια δημοσίευση μαζί σου!"
+ ignoring: "Αγνοείς όλες τις αναρτήσεις από %{name}."
+ incoming_request: "Ο/Η %{name} θέλει να μοιραστεί μαζί σου"
mention: "Αναφορά"
message: "Μήνυμα"
- not_connected: "Δεν είστε συνδεδεμένος με αυτόν τον χρήστη "
+ not_connected: "Δεν είσαι συνδεδεμένος με αυτόν τον χρήστη"
recent_posts: "Πρόσφατες Αναρτήσεις"
recent_public_posts: "Πρόσφατες Δημόσιες Αναρτήσεις"
- return_to_aspects: "Επιστροφή στη σελίδα με τις πτυχές σας"
+ return_to_aspects: "Επιστροφή στη σελίδα με τις πτυχές σου"
see_all: "Εμφάνιση όλων"
- start_sharing: "ξεκινήσετε την κοινή χρήση"
+ start_sharing: "ξεκίνα να μοιράζεις"
to_accept_or_ignore: "να το αποδεχθεί ή να το αγνοήσει."
sub_header:
- add_some: "προσθέστε κάποιες"
+ add_some: "πρόσθεσε κάποιες"
edit: "επεξεργασία"
you_have_no_tags: "δεν έχετε ετικέτες!"
- two: "%{count} άτομα"
webfinger:
fail: "Λυπούμαστε, δεν ήταν δυνατή η εύρεση του %{handle}."
zero: "κανένα άτομο"
photos:
comment_email_subject: "φωτογραφία του χρήστη %{name}"
create:
- integrity_error: "Η μεταφόρτωση της φωτογραφίας απέτυχε. Είστε σίγουροι ότι ήταν φωτογραφία;"
- runtime_error: "Η μεταφόρτωση της φωτογραφίας απέτυχε. Είστε σίγουροι πως φορέσατε ζώνη ασφαλείας πριν ξεκινήσετε;"
- type_error: "Η μεταφόρτωση της φωτογραφίας απέτυχε. Είστε σίγουροι πως προστέθηκε μια εικόνα;"
+ integrity_error: "Η μεταφόρτωση της φωτογραφίας απέτυχε. Ήταν σίγουρα φωτογραφία;"
+ runtime_error: "Η μεταφόρτωση της φωτογραφίας απέτυχε. Σίγουρα έχεις φορέσει τη ζώνη ασφαλείας;"
+ type_error: "Η μεταφόρτωση της φωτογραφίας απέτυχε. Σίγουρα προστέθηκε μια εικόνα;"
destroy:
notice: "Η φωτογραφία διαγράφηκε."
edit:
@@ -631,8 +630,8 @@ el:
invalid_ext: "{file} δεν έχει έγκυρη τύπο αρχείου. Μόνο τύποι αρχείου {extensions} επιτρέπονται."
size_error: "{file} είναι πολύ μεγάλο, το μέγιστο μέγεθος αρχείου είναι {sizeLimit}."
new_profile_photo:
- or_select_one_existing: "ή επιλέξτε μια από τις ήδη υπάρχουσες %{photos}"
- upload: "Μεταφορτώστε μια νέα φωτογραφία προφίλ!"
+ or_select_one_existing: "ή επέλεξε μια από τις ήδη υπάρχουσες %{photos}"
+ upload: "Ανέβασε μια νέα φωτογραφία προφίλ!"
photo:
view_all: "προβολή όλων των φωτογραφιών του χρήστη %{name}"
show:
@@ -660,24 +659,24 @@ el:
reshare_by: "Κοινοποίηση από %{author}"
previous: "προηγούμενο"
privacy: "Απόρρητο"
- privacy_policy: "Πολιτική Ιδιωτικού Απορρήτου"
+ privacy_policy: "Πολιτική χρήσης δεδομένων"
profile: "Προφίλ"
profiles:
edit:
- allow_search: "Επιτρέψτε σε άλλους ανθρώπους να σας αναζητούν στο Diaspora"
+ allow_search: "Επέτρεψε σε άλλους ανθρώπους να σε αναζητούν στο diaspora*"
edit_profile: "Επεξεργασία προφίλ"
first_name: "Όνομα"
last_name: "Επώνυμο"
- update_profile: "Ενημέρωση Προφίλ"
- your_bio: "To βιογραφικό σας"
- your_birthday: "Τα γενέθλιά σας"
- your_gender: "Tο φύλο σας"
- your_location: "Η τοποθεσία σας"
- your_name: "Το όνομά σας"
- your_photo: "Η φωτογραφία σας"
- your_private_profile: "Το ιδιωτικό σας προφίλ"
- your_public_profile: "Το δημόσιο προφίλ σας"
- your_tags: "Περιγράψτε τον εαυτό σας με 5 λέξεις"
+ update_profile: "Ενημέρωση προφίλ"
+ your_bio: "To βιογραφικό σου"
+ your_birthday: "Τα γενέθλιά σου"
+ your_gender: "Tο φύλο σου"
+ your_location: "Η τοποθεσία σου"
+ your_name: "Το όνομά σου"
+ your_photo: "Η φωτογραφία σου"
+ your_private_profile: "Το ιδιωτικό σου προφίλ"
+ your_public_profile: "Το δημόσιο προφίλ σου"
+ your_tags: "Περιέγραψε τον εαυτό σου με 5 λέξεις"
your_tags_placeholder: "όπως #ταινίες #γατάκια #ταξίδι #δάσκαλος #newyork"
update:
failed: "Αποτυχία ενημέρωσης προφίλ"
@@ -691,41 +690,39 @@ el:
two: "%{count} αντιδράσεις"
zero: "0 αντιδράσεις"
registrations:
- closed: "Οι εγγραφές είναι κλειστές σε αυτό το pod του Diaspora."
+ closed: "Οι εγγραφές είναι κλειστές σε αυτό το pod του diaspora*."
create:
- success: "Γίνατε μέλος στο Diaspora!"
+ success: "Έγινες μέλος στο diaspora*!"
edit:
cancel_my_account: "Ακύρωση του λογαριασμού μου"
edit: "Επεξεργασία %{name}"
- leave_blank: "(αφήστε το κενό αν δεν θέλετε να το αλλάξετε)"
- password_to_confirm: "(χρειαζόμαστε τον τρέχοντα κωδικό σας για να επιβεβαιώσετε τις αλλαγές σας)"
- unhappy: "Δεν είσαι ικανοποιημένοι;"
+ leave_blank: "(άφησε το κενό αν δεν θέλεις να το αλλάξεις)"
+ password_to_confirm: "(χρειαζόμαστε τον τρέχοντα κωδικό σου για να επιβεβαιώσουμε τις αλλαγές σου)"
+ unhappy: "Δεν είσαι ικανοποιημένος;"
update: "Ενημέρωση"
- invalid_invite: "Ο σύνδεσμος που δώσατε δεν είναι πια έγκυρος!"
+ invalid_invite: "Ο σύνδεσμος που έδωσες δεν είναι πια έγκυρος!"
new:
- continue: "Συνέχεια"
create_my_account: "Δημιουργία λογαριασμού!"
- diaspora: "<3 Diaspora*"
- email: "ΗΛΕΚΤΡΟΝΙΚΟ ΤΑΧΥΔΡΟΜΕΙΟ"
- enter_email: "Εισάγετε μια διεύθυνση ηλεκτρονικού ταχυδρομείου"
- enter_password: "Εισάγετε έναν κωδικό"
- enter_password_again: "Εισάγετε τον ίδιο κωδικό πάλι"
- enter_username: "Επιλέξτε ένα όνομα χρήστη (μόνο γράμματα, νούμερα και κάτω-παύλα)"
- hey_make: "ΕΗ,<br/>ΚΑΝΕ<br/>ΚΑΤΙ."
- join_the_movement: "Γίνετε μέλος του κινήματος!"
+ email: "EMAIL"
+ enter_email: "Επέλεξε μια διεύθυνση email"
+ enter_password: "Επέλεξε έναν κωδικό"
+ enter_password_again: "Επανέλαβε τον κωδικό"
+ enter_username: "Επέλεξε ένα όνομα χρήστη (μόνο γράμματα, νούμερα και κάτω-παύλα)"
+ join_the_movement: "Γίνε μέλος του κινήματος!"
password: "ΚΩΔΙΚΟΣ"
password_confirmation: "ΕΠΑΛΗΘΕΥΣΗ ΚΩΔΙΚΟΥ"
sign_up: "ΕΓΓΡΑΦΗ"
- sign_up_message: "Κοινωνική Δικτύωση με <3"
+ sign_up_message: "Κοινωνική Δικτύωση με ♥"
+ submitting: "Υποβολή..."
username: "ΟΝΟΜΑ ΧΡΗΣΤΗ"
requests:
create:
sending: "Αποστολή"
- sent: "Σας ζητήθηκε να μοιράζεστε με τον/την %{name}. Θα είναι ορατό την επόμενη φορά που θα συνδεθεί στο Diaspora."
+ sent: "Σου ζητήθηκε να μοιράζεσαι με τον/την %{name}. Θα είναι ορατό την επόμενη φορά που θα συνδεθείς στο diaspora*."
destroy:
- error: "Παρακαλώ επιλέξτε μια πτυχή!"
+ error: "Παρακαλώ επέλεξε μια πτυχή!"
ignore: "Αγνοήθηκε αίτηση επαφής."
- success: "Τώρα πλέον διαμοιράζεστε."
+ success: "Τώρα πλέον μοιράζεσαι."
helper:
new_requests:
few: "%{count} νέα αιτήματα!"
@@ -736,7 +733,7 @@ el:
zero: "κανένα νέο αίτημα"
manage_aspect_contacts:
existing: "Υφιστάμενες επαφές"
- manage_within: "Διαχειριστείτε τις επαφές της πτυχής"
+ manage_within: "Διαχείριση των επαφών της πτυχής"
new_request_to_person:
sent: "εστάλη!"
reshares:
@@ -754,53 +751,54 @@ el:
zero: "Κοινοποίηση"
reshare_confirmation: "Κοινοποίηση της δημοσίευσης του χρήστη %{author};"
reshare_original: "Κοινοποίηση αρχικής"
- reshared_via: "διαμοιράστηκε μέσω"
+ reshared_via: "κοινοποιήθηκε μέσω"
show_original: "Προεπισκόπηση αρχικού"
search: "Αναζήτηση"
services:
create:
already_authorized: "Ένας χρήστης με diaspora αναγνωριστικό %{diaspora_id} έχει ήδη εξουσιοδοτήσει αυτόν τον %{service_name} λογαριασμό."
failure: "Αποτυχία πιστοποίησης."
- read_only_access: "Τα δικαιώματα πρόσβασης είναι μόνο για ανάγνωση, παρακαλώ προσπαθήστε να λάβετε εξουσιοδότηση ξανά αργότερα"
+ read_only_access: "Τα δικαιώματα πρόσβασης είναι μόνο για ανάγνωση, παρακαλώ προσπάθησε να λάβεις εξουσιοδότηση ξανά αργότερα"
success: "Επιτυχής έλεγχος ταυτότητας."
destroy:
success: "Επιτυχής καταστροφή ταυτότητας."
failure:
error: "εμφανίστηκε ένα σφάλμα κατά τη σύνδεση με αυτή την υπηρεσία"
finder:
- fetching_contacts: "Το Diaspora ανακτά τους %{service} φίλους σας παρακαλώ επανέλθετε σε μερικά λεπτά."
+ fetching_contacts: "Το diaspora* ανακτά τους %{service} φίλους σου, έλεγξε ξανά σε μερικά λεπτά."
no_friends: "Δεν βρέθηκαν φίλοι στο Facebook. "
service_friends: "%{service} Φίλοι"
index:
connect_to_facebook: "Σύνδεση με Facebook"
connect_to_tumblr: "Σύνδεση με το Tumblr"
connect_to_twitter: "Σύνδεση με Twitter"
+ connect_to_wordpress: "Σύνδεση με Wordpress"
disconnect: "αποσύνδεση"
edit_services: "Επεξεργασία υπηρεσιών"
logged_in_as: "συνδεδεμένος ως"
- no_services: "Δεν έχετε συνδέσει κάποια υπηρεσία ακόμα."
+ no_services: "Δεν έχεις συνδέσει κάποια υπηρεσία ακόμα."
really_disconnect: "αποσύνδεση %{service};"
services_explanation: "Η σύνδεση των υπηρεσιών σας δίνει τη δυνατότητα να κοινοποιούνται οι δημοσιεύσεις σας σε κάθε υπηρεσία, καθώς τις γράφεται στο Diaspora."
inviter:
- click_link_to_accept_invitation: "Κάντε κλικ σ' αυτό το σύνδεσμο για να αποδεχθείτε την πρόσκλησή σας"
- join_me_on_diaspora: "Συνδεθείτε μαζί μου στο DIASPORA*"
+ click_link_to_accept_invitation: "Κάνε κλικ σ' αυτό το σύνδεσμο για να αποδεχθείς την πρόσκλησή"
+ join_me_on_diaspora: "Συνδέσου μαζί μου στο diaspora*"
remote_friend:
invite: "πρόσκληση"
- not_on_diaspora: "Όχι ακόμα στο Diaspora"
+ not_on_diaspora: "Δεν είναι ακόμα στο diaspora*"
resend: "αποστολή ξανά"
settings: "Ρυθμίσεις"
share_visibilites:
update:
post_hidden_and_muted: "Οι δημοσιεύσεις του χρήστη %{name} έχουν κρυφτεί, και οι ειδοποιήσεις έχουν απενεργοποιηθεί."
- see_it_on_their_profile: "Αν θέλετε να δείτε ενημερώσεις για αυτή τη δημοσίευση, επισκεφτείτε το προφίλ του χρήστη %{name}."
+ see_it_on_their_profile: "Αν θέλεις να δεις ενημερώσεις για αυτή τη δημοσίευση, επισκέψου το προφίλ του χρήστη %{name}."
shared:
add_contact:
- add_new_contact: "Προσθέστε μια νέα επαφή"
- create_request: "Εύρεση βάσει Diaspora ID"
+ add_new_contact: "Πρόσθεσε μια νέα επαφή"
+ create_request: "Εύρεση βάσει diaspora* ID"
diaspora_handle: "diaspora@pod.org"
- enter_a_diaspora_username: "Εισάγετε όνομα χρήστη Diaspora:"
- know_email: "Ξέρετε τις ηλεκτρονικές τους διευθύνσεις; Τότε πρέπει να τους προσκαλέσετε"
- your_diaspora_username_is: "Το όνομα χρήστη σας στο Diaspora είναι: %{diaspora_handle}"
+ enter_a_diaspora_username: "Επέλεξε όνομα χρήστη diaspora*:"
+ know_email: "Γνωρίζεις τις διευθύνσεις email τους; Τότε πρέπει να τους προσκαλέσεις"
+ your_diaspora_username_is: "Το όνομα χρήστη σου στο diaspora* είναι: %{diaspora_handle}"
aspect_dropdown:
add_to_aspect: "Προσθήκη επαφής"
toggle:
@@ -814,55 +812,56 @@ el:
all_contacts: "Όλες οι επαφές"
footer:
logged_in_as: "συνδεμένοι ως %{name}"
- your_aspects: "οι πτυχές σας"
+ your_aspects: "οι πτυχές σου"
invitations:
- by_email: "Μέσω ηλεκτρονικού ταχυδρομείου"
- dont_have_now: "Δεν έχετε κάποια τώρα, αλλά περισσότερες προσκλήσεις έρχονται σύντομα!"
+ by_email: "Μέσω email"
+ dont_have_now: "Δεν έχεις κάποια τώρα, αλλά περισσότερες προσκλήσεις έρχονται σύντομα!"
from_facebook: "Από το Facebook"
invitations_left: "απομένουν %{count}"
- invite_someone: "Προσκαλέστε κάποιον/α"
- invite_your_friends: "Προσκαλέστε φίλους"
+ invite_someone: "Προσκάλεσε κάποιον/α"
+ invite_your_friends: "Προσκάλεσε φίλους"
invites: "Προσκλήσεις"
- invites_closed: "Οι προσκλήσεις αυτή τη στιγμή είναι κλειστές σε αυτό το Diaspora pod"
- share_this: "Μοιραστείτε αυτόν τον σύνδεσμο με ηλεκτρονικό ταχυδρομείο, blog, ή αγαπημένο κοινωνικό δίκτυο!"
+ invites_closed: "Οι προσκλήσεις αυτή τη στιγμή είναι κλειστές σε αυτό το diaspora* pod"
+ share_this: "Μοιράσου αυτόν τον σύνδεσμο με email, blog, ή σε κάποιο κοινωνικό δίκτυο!"
notification:
new: "Νέο %{type} από τον χρήστη %{from}"
public_explain:
atom_feed: ""
- control_your_audience: "Ελέγξτε το Κοινό σας"
+ control_your_audience: "Έλεγξε το Κοινό σου"
logged_in: "συνδεμένοι στο %{service}"
manage: "Διαχείριση συνδεμένων υπηρεσιών"
- new_user_welcome_message: "Χρησιμοποιήστε τις #ετικέτες για να ταξινομήσετε τις δημοσιεύσεις σας και να βρείτε άτομα με κοινά ενδιαφέροντα με εσάς. Μνημονεύστε αξιόλογα άτομα με @αναφορές"
- outside: "Τα δημόσια μηνύματα θα είναι διαθέσιμα και σε χρήστες εκτός του δικτύου Diaspora"
- share: "Μοιραστείτε"
+ new_user_welcome_message: "Χρησιμοποίησε τις #ετικέτες για να ταξινομήσεις τις δημοσιεύσεις σου και να βρείς άτομα με κοινά ενδιαφέροντα με σένα. Μνημόνευσε αξιόλογα άτομα με @αναφορές"
+ outside: "Τα δημόσια μηνύματα θα είναι διαθέσιμα και σε χρήστες εκτός του δικτύου diaspora*"
+ share: "Μοιράσου"
title: "Ρύθμιση συνδεδεμένων υπηρεσιών"
- visibility_dropdown: "Χρησιμοποιήστε αυτό το αναδυόμενο μενού για να αλλάξτε την ορατότητα της ανάρτησης σας. (Προτείνουμε την πρώτη σας να κάνετε δημόσια.)"
+ visibility_dropdown: "Χρησιμοποίησε αυτό το αναδυόμενο μενού για να αλλάξεις την ορατότητα της ανάρτησης σου. (Προτείνουμε την πρώτη σου να την κάνεις δημόσια.)"
publisher:
all: "όλα"
all_contacts: "όλες οι επαφές"
discard_post: "Απόρριψη ανάρτησης"
- make_public: "κάντε το δημόσιο"
+ get_location: "Λήψη τοποθεσίας μου"
+ make_public: "κάνε το δημόσιο"
new_user_prefill:
hello: "Γεια σε όλους, είμαι #%{new_user_tag}. "
i_like: "Με ενδιαφέρουν οι ετικέτες %{tags}."
invited_by: "Ευχαριστώ για την πρόσκληση, "
newhere: "ΝέοςΕδώ"
- post_a_message_to: "Αναρτήστε ένα μήνυμα στην πτυχή %{aspect}"
+ post_a_message_to: "Ανάρτησε ένα μήνυμα στην πτυχή %{aspect}"
posting: "Ανάρτηση..."
preview: "Προεπισκόπηση"
publishing_to: "δημοσίευση στο: "
share: "Κοινοποίηση"
- share_with: "μοιραστείτε με"
+ share_with: "μοιράσου με"
upload_photos: "Μεταφόρτωση εικόνων"
- whats_on_your_mind: "Τι σκέφτεστε;"
+ whats_on_your_mind: "Τι σκέφτεσαι;"
reshare:
- reshare: "Κοινοποιήστε"
+ reshare: "Κοινοποίησε"
stream_element:
- connect_to_comment: "Συνδεθείτε με αυτόν τον χρήστη για να σχολιάσετε στην ανάρτησή του"
+ connect_to_comment: "Συνδέσου με αυτόν τον χρήστη για να σχολιάσεις στην ανάρτησή του"
currently_unavailable: "ο σχολιασμός αυτή τη στιγμή δεν είναι διαθέσιμος"
dislike: "Δεν μ' αρέσει"
hide_and_mute: "Απόκρυψη και σίγαση δημοσίευσης"
- ignore_user: "Αγνοήστε τον/την %{name}"
+ ignore_user: "Αγνόησε τον/την %{name}"
ignore_user_description: "Αγνόηση και αφαίρεση χρήστη από όλες τις πτυχές;"
like: "Μου αρέσει"
nsfw: "Αυτή η δημοσίευση έχει σημανθεί ως μη ασφαλής για δουλειά από τον δημιουργό της. %{link}"
@@ -881,15 +880,11 @@ el:
no_message_to_display: "Κανένα μήνυμα"
new:
mentioning: "Αναφορά σε: %{person}"
- too_long:
- few: "παρακαλώ μετατρέψτε τα μηνύματα κατάστασης σας σε λιγότερους από %{count} χαρακτήρες"
- many: "παρακαλώ ελαττώστε το μύνημα κατάστασης σας σε λιγότερο από %{count} χαρακτήρες"
- one: "παρακαλώ μετατρέψτε τα μηνύματα κατάστασης σας σε λιγότερο από %{count} χαρακτήρα"
- other: "παρακαλώ μετατρέψτε τα μηνύματα κατάστασης σας σε λιγότερους από %{count} χαρακτήρες"
- two: "παρακαλούμε ορίστε το μήνυμα κατάστασής σας σε λιγότερους από %{count} χαρακτήρες"
- zero: "παρακαλώ μετατρέψτε τα μηνύματα κατάστασης σας σε λιγότερους από %{count} χαρακτήρες"
+ too_long: "Παρακαλώ μετέτρεψε το μήνυμα κατάστασης σου σε λιγότερους από %{count} χαρακτήρες. Τώρα είναι %{current_length} χαρακτήρες."
stream_helper:
hide_comments: "Απόκρυψη όλων των σχολίων"
+ no_more_posts: "Έχεις φτάσει το τέλος της ροής."
+ no_posts_yet: "Δεν υπάρχουν αναρτήσεις ακόμα."
show_comments:
few: "Εμφάνιση %{count} ακόμα σχολίων"
many: "Εμφάνιση %{count} ακόμα σχολίων"
@@ -901,69 +896,65 @@ el:
activity:
title: "Η δραστηριότητα μου"
aspects:
- title: "Οι Πτυχές σας"
+ title: "Οι Πτυχές σου"
aspects_stream: "Πτυχές"
comment_stream:
- contacts_title: "Χρήστες των οποίων έχετε σχολιάσει αναρτήσεις"
+ contacts_title: "Χρήστες των οποίων έχεις σχολιάσει αναρτήσεις"
title: "Σχολιασμένες Αναρτήσεις"
community_spotlight_stream: "Αναρτήσεις Κοινότητας"
followed_tag:
add_a_tag: "Προσθήκη μιας ετικέτας"
contacts_title: "Άτομα που έψαξαν αυτές τις ετικέτες"
- follow: "Ακολουθήστε"
- title: "#Ετικέτες που ακολουθείτε"
- followed_tags_stream: "#Ετικέτες που ακολουθείτε"
+ follow: "Ακολούθησε"
+ title: "#Ετικέτες που ακολουθείς"
+ followed_tags_stream: "#Ετικέτες που ακολουθείς"
like_stream:
- contacts_title: "Χρήστες των οποίων αναρτήσεις σας αρέσουν"
+ contacts_title: "Χρήστες των οποίων αναρτήσεις σου αρέσουν"
title: "Αυτή η ροή μου αρέσει"
mentioned_stream: "@Αναφορές"
mentions:
- contacts_title: "Άτομα που σας έχουν αναφέρει"
+ contacts_title: "Άτομα που σε έχουν αναφέρει"
title: "@Αναφορές"
multi:
- contacts_title: "Άτομα στη Ροή σας"
+ contacts_title: "Άτομα στη Ροή σου"
title: "Ροή"
public:
- contacts_title: "Πρόσφατες Αφίσες"
+ contacts_title: "Πρόσφατες Δημοσιεύσεις"
title: "Δημόσια Δραστηριότητα"
tags:
contacts_title: "Άτομα που τους αρέσει αυτή η ετικέτα"
- tag_prefill_text: "Αυτό που σκέφτομαι για %{tag_name} είναι... "
- title: "Δημοσιοποιήσατε με ετικέτα: %{tags}"
+ title: "Ανάρτησες με ετικέτες: %{tags}"
tag_followings:
create:
- failure: "Η προσπάθεια σας να ακολουθήσετε την ετικέτα #%{name} απέτυχε. Μήπως την ακολουθείτε ήδη;"
- none: "Δεν μπορείτε να ακολουθήσετε μια κενή ετικέτα!"
- success: "Γιούπι! Ακολουθείτε επιτυχώς την ετικέτα #%{name}."
+ failure: "Η προσπάθεια σου να ακολουθήσεις την ετικέτα #%{name} απέτυχε. Μήπως την ακολουθείς ήδη;"
+ none: "Δεν μπορείς να ακολουθήσεις μια κενή ετικέτα!"
+ success: "Γιούπι! Ακολουθείς επιτυχώς την ετικέτα #%{name}."
destroy:
- failure: "Η προσπάθεια σας να σταματήσετε να ακολουθείτε την ετικέτα #%{name} απέτυχε. Μήπως έχετε ήδη σταματήσει να την ακολουθείτε;"
- success: "Δεν ακολουθείτε την ετικέτα: #%{name} πια."
+ failure: "Η προσπάθεια σου να σταματήσεις να ακολουθείς την ετικέτα #%{name} απέτυχε. Μήπως έχεις ήδη σταματήσει να την ακολουθείς;"
+ success: "Δεν ακολουθείς την ετικέτα: #%{name} πια."
tags:
show:
- follow: "Ακολουθήστε την ετικέτα #%{tag}"
- following: "Ακολουθείτε την ετικέτα #%{tag}"
- nobody_talking: "Κανένας δεν μιλάει ακόμα για την ετικέτα %{tag}."
+ follow: "Ακολούθησε την ετικέτα #%{tag}"
+ following: "Ακολουθείς την ετικέτα #%{tag}"
none: "Η κενή ετικέτα δεν υπάρχει!"
- people_tagged_with: "Άτομα με την ετικέτα %{tag}"
- posts_tagged_with: "Αναρτήσεις με την ετικέτα #%{tag}"
- stop_following: "Σταματήσατε να ακολουθείτε την ετικέτα #%{tag}"
+ stop_following: "Σταμάτησες να ακολουθείς την ετικέτα #%{tag}"
terms_and_conditions: "Όροι και Προϋποθέσεις"
undo: "Αναίρεση;"
username: "Όνομα Χρήστη"
users:
confirm_email:
- email_confirmed: "Η διεύθυνση ηλεκτρονικού ταχυδρομείου %{email} ενεργοποιήθηκε"
- email_not_confirmed: "Η διεύθυνση ηλεκτρονικού ταχυδρομείου δεν ενεργοποιήθηκε. Μήπως ήταν λάθος ο σύνδεσμος;"
+ email_confirmed: "Το email %{email} ενεργοποιήθηκε"
+ email_not_confirmed: "Η διεύθυνση email δεν ενεργοποιήθηκε. Μήπως ήταν λάθος ο σύνδεσμος;"
destroy:
- no_password: "Παρακαλώ εισάγετε τον τωρινό κωδικό σας για να κλείσει ο λογαριασμός σας."
+ no_password: "Παρακαλώ εισήγαγε τον τωρινό κωδικό σου για να κλείσει ο λογαριασμός σου."
success: "Ο λογαριασμός σας έχει κλειδωθεί. Μπορεί να πάρει 20 λεπτά για να ολοκληρώσουμε το κλείσιμο του λογαριασμού σας. Ευχαριστούμε που δοκιμάσατε το Diaspora."
- wrong_password: "Ο κωδικός που εισάγατε δεν ταιριάζει με τον τωρινό κωδικό σας."
+ wrong_password: "Ο κωδικός που εισήγαγες δεν ταιριάζει με τον τωρινό κωδικό σου."
edit:
- also_commented: "...κάποιος επίσης σχολίασε σε δημοσίευση επαφής σας;"
+ also_commented: "κάποιος σχολίασε σε δημοσίευση που έχεις σχολιάσει κι εσύ"
auto_follow_aspect: "Πτυχή για αυτόματη Παρακολούθησης"
auto_follow_back: "Αυτόματη ακολούθηση αν κάποιος σας ακουλουθήσει"
change: "Αλλαγή"
- change_email: "Αλλαγή διεύθυνσης ηλεκτρονικού ταχυδρομείου"
+ change_email: "Αλλαγή διεύθυνσης email"
change_language: "Αλλαγή γλώσσας"
change_password: "Αλλαγή κωδικού πρόσβασης"
character_minimum_expl: "πρέπει να είναι τουλάχιστον έξι χαρακτήρες"
@@ -973,44 +964,42 @@ el:
lock_username: "Αυτό θα κλειδώσει το username σας αν προσπαθήσετε να επανεγγραφείτε."
locked_out: "Θα αποσυνδεθείτε και θα κλειδωθείτε έξω από τον λογαριασμό σας."
make_diaspora_better: "Θα επιθυμούσαμε να μας βοηθήσετε να κάνουμε το Diaspora καλύτερο αντί να φύγετε. Αν πράγματι θέλετε να φύγετε, θα θέλαμε να ξέρετε τι θα συμβεί στην συνέχεια."
- mr_wiggles: "Ο κύριος Wiggles θα λυπηθεί να σας δει να αποχωρείτε"
+ mr_wiggles: "Ο κύριος Wiggles θα λυπηθεί να σε δει να αποχωρείς"
no_turning_back: "Προς το παρόν, δεν υπάρχει γυρισμός."
what_we_delete: "Διαγράφουμε όλες τις δημοσιεύσεις και τα δεδομένα του προφίλ σας το συντομότερο δυνατόν. Τα σχόλιά σας δεν θα διαγραφούν, αλλά θα συνεχίσουν να υπάρχουν."
close_account_text: "Κλείσιμο λογαριάσμου"
- comment_on_post: "...κάποιος σχολίασε την ανάρτησή σας;"
+ comment_on_post: "κάποιος σχολίασε την ανάρτησή σου"
current_password: "Τρέχον κωδικός πρόσβασης"
- current_password_expl: "αυτόν που συνδεθήκατε..."
+ current_password_expl: "αυτόν που συνδέθηκες..."
download_photos: "κατέβασμα των φωτογραφιών μου"
- download_xml: "κατέβασμα του xml μου"
edit_account: "Επεξεργασία λογαριασμού"
- email_awaiting_confirmation: "Σας στείλαμε έναν σύνδεσμο ενεργοποίησης στο %{unconfirmed_email}. Μέχρι να ακολουθήσετε αυτόν τον σύνδεσμο και να ενεργοποιήσετε τη νέα διεύθυνση, θα συνεχίσουμε να χρησιμοποιούμε την αρχική σας %{email}."
- export_data: "Εξαγωγή Δεδομένων"
+ email_awaiting_confirmation: "Σου στείλαμε έναν σύνδεσμο ενεργοποίησης στο %{unconfirmed_email}. Μέχρι να ακολουθήσεις αυτόν τον σύνδεσμο και να ενεργοποιήσεις τη νέα διεύθυνση, θα συνεχίσουμε να χρησιμοποιούμε την αρχική %{email}."
+ export_data: "Εξαγωγή δεδομένων"
following: "Ρυθμίσεις Παρακολούθησης"
- getting_started: "Προτιμήσεις Νέου Χρήστη"
+ getting_started: "Προτιμήσεις νέου χρήστη"
liked: "...σε κάποιον αρέσει η δημοσίευση σας;"
mentioned: "...επισημανθήκατε σε μία φωτογραφία;"
new_password: "Νέος κωδικός πρόσβασης"
- photo_export_unavailable: "Η εξαγωγή φωτογραφίας αυτή τη στιγμή δεν είναι διαθέσιμη"
private_message: "...μόλις λάβατε μία προσωπική ειδοποίηση;"
- receive_email_notifications: "Να λαμβάνετε ειδοποιήσεις στο ηλεκτρονικό σας ταχυδρομείο όταν..."
+ receive_email_notifications: "Να λαμβάνω ειδοποιήσεις στο email μου όταν:"
reshared: "...κάποιος κοινοποίησε τη δημοσίευση σας;"
- show_community_spotlight: "Εμφάνιση Δημοσιεύσεων Κοινότητας στη Ροή σας;"
+ show_community_spotlight: "Εμφάνιση Δημοσιεύσεων Κοινότητας στη ροή σου;"
show_getting_started: "Επανενεργοποιήση Getting Started"
started_sharing: "...κάποιος άρχισε να διαμοιράζεται μαζί σας;"
- stream_preferences: "Προτιμήσεις Ροής"
- your_email: "Το email σας"
- your_handle: "Το αναγνωριστικό σας στο diaspora"
+ stream_preferences: "Προτιμήσεις ροής"
+ your_email: "Το email σου"
+ your_handle: "Το αναγνωριστικό σου στο diaspora*"
getting_started:
- awesome_take_me_to_diaspora: "Εξαιρετικά! Πήγαινέ με στο Diaspora*"
- community_welcome: "Η κοινότητα του Diaspora είναι χαρούμενη να σας έχει μαζί της!"
- connect_to_facebook: "Μπορούμε να επιταχύνουμε λίγο τα πράγματα %{link} στο Diaspora. Αυτό θα τραβήξει το όνομα και τη φωτογραφία σας, και θα ενεργοποιήσει την πολλαπλή ανάρτηση."
+ awesome_take_me_to_diaspora: "Εξαιρετικά! Πήγαινέ με στο diaspora*"
+ community_welcome: "Η κοινότητα του diaspora* είναι χαρούμενη να σε έχει μαζί της!"
+ connect_to_facebook: "Μπορούμε να επιταχύνουμε λίγο τα πράγματα με %{link} στο diaspora*. Αυτό θα τραβήξει το όνομα και τη φωτογραφία σας, και θα ενεργοποιήσει την πολλαπλή ανάρτηση."
connect_to_facebook_link: "συνδέοντας τον Facebook λογαριασμό σας"
hashtag_explanation: "Τα hashtags σας επιτρέπουν να συζητάτε και να ακολουθείτε συγκεκριμένα ενδιαφέροντα. Είναι ακόμα ένας ωραίος τρόπος για να γνωρίσετε νέα άτομα στο Diaspora."
- hashtag_suggestions: "Δοκιμάστε να ακολουθήσετε ετικέτες όπως #τέχνη, #ταινίες, #gif, κτλ."
+ hashtag_suggestions: "Δοκιμάστε να ακολουθήσεις ετικέτες όπως #art, #movies, #gif, κτλ."
saved: "Αποθηκεύτηκε!"
- well_hello_there: "Λοιπόν, γεια σας!"
- what_are_you_in_to: "Με τι ασχολείστε;"
- who_are_you: "Ποιός είστε;"
+ well_hello_there: "Λοιπόν, γεια σου!"
+ what_are_you_in_to: "Με τι ασχολείσαι;"
+ who_are_you: "Ποιος είσαι;"
privacy_settings:
ignored_users: "Αγνοημένοι Χρήστες"
stop_ignoring: "Διακοπή Αγνόησης"
@@ -1018,24 +1007,24 @@ el:
public:
does_not_exist: "Ο χρήστης %{username} δεν υπάρχει!"
update:
- email_notifications_changed: "Αλλαγή ειδοποιήσεων ηλεκτρονικού ταχυδρομείου,επιτυχής"
+ email_notifications_changed: "Επιτυχής αλλαγή email ειδοποιήσεων"
follow_settings_changed: "Οι ρυθμίσεις παρακολούθησης έχουν αλλάξει"
follow_settings_not_changed: "Η αλλαγή ρυθμίσεων παρακολουθήσεις απέτυχε."
language_changed: "Η γλώσσα άλλαξε"
language_not_changed: "Η αλλαγή γλώσσας απέτυχε"
- password_changed: "Ο κωδικός σας άλλαξε. Μπορείτε τώρα να συνδεθείτε με τον νέο κωδικό. "
+ password_changed: "Ο κωδικός σου άλλαξε. Μπορείς τώρα να συνδεθείς με τον νέο κωδικό."
password_not_changed: "Η αλλαγή κωδικού απέτυχε"
settings_not_updated: "Αποτυχία ενημέρωσης ρυθμίσεων"
settings_updated: "Οι ρυθμίσεις ενημερώθηκαν"
- unconfirmed_email_changed: "Η διεύθυνση ηλεκτρονικού ταχυδρομείου άλλαξε. Χρειάζεται ενεργοποίηση."
- unconfirmed_email_not_changed: "Η αλλαγή της διεύθυνσης ηλεκτρονικού ταχυδρομείου απέτυχε."
+ unconfirmed_email_changed: "Η διεύθυνση email άλλαξε. Χρειάζεται ενεργοποίηση."
+ unconfirmed_email_not_changed: "Η αλλαγή της διεύθυνσης email απέτυχε."
webfinger:
fetch_failed: "αποτυχία παροχής του προφίλ webfinger για %{profile_url}"
- hcard_fetch_failed: "υπήρξε ενά πρόβλημα παροχής του hcard για #{@account}"
+ hcard_fetch_failed: "υπήρξε ενά πρόβλημα λήξης του hcard για %{account}"
no_person_constructed: "Κανένα άτομο δεν μπορούσε να κατασκευαστεί απο αυτό το hcard."
not_enabled: "το webfinger φαίνεται να μην είναι ενεργοποιημέο για τον host του %{account}"
xrd_fetch_failed: "υπήρξε ένα πρόβλημα στη λήψη του xrd απο το λογαριασμό %{account}"
- welcome: "Καλωσήρθατε!"
+ welcome: "Καλωσόρισες!"
will_paginate:
next_label: "επόμενο &raquo;"
previous_label: "&laquo; προηγούμενο" \ No newline at end of file
diff --git a/config/locales/diaspora/en.yml b/config/locales/diaspora/en.yml
index fa2c84b8a..604596ec5 100644
--- a/config/locales/diaspora/en.yml
+++ b/config/locales/diaspora/en.yml
@@ -10,11 +10,11 @@ en:
profile: "Profile"
account: "Account"
privacy: "Privacy"
- privacy_policy: "Privacy Policy"
- terms_and_conditions: "Terms and Conditions"
+ privacy_policy: "Privacy policy"
+ terms_and_conditions: "Terms and conditions"
_services: "Services"
_applications: "Applications"
- _photos: "photos"
+ _photos: "Photos"
_help: "Help"
ok: "OK"
cancel: "Cancel"
@@ -29,7 +29,7 @@ en:
password: "Password"
password_confirmation: "Password confirmation"
are_you_sure: "Are you sure?"
- are_you_sure_delete_account: "Are you sure you want to close your account? This can't be undone!"
+ are_you_sure_delete_account: "Are you sure you want to close your account? This can’t be undone!"
fill_me_out: "Fill me out"
back: "Back"
public: "Public"
@@ -39,17 +39,18 @@ en:
find_people: "Find people or #tags"
_home: "Home"
more: "More"
- next: "next"
- previous: "previous"
+ next: "Next"
+ previous: "Previous"
_comments: "Comments"
- all_aspects: "All Aspects"
- no_results: "No Results Found"
+ all_aspects: "All aspects"
+ no_results: "No results found"
_contacts: "Contacts"
welcome: "Welcome!"
- _terms: "terms"
+ _terms: "Terms"
+ _statistics: "Statistics"
- #for reference translation, the real activerecord english transations are actually
- #in en-US, en-GB, and en-AU yml files
+ # For reference translation; the real ActiveRecord English transations are actually
+ # in the en-US, en-GB, and en-AU yml files.
activerecord:
errors:
models:
@@ -69,7 +70,7 @@ en:
contact:
attributes:
person_id:
- taken: "must be unique among this user's contacts."
+ taken: "must be unique among this user’s contacts."
request:
attributes:
from_id:
@@ -77,7 +78,7 @@ en:
reshare:
attributes:
root_guid:
- taken: "That good, huh? You've already reshared that post!"
+ taken: "That good, eh? You've already reshared that post!"
poll:
attributes:
poll_answers:
@@ -85,10 +86,10 @@ en:
poll_participation:
attributes:
poll:
- already_participated: "You've already participated in this poll!"
+ already_participated: "You’ve already participated in this poll!"
error_messages:
helper:
- invalid_fields: "Invalid Fields"
+ invalid_fields: "Invalid fields"
correct_the_following_errors_and_try_again: "Correct the following errors and try again."
post_not_public: "The post you are trying to view is not public!"
post_not_public_or_not_exist: "The post you are trying to view is not public, or does not exist!"
@@ -97,41 +98,46 @@ en:
admins:
admin_bar:
pages: "Pages"
- user_search: "User Search"
- weekly_user_stats: "Weekly User Stats"
- pod_stats: "Pod Stats"
+ user_search: "User search"
+ weekly_user_stats: "Weekly user stats"
+ pod_stats: "Pod stats"
report: "Reports"
correlations: "Correlations"
sidekiq_monitor: "Sidekiq monitor"
correlations:
- correlations_count: "Correlations with Sign In Count:"
+ correlations_count: "Correlations with sign-in count:"
user_search:
you_currently:
- zero: "you currently have no invites left %{link}"
- one: "you currently have one invite left %{link}"
- other: "you currently have %{count} invites left %{link}"
- view_profile: "view profile"
- add_invites: "add invites"
- close_account: "close account"
+ zero: "You currently have no invites left %{link}"
+ one: "You currently have one invite left %{link}"
+ other: "You currently have %{count} invites left %{link}"
+ view_profile: "View profile"
+ add_invites: "Add invites"
+ close_account: "Close account"
are_you_sure: "Are you sure you want to close this account?"
+ are_you_sure_lock_account: "Are you sure you want to lock this account?"
+ are_you_sure_unlock_account: "Are you sure you want to unlock this account?"
account_closing_scheduled: "The account of %{name} is scheduled to be closed. It will be processed in a few moments..."
+ account_locking_scheduled: "The account of %{name} is scheduled to be locked. It will be processed in a few moments..."
+ account_unlocking_scheduled: "The account of %{name} is scheduled to be unlocked. It will be processed in a few moments..."
email_to: "Email to Invite"
+ email_to: "Email to invite"
under_13: "Show users that are under 13 (COPPA)"
users:
zero: "%{count} users found"
one: "%{count} user found"
other: "%{count} users found"
user_entry:
- id: 'ID'
- guid: 'GUID'
- email: 'Email'
- diaspora_handle: 'Diaspora handle'
- last_seen: 'last seen'
- account_closed: 'account closed'
- nsfw: '#nsfw'
- unknown: 'unknown'
- 'yes': 'yes'
- 'no': 'no'
+ id: "ID"
+ guid: "GUID"
+ email: "Email"
+ diaspora_handle: "diaspora* handle"
+ last_seen: "Last seen"
+ account_closed: "Account closed"
+ nsfw: "#nsfw"
+ unknown: "Unknown"
+ 'yes': "Yes"
+ 'no': "No"
weekly_user_stats:
current_server: "Current server date is %{date}"
amount_of:
@@ -140,11 +146,11 @@ en:
other: "Number of new users this week: %{count}"
stats:
week: "Week"
- 2weeks: "2 Week"
+ 2weeks: "2 weeks"
month: "Month"
daily: "Daily"
- usage_statistic: "Usage Statistics"
- go: "go"
+ usage_statistic: "Usage statistics"
+ go: "Go"
display_results: "Displaying results from the <b>%{segment}</b> segment"
posts:
zero: "%{count} posts"
@@ -163,56 +169,44 @@ en:
one: "%{count} user"
other: "%{count} users"
current_segment: "The current segment is averaging <b>%{post_yest}</b> posts per user, from <b>%{post_day}</b>"
- 50_most: "50 Most Popular Tags"
- tag_name: "Tag Name: <b>%{name_tag}</b> Count: <b>%{count_tag}</b>"
+ 50_most: "50 most popular tags"
+ tag_name: "Tag name: <b>%{name_tag}</b> Count: <b>%{count_tag}</b>"
application:
helper:
- unknown_person: "unknown person"
+ unknown_person: "Unknown person"
video_title:
- unknown: "Unknown Video Title"
+ unknown: "Unknown video title"
aspects:
- zero: "no aspects"
+ zero: "No aspects"
one: "1 aspect"
- two: "%{count} aspects"
- few: "%{count} aspects"
- many: "%{count} aspects"
other: "%{count} aspects"
contacts_visible: "Contacts in this aspect will be able to see each other."
contacts_not_visible: "Contacts in this aspect will not be able to see each other."
edit:
- make_aspect_list_visible: "make contacts in this aspect visible to each other?"
+ grant_contacts_chat_privilege: "Grant contacts in this aspect chat privilege?"
+ make_aspect_list_visible: "Make contacts in this aspect visible to each other?"
remove_aspect: "Delete this aspect"
confirm_remove_aspect: "Are you sure you want to delete this aspect?"
- add_existing: "Add an existing contact"
set_visibility: "Set visibility"
- manage: "Manage"
- done: "Done"
- rename: "rename"
+ rename: "Rename"
aspect_list_is_visible: "Contacts in this aspect are able to see each other."
aspect_list_is_not_visible: "Contacts in this aspect are not able to see each other."
- update: "update"
- updating: "updating"
- aspect_contacts:
- done_editing: "done editing"
- show:
- edit_aspect: "edit aspect"
+ aspect_chat_is_enabled: "Contacts in this aspect are able to chat with you."
+ aspect_chat_is_not_enabled: "Contacts in this aspect are not able to chat with you."
+ update: "Update"
+ updating: "Updating"
no_posts_message:
start_talking: "Nobody has said anything yet!"
no_contacts_message:
you_should_add_some_more_contacts: "You should add some more contacts!"
try_adding_some_more_contacts: "You can search or invite more contacts."
or_spotlight: "Or you can share with %{link}"
- community_spotlight: "community spotlight"
+ community_spotlight: "Community spotlight"
aspect_listings:
select_all: "Select all"
deselect_all: "Deselect all"
edit_aspect: "Edit %{name}"
add_an_aspect: "+ Add an aspect"
- selected_contacts:
- view_all_community_spotlight: "See all community spotlight"
- view_all_contacts: "View all contacts"
- no_contacts: "You don't have any contacts here yet."
- manage_your_aspects: "Manage your aspects."
new:
name: "Name (only visible to you)"
create: "Create"
@@ -225,17 +219,9 @@ en:
update:
success: "Your aspect, %{name}, has been successfully edited."
failure: "Your aspect, %{name}, had too long name to be saved."
- move_contact:
- failure: "didn't work %{inspect}"
- success: "Person moved to new aspect"
- error: "Error moving contact: %{inspect}"
add_to_aspect:
failure: "Failed to add contact to aspect."
success: "Successfully added contact to aspect."
- helper:
- remove: "remove"
- aspect_not_empty: "Aspect not empty"
- are_you_sure: "Are you sure you want to delete this aspect?"
seed:
family: "Family"
work: "Work"
@@ -249,19 +235,19 @@ en:
unfollow_tag: "Stop following #%{tag}"
handle_explanation: "This is your diaspora* ID. Like an email address, you can give this to people to reach you."
no_contacts: "No contacts"
- post_a_message: "post a message >>"
+ post_a_message: "Post a message >>"
people_sharing_with_you: "People sharing with you"
welcome_to_diaspora: "Welcome to diaspora*, %{name}!"
introduce_yourself: "This is your stream. Jump in and introduce yourself."
new_here:
- title: "Welcome New Users"
+ title: "Welcome new users"
follow: "Follow %{link} and welcome new users to diaspora*!"
learn_more: "Learn more"
help:
- need_help: "Need Help?"
+ need_help: "Need help?"
here_to_help: "The diaspora* community is here!"
do_you: "Do you:"
have_a_question: "... have a %{link}?"
@@ -270,31 +256,31 @@ en:
tag_bug: "bug"
feature_suggestion: "... have a %{link} suggestion?"
tag_feature: "feature"
- tutorials_and_wiki: "%{faq}, %{tutorial} & %{wiki}: Help for your first steps."
+ tutorials_and_wiki: "%{faq}, %{tutorial} & %{wiki}: help for your first steps."
tutorial_link_text: "Tutorials"
email_feedback: "%{link} your feedback, if you prefer"
email_link: "Email"
- any_problem: "Any Problem?"
+ any_problem: "Got a problem?"
contact_podmin: "Contact the administrator of your pod!"
- mail_podmin: "Podmin E-Mail"
+ mail_podmin: "Podmin email"
diaspora_id:
heading: "diaspora* ID"
content_1: "Your diaspora* ID is:"
- content_2: "Give it to anyone and they'll be able to find you on diaspora*."
+ content_2: "Give it to anyone and they’ll be able to find you on diaspora*."
services:
- heading: "Connect Services"
+ heading: "Connect services"
content: "You can connect the following services to diaspora*:"
aspect_stream:
- stay_updated: "Stay Updated"
+ stay_updated: "Stay updated"
stay_updated_explanation: "Your main stream is populated with all of your contacts, tags you follow, and posts from some creative members of the community."
make_something: "Make something"
aspect_memberships:
destroy:
- success: "Successfully removed person from aspect"
- failure: "Failed to remove person from aspect"
- no_membership: "Could not find the selected person in that aspect"
+ success: "Successfully removed person from aspect."
+ failure: "Failed to remove person from aspect."
+ no_membership: "Could not find the selected person in that aspect."
bookmarklet:
heading: "Bookmarklet"
@@ -303,69 +289,64 @@ en:
explanation: "Post to diaspora* from anywhere by bookmarking this link => %{link}."
comments:
- zero: "no comments"
+ zero: "No comments"
one: "1 comment"
- two: "%{count} comments"
- few: "%{count} comments"
- many: "%{count} comments"
other: "%{count} comments"
new_comment:
comment: "Comment"
commenting: "Commenting..."
reactions:
- zero: "0 reactions"
+ zero: "No reactions"
one: "1 reaction"
other: "%{count} reactions"
contacts:
- zero: "contacts"
+ zero: "No contacts"
one: "1 contact"
- two: "%{count} contacts"
- few: "%{count} contacts"
- many: "%{count} contacts"
other: "%{count} contacts"
create:
failure: "Failed to create contact"
sharing:
people_sharing: "People sharing with you:"
index:
- add_to_aspect: "add contacts to %{name}"
+ add_to_aspect: "Add contacts to %{name}"
start_a_conversation: "Start a conversation"
add_a_new_aspect: "Add a new aspect"
title: "Contacts"
- your_contacts: "Your Contacts"
+ your_contacts: "Your contacts"
no_contacts: "Looks like you need to add some contacts!"
no_contacts_message: "Check out %{community_spotlight}"
- no_contacts_message_with_aspect: "Check out %{community_spotlight} or %{add_to_aspect_link}"
- add_to_aspect_link: "add contacts to %{name}"
- community_spotlight: "Community Spotlight"
- my_contacts: "My Contacts"
- all_contacts: "All Contacts"
+ community_spotlight: "Community spotlight"
+ no_contacts_in_aspect: "You don't have any contacts in this aspect yet. Below is a list of your existing contacts which you can add to this aspect."
+ my_contacts: "My contacts"
+ all_contacts: "All contacts"
only_sharing_with_me: "Only sharing with me"
- remove_person_from_aspect: "Remove %{person_name} from \"%{aspect_name}\""
- many_people_are_you_sure: "Are you sure you want to start a private conversation with more than %{suggested_limit} contacts? Posting to this aspect may be a better way to contact them."
+ add_contact: "Add contact"
+ remove_contact: "Remove contact"
+ user_search: "Contact search"
spotlight:
- community_spotlight: "Community Spotlight"
+ community_spotlight: "Community spotlight"
suggest_member: "Suggest a member"
conversations:
index:
conversations_inbox: "Conversations – Inbox"
new_conversation: "New conversation"
- no_conversation_selected: "no conversation selected"
- create_a_new_conversation: "start a new conversation"
- no_messages: "no messages"
+ no_conversation_selected: "No conversation selected"
+ create_a_new_conversation: "Start a new conversation"
+ no_messages: "No messages"
inbox: "Inbox"
conversation:
participants: "Participants"
show:
- reply: "reply"
+ reply: "Reply"
replying: "Replying..."
- delete: "delete and block conversation"
+ hide: "Hide and mute conversation"
+ delete: "Delete conversation"
new:
- to: "to"
- subject: "subject"
+ to: "To"
+ subject: "Subject"
send: "Send"
sending: "Sending..."
abandon_changes: "Abandon changes?"
@@ -381,8 +362,8 @@ en:
new_conversation:
fail: "Invalid message"
destroy:
- success: "Conversation successfully removed"
-
+ delete_success: "Conversation successfully deleted"
+ hide_success: "Conversation successfully hidden"
date:
formats:
fullmonth_day: "%B %d"
@@ -395,195 +376,217 @@ en:
tutorial: "tutorial"
irc: "IRC"
wiki: "wiki"
+ faq: "FAQ"
markdown: "Markdown"
here: "here"
- foundation_website: "diaspora foundation website"
- third_party_tools: "third party tools"
- getting_started_tutorial: "'Getting started' tutorial series"
+ foundation_website: "diaspora* foundation website"
+ third_party_tools: "Third-party tools"
+ getting_started_tutorial: "”Getting started” tutorial series"
getting_help:
title: "Getting help"
getting_started_q: "Help! I need some basic help to get me started!"
- getting_started_a: "You're in luck. Try the %{tutorial_series} on our project site. It will take you step-by-step through the registration process and teach you all the basic things you need to know about using diaspora*."
+ getting_started_a: "You’re in luck. Try the %{tutorial_series} on our project site. It will take you step-by-step through the registration process and teach you all the basic things you need to know about using diaspora*."
get_support_q: "What if my question is not answered in this FAQ? Where else can I get support?"
- get_support_a_website: "visit our %{link}"
- get_support_a_tutorials: "check out our %{tutorials}"
- get_support_a_wiki: "search the %{link}"
- get_support_a_irc: "join us on %{irc} (Live chat)"
- get_support_a_hashtag: "ask in a public post on diaspora* using the %{question} hashtag"
+ get_support_a_website: "Visit our %{link}"
+ get_support_a_tutorials: "Check out our %{tutorials}"
+ get_support_a_wiki: "Search the %{link}"
+ get_support_a_irc: "Join us on %{irc} (live chat)"
+ get_support_a_faq: "Read our %{faq} page on wiki"
+ get_support_a_hashtag: "Ask in a public post on diaspora* using the %{question} hashtag"
account_and_data_management:
title: "Account and data management"
move_pods_q: "How do I move my seed (account) from one pod to another?"
move_pods_a: "In the future you will be able to export your seed from a pod and import it on another, but this is not currently possible. You could always open a new account and add your contacts to aspects on that new seed, and ask them to add your new seed to their aspects."
download_data_q: "Can I download a copy of all of my data contained in my seed (account)?"
- download_data_a: "Yes. At the bottom of the Account tab of your settings page there are two buttons for downloading your data."
+ download_data_a: "Yes. At the bottom of the Account tab of your settings page you will find two buttons: one for downloading your data and one for downloading your photos."
close_account_q: "How do I delete my seed (account)?"
- close_account_a: "Go to the bottom of your settings page and click the Close Account button."
+ close_account_a: "Go to the bottom of your settings page and click the “Close account” button. You will be asked to enter your password to complete the process. Remember, if you close your account, you will <strong>never</strong> be able to re-register your username on that pod."
data_visible_to_podmin_q: "How much of my information can my pod administrator see?"
- data_visible_to_podmin_a: "Communication *between* pods is always encrypted (using SSL and diaspora*'s own transport encryption), but the storage of data on pods is not encrypted. If they wanted to, the database administrator for your pod (usually the person running the pod) could access all your profile data and everything that you post (as is the case for most websites that store user data). Running your own pod provides more privacy since you then control access to the database."
+ data_visible_to_podmin_a: "In short: everything. Communication between pods is always encrypted (using SSL and diaspora*’s own transport encryption), but the storage of data on pods is not encrypted. If they wanted to, the database administrator for your pod (usually the person running the pod) could access all your profile data and everything that you post (as is the case for most websites that store user data). This is why we give you the choice which pod you sign up to, so you can choose a pod whose admin you are happy to trust with your data. Running your own pod provides more privacy since you then control access to the database."
data_other_podmins_q: "Can the administrators of other pods see my information?"
- data_other_podmins_a: "Once you are sharing with someone on another pod, any posts you share with them and a copy of your profile data are stored (cached) on their pod, and are accessible to that pod's database administrator. When you delete a post or profile data it is deleted from your pod and any other pods where it had previously been stored."
+ data_other_podmins_a: "Once you are sharing with someone on another pod, any posts you share with them and a copy of your profile data are stored (cached) on their pod, and are accessible to that pod’s database administrator. When you delete a post or profile data it is deleted from your pod and a delete request is sent to any other pods where it had previously been stored. Your images are never stored on any pod but your own; only links to them are transmitted to other pods."
aspects:
title: "Aspects"
what_is_an_aspect_q: "What is an aspect?"
what_is_an_aspect_a: "Aspects are the way you group your contacts on diaspora*. An aspect is one of the faces you show to the world. It might be who you are at work, or who you are to your family, or who you are to your friends in a club you belong to."
who_sees_post_q: "When I post to an aspect, who sees it?"
- who_sees_post_a: "If you make a limited post, it will only be visible the people you have put in that aspect (or those aspects, if it is made to multiple aspects). Contacts you have that aren't in the aspect have no way of seeing the post, unless you've made it public. Only public posts will ever be visible to anyone who you haven't placed into one of your aspects."
- restrict_posts_i_see_q: "Can I restrict the posts I see to just those from certain aspects?"
- restrict_posts_i_see_a: "Yes. Click on My Aspects in the side-bar and then click individual aspects in the list to select or deselect them. Only the posts by people in the selected aspects will appear in your stream."
+ who_sees_post_a: "If you make a limited post, it will only be visible to the people you had placed in that aspect (or aspects, if it is made to multiple aspects) before making the post. Contacts you have who aren’t in the aspect have no way of seeing the post. Limited posts will never be visible to anyone who you haven’t placed into one of your aspects."
contacts_know_aspect_q: "Do my contacts know which aspects I have put them in?"
contacts_know_aspect_a: "No. They cannot see the name of the aspect under any circumstances."
- contacts_visible_q: "What does \"make contacts in this aspect visible to each other\" mean?"
- contacts_visible_a: "If you check this option then contacts from that aspect will be able to see who else is in it, on your profile page under your picture. It's best to select this option only if the contacts in that aspect all know each other. They still won't be able to see what the aspect is called."
+ person_multiple_aspects_q: "Can I add a person to multiple aspects?"
+ person_multiple_aspects_a: "Yes. Go to your contacts page and click on “My contacts”. For each contact you can use the menu on the right to add them to (or remove them from) as many aspects as you want. Or you can add them to a new aspect (or remove them from an aspect) by clicking the aspect selector button on their profile page. Or you can even just move the pointer over their name where you see it in the stream, and a “hovercard” will appear. You can change the aspects they are in right there."
+ contacts_visible_q: "What does “make contacts in this aspect visible to each other” mean?"
+ contacts_visible_a: "If you check this option then contacts from that aspect will be able to see who else is in it, in the “Contacts” tab on your profile page. It’s best to select this option only if the contacts in that aspect all know each other, for example if the aspect is for a club or society you belong to. They still won’t be able to see what the aspect is called."
remove_notification_q: "If I remove someone from an aspect, or all of my aspects, are they notified of this?"
- remove_notification_a: "No."
- rename_aspect_q: "Can I rename an aspect?"
- rename_aspect_a: "Yes. In your list of aspects on the left side of the main page, point your mouse at the aspect you want to rename. Click the little 'edit' pencil that appears to the right. Click rename in the box that appears."
+ remove_notification_a: "No. They are also not notified if you add them to more aspects, when you are already sharing with them."
change_aspect_of_post_q: "Once I have posted something, can I change the aspect(s) that can see it?"
change_aspect_of_post_a: "No, but you can always make a new post with the same content and post it to a different aspect."
post_multiple_aspects_q: "Can I post content to multiple aspects at once?"
- post_multiple_aspects_a: "Yes. When you are making a post, use the aspect selector button to select or deselect aspects. Your post will be visible to all the aspects you select. You could also select the aspects you want to post to in the side-bar. When you post, the aspect(s) that you have selected in the list on the left will automatically be selected in the aspect selector when you start to make a new post."
- person_multiple_aspects_q: "Can I add a person to multiple aspects?"
- person_multiple_aspects_a: "Yes. Go to your contacts page and click my contacts. For each contact you can use the menu on the right to add them to (or remove them from) as many aspects as you want. Or you can add them to a new aspect (or remove them from an aspect) by clicking the aspect selector button on their profile page. Or you can even just move the pointer over their name where you see it in the stream, and a 'hover-card' will appear. You can change the aspects they are in right there."
+ post_multiple_aspects_a: "Yes. When you are making a post, use the aspect selector button to select or deselect aspects. “All aspects” is the default setting. Your post will be visible to all the aspects you select. You could also select the aspects you want to post to in the side-bar. When you post, the aspect(s) that you have selected in the list on the left will automatically be selected in the aspect selector when you start to make a new post."
+ restrict_posts_i_see_q: "Can I restrict the posts in my stream to just those from certain aspects?"
+ restrict_posts_i_see_a: "Yes. Click “My aspects” in the side-bar and then click individual aspects in the list to select or deselect them. Only the posts by people in the selected aspects will appear in your stream."
+ rename_aspect_q: "How do I rename an aspect?"
+ rename_aspect_a: "Click “My aspects” in the side-bar from a stream view and click the pencil icon by the aspect you want to rename, or go to your Contacts page and select the relevant aspect. Then click the edit icon next to the aspect name at the top of this page, change the name and press “Update”."
delete_aspect_q: "How do I delete an aspect?"
- delete_aspect_a: "In your list of aspects on the left side of the main page, point your mouse at the aspect you want to delete. Click the little 'edit' pencil that appears on the right. Click the delete button in the box that appears."
+ delete_aspect_a: "Click “My aspects” in the side-bar from a stream view and click the pencil icon by the aspect you want to delete, or go to your Contacts page and select the relevant aspect. Then click the trash icon in the top right of the page."
+ chat:
+ title: "Chat"
+ contacts_page: "contacts page"
+ add_contact_roster_q: "How do I chat with someone in diaspora*?"
+ add_contact_roster_a: "First, you need to enable chat for one of the aspects that person is in. To do so, go to the %{contacts_page}, select the aspect you want and click on the chat icon to enable chat for the aspect. %{toggle_privilege} You could, if you prefer, create a special aspect called “Chat” and add the people you want to chat with to that aspect. Once you’ve done this, open the chat interface and select the person you want to chat with."
mentions:
title: "Mentions"
- what_is_a_mention_q: "What is a \"mention\"?"
- what_is_a_mention_a: "A mention is a link to a person's profile page that appears in a post. When someone is mentioned they receive a notification that calls their attention to the post."
+ what_is_a_mention_q: "What is a “mention”?"
+ what_is_a_mention_a: "A mention is a link to a person’s profile page that appears in a post. When someone is mentioned they receive a notification that calls their attention to the post."
how_to_mention_q: "How do I mention someone when making a post?"
- how_to_mention_a: "Type the \"@\" sign and start typing their name. A drop down menu should appear to let you select them more easily. Note that it is only possible to mention people you have added to an aspect."
+ how_to_mention_a: "Type the “@” sign and start typing their name. A drop-down menu should appear to let you select them more easily. Note that it is only possible to mention people you have added to an aspect."
mention_in_comment_q: "Can I mention someone in a comment?"
mention_in_comment_a: "No, not currently."
see_mentions_q: "Is there a way to see the posts in which I have been mentioned?"
- see_mentions_a: "Yes, click \"Mentions\" in the left hand column on your home page."
+ see_mentions_a: "Yes, click “@Mentions” in the left-hand column on your home page."
pods:
title: "Pods"
what_is_a_pod_q: "What is a pod?"
- what_is_a_pod_a: "A pod is a server running the diaspora* software and connected to the diaspora* network. \"Pod\" is a metaphor referring to pods on plants which contain seeds, in the way that a server contains a number of user accounts. There are many different pods. You can add friends from other pods and communicate with them. (You can think of a diaspora* pod as similar to an email provider: there are public pods, private pods, and with some effort you can even run your own)."
+ what_is_a_pod_a: "A pod is a server running the diaspora* software and connected to the diaspora* network. “Pod” is a metaphor referring to pods on plants which contain seeds, in the way that a server contains a number of user accounts. There are many different pods. You can add friends from other pods and communicate with them. There’s no need to open an account on different pods! One is enough – in this way, you can think of a diaspora* pod as similar to an email provider. There are public pods, private pods, and with some effort you can even run your own."
find_people_q: "I just joined a pod, how can I find people to share with?"
- find_people_a: "Invite your friends using the email link in the side-bar. Follow #tags to discover others who share your interests, and add those who post things that interest you to an aspect. Shout out that you're #newhere in a public post."
+ find_people_a: "If you want to invite your friends to join diaspora*, use the invitation link or the email link in the side-bar. Follow #tags to discover others who share your interests, and add those who post things that interest you to an aspect. Shout out that you’re #newhere in a public post."
use_search_box_q: "How do I use the search box to find particular individuals?"
- use_search_box_a: "If you know their full diaspora* ID (e.g. username@podname.org), you can find them by searching for it. If you are on the same pod you can search for just their username. An alternative is to search for them by their profile name (the name you see on screen). If a search does not work the first time, try it again."
+ use_search_box_a: "If you know their full diaspora* ID (e.g. username@podname.org), you can find them by searching for it. If you are on the same pod you can search for just their username. Alternatively you can search for them by their profile name (the name you see on screen). If a search does not work the first time, try it again."
posts_and_posting:
title: "Posts and posting"
- hide_posts_q: "How do I hide a post? / How do I stop getting notifications about a post that I commented on?"
+ stream_full_of_posts_q: "Why is my stream full of posts from people I don’t know and don’t share with?"
+ stream_full_of_posts_a1: "Your stream is made up of three types of posts:"
+ stream_full_of_posts_li1: "Posts by people you are sharing with, which come in two types: public posts and limited posts shared with an aspect that you are part of. To remove these posts from your stream, simply stop sharing with the person."
+ stream_full_of_posts_li2: "Public posts containing one of the tags that you follow. To remove these, stop following that tag."
+ stream_full_of_posts_li3: "Public posts by people listed in the community spotlight. These can be removed by unchecking the “Show community spotlight in stream?” option in the Account tab of your Settings."
+ hide_posts_q: "How do I hide a post?"
hide_posts_a: "If you point your mouse at the top of a post, an X appears on the right. Click it to hide the post and mute notifications about it. You can still see the post if you visit the profile page of the person who posted it."
+ post_notification_q: "How do I get notifications, or stop getting notifications, about a post?"
+ post_notification_a: "You will find a bell icon next to the X at the top right of a post. Click this to enable or disable notifications for that post."
+ post_report_q: "How do I report an offensive post?"
+ post_report_a: "Click the alert triangle icon at the top right of the post to report it to your podmin. Enter a reason for reporting this post in the dialog box."
+ character_limit_q: "What is the character limit for posts?"
+ character_limit_a: "65,535 characters. That’s 65,395 more characters than you get on Twitter! ;)"
+ char_limit_services_q: "What if I'm sharing my post with a connected service with a smaller character count?"
+ char_limit_services_a: "In that case you should restrict your post to the smaller character count (140 in the case of Twitter; 1000 in the case of Tumblr), and the number of characters you have left to use is displayed when that service’s icon is highlighted. You can still post to these services if your post is longer than their limit, but the text will be truncated on those services with a link to the post on diaspora*."
format_text_q: "How can I format the text in my posts (bold, italics, etc.)?"
format_text_a: "By using a simplified system called %{markdown}. You can find the full Markdown syntax %{here}. The preview button is really helpful here, as you can see how your message will look before you share it."
insert_images_q: "How do I insert images into posts?"
- insert_images_a: "Click the little camera icon to insert an image into a post. Press the photo icon again to add another photo, or you can select multiple photos to upload in one go."
+ insert_images_a: "Click the little camera icon to insert an image into a post. Press the camera icon again to add another photo, or you can select multiple photos to upload in one go."
insert_images_comments_q: "Can I insert images into comments?"
- insert_images_comments_a1: "The following Markdown code"
+ insert_images_comments_a1: "You cannot upload images into comments, but the following Markdown code"
image_text: "image text"
image_url: "image url"
insert_images_comments_a2: "can be used to insert images from the web into comments as well as posts."
size_of_images_q: "Can I customize the size of images in posts or comments?"
- size_of_images_a: "No. Images are resized automatically to fit the stream. Markdown does not have a code for specifying the size of an image."
+ size_of_images_a: "No. Images are resized automatically to fit the stream or single-post view. Markdown does not have a code for specifying the size of an image."
embed_multimedia_q: "How do I embed a video, audio, or other multimedia content into a post?"
- embed_multimedia_a: "You can usually just paste the URL (e.g. http://www.youtube.com/watch?v=nnnnnnnnnnn ) into your post and the video or audio will be embedded automatically. Some of the sites that are supported are: YouTube, Vimeo, SoundCloud, Flickr and a few more. diaspora* uses oEmbed for this feature. We're supporting new sites all the time. Remember to always post simple, full links: no shortened links; no operators after the base URL; and give it a little time before you refresh the page after posting for seeing the preview."
- character_limit_q: "What is the character limit for posts?"
- character_limit_a: "65,535 characters. That's 65,395 more characters than you get on Twitter! ;)"
- char_limit_services_q: "What is the character limit for posts shared through a connected service with a smaller character count?"
- char_limit_services_a: "In that case your post is limited to the smaller character count (140 in the case of Twitter; 1000 in the case of Tumblr), and the number of characters you have left to use is displayed when that service's icon is highlighted. You can still post to these services if your post is longer than their limit, but the text is truncated on those services."
- stream_full_of_posts_q: "Why is my stream full of posts from people I don't know and don't share with?"
- stream_full_of_posts_a1: "Your stream is made up of three types of posts:"
- stream_full_of_posts_li1: "Posts by people you are sharing with, which come in two types: public posts and limited posts shared with an aspect that you are part of. To remove these posts from your stream, simply stop sharing with the person."
- stream_full_of_posts_li2: "Public posts containing one of the tags that you follow. To remove these, stop following the tag."
- stream_full_of_posts_li3: "Public posts by people listed in the Community Spotlight. These can be removed by unchecking the “Show Community Spotlight in Stream?” option in the Account tab of your Settings."
+ embed_multimedia_a: "You can usually just paste the URL (e.g. http://www.youtube.com/watch?v=nnnnnnnnnnn ) into your post and the video or audio will be embedded automatically. The sites supported include: YouTube, Vimeo, SoundCloud, Flickr and a few more. diaspora* uses oEmbed for this feature. We’re supporting more media sources all the time. Remember to always post simple, full links – no shortened links; no operators after the base URL – and give it a little time before you refresh the page after posting for seeing the preview."
+ post_location_q: "How do I add my location to a post?"
+ post_location_a: "Click the pin icon next to the camera in the publisher. This will insert your location from OpenStreetMap. You can edit your location – you might only want to include the city you’re in rather than the specific street address."
+ post_poll_q: "How do I add a poll to my post?"
+ post_poll_a: "Click the graph icon to generate a poll. Type a question and at least two answers. Don’t forget to make your post public if you want everyone to be able to participate in your poll."
private_posts:
title: "Private posts"
who_sees_post_q: "When I post a message to an aspect (i.e., a private post), who can see it?"
- who_sees_post_a: "Only logged-in diaspora* users you have placed in that aspect can see your private post."
+ who_sees_post_a: "Only logged-in diaspora* users you had placed in that aspect before making the private post can see it."
can_comment_q: "Who can comment on or like my private post?"
- can_comment_a: "Only logged-in diaspora* users you have placed in that aspect can comment on or like your private post."
+ can_comment_a: "Only logged-in diaspora* users you had placed in that aspect before making the private post can comment on or like it."
can_reshare_q: "Who can reshare my private post?"
- can_reshare_a: "Nobody. Private posts are not resharable. Logged-in diaspora* users in that aspect can potentially copy and paste it, however."
+ can_reshare_a: "Nobody. Private posts are not resharable. Logged-in diaspora* users in that aspect can potentially copy and paste it, however. It’s up to you whether you trust those people!"
see_comment_q: "When I comment on or like a private post, who can see it?"
see_comment_a: "Only the people that the post was shared with (the people who are in the aspects selected by the original poster) can see its comments and likes. "
private_profiles:
title: "Private profiles"
who_sees_profile_q: "Who sees my private profile?"
who_sees_profile_a: "Any logged-in user that you are sharing with (meaning, you have added them to one of your aspects). However, people following you, but whom you do not follow, will see only your public information."
- whats_in_profile_q: "What's in my private profile?"
- whats_in_profile_a: "Biography, location, gender, and birthday. It's the stuff in the bottom section of the edit profile page. All this information is optional – it's up to you whether you fill it in. Logged-in users who you have added to your aspects are the only people who can see your private profile. They will also see the private posts that made to the aspect(s) they are in, mixed in with your public posts, when they visit your profile page."
+ whats_in_profile_q: "What’s in my private profile?"
+ whats_in_profile_a: "Your private profile contains your biography, location, gender, and birthday, if you have completed these sections. All this information is optional – it’s up to you whether you provide it. Logged-in users who you have added to your aspects are the only people who can see your private profile. When they visit your profile page they will also see the private posts that made to the aspect(s) they are in, mixed in with your public posts."
who_sees_updates_q: "Who sees updates to my private profile?"
who_sees_updates_a: "Anyone in your aspects sees changes to your private profile. "
public_posts:
title: "Public posts"
who_sees_post_q: "When I post something publicly, who can see it?"
- who_sees_post_a: "Anyone using the internet can potentially see a post you mark public, so make sure you really do want your post to be public. It's a great way of reaching out to the world."
+ who_sees_post_a: "Anyone using the internet can potentially see a post you mark public, so make sure you really do want your post to be public. It’s a great way of reaching out to the world."
find_public_post_q: "How can other people find my public post?"
- find_public_post_a: "Your public posts will appear in the streams of anyone following you. If you included #tags in your public post, anyone following those tags will find your post in their streams. Every public post also has a specific URL that anyone can view, even if they're not logged in - thus public posts may be linked to directly from Twitter, blogs, etc. Public posts may also be indexed by search engines."
+ find_public_post_a: "Your public posts will appear in the streams of anyone following you. If you included #tags in your public post, anyone following those tags will find your post in their streams. Every public post also has a specific URL that anyone can view, even if they’re not logged in – thus public posts may be linked to directly from Twitter, blogs, etc. Public posts may also be indexed by search engines."
can_comment_reshare_like_q: "Who can comment on, reshare, or like my public post?"
can_comment_reshare_like_a: "Any logged-in diaspora* user can comment on, reshare, or like your public post."
see_comment_reshare_like_q: "When I comment on, reshare, or like a public post, who can see it?"
- see_comment_reshare_like_a: "Any logged-in diaspora* user and anyone else on the internet. Comments, likes, and reshares of public posts are also public."
+ see_comment_reshare_like_a: "Comments, likes, and reshares of public posts are also public. Any logged-in diaspora* user and anyone else on the internet can see your interactions with a public post."
deselect_aspect_posting_q: "What happens when I deselect one or more aspects when making a public post?"
- deselect_aspect_posting_a: "Deselecting aspects does not affect a public post. It will still appear in the streams of all of your contacts. To make a post visible only to specific aspects, you need to select those aspects from the button under the publisher."
+ deselect_aspect_posting_a: "Deselecting aspects does not affect a public post. It will still be public and will appear in the streams of all of your contacts. To make a post visible only to specific aspects, you need to select those aspects from the aspect selector under the publisher."
public_profiles:
title: "Public profiles"
who_sees_profile_q: "Who sees my public profile?"
who_sees_profile_a: "Any logged-in diaspora* user, as well as the wider internet, can see it. Each profile has a direct URL, so it may be linked to directly from outside sites. It may be indexed by search engines."
- whats_in_profile_q: "What's in my public profile"
- whats_in_profile_a: "Your name, the five tags you chose to describe yourself, and your photo. It's the stuff in the top section of the edit profile page. You can make this profile information as identifiable or anonymous as you like. Your profile page also shows any public posts you have made."
+ whats_in_profile_q: "What’s in my public profile?"
+ whats_in_profile_a: "Your public profile contains your name, the five tags you chose to describe yourself, and your photo, if you have completed these sections. All this information is optional – it’s up to you whether you provide it. You can make this profile information as identifiable or anonymous as you like. Your profile page also shows any public posts you have made."
who_sees_updates_q: "Who sees updates to my public profile?"
who_sees_updates_a: "Anyone can see changes if they visit your profile page."
what_do_tags_do_q: "What do the tags on my public profile do?"
what_do_tags_do_a: "They help people get to know you. Your profile picture will also appear on the left-hand side of those particular tag pages, along with anyone else who has them in their public profile."
resharing_posts:
title: "Resharing posts"
- reshare_public_post_aspects_q: "Can I reshare a public post with only certain aspects?"
- reshare_public_post_aspects_a: "No, when you reshare a public post it automatically becomes one of your public posts. To share it with certain aspects, copy and paste the contents of the post into a new post."
- reshare_private_post_aspects_q: "Can I reshare a private post with only certain aspects?"
- reshare_private_post_aspects_a: "No, it is not possible to reshare a private post. This is to respect the intentions of the original poster who only shared it with a particular group of people."
+ reshare_public_post_aspects_q: "Can I reshare a public post to selected aspects?"
+ reshare_public_post_aspects_a: "No, when you reshare a public post it automatically becomes one of your public posts. To share it with certain aspects, copy and paste the contents of the post into a new, limited post."
+ reshare_private_post_aspects_q: "Can I reshare a private post to selected aspects?"
+ reshare_private_post_aspects_a: "No, it is not possible to reshare any private post. This is to respect the intentions of the original poster, who shared it only with a particular group of people."
sharing:
title: "Sharing"
- add_to_aspect_q: "What happens when I add someone to one of my aspects? Or when someone adds me to one of their aspects?"
- add_to_aspect_a1: "Let's say that Amy adds Ben to an aspect, but Ben has not (yet) added Amy to an aspect:"
- add_to_aspect_li1: "Ben will receive a notification that Amy has \"started sharing\" with Ben."
- add_to_aspect_li2: "Amy will start to see Ben's public posts in her stream."
- add_to_aspect_li3: "Amy will not see any of Ben's private posts."
- add_to_aspect_li4: "Ben will not see Amy's public or private posts in his stream."
- add_to_aspect_li5: "But if Ben goes to Amy's profile page, then he will see Amy's private posts that she makes to her aspect that has him in it (as well as her public posts which anyone can see there)."
- add_to_aspect_li6: "Ben will be able to see Amy's private profile (bio, location, gender, birthday)."
- add_to_aspect_li7: "Amy will appear under \"Only sharing with me\" on Ben's contacts page."
- add_to_aspect_a2: "This is known as asymmetrical sharing. If and when Ben also adds Amy to an aspect then it would become mutual sharing, with both Amy's and Ben's public posts and relevant private posts appearing in each other's streams, etc. "
- only_sharing_q: "Who are the people listed in \"Only sharing with me\" on my contacts page?"
- only_sharing_a: "These are people that have added you to one of their aspects, but who are not (yet) in any of your aspects. In other words, they are sharing with you, but you are not sharing with them (asymmetrical sharing). If you add them to an aspect, they will then appear under that aspect and not under \"only sharing with you\". See above."
+ add_to_aspect_q: "What happens when I add someone to one of my aspects, or when someone adds me to one of their aspects?"
+ add_to_aspect_a1: "Let’s say that Amy adds Ben to an aspect, but Ben has not (yet) added Amy to an aspect:"
+ add_to_aspect_li1: "Ben will receive a notification that Amy has “started sharing” with Ben."
+ add_to_aspect_li2: "Amy will start to see Ben’s public posts in her stream."
+ add_to_aspect_li3: "Amy will not see any of Ben’s private posts."
+ add_to_aspect_li4: "Ben will not see Amy’s public or private posts in his stream."
+ add_to_aspect_li5: "But if Ben goes to Amy’s profile page, then he will see the private posts that Amy makes to the aspect that she has placed him in (as well as her public posts, which anyone can see there)."
+ add_to_aspect_li6: "Ben will be able to see Amy’s private profile (biography, location, gender, birthday)."
+ add_to_aspect_li7: "Amy will appear under “Only sharing with me” on Ben’s contacts page."
+ add_to_aspect_li8: "Amy will also be able to @mention Ben in a post."
+ add_to_aspect_a2: "This is known as asymmetrical sharing. If and when Ben also adds Amy to an aspect then it would become mutual sharing, with both Amy’s and Ben’s public posts and relevant private posts appearing in each other’s streams, and Amy would be able to view Ben’s private profile. They would then also be able to send each other private messages."
+ sharing_notification_q: "How do I know when someone starts sharing with me?"
+ sharing_notification_a: "You should receive a notification each time someone starts sharing with you."
+ only_sharing_q: "Who are the people listed under “Only sharing with me” on my contacts page?"
+ only_sharing_a: "These are people that have added you to one of their aspects, but who are not (yet) in any of your aspects. In other words, they are sharing with you, but you are not sharing with them: you can think of this as them “following” you. If you add them to an aspect, they will then appear under that aspect and not under “Only sharing with me”. See above."
list_not_sharing_q: "Is there a list of people whom I have added to one of my aspects, but who have not added me to one of theirs?"
- list_not_sharing_a: "No, but you can see whether or not someone is sharing with you by visiting their profile page. If they are, the bar under their profile picture will be green; if not, it'll be grey. You should get a notification each time someone starts sharing with you."
+ list_not_sharing_a: "No, but you can see whether or not someone is sharing with you by visiting their profile page. If they are, the button showing the aspect(s) in which you have placed them will be green; if not, it’ll be gray."
see_old_posts_q: "When I add someone to an aspect, can they see older posts that I have already posted to that aspect?"
see_old_posts_a: "No. They will only be able to see new posts to that aspect. They (and everyone else) can see your older public posts on your profile page, and they may also see them in their stream."
tags:
title: "Tags"
what_are_tags_for_q: "What are tags for?"
- what_are_tags_for_a: "Tags are a way to categorize a post, usually by topic. Searching for a tag shows all posts with that tag that you can see (both public and private posts). This lets people who are interested in a given topic find public posts about it."
+ what_are_tags_for_a: "Tags are a way to categorize a post, usually by topic. Searching for a tag shows all posts, both public and private, with that tag that you have permission to see. This lets people who are interested in a given topic find public posts about it."
tags_in_comments_q: "Can I put tags in comments or just in posts?"
- tags_in_comments_a: "A tag added to a comment will still appear as a link to that tag's page, but it will not make that post (or comment) appear on that tag page. This only works for tags in posts."
- followed_tags_q: "What are \"#Followed Tags\" and how do I follow a tag?"
- followed_tags_a: "After searching for a tag you can click the button at the top of the tag's page to \"follow\" that tag. It will then appear in your list of followed tags on the left. Clicking one of your followed tags takes you to that tag's page so you can see recent posts containing that tag. Click on #Followed Tags to see a stream of posts that include one of any of your followed tags. "
+ tags_in_comments_a: "A tag added to a comment will still appear as a link to that tag’s page, but it will not make that post (or comment) appear on that tag page. This only works for tags in posts."
+ followed_tags_q: "What are “#Followed Tags” and how do I follow a tag?"
+ followed_tags_a: "After searching for a tag you can click the button at the top of the tag’s page to “follow” that tag. It will then appear in your list of followed tags in the left-hand menu. Clicking one of your followed tags takes you to that tag’s page so you can see recent posts containing that tag. Click on #Followed Tags to see a stream of posts that include any one of your followed tags."
people_tag_page_q: "Who are the people listed on the left-hand side of a tag page?"
people_tag_page_a: "They are people who have listed that tag to describe themselves in their public profile."
filter_tags_q: "How can I filter/exclude some tags from my stream?"
filter_tags_a: "This is not yet available directly through diaspora*, but some %{third_party_tools} have been written that might provide this."
keyboard_shortcuts:
+ title: "Keyboard shortcuts"
keyboard_shortcuts_q: "What keyboard shortcuts are available?"
keyboard_shortcuts_a1: "In the stream view you can use the following keyboard shortcuts:"
- keyboard_shortcuts_li1: "j - jump to the next post"
- keyboard_shortcuts_li2: "k - jump to the previous post"
- keyboard_shortcuts_li3: "c - comment on the current post"
- keyboard_shortcuts_li4: "l - like the current post"
- title: "Keyboard shortcuts"
+ keyboard_shortcuts_li1: "j – Jump to the next post"
+ keyboard_shortcuts_li2: "k – Jump to the previous post"
+ keyboard_shortcuts_li3: "c – Comment on the current post"
+ keyboard_shortcuts_li4: "l – Like the current post"
+ keyboard_shortcuts_li5: "r – Reshare the current post"
+ keyboard_shortcuts_li6: "m – Expand the current post"
+ keyboard_shortcuts_li7: "o – Open the first link in the current post"
+ keyboard_shortcuts_li8: "Ctrl+Enter – Send the message you are writing"
miscellaneous:
title: "Miscellaneous"
back_to_top_q: "Is there a quick way to go back to the top of a page after I scroll down?"
- back_to_top_a: "Yes. After scrolling down a page, click on the grey arrow that appears in the bottom right corner of your browser window."
+ back_to_top_a: "Yes. After scrolling down a page, click on the grey arrow that appears in the bottom right-hand corner of your browser window."
photo_albums_q: "Are there photo or video albums?"
- photo_albums_a: "No, not currently. However you can view a stream of their uploaded pictures from the Photos section in the side-bar of their profile page."
- subscribe_feed_q: "Can I subscribe to someone's public posts with a feed reader?"
- subscribe_feed_a: "Yes, but this is still not a polished feature and the formatting of the results is still pretty rough. If you want to try it anyway, go to someone's profile page and click the feed button in your browser, or you can copy the profile URL (i.e. https://joindiaspora.com/people/somenumber), and paste it into a feed reader. The resulting feed address looks like this: https://joindiaspora.com/public/username.atom – diaspora* uses Atom rather than RSS."
+ photo_albums_a: "No, not currently. However you can view a person’s uploaded pictures under the Photos tab of their profile page."
+ subscribe_feed_q: "Can I subscribe to someone’s public posts with a feed reader?"
+ subscribe_feed_a: "Yes, but this is still not a polished feature and the formatting of the results is still pretty rough. If you want to try it anyway, go to someone’s profile page and click the feed button in your browser, or you can copy the profile URL (e.g. https://podname.org/people/somenumber) and paste it into a feed reader. The resulting feed address looks like this: https://podname.org/public/username.atom – diaspora* uses Atom rather than RSS."
diaspora_app_q: "Is there a diaspora* app for Android or iOS?"
- diaspora_app_a: "There are several Android apps in very early development. Several are long-abandoned projects and so do not work well with the current version of diaspora*. Don't expect much from these apps at the moment. Currently the best way to access diaspora* from your mobile device is through a browser, because we've designed a mobile version of the site which should work well on all devices. There is currently no app for iOS. Again, diaspora* should work fine via your browser."
+ diaspora_app_a: "There have been several Android apps in development by community members. Some are long-abandoned projects and so do not work well with the current version of diaspora*. Don’t expect much from these apps at the moment. There is currently no app for iOS. The best way to access diaspora* from your mobile device is through a browser, because we’ve designed a mobile version of the site which should work well on all devices, although it does not yet have complete functionality."
invitation_codes:
excited: "%{name} is excited to see you here."
@@ -594,7 +597,7 @@ en:
no_more: "You have no more invitations."
already_sent: "You already invited this person."
already_contacts: "You are already connected with this person"
- own_address: "You can't send an invitation to your own address."
+ own_address: "You can’t send an invitation to your own address."
empty: "Please enter at least one email address."
note_already_sent: "Invitations have already been sent to: %{emails}"
new:
@@ -630,33 +633,33 @@ en:
settings: "Settings"
help: "Help"
logout: "Log out"
- blog: "blog"
- login: "log in"
- code: "code"
- admin: "admin"
+ blog: "Blog"
+ login: "Log in"
+ code: "Code"
+ admin: "Admin"
view_all: "View all"
recent_notifications: "Recent notifications"
application:
- powered_by: "POWERED BY diaspora*"
- whats_new: "what's new?"
- toggle: "toggle mobile"
+ powered_by: "Powered by diaspora*"
+ whats_new: "What’s new?"
+ toggle: "Toggle mobile"
public_feed: "Public diaspora* feed for %{name}"
- your_aspects: "your aspects"
+ your_aspects: "Your aspects"
back_to_top: "Back to top"
- source_package: "download the source code package"
+ source_package: "Download the source code package"
likes:
likes:
people_like_this:
- zero: "no likes"
+ zero: "No likes"
one: "%{count} like"
other: "%{count} likes"
people_like_this_comment:
- zero: "no likes"
+ zero: "No likes"
one: "%{count} like"
other: "%{count} likes"
people_dislike_this:
- zero: "no dislikes"
+ zero: "No dislikes"
one: "%{count} dislike"
other: "%{count} dislikes"
@@ -674,9 +677,9 @@ en:
one: "%{actors} commented on your post %{post_link}."
other: "%{actors} commented on your post %{post_link}."
also_commented:
- zero: "%{actors} also commented on %{post_author}'s post %{post_link}."
- one: "%{actors} also commented on %{post_author}'s post %{post_link}."
- other: "%{actors} also commented on %{post_author}'s post %{post_link}."
+ zero: "%{actors} also commented on %{post_author}’s post %{post_link}."
+ one: "%{actors} also commented on %{post_author}’s post %{post_link}."
+ other: "%{actors} also commented on %{post_author}’s post %{post_link}."
mentioned:
zero: "%{actors} have mentioned you in the post %{post_link}."
one: "%{actors} has mentioned you in the post %{post_link}."
@@ -712,8 +715,8 @@ en:
mark_all_shown_as_read: "Mark all shown as read"
mark_read: "Mark read"
mark_unread: "Mark unread"
- show_all: "show all"
- show_unread: "show unread"
+ show_all: "Show all"
+ show_unread: "Show unread"
all_notifications: "All Notifications"
also_commented: "Also commented"
comment_on_post: "Comment on post"
@@ -721,11 +724,12 @@ en:
mentioned: "Mentioned"
reshared: "Reshared"
started_sharing: "Started sharing"
+ no_notifications: "You don't have any notifications yet."
and_others:
zero: "and nobody else"
one: "and one more"
other: "and %{count} others"
- and: 'and'
+ and: "and"
helper:
new_notifications:
zero: "No new notifications"
@@ -734,8 +738,10 @@ en:
notifier:
a_post_you_shared: "a post."
+ a_private_message: "There’s a new private message in diaspora* for you to check out."
+ a_limited_post_comment: "There’s a new comment on a limited post in diaspora* for you to check out."
email_sent_by_diaspora: "This email was sent by %{pod_name}. If you'd like to stop getting emails like this,"
- click_here: "click here"
+ click_here: "Click here"
hello: "Hello %{name}!"
thanks: "Thanks,"
to_change_your_notification_settings: "to change your notification settings"
@@ -745,9 +751,9 @@ en:
started_sharing:
subject: "%{name} started sharing with you on diaspora*"
sharing: "has started sharing with you!"
- view_profile: "View %{name}'s profile"
+ view_profile: "View %{name}’s profile"
comment_on_post:
- reply: "Reply or view %{name}'s post >"
+ reply: "Reply or view %{name}’s post >"
mentioned:
subject: "%{name} has mentioned you on diaspora*"
mentioned: "mentioned you in a post:"
@@ -782,7 +788,49 @@ en:
The diaspora* email robot!
[1]: %{url}
- accept_invite: "Accept Your diaspora* invite!"
+ export_email:
+ subject: "Your personal data is ready for download, %{name}"
+ body: |-
+ Hello %{name},
+
+ Your data has been processed and is ready for download by following [this link](%{url}).
+
+ Cheers,
+
+ The diaspora* email robot!
+ export_failure_email:
+ subject: "We’re sorry, there was an issue with your data, %{name}"
+ body: |-
+ Hello %{name}
+
+ We’ve encountered an issue while processing your personal data for download.
+ Please try again!
+
+ Sorry,
+
+ The diaspora* email robot!
+ export_photos_email:
+ subject: "Your photos are ready for download, %{name}"
+ body: |-
+ Hello %{name},
+
+ Your photos have been processed and are ready for download by following [this link](%{url}).
+
+ Cheers,
+
+ The diaspora* email robot!
+ export_photos_failure_email:
+ subject: "There was an issue with your photos, %{name}"
+ body: |-
+ Hello %{name}
+
+ We’ve encountered an issue while processing your photos for download.
+ Please try again!
+
+ Sorry,
+
+ The diaspora* email robot!
+ accept_invite: "Accept your diaspora* invite!"
invited_you: "%{name} invited you to diaspora*"
invite:
message: |-
@@ -800,29 +848,42 @@ en:
The diaspora* email robot!
[1]: %{invite_url}
+ remove_old_user:
+ subject: "Your diaspora* account has been flagged for removal due to inactivity"
+ body: |-
+ Hello,
+
+ It looks as though you no longer want your account at %{pod_url}, as you haven’t used it for %{after_days} days. To ensure our active users get the best performance from this diaspora* pod, we’d like to remove unwanted accounts from our database.
+
+ We’d love you to stay part of diaspora*’s community, and you’re welcome to keep your account live if you want to.
+
+ If you want to keep your account live, all you need to do is to sign in to your account before %{remove_after}. When you sign in, take a moment to have a look around diaspora*. It has changed a lot since you last looked in, and we think you’ll like the improvements we’ve made. Follow some #tags to find content you love.
+
+ Sign in here: %{login_url}. If you’ve forgotten your sign-in details, you can ask for a reminder on that page.
+
+ Hoping to see you again,
+
+ The diaspora* email robot!
people:
- zero: "no people"
+ zero: "No people"
one: "1 person"
- two: "%{count} people"
- few: "%{count} people"
- many: "%{count} people"
other: "%{count} people"
person:
pending_request: "Pending request"
already_connected: "Already connected"
- thats_you: "That's you!"
- add_contact: "add contact"
+ thats_you: "That’s you!"
+ add_contact: "Add contact"
index:
results_for: "Users matching %{search_term}"
no_results: "Hey! You need to search for something."
- couldnt_find_them: "Couldn't find them?"
+ couldnt_find_them: "Couldn’t find them?"
search_handle: "Use their diaspora* ID (username@pod.tld) to be sure to find your friends."
send_invite: "Still nothing? Send an invite!"
no_one_found: "...and no one was found."
- searching: "searching, please be patient..."
+ searching: "Searching, please be patient..."
looking_for: "Looking for posts tagged %{tag_link}?"
webfinger:
- fail: "Sorry, we couldn't find %{handle}."
+ fail: "Sorry, we couldn’t find %{handle}."
show:
has_not_shared_with_you_yet: "%{name} has not shared any posts with you yet!"
incoming_request: "%{name} wants to share with you"
@@ -830,56 +891,56 @@ en:
to_accept_or_ignore: "to accept or ignore it."
does_not_exist: "Person does not exist!"
not_connected: "You are not sharing with this person"
- recent_posts: "Recent Posts"
- recent_public_posts: "Recent Public Posts"
+ recent_posts: "Recent posts"
+ recent_public_posts: "Recent public posts"
see_all: "See all"
- start_sharing: "start sharing"
+ start_sharing: "Start sharing"
message: "Message"
mention: "Mention"
ignoring: "You are ignoring all posts from %{name}."
closed_account: "This account has been closed."
sub_header:
- you_have_no_tags: "you have no tags!"
- add_some: "add some"
- edit: "edit"
+ you_have_no_tags: "You have no tags!"
+ add_some: "Add some"
+ edit: "Edit"
profile_sidebar:
- remove_contact: "remove contact"
+ remove_contact: "Remove contact"
edit_my_profile: "Edit my profile"
bio: "Bio"
location: "Location"
gender: "Gender"
born: "Birthday"
photos: "Photos"
- in_aspects: "in aspects"
+ in_aspects: "In aspects"
remove_from: "Remove %{name} from %{aspect}?"
helper:
results_for: " results for %{params}"
is_sharing: "%{name} is sharing with you"
is_not_sharing: "%{name} is not sharing with you"
aspect_list:
- edit_membership: "edit aspect membership"
+ edit_membership: "Edit aspect membership"
add_contact_small:
- add_contact_from_tag: "add contact from tag"
+ add_contact_from_tag: "Add contact from tag"
add_contact:
- invited_by: "you were invited by"
+ invited_by: "You were invited by"
photos:
show:
- delete_photo: "Delete Photo"
- make_profile_photo: "make profile photo"
- update_photo: "Update Photo"
- edit: "edit"
+ delete_photo: "Delete photo"
+ make_profile_photo: "Make profile photo"
+ update_photo: "Update photo"
+ edit: "Edit"
edit_delete_photo: "Edit photo description / delete photo"
- collection_permalink: "collection permalink"
+ collection_permalink: "Collection permalink"
show_original_post: "Show original post"
edit:
editing: "Editing"
photo:
- view_all: "view all of %{name}'s photos"
+ view_all: "View all of %{name}’s photos"
new:
- new_photo: "New Photo"
- back_to_list: "Back to List"
- post_it: "post it!"
+ new_photo: "New photo"
+ back_to_list: "Back to list"
+ post_it: "Post it!"
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?"
@@ -896,15 +957,15 @@ en:
new_profile_photo:
upload: "Upload a new profile photo!"
or_select_one_existing: "or select one from your already existing %{photos}"
- comment_email_subject: "%{name}'s photo"
+ comment_email_subject: "%{name}’s photo"
posts:
presenter:
title: "A post from %{name}"
show:
destroy: "Delete"
- permalink: "permalink"
- not_found: "Sorry, we couldn't find that post."
+ permalink: "Permalink"
+ not_found: "Sorry, we couldn’t find that post."
photos_by:
zero: "No photos by %{author}"
one: "One photo by %{author}"
@@ -912,7 +973,7 @@ en:
reshare_by: "Reshare by %{author}"
report:
- title: "Reports Overview"
+ title: "Reports overview"
post_label: "<b>Post</b>: %{title}"
comment_label: "<b>Comment</b>:<br>%{data}"
reported_label: "<b>Reported by</b> %{person}"
@@ -920,7 +981,7 @@ en:
review_link: "Mark as reviewed"
delete_link: "Delete item"
confirm_deletion: "Are you sure to delete the item?"
- not_found: "<u>The post/comment was not found. It seams that it was deleted by the user!</u>"
+ not_found: "<u>The post/comment was not found. It seems that it was deleted by the user!</u>"
status:
marked: "The report was marked as reviewed"
destroyed: "The post was destroyed"
@@ -929,8 +990,8 @@ en:
share_visibilites:
update:
- post_hidden_and_muted: "%{name}'s post has been hidden, and notifications have been muted."
- see_it_on_their_profile: "If you want to see updates on this post, visit %{name}'s profile page."
+ post_hidden_and_muted: "%{name}’s post has been hidden, and notifications have been muted."
+ see_it_on_their_profile: "If you want to see updates on this post, visit %{name}’s profile page."
profiles:
edit:
@@ -943,7 +1004,7 @@ en:
your_birthday: "Your birthday"
your_tags: "Describe yourself in 5 words"
- your_tags_placeholder: "like #movies #kittens #travel #teacher #newyork"
+ your_tags_placeholder: "Like #movies #kittens #travel #teacher #newyork"
your_bio: "Your bio"
your_location: "Your location"
@@ -951,7 +1012,7 @@ en:
update_profile: "Update profile"
allow_search: "Allow for people to search for you within diaspora*"
edit_profile: "Edit profile"
- nsfw_explanation: "NSFW (‘not safe for work’) is diaspora*’s self-governing community standard for content which may not be suitable to view while at work. If you plan to share such material frequently, please check this option so that everything you share will be hidden from people’s streams unless they choose to view them."
+ nsfw_explanation: "NSFW (“not safe for work”) is diaspora*’s self-governing community standard for content which may not be suitable to view while at work. If you plan to share such material frequently, please check this option so that everything you share will be hidden from people’s streams unless they choose to view them."
nsfw_explanation2: "If you choose not to select this option, please add the #nsfw tag each time you share such material."
nsfw_check: "Mark everything I share as NSFW"
update:
@@ -963,28 +1024,25 @@ en:
create_my_account: "Create my account!"
join_the_movement: "Join the movement!"
- sign_up_message: "Social Networking with a ♥"
+ sign_up_message: "Social networking with a ♥"
enter_email: "Enter an email"
enter_username: "Pick a username (only letters, numbers, and underscores)"
enter_password: "Enter a password (six character minimum)"
enter_password_again: "Enter the same password as before"
- hey_make: "HEY,<br/>MAKE<br/>SOMETHING."
- diaspora: "<3 diaspora*"
- sign_up: "SIGN UP"
- email: "EMAIL"
- username: "USERNAME"
- password: "PASSWORD"
- password_confirmation: "PASSWORD CONFIRMATION"
- continue: "Continue"
+ sign_up: "Sign up"
+ email: "Email"
+ username: "Username"
+ password: "Password"
+ password_confirmation: "Password confirmation"
submitting: "Submitting..."
terms: "By creating an account you accept the %{terms_link}."
terms_link: "terms of service"
create:
- success: "You've joined diaspora*!"
+ success: "You’ve joined diaspora*!"
edit:
edit: "Edit %{name}"
- leave_blank: "(leave blank if you don't want to change it)"
+ leave_blank: "(leave blank if you don’t want to change it)"
password_to_confirm: "(we need your current password to confirm your changes)"
unhappy: "Unhappy?"
update: "Update"
@@ -1002,40 +1060,40 @@ en:
ignore: "Ignored contact request."
create:
sending: "Sending"
- sent: "You've asked to share with %{name}. They should see it next time they log in to diaspora*."
+ sent: "You’ve asked to share with %{name}. They should see it next time they log in to diaspora*."
new_request_to_person:
- sent: "sent!"
+ sent: "Sent!"
helper:
new_requests:
- zero: "no new requests"
- one: "new request!"
+ zero: "No new requests"
+ one: "New request!"
other: "%{count} new requests!"
reshares:
reshare:
- reshared_via: "reshared via"
+ reshared_via: "Reshared via"
reshare_original: "Reshare original"
reshare:
zero: "Reshare"
one: "1 reshare"
other: "%{count} reshares"
show_original: "Show original"
- reshare_confirmation: "Reshare %{author}'s post?"
+ reshare_confirmation: "Reshare %{author}’s post?"
deleted: "Original post deleted by author."
create:
failure: "There was an error resharing this post."
- comment_email_subject: "%{resharer}'s reshare of %{author}'s post"
+ comment_email_subject: "%{resharer}’s reshare of %{author}’s post"
services:
index:
- logged_in_as: "logged in as"
- disconnect: "disconnect"
- really_disconnect: "disconnect %{service}?"
+ logged_in_as: "Logged in as"
+ disconnect: "Disconnect"
+ really_disconnect: "Disconnect %{service}?"
connect_to_twitter: "Connect to Twitter"
connect_to_facebook: "Connect to Facebook"
connect_to_tumblr: "Connect to Tumblr"
- connect_to_wordpress: "Connect to Wordpress"
+ connect_to_wordpress: "Connect to WordPress"
edit_services: "Edit services"
- no_services: 'You have not connected any services yet.'
- services_explanation: 'Connecting to services gives you the ability to publish your posts to them as you write them in diaspora*.'
+ no_services: "You have not connected any services yet."
+ services_explanation: "Connecting to services gives you the ability to publish your posts to them as you write them in diaspora*."
create:
success: "Authentication successful."
failure: "Authentication failed."
@@ -1044,30 +1102,32 @@ en:
destroy:
success: "Successfully deleted authentication."
failure:
- error: "there was an error connecting that service"
+ error: "There was an error connecting to that service"
inviter:
join_me_on_diaspora: "Join me on diaspora*"
click_link_to_accept_invitation: "Follow this link to accept your invitation"
finder:
fetching_contacts: "diaspora* is populating your %{service} friends, please check back in a few minutes."
- service_friends: "%{service} Friends"
+ service_friends: "%{service} friends"
no_friends: "No Facebook friends found."
remote_friend:
- resend: "resend"
- invite: "invite"
+ resend: "Resend"
+ invite: "Invite"
not_on_diaspora: "Not yet on diaspora*"
blocks:
create:
- success: "Alright, you won't see that user in your stream again. #silencio!"
- failure: "I couldn't ignore that user. #evasion"
+ success: "All right, you won’t see that user in your stream again. #silencio!"
+ failure: "I couldn’t ignore that user. #evasion"
destroy:
- success: "Let's see what they have to say! #sayhello"
- failure: "I couldn't stop ignoring that user. #evasion"
+ success: "Let’s see what they have to say! #sayhello"
+ failure: "I couldn’t stop ignoring that user. #evasion"
shared:
aspect_dropdown:
add_to_aspect: "Add contact"
+ mobile_row_checked: "%{name} (remove)"
+ mobile_row_unchecked: "%{name} (add)"
toggle:
zero: "Add contact"
one: "In %{count} aspect"
@@ -1078,20 +1138,20 @@ en:
share: "Share"
preview: "Preview"
post_a_message_to: "Post a message to %{aspect}"
- make_public: "make public"
- all: "all"
+ make_public: "Make public"
+ all: "All"
upload_photos: "Upload photos"
get_location: "Get your location"
remove_location: "Remove location"
- all_contacts: "all contacts"
- share_with: "share with"
- whats_on_your_mind: "What's on your mind?"
- publishing_to: "publishing to: "
+ all_contacts: "All contacts"
+ share_with: "Share with"
+ whats_on_your_mind: "What’s on your mind?"
+ publishing_to: "Publishing to: "
discard_post: "Discard post"
new_user_prefill:
- newhere: "NewHere"
- hello: "Hey everyone, I'm #%{new_user_tag}. "
- i_like: "I'm interested in %{tags}. "
+ newhere: "newhere"
+ hello: "Hey everyone, I’m #%{new_user_tag}. "
+ i_like: "I’m interested in %{tags}. "
invited_by: "Thanks for the invite, "
poll:
remove_poll_answer: "Remove option"
@@ -1110,7 +1170,7 @@ en:
invites: "Invites"
invite_someone: "Invite someone"
invitations_left: "%{count} left"
- dont_have_now: "You don't have any right now, but more invites are coming soon!"
+ dont_have_now: "You don’t have any right now, but more invites are coming soon!"
invites_closed: "Invites are currently closed on this diaspora* pod"
invite_your_friends: "Invite your friends"
from_facebook: "From Facebook"
@@ -1119,13 +1179,13 @@ en:
reshare:
reshare: "Reshare"
public_explain:
- control_your_audience: "Control your Audience"
+ control_your_audience: "Control your audience"
new_user_welcome_message: "Use #hashtags to classify your posts and find people who share your interests. Call out awesome people with @Mentions"
visibility_dropdown: "Use this dropdown to change visibility of your post. (We suggest you make this first one public.)"
title: "Set up connected services"
share: "Share"
outside: "Public messages will be available for others outside of diaspora* to see."
- logged_in: "logged in to %{service}"
+ logged_in: "Logged in to %{service}"
manage: "Manage connected services"
atom_feed: "Atom feed"
notification:
@@ -1135,9 +1195,9 @@ en:
stream_element:
viewable_to_anyone: "This post is viewable to anyone on the web"
connect_to_comment: "Connect to this user to comment on their post"
- currently_unavailable: 'commenting currently unavailable'
- via: "via %{link}"
- via_mobile: "via mobile"
+ currently_unavailable: "Commenting currently unavailable"
+ via: "Via %{link}"
+ via_mobile: "Via mobile"
ignore_user: "Ignore %{name}"
ignore_user_description: "Ignore and remove user from all aspects?"
hide_and_mute: "Hide and mute post"
@@ -1146,10 +1206,10 @@ en:
dislike: "Dislike"
shared_with: "Shared with: %{aspect_names}"
nsfw: "This post has been flagged as NSFW by its author. %{link}"
- show: "show"
+ show: "Show"
footer:
- logged_in_as: "logged in as %{name}"
- your_aspects: "your aspects"
+ logged_in_as: "Logged in as %{name}"
+ your_aspects: "Your aspects"
status_messages:
new:
mentioning: "Mentioning: %{person}"
@@ -1159,10 +1219,7 @@ en:
no_message_to_display: "No message to display."
destroy:
failure: "Failed to delete post"
- too_long:
- zero: "please make your status messages less than %{count} characters"
- one: "please make your status messages less than %{count} characters"
- other: "please make your status messages less than %{count} characters"
+ too_long: "Please make your status message fewer than %{count} characters. Right now it is %{current_length} characters"
stream_helper:
show_comments:
@@ -1170,49 +1227,50 @@ en:
one: "Show one more comment"
other: "Show %{count} more comments"
hide_comments: "Hide all comments"
+ no_more_posts: "You have reached the end of the stream."
+ no_posts_yet: "There are no posts yet."
tags:
show:
- posts_tagged_with: "Posts tagged with #%{tag}"
- nobody_talking: "Nobody is talking about %{tag} yet."
- people_tagged_with: "People tagged with %{tag}"
+ tagged_people:
+ zero: "No one tagged with %{tag}"
+ one: "1 person tagged with %{tag}"
+ other: "%{count} people tagged with %{tag}"
follow: "Follow #%{tag}"
following: "Following #%{tag}"
- stop_following: "Stop Following #%{tag}"
- followed_by_people:
- zero: "followed by nobody"
- one: "followed by one person"
- other: "followed by %{count} people"
+ stop_following: "Stop following #%{tag}"
none: "The empty tag does not exist!"
+ name_too_long: "Please make your tag name fewer than %{count} characters. Right now it is %{current_length} characters"
+
tag_followings:
create:
- success: "Hooray! You're now following #%{name}."
+ success: "Hooray! You’re now following #%{name}."
failure: "Failed to follow #%{name}. Are you already following it?"
none: "You cannot follow a blank tag!"
destroy:
- success: "Alas! You aren't following #%{name} anymore."
+ success: "Alas! You aren’t following #%{name} any more."
failure: "Failed to stop following #%{name}. Maybe you already stopped following it?"
streams:
- community_spotlight_stream: "Community Spotlight"
+ community_spotlight_stream: "Community spotlight"
aspects_stream: "Aspects"
mentioned_stream: "@Mentions"
- followed_tags_stream: "#Followed Tags"
+ followed_tags_stream: "#Followed tags"
mentions:
title: "@Mentions"
contacts_title: "People who mentioned you"
comment_stream:
- title: "Commented Posts"
+ title: "Commented posts"
contacts_title: "People whose posts you commented on"
like_stream:
- title: "Like Stream"
+ title: "Like stream"
contacts_title: "People whose posts you like"
followed_tag:
- title: "#Followed Tags"
+ title: "#Followed tags"
contacts_title: "People who dig these tags"
add_a_tag: "Add a tag"
follow: "Follow"
@@ -1220,90 +1278,95 @@ en:
tags:
title: "Posts tagged: %{tags}"
contacts_title: "People who dig this tag"
- tag_prefill_text: "The thing about %{tag_name} is... "
public:
- title: "Public Activity"
- contacts_title: "Recent Posters"
+ title: "Public activity"
+ contacts_title: "Recent posters"
multi:
title: "Stream"
- contacts_title: "People in your Stream"
+ contacts_title: "People in your stream"
aspects:
- title: "My Aspects"
+ title: "My aspects"
activity:
- title: "My Activity"
+ title: "My activity"
users:
edit:
- export_data: "Export data"
- photo_export_unavailable: "Photo exporting currently unavailable"
- close_account_text: "Close account"
- change_language: "Change language"
- change_password: "Change password"
+ edit_account: "Edit account"
+ change: "Change"
+ your_handle: "Your diaspora* ID"
+ your_email: "Your email"
change_email: "Change email"
+ email_awaiting_confirmation: "We have sent you an activation link to %{unconfirmed_email}. Until you follow this link and activate the new address, we will continue to use your original address %{email}."
+ change_password: "Change password"
new_password: "New password"
current_password: "Current password"
current_password_expl: "the one you sign in with..."
character_minimum_expl: "must be at least six characters"
- download_xml: "download my xml"
- download_photos: "download my photos"
- your_handle: "Your diaspora* ID"
- your_email: "Your email"
- edit_account: "Edit account"
+ change_language: "Change language"
+ close_account_text: "Close account"
+ stream_preferences: "Stream preferences"
+ show_community_spotlight: "Show “community spotlight” in stream"
+ show_getting_started: "Show “getting started” hints"
+ getting_started: "New user preferences"
+ following: "Sharing settings"
+ auto_follow_back: "Automatically share with users who start sharing with you"
+ auto_follow_aspect: "Aspect for users you automatically share with:"
receive_email_notifications: "Receive email notifications when:"
started_sharing: "someone starts sharing with you"
- someone_reported: "someone sent a report"
+ someone_reported: "someone sends a report"
mentioned: "you are mentioned in a post"
liked: "someone likes your post"
reshared: "someone reshares your post"
comment_on_post: "someone comments on your post"
- also_commented: "someone comments on a post you've commented on"
+ also_commented: "someone comments on a post you’ve commented on"
private_message: "you receive a private message"
- change: "Change"
- email_awaiting_confirmation: "We have sent you an activation link to %{unconfirmed_email}. Until you follow this link and activate the new address, we will continue to use your original address %{email}."
- stream_preferences: "Stream preferences"
- show_community_spotlight: "Show Community Spotlight in stream"
- show_getting_started: 'Show Getting Started hints'
- getting_started: 'New user preferences'
- following: "Sharing settings"
- auto_follow_back: "Automatically share with users who start sharing with you"
- auto_follow_aspect: "Aspect for automatically added contacts:"
+ download_export: "Download my profile"
+ request_export: "Request my profile data"
+ request_export_update: "Refresh my profile data"
+ export_data: "Export data"
+ export_in_progress: "We are currently processing your data. Please check back in a few moments."
+ last_exported_at: "(Last updated at %{timestamp})"
+ download_export_photos: "Download my photos"
+ request_export_photos: "Request my photos"
+ request_export_photos_update: "Refresh my photos"
+ download_photos: "Download my photos"
+ export_photos_in_progress: "We are currently processing your photos. Please check back in a few moments."
close_account:
- dont_go: "Hey, please don't go!"
- make_diaspora_better: "We want you to help us make diaspora* better, so you should help us out instead of leaving. If you do want to leave, we want you to know what happens next."
- mr_wiggles: 'Mr Wiggles will be sad to see you go'
- what_we_delete: "We will delete all of your posts and profile data as soon as humanly possible. Your comments will hang around, but they would be associated with your diaspora* ID instead of your name."
- locked_out: "You will get signed out and locked out of your account."
- lock_username: "This will lock your username if you decided to sign back up."
- no_turning_back: "Currently, there is no turning back."
- if_you_want_this: "If you really want this, type in your password below and click 'Close Account'"
+ dont_go: "Hey, please don’t go!"
+ make_diaspora_better: "We’d love you to stay and help us make diaspora* better instead of leaving. If you really do want to leave, however, here’s what will happen next:"
+ mr_wiggles: "Mr Wiggles will be sad to see you go"
+ what_we_delete: "We will delete all of your posts and profile data as soon as possible. Your comments on other people’s posts will still appear, but they will be associated with your diaspora* ID rather than your name."
+ locked_out: "You will get signed out and locked out of your account until it has been deleted."
+ lock_username: "Your username will be locked. You will not be able create a new account on this pod with the same ID."
+ no_turning_back: "There is no turning back! If you’re really sure, enter your password below."
+ if_you_want_this: "If you really want this to happen, type in your password below and click “Close account”"
privacy_settings:
- title: "Privacy Settings"
- ignored_users: "Ignored Users"
- stop_ignoring: "Stop ignoring"
+ title: "Privacy settings"
+ strip_exif: "Strip metadata such as location, author, and camera model from uploaded images (recommended)"
+ ignored_users: "Ignored users"
+ stop_ignoring: "stop ignoring"
+ no_user_ignored_message: "You are not currently ignoring any other user"
destroy:
- success: "Your account has been locked. It may take 20 minutes for us to finish closing your account. Thank you for trying diaspora*."
+ success: "Your account has been locked. It may take 20 minutes for us to finish closing your account. Thank you for trying diaspora*."
no_password: "Please enter your current password to close your account."
- wrong_password: "The entered password didn't match your current password."
+ wrong_password: "The entered password didn’t match your current password."
+
getting_started:
well_hello_there: "Well, hello there!"
- community_welcome: "diaspora*'s community is happy to have you aboard!"
-
+ community_welcome: "diaspora*’s community is happy to have you aboard!"
awesome_take_me_to_diaspora: "Awesome! Take me to diaspora*"
-
who_are_you: "Who are you?"
connect_to_facebook: "We can speed things up a bit by %{link} to diaspora*. This will pull your name and photo, and enable cross-posting."
- connect_to_facebook_link: "hooking up your Facebook account"
-
+ connect_to_facebook_link: "Hooking up your Facebook account"
what_are_you_in_to: "What are you into?"
- hashtag_explanation: "Hashtags allow you to talk about and follow your interests. They're also a great way to find new people on diaspora*."
+ hashtag_explanation: "Hashtags allow you to talk about and follow your interests. They’re also a great way to find new people on diaspora*."
hashtag_suggestions: "Try following tags like #art, #movies, #gif, etc."
-
saved: "Saved!"
update:
@@ -1332,10 +1395,10 @@ en:
next_label: "next &raquo;"
webfinger:
- fetch_failed: "failed to fetch webfinger profile for %{profile_url}"
- hcard_fetch_failed: "there was a problem fetching the hcard for %{account}"
- xrd_fetch_failed: "there was an error getting the xrd from account %{account}"
- not_enabled: "webfinger does not seem to be enabled for %{account}'s host"
+ fetch_failed: "Failed to fetch webfinger profile for %{profile_url}"
+ hcard_fetch_failed: "There was a problem fetching the hcard for %{account}"
+ xrd_fetch_failed: "There was an error getting the xrd from account %{account}"
+ not_enabled: "Webfinger does not seem to be enabled for %{account}’s host"
no_person_constructed: "No person could be constructed from this hcard."
simple_captcha:
@@ -1345,3 +1408,19 @@ en:
default: "The secret code did not match with the image"
user: "The secret image and code were different"
failed: "Human verification failed"
+
+ statistics:
+ name: "Name"
+ network: "Network"
+ services: "Services"
+ total_users: "Total users"
+ active_users_halfyear: "Active users half year"
+ active_users_monthly: "Active users monthly"
+ local_posts: "Local posts"
+ local_comments: "Local comments"
+ version: "Version"
+ registrations: "Registrations"
+ enabled: "Available"
+ disabled: "Not available"
+ open: "Open"
+ closed: "Closed"
diff --git a/config/locales/diaspora/en_1337.yml b/config/locales/diaspora/en_1337.yml
index 6b7405fa0..43b91c9a6 100644
--- a/config/locales/diaspora/en_1337.yml
+++ b/config/locales/diaspora/en_1337.yml
@@ -58,8 +58,6 @@ en_1337:
add_to_aspect:
failure: "F41L3D 2 4DD N00B!"
success: "N00B 4DD3D"
- aspect_contacts:
- done_editing: "D0N3 3D171NG!"
aspect_listings:
add_an_aspect: "+ 4DD 4N 45P3C7"
edit_aspect: "3D17 %{name}"
@@ -73,21 +71,14 @@ en_1337:
failure: "%{name} N07 3MP7Y -> F41L!"
success: "%{name} G07 5UCC35FULLY PWND!"
edit:
- add_existing: "4DD 4 KN0WN N00B"
aspect_list_is_not_visible: "45P3C7 L157 15 H1DD3N 2 07H3R5 1N 45P3C7!"
aspect_list_is_visible: "45P3C7 L157 15 V151BL3 2 07H3R5 1N 45P3C7!"
confirm_remove_aspect: "5UR3?"
- done: "K"
make_aspect_list_visible: "M4K3 N00B5 V151BL3 2 34CH 07H3R?"
remove_aspect: "D3L373 7H15 45P3C7!"
rename: "R3N4M3"
update: "UPD473"
updating: "UPD471NG..."
- few: "%{count} 45P3C75"
- helper:
- are_you_sure: "5UR3?"
- aspect_not_empty: "45P3C7 N07 3MP7Y!"
- remove: "R3M0V3"
index:
diaspora_id:
content_1: "Y0UR D* 1D 15:"
@@ -114,11 +105,6 @@ en_1337:
content: "U C4N C0NN3C7 7H3 F0LL0W1NG 53RV1C35 2 D*:"
heading: "C0NN3C7 53RV1C35"
unfollow_tag: "570P F0LL0W1NG #%{tag}"
- many: "%{count} 45P3C75"
- move_contact:
- error: "3RR0R M0V1NG N00B: %{inspect}"
- failure: "PWND %{inspect}"
- success: "N00B M0V3D 2 N3W 45P3C7!"
new:
create: "CR3473"
name: "N4M3 (JU57 F0R U)"
@@ -134,13 +120,6 @@ en_1337:
family: "RL"
friends: "N00B5"
work: "RL-N00B5"
- selected_contacts:
- manage_your_aspects: "M4N4G3 Y0UR 45P3C75!"
- no_contacts: "U D0N7 H4V3 4NY N00B5 H3R3!"
- view_all_contacts: "V13W 4LL N00B5!"
- show:
- edit_aspect: "3D17 45P3C7"
- two: "%{count} 45P3C75"
update:
failure: "45P3C7 %{name} H4D 2 L0NG N4M3 -> F41L!"
success: "45P3C7 %{name} H45 B33N 5UCC35FULLY 3D173D!"
@@ -153,45 +132,34 @@ en_1337:
post_success: "5P4MM3D! CL051NG!"
cancel: "c4nc3l"
comments:
- few: "%{count} 5P4M5"
- many: "%{count} 5P4M5"
new_comment:
comment: "5P4M"
commenting: "5P4MM1NG..."
one: "1 5P4M"
other: "%{count} 5P4M5"
- two: "%{count} 5P4M5"
zero: "N0 5P4M5"
contacts:
create:
failure: "F41L3D 2 CR3473 C0N74C7!"
- few: "%{count} N00B5"
index:
add_a_new_aspect: "4DD 4 N3W 45P3C7!"
add_to_aspect: "4DD N00B5 2: %{name}"
- add_to_aspect_link: "++no0bz >> %{name}"
all_contacts: "4LL N00B5"
- many_people_are_you_sure: "R34LLY W4NN4 5P4M %{suggested_limit} N00B5? 5P4MM1NG 7H31R 45P3C7 M4Y B3 M0R3 1N73LL1G3N7!"
my_contacts: "Y0UR N00B5"
no_contacts: "L00K5 L1K3 U N33D 70 PWN M0R3 N00B5!"
only_sharing_with_me: "0NLY 5H4R1NG W17H U"
- remove_person_from_aspect: "R3M0V3 %{person_name} FR0M \"%{aspect_name}\""
start_a_conversation: "574R7 4 N3W C0NV3R54710N!"
title: "N00B5"
your_contacts: "Y0UR N00B5"
- many: "%{count} N00B5"
one: "1 N00B"
other: "%{count} N00B5"
sharing:
people_sharing: "N00B5 5H4R1NG W17H U:"
- two: "%{count} N00B5"
zero: "N00B5"
conversations:
create:
fail: "1NV4L1D M3554G3!"
sent: "M3554G3 53N7!"
- destroy:
- success: "C0NV3R54710N PWND!"
helper:
new_messages:
few: "%{count} N3W M3554G35"
@@ -429,14 +397,12 @@ en_1337:
add_contact_from_tag: "4DD N00B FR0M 74G"
aspect_list:
edit_membership: "3D17 45P3C7 M3MB3R5H1P"
- few: "%{count} N00B5"
helper:
results_for: " R35UL75 F0R %{params}"
index:
no_one_found: "...4ND N0 0N3 W45 F0UND!"
no_results: "H3Y! U N33D 2 534RCH F0R 50M37H1NG!"
results_for: "534RCH R35UL75 F0R"
- many: "%{count} N00B5"
one: "1 N00B"
other: "%{count} N00B5"
person:
@@ -470,7 +436,6 @@ en_1337:
add_some: "4DD 50M3"
edit: "3D17"
you_have_no_tags: "U H4V3 N0 74G5!"
- two: "%{count} N00B5"
webfinger:
fail: "%{handle} != 3X1571NG"
zero: "N0 N00B5"
@@ -710,13 +675,7 @@ en_1337:
no_message_to_display: "N0 5P4M 2 D15PL4Y!"
new:
mentioning: "M3N710N1NG: %{person}"
- too_long:
- few: "PL3453 M4K3 Y0UR 5P4M5 L355 7H3N %{count} CH4R4C73R5"
- many: "PL3453 M4K3 Y0UR 5P4M5 L355 7H3N %{count} CH4R4C73R5"
- one: "PL3453 M4K3 Y0UR 5P4M5 L355 7H3N %{count} CH4R4C73R\""
- other: "PL3453 M4K3 Y0UR 5P4M5 L355 7H3N %{count} CH4R4C73R5"
- two: "PL3453 M4K3 Y0UR 5P4M5 L355 7H3N %{count} CH4R4C73R5"
- zero: "PL3453 M4K3 Y0UR 5P4M5 L355 7H3N %{count} CH4R4C73R5"
+ too_long: "{\"few\"=>\"PL3453 M4K3 Y0UR 5P4M5 L355 7H3N %{count} CH4R4C73R5\", \"many\"=>\"PL3453 M4K3 Y0UR 5P4M5 L355 7H3N %{count} CH4R4C73R5\", \"one\"=>\"PL3453 M4K3 Y0UR 5P4M5 L355 7H3N %{count} CH4R4C73R\\\"\", \"other\"=>\"PL3453 M4K3 Y0UR 5P4M5 L355 7H3N %{count} CH4R4C73R5\", \"two\"=>\"PL3453 M4K3 Y0UR 5P4M5 L355 7H3N %{count} CH4R4C73R5\", \"zero\"=>\"PL3453 M4K3 Y0UR 5P4M5 L355 7H3N %{count} CH4R4C73R5\"}"
stream_helper:
hide_comments: "H1D3 4LL 5P4M5!"
show_comments:
@@ -746,9 +705,6 @@ en_1337:
show:
follow: "F0LL0W #%{tag}"
following: "F0LL0W1NG #%{tag}"
- nobody_talking: "N0B0DY 5P4MM3D 4B0U7 %{tag} Y37!"
- people_tagged_with: "N00B5 74GG3D W17H %{tag}"
- posts_tagged_with: "5P4M 74GG3D W17H #%{tag}"
stop_following: "570P F0LL0W1NG #%{tag}"
terms_and_conditions: "T&C"
undo: "Ctrl+Z?"
@@ -769,7 +725,6 @@ en_1337:
comment_on_post: "...50M30N3 5P4M5 Y0UR 5P4M?"
current_password: "CURR3N7 *****"
download_photos: "D0WNL04D MY PR0N"
- download_xml: "D0WNL04D MY XML"
edit_account: "H4CK Y0UR 4CC0UN7"
email_awaiting_confirmation: "4C71V4510N L1NK 53N7 2 %{unconfirmed_email}. UN71L U F0LL0W 7H3 L1NK W3 W1LL C0N71NU3 2 U53 Y0UR 0R1G1N4L M41L %{email}."
export_data: "3XP0R7 D474"
diff --git a/config/locales/diaspora/en_pirate.yml b/config/locales/diaspora/en_pirate.yml
index 88d1f130b..0431955db 100644
--- a/config/locales/diaspora/en_pirate.yml
+++ b/config/locales/diaspora/en_pirate.yml
@@ -5,21 +5,50 @@
en_pirate:
+ _applications: "Applications"
+ _comments: "Comments"
_contacts: "Mateys"
_home: "Home Port"
_photos: "Portraits"
+ _services: "Ye Services"
+ account: "Ye account"
activerecord:
errors:
models:
+ contact:
+ attributes:
+ person_id:
+ taken: "must be unique among this matey's mates."
+ person:
+ attributes:
+ diaspora_handle:
+ taken: "has been hornswaggled!"
+ request:
+ attributes:
+ from_id:
+ taken: "is a another one of something that already exists ye scallywag!"
reshare:
attributes:
root_guid:
taken: "Ye've already reshared that post!"
user:
attributes:
+ email:
+ taken: "has been hornswaggled!"
+ person:
+ invalid: "be invalid."
username:
- invalid: "is invalid. We only allow letters, numbers, 'n underscores"
+ invalid: "is invalid. We only allow letters, numbers, 'n underscores."
+ taken: "has been hornswaggled!"
+ ago: "%{time} ago arrr"
all_aspects: "Yer Crews"
+ application:
+ helper:
+ unknown_person: "unknown scallywag"
+ video_title:
+ unknown: "Arrgh! Unknown Video Title"
+ are_you_sure: "Are ye sure?"
+ are_you_sure_delete_account: "Are ye sure you want t' walk the plank? Yer account will be shark bait!"
aspect_memberships:
destroy:
failure: "Blast! Failed to kick matey out yer crew"
@@ -31,31 +60,71 @@ en_pirate:
success: "Successfully added contact to crew."
aspect_listings:
add_an_aspect: "+ Add a crew"
- contacts_not_visible: "Contacts in this crew will nah be able to see each other."
+ deselect_all: "Unchoose all"
+ edit_aspect: "Edit %{name}"
+ select_all: "Choose all"
+ aspect_stream:
+ stay_updated: "Stay up 't date"
+ stay_updated_explanation: "Yer main stream is populated with all of yer contacts, tags ye follow, and posts from some creative members of the community."
+ contacts_not_visible: "Mateys in this crew will nah be able to see each other."
contacts_visible: "Contacts in this crew will be able to see each other."
create:
failure: "Crew creation failed."
success: "Yer new crew %{name} was created"
+ destroy:
+ failure: "%{name} not be empty and could not be removed YARGH!"
+ success: "%{name} was removed successfully mate."
edit:
aspect_list_is_not_visible: "Yer crew list is hidden to others in crew"
aspect_list_is_visible: "Yer crew list is visible to others in crew"
confirm_remove_aspect: "Are ye sure ye wants t' scuttle this crew?"
make_aspect_list_visible: "make crew list visible?"
remove_aspect: "Fire this crew"
- few: "%{count} crews"
- helper:
- are_you_sure: "Are ye sure ye want t' scuttle this crew?"
- aspect_not_empty: "Crew not empty"
+ rename: "rename"
+ update: "update"
+ updating: "updatin'"
index:
- handle_explanation: "This is yer diaspora id. Like an email address, you can give this to scallywags to reach you."
+ diaspora_id:
+ content_1: "Ye ship name be:"
+ content_2: "Give it to anyone 'n they'll be able to find ye on diaspora*. Yargh."
+ heading: "diaspora* ID"
+ donate: "Give some dubloons!"
+ handle_explanation: "This is yer diaspora id. Like a ship name, ye can give this to mates to reach ye."
help:
+ do_you: "Do ye:"
+ email_feedback: "%{link} yer feedback, if ye prefer"
+ feature_suggestion: "... do ye have a %{link} suggestion?"
+ find_a_bug: "... ye find a %{link}?"
+ have_a_question: "do ye have a %{link}?"
here_to_help: "Diaspora community is here to help!"
+ need_help: "S.O.S."
+ tag_bug: "blunder"
+ tag_feature: "addition"
+ tag_question: "wanna know somethin'!"
+ introduce_yourself: "This be yer sea. Make yerself acquainted ye bucko."
+ new_here:
+ follow: "Follow %{link} 'n welcome new mateys 't diaspora*!"
+ learn_more: "Learn more matey"
+ title: "Welcome New Buccaneers"
no_contacts: "No mateys"
- many: "%{count} crews"
+ no_tags: "+ Find an interestin' somethin' t' follow"
+ people_sharing_with_you: "Buccaneers sharin' with ye"
+ post_a_message: "send a letter"
+ services:
+ content: "Ye can connect the following services to diaspora*:"
+ heading: "Connect ye services"
+ unfollow_tag: "Stop followin' #%{tag}"
+ welcome_to_diaspora: "Welcome to diaspora*, %{name}. Ye old seadog!"
new:
+ create: "Forge"
name: "Name"
no_contacts_message:
+ community_spotlight: "crew spotlight"
+ or_spotlight: "Or ye can share with %{link}"
try_adding_some_more_contacts: "You can search (top) or invite (right) more mateys."
+ you_should_add_some_more_contacts: "Ye should add some more contacts!"
+ no_posts_message:
+ start_talking: "None of yer mates has said anything yet!"
one: "1 crew"
other: "%{count} crews"
seed:
@@ -63,36 +132,115 @@ en_pirate:
family: "Kin"
friends: "Mateys"
work: "Shipmates"
+ update:
+ failure: "Yer crew, %{name}, had too many words, YARGH!"
+ success: "Yer crew, %{name}. has been edited matey!"
+ zero: "Ye have no crews! Yargh!"
+ back: "Backs"
+ blocks:
+ create:
+ failure: "Could not send'em to the brig!"
+ success: "Alright mate, ye wont see that scallywag in yer sea again. #walkedtheplank!"
+ destroy:
+ failure: "Couldnt stop ignorin' that scallywag."
+ bookmarklet:
+ explanation: "Post to diaspora* from anywhere by marking this link on yer map => %{link}"
+ heading: "Mark on ye map"
+ post_something: "Post 't d*"
+ post_success: "Sent! Closing!"
+ cancel: "Nevermind"
+ comments:
+ new_comment:
+ comment: "Comm'nt"
+ commenting: "Commentin'"
+ one: "1 comment mate"
+ other: "%{count} comments mate"
+ zero: "no comments mate"
contacts:
- few: "%{count} contacts"
+ create:
+ failure: "Failed 't create contact"
index:
+ add_a_new_aspect: "Add a new crew"
add_to_aspect: "Add more mateys to %{name}"
all_contacts: "All yer mateys"
my_contacts: "Me Mateys"
no_contacts: "No Mateys."
+ only_sharing_with_me: "Mateys only sharin' with me"
+ start_a_conversation: "Send a letter"
title: "Mateys"
your_contacts: "Yer Mateys"
- many: "%{count} contacts"
- one: "1 contact"
- other: "%{count} contacts"
- two: "%{count} contacts"
- zero: "contacts"
+ one: "1 matey"
+ other: "%{count} mateys"
+ sharing:
+ people_sharing: "Buccaneers sharin' with ye:"
+ zero: "mates"
conversations:
+ create:
+ fail: "Problem with letter, YARGH!"
+ sent: "Letter sent"
helper:
new_messages:
- few: "%{count} new messages"
- many: "%{count} new messages"
- one: "1 new messages"
- other: "%{count} new messages"
- two: "%{count} new messages"
- zero: "No new messages"
+ one: "1 new letter"
+ other: "%{count} new letters"
+ zero: "No new letters"
+ index:
+ inbox: "Pigeon's nest"
+ no_conversation_selected: "no message chosen, mate"
+ no_messages: "no letters"
+ new:
+ abandon_changes: "Abandon ye changes?"
+ sending: "Sendin'..."
+ to: "'t"
+ show:
+ delete: "scuttle and batten down the discussion"
+ reply: "send a letter back"
+ replying: "Replyin'"
+ delete: "Scuttle"
+ email: "Yer Carrier Pigeon (Email)"
+ error_messages:
+ helper:
+ correct_the_following_errors_and_try_again: "Correct ye blunders 'n try again ye scallywag!"
+ invalid_fields: "N'valid fields"
+ fill_me_out: "Fill me out arrr"
+ find_people: "Scour fer mates or treasures"
+ hide: "Cover"
+ invitations:
+ a_facebook_user: "A Facebook scallywag"
+ create:
+ already_contacts: "Ye are already mates with this buccaneer!"
+ already_sent: "Ye already invited this bucko."
+ no_more: "Ye have no more invitations."
+ own_address: "Ye can't send an invitation t' yer own address ye scallywag."
+ rejected: "Yer pigeon can't deliver to the followin' addresses: "
+ sent: "Invitations have been sent t': %{emails}"
+ edit:
+ accept_your_invitation: "Accept yer invitation"
+ your_account_awaits: "Yer ship awaits!"
+ new:
+ already_invited: "The following landblubbers have not accepted yer invitation:"
+ aspect: "Crew"
+ check_out_diaspora: "Avast ye! Check out diaspora*! ARRR!!"
+ if_they_accept_info: "if they accept, they will be added to the crew ye invited them."
+ invite_someone_to_join: "Invite a bucko t' diaspora*!"
+ language: "What do ye speak?"
+ personal_message: "Personal letter"
+ send_an_invitation: "Send n' invitation"
+ to: "Who's this goin' t'?"
layouts:
application:
+ back_to_top: "Back to crow's nest"
+ powered_by: "This ship be POWERED BY diaspora*"
+ public_feed: "Sea-wide diaspora* feed for %{name}"
toggle: "toggl' mobile site"
+ whats_new: "what be new?"
+ your_aspects: "yer crews"
header:
+ admin: "cap'n"
+ login: "check in with ye captain"
logout: "Abandon Ship"
profile: "Ye Ship"
settings: "Ye Ships Rigging"
+ view_all: "Show all"
likes:
likes:
people_dislike_this:
@@ -116,6 +264,10 @@ en_pirate:
other: "%{count} likes"
two: "%{count} likes"
zero: "no likes"
+ limited: "Only ye crews"
+ more: "More!"
+ next: "next"
+ no_results: "Ye results be in davey jones' locker. Yargh!"
notifications:
also_commented:
few: "%{actors} also commented on %{post_author}'s %{post_link}."
@@ -147,6 +299,7 @@ en_pirate:
two: "%{count} new notifications"
zero: "No new notifications"
index:
+ and: "'n"
and_others:
few: "'n %{count} others"
many: "'n %{count} others"
@@ -211,37 +364,133 @@ en_pirate:
two: "%{actors} started sharin' with ye."
zero: "%{actors} started sharin' with ye."
notifier:
+ click_here: "look here"
+ comment_on_post:
+ reply: "Reply or see %{name}'s post >"
confirm_email:
click_link: "To activate yer new email %{unconfirmed_email} in a bottle coordinates , please click 'tis link."
+ subject: "Please activate yer new email %{unconfirmed_email}"
+ email_sent_by_diaspora: "This letter was sent by %{pod_name}. If ye'd like to stop gettin' letters like this,"
+ hello: "Hello %{name}! How are ye, matey?"
liked:
- liked: "%{name} just liked yer post"
+ liked: "%{name} just like'd yer post"
+ view_post: "Read post >"
+ mentioned:
+ mentioned: "mention'd ye in a post:"
+ subject: "%{name} has mention'd ye on diaspora*"
+ private_message:
+ reply_to_or_view: "Reply 't or read this conversation >"
reshared:
- reshared: "%{name} just reshared yer post"
+ reshared: "%{name} just reshare'd yer post"
+ view_post: "Read post >"
+ single_admin:
+ admin: "Yer diaspora* cap'n"
+ subject: "A message about yer diaspora* account:"
+ started_sharing:
+ sharing: "has start'd sharin' with ye!"
+ subject: "%{name} started sharin' with ye on diaspora*"
+ view_profile: "Look at %{name}'s ship"
+ to_change_your_notification_settings: "t' change yer notification settin's"
+ nsfw: "Not safe for lad's or lasses'"
ok: "Aye"
+ or: "er"
+ password: "Secret pact"
+ password_confirmation: "Confirm yer secret pact!"
people:
- few: "%{count} people"
- many: "%{count} people"
+ add_contact_small:
+ add_contact_from_tag: "add matey from tag"
+ helper:
+ results_for: " results fer %{params}"
+ index:
+ looking_for: "Lookin' fer posts tagged %{tag_link}?"
+ no_one_found: "...and no landblubbers were found."
+ no_results: "Ahoy! Ye need 't search fer somethin'."
+ results_for: "Scallywags matchin' %{search_term}"
one: "1 person"
other: "%{count} people"
+ person:
+ add_contact: "add mate"
+ pending_request: "Pendin' request"
+ thats_you: "That's ye!"
profile_sidebar:
born: "date o' birth"
- two: "%{count} people"
+ edit_my_profile: "Edit me profile"
+ gender: "Ye gender"
+ location: "Sea I be in"
+ remove_contact: "remove matey"
+ show:
+ closed_account: "This ship has been sunk."
+ does_not_exist: "Matey does not exist! Arrr"
+ has_not_shared_with_you_yet: "%{name} has not shared any posts with ye yet!"
+ ignoring: "Yer ignorin' all posts from %{name}."
+ incoming_request: "%{name} wants 't share with ye"
+ not_connected: "Yer not sharin' with this scallywag."
+ return_to_aspects: "Return 't yer mateys page"
+ start_sharing: "start sharin'"
+ to_accept_or_ignore: "'t accept or deny it."
+ sub_header:
+ you_have_no_tags: "ye have no tags!"
+ webfinger:
+ fail: "Sorry mate, we couldnt spot %{handle}."
zero: "no people"
photos:
+ comment_email_subject: "%{name}'s portrait"
+ create:
+ integrity_error: "Portrait hanging failed. Are ye sure that was a portrait?"
+ runtime_error: "Portrait hanging failed. Are ye sure yer hatches be battened down?"
+ type_error: "Portrait hangin' failed. Are ye sure a portrait was added mate?"
+ destroy:
+ notice: "Portrait scuttled!"
+ edit:
+ editing: "Editin'"
new:
new_photo: "New Portrait"
+ post_it: "Fire!"
+ 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:
+ or_select_one_existing: "or choose one from yer already existin' %{photos}"
+ upload: "Hang a new portrait in ye ship!"
+ photo:
+ view_all: "look at all of %{name}'s portraits"
+ show:
+ delete_photo: "Delete Portrait"
+ edit_delete_photo: "Edit portrait tale / get rid of portrait"
+ make_profile_photo: "make profile portrait"
+ update_photo: "Update Portrait"
+ update:
+ error: "Failed to change portrait cap'n!"
+ notice: "Portrait changed, cap'n!"
posts:
show:
+ destroy: "Scuttle"
+ not_found: "Sorry cap'n, we couldn't find that X."
photos_by:
- few: "%{count} photos by %{author}"
- many: "%{count} photos by %{author}"
- one: "One photo by %{author}"
- other: "%{count} photos by %{author}"
- two: "Two photos by %{author}"
- zero: "No photos by %{author}"
+ one: "One portrait by %{author}"
+ other: "%{count} portraits by %{author}"
+ zero: "No portraits by %{author}"
+ previous: "previous"
+ privacy: "Ye privacy settin's"
+ privacy_policy: "Ye privacy policy"
+ profile: "Ye duffle"
profiles:
edit:
+ allow_search: "Allow fer scallywags to search fer ye within diaspora*"
+ your_bio: "Ye story"
your_birthday: "Yer day o' birth"
+ your_gender: "Lad, lass, or something else?"
+ your_location: "Where ye be in the sea?"
+ your_name: "Yer name"
+ your_photo: "Ye portrait"
+ your_private_profile: "Ye private profile"
+ your_public_profile: "Ye public profile"
+ your_tags: "Describe yerself in 5 words, mate."
+ your_tags_placeholder: "like #treasure #ships #plunderin #sea #rum"
+ update:
+ failed: "Failed to update profile, matey!"
+ public: "The Sea can see this"
reactions:
few: "%{count} reactions"
many: "%{count} reactions"
@@ -250,10 +499,25 @@ en_pirate:
two: "%{count} reactions"
zero: "0 reactions"
registrations:
+ closed: "Signups be closed on this ship!"
+ create:
+ success: "Ye've joined diaspora*! YARGH!"
+ edit:
+ cancel_my_account: "Walk the plank"
+ leave_blank: "(leave blank if ye dont want 't change it)"
+ password_to_confirm: "we need yer current password 'to confirm yer changes)"
new:
create_my_account: "Create my account"
+ join_the_movement: "Join the pirate life, YARGH!"
sign_up_message: "Social Networking with a <3"
requests:
+ create:
+ sending: "Sendin'"
+ sent: "Ye've asked 't share with %{name}. They should be able 't see it next time they come aboard diaspora*."
+ destroy:
+ error: "Select a crew!"
+ ignore: "The brig."
+ success: "Ye are now sharin'."
helper:
new_requests:
few: "%{count} new requests!"
@@ -262,7 +526,12 @@ en_pirate:
other: "%{count} new requests!"
two: "%{count} new requests!"
zero: "no new requests"
+ manage_aspect_contacts:
+ existing: "Existin' mates"
+ manage_within: "Manage mates within"
reshares:
+ create:
+ failure: "There be an error resharin' this post."
reshare:
reshare:
few: "%{count} reshares"
@@ -273,8 +542,26 @@ en_pirate:
zero: "Reshare"
search: "Scour"
services:
+ create:
+ already_authorized: "A matey named %{diaspora_id} already authorized that %{service_name} record. ARR!"
+ failure:
+ error: "there be an error connectin' that service"
+ finder:
+ fetching_contacts: "diaspora* is populatin' yer %{service} mates, come back in a bit mate."
+ no_friends: "Couldnt find any Facebook mateys."
+ service_friends: "%{service} Mateys"
+ index:
+ connect_to_facebook: "Connect 't Facebook"
+ connect_to_tumblr: "Connect 't Tumblr"
+ connect_to_twitter: "Connect 't Twitter"
+ no_services: "Ye have not connected any services yet."
inviter:
click_link_to_accept_invitation: "Click this link t' accept yer invitation"
+ settings: "Settin's"
+ share_visibilites:
+ update:
+ post_hidden_and_muted: "%{name}'s be hidden, 'n notifications be muted."
+ see_it_on_their_profile: "If ye be wantin' 't see updates on this post, look at %{name}'s ship, ARRGH!"
shared:
aspect_dropdown:
add_to_aspect: "Add to aspect"
@@ -285,23 +572,40 @@ en_pirate:
other: "In %{count} aspects"
two: "In %{count} aspects"
zero: "Add to aspect"
+ footer:
+ your_aspects: "yer mateys"
+ public_explain:
+ logged_in: "on deck at %{service}"
+ new_user_welcome_message: "Use #hashtags t' classify yer posts n' find mateys. Call out mateys with @Mentions"
+ outside: "Sea-wide messages will be available fer others outside of diaspora* t' see."
+ visibility_dropdown: "Use this dropdown t' change the visibility of yer post. (It's good idear ye make this first one sea-wide.)"
publisher:
+ all_contacts: "all mateys"
+ discard_post: "Scuttle post"
new_user_prefill:
i_like: "I be interested in %{tags}."
+ newhere: "NewMatey"
+ posting: "Firin!"
share: "Fire!"
+ upload_photos: "Hang up portraits"
whats_on_your_mind: "What be botherin' you?"
stream_element:
+ connect_to_comment: "Connect t' this scallywag t' comm'nt on their post"
+ currently_unavailable: "comm'ntin currently not working"
hide_and_mute: "Hide and Mute"
shared_with: "Fired at: %{aspect_names}"
status_messages:
- too_long:
- few: "Ye scallywag, make yer status messages less than %{count} characters"
- many: "Ye scallywag,make yer status messages less than %{count} characters"
- one: "Ye scallywag, make yer status messages less than %{count} character"
- other: "Ye scallywag, make yer status messages less than %{count} characters"
- two: "Ye scallywag, make yer status messages less than %{count} characters"
- zero: "Ye scallywag,make yer status messages less than %{count} characters"
+ create:
+ success: "Ye've successfully mentioned: %{names}"
+ destroy:
+ failure: "Failed t' get rid of post"
+ helper:
+ no_message_to_display: "No message t' display."
+ new:
+ mentioning: "Mentionin': %{person}"
+ too_long: "{\"few\"=>\"Ye scallywag, make yer status messages less than %{count} characters\", \"many\"=>\"Ye scallywag,make yer status messages less than %{count} characters\", \"one\"=>\"Ye scallywag, make yer status messages less than %{count} character\", \"other\"=>\"Ye scallywag, make yer status messages less than %{count} characters\", \"two\"=>\"Ye scallywag, make yer status messages less than %{count} characters\", \"zero\"=>\"Ye scallywag,make yer status messages less than %{count} characters\"}"
stream_helper:
+ hide_comments: "Hide all comm'nts"
show_comments:
few: "Show %{count} more comments"
many: "Show %{count} more comments"
@@ -312,20 +616,41 @@ en_pirate:
streams:
aspects:
title: "Yer Aspects"
+ aspects_stream: "Crews"
mentions:
+ contacts_title: "Seadogs that mentioned ye"
title: "Yer Mentions"
+ multi:
+ contacts_title: "Mateys in yer Sea"
+ title: "Sea"
tags:
contacts_title: "scallywags who dig these tags"
tag_followings:
create:
failure: "Failed to follow: #%{name}"
+ none: "Ye cannot follow a blank tag!"
success: "Successfully followin': #%{name}"
destroy:
failure: "Failed to stop followin': #%{name}"
- success: "Successfully stopped followin': #%{name}"
+ success: "Avast! Successfully stopped followin': #%{name}"
+ tags:
+ show:
+ following: "Followin' #%{tag}"
+ stop_following: "Stop Followin' #%{tag}"
+ terms_and_conditions: "Terms 'n conditions"
+ undo: "Undo?"
+ username: "Yer Username"
users:
edit:
auto_follow_back: "Automatically follow back if someone follows ye"
close_account:
+ dont_go: "Yo Ho HO! No need t' walk the plank!"
+ make_diaspora_better: "We want ye t' make diaspora* better arr, so ye should help before ye walk the plank and feed the fishes. If ye do want t' walk, we want ye t' be savvy on what happens next ye old seadog arrr."
+ mr_wiggles: "Mr Wiggles will be sad t' see ye go mate."
what_we_delete: "We scuttle all of yer posts, profile data, as soon as humanly possible. Yer comments will hang around, but be associated with yer Diaspora Handle."
- your_handle: "Yer diaspora id" \ No newline at end of file
+ download_photos: "download ye portraits"
+ show_community_spotlight: "Show Community Spotlight in sea"
+ stream_preferences: "Sea settin's"
+ your_email: "Yer email"
+ your_handle: "Yer diaspora id"
+ welcome: "Ahoy, matey!" \ No newline at end of file
diff --git a/config/locales/diaspora/en_shaw.yml b/config/locales/diaspora/en_shaw.yml
index 1add816ad..c1bfd6d82 100644
--- a/config/locales/diaspora/en_shaw.yml
+++ b/config/locales/diaspora/en_shaw.yml
@@ -54,8 +54,6 @@ en_shaw:
add_to_aspect:
failure: "𐑓𐑱𐑤𐑛 𐑑 𐑨𐑛 𐑒𐑪𐑯𐑑𐑨𐑒𐑑 𐑑 𐑨𐑕𐑐𐑧𐑒𐑑."
success: "𐑕𐑩𐑒𐑕𐑧𐑕𐑓𐑫𐑤𐑦 𐑨𐑛𐑩𐑛 𐑒𐑪𐑯𐑑𐑨𐑒𐑑 𐑑 𐑨𐑕𐑐𐑧𐑒𐑑."
- aspect_contacts:
- done_editing: "𐑛𐑳𐑯 𐑧𐑛𐑦𐑑𐑦𐑙"
aspect_listings:
add_an_aspect: "+ 𐑨𐑛 𐑩𐑯 𐑨𐑕𐑐𐑧𐑒𐑑"
contacts_not_visible: "𐑒𐑪𐑯𐑑𐑨𐑒𐑑𐑕 𐑦𐑯 𐑞𐑦𐑕 𐑨𐑕𐑐𐑧𐑒𐑑 𐑢𐑦𐑤 𐑯𐑪𐑑 𐑚𐑰 𐑱𐑚𐑩𐑤 𐑑 𐑕𐑰 𐑰𐑗 𐑳𐑞𐑼."
@@ -67,21 +65,14 @@ en_shaw:
failure: "%{name} ez dago hutsik eta ezin izan da ezabatu."
success: "%{name} 𐑢𐑪𐑟 𐑕𐑩𐑒𐑕𐑧𐑕𐑓𐑫𐑤𐑦 𐑮𐑦𐑥𐑵𐑝𐑛."
edit:
- add_existing: "𐑨𐑛 𐑩𐑯 𐑧𐑜𐑟𐑦𐑕𐑑𐑦𐑙 𐑒𐑪𐑯𐑑𐑨𐑒𐑑"
aspect_list_is_not_visible: "𐑨𐑕𐑐𐑧𐑒𐑑 𐑤𐑦𐑕𐑑 𐑦𐑟 𐑣𐑦𐑛𐑩𐑯 𐑑 𐑳𐑞𐑼𐑟 𐑦𐑯 𐑨𐑕𐑐𐑧𐑒𐑑"
aspect_list_is_visible: "𐑨𐑕𐑐𐑧𐑒𐑑 𐑤𐑦𐑕𐑑 𐑦𐑟 𐑝𐑦𐑟𐑦𐑚𐑩𐑤 𐑑 𐑳𐑞𐑼𐑟 𐑦𐑯 𐑨𐑕𐑐𐑧𐑒𐑑"
confirm_remove_aspect: "𐑸 𐑿 𐑖𐑻 𐑿 𐑢𐑳𐑯𐑑 𐑑 𐑛𐑦𐑤𐑰𐑑 𐑞𐑦𐑕 𐑨𐑕𐑐𐑧𐑒𐑑?"
- done: "𐑛𐑳𐑯"
make_aspect_list_visible: "𐑥𐑱𐑒 𐑞𐑦𐑕 𐑨𐑕𐑐𐑧𐑒𐑑 𐑤𐑦𐑕𐑑 𐑝𐑦𐑟𐑦𐑚𐑩𐑤?"
remove_aspect: "𐑛𐑦𐑤𐑰𐑑 𐑞𐑦𐑕 𐑨𐑕𐑐𐑧𐑒𐑑"
rename: "𐑮𐑦𐑯𐑱𐑥"
update: "𐑳𐑐𐑛𐑱𐑑"
updating: "𐑳𐑐𐑛𐑱𐑑𐑦𐑙"
- few: "%{count} 𐑨𐑕𐑐𐑧𐑒𐑑𐑕"
- helper:
- are_you_sure: "𐑸 𐑿 𐑖𐑻 𐑿 𐑢𐑳𐑯𐑑 𐑑 𐑛𐑦𐑤𐑰𐑑 𐑞𐑦𐑕 𐑨𐑕𐑐𐑧𐑒𐑑?"
- aspect_not_empty: "𐑨𐑕𐑐𐑧𐑒𐑑 𐑯𐑪𐑑 𐑧𐑥𐑐𐑑𐑦"
- remove: "𐑮𐑦𐑥𐑵𐑝"
index:
diaspora_id:
content_1: "𐑿𐑼 ·𐑛𐑦𐑨𐑕𐑐𐑹𐑩 𐑲𐑛𐑧𐑯𐑑𐑦𐑓𐑦𐑒𐑱𐑖𐑯 𐑦𐑟:"
@@ -101,11 +92,6 @@ en_shaw:
services:
content: "𐑿 𐑒𐑨𐑯 𐑒𐑩𐑯𐑧𐑒𐑑 𐑞 𐑓𐑪𐑤𐑴𐑦𐑙 𐑕𐑻𐑝𐑦𐑕𐑩𐑟 𐑑 ·𐑛𐑦𐑨𐑕𐑐𐑹𐑩:"
heading: "𐑒𐑩𐑯𐑧𐑒𐑑 𐑕𐑻𐑝𐑦𐑕𐑩𐑟"
- many: "%{count} 𐑨𐑕𐑐𐑧𐑒𐑑𐑕"
- move_contact:
- error: "𐑺𐑼 𐑥𐑵𐑝𐑦𐑙 𐑒𐑪𐑯𐑑𐑨𐑒𐑑: %{inspect}"
- failure: "𐑛𐑦𐑛𐑯𐑑 𐑢𐑻𐑒 %{inspect}"
- success: "𐑐𐑻𐑕𐑩𐑯 𐑥𐑵𐑝𐑛 𐑑 𐑯𐑿 𐑨𐑕𐑐𐑧𐑒𐑑"
new:
create: "𐑒𐑮𐑦𐑱𐑑"
name: "𐑯𐑱𐑥"
@@ -120,13 +106,6 @@ en_shaw:
family: "𐑓𐑨𐑥𐑦𐑤𐑦"
friends: "𐑓𐑮𐑧𐑯𐑛𐑟"
work: "𐑢𐑻𐑒"
- selected_contacts:
- manage_your_aspects: "𐑥𐑨𐑯𐑩𐑡 𐑿𐑼 𐑨𐑕𐑐𐑧𐑒𐑑𐑕."
- no_contacts: "𐑿 𐑛𐑴𐑯𐑑 𐑣𐑨𐑝 𐑧𐑯𐑦 𐑒𐑪𐑯𐑑𐑨𐑒𐑑𐑕 𐑣𐑽 𐑘𐑧𐑑."
- view_all_contacts: "𐑝𐑿 𐑷𐑤 𐑒𐑪𐑯𐑑𐑨𐑒𐑑𐑕"
- show:
- edit_aspect: "𐑧𐑛𐑦𐑑 𐑨𐑕𐑐𐑧𐑒𐑑"
- two: "%{count} aspects"
update:
failure: "𐑿𐑼 𐑨𐑕𐑐𐑧𐑒𐑑, %{name}, 𐑣𐑨𐑛 𐑑𐑵 𐑤𐑪𐑙 𐑩 𐑯𐑱𐑥 𐑑 𐑚𐑰 𐑕𐑱𐑝𐑛."
success: "𐑿𐑼 𐑨𐑕𐑐𐑧𐑒𐑑, %{name}, 𐑣𐑨𐑟 𐑚𐑧𐑯 𐑕𐑩𐑒𐑕𐑧𐑕𐑓𐑫𐑤𐑦 𐑧𐑛𐑦𐑑𐑩𐑛."
@@ -139,43 +118,33 @@ en_shaw:
post_success: "𐑐𐑴𐑕𐑑𐑩𐑛! 𐑒𐑤𐑴𐑟𐑦𐑙!"
cancel: "𐑒𐑨𐑯𐑕𐑩𐑤"
comments:
- few: "%{count} 𐑒𐑪𐑥𐑩𐑯𐑑𐑕"
- many: "%{count} 𐑒𐑪𐑥𐑩𐑯𐑑𐑕"
new_comment:
comment: "𐑒𐑪𐑥𐑩𐑯𐑑"
commenting: "𐑒𐑪𐑥𐑩𐑯𐑑𐑦𐑙..."
one: "1 𐑒𐑪𐑥𐑩𐑯𐑑"
other: "%{count} 𐑒𐑪𐑥𐑩𐑯𐑑𐑕"
- two: "%{count} comments"
zero: "𐑯𐑴 𐑒𐑪𐑥𐑩𐑯𐑑𐑕"
contacts:
create:
failure: "𐑓𐑱𐑤𐑛 𐑑 𐑒𐑮𐑦𐑱𐑑 𐑒𐑪𐑯𐑑𐑨𐑒𐑑"
- few: "%{count} 𐑒𐑪𐑯𐑑𐑨𐑒𐑑𐑕"
index:
add_a_new_aspect: "𐑨𐑛 𐑯𐑿 𐑨𐑕𐑐𐑧𐑒𐑑"
add_to_aspect: "Add contacts to %{name}"
all_contacts: "𐑷𐑤 𐑒𐑪𐑯𐑑𐑨𐑒𐑑𐑕"
- many_people_are_you_sure: "𐑸 𐑿 𐑖𐑻 𐑿 𐑢𐑳𐑯𐑑 𐑑 𐑕𐑑𐑸𐑑 𐑩 𐑐𐑮𐑲𐑝𐑩𐑑 𐑒𐑪𐑯𐑝𐑼𐑕𐑱𐑖𐑩𐑯 𐑢𐑦𐑞 𐑥𐑹 𐑞𐑨𐑯 %{suggested_limit} 𐑒𐑪𐑯𐑑𐑨𐑒𐑑𐑕? 𐑐𐑴𐑕𐑑𐑦𐑙 𐑑 𐑞𐑦𐑕 𐑨𐑕𐑐𐑧𐑒𐑑 𐑥𐑱 𐑚𐑰 𐑩 𐑚𐑧𐑑𐑼 𐑢𐑱 𐑑 𐑒𐑪𐑯𐑑𐑨𐑒𐑑 𐑞𐑧𐑥."
my_contacts: "𐑥𐑲 𐑒𐑪𐑯𐑑𐑨𐑒𐑑𐑕"
no_contacts: "𐑯𐑴 𐑒𐑪𐑯𐑑𐑨𐑒𐑑𐑕."
only_sharing_with_me: "𐑴𐑯𐑤𐑦 𐑖𐑺𐑦𐑙 𐑢𐑦𐑞 𐑥𐑰"
- remove_person_from_aspect: "𐑮𐑦𐑥𐑵𐑝 %{person_name} 𐑓𐑮𐑳𐑥 \"%{aspect_name}\""
start_a_conversation: "𐑕𐑑𐑸𐑑 𐑩 𐑒𐑪𐑯𐑝𐑼𐑕𐑱𐑖𐑩𐑯"
title: "𐑒𐑪𐑯𐑑𐑨𐑒𐑑𐑕"
your_contacts: "𐑿𐑼 𐑒𐑪𐑯𐑑𐑨𐑒𐑑𐑕"
- many: "%{count} 𐑒𐑪𐑯𐑑𐑨𐑒𐑑𐑕"
one: "1 𐑒𐑪𐑯𐑑𐑨𐑒𐑑"
other: "%{count} 𐑒𐑪𐑯𐑑𐑨𐑒𐑑𐑕"
sharing:
people_sharing: "𐑐𐑰𐑐𐑩𐑤 𐑖𐑺𐑦𐑙 𐑢𐑦𐑞 𐑿:"
- two: "%{count} contacts"
zero: "𐑯𐑴 𐑒𐑪𐑯𐑑𐑨𐑒𐑑𐑕"
conversations:
create:
sent: "𐑥𐑧𐑕𐑩𐑡 𐑕𐑧𐑯𐑑"
- destroy:
- success: "𐑒𐑪𐑯𐑝𐑼𐑕𐑱𐑖𐑩𐑯 𐑕𐑩𐑒𐑕𐑧𐑕𐑓𐑫𐑤𐑦 𐑮𐑦𐑥𐑵𐑝𐑛"
helper:
new_messages:
few: "%{count} 𐑯𐑿 𐑥𐑧𐑕𐑩𐑡𐑩𐑟"
@@ -404,14 +373,12 @@ en_shaw:
add_contact_from_tag: "𐑨𐑛 𐑒𐑪𐑯𐑑𐑨𐑒𐑑 𐑓𐑮𐑪𐑥 𐑑𐑨𐑜"
aspect_list:
edit_membership: "𐑧𐑛𐑦𐑑 𐑨𐑕𐑐𐑧𐑒𐑑 𐑥𐑧𐑥𐑚𐑼𐑖𐑦𐑐"
- few: "%{count} 𐑐𐑰𐑐𐑩𐑤"
helper:
results_for: " 𐑮𐑦𐑟𐑫𐑤𐑑 𐑓𐑹 %{params}"
index:
no_one_found: "...𐑯 𐑯𐑴 𐑢𐑳𐑯 𐑢𐑪𐑟 𐑓𐑬𐑯𐑛."
no_results: "𐑣𐑱! 𐑿 𐑯𐑰𐑛 𐑑 𐑕𐑻𐑗 𐑓𐑹 𐑕𐑳𐑥𐑔𐑦𐑙."
results_for: "𐑕𐑻𐑗 𐑮𐑦𐑟𐑫𐑤𐑑𐑕 𐑓𐑹"
- many: "%{count} 𐑐𐑰𐑐𐑩𐑤"
one: "1 𐑐𐑻𐑕𐑩𐑯"
other: "%{count} 𐑐𐑰𐑐𐑩𐑤"
person:
@@ -441,7 +408,6 @@ en_shaw:
see_all: "𐑕𐑰 𐑷𐑤"
start_sharing: "𐑕𐑑𐑸𐑑 𐑖𐑺𐑦𐑙"
to_accept_or_ignore: "𐑑 𐑩𐑒𐑕𐑧𐑐𐑑 𐑹 𐑦𐑜𐑯𐑹 𐑦𐑑."
- two: "%{count} people"
webfinger:
fail: "𐑕𐑪𐑮𐑦, 𐑢𐑰 𐑒𐑫𐑛𐑯𐑑 𐑓𐑲𐑯𐑛 %{handle}."
zero: "𐑯𐑴 𐑐𐑰𐑐𐑩𐑤"
@@ -667,13 +633,7 @@ en_shaw:
no_message_to_display: "𐑯𐑴 𐑥𐑧𐑕𐑩𐑡 𐑑 𐑛𐑦𐑕𐑐𐑤𐑱."
new:
mentioning: "𐑥𐑧𐑯𐑖𐑩𐑯𐑦𐑙: %{person}"
- too_long:
- few: "𐑐𐑤𐑰𐑟 𐑥𐑱𐑒 𐑿𐑼 𐑕𐑑𐑨𐑑𐑩𐑕 𐑥𐑧𐑕𐑩𐑡𐑩𐑟 𐑤𐑧𐑕 𐑞𐑨𐑯 %{count} 𐑒𐑺𐑩𐑒𐑑𐑼𐑟"
- many: "𐑐𐑤𐑰𐑟 𐑥𐑱𐑒 𐑿𐑼 𐑕𐑑𐑨𐑑𐑩𐑕 𐑥𐑧𐑕𐑩𐑡𐑩𐑟 𐑤𐑧𐑕 𐑞𐑨𐑯 %{count} 𐑒𐑺𐑩𐑒𐑑𐑼𐑟"
- one: "𐑐𐑤𐑰𐑟 𐑥𐑱𐑒 𐑿𐑼 𐑕𐑑𐑨𐑑𐑩𐑕 𐑥𐑧𐑕𐑩𐑡𐑩𐑟 𐑤𐑧𐑕 𐑞𐑨𐑯 %{count} 𐑒𐑺𐑩𐑒𐑑𐑼"
- other: "𐑐𐑤𐑰𐑟 𐑥𐑱𐑒 𐑿𐑼 𐑕𐑑𐑨𐑑𐑩𐑕 𐑥𐑧𐑕𐑩𐑡𐑩𐑟 𐑤𐑧𐑕 𐑞𐑨𐑯 %{count} 𐑒𐑺𐑩𐑒𐑑𐑼𐑟"
- two: "please make your status messages less than %{count} characters"
- zero: "𐑐𐑤𐑰𐑟 𐑥𐑱𐑒 𐑿𐑼 𐑕𐑑𐑨𐑑𐑩𐑕 𐑥𐑧𐑕𐑩𐑡𐑩𐑟 𐑤𐑧𐑕 𐑞𐑨𐑯 %{count} 𐑒𐑺𐑩𐑒𐑑𐑼𐑟"
+ too_long: "{\"few\"=>\"𐑐𐑤𐑰𐑟 𐑥𐑱𐑒 𐑿𐑼 𐑕𐑑𐑨𐑑𐑩𐑕 𐑥𐑧𐑕𐑩𐑡𐑩𐑟 𐑤𐑧𐑕 𐑞𐑨𐑯 %{count} 𐑒𐑺𐑩𐑒𐑑𐑼𐑟\", \"many\"=>\"𐑐𐑤𐑰𐑟 𐑥𐑱𐑒 𐑿𐑼 𐑕𐑑𐑨𐑑𐑩𐑕 𐑥𐑧𐑕𐑩𐑡𐑩𐑟 𐑤𐑧𐑕 𐑞𐑨𐑯 %{count} 𐑒𐑺𐑩𐑒𐑑𐑼𐑟\", \"one\"=>\"𐑐𐑤𐑰𐑟 𐑥𐑱𐑒 𐑿𐑼 𐑕𐑑𐑨𐑑𐑩𐑕 𐑥𐑧𐑕𐑩𐑡𐑩𐑟 𐑤𐑧𐑕 𐑞𐑨𐑯 %{count} 𐑒𐑺𐑩𐑒𐑑𐑼\", \"other\"=>\"𐑐𐑤𐑰𐑟 𐑥𐑱𐑒 𐑿𐑼 𐑕𐑑𐑨𐑑𐑩𐑕 𐑥𐑧𐑕𐑩𐑡𐑩𐑟 𐑤𐑧𐑕 𐑞𐑨𐑯 %{count} 𐑒𐑺𐑩𐑒𐑑𐑼𐑟\", \"two\"=>\"please make your status messages less than %{count} characters\", \"zero\"=>\"𐑐𐑤𐑰𐑟 𐑥𐑱𐑒 𐑿𐑼 𐑕𐑑𐑨𐑑𐑩𐑕 𐑥𐑧𐑕𐑩𐑡𐑩𐑟 𐑤𐑧𐑕 𐑞𐑨𐑯 %{count} 𐑒𐑺𐑩𐑒𐑑𐑼𐑟\"}"
stream_helper:
hide_comments: "𐑣𐑲𐑛 𐑷𐑤 𐑒𐑪𐑥𐑩𐑯𐑑𐑕"
show_comments:
@@ -701,9 +661,6 @@ en_shaw:
show:
follow: "𐑓𐑪𐑤𐑴 #%{tag}"
following: "𐑓𐑪𐑤𐑴𐑦𐑙 #%{tag}"
- nobody_talking: "𐑯𐑴𐑚𐑩𐑛𐑦 𐑦𐑟 𐑑𐑷𐑒𐑦𐑙 𐑩𐑚𐑬𐑑 %{tag} 𐑘𐑧𐑑."
- people_tagged_with: "𐑐𐑰𐑐𐑩𐑤 𐑑𐑨𐑜𐑛 𐑢𐑦𐑞 %{tag}"
- posts_tagged_with: "𐑐𐑴𐑕𐑑𐑕 𐑑𐑨𐑜𐑛 𐑢𐑦𐑞 #%{tag}"
stop_following: "𐑕𐑑𐑪𐑐 𐑓𐑪𐑤𐑴𐑦𐑙 #%{tag}"
undo: "𐑩𐑯𐑛𐑵?"
username: "𐑿𐑟𐑼𐑯𐑱𐑥"
@@ -723,7 +680,6 @@ en_shaw:
comment_on_post: "...𐑕𐑳𐑥𐑢𐑩𐑯 𐑒𐑪𐑥𐑩𐑯𐑑𐑕 𐑪𐑯 𐑿𐑼 𐑐𐑴𐑕𐑑?"
current_password: "𐑒𐑻𐑩𐑯𐑑 𐑐𐑨𐑕𐑢𐑼𐑛"
download_photos: "𐑛𐑬𐑯𐑤𐑴𐑛 𐑥𐑲 𐑓𐑴𐑑𐑴𐑟"
- download_xml: "𐑛𐑬𐑯𐑤𐑴𐑛 𐑥𐑲 𐑧.𐑥.𐑤."
edit_account: "𐑧𐑛𐑦𐑑 𐑩𐑒𐑬𐑯𐑑"
email_awaiting_confirmation: "𐑢𐑰 𐑣𐑨𐑝 𐑕𐑧𐑯𐑑 𐑿 𐑩𐑯 𐑨𐑒𐑑𐑦𐑝𐑱𐑖𐑩𐑯 𐑤𐑦𐑙𐑒 𐑑 %{unconfirmed_email}. 𐑩𐑯𐑑𐑦𐑤 𐑿 𐑓𐑪𐑤𐑴 𐑞𐑦𐑕 𐑤𐑦𐑙𐑒 𐑯 𐑨𐑒𐑑𐑦𐑝𐑱𐑑 𐑞 𐑯𐑿 𐑨𐑛𐑮𐑧𐑕, 𐑢𐑰 𐑢𐑦𐑤 𐑒𐑩𐑯𐑑𐑦𐑯𐑿 𐑑 𐑿𐑟 𐑿𐑼 𐑩𐑮𐑦𐑡𐑩𐑯𐑩𐑤 𐑨𐑛𐑮𐑧𐑕 %{email}."
export_data: "𐑧𐑒𐑕𐑐𐑹𐑑 𐑛𐑱𐑑𐑩"
diff --git a/config/locales/diaspora/en_valspeak.yml b/config/locales/diaspora/en_valspeak.yml
new file mode 100644
index 000000000..4588a6988
--- /dev/null
+++ b/config/locales/diaspora/en_valspeak.yml
@@ -0,0 +1,1236 @@
+# Copyright (c) 2010-2013, Diaspora Inc. This file is
+# licensed under the Affero General Public License version 3 or later. See
+# the COPYRIGHT file.
+
+
+
+en_valspeak:
+ _applications: "Appz"
+ _comments: "Txts"
+ _contacts: "BFFs <3"
+ _help: "Need halp!!"
+ _home: "ur place"
+ _photos: "Picz n selfiez"
+ _services: "Other socialz"
+ _terms: "boring legal stuff"
+ account: "Like ur account"
+ activerecord:
+ errors:
+ models:
+ contact:
+ attributes:
+ person_id:
+ taken: "it must be like... different among this homie's homiez. duh."
+ person:
+ attributes:
+ diaspora_handle:
+ taken: "is like... already taken. sry :\\"
+ poll:
+ attributes:
+ poll_answers:
+ not_enough_poll_answers: "Theres like... not enough stuff to select in the poll..."
+ poll_participation:
+ attributes:
+ poll:
+ already_participated: "uve like... already voted on this poll!! derp."
+ request:
+ attributes:
+ from_id:
+ taken: "is like... the same as another thing.."
+ reshare:
+ attributes:
+ root_guid:
+ taken: "Umm, wtf r u doing? U already reshared that postie? Duh?"
+ user:
+ attributes:
+ email:
+ taken: "is like... already taken."
+ person:
+ invalid: "is like... not valid n junk."
+ username:
+ invalid: "is like... not valid n junk. u have 2 liek... use letterz, numbahz, and these thingz \"_\" but like witout the quote thingz..."
+ taken: "some1 like, already bought those shoez. sry bout that :\\"
+ admins:
+ admin_bar:
+ correlations: "Correlationz"
+ pages: "Pagies!"
+ pod_stats: "Pod statsss <3"
+ report: "Reportz"
+ sidekiq_monitor: "Technical thingy called Sidekiq monitor... wasnt that like... a phone once? OMG! IT WAS! :DD"
+ user_search: "Ppl search"
+ weekly_user_stats: "Weekly ppl stats"
+ correlations:
+ correlations_count: "Correlationz wit sign in count:"
+ stats:
+ 2weeks: "2 weekz"
+ 50_most: "ZOMG THE 50 MOST POPULAR TAGZ!!!"
+ comments:
+ one: "%{count} comment!!!(:"
+ other: "%{count} commentz!! :DDD"
+ zero: "%{count} commentz :("
+ current_segment: "So like, the current segment is like.. averagin <b>%{post_yest}</b> posties per usah, from <b>%{post_day}</b>"
+ daily: "Dailyy"
+ display_results: "Showin results from the like.. <b>%{segment}</b> segment"
+ go: "go!!"
+ month: "Month"
+ posts:
+ one: "%{count} postie"
+ other: "%{count} posties!"
+ zero: "%{count} posties :("
+ shares:
+ one: "%{count} share!(:"
+ other: "OMG u like have %{count} sharez!! :DDD"
+ zero: "%{count} sharez :c"
+ tag_name: "Tag Nameuh: <b>%{name_tag}</b> Countuh: <b>%{count_tag}</b>"
+ usage_statistic: "Usage staties"
+ users:
+ one: "%{count} ppl!(:"
+ other: "%{count} ppl!!! :DDD"
+ zero: "%{count} ppl :c"
+ week: "Week"
+ user_entry:
+ account_closed: "account trashed <3"
+ diaspora_handle: "d* handle"
+ email: "Emale"
+ guid: "gee yew eye dee"
+ id: "eye dee"
+ last_seen: "was like, last seen"
+ ? "no"
+ : "no way!"
+ nsfw: "#groody"
+ unknown: "dunno them"
+ ? "yes"
+ : totally
+ user_search:
+ account_closing_scheduled: "So like, the account of %{name} is waitin 2 b closed. it will b done in a few min, kay?"
+ add_invites: "add invites!! <3"
+ are_you_sure: "R u like... totally sure u wanna trash this account?"
+ close_account: "trash account"
+ email_to: "Email for the ppl 2 invite <3"
+ under_13: "show ppl undah 13 (COPPA)"
+ users:
+ one: "%{count} was like... found! :D"
+ other: "%{count} ppl found!! :D"
+ zero: "%{count} ppl found :("
+ view_profile: "look at profile"
+ you_currently:
+ one: "u only have 1 invite left %{link}"
+ other: "u have like... %{count} invites left %{link}"
+ zero: "u like... have no invites left %{link} :\\"
+ weekly_user_stats:
+ amount_of:
+ one: "Number of new ppl this week: %{count}"
+ other: "Number of new ppl this week: %{count}"
+ zero: "Number of new ppl this week: none :\\"
+ current_server: "So like... the current server date ish like... %{date}"
+ ago: "it was like... %{time} ago"
+ all_aspects: "All aspectz"
+ application:
+ helper:
+ unknown_person: "this person is like... not known... sry bout that :\\"
+ video_title:
+ unknown: "this video title is like... not known... sry bout that :\\"
+ are_you_sure: "R u like, for sure?"
+ are_you_sure_delete_account: "R u like, mental? U like, wanna close ur account? U should like stay! YOLO! Well if u do, remember, like, this CANT b undone. Kay?"
+ aspect_memberships:
+ destroy:
+ failure: "The person was not like... removed... sry bout that :\\"
+ no_membership: "like... we couldnt find the ppl u picked in that aspect... sry bout tht :\\"
+ success: "The person was like... removed.. n stuff..."
+ aspects:
+ add_to_aspect:
+ failure: "there was like... a problem addin bff to aspect."
+ success: "OMG! Movin them like, totally WORKED! <333"
+ aspect_listings:
+ add_an_aspect: "+ Addn aspect"
+ deselect_all: "unhighlight everythin"
+ edit_aspect: "Like edit %{name}"
+ select_all: "highlight everythin"
+ aspect_stream:
+ make_something: "Make somethin.."
+ stay_updated: "stay like... up 2 date"
+ stay_updated_explanation: "Ur wall has like... ur BFFs n tagz n junk on it..."
+ contacts_not_visible: "Ppl in this group will like... not b able 2 c each other n stuff"
+ contacts_visible: "Ppl in this aspect will like.. b able 2 c each other n stuff"
+ create:
+ failure: "group makin failed."
+ success: "Ur new group %{name} was like... created"
+ destroy:
+ failure: "%{name} is like... not gone n so it like... cant b removed... sry bout tht :\\"
+ success: "%{name} is nao like... gone n stuff."
+ edit:
+ aspect_list_is_not_visible: "Ppl in this aspect r like.. not able 2 c each other."
+ aspect_list_is_visible: "Ppl in this aspect r like.. able 2 c each other."
+ confirm_remove_aspect: "R u sure u want 2 like... remove this aspect?"
+ make_aspect_list_visible: "make ppl in this group like... able 2 see each other?"
+ remove_aspect: "Git rid of this aspect"
+ rename: "bag this name.."
+ set_visibility: "Set look at prefs"
+ update: "make like... newer..."
+ updating: "makin like... newer..."
+ index:
+ diaspora_id:
+ content_1: "ur diaspora* id is:"
+ content_2: "give it 2 ne1, except for creepers, n theyll b able to like... find u.."
+ heading: "ur like... id"
+ donate: "give like... free money"
+ handle_explanation: "This is like... ur name thingy. Its like an email... like.. that thing that my mom uses... she's like... so totally disgustin... she like, wheres mom jeans its like barf out! Gag me with a spoon! So like, neway, this will like... let ppl reach u n stuff."
+ help:
+ any_problem: "Havin drama?"
+ contact_podmin: "Contact the dude that manages ur pod!"
+ do_you: "do u... like:"
+ email_feedback: "%{link} ur feedback n junk"
+ email_link: "Emailll <3"
+ feature_suggestion: "... do u like... have a %{link} suggestion?"
+ find_a_bug: "... find a like... %{link}?"
+ have_a_question: "... have a like... %{link}?"
+ here_to_help: "diaspora ppl r here... yay!"
+ mail_podmin: "the email for the ppl who like... run this bitch"
+ need_help: "so like, wat?"
+ tag_bug: "OMG, i like... have an issue!"
+ tag_feature: "cool new thang"
+ tag_question: "q4u"
+ tutorial_link_text: "Tutorialz!!"
+ tutorials_and_wiki: "%{faq}, %{tutorial}, && %{wiki}: Halp for ur first stepz."
+ introduce_yourself: "so this is like, ur stream thing... its like facebooks wall thingy but like... less annoyin n wit like... less adz n picz of food and stuff... like, post sumthin n see if ne1 repliez... like... yeah"
+ keep_diaspora_running: "Keep d* from suckin wit a monthly donation! :D<3"
+ keep_pod_running: "So like, keep %{pod} from bein all slow n stupid by like... donatin monthly n stuff! <3(:"
+ new_here:
+ follow: "follow %{link} n like ... welcome new ppl 2 diaspora*!"
+ learn_more: "like... learn moar n stuff..."
+ title: "dude! u should like, totally whalecum the new diaspora ppl. its a blast like... yeah.."
+ no_contacts: "No BFFs :("
+ no_tags: "+ Find a tag 2 like... follow n junk"
+ people_sharing_with_you: "ppl sharin wit u"
+ post_a_message: "txt somethin >>"
+ services:
+ content: "U can like... connect the followin things 2 d*:"
+ heading: "connect like... other stuff.."
+ unfollow_tag: "Stop creepin on ppl who like... post stuff usin %{tag}"
+ welcome_to_diaspora: "OMG HEY! Like, welcome to diaspora*, %{name}. its pretty bitchin' n has electrolytes(;"
+ new:
+ create: "Make like.. a new aspect"
+ name: "Name (only like... u can c it)"
+ no_contacts_message:
+ community_spotlight: "d* celebz"
+ or_spotlight: "Or u can like... share wit %{link}"
+ try_adding_some_more_contacts: "U can like... search or like... invite moar ppl."
+ you_should_add_some_more_contacts: "U should like... add some moar ppl!"
+ no_posts_message:
+ start_talking: "No 1z gossiped yet! Lame :\\"
+ one: "1 azpect"
+ other: "%{count} aspectz"
+ seed:
+ acquaintances: "Some ppl I sorta kno"
+ family: "Fam"
+ friends: "BFFs"
+ work: "Work bffs"
+ update:
+ failure: "Ur group, %{name}, had like... a rlly long name.. so yeah... it wasnt saved... sry :\\"
+ success: "Ur aspect, %{name}, has like... not flipped out. So ur good!(:"
+ zero: "no aspectz"
+ back: "go back"
+ blocks:
+ create:
+ failure: "couldnt ignore the h8ter. #lame"
+ success: "Aight, u wont c that weirdo on ur wall again. Ur welcome. ;)"
+ destroy:
+ failure: "I couldnt like... unblock that h8ter. #couldntunblockh8terlame"
+ success: "Lets c wat they have 2 say!! #sayhaithar"
+ bookmarklet:
+ explanation: "post 2 d* from like.. anywhere by like... saving this thing => %{link}"
+ heading: "save page thingy"
+ post_something: "put it on d* n stuff"
+ post_success: "its like posted nao... byez! <3"
+ cancel: "Nvm"
+ comments:
+ new_comment:
+ comment: "say somethin"
+ commenting: "sayin somethin"
+ one: "OMG! u got a comment!!!"
+ other: "OMG! u got like %{count} commentz!!!"
+ zero: "like... no commentz :("
+ contacts:
+ create:
+ failure: "there was like... drama when makin a BFF"
+ index:
+ add_a_new_aspect: "add a new aspect!"
+ add_contact: "Add BFF <3"
+ add_to_aspect: "add BFFs 2 %{name}"
+ all_contacts: "All BFFs!!"
+ community_spotlight: "d* celebz <33"
+ my_contacts: "My BFFs!!! <333"
+ no_contacts: "u like... need 2 add sum ppl"
+ no_contacts_message: "OMG! u should like... check out %{community_spotlight}"
+ only_sharing_with_me: "only sharin wit me"
+ remove_contact: "Trash BFF :("
+ start_a_conversation: "start a like... convo"
+ title: "BFFs"
+ user_search: "Ppl stalk"
+ your_contacts: "ur BFFs"
+ one: "1 BFF"
+ other: "%{count} BFFs"
+ sharing:
+ people_sharing: "ppl sharin wit u:"
+ spotlight:
+ community_spotlight: "d* celebz!! <3"
+ suggest_member: "Suggest a membah!!(:"
+ zero: "BFFs"
+ conversations:
+ conversation:
+ participants: "Ppl participatin"
+ create:
+ fail: "bad txt"
+ no_contact: "Umm HELLO, u need 2 like, add them first! Duh!"
+ sent: "txt sent"
+ helper:
+ new_messages:
+ one: "1 new txts! ZOMG!!!"
+ other: "%{count} new txts! ZOMG!!!"
+ zero: "No new txts :("
+ index:
+ conversations_inbox: "Convos - Inbox"
+ create_a_new_conversation: "start a new convo"
+ inbox: "Txts <3"
+ new_conversation: "New convo"
+ no_conversation_selected: "no convo picked :\\"
+ no_messages: "therez like... no messagez :( </3"
+ new:
+ abandon_changes: "nvm?"
+ send: "txt"
+ sending: "txtin..."
+ subject: "topic"
+ to: "2"
+ new_conversation:
+ fail: "Bad txt"
+ show:
+ delete: "get rid of n like... block the convo"
+ reply: "txt bak"
+ replying: "txtin bak..."
+ date:
+ formats:
+ birthday: "%B %d"
+ birthday_with_year: "%B %d %Y"
+ fullmonth_day: "%B %d"
+ delete: "Trash"
+ email: "thing b4 txtin like i think its called like email er sumthin?"
+ error_messages:
+ helper:
+ correct_the_following_errors_and_try_again: "so much drama! chillax n try again, k?"
+ invalid_fields: "not the like... rite fieldz..."
+ login_try_again: "Plz <a href='%{login_link}'> like login</a> n like... try again. Kthx <3"
+ post_not_public: "Umm, the postie u r tryin 2 look at is like... not public! derrp"
+ post_not_public_or_not_exist: "So like, the postie u r tryin to look at is not public or it like.. doesnt exist. sry bout tht :\\"
+ fill_me_out: "Like, put ur txt into here like, K?"
+ find_people: "find new BFFs or #stuff"
+ help:
+ account_and_data_management:
+ close_account_a: "Go like.. 2 the bottom of ur settins page n click the Trash Account button."
+ close_account_q: "how do i like... trash my account?"
+ data_other_podmins_a: "So like, once u r sharin wit some1 on anotha pod, ne posties u share wit them n a copy of ur profile stuff r put on their pod, n r accessible 2 that pod'z database keeper... person.. thing. When u trash a postie err profile content is is trashed from ur pod n ne other podz where it was stored. YAY! <3"
+ data_other_podmins_q: "So like, can the ppl of other pods see my stuff? D:"
+ data_visible_to_podmin_a: "Convos between podz is like... super top secret... like... pinky promise not tell ne1. but like... the stuff on the pod is like... not top secret. the person who like, manages ur pod n stuff can like.. see everythin u put on it which is like... wat FB does like... constantlay. totally freaking lame, right? but theres like this cool part of d* where u can run like ur OWN pod n like thats more private n stuff cuz u like control everythin. freakin sick nasty right? :DDD"
+ data_visible_to_podmin_q: "so like... how much of my stuff can the ppl who run this pod like... see? #creepedout"
+ download_data_a: "ya. at like... the bottom of the account tab thingy in ur like... settins page there r like... 2 buttons for dling ur stuff."
+ download_data_q: "can I like... dl a copy of all my stuff on my account?"
+ move_pods_a: "so like, in the future, u will like... b able 2 export ur account from a pod n like... import it on another but this is like, not possible right nao. sry bout that. but u could like.. always open another account n add ur BFFs 2 groups on that new account, n like... ask them 2 add ur new account 2 their groups. K?"
+ move_pods_q: "So like, how do I move my account from one pod 2 another one? :o"
+ title: "Account n stuff management"
+ aspects:
+ change_aspect_of_post_a: "Nope, butt u can always like... make a new postie wit the same stuff and post eet 2 a different aspect. c:"
+ change_aspect_of_post_q: "So like, once ive posted somethin, can i like.. change the aspect(z) that can like.. see it? :o"
+ contacts_know_aspect_a: "nah. they cant."
+ contacts_know_aspect_q: "do like... my BFFs kno which aspects i like.. put them in?"
+ contacts_visible_a: "If u like, pick this option then ppl from that aspect will like... b able 2 c who else is in it on ur profile under ur pic. its like... best 2 pick this option only if like... the ppl in the aspect all kno each other. but like, they still wont kno wat the aspect is called, kay?"
+ contacts_visible_q: "so like, what does \"make BFFs in this aspect able to be seen by each other\" mean? its moar confusin than my Math class."
+ delete_aspect_a: "So like, in ur list of aspectz on the left side of the main page thingy, point ur mouse at like... the aspect u wanna trash. click the adorable little 'edit' pencil thingy that comes up on the right. then like, click the trash button in the box that comes up. Kay?"
+ delete_aspect_q: "How do I like... trash a group?"
+ person_multiple_aspects_a: "Ya. Like, go 2 ur BFFs page n click on my BFFs. for each BFF u can like... use the menu on the right 2 add them 2 (or like... trash them from) as many aspectz as u want. or u can like... add them 2 a new aspect (or trash them from an aspect) by like.. clickin the aspect picker button on their profile. or u can even like... just move the pointer thingy over their name where u like.. c it n the stream, n a 'hover-card' will like... come up. u can change the aspectz they r in right tharrr <3"
+ person_multiple_aspects_q: "So like, can I add a person 2 many aspects?"
+ post_multiple_aspects_a: "Ya. When u like.. make a postie, use the aspect picker button 2 pick or unpick aspectz. Ur post will b shown to like... ALL the aspectz u pick. u could also like... pick the aspectz u wanna post 2 in the sidebar thingy. when u post, the aspect(z) u picked in the list on teh left will automagically b picked in the aspect picker when u start 2 make a new postie <3 Kay? <3"
+ post_multiple_aspects_q: "So like, can i like, make a postie of some stuff n send it 2 many aspects @ once?"
+ remove_notification_a: "Nah"
+ remove_notification_q: "So like, if i trashed some1 from an aspect, err all of mah aspects, r they like... notified of this?"
+ rename_aspect_a: "Ya. In ur aspectz list thingy on the left side of the main page, like, point ur mouse at the aspect u wanna change the name of. then like, click the ADORABLE little 'edit' pencil thingy that like... comes up on the right. then liek, click rename in the box that comes up. yeah."
+ rename_aspect_q: "can i like, change the name of an aspect?"
+ restrict_posts_i_see_a: "ya. u have 2 like... click on My Aspects err whatever its called. its like in the sidebar thingy n then click individual (woah that weird was so big it made me lightheaded like that 1 time at band camp) aspects in the list thing 2 pick or not pick them. only like... the posties by ppl in the picked aspects will b seen by u on ur Wall n stuff."
+ restrict_posts_i_see_q: "so like, can i like... restrict the posties i c 2 just those from certain aspects?"
+ title: "Aspectz <33"
+ what_is_an_aspect_a: "Aspectz r like, the way u group ur BFFs on d*. an aspect is like... one of the faces u show 2 the world. sort of like wat brittany does. shes such a two-faced bitch fer sure. but like, on d* its like.. kay cuz liek u dont have 2 b showin ur grandpa ur like.. bikini picz which is like.. super gnarly... its totally tubular!!! :D"
+ what_is_an_aspect_q: "Wat is an aspect er group er whatev?"
+ who_sees_post_a: "so like, if u like... make a postie thats like... limited, it will only like, b seen by the ppl u have in ur aspect or group or groups err whatever. BFFs u have that like... arent in the aspect have like... no way of seein the postie, unless u set it 2 like... internet or public n junk. like, only like... posties that r set 2 public can b seen by ppl who u havent like... place in 1 of ur aspects. totally weird, right?"
+ who_sees_post_q: "when i like... make a postie 2 a aspect er whatever.. who can like.. see it?"
+ foundation_website: "d* foundation site! i lurve it!! <3"
+ getting_help:
+ get_support_a_hashtag: "ask in a public postie on d* usin the %{question} hashtag"
+ get_support_a_irc: "join us on %{irc} (Live, nerdy chat)"
+ get_support_a_tutorials: "check out our like, %{tutorials}"
+ get_support_a_website: "like, go to our %{link}"
+ get_support_a_wiki: "search teh %{link} :D!"
+ get_support_q: "So like, wat if mah queztion is like... not answered in this FAQ thingy? Where else can I like.. get support?"
+ getting_started_a: "OMG! ur in luck! :D. Try the %{tutorial_series} on our site thingy. It will like, take u step by step (Not the old TV show btw) through the registration process n like teach u all the thingys u need 2 kno bout usin d*! :D Like, totally try it! <3"
+ getting_started_q: "Halp!! i need sum like... simple halp 2 get me started!"
+ title: "Gettin halp"
+ getting_started_tutorial: "'Gettin started' tutorial seriez"
+ here: "like, here."
+ irc: "Nerd chat, gross"
+ keyboard_shortcuts:
+ keyboard_shortcuts_a1: "In the steam u can like use these keybored shorties:"
+ keyboard_shortcuts_li1: "j - to like... go to next postie"
+ keyboard_shortcuts_li2: "k - to like... go to last postie"
+ keyboard_shortcuts_li3: "c - comment on the current postie"
+ keyboard_shortcuts_li4: "l - <3 the current postie"
+ keyboard_shortcuts_q: "What key shorties r available?(:"
+ title: "Keypad shorties!!!"
+ markdown: "markydown"
+ mentions:
+ how_to_mention_a: "So like, you type this thing: @ n start typin their name. Then this like... little menu thingy will come up n like let u pick their name. But like, remember that u can like.. only mention ppl u've added n stuff. Totally lame sometimes :\\"
+ how_to_mention_q: "So like, how do I like... mention some1 when making a postie?"
+ mention_in_comment_a: "Mmm... nope. sry bout that :\\"
+ mention_in_comment_q: "So can I like... mention some1 in a comment? :o"
+ see_mentions_a: "Ya, click \"Mentionz\" in the like.. left column on ur home page. K?"
+ see_mentions_q: "Is there like, a way 2 c the posties that ive been mentioned in?"
+ title: "Mentionz!"
+ what_is_a_mention_a: "So like, a mention is a link 2 a persons profile that comes up in a postie. When some1 is mentioned they like... get a notie that bugs them when their doin stuff n gets them 2 come check it out."
+ what_is_a_mention_q: "Wats a mention?"
+ miscellaneous:
+ back_to_top_a: "Ya. After scrollin down a page, like, click on teh grey arrow tht comes up in the bottom right corner of ur web browser window thingy..."
+ back_to_top_q: "Is there like... a quick way 2 go back 2 the like... top of a page after i like... scroll down?"
+ diaspora_app_a: "There r many Android apps in like... super early makin. many r like.. not worked on projects n they liek dont work well wit the current version of d*. so like dont expect totally awesome stuff wit these. just use a browser on ur mobile thingy cuz weve made a like... mobile version of teh site which should work well on like... ALL things. there is currently no iOS app tho. sry bout tht :\\"
+ diaspora_app_q: "Is there like... a d* app for Android err iOS err Windows Phone? :o"
+ photo_albums_a: "Nah, not right nao. Butt u can like, look at a stream of their added pics from the Pics and Selfies section in their profile."
+ photo_albums_q: "R there like... pic or vid albumz?"
+ subscribe_feed_a: "Ya, butt this is like... stil not a rlly great workin feature n the formattin of the resultz is kinda groody... but if u like, wanna try it neway, go 2 some1s profile n click the feed button in ur browser, or u can copy pasta the profile link into a feed reader thingy. the resultin feed addy lookz like this: https://joindiaspora.com/public/usahname.atom -- D* uses Atom rather than RSS. JustFYI! <333"
+ subscribe_feed_q: "Can i like... subscribe 2 some1's public posties wit a feed reader thingy?"
+ title: "Misc. stuff"
+ pods:
+ find_people_a: "Invite ur frandz usin the email link in the sidebar thingy. Follow #tagz 2 discovah otherz that liek the same stuff u liek n add those who post thingz that u liek 2 2 an aspect. b for sure 2 liek, say ur #newhere in a public postie! <3"
+ find_people_q: "So like, I just joined a pod thingy. How can I like... find ppl 2 share wit?"
+ title: "Podz"
+ use_search_box_a: "So like, if u kno their fill d* ID (e.g. usahname@podname.org), u can find them by searchin for it. if u r on the same pod u can look for just their usahname. another thing u can do is look for them by their profile name. if lookin them up doesnt work the first time, try again. Kay?"
+ use_search_box_q: "How do I like... use the search box thingy 2 find ppl?"
+ what_is_a_pod_a: "So like, a pod is a compy runnin d* on it and it can liek talk 2 the rest of d*. \"Pod\" as in like, plants that have seedz, yes... liek that plant hehe... just liek how a server, computah thingy has a bunch of different accountz. therez lotz of podz n u can add BFFs from othah podz n talk wit them. n stuff."
+ what_is_a_pod_q: "Wats a pod?"
+ posts_and_posting:
+ char_limit_services_a: "in like, that case ur postie is like, limited 2 the smallah key pressed cont (twittar is liek, 140 n tumblar is liek, 1000), n the numbah of key presses u have left 2 use r display when that servie's icon is highlighted. u can stil post 2 these servies if ur postie is longer than their limit, but the txt is like.. smallar on those servies, kay?"
+ char_limit_services_q: "Wat is the amount of times for posties shared 2 other servies wit a smallar key pressed count?"
+ character_limit_a: "Like, a lot. Its like, 65,535 presses. Which is like.. totally rad cuz like... Twittar only lets u have like.. 140. totally lame..."
+ character_limit_q: "so wats the like, amount of times can i press a key in my posties?"
+ embed_multimedia_a: "U can like, usually just paste a link (like, http://www.youtube.com/watch?v=3dcxtEKShXA) into ur postie n the vid or sound will b in the thingy automagically. some of the sitez that r able 2 do this r: YT, Vimeo, soundcloud, flickah n a few moar. d* uses this thingy called oEmbed for this featuh. were supportin new sitez all the time. remembah 2 alwayz post simple, fill linkz: no shortend linkz && no weird symbolz after the link; n give it a lil time b4 u reload the page after postin 2 c the preview. Kthx!!! <33"
+ embed_multimedia_q: "How do I like... put a vid, tune, err other media stuff into a postie?"
+ format_text_a: "By usin like... %{markdown}. U can find teh full Markydown stuff %{here}. The preview button rlly halps, as u can c how ur txt will look b4 u post it."
+ format_text_q: "So how can I like, format txt in mah posties (bold, slanted txt, etc)?"
+ hide_posts_a: "So like, if u point ur mouse at the top of a postie, a cute lil X comes up on the right. click it 2 hide the postie n mute noties bout it. u can still c the post f u visit the profile of the person who made it.(:"
+ hide_posts_q: "So like, how do I like.. hide a postie? N how do I stop gettin noties bout a postie that i like.. commented on? :o"
+ image_text: "pic txt"
+ image_url: "pic linkk"
+ insert_images_a: "So like, click on the cute lil camera thingy 2 add a pic into a postie. Press the pic icon thingy again 2 add another pic, or u can like... pick multiple pics 2 add in 1 go at it. :D"
+ insert_images_comments_a1: "The followin Markydown code"
+ insert_images_comments_a2: "can b used 2 like.. put pics from the web into comments as well as in posties :)"
+ insert_images_comments_q: "Can I insert picz into commentz? :o"
+ insert_images_q: "How do I like... put picz into posties?"
+ size_of_images_a: "No :\\ Pics r resized automagically 2 fit the Wall err stream. Markydown doesnt have a code for specifyin a picz size n stuff."
+ size_of_images_q: "Can I like... customize the size of pics in posties or commentz?"
+ stream_full_of_posts_a1: "ur Wall err stream err whatever is like.. made up of 3 kindsa posties:"
+ stream_full_of_posts_li1: "Posties by ppl u r sharin wit, which come in 2 kinds: public posties n limited posties shared wit an aspect tht u r part of. 2 trash these posties from ur stream, just stop sharin wit the person."
+ stream_full_of_posts_li2: "Like, public posties containin 1 of the tagz tht u follow. 2 trash these, stop followin the tag. yeah..."
+ stream_full_of_posts_li3: "Public posties by ppl listed in the d* celebz thingy. these can b trashed by uncheckin' the \"show d* celebz in stream?\" thingy in the account tab of ur settins."
+ stream_full_of_posts_q: "So like, y is my streem full of posties from ppl idk n dont share wit?"
+ title: "Posties and postin"
+ private_posts:
+ can_comment_a: "Only like, d* ppl who r logged in that r in tht aspect can comment on or liek ur private postie."
+ can_comment_q: "Who can like.. comment on err liek mah private posties?"
+ can_reshare_a: "No1. Private posties r not resharable. d* ppl tht r logged in tht r in tht r in that aspect can just copy pasta it tho. sry bout tht :\\"
+ can_reshare_q: "So who can like... reshare my private posties?"
+ see_comment_a: "Only the ppl that the postie was shared wit (the ppl who r in the aspectz picked by the poster) can c its commentz n likez. "
+ see_comment_q: "when i like, comment on or liek a private postie, who can c it???"
+ title: "Privy posties!"
+ who_sees_post_a: "Only like, d* ppl who r logged in that r in tht aspect can c ur private postie."
+ who_sees_post_q: "So like, when i post a txt 2 an aspect (as in a private postie), who can c it???"
+ private_profiles:
+ title: "Private profilez!!!"
+ whats_in_profile_a: "ur like, bio, location, gendah, n bday. its the stuff in the bottom part of the edit profile page thingy. all this info is optional - its up 2 u whether u fill it in. logged in ppl who u have added 2 ur aspectz r the only ppl who can c ur private stuff. they will also like, c the private posties that r made to the aspectz they r in, mixed in with ur public posties, n when they look at ur profile. kay?"
+ whats_in_profile_q: "So like, wats in mah private profile? :o"
+ who_sees_profile_a: "ne logged in ppl that u r sharin wit (meanin, u have added them 2 1 of ur aspectz). howevah, ppl followin u, but u do not follow, will c only ur public info."
+ who_sees_profile_q: "Who can like... c my private profile?"
+ who_sees_updates_a: "Ne in ur aspectz can like... c the changes 2 ur private profile. "
+ who_sees_updates_q: "Who can like... c updates 2 mah private profile? :o"
+ public_posts:
+ can_comment_reshare_like_a: "Ne d* ppl who r logged in can do that. Yeah."
+ can_comment_reshare_like_q: "Who can like... comment on, reshare or like... like my public posties?"
+ deselect_aspect_posting_a: "unpickin aspectz doesnt affect a public postie. it will like, still come up in the streamz of all ur BFFs. 2 make a postie viewable only 2 certain aspectz, u need to like, pick those aspects from the button thingy under the liek, publisher thing. yeah."
+ deselect_aspect_posting_q: "So like, what happenz when i like... unpick 1 err moar aspectz when makin a public postie?"
+ find_public_post_a: "Ur like, public posties will come up in the streamz of ne1 followin u. if u included #tagz in ur public postie, ne1 followin those tagz will find ur posy in their streamz. every public postie also has a certain link that ne1 can look at, even if theyre not logged in - so public posties may b linked 2 directly from twittar, blogz, etc. public posts may like, also b indexed by google n other nosey search engine ppl. just fyi!!!"
+ find_public_post_q: "So how can like.. other ppl find my public postie?"
+ see_comment_reshare_like_a: "Ne like, logged in d* ppl n ne1 else on the interwebz can c it. like, commentz, likez, n reshares of public posties r also public n stuff. yeah."
+ see_comment_reshare_like_q: "So like, when i comment on, reshare or like... like a public postie, who can c it then? :o"
+ title: "Public posties!!!"
+ who_sees_post_a: "ne1 usin the internet can possibly c a postie u mark public, so make for sure u rlly do want ur postie 2 b public. its a great way of reachin out 2 the world tho."
+ who_sees_post_q: "When I like... post somethin publicly, like, who can c it?"
+ public_profiles:
+ title: "Public profilez!"
+ what_do_tags_do_a: "They halp ppl get 2 kno u. Ur profile pic will also come up on the left side of those certain tag pagez, along wit ne1 else who has them in their public profile n stuff."
+ what_do_tags_do_q: "Wat do the tagz on mah public profile do? Like, so confused.."
+ whats_in_profile_a: "Ur like, name, the 5 tagz u chose 2 describe urself, n ur pic. its the stuff in the top part of the edit profile page thingy. u can like, make this profile info as obvious or not obvious as u would like. Ur profile page also showz ne public posties u have made.."
+ whats_in_profile_q: "So like, wats in my public profile?"
+ who_sees_profile_a: "ne logged in d* usah, as well as the internetz, can c it. so liek, each profile has a link, so it may b linked 2 directly from other sites. it may b listed by search engine ppl."
+ who_sees_profile_q: "Who can like.. c my public profile? o_o"
+ who_sees_updates_a: "Ne1 can like... c changes if they go to ur profile page..."
+ who_sees_updates_q: "Who like... c's updates 2 my public profile?"
+ resharing_posts:
+ reshare_private_post_aspects_a: "Nah, its not possible 2 reshare a private postie. This is 2 respect the intention of teh original poster who only shared it wit a certain group of ppl. Kay? Kay, good."
+ reshare_private_post_aspects_q: "Can I like... reshare a private postie with like... only certain aspectz?"
+ reshare_public_post_aspects_a: "Nah, when u like, reshare a public postie, it automagically bcomes 1 of ur public posties. 2 share it wit certain aspectz, copy pasta the stuff of the postie in2 a new postie."
+ reshare_public_post_aspects_q: "so can i like, reshare a public postie wit only certain aspectz?"
+ title: "Resharin posties"
+ sharing:
+ add_to_aspect_a1: "lets say that Brittany adds Ben 2 an aspect, but Ben has not (yet) like, added Brittany 2 an aspect:"
+ add_to_aspect_a2: "this is called like.. asymmetrical sharin (big word, woah!!!). if n when Ben also adds Brittany 2 an aspect then it would bcome mutual sharin, wit both Brittany's n Ben's public posties and related private posties appearin in each otherz streamz, etc. "
+ add_to_aspect_li1: "So like, Ben will like, get a notie that Brittany has like... \"started sharin\" wit him. probs sharin an STD knowin her. that bitch."
+ add_to_aspect_li2: "Brittany will like... start to c Ben's public posties in her stream. as well as THC... that bitch..."
+ add_to_aspect_li3: "Brittany will like... not c ne of Ben's private posties."
+ add_to_aspect_li4: "Ben will like... not c ne of Brittany's public or private posties in his stream either."
+ add_to_aspect_li5: "But liek, if Ben goes to Brittany's profile, then he will c Amy's private posties that that bitch makes to her aspects that hes in. as well as like.. her public posties which ne1 can c there)."
+ add_to_aspect_li6: "Ben will like... b able 2 c Brittany's private profile (bio, location, gender, bday, small boobs, etc)."
+ add_to_aspect_li7: "Brittany will like... come up under \"Only sharin wit me\" on Ben's BFFs page."
+ add_to_aspect_q: "so like, wat happenz when i add some1 2 1 of my aspectz? or when some1 adds me 2 1 of their aspectz?"
+ list_not_sharing_a: "Nah, butt u can c whether err not some1 is sharin wit u by lookin at their profile. if they r, the bar under their profile pic will be green; if not, itll b grey like mah kitty. U should liek, get a notie each time some1 starts sharin wit u. Kay?"
+ list_not_sharing_q: "is there liek, a list of ppl who i like, added 2 1 of mah aspectz, butt who have like, not added me to 1 of theirs yet?"
+ only_sharing_a: "These r ppl that have like, added u 2 1 of their aspectz, butt who r not (yet) in ne of ur aspectz. In other wordz, they r sharin wit you, butt u r not sharin wit them (that big werd asymmetrical sharin again). if u add them 2 an aspect, they will then show up under tht aspect n not under \"only sharin wit u\". Look above.(;"
+ only_sharing_q: "so like, who r the ppl listed in \"Only sharin wit meh\" on mah BFFs page?"
+ see_old_posts_a: "Nah. They will only b able 2 c new posties 2 tht aspect. they (n every1 else) can c ur older public posties on ur profile, n they may also c them in their stream."
+ see_old_posts_q: "So liek, when i add some1 2 an aspect, can they c oldr posties tht I have like, already posted 2 that aspect???"
+ title: "Sharin"
+ tags:
+ filter_tags_a: "Sry but this is like, not yet workin through d*, butt some %{third_party_tools} have like, been made tht might do this. YAY FREE SOFTWARE!!! :DDD"
+ filter_tags_q: "So liek, how can i liek, get rid of certain tagz from mah stream???"
+ followed_tags_a: "After like, lookin for a like, tag like, u can liek, click the button at like the top of teh tag'z page 2 like \"follow\" tht tag. then it will like, come up in ur list of like, followed tagz on the like left. clickin 1 of ur like followed tagz takez u 2 tht tag'z like, page thingy, so u can like, c recent postiez wit tht tag in it. u can like, click on #Followed Tagz 2 c a stream of postiez tht include 1 of ne of ur followed tagz. Kay? "
+ followed_tags_q: "Wat r \"#Followed Tagz\" neway? How do u like.. follow them?"
+ people_tag_page_a: "They r ppl who have picked tht tag to describe themselves in their public profile... so yeah like... yeah..."
+ people_tag_page_q: "So like, who r the ppl listed on the left side of a tag page thingy???"
+ tags_in_comments_a: "A tag added 2 a comment will still come up as a link 2 tht tag'z page, butt it will not make tht postie (or comment) come up on tht tag page. This only workz for tagz in postiez."
+ tags_in_comments_q: "Can I like... put tagz in commentz or just in like... posties..?"
+ title: "Tagz!!"
+ what_are_tags_for_a: "Tagz r a way to organize postiez by a certain topic usually. Lookin for a tag showz all postiez wit tht tah tht u can c (both public and private postiez). This letz ppl who liek the same topic find public postiez bout it."
+ what_are_tags_for_q: "Wat r tagz like... for?"
+ third_party_tools: "3rd partay toolz"
+ title_header: "Halp"
+ tutorial: "tutorial<3"
+ tutorials: "tutorialz!!"
+ wiki: "ZOMG D*'s OWN WIKIPEDIA!! :DDD"
+ hide: "Cover"
+ ignore: "Talk to the hand"
+ invitation_codes:
+ excited: "%{name} is like so TOTALLY excited 2 see u!! :D"
+ invitations:
+ a_facebook_user: "a like... fb usah"
+ check_token:
+ not_found: "invite token was like... not found :\\"
+ create:
+ already_contacts: "u r like.. already talkin 2 this ppl"
+ already_sent: "u like... already invited this ppl."
+ empty: "Plz enter at least 1 email addy, thx<3"
+ no_more: "u have like... no moar invites."
+ note_already_sent: "Invites have like... already been sent 2: %{emails}"
+ own_address: "Umm, u like... cant send an invite 2 ur own address.. duh."
+ rejected: "the followin email addys made drama: "
+ sent: "Ur invites have like... ben sent 2: %{emails}"
+ edit:
+ accept_your_invitation: "RSVP"
+ your_account_awaits: "ur account like.. awaits! OMG! TOTALLY!"
+ new:
+ already_invited: "The followin ppl didnt like accept ur invite:"
+ aspect: "Aspectt"
+ check_out_diaspora: "check out d* dude!!"
+ codes_left:
+ one: "So theres like... one invite left on this code. Yup."
+ other: "ZOMG! theres like %{count} invites left on this code... yeah..."
+ zero: "sry, theres like no invites left on this code. omg like totally lame.... yeah... wanna go 2 taco bell?(:"
+ comma_separated_plz: "U can enter lots of different email addies by usin commaz! <3"
+ if_they_accept_info: "if they like... accept, they will b added 2 the group u like invited them 2..."
+ invite_someone_to_join: "invite sum1 2 da partay!!!"
+ language: "what do u like... speak?"
+ paste_link: "Share this link wit ur BFFs 2 invite them 2 d*, or like... txt them the link n stuff."
+ personal_message: "sext(;"
+ resend: "Re-txt"
+ send_an_invitation: "send an invite"
+ send_invitation: "send invite"
+ sending_invitation: "Sendin invite, hold up..."
+ to: "2"
+ layouts:
+ application:
+ back_to_top: "Go back 2 the top"
+ powered_by: "this site is like... powered by diaspora*... far out!!"
+ public_feed: "the feed for %{name} that like... every1 can c n stuff"
+ source_package: "dl code n stuff.."
+ toggle: "make like... phone friendly..."
+ whats_new: "sup?"
+ your_aspects: "ur like... aspectz"
+ header:
+ admin: "the man"
+ blog: "bllllooog"
+ code: "code"
+ help: "Halp"
+ login: "check in"
+ logout: "Bounce"
+ profile: "Wall"
+ recent_notifications: "Recent noties! <3"
+ settings: "Settins"
+ view_all: "Look at all"
+ likes:
+ likes:
+ people_dislike_this:
+ one: "%{count} dislike :("
+ other: "%{count} dislikes :((("
+ zero: "no dislikes(:"
+ people_like_this:
+ one: "1 like!! OMG!!!"
+ other: "%{count} likes!!! OMFG!!!"
+ zero: "omg, theres like.. no likes :("
+ people_like_this_comment:
+ one: "%{count} like!!!"
+ other: "%{count} likez!!! :D"
+ zero: "no likes :("
+ limited: "Only ur BFFs can c these! OMG!"
+ more: "Moar"
+ next: "next!"
+ no_results: "no results found... lame..."
+ notifications:
+ also_commented:
+ one: "%{actors} also like... commented on %{post_author}'s postie %{post_link}!!"
+ other: "%{actors} also like... commented on %{post_author}'s postie %{post_link}!!"
+ zero: "%{actors} also like... commented on %{post_author}'s postie %{post_link}!!"
+ also_commented_deleted:
+ one: "%{actors} like... commented on a trashed postie."
+ other: "%{actors} like... commented on a trashed postie."
+ zero: "%{actors} like... commented on a trashed postie."
+ comment_on_post:
+ one: "%{actors} commented on ur postie %{post_link}. OMG!"
+ other: "%{actors} commented on ur postie %{post_link}. OMG!"
+ zero: "%{actors} like... commented on ur postie %{post_link}."
+ helper:
+ new_notifications:
+ one: "1 new notie!!"
+ other: "%{count} new noties!!! :D"
+ zero: "no new noties :("
+ index:
+ all_notifications: "All noties"
+ also_commented: "Also comment'd"
+ and: "n"
+ and_others:
+ one: "n 1 more"
+ other: "n like.. %{count} others"
+ zero: "n no1 else"
+ comment_on_post: "Comment on postie"
+ liked: "lieked"
+ mark_all_as_read: "i totally read them all"
+ mark_all_shown_as_read: "I read all of these..."
+ mark_read: "i liek, read this"
+ mark_unread: "umm, HELLO, i havent read this"
+ mentioned: "Mentioned"
+ notifications: "Noties!"
+ reshared: "Reshared! <3"
+ show_all: "show like, all"
+ show_unread: "show like, unread stuff"
+ started_sharing: "Started like... sharin"
+ liked:
+ one: "%{actors} has like... liked ur postie %{post_link}."
+ other: "%{actors} have like... liked ur postie %{post_link}."
+ zero: "%{actors} have like... liked ur postie %{post_link}."
+ liked_post_deleted:
+ one: "%{actors} like.. liked ur trashed postie."
+ other: "%{actors} like... liked ur trashed postie."
+ zero: "%{actors} like.. liked ur trashed postie."
+ mentioned:
+ one: "%{actors} has like.. mentioned u in the postie %{post_link}."
+ other: "%{actors} have like... mentioned u in the postie %{post_link}."
+ zero: "%{actors} have like... mentioned u in the postie %{post_link}. :("
+ mentioned_deleted:
+ one: "%{actors} like... mentioned u in a trashed postie."
+ other: "%{actors} like... mentioned u in a trashed postie."
+ zero: "%{actors} like... mentioned u in a trashed postie."
+ post: "postie!!"
+ private_message:
+ one: "%{actors} sent u a txt"
+ other: "%{actors} sent u a txt"
+ zero: "0 %{actors} sent u a txt"
+ reshared:
+ one: "%{actors} has like... reshared ur postie %{post_link} && stuff.."
+ other: "%{actors} have like... reshared ur postie %{post_link} && stuff.."
+ zero: "%{actors} have like... reshared ur postie %{post_link} && stuff.."
+ reshared_post_deleted:
+ one: "%{actors} like... reshared ur trashed postie."
+ other: "%{actors} like... reshared ur trashed postie."
+ zero: "%{actors} like... reshared ur trashed postie."
+ started_sharing:
+ one: "%{actors} started sharin wit u."
+ other: "%{actors} started sharin wit u!!! :DDD"
+ zero: "%{actors} started sharin wit u :("
+ notifier:
+ a_post_you_shared: "a postie!!"
+ accept_invite: "RSVP ur d* invite!!"
+ click_here: "click this txt"
+ comment_on_post:
+ reply: "Reply or like... look at %{name}'s postie >"
+ confirm_email:
+ click_link: "2 like, activate ur like new email %{unconfirmed_email}, plz like, follow this link:"
+ subject: "Plz like... confirm ur new email %{unconfirmed_email}. K thx!!! <3"
+ email_sent_by_diaspora: "This email was like... sent by %{pod_name}. If u'd like... to like... stop gettin emails like this,"
+ hello: "OMG HEY! %{name}"
+ invite:
+ message: |-
+ Ohai!
+
+ U have like... been invited 2 join diaspora*!
+
+ Click this link thingy 2 like.. get started
+
+ [%{invite_url}][1]
+
+
+ <3,
+
+ The d* email robot!
+
+ [1]: %{invite_url}
+ invited_you: "%{name} invited u 2 d*!!!"
+ liked:
+ liked: "OMG! %{name} has like liked ur postie!!!"
+ view_post: "Look at postie >"
+ mentioned:
+ mentioned: "mentioned u in a postie:"
+ subject: "OMG! %{name} has like... mentioned u on d*"
+ private_message:
+ reply_to_or_view: "Reply 2 or like... look at this convo >"
+ report_email:
+ body: |-
+ Ohai!
+
+ the %{type} wit ID %{id} waz marked as groody. yeah.
+
+ [%{url}][1]
+
+ Plz like, check in on this, kay?
+
+
+ Kthxbye,
+
+ The d* email robot <3
+
+ [1]: %{url}
+ subject: "A new %{type} was like... marked as gag me with a spoon."
+ type:
+ comment: "commentt<3"
+ post: "postie"
+ reshared:
+ reshared: "%{name} like... reshared ur postie... tubular!!"
+ view_post: "Look at postie >"
+ single_admin:
+ admin: "ur dude that runs everythin"
+ subject: "A txt bout ur d* account:"
+ started_sharing:
+ sharing: "has like... started sharin wit u!"
+ subject: "ZOMG!! so like.. %{name} has TOTALLY started sharin wit u!!!(:"
+ view_profile: "Look at %{name}'s profile"
+ thanks: "thx,"
+ to_change_your_notification_settings: "2 change ur notie settins"
+ nsfw: "OMG! GROODY!"
+ ok: "For SURE"
+ or: "or like"
+ password: "Passwerd"
+ password_confirmation: "2 make sure u put in the right passwerd n junk"
+ people:
+ add_contact:
+ invited_by: "u were like... invited by"
+ add_contact_small:
+ add_contact_from_tag: "add BFF frum tag"
+ aspect_list:
+ edit_membership: "like.. edit aspect membership n junk"
+ helper:
+ is_not_sharing: "%{name} is not sharin wit u :("
+ is_sharing: "%{name} is sharin wit u!!"
+ results_for: " ur like.. resultz for %{params}"
+ index:
+ couldnt_find_them: "couldnt find them? thats totally lame :("
+ looking_for: "U like... lookin for posties tagged %{tag_link}?"
+ no_one_found: "...and nothin was like... found. sry bout that :\\"
+ no_results: "OMG! Hey! U like, need 2 search for sumthin."
+ results_for: "Ppl who match ur like... search thingy %{search_term}"
+ search_handle: "use their d* ID (usahname@pod.tld) to b for sure 2 find ur BFFs."
+ searching: "im lookin, brb... <3"
+ send_invite: "still nothin? :( send an invite!!! :DDD"
+ one: "1 personz"
+ other: "%{count} ppl"
+ person:
+ add_contact: "add BFF <3"
+ already_connected: "ur like... already connected n stuff"
+ pending_request: "waitin' on request"
+ thats_you: "OMG! thats u!!!! FAR OUT!"
+ profile_sidebar:
+ bio: "all about meee <333"
+ born: "Bday"
+ edit_my_profile: "change my stuff.."
+ gender: "dude or dudette or whatev..."
+ in_aspects: "in aspectz"
+ location: "my crib"
+ photos: "Picz n selfiez"
+ remove_contact: "delete BFF"
+ remove_from: "Do u like... wanna trash %{name} from %{aspect}?"
+ show:
+ closed_account: "this profile is gone dude..."
+ does_not_exist: "they dont like... exist :\\"
+ has_not_shared_with_you_yet: "%{name} has like... not shared ne posties wit u yet!"
+ ignoring: "U r like... ignorin all posties from %{name}."
+ incoming_request: "%{name} wants 2 like... share wit u"
+ mention: "Tag person"
+ message: "Txt"
+ not_connected: "ur not like... sharin wit this person... im sure!"
+ recent_posts: "Recent posties!!!"
+ recent_public_posts: "Recent posties that like... every1 can c!!!"
+ return_to_aspects: "bounce back 2 ur aspectz page... thingy..."
+ see_all: "C all!!!"
+ start_sharing: "start like... sharin"
+ to_accept_or_ignore: "2 like... accept or not accept.."
+ sub_header:
+ add_some: "like... add sum"
+ edit: "edit!"
+ you_have_no_tags: "Umm, u like have no tagz! Duh!"
+ webfinger:
+ fail: "sry, we cant find %{handle}"
+ zero: "no ppl"
+ photos:
+ comment_email_subject: "%{name}'s pic!"
+ create:
+ integrity_error: "The pic didnt like... upload. R u like for sure that was a pic n not somethin else?"
+ runtime_error: "Pic didnt like... upload. R u like for sure ur duck face is like.. ducky enough?"
+ type_error: "So like... ur pic wasnt added. r u like... sure u actually like... added it?"
+ destroy:
+ notice: "Pic deleted :o"
+ edit:
+ editing: "Editin"
+ new:
+ back_to_list: "Go back to the like... list"
+ new_photo: "New pic!! OMG! -duck face-"
+ post_it: "OMG! post it!"
+ 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:
+ or_select_one_existing: "or like... pick 1 from ur %{photos}"
+ upload: "Upload a new selfie!!! OMG!!"
+ photo:
+ view_all: "look at all of %{name}'z picz"
+ show:
+ collection_permalink: "the like... collection permalink... thing.."
+ delete_photo: "Delete pic"
+ edit: "edit picz and selfiez"
+ edit_delete_photo: "Edit pic topic / trash pic"
+ make_profile_photo: "make profile pic"
+ show_original_post: "Show da original postie"
+ update_photo: "Change Pic"
+ update:
+ error: "the pic wasnt like... edited... sry bout that :\\"
+ notice: "pic changed <3"
+ posts:
+ presenter:
+ title: "A postie from %{name}"
+ show:
+ destroy: "Trash ur pic"
+ not_found: "Sry, but we like... couldnt find that postie. :\\"
+ permalink: "like... permalink"
+ photos_by:
+ one: "One pic by %{author}"
+ other: "%{count} picz by %{author}"
+ zero: "No picz by %{author}"
+ reshare_by: "Reshare is like... by %{author}"
+ previous: "prevy!"
+ privacy: "OMG give me some privacy!"
+ privacy_policy: "Wat like... privacy u have"
+ profile: "Like ur profile"
+ profiles:
+ edit:
+ allow_search: "Do u wanna like... let ppl stalk u within d*?"
+ edit_profile: "Edit profie!!"
+ first_name: "First name? Kthx"
+ last_name: "Last name? Kthx"
+ nsfw_check: "Like, mark everythin i share as groody"
+ nsfw_explanation: "Groody (NSFW) is d*'s thingy to hide nudes n other groody stuff that like.. can get u in trouble. make sure u liek, check this thingy if u plan to post this kind of stuff a lot. Kthxbye <3"
+ nsfw_explanation2: "if u liek, choose 2 not pick this option, then liek, plz add the #nsfw or #groody tag thingy each time u share naughty stuff. Kay? Thx!!! <3"
+ update_profile: "Change ur stuff"
+ your_bio: "Ur bio. Kthx."
+ your_birthday: "Ur bday"
+ your_gender: "Ur gender? Kthx"
+ your_location: "Ur place"
+ your_name: "Ur name"
+ your_photo: "Ur pic"
+ your_private_profile: "Ur like... private profile..."
+ your_public_profile: "Ur like... profile where every1 can like... c it..."
+ your_tags: "Describe urself in like... 5 werdz"
+ your_tags_placeholder: "like #twilight #selfies #Belieber #iphone #mtv"
+ update:
+ failed: "Ur profie didnt update :("
+ updated: "Profie updated!!! <3"
+ public: "like, every1 can c this"
+ reactions:
+ one: "1 reaction!!(:"
+ other: "like... %{count} reactionz!!! :DDD"
+ zero: "0 reactionz"
+ registrations:
+ closed: "Signups r like... closed on here... sry bout that :\\ totally lame, right?"
+ create:
+ success: "u've joined d*!!! OMFG YAAAAAYYY!! :DDD"
+ edit:
+ cancel_my_account: "Trash mah account! Plz Kthx"
+ edit: "edit %{name} n junk"
+ leave_blank: "(dont like... type nething if u like.. dont wanna change it kthx)"
+ password_to_confirm: "(we liek... need ur current secret code thingy to make sure it like.. matches the other 1... kthx)"
+ unhappy: "Butthurt? :("
+ update: "Like... update"
+ invalid_invite: "OMG, dude, ur invite link is like... SOOOO old... like... gross. so like, sry but its no longer valid. Kthxbye<3"
+ new:
+ create_my_account: "Make ur account!!! :DD"
+ email: "EMAIL<3"
+ enter_email: "Enter like... an email"
+ enter_password: "Enter a like... secret code thats like... moar than 6 keys n junk"
+ enter_password_again: "enter what u liek... entered b4"
+ enter_username: "So like.. pick a name that ppl will like... call u by.. n sry but u can only like.. use letters numbers n these things \"_\" but like.. witout the up n down lines n junk..."
+ join_the_movement: "Join the awesomeness!!!"
+ password: "PASSWERD<3"
+ password_confirmation: "PASSWERD CONFIRMATION!!"
+ sign_up: "SIGN UP!!"
+ sign_up_message: "This is like.. social networkin with a <3"
+ submitting: "Submittin... just a sec..."
+ terms: "By creatin an account u like... accept the %{terms_link}."
+ terms_link: "more boring legal stuff"
+ username: "USERNAMEEE<3"
+ report:
+ comment_label: "Like, <b>Comment</b>:<br>%{data}"
+ confirm_deletion: "R u sure u wanna trash this?"
+ delete_link: "Trash item"
+ not_found: "<u>The postie/comment like, wasnt found. mayb it was liek.. trashed by the usah!</u>"
+ post_label: "<b>Postie</b>: %{title}"
+ reason_label: "Reazun: %{text}"
+ reported_label: "<b>Like, reported by</b> %{person}"
+ review_link: "Mark as like, reviewed n stuff"
+ status:
+ created: "OMG some1s in troubleee!! A report was made :o"
+ destroyed: "The postie went bye byez!"
+ failed: "Somethin screwed up. sry bout that :\\"
+ marked: "So umm, like, the report was like, marked as reviewed and stuff."
+ title: "Reportz Ovahview"
+ requests:
+ create:
+ sending: "Sendin"
+ sent: "U've like... asked 2 share wit %{name}. They should like... c it the like.. next time they check into d* <3"
+ destroy:
+ error: "Plz pick an aspect!! Kthx<3"
+ ignore: "Ignored h8ter request"
+ success: "U r nao sharin!"
+ helper:
+ new_requests:
+ one: "new request!!!"
+ other: "%{count} new requests!!! :D"
+ zero: "no new requests :("
+ manage_aspect_contacts:
+ existing: "Existin BFFs"
+ manage_within: "Manage BFFs within"
+ new_request_to_person:
+ sent: "sent!!!"
+ reshares:
+ comment_email_subject: "%{resharer}'s like... reshare of %{author}'s postie"
+ create:
+ failure: "There was drama when resharin this postie :("
+ reshare:
+ deleted: "The original postie was like... deleted by the person who made it :("
+ reshare:
+ one: "1 reshare!!!"
+ other: "%{count} reshares!! :DD"
+ zero: "Like... reshare"
+ reshare_confirmation: "Like... reshare %{author}'z postie n stuff?"
+ reshare_original: "Reshare the like, original"
+ reshared_via: "like reshared via"
+ show_original: "Show the like... original"
+ search: "like look for stuff like #shoes!"
+ services:
+ create:
+ already_authorized: "A person wit like... the d* id %{diaspora_id} already like... enabled that %{service_name} account n stuff..."
+ failure: "So like... it failed n stuff... sry bout tht :\\"
+ read_only_access: "this is like.. read-only... plz try 2 like.. authorize again l8ter. kthx <3"
+ success: "so like... ur connected nao n stuff"
+ destroy:
+ success: "Yay! Trashed eet woo!!"
+ failure:
+ error: "there was drama when connectin 2 that thing :\\"
+ finder:
+ fetching_contacts: "d* is like... populatin ur %{service} BFFs, plz check back n liek... a few mins. Kthxbye <3"
+ no_friends: "No FB friendz found. :\\"
+ service_friends: "Ur like... %{service} BFFs"
+ index:
+ connect_to_facebook: "Connect to FB!!!"
+ connect_to_tumblr: "Connect to Tumblar!!!"
+ connect_to_twitter: "Connect to Twittar!!!"
+ connect_to_wordpress: "Connect 2 WP!"
+ disconnect: "like disconnect"
+ edit_services: "Edit servies!!!"
+ logged_in_as: "ur like... checkin in as"
+ no_services: "U have not like... connected ne stuff yet."
+ really_disconnect: "drop %{service}?"
+ services_explanation: "Connectin 2 servies gives u like... the ability 2 post ur posties 2 them as u write them in d*! :p"
+ inviter:
+ click_link_to_accept_invitation: "so like... follow this link 2 like... accept ur invite"
+ join_me_on_diaspora: "Chill wit me on diaspora*!"
+ remote_friend:
+ invite: "invite!!"
+ not_on_diaspora: "Not yet on d* :("
+ resend: "retxt"
+ settings: "Like ur settinz"
+ share_visibilites:
+ update:
+ post_hidden_and_muted: "%{name}'s has like... ben hidden, n noties have been like... made quiet."
+ see_it_on_their_profile: "If u like... want 2 c updates on this postie, go 2 %{name}'z profile n stuff."
+ shared:
+ add_contact:
+ add_new_contact: "add a new BFF"
+ create_request: "Find by d* id thing.."
+ diaspora_handle: "nick@pod.org"
+ enter_a_diaspora_username: "Enter a d* usernameeee:"
+ know_email: "do u liek... kno their email addy? U should like TOTALLY invite them!!"
+ your_diaspora_username_is: "Ur d* username is like: %{diaspora_handle}"
+ aspect_dropdown:
+ add_to_aspect: "Add BFF"
+ toggle:
+ one: "In like... %{count} aspect"
+ other: "In like... %{count} aspectz"
+ zero: "add BFF"
+ contact_list:
+ all_contacts: "All BFFs!!"
+ footer:
+ logged_in_as: "checkin in as %{name}"
+ your_aspects: "ur aspectz"
+ invitations:
+ by_email: "By email(:"
+ dont_have_now: "U dont like.. have ne right nao :\\ BUT moar invites r comin soon! yay! :D"
+ from_facebook: "From FB"
+ invitations_left: "so like... theres %{count} left"
+ invite_someone: "Invite ppl!"
+ invite_your_friends: "Invite ur BFFs!!"
+ invites: "Invites!!"
+ invites_closed: "so like... invites r closed for this pod... sry bout that :\\"
+ share_this: "Share this link like... via email, blogg, or social netz!"
+ notification:
+ new: "OMG new %{type} from %{from}!!!"
+ public_explain:
+ atom_feed: "Feed thingy"
+ control_your_audience: "Control ur ppl"
+ logged_in: "checked in 2 %{service}"
+ manage: "Like... manage servies ur like... connected 2"
+ new_user_welcome_message: "Like, use #hashtags 2 like... make ur posties bout somethin n find ppl who like... share ur interests. call out awesome ppl wit @Mentions"
+ outside: "So like... these txts r able 2 b seen by the internet.."
+ share: "Sharrr"
+ title: "Set up other servies"
+ visibility_dropdown: "Use dis dropdown 2 change who can like... c ur postie. (we like... recommend u make this first 1 2 where ne1 can c it.)"
+ publisher:
+ all: "allll"
+ all_contacts: "all ppl"
+ discard_post: "Trash postie"
+ formatWithMarkdown: "U can like... use %{markdown_link} to make ur postie totally awesome!!(:"
+ get_location: "Get ur place in the world!"
+ make_public: "make it so like... every1 can c it"
+ new_user_prefill:
+ hello: "OMG liek HEY PPL! im #%{new_user_tag} "
+ i_like: "im like... rlly into %{tags}. "
+ invited_by: "Thx for the invite, "
+ newhere: "Newbie<3"
+ poll:
+ add_a_poll: "Add a pole"
+ add_poll_answer: "Like, add an optionnnn"
+ option: "Option #1"
+ question: "q4u"
+ remove_poll_answer: "Trash option"
+ post_a_message_to: "Txt 2 %{aspect}"
+ posting: "Postin..."
+ preview: "Look at b4 its a postie"
+ publishing_to: "publish 2: "
+ remove_location: "Trash where u r"
+ share: "Share!!!"
+ share_with: "share wit"
+ upload_photos: "Upload picz!!"
+ whats_on_your_mind: "Sup dude?"
+ reshare:
+ reshare: "Liek... reshare"
+ stream_element:
+ connect_to_comment: "Connect 2 this peep 2 comment on their postie"
+ currently_unavailable: "commenting isnt workin right nao... sry bout that :\\"
+ dislike: "Thumbs down"
+ hide_and_mute: "Hide n like... make postie quiet"
+ ignore_user: "h8te %{name}"
+ ignore_user_description: "Block n delete h8ter from all aspectz?"
+ like: "Thumbs up"
+ nsfw: "This postie has lyke... been flagged as Groody by its author. %{link} n stuff"
+ shared_with: "Shared wit: %{aspect_names}"
+ show: "make seen"
+ unlike: "</3"
+ via: "like... via %{link}"
+ via_mobile: "via mobilez!!"
+ viewable_to_anyone: "This postie can b seen by ne1 on the internetz"
+ simple_captcha:
+ label: "enter teh stuff in the box:"
+ message:
+ default: "The captcha didnt match wit the pic D:"
+ failed: "so like, r u human? cuz u have to b in order to get past this :\\ sry bout tht. :\\"
+ user: "The secret pic n code werent the same D:"
+ placeholder: "like, enter in the stuff in the pic"
+ status_messages:
+ create:
+ success: "YAY! %{names} has been mentioned!! :D"
+ destroy:
+ failure: "so like... ur postie didnt get trashed... sry bout that :\\"
+ helper:
+ no_message_to_display: "No txt 2 display :("
+ new:
+ mentioning: "Mentionin: %{person}"
+ too_long: "Plz make ur status txt smaller than %{count} key presses. Right nao its like... %{current_length} key presses"
+ stream_helper:
+ hide_comments: "Cover up... like... all commentz"
+ show_comments:
+ one: "Show like... 1 moar comment"
+ other: "Show like... %{count} moar commentz"
+ zero: "No moar commentz :("
+ streams:
+ activity:
+ title: "My happenins"
+ aspects:
+ title: "My Aspectz"
+ aspects_stream: "Aspectz"
+ comment_stream:
+ contacts_title: "Ppl whose posties u commented on"
+ title: "Commented Posties"
+ community_spotlight_stream: "D* celebz!!"
+ followed_tag:
+ add_a_tag: "Add a like... tag"
+ contacts_title: "Ppl who <3 these tags"
+ follow: "Stalk"
+ title: "#Followed Tagz"
+ followed_tags_stream: "#Followed Tagz"
+ like_stream:
+ contacts_title: "Ppl whos posties u <3"
+ title: "Like Wall"
+ mentioned_stream: "@Mentionz"
+ mentions:
+ contacts_title: "Ppl who like... mentioned u"
+ title: "@Mentionz"
+ multi:
+ contacts_title: "Ppl on ur Wall"
+ title: "Wall"
+ public:
+ contacts_title: "Recent Posterz"
+ title: "Stuff every1 can like... c"
+ tags:
+ contacts_title: "Ppl who <3 this tag"
+ title: "Posties tagged: %{tags}"
+ tag_followings:
+ create:
+ failure: "So like... followin %{name} didnt like... work. R u like... already followin it?"
+ none: "Umm, u like... cant follow a blank tag! Duh."
+ success: "OMG! Ur nao followin #%{name}. YAAAAY! :DD"
+ destroy:
+ failure: "So like... there was drama when tryin 2 stop followin %{name}. Mayb u already like... stopped followin it?"
+ success: "So like, u rnt followin #%{name} nemore..."
+ tags:
+ show:
+ follow: "Follow like... #%{tag}"
+ following: "Followin #%{tag}"
+ none: "Umm, so the like... empty tag doesnt like... exist :\\"
+ stop_following: "Stop like... followin #%{tag}"
+ terms_and_conditions: "wat ur like... allowed to do and stuff"
+ undo: "do u wanna like.. undo?"
+ username: "ur like... name ppl will find u by or whatever"
+ users:
+ confirm_email:
+ email_confirmed: "Ur email %{email} is like... activated"
+ email_not_confirmed: "So like, ur email could not like... b activated for sum reason. Do u have the like... wrong link? D:"
+ destroy:
+ no_password: "Plz enter ur like... current passwerd 2 like... trash ur account."
+ success: "Ur account has like... been locked. and it like.. may take like 20 mins for us 2 like... finish closin ur account.. thx for checkin out d*. byezz <33"
+ wrong_password: "so like, the passwerd u entered didnt match ur like... current 1... yeah."
+ edit:
+ also_commented: "some1 comments on a postie u've commented on"
+ auto_follow_aspect: "Group for automagically added BFFs:"
+ auto_follow_back: "Automagically share wit ppl who start sharin wit u"
+ change: "Changeee"
+ change_email: "Change email <3"
+ change_language: "Change what u read n speak n stuff"
+ change_password: "Change passwerd"
+ character_minimum_expl: "must b like... 6 buttons..."
+ close_account:
+ dont_go: "DUDE! WTF!? Dont leave!"
+ if_you_want_this: "If u like... rlly want this, type in ur passwerd below n click on 'Trash Account'"
+ lock_username: "So this will liek.. lock ur username thingy if u decided 2 sign back up n stuff."
+ locked_out: "U will like... get like.. automagically bounced n locked out of ur account."
+ make_diaspora_better: "We like... want u 2 help make d* bettah n stuff, so u should like.. help us out instead of leavin(: if u do wanna leave, we like... wanna make sure u know wat happens next. K?"
+ mr_wiggles: "Mr Wigglez will b sad :(( </3 </3"
+ no_turning_back: "So theres like, no turnin back nao. sry! <3"
+ what_we_delete: "We will like... trash all of ur posties n profile stuff asap. Ur comments will still hang out, but they would b associated wit ur d* ID instead of ur name. K?"
+ close_account_text: "Trash account"
+ comment_on_post: "some1 comments on ur postie"
+ current_password: "Current passwerd :3"
+ current_password_expl: "the 1 u like sign in wit... OMG"
+ download_photos: "dl mah picz"
+ edit_account: "Edit ur account <3"
+ email_awaiting_confirmation: "So we like... sent u a link 2 like activate %{unconfirmed_email}. Until u like... follow this link && activate this new addy, we will continue 2 like.. use ur original addy %{email}. Kay?"
+ export_data: "dl data!!!"
+ following: "Sharin settins"
+ getting_started: "New user prefies"
+ liked: "some1 likes ur postie"
+ mentioned: "u r mentioned in a postie"
+ new_password: "New passwerd(;"
+ private_message: "u receive a sext :o"
+ receive_email_notifications: "Receive email noties when like:"
+ reshared: "some1 reshares ur postie"
+ show_community_spotlight: "Show d* celebs on Wall"
+ show_getting_started: "Show gettin started stuff"
+ someone_reported: "some1 told on some1"
+ started_sharing: "some1 starts sharin wit u"
+ stream_preferences: "Wall prefies"
+ your_email: "Ur emailll <3"
+ your_handle: "Ur d* ID"
+ getting_started:
+ awesome_take_me_to_diaspora: "Sweet! Take me 2 d*!!!"
+ community_welcome: "omg, like, thx for comin! <3"
+ connect_to_facebook: "We can like, speed things up a lil by %{link} 2 d*. This will like, pull ur name n pic n allow cross-posties <3"
+ connect_to_facebook_link: "hookin up ur FB account"
+ hashtag_explanation: "Ok so like, hashtags allow u 2 talk bout n follow ur interests. theyre like... also a sweet way 2 find new ppl on d* :D"
+ hashtag_suggestions: "Try followin tags like #justinbeiber #16andpregnant #monster #xbox and stuff.."
+ saved: "Saved!!!(:"
+ well_hello_there: "Ohai thar! <3"
+ what_are_you_in_to: "Wat r u into?"
+ who_are_you: "Umm like, who r u?"
+ privacy_settings:
+ ignored_users: "Haters"
+ stop_ignoring: "Stop ignorin hater"
+ title: "Privie settins"
+ public:
+ does_not_exist: "Umm like... %{username} doesnt exist... yeah.."
+ update:
+ email_notifications_changed: "Ur email noties have been changed <3"
+ follow_settings_changed: "Stalkin settins changed <3"
+ follow_settings_not_changed: "so like, changin the follow settins didnt work.. sry bout that :\\"
+ language_changed: "Language changedddd <3"
+ language_not_changed: "Oh noes the language change like... didnt work! D:"
+ password_changed: "Passwerd changed! U can nao check in wit ur new passwerd! <33 :D"
+ password_not_changed: "Ur passwerd like... didnt change... sry bout that :\\"
+ settings_not_updated: "Settins update didnt work... sry bout that :\\"
+ settings_updated: "Settins updated!!! <33"
+ unconfirmed_email_changed: "Ur email was like... changed. N nao it needs activation. K?"
+ unconfirmed_email_not_changed: "so like, the email change didnt work. sry bout that :\\"
+ webfinger:
+ fetch_failed: "so like... i couldnt fetch the like... webfinger profile thingy for %{profile_url}. sry bout that :\\"
+ hcard_fetch_failed: "so like, there was like... drama when gettin the hcard for %{account}. yeah, sry bout that :\\"
+ no_person_constructed: "No person could like... b made from this hcard thingy..."
+ not_enabled: "so like... webfinger doesnt seem 2 b enabled for %{account}'s host :\\"
+ xrd_fetch_failed: "there like... was drama when tryin 2 get the xrd from account %{account}..."
+ welcome: "Like, OMG, hey!"
+ will_paginate:
+ next_label: "next!! &raquo;"
+ previous_label: "&laquo; previe!!" \ No newline at end of file
diff --git a/config/locales/diaspora/eo.yml b/config/locales/diaspora/eo.yml
index ac5391cee..c7030da7b 100644
--- a/config/locales/diaspora/eo.yml
+++ b/config/locales/diaspora/eo.yml
@@ -83,7 +83,8 @@ eo:
one: "%{count} uzanto trovita"
other: "%{count} uzantoj trovitaj"
zero: "%{count} uzantoj trovitaj"
- you_currently: "vi aktuale havas ankoraŭ %{user_invitation} invitojn %{link}"
+ you_currently:
+ other: "vi aktuale havas ankoraŭ %{user_invitation} invitojn %{link}"
weekly_user_stats:
current_server: "Aktuala dato de servilo estas %{date}"
ago: "antaŭ %{time}"
@@ -104,8 +105,6 @@ eo:
add_to_aspect:
failure: "Ne povis aldoni kontakton al aspekto."
success: "Sukcese aldonis kontakton al aspekto."
- aspect_contacts:
- done_editing: "redaktado finita"
aspect_listings:
add_an_aspect: "+ Aldoni aspekton"
deselect_all: "Malelekti ĉion"
@@ -124,21 +123,14 @@ eo:
failure: "%{name} ne malplenas kaj do ne povis esti forigita."
success: "%{name} estis sukcese forigita."
edit:
- add_existing: "Aldoni ekzistantan kontakton"
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?"
- done: "Farita"
make_aspect_list_visible: "Ĉu kontaktoj en ĉi tiu aspekto povu vidi unu la alian?"
remove_aspect: "Forigi ĉi tiun aspekton"
rename: "alinomigi"
update: "ĝisdatigi"
updating: "ĝisdatigado"
- few: "%{count} aspektoj"
- helper:
- are_you_sure: "Ĉu vi certas, ke vi volas forviŝi tiun ĉi aspekton?"
- aspect_not_empty: "Aspekto ne malplenas"
- remove: "forigi"
index:
diaspora_id:
content_1: "Via DIASPORA* uzantnomo estas:"
@@ -176,11 +168,6 @@ eo:
heading: "Konekti Servojn"
unfollow_tag: "Ne plu abonas #%{tag}."
welcome_to_diaspora: "Bonvenon al Diaspora, %{name}!"
- many: "%{count} aspektoj"
- move_contact:
- error: "Ne povis movi kontakton: %{inspect}"
- failure: "Eraro: %{inspect}"
- success: "Kontakto moviĝis al nova aspekto"
new:
create: "Krei"
name: "Nomo (nur videblas de vi)"
@@ -198,14 +185,6 @@ eo:
family: "Familio"
friends: "Amikoj"
work: "Laboro"
- selected_contacts:
- manage_your_aspects: "Redakti viajn aspektojn."
- no_contacts: "Vi ne jam havas iujn ajn kontaktojn ĉi tie."
- view_all_community_spotlight: "Vidi ĉiun komunuman ĉeflumon"
- view_all_contacts: "Vidi ĉiujn kontaktojn"
- show:
- edit_aspect: "redakti aspekton"
- two: "%{count} aspektoj"
update:
failure: "Via aspekto, %{name}, havis tro longan nomon por konserviĝi."
success: "Via aspekto, %{name}, sukcese redaktiĝis."
@@ -225,36 +204,27 @@ eo:
post_success: "Afiŝita! Fermanta!"
cancel: "Nuligi"
comments:
- few: "%{count} komentoj"
- many: "%{count} komentoj"
new_comment:
comment: "Komenti"
commenting: "Komentanta..."
one: "1 komento"
other: "%{count} komentoj"
- two: "%{count} komentoj"
zero: "neniuj komentoj"
contacts:
create:
failure: "Ne povis krei kontakton"
- few: "%{count} kontaktoj"
index:
add_a_new_aspect: "Aldoni novan aspekton"
add_to_aspect: "aldoni kontaktojn al %{name}"
- add_to_aspect_link: "aldoni kontaktojn al %{name}"
all_contacts: "Ĉiuj kontaktoj"
community_spotlight: "En la ĉeflumo de la komunumo"
- many_people_are_you_sure: "Ĉu vi certas, ke vi volas mesaĝi al pli ol {suggested_limit} homoj? Afiŝi al tiu ĉi aspekto eble estas pli bona metodo kontakti ilin."
my_contacts: "Miaj kontaktoj"
no_contacts: "Ŝajne necesas, ke vi aldonos iujn kontaktojn!"
no_contacts_message: "Esploru %{community_spotlight}"
- no_contacts_message_with_aspect: "Esploru %{community_spotlight} aŭ %{add_to_aspect_link}"
only_sharing_with_me: "Nur koniganta al mi"
- remove_person_from_aspect: "Forigi %{person_name} de \"%{aspect_name}\""
start_a_conversation: "Komenci interparoladon"
title: "Kontaktoj"
your_contacts: "Viaj kontaktoj"
- many: "%{count} kontaktoj"
one: "1 kontakto"
other: "%{count} kontaktoj"
sharing:
@@ -262,7 +232,6 @@ eo:
spotlight:
community_spotlight: "Komunuma ĉeflumo"
suggest_member: "Sugesti membron"
- two: "%{count} kontaktoj"
zero: "kontaktoj"
conversations:
conversation:
@@ -270,8 +239,6 @@ eo:
create:
fail: "Malĝusta mesaĝo"
sent: "Mesaĝo sendiĝis."
- destroy:
- success: "Konversacio sukcese forviŝiĝis."
helper:
new_messages:
one: "1 nova mesaĝo"
@@ -532,7 +499,6 @@ eo:
add_contact_from_tag: "aldoni kontakton de etikedo"
aspect_list:
edit_membership: "redakti membraron de aspekto"
- few: "%{count} personoj"
helper:
is_not_sharing: "%{name} ne kunhavigas kun vi"
is_sharing: "%{name} nun kunhavigas kun vi"
@@ -543,7 +509,6 @@ eo:
no_results: "Hej! Vi devas serĉi ion."
results_for: "serĉrezultoj por"
searching: "serĉanta, bv. pacienci..."
- many: "%{count} personoj"
one: "1 persono"
other: "%{count} personoj"
person:
@@ -580,7 +545,6 @@ eo:
add_some: "aldoni iujn"
edit: "redakti"
you_have_no_tags: "vi ne havas etikedojn!"
- two: "%{count} homoj"
webfinger:
fail: "Ni bedaŭras, sed ni ne povis trovi je %{handle}."
zero: "neniuj personoj"
@@ -675,15 +639,12 @@ eo:
update: "Ĝisdatigi"
invalid_invite: "La invitoligilo, kiun vi donis, ne plu validas!"
new:
- continue: "Daŭrigi"
create_my_account: "Krei mian konton!"
- diaspora: "<3 DIASPORA*"
email: "Retpoŝtadreso"
enter_email: "Enskribu retpoŝtadreson"
enter_password: "Enskribu kodvorton (almenaŭ 6 signoj)"
enter_password_again: "Enskribu la saman pasvorton, kiel antaŭe"
enter_username: "Elektu uzantnomon (nur literojn, nombrojn, kaj substrekojn)"
- hey_make: "HEJ, <br/>FARU<br/>ION."
join_the_movement: "Aniĝu je la movado!"
password: "Pasvorto"
password_confirmation: "KONFIRMADO DE PASVORTO"
@@ -852,10 +813,7 @@ eo:
no_message_to_display: "Neniu afiŝo montrenda."
new:
mentioning: "Mencianta: %{person}"
- too_long:
- one: "bonvolu igi viajn afiŝojn malpli longaj ol %{count} signoj"
- other: "bonvolu igi viajn afiŝojn malpli longaj ol %{count} signoj"
- zero: "bonvolu igi viajn afiŝojn malpli longaj ol %{count} signoj"
+ too_long: "{\"one\"=>\"bonvolu igi viajn afiŝojn malpli longaj ol %{count} signoj\", \"other\"=>\"bonvolu igi viajn afiŝojn malpli longaj ol %{count} signoj\", \"zero\"=>\"bonvolu igi viajn afiŝojn malpli longaj ol %{count} signoj\"}"
stream_helper:
hide_comments: "kaŝi ĉiujn komentojn"
show_comments:
@@ -896,7 +854,6 @@ eo:
title: "publika aktiveco"
tags:
contacts_title: "Homoj, al kiuj tiuj ĉi etikedoj plaĉas"
- tag_prefill_text: "La afero pri %{tag_name} estas... "
title: "Afiŝoj etikeditaj: %{tags}"
tag_followings:
create:
@@ -910,10 +867,7 @@ eo:
show:
follow: "Aboni al #%{tag}"
following: "Abonita al #%{tag}"
- nobody_talking: "Ankoraŭ neniu parolas pri %{tag}."
none: "Malplena etikedo ne ekzistas!"
- people_tagged_with: "Personoj etikediĝis kun %{tag}"
- posts_tagged_with: "Afiŝoj etikeditaj per #%{tag}"
stop_following: "Malaboni de #%{tag}"
terms_and_conditions: "Reguloj kaj kondiĉoj"
undo: "Ĉu malfari?"
@@ -949,7 +903,6 @@ eo:
current_password: "Nuna pasvorto"
current_password_expl: "tiu per kiu vi ensalutis..."
download_photos: "elŝuti miajn bildojn"
- download_xml: "elŝuti mian XML-n"
edit_account: "Redakti konton"
email_awaiting_confirmation: "Ni sendis al vi aktivigan ligilon ĉe %{unconfirmed_email}. Ĝis kiam vi klakos tiun ĉi ligilon kaj aktivigos la novan repoŝtadreson, ni uzados vian ĝisnunan retpoŝtadreson %{email}."
export_data: "Eksporti datumojn"
@@ -958,7 +911,6 @@ eo:
liked: "...iu ŝatis vian afiŝon?"
mentioned: "...vi estas menciita en afiŝo?"
new_password: "Nova pasvorto"
- photo_export_unavailable: "bildeksporto aktuale ne eblas"
private_message: "...vi ricevas malpublikan mesaĝon?"
receive_email_notifications: "Ĉu ricevi retpoŝtajn sciigojn, kiam..."
reshared: "... iu rekonigis vian afiŝon?"
diff --git a/config/locales/diaspora/es-AR.yml b/config/locales/diaspora/es-AR.yml
index 5fa6039fc..f412cf606 100644
--- a/config/locales/diaspora/es-AR.yml
+++ b/config/locales/diaspora/es-AR.yml
@@ -10,8 +10,9 @@ es-AR:
_contacts: "Contactos"
_help: "Ayuda"
_home: "Inicio"
- _photos: "fotos"
+ _photos: "Fotos"
_services: "Servicios"
+ _statistics: "Estadísticas"
_terms: "Términos y condiciones"
account: "Cuenta"
activerecord:
@@ -40,7 +41,7 @@ es-AR:
reshare:
attributes:
root_guid:
- taken: "Está bueno, ¿eh? Ya habías compartido esa publicación!"
+ taken: "Está bueno, ¿eh? ¡Ya habías compartido esa publicación!"
user:
attributes:
email:
@@ -54,7 +55,7 @@ es-AR:
admin_bar:
correlations: "Similitudes"
pages: "Páginas"
- pod_stats: "Estadísticas del servidor"
+ pod_stats: "Estadísticas del Pod (servidor)"
report: "Reportes"
sidekiq_monitor: "Monitor Sidekiq"
user_search: "Búsqueda de usuarios"
@@ -62,7 +63,7 @@ es-AR:
correlations:
correlations_count: "Correlaciones con el conteo de inicio de sesión:"
stats:
- 2weeks: "2 Semanas"
+ 2weeks: "2 semanas"
50_most: "Las 50 etiquetas más populares"
comments:
one: "%{count} comentario"
@@ -103,8 +104,12 @@ es-AR:
: Si
user_search:
account_closing_scheduled: "La cuenta de %{name} está agendada para ser eliminada. Será procesada en unos momentos..."
+ account_locking_scheduled: "El bloqueo de la cuenta de %{name} se ha añadido a la lista de tareas. Será procesada en unos minutos..."
+ account_unlocking_scheduled: "El desbloqueo de la cuenta de %{name} se ha añadido a la lista de tareas. Será procesada en unos minutos..."
add_invites: "Añadir invitaciones"
are_you_sure: "¿Estás seguro de que quieres eliminar tu cuenta? ¡Esto no se puede deshacer!"
+ are_you_sure_lock_account: "¿Estás seguro que quieres bloquear esta cuenta?"
+ are_you_sure_unlock_account: "¿Estás seguro que quieres desbloquear esta cuenta?"
close_account: "Cerrar cuenta"
email_to: "Mandar invitación por correo electrónico a"
under_13: "Mostrar usuarios menores de 13 años (COPPA)"
@@ -113,7 +118,10 @@ es-AR:
other: "%{count} usuarios encontrados"
zero: "%{count} usuarios encontrados"
view_profile: "Ver perfil"
- you_currently: "Actualmente te quedan %{user_invitation} invitaciones para enviar %{link}"
+ you_currently:
+ one: "Actualmente te queda una invitación para enviar %{link}"
+ other: "Actualmente te quedan %{count} invitaciones para enviar %{link}"
+ zero: "Actualmente no tienes invitaciones para enviar %{link}"
weekly_user_stats:
amount_of:
one: "Cantidad de nuevos usuarios esta semana: %{count}"
@@ -124,22 +132,20 @@ es-AR:
all_aspects: "Todos los aspectos"
application:
helper:
- unknown_person: "persona desconocida"
+ unknown_person: "Persona desconocida"
video_title:
unknown: "Título de video desconocido"
are_you_sure: "¿Estás seguro?"
are_you_sure_delete_account: "¿Seguro que quieres eliminar tu cuenta? ¡Esto no se podrá deshacer!"
aspect_memberships:
destroy:
- failure: "No pudo eliminarse al contacto del aspecto"
+ failure: "El contacto no se pudo eliminar del aspecto"
no_membership: "No se encontró a la persona seleccionada en el aspecto"
success: "El contacto se eliminó del aspecto"
aspects:
add_to_aspect:
failure: "No pudo agregarse el contacto al aspecto."
success: "Se agregó el contacto al aspecto."
- aspect_contacts:
- done_editing: "aceptar"
aspect_listings:
add_an_aspect: "+ Agregar un aspecto"
deselect_all: "Deseleccionar todo"
@@ -158,23 +164,18 @@ es-AR:
failure: "%{name} no está vacío y no puede ser eliminado."
success: "%{name} se eliminó con éxito."
edit:
- add_existing: "Agregar un contacto existente"
+ aspect_chat_is_enabled: "Los contactos de este aspecto pueden chatear con vos."
+ aspect_chat_is_not_enabled: "Los contactos de este aspecto no pueden chatear con vos."
aspect_list_is_not_visible: "La lista de contactos de este aspecto NO es visible"
aspect_list_is_visible: "La lista de contactos de este aspecto es visible"
confirm_remove_aspect: "¿Estás seguro de que querés eliminar este aspecto?"
- done: "Listo"
- make_aspect_list_visible: "¿Hacer visible los contactos del aspecto entre ellos?"
- manage: "Administrar"
+ grant_contacts_chat_privilege: "¿Conceder privilegio a los contactos de este aspecto para poder chatear?"
+ make_aspect_list_visible: "¿Hacer visible los contactos de este aspecto entre ellos?"
remove_aspect: "Eliminar este aspecto"
- rename: "renombrar"
+ rename: "Renombrar"
set_visibility: "Establecer visibilidad"
- update: "actualizar"
- updating: "actualizando"
- few: "%{count} aspectos"
- helper:
- are_you_sure: "¿Estás seguro de que querés eliminar este aspecto?"
- aspect_not_empty: "El aspecto no está vacío"
- remove: "eliminar"
+ update: "Actualizar"
+ updating: "Actualizando"
index:
diaspora_id:
content_1: "Tu ID de diaspora* es:"
@@ -198,7 +199,7 @@ es-AR:
tag_feature: "idea"
tag_question: "pregunta"
tutorial_link_text: "Tutoriales"
- tutorials_and_wiki: "%{tutorial} y %{wiki}: Ayuda para tus primeros pasos en diaspora*."
+ tutorials_and_wiki: "%{faq}, %{tutorial} y %{wiki}: Ayuda para tus primeros pasos en diaspora*."
introduce_yourself: "Este es tu stream. Zambullite en el y presentate."
keep_diaspora_running: "¡Haz que el desarrollo de diaspora* vaya más rápido con una donación mensual!"
keep_pod_running: "¡Haz que %{pod} siga corriendo rápido, y compra a nuestros servidores su dosis de café con una donación mensual!"
@@ -209,22 +210,17 @@ es-AR:
no_contacts: "No hay contactos"
no_tags: "+ Encuentra una etiqueta para seguir"
people_sharing_with_you: "Comparten con vos"
- post_a_message: "publicar un mensaje >>"
+ post_a_message: "Publicar un mensaje >>"
services:
content: "Podés conectar los siguientes servicios a diaspora*:"
heading: "Conectar Servicios"
unfollow_tag: "Dejar de seguir #%{tag}"
welcome_to_diaspora: "¡Bienvenid@ a diaspora*, %{name}!"
- many: "%{count} aspectos"
- move_contact:
- error: "Se produjo un error al mover el contacto: %{inspect}"
- failure: "%{inspect} no funcionó"
- success: "El contacto se movió al nuevo aspecto"
new:
create: "Crear"
name: "Nombre (solo visible para ti)"
no_contacts_message:
- community_spotlight: "comunidad creativa"
+ community_spotlight: "Comunidad creativa"
or_spotlight: "O lo podés compartir con %{link}"
try_adding_some_more_contacts: "Podés buscar o invitar más contactos."
you_should_add_some_more_contacts: "¡Deberías agregar más contactos!"
@@ -237,26 +233,18 @@ es-AR:
family: "Familia"
friends: "Amigos"
work: "Trabajo"
- selected_contacts:
- manage_your_aspects: "Administra tus aspectos."
- no_contacts: "Todavía no tenés ningún contacto aquí."
- view_all_community_spotlight: "Ver \"Comunidad Creativa\""
- view_all_contacts: "Ver todos los contactos"
- show:
- edit_aspect: "editar aspecto"
- two: "%{count} aspectos"
update:
failure: "Tu aspecto, %{name}, tenía un nombre muy largo para guardarlo."
success: "Tu aspecto, %{name}, se editó con éxito."
- zero: "no hay aspectos"
+ zero: "No hay aspectos"
back: "Atrás"
blocks:
create:
- failure: "No se puede ignorar ese usuario. #evasion"
- success: "Bien, ya no verás más a ese usuario en tu stream. #silencio!"
+ failure: "No se puede ignorar a ese usuario. #evasión"
+ success: "Bien, ya no verás más a ese usuario en tu Entrada. #silencio!"
destroy:
- failure: "No se pudo dejar de ignorar a ese usuario. #evasion"
- success: "¡Veamos que tiene que decir! #dihola"
+ failure: "No se pudo dejar de ignorar a ese usuario. #evasión"
+ success: "¡Veamos qué tiene que decir! #hola"
bookmarklet:
explanation: "Publicá en diaspora* desde cualquier página agregando a tus marcadores este enlace: %{link}"
heading: "Marcador"
@@ -264,36 +252,31 @@ es-AR:
post_success: "¡Publicado! Cerrando."
cancel: "Cancelar"
comments:
- few: "%{count} comentarios"
- many: "%{count} comentarios"
new_comment:
comment: "Comentar"
commenting: "Comentando..."
one: "1 comentario"
other: "%{count} comentarios"
- two: "%{count} comentarios"
- zero: "no hay comentarios"
+ zero: "No hay comentarios"
contacts:
create:
failure: "No pudo crearse el contacto"
- few: "%{count} contactos"
index:
add_a_new_aspect: "Añadir un nuevo aspecto"
- add_to_aspect: "añade contactos a %{name}"
- add_to_aspect_link: "Agregar contactos a %{name}"
- all_contacts: "Todos los Contactos"
- community_spotlight: "Lo más destacado de la comunidad"
- many_people_are_you_sure: "Estás seguro que querés comenzar una conversación privada con más de %{suggested_limit} contactos? Publicando en este aspecto puede ser una mejor manera de contactarlos."
- my_contacts: "Mis Contactos"
+ add_contact: "Agregar contacto"
+ add_to_aspect: "Agregar contactos a %{name}"
+ all_contacts: "Todos los contactos"
+ community_spotlight: "Comunidad Creativa"
+ my_contacts: "Mis contactos"
no_contacts: "¡Parece que necesitás agregar algunos contactos!"
+ no_contacts_in_aspect: "Aún no tienes contactos en este aspecto. Debajo hay una lista de tus contactos existentes que puedes agregar a este aspecto."
no_contacts_message: "Echa un vistazo a %{community_spotlight}"
- no_contacts_message_with_aspect: "Echa un vistazo a %{community_spotlight} o %{add_to_aspect_link}"
only_sharing_with_me: "Compartiendo solo conmigo"
- remove_person_from_aspect: "Quitar a %{person_name} de \"%{aspect_name}\""
+ remove_contact: "Eliminar contacto"
start_a_conversation: "Empezar una conversación"
title: "Contactos"
+ user_search: "Búsqueda de usuarios"
your_contacts: "Tus contactos"
- many: "%{count} contactos"
one: "1 contacto"
other: "%{count} contactos"
sharing:
@@ -301,8 +284,7 @@ es-AR:
spotlight:
community_spotlight: "Comunidad Creativa"
suggest_member: "Sugiere un usuario"
- two: "%{count} contactos"
- zero: "contactos"
+ zero: "No hay contactos"
conversations:
conversation:
participants: "Participantes"
@@ -311,7 +293,8 @@ es-AR:
no_contact: "¡Primero necesitas agregar al contacto!"
sent: "Mensaje enviado"
destroy:
- success: "La conversación se eliminó"
+ delete_success: "La conversación ha sido eliminada"
+ hide_success: "La conversación se ha ocultado"
helper:
new_messages:
few: "%{count} mensajes nuevos"
@@ -322,22 +305,23 @@ es-AR:
zero: "No hay mensajes nuevos"
index:
conversations_inbox: "Conversaciones - Bandeja de entrada"
- create_a_new_conversation: "comenzar una nueva conversación"
+ create_a_new_conversation: "Iniciar una nueva conversación"
inbox: "Mensajes"
new_conversation: "Nueva conversación"
- no_conversation_selected: "ninguna conversación seleccionada"
- no_messages: "no hay mensajes"
+ no_conversation_selected: "Ninguna conversación seleccionada"
+ no_messages: "No hay mensajes"
new:
abandon_changes: "¿Descartar los cambios?"
send: "Enviar"
sending: "Enviando..."
- subject: "asunto"
- to: "para"
+ subject: "Asunto"
+ to: "Para"
new_conversation:
fail: "Mensaje inválido"
show:
- delete: "eliminar y bloquear conversación"
- reply: "responder"
+ delete: "Eliminar y bloquear conversación"
+ hide: "Ocultar y silenciar la conversación"
+ reply: "Responder"
replying: "Contestando..."
date:
formats:
@@ -359,9 +343,9 @@ es-AR:
account_and_data_management:
close_account_a: "Ve a la parte inferior de la página de Configuración y haz clic en el botón \"Cerrar Cuenta\"."
close_account_q: "¿Cómo puedo borrar mi semilla (cuenta)?"
- data_other_podmins_a: "Cuando estas compartiendo con alguien mas en otro servidor, cualquier publicación que compartas con esa persona se guardara una copia (cache) en su servidor, y esta será accesible al administrador de la base de datos de ese servidor. Cuando borras una publicación o un dato de perfil, esta información es borrada de tu servidor y de cualquier otro servidor en el que previamente hubiera estado alojada."
+ data_other_podmins_a: "Cuando estás compartiendo con alguien que tiene cuenta en otro servidor, de cualquier publicación que compartas con esa persona se guardará una copia (cache) en su servidor, y ésta será accesible al administrador de la base de datos de ese servidor. Cuando borras una publicación o un dato de perfil, esta información es borrada de tu servidor y de cualquier otro servidor en el que previamente hubiera estado alojada."
data_other_podmins_q: "¿Pueden los administradores de otros pods ver mi información?"
- data_visible_to_podmin_a: "La comunicación *entre* pods siempre esta encriptada (usando tanto SSL como el propio cifrado de diaspora*), pero el almacenamiento de los datos en los servidores no está encriptado. Si quisiera, el administrador de la base de datos de tu servidor (usualmente la persona que gerencia el servidor) puede acceder a todos los datos de tu perfil y a todo lo que has publicado (este es el caso para la mayoría de los sitios web que almacenan datos del usuario). Instalar tu propio pod te provee más privacidad al poder controlar el acceso a la base de datos."
+ data_visible_to_podmin_a: "La comunicación *entre* pods siempre está encriptada (usando tanto SSL como el propio cifrado de diaspora*), pero el almacenamiento de los datos en los servidores no está encriptado. Si quisiera, el administrador de la base de datos de tu servidor (usualmente la persona que gerencia el servidor) puede acceder a todos los datos de tu perfil y a todo lo que has publicado (este es el caso para la mayoría de los sitios web que almacenan datos del usuario). Instalar tu propio pod te provee más privacidad al poder controlar el acceso a la base de datos."
data_visible_to_podmin_q: "¿Qué cantidad de mi información puede ver el administrador de mi pod?"
download_data_a: "Sí. En la parte inferior de la página de Configuración de Cuenta hay dos botones para la descarga de los datos."
download_data_q: "¿Puedo descargar una copia de todos los datos contenidos en mi cuenta?"
@@ -373,11 +357,11 @@ es-AR:
change_aspect_of_post_q: "Una vez que publiqué algo, ¿puedo cambiar el o los aspectos que pueden verlo?"
contacts_know_aspect_a: "No. Tus contactos no pueden ver el nombre del aspecto bajo ninguna circunstancia."
contacts_know_aspect_q: "¿Mis contactos pueden saber a cuáles aspectos los he agregado?"
- contacts_visible_a: "Si marcas esta opción entonces los contactos de este aspecto serán capaces de ver lo que esta en él, en tu perfil de pagina bajo tu foto. Es mejor seleccionar esta opción solo si los contactos en este aspecto se conocen unos a otros. Ellos igualmente no serán capaces de ver cuando este aspecto es llamado."
+ contacts_visible_a: "Si marcas esta opción entonces los contactos de este aspecto serán capaces de ver quiénes más están en él, bajo tu foto en tu página de perfil. Es mejor seleccionar esta opción solo si los contactos en este aspecto se conocen unos a otros. Ellos igualmente no serán capaces de ver cómo se llama este aspecto."
contacts_visible_q: "¿Qué significa \"hacer visibles entre ellos a los contactos de este aspecto\"?"
- delete_aspect_a: "En su lista de aspectos en el lado izquierdo de la pagina principal, pase el puntero sobre el aspecto que desea borrar. Clic en la pequeña lapicera \"editar\" que aparece en la derecha. Clic el botón de borrar en la caja de texto que aparece."
+ delete_aspect_a: "En tu lista de aspectos en el lado izquierdo de la página principal, pasá el puntero sobre el aspecto que deseas borrar. Haz clic en el pequeño lápiz de \"Editar\" que aparece en la derecha. Haz clic en el botón\"Borrar\" en la caja de texto que aparece."
delete_aspect_q: "¿Cómo hago para borrar un aspecto?"
- person_multiple_aspects_a: "Sí. Ve a la lista de contactos y has clic en mis contactos. Para cada contacto puedes usar el menú en la derecha para agregarlos (o borrarlos) a la cantidad de aspectos que desees. O puedes agregarlos a un nuevo aspecto (o borrarlos de un aspecto) haciendo clic en el botón selector de aspectos en su pagina de perfil. O siempre puedes solo mover el puntero sobre su nombre cuando veas su nombre en la entrada, y una \"tarjeta suspendida\" aparecerá. Puedes cambiar los aspectos que están allí."
+ person_multiple_aspects_a: "Sí. Ve a la lista de contactos y haz clic en \"Mis contactos\". Para cada contacto puedes usar el menú en la derecha para agregarlos (o borrarlos) a la cantidad de aspectos que desees. O puedes agregarlos a un nuevo aspecto (o borrarlos de un aspecto) haciendo clic en el botón selector de aspectos en su página de perfil. O siempre puedes solo mover el puntero sobre su nombre cuando lo veas en la Entrada, y una \"tarjeta suspendida\" aparecerá. Puedes cambiar los aspectos que están allí."
person_multiple_aspects_q: "¿Puedo agregar a una persona a varios aspectos?"
post_multiple_aspects_a: "Sí. Cuando estas realizando una publicación, usa el botón de seleccionar aspectos para incluir o excluir aspectos. Tú publicación será visible a todos los que pertenecen a los aspectos que has seleccionado. También puedes seleccionar los aspectos a los que deseas enviarles la publicación en la barra lateral. Cuando publicas, el/los aspecto/s que has seleccionado en la lista de la izquierda automáticamente serán seleccionado en el selector de aspectos cuando comiences a realizar una nueva publicación."
post_multiple_aspects_q: "¿Puedo publicar contenido en varios aspectos a la vez?"
@@ -385,26 +369,33 @@ es-AR:
remove_notification_q: "Si elimino a alguien de un aspecto, o de todos mis aspectos, ¿le llegará una notificación de eso?"
rename_aspect_a: "Sí. En tu lista de aspectos en el costado izquierdo del menú, apunta tu ratón al aspecto para renombrarlo. Haz clic en el pequeño lápiz de \"editar\" que se muestra a la derecha. Haz clic en \"renombrar\" e ingresa el nombre en la caja de texto que aparece desplegada."
rename_aspect_q: "¿Puedo renombrar un aspecto?"
- restrict_posts_i_see_a: "Sí. Haz clic en \"Mis Aspectos\" en la barra lateral y entonces marca o desmarca a cada uno de los aspectos de la lista para incluirlos o no. Solo las publicaciones de las personas en los aspectos seleccionados aparecerán en tu Entrada."
+ restrict_posts_i_see_a: "Sí. Haz clic en \"Mis aspectos\" en la barra lateral y entonces marca o desmarca a cada uno de los aspectos de la lista para incluirlos o no. Solo las publicaciones de las personas en los aspectos seleccionados aparecerán en tu Entrada."
restrict_posts_i_see_q: "¿Puedo restringir las publicaciones que veo sólo a ciertos aspectos?"
title: "Aspectos"
what_is_an_aspect_a: "Los aspectos son la forma de mostrar tus grupos de contactos en diaspora*. Un aspecto es una de las caras que le muestras al mundo. Esta puede mostrar como eres en el trabajo, como eres en tu familia, o como eres con tus amigos en el club al que perteneces."
what_is_an_aspect_q: "¿Qué es un aspecto?"
- who_sees_post_a: "Si haces una publicación restringida, esta solo será visible para las personas que has incluido en ese aspecto (o esos aspectos, si la hiciste para varios aspectos). Los contactos que no pertenecen al aspecto no tendrán forma de ver la publicación, a menos que la hagas publica. Solo las publicaciones públicas serán visibles para cualquiera que no hayas incluido en uno de tus aspectos."
+ who_sees_post_a: "Si haces una publicación restringida (limitada), ésta solo será visible para las personas que hayas incluido en ese aspecto (o esos aspectos, si la hiciste para varios aspectos). Los contactos que no pertenecen al aspecto no tendrán forma de ver la publicación, a menos que la hagas publica. Solo las publicaciones públicas serán visibles para cualquiera que no hayas incluido en uno de tus aspectos."
who_sees_post_q: "Cuando publico en un aspecto, ¿quienes pueden verlo?"
+ chat:
+ add_contact_roster_a: "Primero, necesitas activar el chat para uno de los aspectos en donde está el usuario. Para hacer eso, ve a la %{contacts_page}, selecciona el aspecto que quieras y haz clic en el icono de chat para activar el chat en ese aspecto. %{toggle_privilege} Si lo prefieres, puedes crear un aspecto especial llamado 'Chat' y agregar allí a los usuarios con los que quieres chatear. Una vez que hayas hecho esto, abre la interface de chat y selecciona al usuario con quien quieres chatear."
+ add_contact_roster_q: "¿Cómo hago para chatear con alguien en diaspora*?"
+ contacts_page: "página de contactos"
+ title: "Chat"
+ faq: "Preguntas frecuentes"
foundation_website: "página web de la Fundación diaspora*"
getting_help:
- get_support_a_hashtag: "preguntar en una publicación pública usando la etiqueta #pregunta"
- get_support_a_irc: "únete a nosotros en %{irc} (Chat en vivo)"
- get_support_a_tutorials: "revisa nuestros %{tutorials}"
- get_support_a_website: "visítanos en %{link}"
- get_support_a_wiki: "busca en %{link}"
+ get_support_a_faq: "Lee nuestra página de preguntas frecuentes %{faq} en la Wiki"
+ get_support_a_hashtag: "Preguntar en una publicación pública utilizando la etiqueta %{question}"
+ get_support_a_irc: "Únete a nosotros en %{irc} (Chat en vivo)"
+ get_support_a_tutorials: "Consultá nuestros %{tutorials}"
+ get_support_a_website: "Visítanos en %{link}"
+ get_support_a_wiki: "Buscá en %{link}"
get_support_q: "¿Y si mi pregunta no está contestada en estas FAQ? ¿Dónde más puedo obtener ayuda?"
- getting_started_a: "Estás de suerte. Prueba %{tutorial_series} en el sitio web del proyecto. Donde se explica paso a paso el proceso de registracion y los conceptos basicos que necesitas saber para usar diaspora*."
+ getting_started_a: "Estás de suerte. :) Prueba la %{tutorial_series} en el sitio web del proyecto, donde se explica paso a paso el proceso de registro y los conceptos basicos que necesitas saber para usar diaspora*."
getting_started_q: "¡Ayuda! ¡Necesito conocer lo básico para empezar!"
title: "Obtener ayuda"
- getting_started_tutorial: "series de tutoriales 'Primeros pasos'"
- here: "aquí"
+ getting_started_tutorial: "Serie de tutoriales \"Primeros pasos\""
+ here: "Aquí"
irc: "IRC"
keyboard_shortcuts:
keyboard_shortcuts_a1: "En la \"Entrada\" puedes utilizar los siguientes atajos de teclado:"
@@ -412,6 +403,10 @@ es-AR:
keyboard_shortcuts_li2: "k- salta a la publicación anterior"
keyboard_shortcuts_li3: "c- comentar la publicación actual"
keyboard_shortcuts_li4: "l- marcar como \"Me gusta\" la publicación actual"
+ keyboard_shortcuts_li5: "r - compartir la publicación actual"
+ keyboard_shortcuts_li6: "m - expandir la publicación actual"
+ keyboard_shortcuts_li7: "o - abrir el primer enlace de la publicación actual"
+ keyboard_shortcuts_li8: "ctrl + enter - Envía el mensaje que estás escribiendo"
keyboard_shortcuts_q: "¿Qué atajos de teclado están disponibles?"
title: "Atajos de teclado"
markdown: "Markdown"
@@ -423,20 +418,20 @@ es-AR:
see_mentions_a: "Sí, haz clic en \"@Menciones\" en la columna izquierda de tu página de inicio."
see_mentions_q: "¿Existe alguna manera de ver las publicaciones en las cuales he sido mencionado?"
title: "Menciones"
- what_is_a_mention_a: "Una mención es un enlace a la pagina de perfil de la o las personas que aparecen en la publicación. Cuando alguien es mencionado el recibe una notificación que llama su atención sobre la publicación."
+ what_is_a_mention_a: "Una mención es un enlace a la página de perfil de la o las personas que aparecen en la publicación. Cuando alguien es mencionado, recibe una notificación que llama su atención sobre la publicación."
what_is_a_mention_q: "¿Qué es una \"mención\"?"
miscellaneous:
back_to_top_a: "Sí. Después de haberse desplazado hacia abajo en la página, haciendo un click en la flecha gris que aparece en la esquina inferior derecha de la ventana de tú navegador."
back_to_top_q: "¿Existe una manera rápida de regresar a la parte superior de la página después de haberme desplazado hacia abajo?"
- diaspora_app_a: "Existen muchas aplicaciones para Android en una etapa temprana de desarrollo. Muchos son proyectos hace tiempo abandonados y no funcionan bien con la versión actual de diaspora*. No esperes demasiado de estas aplicaciones por el momento. Actualmente la mejor manera de acceder a diaspora* desde tu dispositivo móvil es a través de tu navegador, porque hemos diseñado una versión móvil de este sitio que debería funcionar correctamente en todos los teléfonos. No existe actualmente una aplicación para iOS. Nuevamente, diaspora* debería funcionar bien a través de su navegador."
+ diaspora_app_a: "Existen muchas aplicaciones para Android en una etapa temprana de desarrollo. Muchos son proyectos hace tiempo abandonados y no funcionan bien con la versión actual de diaspora*. No esperes demasiado de estas aplicaciones por el momento. Actualmente la mejor manera de acceder a diaspora* desde tu dispositivo móvil es a través de tu navegador, porque hemos diseñado una versión móvil de este sitio que debería funcionar correctamente en todos los teléfonos. No existe actualmente una aplicación para iOS. Nuevamente, diaspora* debería funcionar bien a través de tu navegador."
diaspora_app_q: "¿Existe una aplicación diaspora* para Android o iOS?"
photo_albums_a: "No, no actualmente. De todas formas puedes ver las actualizaciones de sus fotos desde la sección de Fotos en la barra lateral de su pagina de perfil."
photo_albums_q: "¿Hay álbumes de fotos o videos?"
- subscribe_feed_a: "Sí, pero ésta aún no es una funcionalidad completamente pulida y el formateo de los resultados es todavía un poco tosco. Si deseas probarla de todas maneras, ve hacia alguna página de perfil y has click en el botón feed de tu navegador, o puedes copiar la URL del perfil (ej.: https://joindiaspora.com/people/somenumber), y pegarla dentro del lector de feeds. La dirección que resulta de esto es parecida a: https//joindiaspora.com/public/username.atom - diaspora* usa Atom en lugar de RSS."
+ subscribe_feed_a: "Sí, pero ésta aún no es una funcionalidad completamente pulida y el formateo de los resultados es todavía un poco tosco. Si de todas maneras deseas probarla, ve hacia alguna página de perfil y haz clic en el botón feed de tu navegador, o puedes copiar la URL del perfil (ej.: https://joindiaspora.com/people/número), y pegarla dentro del lector de feeds. La dirección que resulta de ésto es parecida a: https//joindiaspora.com/public/usuario.atom - diaspora* usa Atom en lugar de RSS."
subscribe_feed_q: "¿Puedo suscribirme a las publicaciones públicas de alguien usando un lector de feeds?"
title: "Opciones varias"
pods:
- find_people_a: "Invita a tus amigos usando el enlace al correo electrónico en la barra lateral. Sigue las etiquetas (#tags) para descubrir a otras personas con intereses en común, y agrega a aquellos que publican cosas interesantes a tus aspectos. Di quien eres en una publicación publica #nuevoaqui (#newhere)."
+ find_people_a: "Invitá a tus amigos usando el enlace de correo electrónico en la barra lateral. Sigue las etiquetas (#tags) para descubrir a otras personas con intereses en común, y agrega a tus aspectos a aquellos que publican cosas interesantes. Preséntate y saluda a la comunidad con una publicación pública usando la etiqueta #hola."
find_people_q: "Me acabo de registrar en un \"pod\", ¿cómo puedo encontrar a gente con quien compartir?"
title: "Pods"
use_search_box_a: "Si conoces su ID completa de diaspora* (por ejemplo nombredeusuario@nombredelpod.org), puedes encontrarlo mediante la búsqueda con estos datos. Si te encuentras en la misma vaina (servidor) lo puedes buscar solo por su nombre de usuario. Una alternativa es la búsqueda por su nombre de perfil (el nombre que ves en la pantalla). Si una búsqueda no funciona la primera vez, inténtalo de nuevo."
@@ -444,11 +439,11 @@ es-AR:
what_is_a_pod_a: "Un pod es un servidor con el software de diaspora* y conectado a la red de diaspora*. \"Pod\" (vaina) es una metáfora que hace referencia a las vainas de las plantas que contienen las semillas, por la manera en que los servidores contienen las cuentas de usuarios. Existen muchos pods diferentes. Puedes agregar a tus amigos de otros pods y comunicarte con ellos. (Puedes pensar en un pod de diaspora* como algo similar a un proveedor de correo electrónico: existen pods publicos, pods privados, y con algo de esfuerzo puedes instalar y correr tu propio pod)."
what_is_a_pod_q: "¿Qué es un \"pod\"?"
posts_and_posting:
- char_limit_services_a: "En el caso de que tu publicación sea limitada a una cantidad menor de caracteres (140 en el caso de Twitter, 1000 en el caso de Tumblr), y el número de caracteres restantes se mostrarán cuando el icono del servicio esta seleccionado. Aun podrás publicar en esos servicios si tu publicación es mas extensa del límite de estos servicios, pero el texto será recortado en estos."
+ char_limit_services_a: "En el caso de que tu publicación sea limitada a una cantidad menor de caracteres (140 en el caso de Twitter, 1000 en el caso de Tumblr), y el número de caracteres restantes se mostrará cuando el icono del servicio esté seleccionado. Aun podrás publicar en esos servicios si tu publicación es más extensa del límite de éstos, pero el texto será recortado."
char_limit_services_q: "¿Cuál es el límite de caracteres para publicaciones compartidas con servicios conectados que tienen una cantidad más pequeña de caracteres permitidos?"
character_limit_a: "65.535 caracteres. Es decir, ¡65.395 caracteres más de los que permite Twitter! ;)"
character_limit_q: "¿Cuál es el límite de caracteres para una publicación?"
- embed_multimedia_a: "Generalmente puedes pegar la URL (ej.: http://www.youyube.com/watch?v=nnnnnnnnnnn) dentro de tu publicación y el video o audio será añadido automáticamente. Algunos de los sitios que son soportados son: YouTube, Vimeo, SoundCloud, Flickr y algunos más. diaspora* usas oEmbed para esto. Estamos agregando nuevos sitios todo el tiempo. Recuerda siempre publicar simple y claro, con enlaces completos: sin enlaces acortados, ni operadores después de la URL base; y dale algo de tiempo antes de refrescar la pagina después de publicar para ver la vista previa."
+ embed_multimedia_a: "Generalmente puedes pegar la URL (ej.: http://www.youyube.com/watch?v=nnnnnnnnnnn) dentro de tu publicación y el video o audio será añadido automáticamente. Algunos de los sitios que soportados son: YouTube, Vimeo, SoundCloud, Flickr y algunos más. diaspora* usa oEmbed para ésto. Estamos agregando nuevos sitios todo el tiempo. Recuerda siempre publicar simple y claro, con enlaces completos: sin enlaces acortados, ni operadores después de la URL base; y dale algo de tiempo antes de refrescar la página después de publicar para ver la vista previa."
embed_multimedia_q: "¿Cómo hago para insertar video, audio u otro contenido multimedia en una publicación?"
format_text_a: "Usando un sistema simplificado llamado %{markdown}. Puedes encontrar la sintaxis completa de Markdown %{here}. El botón de vista previa es realmente útil en este caso, ya que puedes ver como se verá tu mensaje antes de compartirlo."
format_text_q: "¿Cómo puedo darle formato al texto de mis publicaciones (negrita, itálica, etc.)?"
@@ -466,7 +461,7 @@ es-AR:
stream_full_of_posts_a1: "Tu Entrada está compuesta por tres tipos de publicaciones:"
stream_full_of_posts_li1: "Las publicaciones de las personas que comparten contigo, se dividen en dos tipos: publicaciones publicas y publicaciones limitadas al aspecto en el que estas incluido. Para eliminar esas publicaciones de tu entrada, simplemente deja de compartir el aspecto con esta persona."
stream_full_of_posts_li2: "Las publicaciones públicas que contienen alguna de las etiquetas que sigues. Para eliminarlas, deja de seguir la etiqueta."
- stream_full_of_posts_li3: "Las publicaciones publicas realizadas por las personas en la lista de destacados de la comunidad. Estas pueden ser eliminadas destildando la opción \"¿Mostrar las publicaciones destacadas de la comunidad en la entrada?\" en la tabla de cuenta de tu configuración."
+ stream_full_of_posts_li3: "Son las publicaciones públicas realizadas por las personas listadas en la Comunidad Creativa. Éstas pueden ser eliminadas destildando la opción \"¿Mostrar Comunidad Creativa en tu Entrada?\" en la pestaña de configuración de cuenta."
stream_full_of_posts_q: "¿Porqué mi Entrada está repleta de publicaciones de gente que no conozco y que no tengo en mis aspectos?"
title: "Publicaciones y cómo publicar"
private_posts:
@@ -481,7 +476,7 @@ es-AR:
who_sees_post_q: "Cuando publico un mensaje en un aspecto (es decir, una publicación restringida o limitada), ¿quienes pueden verlo?"
private_profiles:
title: "Perfiles privados"
- whats_in_profile_a: "Tu Biografía, ubicación, género, y fecha de cumpleaños. Están ubicadas en la parte inferior de la pagina de edición de perfil. Toda esta información es opcional -depende de tí si la llenas o no. Los usuarios conectados que tengas agregados a tus aspectos son las únicas personas que podrán ver tu perfil privado. Ellos también podrán ver las publicaciones privadas que hagas en él o los aspectos a los que pertenecen, mezcladas con tus publicaciones publicas, cuando visiten tu pagina de perfil."
+ whats_in_profile_a: "Tu biografía, ubicación, género y fecha de cumpleaños. Están ubicadas en la parte inferior de la página de edición de perfil. Toda esta información es opcional -depende de vos si la llenás o no-. Los usuarios conectados que tengas agregados a tus aspectos son las únicas personas que podrán ver tu perfil privado. Ellos también podrán ver las publicaciones privadas que hagas en él o los aspectos a los que pertenecen, mezcladas con tus publicaciones públicas, cuando visiten tu página de perfil."
whats_in_profile_q: "¿Qué hay en mi perfil privado?"
who_sees_profile_a: "Cualquier usuario conectado que esta compartiendo contigo (es decir, que tú tienes en uno de tus aspectos). Sin embargo, las personas que te siguen, pero que tu no sigues, solo verán tu información publica."
who_sees_profile_q: "¿Quiénes pueden ver mi perfil privado?"
@@ -492,18 +487,18 @@ es-AR:
can_comment_reshare_like_q: "¿Quién puede comentar, volver a compartir o poner \"Me gusta\" en mis publicaciones públicas?"
deselect_aspect_posting_a: "El destildar aspectos no afecta una publicación pública. Está aún puede aparecer en la entrada de todos tus contactos. Para hacer una publicación visible solo a aspectos específicos, necesitas seleccionar esos aspectos desde el botón bajo el editor."
deselect_aspect_posting_q: "¿Qué sucede cuando quito la selección de uno o más aspectos al momento de hacer una publicación pública?"
- find_public_post_a: "Tus publicaciones publicas aparecerán en las entradas de todos aquellos que te sigan. Si incluyes #etiquetas (#tag) en tus publicaciones públicas, cualquiera que siga esas etiquetas podrá ver tu publicación en sus entradas. Cualquier publicación pública también tiene una URL especifica que cualquiera puede ver, incluso si no han iniciado sesión, por lo que pueden ser enlazadas directamente desde Twitter, blogs, etcétera. Las publicaciones públicas también pueden ser indexadas por los motores de búsqueda."
+ find_public_post_a: "Tus publicaciones públicas aparecerán en las Entradas de todos aquellos que te sigan. Si incluyes etiquetas (#tags) en tus publicaciones públicas, cualquiera que siga esas etiquetas podrá ver tu publicación en su Entrada. Cualquier publicación pública también tiene una URL específica que cualquiera puede ver, incluso si no ha iniciado sesión, por lo que pueden ser enlazadas directamente desde Twitter, blogs, etc. Las publicaciones públicas también pueden ser indexadas por los motores de búsqueda."
find_public_post_q: "¿Cómo pueden los demás usuarios encontrar mis publicaciones públicas?"
see_comment_reshare_like_a: "Cualquier usuario de diaspora* conectado y cualquier persona en Internet. Tanto los comentarios como las acciones de los \"Me gusta\" y \"Compartir\" de una publicación pública son también públicos."
see_comment_reshare_like_q: "Cuando comento, comparto o hago \"Me gusta\" en una publicación pública, ¿quién puede verlo?"
title: "Publicaciones públicas"
- who_sees_post_a: "Cualquiera que use Internet puede potencialmente ver una publicación que marques como pública, así que asegúrate de que realmente quieras que tu publicación sea pública. Es una buena forma de hacerse escuchar en todo el mundo."
+ who_sees_post_a: "Cualquiera que use Internet puede potencialmente ver una publicación que hayas marcado como pública, así que asegúrate de que realmente quieres que tu publicación sea pública. Es una buena forma de hacerse escuchar en todo el mundo."
who_sees_post_q: "Cuando publico algo de manera pública, ¿quién puede verlo?"
public_profiles:
title: "Perfiles públicos"
what_do_tags_do_a: "Las etiquetas ayudan a la gente a conocerte. Las fotos de perfil también aparecerán en el lado izquierdo de las páginas de esas etiquetas, junto con cualquier otra persona que las tenga en su perfil público."
what_do_tags_do_q: "¿Qué hacen las etiquetas de mi perfil público?"
- whats_in_profile_a: "Tu nombre, las cinco etiquetas que elijas para describirte a ti mismo, y tu foto. Están en la sección superior de la pagina de edición de perfil. Tú puedes hacer que esta información de perfil sea identificable o anónima. Tú pagina de perfil también muestra cualquier publicación pública que hayas hecho."
+ whats_in_profile_a: "Tu nombre, las cinco etiquetas que elijas para describirte a ti mismo, y tu foto. Están en la sección superior de la pagina de edición de perfil. Tú puedes hacer que esta información de perfil sea identificable o anónima. También, tu página de perfil muestra cualquier publicación pública que hayas hecho."
whats_in_profile_q: "¿Qué hay en mi perfil público?"
who_sees_profile_a: "Cualquier usuario de diaspora* conectado, así como la inmensidad de Internet, puede verlo. Cada perfil tiene una URL directa, así que puede ser enlazado directamente desde sitios externos y puede ser indexado por los motores de búsqueda."
who_sees_profile_q: "¿Quién puede ver mi perfil público?"
@@ -517,16 +512,16 @@ es-AR:
title: "Volver a compartir una publicación"
sharing:
add_to_aspect_a1: "Digamos que Amy agrega a Ben a un aspecto, pero Ben (aún) no ha agregado a Amy a un aspecto:"
- add_to_aspect_a2: "Esto es conocido como distribución asimétrica. Si Ben también agrega a Amy a sus aspectos entonces pasaría a ser un intercambio mutuo, con las publicaciones públicas de Amy y Ben y las publicaciones privadas importantes apareciendo en las entradas de ambos, etc. "
+ add_to_aspect_a2: "Esto es conocido como intercambio asimétrico. Si Ben también agrega a Amy a sus aspectos entonces pasaría a ser un intercambio mutuo, con las publicaciones públicas de Amy y Ben y las publicaciones privadas importantes apareciendo en las Entradas de ambos, etc. "
add_to_aspect_li1: "Ben recibe una notificación de que Amy \"comenzó a compartir\" con Ben."
add_to_aspect_li2: "Amy comenzará a ver las publicaciones públicas de Ben en su Entrada."
add_to_aspect_li3: "Amy no podrá ver ninguna de las publicaciones restringidas de Ben."
add_to_aspect_li4: "Ben no verá las publicaciones públicas o restringidas de Amy en su Entrada."
- add_to_aspect_li5: "Pero si Ben va a la pagina de perfil de Amy, entonces él podrá ver las publicaciones privadas que ella ha enviado a sus aspectos en los cuales él esta incluido (así como sus publicaciones públicas que cualquiera puede ver allí)."
+ add_to_aspect_li5: "Pero si Ben va a la página de perfil de Amy, entonces él podrá ver las publicaciones privadas que ella ha enviado a sus aspectos en los cuales él está incluido (así como sus publicaciones públicas que cualquiera puede ver allí)."
add_to_aspect_li6: "Ben podrá ver el perfil privado de Amy (biografía, ubicación, género y fecha de nacimiento)."
add_to_aspect_li7: "Amy aparecerá como \"Compartiendo solo conmigo\" en la página de contactos de Ben."
add_to_aspect_q: "¿Qué sucede cuando agrego a alguien a uno de mis aspectos?, ¿o cuando alguien me agrega a uno de sus aspectos?"
- list_not_sharing_a: "No, pero puedes ver si alguien esta compartiendo contigo visitando su pagina de perfil. Si es así, la barra bajo su foto de perfil aparecerá de color verde; si no, será gris. Deberías recibir una notificación cada vez que alguien comienza a compartir contigo."
+ list_not_sharing_a: "No, pero puedes ver si alguien esta compartiendo contigo visitando su página de perfil. Si es así, la barra bajo su foto de perfil aparecerá de color verde; si no, será gris. Deberías recibir una notificación cada vez que alguien comienza a compartir contigo."
list_not_sharing_q: "¿Hay una lista de las personas a las que he agregado a uno de mis aspectos, pero ellos a mí no?"
only_sharing_a: "Estas son las personas que lo han agregado en uno de sus aspectos, pero que no están (aún) en ninguno de tus aspectos. En otras palabras, ellos están compartiendo contigo, pero tú no compartes con ellos (distribución asimétrica). Si tú los agregas a cualquiera de tus aspectos, entonces ellos aparecerán bajo este aspecto y no bajo \"solo compartiendo contigo\". Véase más arriba."
only_sharing_q: "¿Quienes son las personas que figuran en mi lista de contactos como \"Compartiendo solo conmigo\"?"
@@ -536,16 +531,16 @@ es-AR:
tags:
filter_tags_a: "Esta opción aún no está disponible directamente mediante diaspora*, pero algunos colaboradores %{third_party_tools} han escrito algo que permite hacerlo."
filter_tags_q: "¿Como puedo filtrar/excluir algunas etiquetas de mi entrada?"
- followed_tags_a: "Después de buscar una etiqueta puedes hacer click en el botón en la parte superior de la pagina de etiqueta \"seguir\" para seguirla. Entonces aparecerá en tu lista de etiquetas seguidas a la izquierda. Al hacer click en una de las etiquetas seguidas te re-dirigirá a la pagina de esa etiqueta para que puedas ver las publicaciones mas recientes que contengan esa etiqueta. Haciendo click en la etiqueta #Seguidas para ver las entradas de las publicaciones estas incluyen una o cualquiera de tus etiquetas seguidas. "
+ followed_tags_a: "Después de buscar una etiqueta puedes hacer clic en el botón \"Seguir\", ubicado en la parte superior de la página de la etiqueta, para seguirla. Entonces aparecerá en tu lista de etiquetas seguidas a la izquierda. Al hacer clic en una de las etiquetas seguidas te enviará a la página de esa etiqueta para que puedas ver las publicaciones más recientes que contengan esa etiqueta. Haz clic en #Etiquetas que sigues para ver en la Entrada las publicaciones que incluyan una o cualquiera de las etiquetas seguidas. "
followed_tags_q: "¿Qué son las \"#Etiquetas que sigues\" y cómo hago para seguir una etiqueta?"
people_tag_page_a: "Son personas que han puesto esta etiqueta para describirse a si mismos en sus perfiles públicos."
people_tag_page_q: "¿Quienes son las personas listadas a la izquierda de la página de etiquetas?"
- tags_in_comments_a: "Una etiqueta agregada a un comentario seguirá apareciendo como un enlace hacia la pagina de la etiqueta, pero no hará aparecer la publicación (o comentario) en la página de la etiqueta. Esto solo funciona para las etiquetas en las publicaciones."
+ tags_in_comments_a: "Una etiqueta agregada a un comentario seguirá apareciendo como un enlace hacia la página de la etiqueta, pero no hará aparecer la publicación (o comentario) en la página de la etiqueta. Esto solo funciona para las etiquetas en las publicaciones."
tags_in_comments_q: "¿Puedo agregar etiquetas en los comentarios o solo en las publicaciones?"
title: "Etiquetas"
what_are_tags_for_a: "Las etiquetas son una manera de categorizar una publicación, usualmente por un tema. Buscando por etiquetas se mostraran todas las publicaciones con dicha etiqueta que puedes ver (ambos públicos y privados). Esto permite a las personas que están interesadas en un tema en particular encontrar todas las publicaciones públicas sobre él."
what_are_tags_for_q: "¿Para qué sirven las etiquetas?"
- third_party_tools: "herramientas de terceros"
+ third_party_tools: "Herramientas de terceros"
title_header: "Ayuda"
tutorial: "tutorial"
tutorials: "tutoriales"
@@ -592,18 +587,18 @@ es-AR:
layouts:
application:
back_to_top: "Volver al inicio"
- powered_by: "IMPULSADO POR diaspora*"
+ powered_by: "Impulsado por diaspora*"
public_feed: "Canal público para %{name}"
- source_package: "descargar el paquete del código fuente"
+ source_package: "Descargar el paquete con el código fuente"
toggle: "Cambiar a celular"
whats_new: "¿Qué hay de nuevo?"
- your_aspects: "tus aspectos"
+ your_aspects: "Tus aspectos"
header:
- admin: "administrar"
+ admin: "Administrar"
blog: "Blog"
- code: "código"
+ code: "Código"
help: "Ayuda"
- login: "conectarse"
+ login: "Conectarse"
logout: "Salir"
profile: "Perfil"
recent_notifications: "Notificaciones recientes"
@@ -625,13 +620,13 @@ es-AR:
zero: "a nadie le gusta este comentario"
limited: "Limitado"
more: "Más"
- next: "siguiente"
+ next: "Siguiente"
no_results: "No hay resultados"
notifications:
also_commented:
one: "%{actors} también comentó en la publicación %{post_link} de %{post_author}."
other: "%{actors} también comentaron en la publicación %{post_link} de %{post_author}."
- zero: "%{actors} también comentó en la publicación %{post_link} de %{post_author}."
+ zero: "%{actors} comentaron en la publicación %{post_link} de %{post_author}."
also_commented_deleted:
few: "%{actors} comentaron en una publicación eliminada."
many: "%{actors} comentaron en una publicación eliminada."
@@ -669,10 +664,11 @@ es-AR:
mark_read: "Marcar como leído"
mark_unread: "Marcar como no leído"
mentioned: "Mencionados"
+ no_notifications: "Aún no tienes ninguna notificación."
notifications: "Notificaciones"
reshared: "Compartidos"
- show_all: "mostrar todo"
- show_unread: "mostrar no leídos"
+ show_all: "Mostrar todo"
+ show_unread: "Mostrar no leídos"
started_sharing: "Usuarios que comparten con vos"
liked:
one: "A %{actors} le gustó tu publicación %{post_link}."
@@ -720,15 +716,59 @@ es-AR:
two: "%{actors} comenzó a compartir con vos."
zero: "%{actors} comparte con vos."
notifier:
+ a_limited_post_comment: "Hay un nuevo comentario para vos en una publicación limitada de diaspora*"
a_post_you_shared: "una publicación."
- accept_invite: "¡Acepta tu invitación a diaspora*!"
- click_here: "click aquí"
+ a_private_message: "Hay un nuevo mensaje privado para vos en diaspora*"
+ accept_invite: "¡Aceptá tu invitación a diaspora*!"
+ click_here: "Haz clic aquí"
comment_on_post:
reply: "Responder o ver la publicación de %{name} >"
confirm_email:
click_link: "Para activar tu nueva dirección de correo %{unconfirmed_email}, por favor seguí este enlace::"
subject: "Por favor, activá tu nueva dirección de correo %{unconfirmed_email}"
email_sent_by_diaspora: "Este correo electrónico fue enviado por %{pod_name}. Si quieres dejar de recibir correos como este,"
+ export_email:
+ body: |-
+ Hola %{name},
+
+ Tus datos han sido procesados y están listos para descargar siguiendo [este enlace](%{url}).
+
+ Saludos,
+
+ El correo robot de diaspora*
+ subject: "Tu información personal está lista para ser descargada, %{name}"
+ export_failure_email:
+ body: |-
+ Hola %{name}
+
+ Hemos encontrado un problema mientras se procesaba tu información personal para descargar.
+ ¡Por favor inténtalo de nuevo!
+
+ Saludos,
+
+ El correo robot de diaspora*
+ subject: "Lo sentimos, hubo un problema al exportar tus datos, %{name}"
+ export_photos_email:
+ body: |-
+ Hola %{name},
+
+ Tus fotos han sido procesadas y están listas para descargar siguiendo [este enlace](%{url}).
+
+ Saludos,
+
+ El correo robot de diaspora*
+ subject: "%{name}, tus fotos están listas para descargar"
+ export_photos_failure_email:
+ body: |-
+ Hola %{name}
+
+ Hemos encontrado un problema mientras se procesaban tus fotos para descargar.
+ Por favor ¡inténtalo de nuevo!
+
+ Saludos,
+
+ El correo robot de diaspora*
+ subject: "%{name}, hubo un problema con la descarga de tus fotos"
hello: "¡Hola %{name}!"
invite:
message: |-
@@ -755,6 +795,23 @@ es-AR:
subject: "%{name} te mencionó en diaspora*"
private_message:
reply_to_or_view: "Responder o ver esta conversación >"
+ remove_old_user:
+ body: |-
+ Hola,
+
+ Debido a su inactividad en la cuenta de diaspora* alojada en %{pod_url}, lamentamos informarle que el sistema a marcado esta cuenta para que sea removida automaticamente. Esto sucede después de un periodo de inactividad mayor a %{after_days} días.
+
+ Usted puede evitar perder la cuenta accediendo antes de %{remove_after}, en cuyo caso la remoción automática será cancelada.
+
+ Este mantenimiento es realizado para asegurar a nuestros usuarios activos los recursos de la red diaspora*. Gracias por su comprensión.
+
+ Si usted desea mantener su cuenta por favor acceda aquí:
+ %{login_url}
+
+ Esperamos verlo nuevamente.
+
+ El correo robot de Diaspora*
+ subject: "Su cuenta de Diaspora* ha sido marcada para dar de baja por inactividad"
report_email:
body: |-
Hola,
@@ -794,12 +851,11 @@ es-AR:
password_confirmation: "Confirmación de contraseña"
people:
add_contact:
- invited_by: "fuiste invitado por"
+ invited_by: "Fuiste invitado por"
add_contact_small:
- add_contact_from_tag: "añadir contacto desde una etiqueta"
+ add_contact_from_tag: "Agregar contacto desde una etiqueta"
aspect_list:
- edit_membership: "editar aspectos asociados"
- few: "%{count} personas"
+ edit_membership: "Editar el Aspecto donde está el contacto"
helper:
is_not_sharing: "%{name} no está compartiendo con vos"
is_sharing: "%{name} está compartiendo con vos"
@@ -811,13 +867,12 @@ es-AR:
no_results: "¡Che! Necesitás buscar algo."
results_for: "Usuarios que coinciden con la búsqueda %{search_term}"
search_handle: "Utiliza la ID de diaspora* (usuario@pod.tld) para estar seguro/a de que encontrarás a tus amigos."
- searching: "buscando, por favor sé paciente…"
+ searching: "Buscando, por favor sé paciente..."
send_invite: "¿Todavía nada? ¡Envía una invitación!"
- many: "%{count} personas"
one: "1 persona"
other: "%{count} personas"
person:
- add_contact: "agregar contacto"
+ add_contact: "Agregar contacto"
already_connected: "Ya estás conectado"
pending_request: "Solicitud pendiente"
thats_you: "¡Ése sos vos!"
@@ -826,10 +881,10 @@ es-AR:
born: "Fecha de nacimiento"
edit_my_profile: "Editar mi perfil"
gender: "Género/sexo"
- in_aspects: "en aspectos"
+ in_aspects: "En aspectos"
location: "Ubicación"
photos: "Fotos"
- remove_contact: "eliminar contacto"
+ remove_contact: "Eliminar contacto"
remove_from: "¿Querés eliminar a %{name} de %{aspect}?"
show:
closed_account: "Esta cuenta ha sido cerrada."
@@ -841,19 +896,18 @@ es-AR:
message: "Mensaje"
not_connected: "No estás conectado con esa persona"
recent_posts: "Publicaciones recientes"
- recent_public_posts: "Publicaciones al mundo recientes"
+ recent_public_posts: "Últimas publicaciones públicas"
return_to_aspects: "Volver a tu página de aspectos"
see_all: "Ver todo"
- start_sharing: "comenzar a compartir"
+ start_sharing: "Comenzar a compartir"
to_accept_or_ignore: "aceptar o ignorar."
sub_header:
add_some: "Agregar algo"
- edit: "editar"
- you_have_no_tags: "no tenes tags!"
- two: "%{count} gente"
+ edit: "Editar"
+ you_have_no_tags: "¡No tenés etiquetas!"
webfinger:
fail: "Lo sentimos, no pudimos encontrar a %{handle}."
- zero: "nadie"
+ zero: "No se encontró a nadie"
photos:
comment_email_subject: "La foto de %{name}"
create:
@@ -866,7 +920,7 @@ es-AR:
editing: "Editando"
new:
back_to_list: "Volver a la lista"
- new_photo: "Foto nueva"
+ new_photo: "Nueva foto"
post_it: "¡Publicalo!"
new_photo:
empty: "{file} está vacío, por favor seleccioná archivos sin él."
@@ -876,13 +930,13 @@ es-AR:
or_select_one_existing: "o selecciona una %{photos} de las existentes"
upload: "¡Subir una nueva foto de perfil!"
photo:
- view_all: "ver todas las fotos de %{name}"
+ view_all: "Ver todas las fotos de %{name}"
show:
- collection_permalink: "enlace permanente a la colección"
+ collection_permalink: "Enlace permanente a la colección"
delete_photo: "Eliminar foto"
- edit: "editar"
+ edit: "Editar"
edit_delete_photo: "Editar descripción de foto / eliminar foto"
- make_profile_photo: "convertir en foto de perfil"
+ make_profile_photo: "Convertir en foto de perfil"
show_original_post: "Mostrar la publicación original"
update_photo: "Actualizar foto"
update:
@@ -900,7 +954,7 @@ es-AR:
other: "%{count} fotos de %{author}"
zero: "Ninguna foto de %{author}"
reshare_by: "Compartido por %{author}"
- previous: "anterior"
+ previous: "Anterior"
privacy: "Privacidad"
privacy_policy: "Política de Privacidad"
profile: "Perfil"
@@ -923,7 +977,7 @@ es-AR:
your_private_profile: "Tu perfil privado"
your_public_profile: "Tu perfil público"
your_tags: "Vos en 5 palabras"
- your_tags_placeholder: "Por ejemplo #arte #panqueque #gatitos #música"
+ your_tags_placeholder: "Por ejemplo #arte #viajes #linux #música #cine"
update:
failed: "No pudo actualizarse el perfil"
updated: "Perfil actualizado"
@@ -948,29 +1002,26 @@ es-AR:
update: "Actualizar"
invalid_invite: "¡El enlace de la invitación ya no es válido!"
new:
- continue: "Continuar"
create_my_account: "¡Crear mi cuenta!"
- diaspora: "<3 diaspora*"
- email: "CORREO ELECTRONICO"
+ email: "Correo electrónico"
enter_email: "Ingresá un correo electrónico"
enter_password: "Ingresa una contraseña (seis caracteres mínimo)"
enter_password_again: "Repetí la misma contraseña"
enter_username: "Elegí un nombre de usuario (sólo letras, números y guión bajo)"
- hey_make: "HEY,<br/>SIENTE LA<br/>LIBERTAD."
join_the_movement: "Unite al movimiento!"
- password: "CONTRASEÑA"
+ password: "Contraseña"
password_confirmation: "Confirmación de contraseña"
- sign_up: "REGISTRARSE"
+ sign_up: "Registrarse"
sign_up_message: "Redes Sociales con un <3"
submitting: "Enviar"
terms: "Con la creación de una cuenta aceptas los %{terms_link}."
terms_link: "Términos de Servicio"
- username: "NOMBRE DE USUARIO"
+ username: "Nombre de usuario"
report:
comment_label: "<b>Comentario</b>:<br>%{data}"
confirm_deletion: "¿Está seguro de borrar el item?"
delete_link: "Borrar item"
- not_found: "<u>La publicación/comentario no se ha encontrado. ¡Al parecer ha sido borrada por el usuario!</u>"
+ not_found: "<u>No se ha encontrado la publicación/comentario. ¡Al parecer ha sido borrada por el usuario!</u>"
post_label: "<b>Publicación</b>: %{title}"
reason_label: "Motivo: %{text}"
reported_label: "<b>Reportada por</b> %{person}"
@@ -1012,9 +1063,9 @@ es-AR:
one: "Compartido 1 vez"
other: "Compartido %{count} veces"
zero: "No compartido"
- reshare_confirmation: "¿Compartir publicación de %{author}?"
+ reshare_confirmation: "¿Compartir la publicación de %{author}?"
reshare_original: "Compartir orignial"
- reshared_via: "compartido a través de"
+ reshared_via: "Compartido a través de"
show_original: "Mostrar original "
search: "Buscar"
services:
@@ -1026,19 +1077,19 @@ es-AR:
destroy:
success: "Autenticación eliminada."
failure:
- error: "hubo un error al conectar al servicio"
+ error: "Hubo un error al conectar con el servicio"
finder:
fetching_contacts: "diaspora* está trasladando tus contactos de %{service}, por favor regresa en unos minutos."
no_friends: "No se han encontrado contactos de Facebook."
- service_friends: "%{service} Amigos"
+ service_friends: "diaspora* se está llenando de tus amigos de %{service}, por favor regresa en unos minutos."
index:
connect_to_facebook: "Conectar a Facebook"
connect_to_tumblr: "Conectar con Tumblr"
connect_to_twitter: "Conectar a Twitter"
- connect_to_wordpress: "Conectarse a Wordpress"
- disconnect: "desconectar"
+ connect_to_wordpress: "Conectarse a WordPress"
+ disconnect: "Desconectar"
edit_services: "Editar servicios"
- logged_in_as: "conectado como"
+ logged_in_as: "Conectado como"
no_services: "No conectaste ningún servicio todavía."
really_disconnect: "¿Querés desconectarte de %{service}?"
services_explanation: "Conectar con otros servicios te ofrece la posibilidad de publicar tus publicaciones a medida que las escribes en diaspora*."
@@ -1046,14 +1097,14 @@ es-AR:
click_link_to_accept_invitation: "Seguí este enlace para aceptar la invitación"
join_me_on_diaspora: "Unite, nos vemos en diaspora*"
remote_friend:
- invite: "invitar"
+ invite: "Invitar"
not_on_diaspora: "Todavía no está en diaspora*"
- resend: "reenviar"
+ resend: "Reenviar"
settings: "Configuración"
share_visibilites:
update:
post_hidden_and_muted: "La publicación de %{name} ha sido ocultada y sus notificaciones desactivadas."
- see_it_on_their_profile: "Si querés ver actualizaciones sobre este post, visitá la página del perfil de %{name}."
+ see_it_on_their_profile: "Si querés ver actualizaciones sobre esta publicación, visitá la página de perfil de %{name}."
shared:
add_contact:
add_new_contact: "Añadir contacto"
@@ -1064,6 +1115,8 @@ es-AR:
your_diaspora_username_is: "Tu nombre de usuario de diaspora* es: %{diaspora_handle}"
aspect_dropdown:
add_to_aspect: "Añadir contacto"
+ mobile_row_checked: "%{name} (eliminar)"
+ mobile_row_unchecked: "%{name} (agregar)"
toggle:
one: "En %{count} aspecto"
other: "En %{count} aspectos"
@@ -1071,11 +1124,11 @@ es-AR:
contact_list:
all_contacts: "Todos los contactos"
footer:
- logged_in_as: "conectado como %{name}"
- your_aspects: "tus aspectos"
+ logged_in_as: "Conectado como %{name}"
+ your_aspects: "Tus aspectos"
invitations:
by_email: "Vía correo electrónico"
- dont_have_now: "No tenés ninguna invitación ahora, pero ¡pronto tendrás más!"
+ dont_have_now: "No tenés ninguna invitación por ahora, pero ¡pronto tendrás más!"
from_facebook: "Desde Facebook"
invitations_left: "quedan %{count}"
invite_someone: "Invitá a alguien"
@@ -1087,8 +1140,8 @@ es-AR:
new: "Nueva %{type} de %{from}"
public_explain:
atom_feed: "canal Atom"
- control_your_audience: "Controla tu Audiencia"
- logged_in: "conectado a %{service}"
+ control_your_audience: "Controlá tu audiencia"
+ logged_in: "Conectado a %{service}"
manage: "Gestionar servicios conectados"
new_user_welcome_message: "Usa #hashtags para clasificar tus publicaciones y encontrar gente que comparte tus intereses. Llama a gente interesante usando las @Menciones"
outside: "Las publicaciones públicas podrán ser vistas por otros fuera de diaspora*."
@@ -1096,12 +1149,12 @@ es-AR:
title: "Gestioná los servicios conectados"
visibility_dropdown: "Usa este menú para cambiar la visibilidad de tu publicación. (Sugerimos hacer público el primero.)"
publisher:
- all: "todo"
- all_contacts: "todos los contactos"
+ all: "Todo"
+ all_contacts: "Todos los contactos"
discard_post: "Descartar publicación"
formatWithMarkdown: "Puedes usar %{markdown_link} para darle formato a tu publicación"
get_location: "Obtener tu ubicación"
- make_public: "hacer público"
+ make_public: "Hacer público"
new_user_prefill:
hello: "#%{new_user_tag}, acabo de llegar aquí."
i_like: " Tengo interés en %{tags}."
@@ -1116,10 +1169,10 @@ es-AR:
post_a_message_to: "Publicar un mensaje en %{aspect}"
posting: "Publicando..."
preview: "Vista previa"
- publishing_to: "publicar en: "
+ publishing_to: "Publicar en: "
remove_location: "Eliminar ubicación"
share: "Compartir"
- share_with: "compartir con"
+ share_with: "Compartir con"
upload_photos: "Subir fotos"
whats_on_your_mind: "¿Qué tenés en mente?"
reshare:
@@ -1136,8 +1189,8 @@ es-AR:
shared_with: "Compartido con: %{aspect_names}"
show: "Mostrar"
unlike: "No me gusta"
- via: "vía %{link}"
- via_mobile: "vía celular"
+ via: "A través de %{link}"
+ via_mobile: "Desde el celular"
viewable_to_anyone: "Esta publicación puede ser vista por cualquiera en la web"
simple_captcha:
label: "Ingresa el código en el recuadro de abajo"
@@ -1146,6 +1199,21 @@ es-AR:
failed: "Falló la verificación humana"
user: "La imagen secreta y el código son diferentes"
placeholder: "Ingresa el valor de la imagen"
+ statistics:
+ active_users_halfyear: "Usuarios activos en los últimos 6 meses"
+ active_users_monthly: "Usuarios activos en el último mes"
+ closed: "Cerrado"
+ disabled: "No disponible"
+ enabled: "Disponible"
+ local_comments: "Comentarios en el pod"
+ local_posts: "Publicaciones en el pod"
+ name: "Nombre"
+ network: "Red"
+ open: "Abierto"
+ registrations: "Usuarios registrados"
+ services: "Servicios"
+ total_users: "Usuarios totales"
+ version: "Versión"
status_messages:
create:
success: "Se mencionó a: %{names}"
@@ -1155,12 +1223,11 @@ es-AR:
no_message_to_display: "No hay mensajes que mostrar."
new:
mentioning: "Mencionar a: %{person}"
- too_long:
- one: "Por favor, hacé que tu mensaje de estado tenga menos de %{count} caracter"
- other: "Por favor, hacé que tu mensaje de estado tenga menos de %{count} caracteres"
- zero: "Por favor, hacé que tu mensaje de estado tenga menos de %{count} caracteres"
+ too_long: "Por favor haz que tu mensaje de estado tenga menos de %{count} caracteres. En este momento el máximo permitido es de %{current_length} caracteres."
stream_helper:
hide_comments: "Ocultar comentarios"
+ no_more_posts: "No hay más posts, llegaste al final de la \"Entrada\"."
+ no_posts_yet: "Todavía no hay publicaciones."
show_comments:
few: "Mostrar %{count} comentarios más"
many: "Mostrar %{count} comentarios más"
@@ -1172,7 +1239,7 @@ es-AR:
activity:
title: "Mi actividad"
aspects:
- title: "Aspectos"
+ title: "Mis aspectos"
aspects_stream: "Aspectos"
comment_stream:
contacts_title: "Personas que han comentado tu mensaje"
@@ -1192,36 +1259,33 @@ es-AR:
contacts_title: "Gente que te mencionó"
title: "@Menciones"
multi:
- contacts_title: "Personas en tu Stream"
+ contacts_title: "Personas en tu Entrada"
title: "Entrada"
public:
contacts_title: "Autores recientes"
- title: "Actividad Pública"
+ title: "Actividad pública"
tags:
contacts_title: "Personas que usaron esta etiqueta"
- tag_prefill_text: "Sobre %{tag_name}... "
title: "Mensajes tagueados: %{tags}"
tag_followings:
create:
failure: "No has podido seguir a #%{name}. Tal vez ya lo hagas..."
none: "No se puedes seguir una etiqueta en blanco!"
- success: "Ahora estás siguiendo a #%{name}."
+ success: "¡Bien ahí! Ahora estás siguiendo a #%{name}."
destroy:
failure: "No has podido dejar de seguir a: #%{name}. Tal vez ya lo hiciste..."
- success: "Dejaste de seguir a #%{name}. "
+ success: "¡Epa! Dejaste de seguir a #%{name}."
tags:
+ name_too_long: "Por favor haz que el nombre de la etiqueta tenga menos de %{count} caracteres. En este momento el máximo permitido es de %{current_length} caracteres."
show:
follow: "Seguir #%{tag}"
- followed_by_people:
- one: "Seguido por una persona"
- other: "Seguido por %{count} personas"
- zero: "Seguido por nadie"
following: "Siguiendo #%{tag}"
- nobody_talking: "Nadie está hablado sobre %{tag} todavía."
none: "La etiqueta en blanco no existe!"
- people_tagged_with: "Personas etiquetadas con %{tag}"
- posts_tagged_with: "Publicaciones etiquetadas con #%{tag}"
stop_following: "Dejar de seguir #%{tag}"
+ tagged_people:
+ one: "1 persona etiquetada con %{tag}"
+ other: "%{count} personas etiquetadas con %{tag}"
+ zero: "Ninguna persona etiquetada con %{tag}"
terms_and_conditions: "Términos y Condiciones"
undo: "¿Deshacer?"
username: "Nombre de usuario"
@@ -1231,11 +1295,11 @@ es-AR:
email_not_confirmed: "El E-Mail no pudo ser activado. Link equivocado?"
destroy:
no_password: "Por favor, introduce tu contraseña actual para cerrar y destruir tu cuenta."
- success: "Tu cuenta ha sido bloqueada. Nos puede tomar unos 20 minutos cerrar tu cuenta definitivamente. Te agradecemos por probar diaspora*."
+ success: "Tu cuenta ha sido bloqueada. Nos puede tomar unos 20 minutos cerrar tu cuenta definitivamente. Muchas gracias por probar diaspora*."
wrong_password: "La contraseña ingresada no coincide con tu contraseña actual."
edit:
- also_commented: "...alguien también comenta en una publicación en la que comentaste?"
- auto_follow_aspect: "Selecciona el aspecto al que se incluirán los usuarios a quienes sigues automáticamente:"
+ also_commented: "alguien también comenta en una publicación en la que comentaste"
+ auto_follow_aspect: "Selecciona el aspecto al que se incluirán los usuarios que sigues automáticamente:"
auto_follow_back: "Seguir automáticamente a los usuarios que te sigan"
change: "Cambiar"
change_email: "Cambiar E-Mail"
@@ -1243,31 +1307,38 @@ es-AR:
change_password: "Cambiar contraseña"
character_minimum_expl: "debe tener al menos seis caracteres"
close_account:
- dont_go: "Hey, por favor no te vayas!"
- if_you_want_this: "Si realmente es lo que deseas, ingresa tu contraseña debajo y pulsa «Eliminar cuenta»."
- lock_username: "Esto bloquerá tu nombre de usuario si decides volver a registrarte."
- locked_out: "Saldrás y eliminarás tu cuenta."
- make_diaspora_better: "Queremos que nos ayudes a mejorar diaspora*, así que deberías ayudarnos en vez de marcharte. Si en verdad quieres irte, queremos que sepas lo que sucede después."
+ dont_go: "Hey, ¡por favor no te vayas!"
+ if_you_want_this: "Si realmente es lo que deseás, ingresá tu contraseña debajo y pulsá «Eliminar cuenta»."
+ lock_username: "Tu nombre de usuario se ha bloqueado. No será posible crear una nueva cuenta con el mismo ID en este pod."
+ locked_out: "Se cerrará tu sesión y serás bloqueado hasta que tu cuenta sea eliminada."
+ make_diaspora_better: "Nos encantaría que te quedes y que nos ayudes a mejorar diaspora*. Pero, si en verdad querés irte, ésto es lo que va a suceder a continuación:"
mr_wiggles: "El gatito estará triste por verte partir."
- no_turning_back: "Actualmente, no hay vuelta atrás."
- what_we_delete: "Eliminaremos todas tus publicaciones y datos de perfil tan pronto como sea humanamente posible. Tus comentarios seguirán en línea, pero asociados a tu dirección de diaspora*."
+ no_turning_back: "¡Ojo! No hay vuelta atrás. Si estás seguro, ingresá su contraseña."
+ what_we_delete: "Eliminaremos todas tus publicaciones y datos de perfil tan pronto como sea posible. Tus comentarios seguirán en línea, pero asociados a tu ID de diaspora* en lugar de tu nombre."
close_account_text: "Cerrar cuenta"
comment_on_post: "...comentan en una publicación tuya?"
current_password: "Contraseña actual"
current_password_expl: "con la que inicias sesión…"
- download_photos: "descargar mis fotos"
- download_xml: "decargar mi XML"
+ download_export: "Descargar mi perfil"
+ download_export_photos: "Descargar mis fotos"
+ download_photos: "Descargar mis fotos"
edit_account: "Editar cuenta"
email_awaiting_confirmation: "Te hemos enviado un link de activación a %{unconfirmed_email}. Hasta que sigas este link y actives la nueva dirección, continuaremos utilizando tu dirección original %{email}."
export_data: "Exportar datos"
+ export_in_progress: "En este momento estamos procesando tus datos. Por favor regresa en unos minutos."
+ export_photos_in_progress: "En este momento estamos procesando tus fotos. Por favor vuelve a chequear en unos minutos."
following: "Opciones de seguimiento"
getting_started: "Preferencias de Nuevos Usuarios"
+ last_exported_at: "(Última actualización en %{timestamp})"
liked: "...a alguien le gusta una publicación tuya?"
mentioned: "...te mencionan en una publicación?"
new_password: "Contraseña nueva"
- photo_export_unavailable: "Exportar fotos actualmente no está disponible"
private_message: "...recibís un mensaje privado?"
receive_email_notifications: "¿Recibir notificaciones por correo electrónico cuando..."
+ request_export: "Solicitar los datos de mi perfil"
+ request_export_photos: "Solicitar la descarga de mis fotos"
+ request_export_photos_update: "Recargar mis fotos"
+ request_export_update: "Actualizar los datos de mi perfil"
reshared: "...alguien compartió tu publicación?"
show_community_spotlight: "¿Mostrar \"Comunidad Creativa\" en tu Entrada?"
show_getting_started: "Volver a activar la Introducción de Ayuda"
@@ -1280,8 +1351,8 @@ es-AR:
awesome_take_me_to_diaspora: "¡Increíble! Llévame a diaspora*"
community_welcome: "¡La comunidad de diaspora* está feliz de tenerte a bordo!"
connect_to_facebook: "Podemos acelerar un poco las cosas con un %{link} a diaspora*. Esto extraerá tu nombre y foto, y habilitará la publicación cruzada."
- connect_to_facebook_link: "conectando tu cuenta de Facebook"
- hashtag_explanation: "Las etiquetas te permiten seguir y hablar sobre tus intereses. También son una gran manera de encontrar gente nueva en diaspora*."
+ connect_to_facebook_link: "Conectando tu cuenta de Facebook"
+ hashtag_explanation: "Las etiquetas te permiten seguir y hablar sobre tus intereses. También son una gran manera de encontrar gente interesante y divertida en diaspora*."
hashtag_suggestions: "Probá siguiendo tags como #arte, #películas, #activismo, #geek."
saved: "¡Guardado!"
well_hello_there: "Bueno, ¡hola!"
@@ -1289,7 +1360,9 @@ es-AR:
who_are_you: "¿Quién sos?"
privacy_settings:
ignored_users: "Usuarios ignorados"
+ no_user_ignored_message: "En este momento no estás ignorando a ningún otro usuario"
stop_ignoring: "Dejar de ignorar"
+ strip_exif: "Evita metadatos como la ubicación, autor y modelo de cámara de fotos en las imágenes subidas (recomendado)"
title: "Configuración de Privacidad"
public:
does_not_exist: "¡El usuariuo %{username} no existe!"
@@ -1307,10 +1380,10 @@ es-AR:
unconfirmed_email_not_changed: "El cambio de E-Mail fallo"
webfinger:
fetch_failed: "No pudo encontrarse el perfil webfinger de %{profile_url}"
- hcard_fetch_failed: "Hubo un problema al buscar el 'hcard' de %{account}"
+ hcard_fetch_failed: "Hubo un problema al buscar el \"hcard\" de %{account}"
no_person_constructed: "No pudo crearse ninguna persona a partir de esta 'hcard'."
not_enabled: "Parece que webfinger no está habilitado para el servidor de %{account}"
- xrd_fetch_failed: "Hubo un error al buscar el 'xrd' de %{account}"
+ xrd_fetch_failed: "Hubo un error al buscar el \"xrd\" de %{account}"
welcome: "¡Bienvenido!"
will_paginate:
next_label: "siguiente »"
diff --git a/config/locales/diaspora/es-BO.yml b/config/locales/diaspora/es-BO.yml
index a524d75ec..bc482f80c 100644
--- a/config/locales/diaspora/es-BO.yml
+++ b/config/locales/diaspora/es-BO.yml
@@ -53,8 +53,6 @@ es-BO:
add_to_aspect:
failure: "Error al añadir el contacto al aspecto."
success: "Contacto añadido exitosamente al aspecto."
- aspect_contacts:
- done_editing: "editado"
aspect_listings:
add_an_aspect: "+ Añadir un aspecto"
deselect_all: "Anular selección"
@@ -69,21 +67,14 @@ es-BO:
failure: "%{name} no esta vacio y no pudo ser eliminado."
success: "%{name} ha sido eliminado con éxito."
edit:
- add_existing: "Añade un contacto existente"
aspect_list_is_not_visible: "la lista de aspectos está oculta a otros en este aspecto"
aspect_list_is_visible: "la lista de contactos del aspecto es visible"
confirm_remove_aspect: "¿Estás seguro de que quieres eliminar este aspecto?"
- done: "Hecho"
make_aspect_list_visible: "¿hacer que los contactos en este aspecto puedan verse entre ellos?"
remove_aspect: "Eliminar este aspecto"
rename: "Cambiar nombre"
update: "actualizar"
updating: "actualizando"
- few: "%{count} aspectos"
- helper:
- are_you_sure: "¿Estás seguro de querer borrar este aspecto?"
- aspect_not_empty: "El aspecto no está vacío"
- remove: "eliminar"
index:
donate: "Donar"
handle_explanation: "Esta es tu dirección de Diaspora. Como una dirección de correo electrónico, puedes dársela a la gente para que te encuentre."
@@ -93,10 +84,6 @@ es-BO:
post_a_message: "publica un mensaje >>"
unfollow_tag: "Dejar de seguir #%{tag}"
welcome_to_diaspora: "Bienvenido a Diaspora, %{name}!"
- many: "%{count} aspectos"
- move_contact:
- error: "Error moviendo contacto: %{inspect}"
- success: "La persona fue movida al nuevo aspecto"
new:
create: "Crear"
name: "Nombre (solo es visible para tí)"
@@ -114,14 +101,6 @@ es-BO:
family: "Familia"
friends: "Amigos"
work: "Trabajo"
- selected_contacts:
- manage_your_aspects: "Administra tus aspectos"
- no_contacts: "Todavía no tienes ningún contacto aquí."
- view_all_community_spotlight: "Ver lo más destacado de la comunidad"
- view_all_contacts: "Ver todos los contactos"
- show:
- edit_aspect: "editar aspecto"
- two: "%{count} aspectos"
update:
failure: "Tu aspecto, %{name}, tiene un nombre muy largo para ser guardado."
success: "Tu aspecto %{name}, ha sido editado con éxito."
diff --git a/config/locales/diaspora/es-CL.yml b/config/locales/diaspora/es-CL.yml
index 7c3c2f0de..54ad70f96 100644
--- a/config/locales/diaspora/es-CL.yml
+++ b/config/locales/diaspora/es-CL.yml
@@ -86,7 +86,8 @@ es-CL:
one: "%{count} usuario encontrado"
other: "%{count} usuarios encontrados"
zero: "Ningún usuario encontrado"
- you_currently: "Actualmente tienes %{user_invitation} invitaciones %{link}"
+ you_currently:
+ other: "Actualmente tienes %{user_invitation} invitaciones %{link}"
weekly_user_stats:
amount_of:
one: "Número de usuarios esta semana: %{count} usuario"
@@ -111,8 +112,6 @@ es-CL:
add_to_aspect:
failure: "Error al agregar el contacto a este aspecto."
success: "Contacto agregado correctamente al aspecto."
- aspect_contacts:
- done_editing: "Aceptar"
aspect_listings:
add_an_aspect: "+ Añadir un aspecto"
deselect_all: "Desmarcar todo"
@@ -131,21 +130,14 @@ es-CL:
failure: "El aspecto %{name} no esta vacío y no se puede eliminar."
success: "%{name} fue correctamente eliminado."
edit:
- add_existing: "Agregar un contacto existente"
aspect_list_is_not_visible: "Lista de contactos oculta para los demás en el Aspecto"
aspect_list_is_visible: "Lista de contactos visible para los demás en el Aspecto"
confirm_remove_aspect: "¿Estás seguro que quieres eliminar este aspecto?"
- done: "Listo"
make_aspect_list_visible: "hacer visible el aspecto?"
remove_aspect: "Eliminar este aspecto"
rename: "renombrar"
update: "Actualizar"
updating: "actualizando"
- few: "%{count} aspectos"
- helper:
- are_you_sure: "¿Estás seguro que quieres eliminar este aspecto?"
- aspect_not_empty: "El aspecto no está vacío"
- remove: "eliminar"
index:
diaspora_id:
content_1: "Tu ID de Diaspora es:"
@@ -186,11 +178,6 @@ es-CL:
heading: "Servicios que puedes enlazar"
unfollow_tag: "Dejar de seguir #%{tag}"
welcome_to_diaspora: "Bienvenido a Diaspora, %{name}!"
- many: "%{count} aspectos"
- move_contact:
- error: "Error al mover el contacto: %{inspect}"
- failure: "no funcionó %{inspect}"
- success: "Persona movida al nuevo aspecto"
new:
create: "Crear"
name: "Nombre(solo visible para ti)"
@@ -208,14 +195,6 @@ es-CL:
family: "Familia"
friends: "Amigos"
work: "Trabajo"
- selected_contacts:
- manage_your_aspects: "Organiza tus aspectos."
- no_contacts: "Todavía no tienes ningún contacto aquí."
- view_all_community_spotlight: "Ver todos los focos de atención de la comunidad"
- view_all_contacts: "Ver todos los contactos"
- show:
- edit_aspect: "editar aspecto"
- two: "%{count} aspectos"
update:
failure: "Tu aspecto, %{name}, tenía el nombre muy largo para ser guardado."
success: "Tu aspecto, %{name}, ha sido correctamente editado."
@@ -235,36 +214,27 @@ es-CL:
post_success: "Posteado! Cerrando!"
cancel: "Cancelar"
comments:
- few: "%{count} comentarios"
- many: "%{count} comentarios"
new_comment:
comment: "Comentar"
commenting: "Comentando..."
one: "1 comentario"
other: "%{count} comentarios"
- two: "%{count} comentarios"
zero: "no hay comentarios"
contacts:
create:
failure: "Error al crear contacto"
- few: "%{count} contactos"
index:
add_a_new_aspect: "Agregar un nuevo aspecto"
add_to_aspect: "Añadir contactos a %{name}"
- add_to_aspect_link: "añadir contactos a %{name}"
all_contacts: "Todos los Contactos"
community_spotlight: "Comunidad Creativa"
- many_people_are_you_sure: "Estas seguro que quieres iniciar una conversación privada con más de %{suggested_limit} contactos? Postear algo en este aspecto quizás sea una mejor manera de contactarte con ellos."
my_contacts: "Mis Contactos"
no_contacts: "Parece que necesitas agregar algunos contactos!"
no_contacts_message: "Echa un vistazo a %{community_spotlight}"
- no_contacts_message_with_aspect: "Echa un vistazo a %{community_spotlight} o %{add_to_aspect_link}"
only_sharing_with_me: "Solo compartiendo conmigo"
- remove_person_from_aspect: "Eliminar a %{person_name} de \"%{aspect_name}\""
start_a_conversation: "Comenzar una conversación"
title: "Contactos"
your_contacts: "Tus Contactos"
- many: "%{count} contactos"
one: "1 contacto"
other: "%{count} contactos"
sharing:
@@ -272,7 +242,6 @@ es-CL:
spotlight:
community_spotlight: "Comunidad Creativa"
suggest_member: "Sugiere un usuario"
- two: "%{count} contactos"
zero: "contactos"
conversations:
conversation:
@@ -281,8 +250,6 @@ es-CL:
fail: "Mensaje invalido"
no_contact: "¡Tranquilo, primero tienes que añadir el contacto!"
sent: "Mensaje enviado"
- destroy:
- success: "Conversación eliminada exitosamente"
helper:
new_messages:
few: "%{count} nuevos mensajes"
@@ -689,7 +656,6 @@ es-CL:
add_contact_from_tag: "agrega un contacto desde una etiqueta"
aspect_list:
edit_membership: "Editar el Aspecto donde está el contacto"
- few: "%{count} personas"
helper:
is_not_sharing: "%{name} no está compartiendo contigo"
is_sharing: "%{name} está compartiendo contigo"
@@ -700,7 +666,6 @@ es-CL:
no_results: "¡Oye! Tienes que buscar algo."
results_for: "resultados de búsqueda para"
searching: "Buscando, por favor sé paciente..."
- many: "%{count} personas"
one: "1 persona"
other: "%{count} personas"
person:
@@ -737,7 +702,6 @@ es-CL:
add_some: "Agrega algunos"
edit: "editar"
you_have_no_tags: "No tienes ningún tag!"
- two: "%{count} personas"
webfinger:
fail: "Lo siento, no pudimos encontrar %{handle}."
zero: "ninguna persona"
@@ -835,15 +799,12 @@ es-CL:
update: "Actualizar"
invalid_invite: "¡El enlace de invitación ya no es válido!"
new:
- continue: "Continuar"
create_my_account: "¡Crear mi cuenta!"
- diaspora: "<3 diaspora*"
email: "Correo Electrónico"
enter_email: "Ingresa un email"
enter_password: "Ingresar contraseña"
enter_password_again: "Ingresa la misma contraseña anterior"
enter_username: "Escoge un nick (solo letras, números, y guión bajo)"
- hey_make: "OYE,<br/>HAZ<br/>ALGO."
join_the_movement: "Unete al movimiento!"
password: "Contraseña"
password_confirmation: "Confirme Contraseña"
@@ -1014,13 +975,7 @@ es-CL:
no_message_to_display: "No hay mensaje que mostrar."
new:
mentioning: "Mencionar a: %{person}"
- too_long:
- few: "Tu mensaje de estado debe tener menos de %{count} caracteres"
- many: "Tu mensaje de estado debe tener menos de %{count} caracteres"
- one: "Tu mensaje de estado debe tener menos de %{count} caracter"
- other: "Tu mensaje de estado debe tener menos de %{count} caracteres"
- two: "tu mensaje de estado tiene que tener menos de %{count} caracteres"
- zero: "Tu mensaje de estado debe tener menos de %{count} caracteres"
+ too_long: "{\"few\"=>\"Tu mensaje de estado debe tener menos de %{count} caracteres\", \"many\"=>\"Tu mensaje de estado debe tener menos de %{count} caracteres\", \"one\"=>\"Tu mensaje de estado debe tener menos de %{count} caracter\", \"other\"=>\"Tu mensaje de estado debe tener menos de %{count} caracteres\", \"two\"=>\"tu mensaje de estado tiene que tener menos de %{count} caracteres\", \"zero\"=>\"Tu mensaje de estado debe tener menos de %{count} caracteres\"}"
stream_helper:
hide_comments: "ocultar todos los comentarios"
show_comments:
@@ -1061,7 +1016,6 @@ es-CL:
title: "Actividad publica"
tags:
contacts_title: "Gente que usa este tag"
- tag_prefill_text: "La cosa sobre %{tag_name} es... "
title: "Posts con el tag: %{tags}"
tag_followings:
create:
@@ -1075,10 +1029,7 @@ es-CL:
show:
follow: "Seguir a #%{tag}"
following: "Siguiendo a #%{tag}"
- nobody_talking: "Todavía nadie habla de %{tag}."
none: "¡La etiqueta vacía no existe!"
- people_tagged_with: "Personas etiquetadas en %{tag}"
- posts_tagged_with: "Posts etiquetados con #%{tag}"
stop_following: "Dejar de seguir a #%{tag}"
terms_and_conditions: "Términos y Condiciones"
undo: "Deshacer?"
@@ -1114,7 +1065,6 @@ es-CL:
current_password: "Contraseña actual"
current_password_expl: "con la que inicias sesión…"
download_photos: "descargar mis fotos"
- download_xml: "descargar mi xml"
edit_account: "Editar cuenta"
email_awaiting_confirmation: "Te enviamos un link de activación a %{unconfirmed_email}. Hasta que sigas ese link y actives la nueva dirección, nosotros seguiremos usando tu dirección original %{email}."
export_data: "Exportar Datos"
@@ -1123,7 +1073,6 @@ es-CL:
liked: "...a alguien le gusta tu post?"
mentioned: "...te mencionan en un post?"
new_password: "Nueva Contraseña"
- photo_export_unavailable: "Exportar fotos actualmente inaccesible"
private_message: "...recibes un mensaje privado?"
receive_email_notifications: "Recibir notificaciones por correo electrónico cuando..."
reshared: "...alguien comparte tu post?"
diff --git a/config/locales/diaspora/es-CO.yml b/config/locales/diaspora/es-CO.yml
index 4936279a5..eece7bdca 100644
--- a/config/locales/diaspora/es-CO.yml
+++ b/config/locales/diaspora/es-CO.yml
@@ -58,8 +58,6 @@ es-CO:
add_to_aspect:
failure: "Error al añadir el contacto al aspecto."
success: "Contacto añadido exitosamente al aspecto."
- aspect_contacts:
- done_editing: "edición finalizada"
aspect_listings:
add_an_aspect: "+ Añadir un aspecto"
deselect_all: "No seleccionar nada"
@@ -77,21 +75,14 @@ es-CO:
failure: "%{name} no está vacío y no puede ser eliminado."
success: "%{name} fue eliminado exitosamente."
edit:
- add_existing: "Añade un contacto existente"
aspect_list_is_not_visible: "La lista de aspectos permanece oculta a los demás en este aspecto"
aspect_list_is_visible: "La lista de aspectos es visible a los demás en este aspecto"
confirm_remove_aspect: "¿Estás seguro que quieres eliminar este aspecto?"
- done: "Hecho"
make_aspect_list_visible: "¿Hacer visibles entre ellos a los contactos de este aspecto?"
remove_aspect: "Eliminar este aspecto"
rename: "renombrar"
update: "actualizar"
updating: "actualizando"
- few: "%{count} aspectos"
- helper:
- are_you_sure: "¿Estás seguro que quieres eliminar este aspecto?"
- aspect_not_empty: "El aspecto no está vacío"
- remove: "eliminar"
index:
diaspora_id:
content_1: "Tu ID de Diaspora es:"
@@ -124,11 +115,6 @@ es-CO:
heading: "Conectar Servicios"
unfollow_tag: "Dejar de seguir #%{tag}"
welcome_to_diaspora: "¡Bienvenido/a a Diaspora, %{name}!"
- many: "%{count} aspectos"
- move_contact:
- error: "Error moviendo el contacto: %{inspect}"
- failure: "%{inspect} no funcionó"
- success: "La persona fue movida al nuevo aspecto"
new:
create: "Crear"
name: "Nombre (solo es visible para ti)"
@@ -146,14 +132,6 @@ es-CO:
family: "Familia"
friends: "Amigos"
work: "Trabajo"
- selected_contacts:
- manage_your_aspects: "Gestiona tus aspectos."
- no_contacts: "Todavía no tienes ningún contacto aquí."
- view_all_community_spotlight: "Ver lo más destacado de la comunidad"
- view_all_contacts: "Ver todos los contactos"
- show:
- edit_aspect: "editar aspecto"
- two: "%{count} aspectos"
update:
failure: "Tu aspecto, %{name}, tenía un nombre muy largo para ser guardado."
success: "Tu aspecto, %{name}, fue editado exitosamente."
@@ -166,50 +144,38 @@ es-CO:
post_success: "¡Publicado! ¡Cerrando!"
cancel: "Cancelar"
comments:
- few: "%{count} comentarios"
- many: "%{count} comentarios"
new_comment:
comment: "Comenta"
commenting: "Comentando…"
one: "1 comentario"
other: "%{count} comentarios"
- two: "%{count} comentarios"
zero: "no hay comentarios"
contacts:
create:
failure: "No se pudo crear el contacto"
- few: "%{count} contactos"
index:
add_a_new_aspect: "Añade un nuevo aspecto"
add_to_aspect: "Añade contactos a %{name}"
- add_to_aspect_link: "añade contactos a %{name}"
all_contacts: "Todos los Contactos"
community_spotlight: "Comunidad Creativa"
- many_people_are_you_sure: "¿Estás seguro de que quieres iniciar una conversación privada con más de %{suggested_limit} contactos? Publicar en este aspecto puede ser una mejor manera de contactar con ellos."
my_contacts: "Mis Contactos"
no_contacts: "¡Parece que necesitas añadir algunos contactos!"
no_contacts_message: "Echa un vistazo a %{community_spotlight}"
- no_contacts_message_with_aspect: "Echa un vistazo a %{community_spotlight} o %{add_to_aspect_link}"
only_sharing_with_me: "Compartiendo solo conmigo"
- remove_person_from_aspect: "Eliminar a %{person_name} de \"%{aspect_name}\""
start_a_conversation: "Inicia una conversación"
title: "Contactos"
your_contacts: "Tus Contactos"
- many: "%{count} contactos"
one: "1 contacto"
other: "%{count} contactos"
sharing:
people_sharing: "Personas que comparten contigo:"
spotlight:
community_spotlight: "Comunidad Creativa"
- two: "%{count} contactos"
zero: "contactos"
conversations:
create:
fail: "Mensaje inválido"
sent: "Mensaje enviado"
- destroy:
- success: "Conversación eliminada exitosamente"
helper:
new_messages:
one: "%{count} mensaje nuevo"
@@ -374,7 +340,6 @@ es-CO:
add_contact_from_tag: "añadir contacto desde una etiqueta"
aspect_list:
edit_membership: "editar miembros del aspecto"
- few: "%{count} personas"
helper:
results_for: " resultados para %{params}"
index:
@@ -382,7 +347,6 @@ es-CO:
no_one_found: "…no se encontró a nadie."
no_results: "¡Oye! Necesitas buscar algo."
results_for: "buscar resultados para"
- many: "%{count} personas"
one: "1 persona"
other: "%{count} personas"
person:
@@ -418,7 +382,6 @@ es-CO:
add_some: "agregar algunas"
edit: "editar"
you_have_no_tags: "¡no tienes etiquetas!"
- two: "%{count} personas"
webfinger:
fail: "Perdón, no pudimos encontrar %{handle}."
zero: "Sin personas"
diff --git a/config/locales/diaspora/es-MX.yml b/config/locales/diaspora/es-MX.yml
index d78f1f796..bebfd25cf 100644
--- a/config/locales/diaspora/es-MX.yml
+++ b/config/locales/diaspora/es-MX.yml
@@ -86,7 +86,8 @@ es-MX:
one: "Un usuario encontrado"
other: "%{count} usuarios encontrados"
zero: "Ningún usuario encontrado"
- you_currently: "Actuamente tienes %{user_invitation} invitaciones para enviar %{link}"
+ you_currently:
+ other: "Actuamente tienes %{user_invitation} invitaciones para enviar %{link}"
weekly_user_stats:
amount_of:
one: "cantidad de usuarios nuevos esta semana: %{count}"
@@ -111,8 +112,6 @@ es-MX:
add_to_aspect:
failure: "Error al añadir el contacto al aspecto."
success: "Contacto añadido exitosamente al aspecto."
- aspect_contacts:
- done_editing: "editado"
aspect_listings:
add_an_aspect: "+ Agregar un aspecto"
deselect_all: "Desmarcar todos"
@@ -131,23 +130,15 @@ es-MX:
failure: "%{name} no está vacío y no puede ser eliminado."
success: "%{name} fue eliminado exitosamente."
edit:
- add_existing: "Añade un contacto existente"
aspect_list_is_not_visible: "Los contactos en este aspecto no pueden verse entre sí."
aspect_list_is_visible: "Los contactos en este aspecto pueden verse entre sí."
confirm_remove_aspect: "¿Estás seguro de que quieres eliminar este aspecto?"
- done: "Hecho"
make_aspect_list_visible: "¿Hacer visibles entre ellos a los contactos de este aspecto?"
- manage: "Gestionar"
remove_aspect: "Eliminar este aspecto"
rename: "renombrar"
set_visibility: "Establecer visibilidad"
update: "actualizar"
updating: "actualizando"
- few: "%{count} aspectos"
- helper:
- are_you_sure: "¿Estás seguro de que quieres eliminar este aspecto?"
- aspect_not_empty: "El aspecto no está vacío"
- remove: "quitar"
index:
diaspora_id:
content_1: "Tu ID de Diaspora es:"
@@ -188,11 +179,6 @@ es-MX:
heading: "Conectar servicios"
unfollow_tag: "Dejar de seguir #%{tag}"
welcome_to_diaspora: "¡Bienvenido/a a Diaspora, %{name}!"
- many: "%{count} aspectos"
- move_contact:
- error: "Error al mover el contacto: %{inspect}"
- failure: "%{inspect} no funcionó"
- success: "La persona fue movida al nuevo aspecto"
new:
create: "Crear"
name: "Nombre (solo es visible para ti)"
@@ -210,14 +196,6 @@ es-MX:
family: "Familia"
friends: "Amigos"
work: "Trabajo"
- selected_contacts:
- manage_your_aspects: "Gestiona tus aspectos."
- no_contacts: "Todavía no tienes ningún contacto aquí."
- view_all_community_spotlight: "Ver lo más destacado de la comunidad"
- view_all_contacts: "Ver todos los contactos"
- show:
- edit_aspect: "editar aspecto"
- two: "%{count} aspectos"
update:
failure: "Tu aspecto, %{name}, tenía un nombre muy largo para ser guardado."
success: "Tu aspecto, %{name}, fue editado exitosamente."
@@ -237,36 +215,27 @@ es-MX:
post_success: "¡Publicado! ¡Cerrando!"
cancel: "Cancelar"
comments:
- few: "%{count} comentarios"
- many: "%{count} comentarios"
new_comment:
comment: "Comentar"
commenting: "Comentando…"
one: "1 comentario"
other: "%{count} comentarios"
- two: "%{count} comentarios"
zero: "no hay comentarios"
contacts:
create:
failure: "No se pudo crear el contacto"
- few: "%{count} contactos"
index:
add_a_new_aspect: "Añade un nuevo aspecto"
add_to_aspect: "Añade contactos a %{name}"
- add_to_aspect_link: "Añade contactos a %{name}"
all_contacts: "Todos los contactos"
community_spotlight: "Lo más destacado de la comunidad"
- many_people_are_you_sure: "¿Estás seguro de que quieres iniciar una conversación privada con más de %{suggested_limit} contactos? Publicar en este aspecto puede ser una mejor manera de contactar con ellos."
my_contacts: "Mis contactos"
no_contacts: "¡Parece que necesitas añadir algunos contactos!"
no_contacts_message: "Echa un vistazo a %{community_spotlight}"
- no_contacts_message_with_aspect: "Echa un vistazo a %{community_spotlight} o %{add_to_aspect_link}"
only_sharing_with_me: "Compartiendo solo conmigo"
- remove_person_from_aspect: "Eliminar a %{person_name} de \"%{aspect_name}\""
start_a_conversation: "Inicia una conversación"
title: "Contactos"
your_contacts: "Tus contactos"
- many: "%{count} contactos"
one: "1 contacto"
other: "%{count} contactos"
sharing:
@@ -274,7 +243,6 @@ es-MX:
spotlight:
community_spotlight: "Lo más destacado de la comunidad"
suggest_member: "Sugiere a un miembro"
- two: "%{count} contactos"
zero: "contactos"
conversations:
conversation:
@@ -283,8 +251,6 @@ es-MX:
fail: "Mensaje inválido"
no_contact: "¡Eh, primero necesitas añadir al contacto!"
sent: "Mensaje enviado"
- destroy:
- success: "Conversación eliminada exitosamente"
helper:
new_messages:
one: "Un mensaje nuevo"
@@ -693,7 +659,6 @@ es-MX:
add_contact_from_tag: "añadir contacto desde una etiqueta"
aspect_list:
edit_membership: "editar aspecto asociado"
- few: "%{count} personas"
helper:
is_not_sharing: "%{name} no está compartiendo contigo"
is_sharing: "%{name} está compartiendo contigo"
@@ -704,7 +669,6 @@ es-MX:
no_results: "¡Eh! Necesitas buscar algo."
results_for: "buscar resultados para"
searching: "buscando, por favor sé paciente…"
- many: "%{count} personas"
one: "1 persona"
other: "%{count} personas"
person:
@@ -741,7 +705,6 @@ es-MX:
add_some: "agregar algunas"
edit: "editar"
you_have_no_tags: "¡no tienes etiquetas!"
- two: "%{count} personas"
webfinger:
fail: "Perdón, no pudimos encontrar %{handle}."
zero: "ninguna persona"
@@ -836,15 +799,12 @@ es-MX:
update: "Actualizar"
invalid_invite: "¡El enlace de invitación que proporcionaste ya no es válido!"
new:
- continue: "Continuar"
create_my_account: "¡Crear mi cuenta!"
- diaspora: "<3 diaspora*"
email: "CORREO ELECTRÓNICO"
enter_email: "Ingresa un correo electrónico"
enter_password: "Elige una contraseña (mínimo seis caracteres)"
enter_password_again: "Ingresa de nuevo la misma contraseña"
enter_username: "Elige un nombre de usuario (solo letras, números o guiones bajos)"
- hey_make: "EH,<br/>HAZ<br/>ALGO."
join_the_movement: "¡Únete al movimiento!"
password: "CONTRASEÑA"
password_confirmation: "CONFIRMACIÓN DE CONTRASEÑA"
@@ -1016,10 +976,7 @@ es-MX:
no_message_to_display: "No hay mensaje que mostrar."
new:
mentioning: "Mencionar a: %{person}"
- too_long:
- one: "por favor, haz que tu mensaje de estado tenga un carácter menos"
- other: "por favor, haz que tu mensaje de estado tenga %{count} caracteres menos"
- zero: "por favor, haz que tu mensaje de estado tenga %{count} caracteres menos"
+ too_long: "{\"one\"=>\"por favor, haz que tu mensaje de estado tenga un carácter menos\", \"other\"=>\"por favor, haz que tu mensaje de estado tenga %{count} caracteres menos\", \"zero\"=>\"por favor, haz que tu mensaje de estado tenga %{count} caracteres menos\"}"
stream_helper:
hide_comments: "Ocultar todos los comentarios"
show_comments:
@@ -1057,7 +1014,6 @@ es-MX:
title: "Actividad pública"
tags:
contacts_title: "Personas que buscaron en esta etiqueta"
- tag_prefill_text: "Lo que pasa con %{tag_name} es… "
title: "Publicaciones etiquetadas: %{tags}"
tag_followings:
create:
@@ -1070,15 +1026,8 @@ es-MX:
tags:
show:
follow: "Seguir #%{tag}"
- followed_by_people:
- one: "seguida por una persona"
- other: "seguida por %{count} personas"
- zero: "seguida por nadie"
following: "Siguiendo #%{tag}"
- nobody_talking: "Nadie está hablando acerca de %{tag} todavía."
none: "¡La etiqueta vacía no existe!"
- people_tagged_with: "Personas etiquetadas con %{tag}"
- posts_tagged_with: "Publicaciones etiquetadas con #%{tag}"
stop_following: "Dejar de seguir #%{tag}"
terms_and_conditions: "Términos y condiciones"
undo: "¿Deshacer?"
@@ -1114,7 +1063,6 @@ es-MX:
current_password: "Contraseña actual"
current_password_expl: "con la que inicias sesión…"
download_photos: "Descargar mis fotos"
- download_xml: "Descargar mi XML"
edit_account: "Editar cuenta"
email_awaiting_confirmation: "Te hemos enviado un enlace de activación a %{unconfirmed_email}. Hasta que sigas este enlace y actives la nueva dirección, continuaremos usando tu dirección original %{email}."
export_data: "Exportar datos"
@@ -1123,7 +1071,6 @@ es-MX:
liked: "A alguien le gusta tu publicación."
mentioned: "Te mencionan en una publicación."
new_password: "Nueva contraseña"
- photo_export_unavailable: "Exportar fotos no está disponible actualmente"
private_message: "Recibes un mensaje privado."
receive_email_notifications: "Recibir notificaciones por correo electrónico cuando:"
reshared: "Alguien comparte tu publicación."
diff --git a/config/locales/diaspora/es.yml b/config/locales/diaspora/es.yml
index 89847b651..30d7bd4e1 100644
--- a/config/locales/diaspora/es.yml
+++ b/config/locales/diaspora/es.yml
@@ -12,7 +12,7 @@ es:
_home: "Inicio"
_photos: "Fotos"
_services: "Servicios"
- _terms: ""
+ _statistics: "Estadísticas"
account: "Cuenta"
activerecord:
errors:
@@ -40,7 +40,7 @@ es:
reshare:
attributes:
root_guid:
- taken: "Que bien, ¿eh? Has compartido esa publicación."
+ taken: "Es buena, ¿eh? ¡Ya habías compartido esa publicación!"
user:
attributes:
email:
@@ -54,7 +54,7 @@ es:
admin_bar:
correlations: "Similitudes"
pages: "Páginas"
- pod_stats: "Estadísticas del Servidor"
+ pod_stats: "Estadísticas del servidor"
report: "Informes"
sidekiq_monitor: "Monitor Sidekiq"
user_search: "Buscar usuario"
@@ -62,7 +62,7 @@ es:
correlations:
correlations_count: "Cuentas similares:"
stats:
- 2weeks: "2 Semanas"
+ 2weeks: "2 semanas"
50_most: "Las 50 etiquetas más leídas."
comments:
one: "%{count} comentario"
@@ -103,8 +103,12 @@ es:
: sí
user_search:
account_closing_scheduled: "El cierre de la cuenta de %{name} se ha añadido a la lista de tareas. Será procesado en unos minutos..."
- add_invites: "añadir invitaciones"
+ account_locking_scheduled: "Se ha programado el bloqueo de la cuenta de %{name}. Se realizará en unos instantes..."
+ account_unlocking_scheduled: "Se ha programado el desbloqueo de la cuenta de %{name}. Se realizará en unos instantes..."
+ add_invites: "Añadir invitaciones"
are_you_sure: "¿Estás seguro de que quieres eliminar tu cuenta?"
+ are_you_sure_lock_account: "¿Estás seguro de que quieres bloquear esta cuenta?"
+ are_you_sure_unlock_account: "¿Estás seguro de que quieres desbloquear esta cuenta?"
close_account: "cerrar cuenta"
email_to: "Correo electrónico a invitar"
under_13: "Mostrar usuarios menores de 13 años (COPPA)"
@@ -127,22 +131,20 @@ es:
all_aspects: "Todos los aspectos"
application:
helper:
- unknown_person: "persona desconocida"
+ unknown_person: "Persona desconocida"
video_title:
unknown: "Título de vídeo desconocido"
are_you_sure: "¿Estás seguro?"
are_you_sure_delete_account: "¿Seguro que quieres eliminar tu cuenta? ¡Esto no se podrá deshacer!"
aspect_memberships:
destroy:
- failure: "No se pudo quitar a la persona del aspecto"
+ failure: "No se pudo quitar a la persona del aspecto."
no_membership: "No se pudo encontrar a la persona seleccionada en ese aspecto"
- success: "Se ha quitado con éxito a la persona del aspecto"
+ success: "Se ha quitado correctamente a la persona del aspecto"
aspects:
add_to_aspect:
failure: "Error añadiendo el contacto al aspecto."
success: "Contacto añadido con éxito al aspecto."
- aspect_contacts:
- done_editing: "editado"
aspect_listings:
add_an_aspect: "+ Añade un aspecto"
deselect_all: "Desmarcar todos"
@@ -150,7 +152,7 @@ es:
select_all: "Marcar todos"
aspect_stream:
make_something: "Haz algo"
- stay_updated: "Mantente Actualizado"
+ stay_updated: "Mantente actualizado"
stay_updated_explanation: "Tu página principal la forman todos tus contactos, las etiquetas que sigues, y si lo deseas, las publicaciones de diferentes miembros creativos de la comunidad."
contacts_not_visible: "Los contactos en este aspecto no podrán verse entre ellos."
contacts_visible: "Los contactos de este aspecto podrán verse entre ellos."
@@ -161,23 +163,18 @@ es:
failure: "El aspecto %{name} no está vacío y no pudo ser borrado."
success: "%{name} fue eliminado con éxito."
edit:
- add_existing: "Añade un contacto existente"
+ aspect_chat_is_enabled: "Los contactos de este grupo pueden chatear contigo."
+ aspect_chat_is_not_enabled: "Los contactos de este grupo no pueden chatear contigo."
aspect_list_is_not_visible: "Los contactos en este aspecto no son capaces de verse entre sí."
aspect_list_is_visible: "Los contactos en este aspecto son capaces de verse entre sí."
confirm_remove_aspect: "¿Seguro que quieres eliminar este aspecto?"
- done: "Listo"
+ grant_contacts_chat_privilege: "¿conceder privilegio a los contactos de este aspecto para poder chatear?"
make_aspect_list_visible: "Permitir que estos contactos puedan ver quien más hay en este aspecto."
- manage: "Gestionar"
remove_aspect: "Eliminar este aspecto"
rename: "Renombrar"
set_visibility: "Configurar Visibilidad"
- update: "actualizar"
- updating: "actualizando"
- few: "%{count} aspectos"
- helper:
- are_you_sure: "¿Seguro que quieres eliminar este aspecto?"
- aspect_not_empty: "El aspecto no está vacío"
- remove: "eliminar"
+ update: "Actualizar"
+ updating: "Actualizando"
index:
diaspora_id:
content_1: "Tu ID de Diaspora* es:"
@@ -196,7 +193,7 @@ es:
have_a_question: "... tienes %{link}?"
here_to_help: "¡La comunidad Diaspora* está aquí!"
mail_podmin: "Correo del podmin (administrador de pod)"
- need_help: "Ayuda"
+ need_help: "¿Necesitas ayuda?"
tag_bug: "error"
tag_feature: "idea"
tag_question: "pregunta"
@@ -208,26 +205,21 @@ es:
new_here:
follow: "¡Sigue %{link} y da la bienvenida a los nuevos miembros de Diaspora*!"
learn_more: "Más información"
- title: "Bienvenida"
+ title: "Bienvenidos nuevos usuarios"
no_contacts: "No hay contactos"
no_tags: "+ Encuentra una etiqueta a seguir"
people_sharing_with_you: "Personas que comparten contigo"
- post_a_message: "publica un mensaje >>"
+ post_a_message: "Publica un mensaje >>"
services:
content: "Puedes conectar los siguientes servicios a Diaspora:"
- heading: "Servicios"
+ heading: "Conectar servicios"
unfollow_tag: "Dejar de seguir a #%{tag}"
welcome_to_diaspora: "¡Bienvenido a Diaspora*, %{name}!"
- many: "%{count} aspectos"
- move_contact:
- error: "Error moviendo el contacto: %{inspect}"
- failure: "%{inspect} no funcionó"
- success: "El contacto fue movido al nuevo aspecto"
new:
create: "Crear"
name: "Nombre (sólo tu lo puedes ver)"
no_contacts_message:
- community_spotlight: "comunidad creativa"
+ community_spotlight: "Destacado en la comunidad"
or_spotlight: "O puedes compartir con %{link}"
try_adding_some_more_contacts: "Puedes buscar o invitar a más contactos."
you_should_add_some_more_contacts: "¡Deberías añadir algunos contactos más!"
@@ -240,18 +232,10 @@ es:
family: "Familia"
friends: "Contactos"
work: "Trabajo"
- selected_contacts:
- manage_your_aspects: "Gestiona tus aspectos."
- no_contacts: "Aún no tienes ningún contacto aquí."
- view_all_community_spotlight: "Ver \"Comunidad Creativa\""
- view_all_contacts: "Ver todos los contactos"
- show:
- edit_aspect: "editar aspecto"
- two: "%{count} aspectos"
update:
failure: "Tu aspecto, %{name}, tenía un nombre muy largo para guardarlo."
success: "Tu aspecto, %{name}, fue editado con éxito."
- zero: "no hay aspectos"
+ zero: "No hay aspectos"
back: "Atrás"
blocks:
create:
@@ -267,36 +251,31 @@ es:
post_success: "¡Publicado! ¡Cerrando!"
cancel: "Cancelar"
comments:
- few: "%{count} comentarios"
- many: "%{count} comentarios"
new_comment:
comment: "Comentar"
commenting: "Comentando..."
one: "1 comentario"
other: "%{count} comentarios"
- two: "%{count} comentarios"
- zero: "no hay comentarios"
+ zero: "No hay comentarios"
contacts:
create:
failure: "No se pudo crear el contacto"
- few: "%{count} contactos"
index:
add_a_new_aspect: "Añade un nuevo aspecto"
+ add_contact: "Añadir contacto"
add_to_aspect: "Añadir contactos a %{name}"
- add_to_aspect_link: "añade contactos a %{name}"
all_contacts: "Todos los contactos"
community_spotlight: "Comunidad Creativa"
- many_people_are_you_sure: "¿Estás seguro que quieres comenzar una conversación privada con más de %{suggested_limit} contactos? Publicar en sus aspectos podría ser mejor para contactar con ellos."
- my_contacts: "Mis Contactos"
+ my_contacts: "Mis contactos"
no_contacts: "¡Parece que necesitas añadir algunos contactos!"
+ no_contacts_in_aspect: "Todavía no tienes ningún contacto en este aspecto. A continuación puedes ver una lista de tus contactos que puedes agregar a este aspecto."
no_contacts_message: "Echa un vistazo a la %{community_spotlight}"
- no_contacts_message_with_aspect: "Echa un vistazo a la %{community_spotlight} o %{add_to_aspect_link}"
only_sharing_with_me: "Solo compartiendo conmigo"
- remove_person_from_aspect: "Eliminar a %{person_name} de \"%{aspect_name}\""
+ remove_contact: "Eliminar contacto"
start_a_conversation: "Inicia una conversación"
title: "Contactos"
- your_contacts: "Tus Contactos"
- many: "%{count} contactos"
+ user_search: "Buscar usuarios"
+ your_contacts: "Tus contactos"
one: "1 contacto"
other: "%{count} contactos"
sharing:
@@ -304,8 +283,7 @@ es:
spotlight:
community_spotlight: "Comunidad Creativa"
suggest_member: "Sugiere un usuario"
- two: "%{count} contactos"
- zero: "contactos"
+ zero: "No hay contactos"
conversations:
conversation:
participants: "Participantes"
@@ -314,7 +292,8 @@ es:
no_contact: "¡Eh, primero tienes que añadir al contacto!"
sent: "Mensaje enviado"
destroy:
- success: "Conversación eliminada con éxito"
+ delete_success: "Conversación correctamente borrada"
+ hide_success: "Conversación correctamente oculta"
helper:
new_messages:
one: "1 mensaje nuevo"
@@ -326,18 +305,19 @@ es:
inbox: "Bandeja de entrada"
new_conversation: "Nueva conversación"
no_conversation_selected: "ninguna conversación seleccionada"
- no_messages: "sin mensajes"
+ no_messages: "Ningún mensaje"
new:
abandon_changes: "¿Descartar los cambios?"
send: "Enviar"
sending: "Enviando..."
- subject: "asunto"
- to: "para"
+ subject: "Asunto"
+ to: "Para"
new_conversation:
fail: "Mensaje no válido"
show:
- delete: "Eliminar y bloquear conversación"
- reply: "responder"
+ delete: "Borrar conversación"
+ hide: "ocultar y silenciar la conversación"
+ reply: "Responder"
replying: "Respondiendo..."
date:
formats:
@@ -392,19 +372,26 @@ es:
what_is_an_aspect_q: "¿Qué es un aspecto?"
who_sees_post_a: "Si haces una publicación limitada, solo será visible para las personas que hayas puesto en ese especto (o los aspectos, si está hecho para múltiples aspectos). Los contactos que tengas que no estén en el aspecto, no tienen forma de ver la publicación, a menos que la hayas hecho pública. Solo las publicaciones públicas serán visibles alguna ves por alguien que no hayas incluido en alguno de tus aspectos."
who_sees_post_q: "Cuando publico en un aspecto, ¿Quienes pueden verlo?"
- foundation_website: "página web de la fundación diaspora"
+ chat:
+ add_contact_roster_a: "En primer lugar, necesitas activar el chat para uno de los aspectos en los que está esa persona. Para hacerlo, ve a la %{contacts_page}, selecciona el aspecto que quieras y pulsa sobre el icono del chat para activar el chat en ese aspecto. %{toggle_privilege} Si lo prefieres, podrías crear un aspecto especial llamado \"Chat\" y añadir a la persona con la que quieras chatear en ese aspecto. Ona vez que hayas hecho esto, abre la ventana de chat y selecciona la persona con la que quieras hablar."
+ add_contact_roster_q: "¿Cómo puedo chatear con alguien en Diaspora*?"
+ contacts_page: "página de contactos"
+ title: "Chat"
+ faq: "Preguntas Más Frecuentes"
+ foundation_website: "página web de la fundación Diaspora*"
getting_help:
+ get_support_a_faq: "Lee nuestra página %{faq} en la wiki"
get_support_a_hashtag: "pregunta en una publicación pública en diaspora* usando el hashtag %{question}"
get_support_a_irc: "únete a nosotros en %{irc} (Chat en vivo)"
- get_support_a_tutorials: "visita nuestros %{tutorials}"
+ get_support_a_tutorials: "Consulta nuestros %{tutorials}"
get_support_a_website: "Visítanos en %{link}"
- get_support_a_wiki: "busca en %{link}"
+ get_support_a_wiki: "Busca %{link}"
get_support_q: "¿Y si mi pregunta no está contestada en este FAQ? ¿Dónde más puedo obtener ayuda?"
getting_started_a: "Estás de suerte. Prueba los %{tutorial_series} en la web del proyecto. Te llevara paso a paso por el proceso de registro, y te enseñara todas las cosas básicas que necesitas saber para usar diaspora*."
getting_started_q: "¡Ayuda! ¡Necesito conocer lo básico para empezar!"
title: "Obteniendo ayuda"
getting_started_tutorial: "Tutoriales de la serie 'Empezando'"
- here: "aquí"
+ here: "Aquí"
irc: "IRC"
keyboard_shortcuts:
keyboard_shortcuts_a1: "En la vista principal puedes usar los siguientes atajos de teclado:"
@@ -412,6 +399,10 @@ es:
keyboard_shortcuts_li2: "k - salta al post anterior"
keyboard_shortcuts_li3: "c - comentar el post actual"
keyboard_shortcuts_li4: "l - \"me gusta\" el post actual"
+ keyboard_shortcuts_li5: "r - Compartir la publicación actual"
+ keyboard_shortcuts_li6: "m - Expandir la publicación actual"
+ keyboard_shortcuts_li7: "o - Abrir el primer enlace de la publicación actual"
+ keyboard_shortcuts_li8: "ctrl + enter - Envía el mensaje que estás escribiendo"
keyboard_shortcuts_q: "¿Qué atajos de teclado están disponibles?"
title: "Atajos de teclado"
markdown: "Markdown"
@@ -421,7 +412,7 @@ es:
mention_in_comment_a: "No, de momento no."
mention_in_comment_q: "¿Puedo mencionar a alguien en un comentario?"
see_mentions_a: "Sí, haz click en \"menciones\" en la columna izquierda en tu pagina principal."
- see_mentions_q: "Hay alguna forma de ver los posts en los cuales he sido mencionado?"
+ see_mentions_q: "¿Hay alguna forma de ver las publicaciones en las cuales he sido mencionado?"
title: "Menciones"
what_is_a_mention_a: "Una mención es un enlace a el perfil de una persona que aparece en una publicación. Cuando alguien es mencionado, recibirá una notificación que llama su atención a la publicación."
what_is_a_mention_q: "¿Qué es una \"mención\"?"
@@ -436,7 +427,7 @@ es:
subscribe_feed_q: "¿Puedo suscribirme a las publicaciones públicas de alguien usando un lector de feeds?"
title: "Miscelánea"
pods:
- find_people_a: "Invita a tus amigos usando el link de e-mail en la barra lateral. Sigue los #tags para descubrir a otros amigos que compartan tus intereses, y agrega aquellos que postean cosas que te interesen en algún aspecto. Dí que eres #nuevoaquí o #newhere en un post público."
+ find_people_a: "Invita a tus amigos usando el enlace de e-mail en la barra lateral. Sigue los #tags para descubrir a otros amigos que compartan tus intereses, y agrega aquellos que publican cosas que te interesen en algún aspecto. Dí que eres #nuevoaquí o #newhere en un post público."
find_people_q: "Me acabo de unir a una vaina, ¿Cómo puedo encontrar a gente con la que compartir?"
title: "Vainas (Servidores)"
use_search_box_a: "Si conoces su ID de diaspora* completo (ej. nombreusuario@nombrevaina.org) puedes encontrales al buscar desde ahí. Si estas en su mismo pod, puedes buscarle por su nombre de usuario. Una alternativa es buscar por su nombre de perfil (el nombre que ves en la pantalla). Si una búsqueda no funciona a la primera, inténtalo denuevo."
@@ -444,11 +435,11 @@ es:
what_is_a_pod_a: "Una vaina es un servidor ejecutanto el software diaspora* y conectado a la red diaspora*. \"Vaina\" es una metafora refiriendose a las vainas (pod en ingles) en las plantas que contienen semillas, en la forma en que un servidor contiene un número de cuentas de usuario. Hay muchos pods diferentes. Puedes agregar amigos de otros pods y comunicarte con ellos. (Puedes pensar en las vainas de diaspora* como un proveedor de e-mail: hay vainas publicas, privadas, y con algún esfuerzo puedes incluso ejecutar la tuya)."
what_is_a_pod_q: "¿Qué es una vaina?"
posts_and_posting:
- char_limit_services_a: "En esos casos tu publicación es limitada al menor conteo de caracteres (140 en el caso de Twitter; 1000 en el caso de Tumblr), y el número de caracteres que tienes restantes para usar es mostrado cuando el icono del servicio esta resaltado. Puedes aún así postear para esos servicios si tu publicación sobrepasa el límite, pero el texto sera truncado para aquellos."
+ char_limit_services_a: "En esos casos tu publicación está limitada al menor número de caracteres (140 en el caso de Twitter; 1000 en el caso de Tumblr), y el número de caracteres que tienes restantes para usar es mostrado cuando el icono del servicio esta resaltado. Puedes aún así publicar para esos servicios si tu publicación sobrepasa el límite, pero el texto sera truncado para aquellos."
char_limit_services_q: "¿Cual es el límite de caracteres para publicaciones compartidas a traves de un servicio con un conteo menor de caracteres?"
- character_limit_a: "65.535 caracteres. !Que vienen a ser 65.395 caracteres más de los que permite Twitter! ;)"
+ character_limit_a: "65.535 caracteres. ¡Eso son 65.395 caracteres más de los que permite Twitter! ;)"
character_limit_q: "¿Cuál es el límites de caracteres en una publicación?"
- embed_multimedia_a: "Puedes usualmente copiar la URL (ej. http://www.youtube.com/watch?v=nnnnnnnnnnn ) en tu post y el video o audio sera incrustado automáticamente. Algunos sitios que son soportados son YouTube, Vimeo, SoundCloud, Flickr y unos cuantos mas. Diaspora* usa oEmbed para esa funcionalidad. Estamos soportando nuevos sitios todo el tiempo. Recuerda siempre incluir links simples, completos, no acortados; sin operadores despues de la URL de base; y dale un poco de tiempo antes de refrescar la pagina despues de postear para ver la previsualización."
+ embed_multimedia_a: "Puedes usualmente copiar la URL (ej. http://www.youtube.com/watch?v=nnnnnnnnnnn ) en tu publicación y el vídeo o audio sera incrustado automáticamente. Algunos sitios que son soportados son YouTube, Vimeo, SoundCloud, Flickr y unos cuantos más. Diaspora* usa oEmbed para esa funcionalidad. Estamos soportando nuevos sitios todo el tiempo. Recuerda siempre incluir enlaces simples, completos, no acortados; sin operadores después de la URL de base; y dale un poco de tiempo antes de refrescar la pagina después de publicar para ver la previsualización."
embed_multimedia_q: "¿Como incrusto un video, audio, o otro contenido multimedia en una publicación?"
format_text_a: "Al usar un sistema simplificado llamado %{markdown}. Puedes encontrar la sintaxis completa de marcado %{here}. El boton de previsualización es realmente útil aquí, ya que puedes ver como tu mensage se verá antes de que lo compartas."
format_text_q: "¿Cómo puedo formatear el texto en mis publicaciones (negrita, italica, etc.)?"
@@ -461,23 +452,31 @@ es:
insert_images_comments_a2: "puede ser usado para insertar imagenes desde la web tanto en comentarios como en publicaciones."
insert_images_comments_q: "¿Puedo insertar imágenes en los comentarios?"
insert_images_q: "¿Cómo puedo insertar imágenes en las publicaciones?"
+ post_location_a: "Pulsa el icono de localización al lado de la cámara en la ventana de publicación. Insertarás tu localización desde OpenStreetMap. Puedes editar tu localización (puedes escoger publicar sólo el nombre de la ciudad en la que estás en lugar de tu dirección exacta)."
+ post_location_q: "¿Cómo agrego mi localización a una publicación?"
+ post_notification_a: "Encontrarás una campana al lado de la X en la esquina superior derecha de cada publicación. Pulsando sobre ella activarás o desactivarás las notificaciones de esa publicación."
+ post_notification_q: "¿Cómo activo o desactivo las notificaciones de una publicación?"
+ post_poll_a: "Pulsa el icono de la gráfica para crear una encuesta. Escribe una pregunta y al menos dos respuestas. No olvides hacer pública la publicación si quieres que todo el mundo pueda participar en ella."
+ post_poll_q: "¿Cómo agrego una encuesta a mi publicación?"
+ post_report_a: "Pulsa en el icono de alerta en la esquina superior derecha de la publicación para denunciarla al administrador. Escribe una razón para denunciar la publicación en el cuadro de texto."
+ post_report_q: "¿Cómo denuncio una publicación ofensiva?"
size_of_images_a: "No. Las imagenes son escaladas automáticamente para encajar su espacio en el flujo. El sistema de marcado no tiene un codigo para especificar el tamaño de una imagen."
size_of_images_q: "¿Puedo personalizar el tamaño de las imagenes en publicaciones o comentarios?"
stream_full_of_posts_a1: "Tu flujo está hecho de tres tipos de publicaciones:"
stream_full_of_posts_li1: "Publicaciones de personas con las cuales compartes, que vienen en dos tipos: publicaciones publicas y publicaciones limitadas compartidas con un aspecto en el cual te encuentras. Para remover estas publicaciones de tu flujo, simplemente deja de compartir con la persona."
stream_full_of_posts_li2: "Publicaciones públicas conteniendo una de las etiquetas (tags) que sigues. Para remover estas publicaciones, deja de seguir la etiqueta."
stream_full_of_posts_li3: "Publicaciones hechas por las personas pertenecientes a la Comunidad Creativa. Estas publicaciones desaparecerán de tu entrada al desactivar la opción \"¿Mostrar Comunidad Creativa en la entrada?\" en la pestaña \"Cuenta\" de tus \"Ajustes\"."
- stream_full_of_posts_q: "¿Por que mi flujo esta lleno de publicaciónes de personas que no conosco y con las cuales no comparto?"
+ stream_full_of_posts_q: "¿Por qué mi flujo esta lleno de publicaciones de personas que no conozco y con las cuales no comparto?"
title: "Sobre publicaciones y publicar"
private_posts:
can_comment_a: "Solo los usuarios conectados a diaspora* que hayas alojado en ese aspecto podrán comentar o poner me gusta en tu publicación privada."
can_comment_q: "¿Quién puede comentar o poner me gusta en mi publicación privada?"
- can_reshare_a: "Nadie. Las publicaciones privadas no son compartibles. Usuarios conectados a diaspora* con acceso a ese aspecto, en cualquier caso, pueden potencialmente copiarlas y pegarlas."
+ can_reshare_a: "Nadie. Las publicaciones privadas no se pueden compartir. Los usuarios conectados a diaspora* con acceso a ese aspecto, como mucho, pueden copiarlas y pegarlas."
can_reshare_q: "¿Quién puede compartir mi publicación privada?"
- see_comment_a: "Solo la gente con la cual esa publicación fue compartida (las personas que estan en los aspectos seleccionadas por el publicador original) puede ver esos \"me gusta\" y comentarios. "
+ see_comment_a: "Sólo la gente con la que se ha compartido esa publicación (las personas que están en los aspectos seleccionadas por el usuario que publicó la entrada) puede ver esos \"me gusta\" y comentarios. "
see_comment_q: "¿Cuando comento en, o hago \"me gusta\", a una publicación privada, quién puede verlo?"
title: "Publicaciones privadas"
- who_sees_post_a: "Solo los conectados a diaspora* que hayas alojado en ese aspecto podrán ver tu publicación privada."
+ who_sees_post_a: "Sólo los conectados a diaspora* que hayas alojado en ese aspecto podrán ver tu publicación privada."
who_sees_post_q: "¿Cuando publico un mensage a un aspecto (ej., una publicación privada), quién puede verla?"
private_profiles:
title: "Perfil privado"
@@ -525,6 +524,7 @@ es:
add_to_aspect_li5: "Pero si Ben va a la pagina de perfil de Amy, entonces él podrá ver las publicaciones privadas que ella ha enviado a sus aspectos en los cuales él esta incluido (así como sus publicaciones públicas que cualquiera puede ver allí)."
add_to_aspect_li6: "Ben podrá ver el perfil privado de Amy (biografía, ubicación, género y fecha de nacimiento)."
add_to_aspect_li7: "Amy aparecerá como \"Solo compartiendo conmigo\" en la página de contactos de Ben."
+ add_to_aspect_li8: "Amy también será capaz de @mencionar a Ben en una publicación."
add_to_aspect_q: "¿Qué sucede cuando agrego a alguien a uno de mis aspectos? ¿O cuando alguien me agrega a uno de sus aspectos?"
list_not_sharing_a: "No, pero puedes ver si alguien esta compartiendo contigo visitando su pagina de perfil. Si es así, la barra bajo su foto de perfil aparecerá de color verde; de lo contrario, será gris. Deberías recibir una notificación cada vez que alguien comienza a compartir contigo."
list_not_sharing_q: "¿Hay una lista de las personas a las que he agregado a uno de mis aspectos, pero ellos no a mí?"
@@ -532,6 +532,8 @@ es:
only_sharing_q: "¿Quienes son las personas que figuran en mi lista de contactos como \"Sólo compartiendo contigo\"?"
see_old_posts_a: "No. Ellos solo podrán ver nuevas publicaciones de ese aspecto. Ellos (y cualquier otra persona) podrán ver tus publicaciones públicas viejas en tú página de perfil, y también podrán verlas en sus entradas."
see_old_posts_q: "Cuando agrego a alguien a un aspecto, ¿puede ver lo que he publicado anteriormente en ese aspecto?"
+ sharing_notification_a: "Deberías recibir una notificación cada vez que alguien empieza a compartir contigo."
+ sharing_notification_q: "¿Cómo sé que alguien ha empezado a compartir conmigo?"
title: "Compartir"
tags:
filter_tags_a: "Esta opción aún no está disponible directamente mediante diaspora*, pero algunos %{third_party_tools} han escrito algo que podría proveerlo."
@@ -592,18 +594,18 @@ es:
layouts:
application:
back_to_top: "Volver arriba"
- powered_by: "IMPULSADO POR diaspora*"
+ powered_by: "Impulsado por Diaspora*"
public_feed: "Canal público de %{name} "
- source_package: "descargar el paquete del código fuente"
+ source_package: "Descargar el paquete del código fuente"
toggle: "Interfaz móvil"
- whats_new: "Novedades en Diaspora*"
- your_aspects: "tus aspectos"
+ whats_new: "Novedades"
+ your_aspects: "Tus aspectos"
header:
admin: "Administrar"
- blog: "blog"
- code: "código"
+ blog: "Blog"
+ code: "Código"
help: "Ayuda"
- login: "acceder"
+ login: "Acceder"
logout: "Salir"
profile: "Perfil"
recent_notifications: "Notificaciones recientes"
@@ -625,13 +627,13 @@ es:
zero: "A nadie le gusta"
limited: "Limitado"
more: "Más"
- next: "siguiente"
+ next: "Siguiente"
no_results: "No hay resultados"
notifications:
also_commented:
- one: "%{actors} comentario en %{post_link} de %{post_author}."
- other: "%{actors} también han comentado %{post_link} de %{post_author}."
- zero: "%{actors} comentarios en %{post_link} de %{post_author}."
+ one: "%{actors} también ha comentado la publicación %{post_link} de %{post_author}."
+ other: "%{actors} también han comentado la publicación %{post_link} de %{post_author}."
+ zero: "%{actors} comentarios en la publicación %{post_link} de %{post_author}."
also_commented_deleted:
one: "%{actors} ha comentado una publicación eliminada."
other: "%{actors} han comentado una publicación eliminada."
@@ -660,6 +662,7 @@ es:
mark_read: "Marcar como leído"
mark_unread: "Marcar como no leído"
mentioned: "Mencionado"
+ no_notifications: "Todavía no tienes ninguna notificación."
notifications: "Notificaciones"
reshared: "Compartido"
show_all: "mostrar todo"
@@ -699,15 +702,59 @@ es:
other: "%{actors} ha empezado a compartir contigo."
zero: "%{actors} ha empezado a compartir contigo."
notifier:
+ a_limited_post_comment: "Hay un nuevo comentario en una publicación limitada en diaspora* para que lo consultes."
a_post_you_shared: "una publicación."
+ a_private_message: "Hay un nuevo mensaje privado en diaspora* para que lo consultes."
accept_invite: "¡Acepta tu invitación a diaspora*!"
- click_here: "haz clic aquí"
+ click_here: "Pulsa aquí"
comment_on_post:
- reply: "Responder o ver los comentarios de %{name} >"
+ reply: "Responder o ver las publicaciones de %{name} >"
confirm_email:
click_link: "Para activar tu nueva dirección de correo %{unconfirmed_email}, sigue este enlace:"
subject: "Por favor activa tu nueva dirección de correo %{unconfirmed_email}"
email_sent_by_diaspora: "Este correo electrónico fue enviado por %{pod_name}. Si quieres dejar de recibir correos como este,"
+ export_email:
+ body: |-
+ Hola %{name},
+
+ Tus datos han sido procesados y están listos para descargar yendo a este enlace %{url}.
+
+ Saludos,
+
+ El robot email de diaspora*
+ subject: "Tus datos personales están listos para descargar, %{name}"
+ export_failure_email:
+ body: |-
+ Hola %{name}
+
+ Hemos encontrado un problema mientras procesábamos tus datos personales para descargar.
+ Por favor, inténtalo de nuevo!
+
+ Saludos
+
+ El robot email de diaspora*
+ subject: "Lo sentimos, hubo un problema con tus datos, %{name}"
+ export_photos_email:
+ body: |-
+ Hola, %{name}:
+
+ Tus fotografías han sido procesadas y están listas para descargar siguiendo este enlace %{url}.
+
+ Saludos,
+
+ El robot email de Diaspora*
+ subject: "Tus fotografías están listas para descargar, %{name}"
+ export_photos_failure_email:
+ body: |-
+ Hola, %{name}:
+
+ Hemos encontrado un problema mientras procesábamos tus fotografías para descargar.
+ Por favor, ¡inténtalo de nuevo!
+
+ Disculpas,
+
+ El robot email de Diaspora*
+ subject: "Ha ocurrido un problema con tus fotografías, %{name}"
hello: "¡Hola %{name}!"
invite:
message: |-
@@ -734,6 +781,22 @@ es:
subject: "%{name} te mencionó en diaspora*"
private_message:
reply_to_or_view: "Responder o ver esta conversación >"
+ remove_old_user:
+ body: |-
+ Hola,
+
+ Parece que no quieres seguir usando tu cuenta en el pod %{pod_url}, ya que no la has usado en los últimos %{after_days} días. Para asegurar que nuestros usuarios activos obtienen el mejor rendimiento de nuestro pod diaspora*, nos gustaría elminar cuentas no utilizadas en nuestra base de datos.
+
+ Nos encantaría que formaras parte de la comunidad diaspora*, y eres bienvenido si quieres seguir manteniendo tu cuenta.
+
+ Si quieres mantener la cuenta activa, todo lo que necesitas es iniciar sesión antes de %{remove_after}. Cuando inicies sesión, toma un tiempo para echar un vistazo a diaspora*. Ha cambiado mucho desde la última vez que entraste, y pensamos que te gustarán los cambios que hemos implementado. Sigue algunos #tags para encontrar contenido que te guste.
+
+ Inicia sesión aquí %{login_url}. Si has olvidado tus credenciales de inicio de sesión, puedes utilizar el enlace para recordarlas.
+
+ Esperamos verte de nuevo,
+
+ El robot de correos de Diaspora*
+ subject: "Tu cuenta de Diaspora* ha sido marcada para eliminación debido a la inactividad."
report_email:
body: |-
Hola,
@@ -773,12 +836,11 @@ es:
password_confirmation: "Confirmación de la contraseña"
people:
add_contact:
- invited_by: "fuiste invitado por"
+ invited_by: "Fuiste invitado por"
add_contact_small:
- add_contact_from_tag: "añadir contacto desde una etiqueta"
+ add_contact_from_tag: "Añadir contacto desde una etiqueta"
aspect_list:
edit_membership: "editar aspectos asociados"
- few: "%{count} personas"
helper:
is_not_sharing: "%{name} no está compartiendo contigo"
is_sharing: "%{name} está compartiendo contigo"
@@ -792,11 +854,10 @@ es:
search_handle: "Utiliza su ID de Diaspora* (usuario@pod.tld) para estar seguro de que encontrarás a tus amigos."
searching: "buscando, por favor sé paciente…"
send_invite: "¿Todavía nadie? ¡Envía una invitación!"
- many: "%{count} personas"
one: "1 persona"
other: "%{count} personas"
person:
- add_contact: "añadir contacto"
+ add_contact: "Añadir contacto"
already_connected: "Ya conectado"
pending_request: "Solicitud pendiente"
thats_you: "¡Ese eres tú!"
@@ -805,10 +866,10 @@ es:
born: "Fecha de nacimiento"
edit_my_profile: "Editar mi perfil"
gender: "Género"
- in_aspects: "en aspectos"
+ in_aspects: "En los aspectos"
location: "Ubicación"
photos: "Fotos"
- remove_contact: "quitar contacto"
+ remove_contact: "Eliminar contacto"
remove_from: "¿Eliminar a %{name} de %{aspect}?"
show:
closed_account: "Esta cuenta ha sido eliminada."
@@ -820,21 +881,20 @@ es:
message: "Mensaje"
not_connected: "No estás compartiendo con esta persona."
recent_posts: "Últimas publicaciones"
- recent_public_posts: "Últimas publicaciones para \"el mundo\""
+ recent_public_posts: "Últimas publicaciones públicas"
return_to_aspects: "Volver a tu página de aspectos"
see_all: "Ver todos"
- start_sharing: "empezar a compartir"
+ start_sharing: "Empezar a compartir"
to_accept_or_ignore: "aceptar o ignorar"
sub_header:
add_some: "añadir algunos"
- edit: "editar"
- you_have_no_tags: "¡no tienes etiquetas!"
- two: "%{count} personas"
+ edit: "Editar"
+ you_have_no_tags: "¡No tienes etiquetas!"
webfinger:
fail: "Perdona, no pudimos encontrar %{handle}"
zero: "0 personas"
photos:
- comment_email_subject: "fotografía de %{name}"
+ comment_email_subject: "Fotografía de %{name}"
create:
integrity_error: "Error subiendo la foto. ¿Seguro que era una imagen?"
runtime_error: "Error subiendo la foto. ¿Alguna restricción de seguridad?"
@@ -845,7 +905,7 @@ es:
editing: "Editando"
new:
back_to_list: "Volver a la lista"
- new_photo: "Nueva foto"
+ new_photo: "Nueva fotografía"
post_it: "¡Publícalo!"
new_photo:
empty: "{file} está vacío, por favor selecciona otros archivos."
@@ -855,15 +915,15 @@ es:
or_select_one_existing: "o selecciona alguna de las %{photos} ya existentes"
upload: "¡Sube una foto nueva de perfil!"
photo:
- view_all: "ver todas las fotos de %{name}"
+ view_all: "Ver todas las fotografías de %{name}"
show:
- collection_permalink: "enlace permanente a la colección"
- delete_photo: "Eliminar foto"
- edit: "editar"
+ collection_permalink: "Enlace permanente a la colección"
+ delete_photo: "Eliminar fotografía"
+ edit: "Editar"
edit_delete_photo: "Editar pie de foto / eliminar foto"
- make_profile_photo: "convertir en foto de perfil"
+ make_profile_photo: "Convertir en foto de perfil"
show_original_post: "Mostrar la publicación original"
- update_photo: "Actualizar foto"
+ update_photo: "Actualizar fotografía"
update:
error: "Error editando la foto."
notice: "Foto actualizada con éxito."
@@ -872,14 +932,14 @@ es:
title: "Una publicación de %{name}"
show:
destroy: "Eliminar"
- not_found: "Lo sentimos, no podemos encontrar ese comentario."
- permalink: "enlace permanente"
+ not_found: "Lo sentimos, no podemos encontrar esa publicación."
+ permalink: "Enlace permanente"
photos_by:
one: "Una foto por %{author}"
other: "%{count} fotos por %{author}"
zero: "Ninguna foto por %{author}"
reshare_by: "Vuelto a compartir por %{author}"
- previous: "anterior"
+ previous: "Anterior"
privacy: "Privacidad"
privacy_policy: "Política de Privacidad"
profile: "Perfil"
@@ -924,24 +984,21 @@ es:
update: "Actualizar"
invalid_invite: "¡El enlace de la invitación ya no es válido!"
new:
- continue: "Continuar"
create_my_account: "¡Crear mi cuenta!"
- diaspora: "<3 diaspora*"
- email: "CORREO ELECTRÓNICO"
+ email: "Correo electrónico"
enter_email: "Escribe un correo"
enter_password: "Escribe una contraseña (seis caracteres como mínimo)"
enter_password_again: "Escribe la misma contraseña como antes"
enter_username: "Elige un nombre de usuario (letras, números o guiones bajos)"
- hey_make: "EH,<br/>HAZ<br/>ALGO."
join_the_movement: "¡Únete al movimiento!"
- password: "CONTRASEÑA"
- password_confirmation: "CONFIRMACIÓN DE CONTRASEÑA"
- sign_up: "REGISTRARSE"
+ password: "Contraseña"
+ password_confirmation: "Confirmación de contraseña"
+ sign_up: "Registrarse"
sign_up_message: "Redes Sociales con un ♥"
submitting: "En proceso..."
terms: "Creando una cuenta, usted acepta los %{terms_link}"
terms_link: "términos del servicio"
- username: "NOMBRE"
+ username: "Nombre"
report:
comment_label: "<b>Comentario</b>:<br>%{data}"
confirm_deletion: "¿Seguro que quieres borrar esto?"
@@ -999,7 +1056,7 @@ es:
destroy:
success: "Autenticación eliminada con éxito."
failure:
- error: "hubo un error conectando ese servicio"
+ error: "Hubo un error conectando a ese servicio"
finder:
fetching_contacts: "Diaspora está trasladando tus contactos de %{service}; vuelve a intentarlo en unos minutos."
no_friends: "No se han encontrados contactos en Facebook."
@@ -1009,9 +1066,9 @@ es:
connect_to_tumblr: "Conecta con Tumblr"
connect_to_twitter: "Conecta con Twitter"
connect_to_wordpress: "Conectarse a Wordpress"
- disconnect: "desconectar"
+ disconnect: "Desconectar"
edit_services: "Editar servicios"
- logged_in_as: "conectado como"
+ logged_in_as: "Conectado como"
no_services: "Aún no has conectado ningún servicio."
really_disconnect: "¿Desconectar %{service}?"
services_explanation: "Conectar con servicios te da la posibilidad de publicar tus mensajes en ellos a medida que los escribes en diaspora."
@@ -1019,9 +1076,9 @@ es:
click_link_to_accept_invitation: "Sigue este enlace para aceptar tu invitación"
join_me_on_diaspora: "Nos vemos en diaspora*."
remote_friend:
- invite: "invitar"
+ invite: "Invitar"
not_on_diaspora: "Aún no está en Diaspora"
- resend: "reenviar"
+ resend: "Reenviar"
settings: "Ajustes"
share_visibilites:
update:
@@ -1037,6 +1094,8 @@ es:
your_diaspora_username_is: "Tu nombre de usuario Diaspora* es: %{diaspora_handle}"
aspect_dropdown:
add_to_aspect: "Añadir contacto"
+ mobile_row_checked: "%{name} (eliminar)"
+ mobile_row_unchecked: "%{name} (añadir)"
toggle:
one: "En %{count} aspecto"
other: "En %{count} aspectos"
@@ -1045,7 +1104,7 @@ es:
all_contacts: "Todos los contactos"
footer:
logged_in_as: "accediste como %{name}"
- your_aspects: "tus aspectos"
+ your_aspects: "Tus aspectos"
invitations:
by_email: "Por correo electrónico"
dont_have_now: "No tienes invitaciones ahora mismo pero, ¡pronto llegarán más!"
@@ -1060,8 +1119,8 @@ es:
new: "Nuevo %{type} de %{from}"
public_explain:
atom_feed: "canal Atom"
- control_your_audience: "Controla tu Audiencia"
- logged_in: "conectado a %{service}"
+ control_your_audience: "Controla tu público"
+ logged_in: "Conectado a %{service}"
manage: "Gestionar servicios conectados"
new_user_welcome_message: "Utiliza #etiquetas para clasificar tus publicaciones y encontrar gente que comparta tus intereses. Llama a gente asombrosa usando las @Menciones"
outside: "Los mensajes públicos podrán ser vistos por otros fuera de Diaspora*."
@@ -1069,12 +1128,12 @@ es:
title: "Configurar los servicios conectados"
visibility_dropdown: "Usa este menú desplegable para cambiar la visibilidad de tu publicación. (Sugerimos hacerlo público la primera vez.)"
publisher:
- all: "todo"
- all_contacts: "todos los contactos"
+ all: "Todo"
+ all_contacts: "Todos los contactos"
discard_post: "Descartar publicación"
formatWithMarkdown: "Puedes usar %{markdown_link} para dar formato al mensaje."
get_location: "Obtener tu localización"
- make_public: "hacer público"
+ make_public: "Hacer público"
new_user_prefill:
hello: "#%{new_user_tag}, acabo de llegar aquí. "
i_like: "Tengo interés en %{tags}. "
@@ -1089,17 +1148,17 @@ es:
post_a_message_to: "Publicar un mensaje en %{aspect}"
posting: "Publicando..."
preview: "Vista previa"
- publishing_to: "publicar en:"
+ publishing_to: "Publicar en: "
remove_location: "Eliminar ubicación"
share: "Compartir"
- share_with: "compartir con"
+ share_with: "Compartir con"
upload_photos: "Subir fotos"
whats_on_your_mind: "¿Qué andas pensando?"
reshare:
reshare: "Compartir"
stream_element:
connect_to_comment: "Conecta con esta persona para comentar en su publicación"
- currently_unavailable: "comentarios actualmente no disponibles"
+ currently_unavailable: "Comentarios no disponibles en este momento"
dislike: "No me gusta"
hide_and_mute: "Ignorar la publicación"
ignore_user: "Ignorar a %{name}"
@@ -1107,10 +1166,10 @@ es:
like: "Me gusta"
nsfw: "Esta publicación ha sido calificada por su autor como no apta para todos los públicos. %{link}"
shared_with: "Compartido con: %{aspect_names}"
- show: "mostrar"
+ show: "Mostrar"
unlike: "No me gusta"
- via: "vía %{link}"
- via_mobile: "vía móvil"
+ via: "Vía %{link}"
+ via_mobile: "Vía móvil"
viewable_to_anyone: "Esta publicación podrá verla cualquiera en internet"
simple_captcha:
label: "Ingrese el código en el recuadro."
@@ -1119,6 +1178,21 @@ es:
failed: "Verificación humana fallida."
user: "La imagen secreta y el código son diferentes."
placeholder: "Ingresa el valor de la imagen"
+ statistics:
+ active_users_halfyear: "Usuarios activos de este semestre"
+ active_users_monthly: "Usuarios activos mensualmente"
+ closed: "Cerrado"
+ disabled: "No disponible"
+ enabled: "Disponible"
+ local_comments: "Comentarios locales"
+ local_posts: "Publicaciones locales"
+ name: "Nombre"
+ network: "Red"
+ open: "Abrir"
+ registrations: "Registros"
+ services: "Servicios"
+ total_users: "Usuarios totales"
+ version: "Versión"
status_messages:
create:
success: "Se ha mencionado con éxito a: %{names}"
@@ -1128,25 +1202,24 @@ es:
no_message_to_display: "No hay mensajes que mostrar."
new:
mentioning: "Menciones: %{person}"
- too_long:
- one: "por favor, escribe tu mensaje con menos de %{count} carácter"
- other: "por favor, escribe tu mensaje con menos de %{count} caracteres"
- zero: "por favor, escribe tu mensaje con menos de %{count} caracteres"
+ too_long: "Por favor, pon un mensaje de estado menor de %{count} caracteres. Actualmente ocupa %{current_length} caracteres."
stream_helper:
hide_comments: "Ocultar comentarios"
+ no_more_posts: "Has llegado al final de la página."
+ no_posts_yet: "Todavía no hay publicaciones."
show_comments:
one: "Mostrar un comentario más"
other: "Mostrar %{count} comentarios más"
zero: "No hay más comentarios"
streams:
activity:
- title: "Mi Actividad"
+ title: "Mi actividad"
aspects:
- title: "Aspectos"
+ title: "Mis aspectos"
aspects_stream: "Aspectos"
comment_stream:
contacts_title: "Gente cuyas publicaciones comentaste"
- title: "Comentado"
+ title: "Publicaciones comentadas"
community_spotlight_stream: "Lo más destacado"
followed_tag:
add_a_tag: "Añade una etiqueta"
@@ -1166,10 +1239,9 @@ es:
title: "Inicio"
public:
contacts_title: "Publicadores recientes"
- title: "Actividad Pública"
+ title: "Actividad pública"
tags:
contacts_title: "Gente que sigue esta etiqueta"
- tag_prefill_text: "Sobre %{tag_name}..."
title: "Publicaciones etiquetadas: %{tags}"
tag_followings:
create:
@@ -1180,18 +1252,16 @@ es:
failure: "Error al dejar de seguir #%{name}. ¿Tal vez ya lo hiciste?"
success: "¡Ay! Ya no estás siguiendo #%{name}."
tags:
+ name_too_long: "Por favor haz que tu mensaje de estado tenga menos de %{count} caracteres. En este momento el máximo permitido es de %{current_length} caracteres."
show:
follow: "Seguir #%{tag}"
- followed_by_people:
- one: "una persona te sigue"
- other: "%{count} personas te siguen"
- zero: "nadie te sigue"
following: "Siguiendo #%{tag}"
- nobody_talking: "Nadie esta hablando sobre %{tag} todavía."
none: "¡La etiqueta vacía no existe!"
- people_tagged_with: "Perfiles con %{tag}"
- posts_tagged_with: "Publicaciones con #%{tag}"
stop_following: "Dejar de seguir #%{tag}"
+ tagged_people:
+ one: "Una persona etiquetada con %{tag}"
+ other: "%{count} personas etiquetadas con %{tag}"
+ zero: "Nadie etiquetado con %{tag}"
terms_and_conditions: "Términos y Condiciones"
undo: "¿Deshacer?"
username: "Nombre de usuario"
@@ -1201,7 +1271,7 @@ es:
email_not_confirmed: "El correo no pudo ser activado. ¿Enlace erróneo?"
destroy:
no_password: "Por favor, introduce tu contraseña actual para cerrar tu cuenta."
- success: "Tu cuenta ha sido bloqueda. Llevará unos 20 minutos cerrarla y destruirla. Gracias por probar Diaspora."
+ success: "Tu cuenta ha sido bloqueda. Llevará unos 20 minutos terminar de cerrar tu cuenta. Gracias por probar Diaspora*."
wrong_password: "La contraseña introducida no coincide con la contraseña actual."
edit:
also_commented: "alguien comenta en una publicación que has comentado"
@@ -1214,30 +1284,37 @@ es:
character_minimum_expl: "mínimo seis caracteres"
close_account:
dont_go: "¡Eh, no te vayas!"
- if_you_want_this: "Si realmente quieres eliminarla, teclea tu contraseña debajo y haz clic en 'Eliminar Cuenta'"
- lock_username: "Esto bloquerá tu nombre de usuario si decides volver a registrarte."
- locked_out: "Saldrás y eliminarás tu cuenta."
- make_diaspora_better: "Queremos que nos ayudes a hacer Diaspora * mejor, por lo que podrías ayudarnos en lugar de dejarnos. Si quieres irte, queremos que sepas lo que sucede a continuación."
+ if_you_want_this: "Si de verdad quieres hacerlo, teclea tu contraseña debajo y haz click en 'Eliminar Cuenta'"
+ lock_username: "Se bloqueará tu nombre de usuario. No podrás crear una nueva cuenta en este pod con el mismo ID."
+ locked_out: "Serás desconectado y tu cuenta bloqueada hasta que se haya borrado."
+ make_diaspora_better: "Nos gustaría que te quedaras con nosotros y nos ayudaras a hacer de diaspora* un sitio mejor en lugar de dejarnos.. Si quieres irte, queremos que sepas lo que sucede a continuación:"
mr_wiggles: "El Tío la Vara estará triste si te vas"
- no_turning_back: "Actualmente, no hay vuelta atrás."
- what_we_delete: "Eliminaremos todas tus publicaciones y datos del perfil, tan pronto como sea humanamente posible. Tus comentarios seguirán en línea, pero asociados a tu dirección Diaspora* en lugar de a tu nombre."
+ no_turning_back: "No hay vuelta atrás!. Si estás totalmente seguro, entra tu contraseña a continuación."
+ what_we_delete: "Eliminaremos todas tus publicaciones y datos del perfil, tan pronto como sea posible. Tus comentarios seguirán en línea, pero asociados a tu dirección Diaspora* en lugar de a tu nombre."
close_account_text: "Eliminar cuenta"
comment_on_post: "...alguien comentó en tu publicación"
current_password: "Contraseña actual"
current_password_expl: "con la que inicias sesión..."
- download_photos: "Descargar mis fotos"
- download_xml: "Descargar mi XML"
+ download_export: "Descargar mi perfil"
+ download_export_photos: "Descargar mis fotografías"
+ download_photos: "Descargar mis fotografías"
edit_account: "Editar cuenta"
email_awaiting_confirmation: "Te hemos enviado un enlace de activación a %{unconfirmed_email}. Hasta que no sigas este enlace y actives la nueva dirección, continuaremos usando tu dirección original %{email}."
export_data: "Exportar datos"
+ export_in_progress: "Actualmente estamos procesando tus datos. Por favor, vuelve en unos minutos."
+ export_photos_in_progress: "En este momento estamos procesando tus fotografías. Por favor, vuelva en unos instantes."
following: "Ajustes de Seguimiento"
getting_started: "Preferencias del Nuevo Usuario"
+ last_exported_at: "(Última actualización el %{timestamp})"
liked: "a alguien le gusta tu publicación"
mentioned: "te mencionan en una publicación"
new_password: "Nueva contraseña"
- photo_export_unavailable: "Exportar fotos no está disponible actualmente"
private_message: "has recibido un mensaje privado"
receive_email_notifications: "Recibir notificaciones por correo cuando..."
+ request_export: "Solicitar los datos de mi perfil"
+ request_export_photos: "Solicitar mis fotografías"
+ request_export_photos_update: "Actualizar mis fotografías"
+ request_export_update: "Actualizar los datos de mi perfil"
reshared: "alguien ha compartido una de tus publicaciones"
show_community_spotlight: "¿Mostrar lo más destacado en la portada?"
show_getting_started: "Mostrar los Consejos de Inicio"
@@ -1258,9 +1335,11 @@ es:
what_are_you_in_to: "¿Qué te atrae?"
who_are_you: "¿Quién eres?"
privacy_settings:
- ignored_users: "Personas Ignoradas"
- stop_ignoring: "Dejar de ignorar"
- title: "Ajustes de Privacidad"
+ ignored_users: "Usuarios ignorados"
+ no_user_ignored_message: "En este momento no estás ignorando a ningún usuario"
+ stop_ignoring: "dejar de ignorar"
+ strip_exif: "Descartar metadatos como la localización, el autor o el modelo de la cámara en las imágenes subidas (recomendado)"
+ title: "Ajustes de privacidad"
public:
does_not_exist: "¡La persona %{username} no existe!"
update:
diff --git a/config/locales/diaspora/eu.yml b/config/locales/diaspora/eu.yml
index 2844213ed..e43c1d303 100644
--- a/config/locales/diaspora/eu.yml
+++ b/config/locales/diaspora/eu.yml
@@ -83,7 +83,8 @@ eu:
one: "erabiltzaile %{count} aurkitu da"
other: "%{count} erabiltzaile aurkitu dira"
zero: "erabiltzailerik ez da aurkitu"
- you_currently: "oraindik %{user_invitation} gonbidapen dituzu %{link}"
+ you_currently:
+ other: "oraindik %{user_invitation} gonbidapen dituzu %{link}"
weekly_user_stats:
amount_of:
one: "erabiltzaile berriak azken astean: %{count}"
@@ -108,8 +109,6 @@ eu:
add_to_aspect:
failure: "Huts egin du laguna arlora gehitzeak."
success: "Adiskidea arrakastaz gehitu da arlora."
- aspect_contacts:
- done_editing: "aldaketak gauzatu"
aspect_listings:
add_an_aspect: "+ Arlo berria sortu"
deselect_all: "Guztiak deshautatu"
@@ -128,21 +127,14 @@ eu:
failure: "%{name} ez dago hutsik eta ezin izan da ezabatu."
success: "%{name} arrakastaz ezabatu da."
edit:
- add_existing: "Jada laguna den norbait gehitu"
aspect_list_is_not_visible: "arloaren zerrenda ezkutua da arloko besteentzat"
aspect_list_is_visible: "arloaren zerrenda ikusgarria da arloko besteengandik"
confirm_remove_aspect: "Ziur al zaude arlo hau ezabatu nahi duzunaz?"
- done: "Ados"
make_aspect_list_visible: "arlo honetako lagunak ikusgarriak egin bata bestearekiko?"
remove_aspect: "Arlo hau ezabatu"
rename: "berrizendatu"
update: "eguneratu"
updating: "eguneratzen"
- few: "%{count} arlo"
- helper:
- are_you_sure: "Ziur al zaude arlo hau ezabatu nahi duzunaz?"
- aspect_not_empty: "Arlo ez hutsa"
- remove: "ezabatu"
index:
diaspora_id:
content_1: "Zure Diaspora ID honakoa da:"
@@ -178,11 +170,6 @@ eu:
heading: "Zerbitzuak Lotu"
unfollow_tag: "#%{tag} jarraitzeari utzi"
welcome_to_diaspora: "Ongietorri Diasporara, %{name}!"
- many: "%{count} arlo"
- move_contact:
- error: "Huts laguna mugitzean: %{inspect}"
- failure: "huts egin du %{inspect}"
- success: "Pertsona arlo berrira gehitua"
new:
create: "Sortu"
name: "Izena (zuk bakarrik ikus dezakezu)"
@@ -200,14 +187,6 @@ eu:
family: "Familia"
friends: "Adiskideak"
work: "Lantokia"
- selected_contacts:
- manage_your_aspects: "Zure arloak kudeatu."
- no_contacts: "Ez duzu lagunik hemen oraindik."
- view_all_community_spotlight: "Ikusi komunitate guztiko nabarmenena"
- view_all_contacts: "Adiskide guztiak ikusi"
- show:
- edit_aspect: "arloa aldatu"
- two: "%{count} arlo"
update:
failure: "Zure arloak, %{name}(e)k, izen luzeegia du."
success: "Zure arloa, %{name}, eraldatua izan da."
@@ -227,50 +206,38 @@ eu:
post_success: "Bidalia! Irteten!"
cancel: "Ezeztatu"
comments:
- few: "%{count} iruzkin"
- many: "%{count} iruzkin"
new_comment:
comment: "Iruzkindu"
commenting: "Iruzkintzen..."
one: "iruzkin 1"
other: "%{count} iruzkin"
- two: "%{count} iruzkin"
zero: "iruzkinik ez"
contacts:
create:
failure: "Akatsa lagun berria sortzean"
- few: "%{count} lagun"
index:
add_a_new_aspect: "Arlo berria gehitu"
add_to_aspect: "Adiskideak gehitu %{name}(e)n"
- add_to_aspect_link: "gehitu lagunak %{name}(e)ra"
all_contacts: "Adiskide Guztiak"
community_spotlight: "Komunitateko nabarmenduak"
- many_people_are_you_sure: "Ziur al zaude elkarrizketa pribatu bat hasi nahi duzula %{suggested_limit} baino lagun gehiagorekin? Arlo horretan mezu bat bidaltzea beharbada haiekin harremanetan egoteko modu hobea izan daiteke."
my_contacts: "Nire Adiskideak"
no_contacts: "Badirudi lagun batzuk gehitu behar dituzula!"
no_contacts_message: "Ikus ezazu %{community_spotlight}"
- no_contacts_message_with_aspect: "Ikus ezazu %{community_spotlight} edo %{add_to_aspect_link}"
only_sharing_with_me: "Bakarrik nirekin harremanetan"
- remove_person_from_aspect: "Ezabatu %{person_name} \"%{aspect_name}\"(e)tik"
start_a_conversation: "Elkarrizketa bat hasi"
title: "Adiskideak"
your_contacts: "Zure Adiskideak"
- many: "%{count} lagun"
one: "lagun 1"
other: "%{count} lagun"
sharing:
people_sharing: "Zurekin harremanetan daudenak:"
spotlight:
community_spotlight: "Komunitateko Nabarmenena"
- two: "%{count} contacts"
zero: "lagunak"
conversations:
create:
fail: "Mezu baliogabea"
sent: "Mezua arrakastaz bidali da"
- destroy:
- success: "Elkarrizketa arrakastaz ezabatua"
helper:
new_messages:
few: "%{count} mezu pribatu berri"
@@ -547,7 +514,6 @@ eu:
add_contact_from_tag: "gehitu laguna etiketatik abiatuta"
aspect_list:
edit_membership: "aldatu arloaren bazkidetza"
- few: "%{count} pertsona"
helper:
results_for: " %{params}(r)entzat emaitzak"
index:
@@ -556,7 +522,6 @@ eu:
no_results: "Aizu! Zerbait bilatu behar duzu."
results_for: "bilaketa emaitzak hontarako:"
searching: "bilatzen, mesedez itxaron pixka bat..."
- many: "%{count} pertsona"
one: "pertsona 1"
other: "%{count} pertsona"
person:
@@ -592,7 +557,6 @@ eu:
add_some: "gehitu batzuk"
edit: "aldatu"
you_have_no_tags: "etiketarik ez duzu!"
- two: "%{count} pertsona"
webfinger:
fail: "%{handle} ezin izan dugu aurkitu."
zero: "jenderik ez"
@@ -690,15 +654,12 @@ eu:
update: "Eguneratu"
invalid_invite: "Eman duzun gonbidapen esteka ez da jada baliagarria!"
new:
- continue: "Jarraitu"
create_my_account: "Nire kontua sortu!"
- diaspora: "<3 Diaspora*"
email: "EMAILA"
enter_email: "Idatzi zure e-posta"
enter_password: "Pasahitz bat idatzi (sei karaktere gutxienez)"
enter_password_again: "Lehengo pasahitz berdina idatzi"
enter_username: "Aukeratu erabiltzaile izen bat (hizkiak, zenbakiak eta gidoibaxuak soilik)"
- hey_make: "AIZU,<br/>SORTU<br/>ZERBAIT."
join_the_movement: "Mugimendura batu!"
password: "PASAHITZA"
sign_up: "IZENA EMAN"
@@ -861,13 +822,7 @@ eu:
no_message_to_display: "Erakusteko mezurik ez."
new:
mentioning: "Aipatzen: %{person}"
- too_long:
- few: "mesedez, egin itzazu zure mezuak %{count} karaktere baino motzagoak"
- many: "mesedez, egin itzazu zure mezuak %{count} karaktere baino motzagoak"
- one: "mesedez, egin itzazu zure mezuak karaktere %{count} baino motzagoak"
- other: "mesedez, egin itzazu zure mezuak %{count} karaktere baino motzagoak"
- two: "mesedez egin itzazu zure mezuak %{count} laraktere baino motzagoak"
- zero: "mesedez, egin itzazu zure mezuak %{count} karaktere baino motzagoak"
+ too_long: "{\"few\"=>\"mesedez, egin itzazu zure mezuak %{count} karaktere baino motzagoak\", \"many\"=>\"mesedez, egin itzazu zure mezuak %{count} karaktere baino motzagoak\", \"one\"=>\"mesedez, egin itzazu zure mezuak karaktere %{count} baino motzagoak\", \"other\"=>\"mesedez, egin itzazu zure mezuak %{count} karaktere baino motzagoak\", \"two\"=>\"mesedez egin itzazu zure mezuak %{count} laraktere baino motzagoak\", \"zero\"=>\"mesedez, egin itzazu zure mezuak %{count} karaktere baino motzagoak\"}"
stream_helper:
hide_comments: "Iruzkin guztiak ezkutatu"
show_comments:
@@ -908,7 +863,6 @@ eu:
title: "Ekintza Publikoak"
tags:
contacts_title: "Etiketa hau jarraitzen duen jendea"
- tag_prefill_text: "%{tag_name} buruzkoa zera da..."
title: "Mezu etiketatuak: %{tags}"
tag_followings:
create:
@@ -922,10 +876,7 @@ eu:
show:
follow: "Jarraitu #%{tag}"
following: "#%{tag} jarraitzen"
- nobody_talking: "Inor ez du %{tag}(r)i buruz hitz egin oraindik."
none: "Etiketa hutsik ez dago!"
- people_tagged_with: "%{tag} etiketadun jendea"
- posts_tagged_with: "#%{tag} etiketadun mezuak"
stop_following: "Ez Jarraitu #%{tag}"
terms_and_conditions: "Termino eta Baldintzak"
undo: "Desegin?"
@@ -961,7 +912,6 @@ eu:
current_password: "Pasahitz zaharra"
current_password_expl: "sartzen zarenarekin..."
download_photos: "nire argazkiak jaitsi"
- download_xml: "nire xml jaitsi"
edit_account: "Kontua aldatu"
email_awaiting_confirmation: "Aktibaketa esteka bat bidali dizugu %{unconfirmed_email}(e)ra. Esteka hau jarraitzen duzun arte, zure jatorrizko e-postak, %{email}, jarraituko du erabilpenean."
export_data: "Datuak esportatu"
@@ -970,7 +920,6 @@ eu:
liked: "...norbaitek zure mezu bat gustuko duenean?"
mentioned: "...mezu batean aipatzen zaituztenean?"
new_password: "Pasahitz berria"
- photo_export_unavailable: "Argazkien esportazioa tenporalki desgaitua"
private_message: "...mezu pribatu bat jasotzen duzunean?"
receive_email_notifications: "E-posta jakinarazpenak jaso nahi dituzu..."
reshared: "...norbaitek zure mezu bat birpartekatzen duenean?"
diff --git a/config/locales/diaspora/fa.yml b/config/locales/diaspora/fa.yml
index 268b6f158..784dc6ab6 100644
--- a/config/locales/diaspora/fa.yml
+++ b/config/locales/diaspora/fa.yml
@@ -53,8 +53,6 @@ fa:
add_to_aspect:
failure: "خطا در اضافه کردن مخاطب به منظر"
success: "مخاطب با موفقیت به منظر اضافه شد."
- aspect_contacts:
- done_editing: "اتمام ویرایش"
aspect_listings:
add_an_aspect: "+اضافه کردن منظر"
deselect_all: "لغو انتخاب همه"
@@ -71,21 +69,14 @@ fa:
failure: "‎%{name}‎ خالی نیست و نمی‌توانید حذفش کنید."
success: "‎%{name}‎ با موفقیت حذف شد."
edit:
- add_existing: "اضافه کردن یک مخاطب موجود"
aspect_list_is_not_visible: "لیست منظر برای افراد دیگر در این منظر مخفی است"
aspect_list_is_visible: "لیست منظر برای افراد دیگر در این منظر قابل مشاهده است"
confirm_remove_aspect: "مطمئن هستید می‌خواهید این منظر را حذف کنید؟"
- done: "تمام"
make_aspect_list_visible: "مخاطبینی که در این منظر هستند برای یکدیگر قابل مشاهده باشند؟"
remove_aspect: "حذف این منظر"
rename: "تغییر نام"
update: "بروزرسانی"
updating: "در حال بروزرسانی"
- few: "‎%{count}‎ منظر"
- helper:
- are_you_sure: "مطمئن هستید که می‌خواهید این منظر را حذف کنید؟"
- aspect_not_empty: "منظر خالی نیست"
- remove: "حذف"
index:
diaspora_id:
content_1: "آدرس شناسایی دیاسپورای شما:"
@@ -118,11 +109,6 @@ fa:
heading: "اتصال سرویس‌ها"
unfollow_tag: "لغو دنبال کردن #‎%{tag}‎"
welcome_to_diaspora: "%{name}، به دیاسپورا خوش آمدی!"
- many: "‎%{count}‎ منظر"
- move_contact:
- error: "خطا در فرستادن مخاطب: ‎%{inspect}‎"
- failure: "‎%{inspect}‎ کار نکرد."
- success: "شخص به منظر جدید فرستاده شد."
new:
create: "ساختن"
name: "نام (فقط برای شما قابل مشاهده است)"
@@ -140,14 +126,6 @@ fa:
family: "خانواده"
friends: "دوستان"
work: "کار"
- selected_contacts:
- manage_your_aspects: "مدیریت منظرهای شما"
- no_contacts: "هنوز هیچ مخاطبی ندارد."
- view_all_community_spotlight: "مشاهده تمامی کانون‌های توجه جامعه"
- view_all_contacts: "مشاهده همه مخاطبین"
- show:
- edit_aspect: "ویرایش منظر"
- two: "‎%{count}‎ منظر"
update:
failure: "منظر ‎%{name}‎، نامش برای ذخیره سازی طولانی هست."
success: "منظر ‎%{name}‎، با موفقیت ویرایش شد."
diff --git a/config/locales/diaspora/fi.yml b/config/locales/diaspora/fi.yml
index 28843a55f..6ea5fe1b4 100644
--- a/config/locales/diaspora/fi.yml
+++ b/config/locales/diaspora/fi.yml
@@ -7,11 +7,13 @@
fi:
_applications: "Sovellukset"
_comments: "Kommentit"
- _contacts: "Henkilöt"
+ _contacts: "Kontaktit"
_help: "Apua"
_home: "Etusivu"
- _photos: "kuvat"
+ _photos: "Kuvat"
_services: "Ulkoiset palvelut"
+ _statistics: "Tilastot"
+ _terms: "Ehdot"
account: "Käyttäjätili"
activerecord:
errors:
@@ -88,34 +90,38 @@ fi:
zero: "ei yhtään käyttäjää"
week: "Viikko"
user_entry:
- account_closed: "käyttäjätili suljettu"
+ account_closed: "Käyttäjätili suljettu"
diaspora_handle: "Diaspora kahva"
email: "Sähköposti"
guid: "GUID"
id: "Tunnus"
- last_seen: "nähty viimeksi"
+ last_seen: "Nähty viimeksi"
? "no"
- : ei
+ : Ei
nsfw: "#nsfw"
- unknown: "tuntematon"
+ unknown: "Tuntematon"
? "yes"
- : kyllä
+ : Kyllä
user_search:
account_closing_scheduled: "Käyttäjätili %{name} on ajastettu suljettavaksi. Suoritus tapahtuu muutaman hetken kuluttua..."
+ account_locking_scheduled: "Käyttäjätili %{name} on ajastettu lukittavaksi. Tapahtuma käsitellään hetken kuluttua..."
+ account_unlocking_scheduled: "Käyttäjätilin %{name} lukitus on ajastettu poistettavaksi. Tapahtuma käsitellään hetken kuluttua..."
add_invites: "lisää kutsuja"
are_you_sure: "Haluatko varmasti sulkea tämä käyttäjätilin?"
- close_account: "sulje käyttäjätili"
+ are_you_sure_lock_account: "Haluatko varmasti lukita tämän tilin?"
+ are_you_sure_unlock_account: "Haluatko varmasti poistaa tämän tilin lukituksen?"
+ close_account: "Sulje käyttäjätili"
email_to: "Lähetä sähköposti kutsuaksesi"
- under_13: "Näytä käyttäjät jotka ovat alle 13 (COPPA)"
+ under_13: "Näytä käyttäjät, jotka ovat alle 13 (COPPA)"
users:
one: "%{count} käyttäjä löytyi"
other: "%{count} käyttäjää löytyi"
zero: "Yhtään käyttäjää ei löytynyt"
- view_profile: "näytä profiili"
+ view_profile: "Näytä profiili"
you_currently:
- one: "sinulla on tällä hetkellä %{count} kutsu jäljellä %{link}"
- other: "sinulla on tällä hetkellä %{count} kutsua jäljellä %{link}"
- zero: "sinulla ei ole tällä hetkellä yhtään kutsua jäljellä"
+ one: "Sinulla on tällä hetkellä yksi kutsu jäljellä %{link}"
+ other: "Sinulla on tällä hetkellä %{count} kutsua jäljellä %{link}"
+ zero: "Sinulla ei ole tällä hetkellä yhtään kutsua jäljellä %{link}"
weekly_user_stats:
amount_of:
one: "Yksi uusi käyttäjä tällä viikolla."
@@ -126,22 +132,20 @@ fi:
all_aspects: "Kaikki näkymät"
application:
helper:
- unknown_person: "tuntematon henkilö"
+ unknown_person: "Tuntematon henkilö"
video_title:
unknown: "Tuntematon videon otsikko"
are_you_sure: "Oletko varma?"
are_you_sure_delete_account: "Haluatko varmasti sulkea tilisi? Tätä ei voi kumota!"
aspect_memberships:
destroy:
- failure: "Henkilön poisto näkymästä epäonnistui"
- no_membership: "Kyseistä henkilöä ei löytynyt valitusta näkymästä"
- success: "Henkilö poistettiin näkymästä onnistuneesti"
+ failure: "Henkilön poisto näkymästä epäonnistui."
+ no_membership: "Valittua henkilöä ei löytynyt kyseisestä näkymästä."
+ success: "Henkilö poistettiin näkymästä onnistuneesti."
aspects:
add_to_aspect:
- failure: "Henkilön lisäys näkymään epäonnistui."
- success: "Henkilön lisäys näkymään onnistui."
- aspect_contacts:
- done_editing: "muokkaus valmis"
+ failure: "Kontaktin lisääminen näkymään epäonnistui."
+ success: "Kontaktin lisääminen näkymään onnistui."
aspect_listings:
add_an_aspect: "+ Lisää näkymä"
deselect_all: "Poista valinnat"
@@ -150,9 +154,9 @@ fi:
aspect_stream:
make_something: "Julkaise jotain"
stay_updated: "Pysy ajan tasalla"
- stay_updated_explanation: "Sinun päävirrassasi näkyvät kaikki henkilösi, seuraamasi tagit ja eräiden yhteisön luovien jäsenten julkaisut."
- contacts_not_visible: "Henkilöt tässä näkymässä eivät voi nähdä toisiaan."
- contacts_visible: "Henkilöt tässä näkymässä voivat nähdä toisensa."
+ stay_updated_explanation: "Näet päävirrassasi kaikki kontaktiesi ja eräiden yhteisön luovien jäsenten lähettämät sekä seuraamillasi tageillä merkityt julkaisut."
+ contacts_not_visible: "Tämän näkymän kontaktit eivät voi nähdä toisiaan."
+ contacts_visible: "Tämän näkymän kontaktit voivat nähdä toisensa."
create:
failure: "Näkymän luominen epäonnistui."
success: "Uusi näkymäsi, %{name}, on luotu"
@@ -160,23 +164,18 @@ fi:
failure: "%{name} ei ole tyhjä, eikä sitä voitu poistaa."
success: "%{name} poistettiin onnistuneesti."
edit:
- add_existing: "Lisää olemassa oleva henkilö"
- aspect_list_is_not_visible: "Henkilöt tässä näkymässä eivät voi nähdä toisiaan."
- aspect_list_is_visible: "Henkilöt tässä näkymässä voivat nähdä toisensa."
+ aspect_chat_is_enabled: "Tämän näkymän kontaktit voivat lähettää sinulle pikaviestejä."
+ aspect_chat_is_not_enabled: "Tämän näkymän kontaktit eivät voi lähettää sinulle pikaviestejä."
+ aspect_list_is_not_visible: "Tämän näkymän kontaktit eivät voi nähdä toisiaan."
+ aspect_list_is_visible: "Tämän näkymän kontaktit voivat nähdä toisensa."
confirm_remove_aspect: "Oletko varma, että haluat poistaa tämän näkymän?"
- done: "Valmis"
- make_aspect_list_visible: "salli näkymän henkilöiden nähdä toisensa?"
- manage: "Hallitse"
+ grant_contacts_chat_privilege: "Salli näkymän kontaktien lähettää pikaviestejä?"
+ make_aspect_list_visible: "Salli tämän näkymän kontaktien nähdä toisensa?"
remove_aspect: "Poista näkymä"
- rename: "nimeä uudelleen"
+ rename: "Nimeä uudelleen"
set_visibility: "Aseta näkyvyys"
- update: "päivitä"
- updating: "päivittää"
- few: "%{count} näkymää"
- helper:
- are_you_sure: "Haluatko varmasti poistaa tämän näkymän?"
- aspect_not_empty: "Näkymä ei ole tyhjä"
- remove: "poista"
+ update: "Päivitä"
+ updating: "Päivittää"
index:
diaspora_id:
content_1: "Diaspora-ID:si on:"
@@ -200,7 +199,7 @@ fi:
tag_feature: "ominaisuus"
tag_question: "kysymys"
tutorial_link_text: "Ohjeita"
- tutorials_and_wiki: "%{faq},%{tutorial} & %{wiki}: Ohjeita aloittavalle."
+ tutorials_and_wiki: "%{faq}, %{tutorial} & %{wiki}: ohjeita alkuun pääsemiseksi."
introduce_yourself: "Tämä on virtasi. Hyppää sekaan ja esittele itsesi."
keep_diaspora_running: "Pidä Diasporan kehitys nopeana kuukausittaisten lahjoitusten avulla!"
keep_pod_running: "Pidä %{pod} vauhdissa tarjoamalla palvelimille kupponen kahvia kuukausittaisella lahjoituksella!"
@@ -208,28 +207,23 @@ fi:
follow: "Seuraa tagia %{link} ja toivota uudet käyttäjät tervetulleiksi Diasporaan!"
learn_more: "Lue lisää"
title: "Tervehdi uusia käyttäjiä"
- no_contacts: "Ei henkilöitä"
+ no_contacts: "Ei kontakteja"
no_tags: "+ Etsi tageja seurattaviksi"
- people_sharing_with_you: "Ihmiset jotka jakavat kanssasi"
- post_a_message: "lähetä viesti >>"
+ people_sharing_with_you: "Henkiöt, jotka jakavat kanssasi"
+ post_a_message: "Lähetä viesti >>"
services:
content: "Voit yhdistää Diasporaan seuraavat palvelut:"
heading: "Yhdistä palveluihin"
unfollow_tag: "Lopeta tagin #%{tag} seuraaminen"
welcome_to_diaspora: "Tervetuloa Diasporaan, %{name}!"
- many: "%{count} näkymää"
- move_contact:
- error: "Virhe siirrettäessä henkilöä: %{inspect}"
- failure: "ei toiminut %{inspect}"
- success: "Henkilö siirretty uuteen näkymään"
new:
create: "Luo"
name: "Nimi (näkyy vain sinulle)"
no_contacts_message:
- community_spotlight: "yhteisön valokeila"
+ community_spotlight: "Yhteisön valokeila"
or_spotlight: "Voit myös jakaa %{link}n kanssa"
- try_adding_some_more_contacts: "Voit etsiä (ylhäällä) tai kutsua (oikealla) lisää henkilöitä."
- you_should_add_some_more_contacts: "Sinun pitäisi lisätä henkilöitä!"
+ try_adding_some_more_contacts: "Voit etsiä tai kutsua lisää kontakteja."
+ you_should_add_some_more_contacts: "Sinun pitäisi lisätä kontakteja!"
no_posts_message:
start_talking: "Kukaan ei ole vielä sanonut mitään!"
one: "1 näkymä"
@@ -239,18 +233,10 @@ fi:
family: "Perhe"
friends: "Ystävät"
work: "Työ"
- selected_contacts:
- manage_your_aspects: "Hallitse näkymiäsi."
- no_contacts: "Sinulla ei vielä ole henkilöitä täällä."
- view_all_community_spotlight: "Näytä kaikki yhteisön valokeilaan kuuluvat käyttäjät"
- view_all_contacts: "Näytä kaikki henkilöt"
- show:
- edit_aspect: "muokkaa näkymää"
- two: "%{count} näkymää"
update:
failure: "Antamasi näkymän nimi, %{name}, oli liian pitkä tallennettavaksi."
success: "Näkymäsi, %{name}, muokkaus onnistui."
- zero: "ei näkymiä"
+ zero: "Ei näkymiä"
back: "Takaisin"
blocks:
create:
@@ -266,45 +252,38 @@ fi:
post_success: "Lähetetty! Suljetaan!"
cancel: "Peruuta"
comments:
- few: "%{count} kommenttia"
- many: "%{count} kommenttia"
new_comment:
comment: "Kommentoi"
commenting: "Kommentoidaan..."
one: "1 kommentti"
other: "%{count} kommenttia"
- two: "%{count} kommenttia"
- zero: "ei kommentteja"
+ zero: "Ei kommentteja"
contacts:
create:
- failure: "Henkilön lisääminen epäonnistui"
- few: "%{count} henkilöä"
+ failure: "Kontaktin luominen epäonnistui"
index:
add_a_new_aspect: "Lisää näkymä"
- add_to_aspect: "lisää henkilöitä näkymään %{name}"
- add_to_aspect_link: "lisää henkilöitä näkymään %{name}"
- all_contacts: "Kaikki henkilöt"
+ add_contact: "Lisää kontakti"
+ add_to_aspect: "Lisää kontakteja näkymään %{name}"
+ all_contacts: "Kaikki kontaktit"
community_spotlight: "Yhteisön valokeila"
- many_people_are_you_sure: "Oletko varma, että haluat aloittaa yksityiskeskustelun useamman kuin %{suggested_limit} kontaktin kanssa? Julkaisun lähettäminen tähän näkymään voisi olla parempi tapa olla yhteydessä heihin."
- my_contacts: "Henkilöt"
+ my_contacts: "Kontaktini"
no_contacts: "Sinun pitäisi näköjään lisätä kontakteja!"
no_contacts_message: "Käy katsomassa %{community_spotlight}"
- no_contacts_message_with_aspect: "Käy katsomassa %{community_spotlight} tai %{add_to_aspect_link}"
only_sharing_with_me: "Jakaa vain kanssani"
- remove_person_from_aspect: "Poista %{person_name} näkymästä: \"%{aspect_name}\""
+ remove_contact: "Poista kontakti"
start_a_conversation: "Aloita keskustelu"
- title: "Henkilöt"
+ title: "Kontaktit"
+ user_search: "Käyttäjähaku"
your_contacts: "Kontaktisi"
- many: "%{count} henkilöä"
- one: "1 henkilö"
- other: "%{count} henkilöä"
+ one: "1 kontakti"
+ other: "%{count} kontaktia"
sharing:
- people_sharing: "Ihmiset jotka jakavat kanssasi:"
+ people_sharing: "Henkilöt, jotka jakavat kanssasi:"
spotlight:
community_spotlight: "Yhteisön valokeila"
suggest_member: "Ehdota jäsentä"
- two: "%{count} henkilöä"
- zero: "ei henkilöitä"
+ zero: "Ei kontakteja"
conversations:
conversation:
participants: "Osallistujat"
@@ -313,7 +292,8 @@ fi:
no_contact: "Hei, sinun on ensin lisättävä vastaanottaja!"
sent: "Viesti lähetetty"
destroy:
- success: "Keskustelu poistettu onnistuneesti"
+ delete_success: "Keskustelun poistaminen onnistui"
+ hide_success: "Keskustelun piilottaminen onnistui"
helper:
new_messages:
few: "%{count} uutta viestiä"
@@ -324,22 +304,23 @@ fi:
zero: "Ei uusia viestejä"
index:
conversations_inbox: "Keskustelut - Saapuneet"
- create_a_new_conversation: "aloita uusi keskustelu"
+ create_a_new_conversation: "Aloita uusi keskustelu"
inbox: "Uudet viestit"
new_conversation: "Uusi keskustelu"
- no_conversation_selected: "ei valittua keskustelua"
- no_messages: "ei viestejä"
+ no_conversation_selected: "Yhtäkään keskustelua ei ole valittu"
+ no_messages: "Ei viestejä"
new:
abandon_changes: "Hylkää muutokset?"
send: "Lähetä"
sending: "Lähetetään..."
- subject: "aihe"
- to: "vast.ott."
+ subject: "Aihe"
+ to: "Vast.ott."
new_conversation:
fail: "virheellinen viesti"
show:
- delete: "poista ja estä tämä keskustelu"
- reply: "vastaa"
+ delete: "Poista keskustelu"
+ hide: "Piilota ja vaimenna keskustelu"
+ reply: "Vastaa"
replying: "Vastataan..."
date:
formats:
@@ -354,7 +335,7 @@ fi:
invalid_fields: "Vialliset arvot"
login_try_again: "<a href='%{login_link}'>Kirjaudu sisään</a> ja yritä uudelleen."
post_not_public: "Julkaisu, jota yrität lukea, ei ole julkinen!"
- post_not_public_or_not_exist: "Julkaisu jota yrität katsella ei ole julkinen tai sitä ei ole olemassa!"
+ post_not_public_or_not_exist: "Julkaisu, jota yrität katsella, ei ole julkinen tai sitä ei ole olemassa!"
fill_me_out: "Täytä tiedot"
find_people: "Etsi ihmisiä tai #tageja"
help:
@@ -363,7 +344,7 @@ fi:
close_account_q: "Kuinka poistan käyttäjätilini?"
data_other_podmins_a: "Kun aloitat jakamaan jonkun toisessa podissa olevan kanssa kaikki julkaisut mitä jaat ja kopio profiilistasi tallennetaan (välimuistiin) heidän podiinsa jolloin kyseisen podin tietokannan ylläpitäjällä on pääsy noihin tietoihin. Kun poistat julkaisun tai profiilitietoa se poistetaan omasta ja kaikista muista podeista mihin se oli tallennettuna."
data_other_podmins_q: "Voivatko muiden podien ylläpitäjät nähdä tietojani?"
- data_visible_to_podmin_a: "Podien välinen tietoliikenne on aina salattua (käyttäen SSL:ää ja diasporan* omaa liikenteen salausta), mutta tiedot podeissa ovat salaamattomia. Jos podisi tietokannan ylläpitäjä niin tahtoo (yleensä henkilö, joka ajaa podia) hänellä on pääsy profiilitietoihisi ja kaikkeen mitä julkaiset (kuten on asianlaita suurimmassa osassa verkkosivustoja jotka tallentavat käyttäjien tietoa). Oman podisi ajaminen antaa enemmän yksityisyyttä, koska silloin sinä voit itse hallita pääsyä tietokantaan."
+ data_visible_to_podmin_a: "Podien välinen tietoliikenne on aina salattua (käyttäen SSL:ää ja diasporan* omaa liikenteen salausta), mutta tiedot podeissa ovat salaamattomia. Jos podisi tietokannan ylläpitäjä (yleensä henkilö, joka ylläpitää podia) niin tahtoo hänellä on pääsy profiilitietoihisi ja kaikkeen, mitä julkaiset (kuten on asianlaita suurimmassa osassa verkkosivustoja, jotka tallentavat käyttäjien tietoa). Oman podisi ylläpitäminen tarjoaa enemmän yksityisyyttä, koska silloin sinä voit itse hallita pääsyä tietokantaan."
data_visible_to_podmin_q: "Kuinka paljon tiedoistani podin ylläpitäjä voi nähdä?"
download_data_a: "Kyllä. Käyttäjätilisi asetus-sivun alaosassa on kaksi painiketta joita voit käyttää tietojesi lataamiseen."
download_data_q: "Voinko ladata itselleni kopion kaikesta käyttäjätilini sisältämästä tiedosta?"
@@ -374,12 +355,12 @@ fi:
change_aspect_of_post_a: "Et, mutta voit aina tehdä uuden julkaisun samalla sisällöllä ja julkaista sen eri näkymään."
change_aspect_of_post_q: "Voinko muuttaa näkymiä julkaisun julkaisemisen jälkeen?"
contacts_know_aspect_a: "Ei. He eivät voi nähdä näkymän nimeä missään olosuhteissa."
- contacts_know_aspect_q: "Tietävätkö henkilöt mihin näkymiin heidät sijoitan?"
- contacts_visible_a: "Jos rastitat tämän kohdan niin henkilöt tässä näkymässä voivat nähdä keitä muita näkymään kuuluu, profiilisivultasi kuvasi alta. On parasta valita tämä vaihtoehto vain, jos kaikki henkilöt tässä näkymässä tuntevat toisensa muutenkin. Näkymän nimi ei kuitenkaan ole nähtävissä vaikka tämä asetus olisi valittu."
- contacts_visible_q: "Mitä tarkoittaa \"määritä henkilöt tässä näkymässä toisilleen näkyviksi\"?"
+ contacts_know_aspect_q: "Tietävätkö kontaktit, mihin näkymiin heidät sijoitan?"
+ contacts_visible_a: "Jos rastitat tämän kohdan, tässä näkymässä olevat kontaktit voivat nähdä, keitä muita näkymään kuuluu profiilisivultasi kuvasi alta. On parasta valita tämä vaihtoehto vain, jos kaikki tässä näkymässä olevat kontaktit tuntevat toisensa muutenkin. Näkymän nimi ei kuitenkaan ole nähtävissä, vaikka tämä asetus olisi valittu."
+ contacts_visible_q: "Mitä tarkoittaa asetus \"Salli tämän näkymän kontaktien nähdä toisensa\"?"
delete_aspect_a: "Näkymälistassasi etusivun vasemmalla puolen, osoita hiirellä näymää, jonka tahdot poistaa. Klikkaa pientä 'muokkaus'-kynää, joka ilmestyy oikealle. Klikkaa poista painiketta ilmestyvästä laatikosta."
delete_aspect_q: "Miten poistan näkymän?"
- person_multiple_aspects_a: "Kyllä. Mene henkilöt sivullesi ja klikkaa henkilöt. Jokaista henkilöä kohden voit käyttää oikealla olevaa valikkoa lisätäksesi (tai poistaaksesi) heidät niin moneen näkymään, kuin haluat. Tai voit lisätä heidät uuteen näkymään (tai poistaa näkymästä) klikkaamalla näkymän valitsinpainiketta heidän profiilisivullaan. Tai voit siirtää hiiren kohdistimen henkilön nimen päälle, jos näet sen virrassa, jolloin hänen \"leiju-korttinsa\" ilmestyy. Voit muuttaa henkilön näkymiä suoraan siitä."
+ person_multiple_aspects_a: "Kyllä. Mene kontaktisivullesi ja klikkaa \"Kontaktini\". Oikealla olevasta valikosta voit lisätä (tai poistaa) jokaisen kontaktin niin moneen näkymään kuin haluat. Voit myös lisätä kontakteja uuteen näkymään (tai poistaa näkymästä) klikkaamalla näkymän valitsinpainiketta heidän profiilisivullaan. Voit myös siirtää hiiren kohdistimen kontaktin nimen päälle, kun näet sen virrassa, jolloin hänen \"leiju-korttinsa\" ilmestyy. Voit vaihtaa kontaktin näkymiä suoraan siitä."
person_multiple_aspects_q: "Voinko lisätä henkilön useampaan näkymään?"
post_multiple_aspects_a: "Kyllä. Kun olet luomassa julkaisua, käytä näkymän valintapainiketta poistaaksesi tai lisätäksesi näkymiä. Julkaisusi tulee näkymään kaikissa näkymissä, jotka valitset. Voit valita julkaisullesi halutut kohdenäkymät myös sivupalkista. Valitsemasi näkymät ovat automaattisesti valittuina, kun ryhdyt luomaan seuraavaa julkaisua."
post_multiple_aspects_q: "Voinko tehdä julkaisun useisiin näkymiin samalla kertaa?"
@@ -394,7 +375,7 @@ fi:
what_is_an_aspect_q: "Mikä on näkymä?"
who_sees_post_a: "Jos teet rajoitetun julkaisun sen näkevät vain henkilöt, jotka olet sijoittanut kyseiseen näkymään (tai näkymiin). Henkilöt, jotka eivät kuulu kyseiseen näkymään, eivät voi mitenkään nähdä sellaista julkaisua ellet ole tehnyt siitä julkista. Vain julkiset julkaisut ovat sellaisten henkilöiden nähtävillä, jotka eivät kuulu mihinkään näkymistäsi."
who_sees_post_q: "Kun julkaisen näkymälle kuka voi nähdä sen?"
- foundation_website: "diaspora säätiön kotisivu"
+ foundation_website: "Diaspora-säätiön kotisivu"
getting_help:
get_support_a_hashtag: "kysy Diasporassa* julkisessa julkaisussa käyttämällä %{question} tagia"
get_support_a_irc: "juttele kanssamme %{irc} (Live chat)"
@@ -410,10 +391,13 @@ fi:
irc: "IRC"
keyboard_shortcuts:
keyboard_shortcuts_a1: "Virtanäkymässä voit käyttää seuraavia näppäinoikoteitä?"
- keyboard_shortcuts_li1: "j - siirry seuraavaan julkaisuun"
- keyboard_shortcuts_li2: "k - siirry edelliseen julkaisuun"
- keyboard_shortcuts_li3: "c - kommentoi nykyistä julkaisua"
- keyboard_shortcuts_li4: "I - tykkää nykyistä julkaisua"
+ keyboard_shortcuts_li1: "j - Siirry seuraavaan julkaisuun"
+ keyboard_shortcuts_li2: "k - Siirry edelliseen julkaisuun"
+ keyboard_shortcuts_li3: "c - Kommentoi nykyistä julkaisua"
+ keyboard_shortcuts_li4: "I - Tykkää nykyisestä julkaisusta"
+ keyboard_shortcuts_li5: "r - Jaa tämä julkaisu uudelleen"
+ keyboard_shortcuts_li6: "m - Laajenna tämä julkaisu"
+ keyboard_shortcuts_li7: "o - Avaa tämän julkaisun ensimmäinen linkki"
keyboard_shortcuts_q: "MItä näppäinoikoteitä on käytettävissä?"
title: "Näppäinoikotiet"
markdown: "Markdown"
@@ -425,7 +409,7 @@ fi:
see_mentions_a: "Kyllä, klikkaa \"Maininnat\" aloitussivun vasemmassa sarakkeessa."
see_mentions_q: "Onko minun mahdollista nähdä julkaisut joissa minut on mainittu?"
title: "Maininnat"
- what_is_a_mention_a: "Maininta on julkaisussa näkyvä linkki henkilön profiilisivulle. Kun joku on mainittu he saavat maininnasta ilmoituksen, jotta he voivat kiinnittää huomiota julkaisuun."
+ what_is_a_mention_a: "Maininta on julkaisussa näkyvä linkki henkilön profiilisivulle. Mainittu henkilö saa maininnasta ilmoituksen, jotta huomaa julkaisuun."
what_is_a_mention_q: "Mikä on \"maininta\"?"
miscellaneous:
back_to_top_a: "Kyllä. Kun olet vierittänyt sivua alas, klikkaa harmaata nuolta joka on selainikkunassa sivun oikeassa yläkulmassa."
@@ -439,10 +423,10 @@ fi:
title: "Sekalaiset"
pods:
find_people_a: "Kutsu ystäviäsi käyttämällä sivupalkissa olevaa sähköpostilinkkiä. Seuraa #Tageja löytääksesi muita, jotka jakavat kiinnostuksen kohteesi ja lisätäksesi sinua kiinnostavia julkaisuja tehneet henkilöt omaan näkymääsi. Huuda olevasi #newhere julkisessa julkaisussa."
- find_people_q: "Liityin juuri podiin. Kuinka löydän ihmisiä joiden kanssa haluan alkaa jakamaan?"
+ find_people_q: "Liityin juuri podiin. Kuinka löydän ihmisiä, joiden kanssa haluan alkaa jakaa?"
title: "Podit"
use_search_box_a: "Jos tiedät heidän diaspora* ID:nsä (esim. käyttäjänimi@podinimi.org), voit löytää heidät etsimällä sitä. Jos olet samassa podissa voit etsiä pelkän käyttäjänimen perusteella. Vaihtoehtoisesti voit etsiä profiilinimen perusteella (nimi, jonka näet näytöllä). Jos haku ei onnistu ensimmäisellä kerralla, yritä uudestaan."
- use_search_box_q: "Kuinka käytän etsi -kenttää löytääkseni jonkun henkilön?"
+ use_search_box_q: "Kuinka käytän Etsi-kenttää löytääkseni jonkun henkilön?"
what_is_a_pod_a: "Podi on palvelin, jossa ajetaan diaspora* ohjelmaa ja joka on yhteydessä diaspora* verkkoon. \"Podi\" on vertaus joidenkin kasvien palkoihin joiden sisällä on siemeniä, vastaavasti palvelimen sisältäessä useita käyttäjätiliejä. On olemassa useita erilaisia podeja. Voit lisätä ystäväi muista podeista ja viestiä heidän kanssaan. (Voi ajatella diaspora* podin olevan kuten sähköpostipalvelu: on olemassa julkisia podeja, yksityisiä podeja ja jonkin verran vaivaa näkemällä voit ajaa myös omaa podiasi)"
what_is_a_pod_q: "Mikä on podi?"
posts_and_posting:
@@ -454,12 +438,12 @@ fi:
embed_multimedia_q: "Kuinka upotan videota, ääntä tai muuta multimediasisältöä julkaisuihini?"
format_text_a: "Käyttämällä yksinkertaista menetelmää nimeltä %{markdown}. Täydellinen Markdown syntaksi löytyy %{here}. Esikatselupainike on tässä yhteydessä todella hyödyllinen sillä voit tarkistaa miltä julkaisusi näyttää, ennen kuin jaat sen."
format_text_q: "Kuinka voin muotoilla julkaisuni tekstiä (lihavointi, kursiivi jne.)?"
- hide_posts_a: "Jos osoitat hiirelläsi julkaisusi yläosaa X ilmestyy oikealle. Klikkaa sitä piilottaaksesi julkaisun ja estääksesi siihen liittyvät ilmoitukset. Voit edelleen nähdä piilotetun julkaisun, jos vierailet julkaisun tehneen henkilön profiilisivulla."
+ hide_posts_a: "Jos osoitat hiirelläsi julkaisusi yläosaa, ilmestyy oikealle X. Klikkaa sitä piilottaaksesi julkaisun ja estääksesi siihen liittyvät ilmoitukset. Voit edelleen nähdä piilotetun julkaisun, jos vierailet julkaisun tehneen henkilön profiilisivulla."
hide_posts_q: "Kuinka piilotan julkaisun? / Kuinka estän saamasta ilmoituksia julkaisusta johon olen kommentoinut?"
image_text: "kuvateksti"
image_url: "kuvan url"
insert_images_a: "Klikkaa pientä kamerakuvaketta lisätäksesi kuvan julkaisuun. Klikkaa kamerakuvaketta uudelleen lisätäksesi muita kuvia, tai voit valita useita kuvia ladataksesi ne samalla kertaa."
- insert_images_comments_a1: "Seuraava Markdown koodi"
+ insert_images_comments_a1: "Seuraava Markdown-koodi"
insert_images_comments_a2: "voidaan käyttää kuvien lisäämiseksi Internetistä kommenttehin ja julkaisuihin."
insert_images_comments_q: "Voinko lisätä kuvia kommentteihini?"
insert_images_q: "Kuinka lisään kuvia julkaisuihini?"
@@ -467,9 +451,9 @@ fi:
size_of_images_q: "Voinko muokata kuvien kokoa julkaisuissani tai kommenteissani?"
stream_full_of_posts_a1: "Virtasi rakentuu kolmenlaisista julkaisuista:"
stream_full_of_posts_li1: "Julkaisuista henkilöiltä joiden kanssa jaat. Näitä on kahdenlaisia: julkiset julkaisut ja rajoitetut julkaisut, jotka on jaettu näkymään johon kuulut. Nämä julkaisut poistuvat yksinkertaisesti lopettamalla jakaminen kyseisen henkilön kanssa."
- stream_full_of_posts_li2: "Julkiset julkaisut, jotka sisältävät tagin jota seuraat. Nämä poistuvat, kun lakkaat seuraamasta kyseistä tagia."
+ stream_full_of_posts_li2: "Julkiset julkaisut, jotka sisältävät tagin, jota seuraat. Nämä poistuvat, kun lakkaat seuraamasta kyseistä tagia."
stream_full_of_posts_li3: "Julkiset julkaisut Yhteisön Valokeilassa luetelluilta henkilöiltä. Nämä voi estää näkymästä poistamalla valinnan kohdasta \"Näytetäänkö Yhteisön valokeila virrassa?\" käyttäjätilisi asetuksissa."
- stream_full_of_posts_q: "Miksi minun virtani on täynnä julkaisuja henkilöiltä joita en tunne ja joiden kanssa en jaa?"
+ stream_full_of_posts_q: "Miksi minun virtani on täynnä julkaisuja henkilöiltä, joita en tunne ja joiden kanssa en jaa?"
title: "Julkaisut ja lähettäminen"
private_posts:
can_comment_a: "Vain kirjautuneet diaspora* käyttäjät, jotka olet sijoittanut kyseiseen näkymään, voivat tykätä tai kommentoida yksityistä julkaisuasi."
@@ -492,7 +476,7 @@ fi:
public_posts:
can_comment_reshare_like_a: "Kuka tahansa kirjautunut Diaspora* käyttäjä voi kommentoida, uudelleenjakaa tai tykätä julkista julkaisuasi."
can_comment_reshare_like_q: "Kuka voi kommentoida, uudelleenjakaa tai tykätä julkista julkaisuani?"
- deselect_aspect_posting_a: "Valinnan poistaminen näkymästä ei vaikuta julkiseen julkaisuun. Se näkyy silti kaikkien henkilöidesi virrassa. Tehdäksesi julkaisun näkyväksi vain tietylle näkymälle sinun täytyy valita halutut näkymät julkaisun alta."
+ deselect_aspect_posting_a: "Valinnan poistaminen näkymästä ei vaikuta julkiseen julkaisuun. Se näkyy silti kaikkien kontaktiesi virrassa. Tehdäksesi julkaisun näkyväksi vain tietylle näkymälle sinun täytyy valita halutut näkymät julkaisun alta."
deselect_aspect_posting_q: "Mitä tapahtuu jos poistan valinnan yhdestä tai useammasta näkymästä tehdessäni julkista julkaisua?"
find_public_post_a: "Julkiset julkaisusi näkyvät jokaisen sinua seuraavan virrassa. Jos merkitsit julkisen julkaisusi joillakin tai jollakin #tagilla, jokainen joka seuraa kyseistä tagia näkee julkaisusi omassa virrassaan. Jokaisella julkisella julkaisulla on myös oma URL jonka jokainen voi nähdä, jopa silloin kun he eivät ole kirjautuneet sisään - tällöin julkisiin julkaisuihin voidaan linkittää suoraan Twitteristä, blogista jne. Myös hakukoneet voivat indeksoida julkiset julkaisut."
find_public_post_q: "Kuinka toiset henkilöt voivat löytää julkisen julkaisuni?"
@@ -520,18 +504,18 @@ fi:
sharing:
add_to_aspect_a1: "Sanotaan vaikka, että Amy lisää Benin johonkin näkymään, mutta Ben ei ole (vielä) lisännyt Amya mihinkään näkymään:"
add_to_aspect_a2: "Tämä tunnetaan nimellä epäsymmetrinen jakaminen. Jos ja kun Ben myös lisää Amyn johonkin näkymään tämä muuttuu yhtäläiseksi jakamiseksi, jolloin Amyn ja Benin julkiset julkaiset ja asiaankuuluvat yksityiset julkaisut alkavat näkyä molempien virrassa jne. "
- add_to_aspect_li1: "Ben saa ilmoituksen, että Amy on \"alkanut jakamaan\" Benin kanssa."
- add_to_aspect_li2: "Amy alkaa saamaan Benin julkiset julkaisut omaan näkymäänsä."
+ add_to_aspect_li1: "Ben saa ilmoituksen, että Amy on \"alkanut jakaa\" Benin kanssa."
+ add_to_aspect_li2: "Amy alkaa saada Benin julkiset julkaisut omaan näkymäänsä."
add_to_aspect_li3: "Amy ei näe Benin yksityisiä julkaisuja."
add_to_aspect_li4: "Ben ei näe Amyn julkisia tai yksityisiä julkaisuja omassa virrassaan."
add_to_aspect_li5: "Mutta jos Ben menee Amyn profiilisivulle, hän voi sitten nähdä Amyn yksityiset julkaisut joihin Amy on hänet lisännyt (kuten myös julkiset julkaisut jotka ovat kenen tahansa nähtävillä siellä)."
add_to_aspect_li6: "Ben voi nähdä Amyn yksityisen profiilin, (bio, sijainti, sukupuoli, syntymäpäivä)"
add_to_aspect_li7: "Amy näkyy Benin yhteystietosivulla \"Jakaa vain kanssani\" -kohdassa."
add_to_aspect_q: "Mitä tapahtuu, kun lisään jonkun johonkin näkymistäni? Tai jos joku lisää minut johonkin omista näkymistään?"
- list_not_sharing_a: "Ei, mutta voit nähdä jakaako joku kanssasi vierailemalla heidän profiilisivullaan. Jos he jakavat, palkki heidän profiilikuvansa alla on vihreä; jos eivät, palkki on harmaa. Sinun tulisi kuitenkin saada ilmoitus, jos joku alkaa jakamaan kanssasi."
+ list_not_sharing_a: "Ei, mutta voit nähdä jakaako joku kanssasi vierailemalla heidän profiilisivullaan. Jos he jakavat, palkki heidän profiilikuvansa alla on vihreä; jos eivät, palkki on harmaa. Sinun tulisi kuitenkin saada ilmoitus, jos joku alkaa jakaa kanssasi."
list_not_sharing_q: "Onko olemassa luetteloa henkilöistä, jotka olen lisännyt johonkin näkymääni mutta jotka eivät ole lisänneet minun mihinkään omaan näkymäänsä?"
- only_sharing_a: "Nämä ovat henkilöitä, jotka ovat lisänneet sinut johonkin näkymäänsä, mutta jotka eivät (vielä) ole yhdessäkään sinun näkymässäsi. Toisin sanoen he jakavat kanssasi mutta sinä et jaa heidän kanssaa (epäsymmetrinen jakaminen). Jos lisäät heidät johonkin näkymääsi he alkavat sen jälkeen näkymään kyseisessä näkymässä eivätkä enää \"Jakaa vain kanssasi\". Katso ylempää."
- only_sharing_q: "Keitä ovat henkilöt jotka on lueteltu \"Jakaa vain kanssani\" -listassa yhteystietosivullani?"
+ only_sharing_a: "Nämä ovat henkilöitä, jotka ovat lisänneet sinut johonkin näkymäänsä, mutta jotka eivät (vielä) ole yhdessäkään sinun näkymässäsi. Toisin sanoen he jakavat kanssasi mutta sinä et jaa heidän kanssaa (epäsymmetrinen jakaminen). Jos lisäät heidät johonkin näkymääsi he alkavat sen jälkeen näkyä kyseisessä näkymässä eivätkä enää \"Jakaa vain kanssasi\". Katso ylempää."
+ only_sharing_q: "Keitä ovat henkilöt, jotka on lueteltu \"Jakaa vain kanssani\" -listassa yhteystietosivullani?"
see_old_posts_a: "Ei. He näkevät vain kyseiseen näkymään julkaisemasi uudet julkaisut. He (ja jokainen muu) voivat nähdä vanhemmat julkiset julkaisusi profiilisivullasi, ja he voivat nähdä ne myös virrassaan."
see_old_posts_q: "Jos lisään jonkun johonkin omaan näkymääni, voivatko he nähdä vanhemmat julkaisut jotka olen julkaissut kyseiseen näkymään?"
title: "Jakaminen"
@@ -547,7 +531,7 @@ fi:
title: "Tagit"
what_are_tags_for_a: "Tagit on tapa luokitella julkaisuja, yleensä aiheen mukaan. Tagin etsiminen näyttää kaikki kyseisellä tagilla merkityt julkaisut, jotka ovat sinun nähtävissäsi (sekä julkiset, että yksityiset). Tällä tavalla kyseisestä aiheesta kiinnostuneet ihmiset voivat löytää aiheeseen liittyvät julkiset julkaisut."
what_are_tags_for_q: "Mihin tageja tarvitaan?"
- third_party_tools: "kolmannen osapuolen työkalut"
+ third_party_tools: "Kolmannen osapuolen työkalut"
title_header: "Apua"
tutorial: "Opastus"
tutorials: "ohjeita"
@@ -594,18 +578,18 @@ fi:
layouts:
application:
back_to_top: "Takaisin ylös"
- powered_by: "PALVELUN TARJOAA DIASPORA*"
+ powered_by: "Palvelun tarjoaa Diaspora*"
public_feed: "Käyttäjän %{name} julkinen Diaspora-uutisvirta"
source_package: "Lataa lähdekoodipaketti"
- toggle: "mobiilisivusto päälle/pois"
+ toggle: "Mobiilisivusto päälle/pois"
whats_new: "Uutta"
- your_aspects: "näkymäsi"
+ your_aspects: "Näkymäsi"
header:
- admin: "ylläpitäjä"
- blog: "blogi"
- code: "lähdekoodi"
+ admin: "Ylläpitäjä"
+ blog: "Blogi"
+ code: "Lähdekoodi"
help: "Apua"
- login: "kirjaudu sisään"
+ login: "Kirjaudu sisään"
logout: "Kirjaudu ulos"
profile: "Profiili"
recent_notifications: "Viimeaikaiset ilmoitukset"
@@ -620,20 +604,20 @@ fi:
people_like_this:
one: "%{count} tykkäys"
other: "%{count} tykkäystä"
- zero: "ei tykkäyksiä"
+ zero: "Ei tykkäyksiä"
people_like_this_comment:
one: "%{count} tykkäys"
other: "%{count} tykkäystä"
- zero: "ei tykkäyksiä"
+ zero: "Ei tykkäyksiä"
limited: "Rajoitettu"
more: "Lisää"
- next: "seuraava"
+ next: "Seuraava"
no_results: "Tuloksia ei löytynyt"
notifications:
also_commented:
- one: "Myös %{actors} kommentoi käyttäjän %{post_author} %{post_link}a."
- other: "Myös %{actors} kommentoivat käyttäjän %{post_author} %{post_link}a."
- zero: "Myös %{actors} kommentoi käyttäjän %{post_author} %{post_link}a."
+ one: "Myös %{actors} kommentoi käyttäjän %{post_author} julkaisua %{post_link}."
+ other: "Myös %{actors} kommentoivat käyttäjän %{post_author} julkaisua %{post_link}."
+ zero: "Myös %{actors} kommentoi käyttäjän %{post_author} julkaisua %{post_link}."
also_commented_deleted:
one: "%{actors} kommentoi poistettua julkaisuasi."
other: "%{actors} on kommentoinut poistettua julkaisuasi."
@@ -661,17 +645,19 @@ fi:
other: "ja %{count} muuta"
two: "ja %{count} muuta"
zero: "eikä kukaan muu"
- comment_on_post: "Kommentoi julkaisua"
- liked: "Tykätyt"
+ comment_on_post: "Julkaisujesi kommentit"
+ liked: "Tykkäykset"
mark_all_as_read: "Merkitse kaikki luetuiksi"
+ mark_all_shown_as_read: "Merkitse kaikki luetuiksi"
mark_read: "Merkitse luetuksi"
mark_unread: "Merkitse lukemattomaksi"
- mentioned: "Mainittu"
+ mentioned: "Maininnat"
+ no_notifications: "Sinulle ei ole vielä ilmoituksia."
notifications: "Ilmoitukset"
- reshared: "Jaettu uudelleen"
- show_all: "näytä kaikki"
- show_unread: "näytä lukemattomat"
- started_sharing: "Aloitti jakamaan"
+ reshared: "Uudelleenjaot"
+ show_all: "Näytä kaikki"
+ show_unread: "Näytä lukemattomat"
+ started_sharing: "Jakoilmoitukset"
liked:
one: "%{actors} tykkäsi julkaisustasi %{post_link}."
other: "%{actors} on tykännyt julkaisustasi %{post_link}."
@@ -681,12 +667,9 @@ fi:
other: "%{actors} on tykännyt poistamastasi julkaisusta."
zero: "%{actors} tykkäsi poistamastasi julkaisusta."
mentioned:
- few: "%{actors} ovat maininneet sinut %{post_link}ssä."
- many: "%{actors} ovat maininneet sinut %{post_link}ssä."
- one: "%{actors} on maininnut sinut %{post_link}ssä."
- other: "%{actors} ovat maininneet sinut %{post_link}ssä."
- two: "%{actors} ovat maininneet sinut %{post_link}ssä."
- zero: "%{actors} on maininnut sinut %{post_link}ssä."
+ one: "%{actors} on maininnut sinut julkaisussa %{post_link}."
+ other: "%{actors} ovat maininneet sinut julkaisussa %{post_link}."
+ zero: "%{actors} on maininnut sinut julkaisussa %{post_link}."
mentioned_deleted:
one: "%{actors} mainitsi sinut poistetussa julkaisussa."
other: "%{actors} mainitsivat sinut poistetussa julkaisussa."
@@ -712,15 +695,37 @@ fi:
two: "%{actors} started sharing with you."
zero: "%{actors} on aloittanut jakamaan kanssasi."
notifier:
+ a_limited_post_comment: "Rajoitetulle julkaisullesi on uusi kommentti Diasporassa."
a_post_you_shared: "julkaisu"
+ a_private_message: "Diasporassa on sinulle uusi yksityisviesti."
accept_invite: "Hyväksy sinun Diaspora* kutsusi!"
- click_here: "klikkaa tästä"
+ click_here: "Klikkaa tästä"
comment_on_post:
reply: "Vastaa tai katso käyttäjän %{name} viesti >"
confirm_email:
click_link: "Aktivoi uusi sähköpostiosoitteesi %{unconfirmed_email} napsauttamalla tätä linkkiä:"
subject: "Aktivoi uusi sähköpostiosoitteesi %{unconfirmed_email}"
email_sent_by_diaspora: "Podi %{pod_name} lähetti tämän sähköpostin. Jos et halua saada tällaisia sähköposteja jatkossa,"
+ export_email:
+ body: |-
+ Hei %{name},
+
+ Tietosi on käsitelty ja voit ladata ne tämän [linkin kautta](%{url}).
+
+ Terveisin,
+
+ Diaspora* sähköpostirobotti!
+ subject: "Henkilökohtaiset tietosi ovat valmiina ladattavaksi, %{name}"
+ export_photos_email:
+ body: |-
+ Hei %{name},
+
+ Kuvatiedostosi on käsitelty ja ne voit ladata ne [tästä linkistä](%{url}).
+
+ Terveisin,
+
+ diaspora* sähköpostirobotti!
+ subject: "Kuvatiedostot ovat valmiina ladattaviksi, %{name}"
hello: "Hei %{name}!"
invite:
message: |-
@@ -747,6 +752,22 @@ fi:
subject: "%{name} on maininnut sinut Diaspora*:ssa"
private_message:
reply_to_or_view: "Lue tai osallistu keskusteluun >"
+ remove_old_user:
+ body: |-
+ Hei,
+
+ Koska käyttäjätilisi %{pod_url}-podilla ei ole ollut aktiivinen %{after_days} päivään, oletamme, että et halua enää käyttää tiliäsi. Poistamme tämän Diaspora-podin tietokannasta tarpeettomia käyttäjätilejä, koska haluamme taata sen aktiivisille käyttäjille parhaan mahdollisen suorituskyvyn.
+
+ Näkisimme sinut mielellämme osana Diaspora-yhteisöä, ja olet niin halutessasi tervetullut pitämään käyttäjätilisi elossa.
+
+ Jos haluat pitää käyttäjätilisi toiminnassa, sinun tarvitsee vain kirjautua sisään tilillesi ennen päivämäärää %{remove_after}. Kun olet kirjautunut sisään, katsele vähän ympärillesi Diasporassa. Se on muuttunut paljon siitä kun viimeksi kävit siellä, ja uskomme että tulet pitämään tekemistämme parannuksista. Voit löytää kiinnostavaa sisältöä seuraamalla #tageja.
+
+ Kirjaudu sisään tästä: %{login_url}. Jos olet unohtanut kirjautumistietosi, voit pyytää niitä uudelleen kyseisellä sivulla.
+
+ Toivottavasti näemme uudelleen,
+
+ Diaspora-sähköpostirobotti!
+ subject: "Käyttämätön diaspora* käyttäjätilisi on merkitty poistettavaksi"
report_email:
body: |-
Hei,
@@ -778,7 +799,7 @@ fi:
subject: "%{name} on alkanut jakaa kanssasi Diaspora*:ssa"
view_profile: "Näytä käyttäjän %{name} profiiili"
thanks: "Kiitos,"
- to_change_your_notification_settings: "vaihtaaksesi ilmoitusasetuksia"
+ to_change_your_notification_settings: "muuttaaksesi ilmoitusasetuksia"
nsfw: "NSFW"
ok: "OK"
or: "tai"
@@ -788,40 +809,38 @@ fi:
add_contact:
invited_by: "sinut kutsui"
add_contact_small:
- add_contact_from_tag: "lisää henkilö tagista"
+ add_contact_from_tag: "Lisää kontakti tagista"
aspect_list:
- edit_membership: "muokkaa näkymän jäsenyyttä."
- few: "%{count} henkilöä"
+ edit_membership: "Muokkaa näkymän jäsenyyttä"
helper:
is_not_sharing: "%{name} ei jaa kanssasi"
is_sharing: "%{name} jakaa kanssasi"
results_for: " tulokset kyselylle %{params}"
index:
- couldnt_find_them: "Heitä ei löytynyt?"
- looking_for: "Etsitkö tägillä %{tag_link} merkittyjä viestejä?"
+ couldnt_find_them: "Etkö löytänyt etsimääsi henkilöä?"
+ looking_for: "Etsitkö tagilla %{tag_link} merkittyjä viestejä?"
no_one_found: "...ketään ei löytynyt."
no_results: "Hei! Sinun tulisi etsiä jotakin."
- results_for: "Käyttäjät jotka vastaavat hakua %{search_term}"
- search_handle: "Käytä heidän diaspora* ID:tään (käyttäjänimi@pod.tld) löytääksesi ystäväsi varmasti."
+ results_for: "Hakua %{search_term} vastaavat käyttäjät"
+ search_handle: "Löydät ystäväsi parhaiten käyttämällä heidän Diaspora-ID:itään (käyttäjänimi@pod.tld)."
searching: "etsitään, pieni hetki..."
send_invite: "Ei edelleenkään mitään? Lähetä kutsu!"
- many: "%{count} henkilöä"
one: "1 henkilö"
other: "%{count} henkilöä"
person:
- add_contact: "lisää kontakti"
+ add_contact: "Lisää kontakti"
already_connected: "Yhteys jo olemassa"
pending_request: "Jonossa oleva pyyntö"
thats_you: "Se olet sinä!"
profile_sidebar:
bio: "Elämäkerta"
born: "Syntymäpäivä"
- edit_my_profile: "Muokkaa profiiliasi"
+ edit_my_profile: "Muokkaa profiiliani"
gender: "Sukupuoli"
- in_aspects: "näkymissä"
+ in_aspects: "Näkymissä"
location: "Sijainti"
photos: "Kuvat"
- remove_contact: "poista kontakti"
+ remove_contact: "Poista kontakti"
remove_from: "Poista %{name} näkymästä %{aspect}?"
show:
closed_account: "Tämä käyttäjätili on suljettu."
@@ -836,18 +855,17 @@ fi:
recent_public_posts: "Viimeisimmät julkiset julkaisut"
return_to_aspects: "Palaa näkymiin"
see_all: "Näytä kaikki"
- start_sharing: "aloita jakamaan"
+ start_sharing: "Aloita jakamaan"
to_accept_or_ignore: "hyväksyäksesi tai hylätäksesi sen."
sub_header:
- add_some: "lisää niitä"
- edit: "muokkaa"
- you_have_no_tags: "sinulla ei ole tageja!"
- two: "%{count} henkilöä"
+ add_some: "Lisää niitä"
+ edit: "Muokkaa"
+ you_have_no_tags: "Sinulla ei ole tageja!"
webfinger:
fail: "Valitettavasti tunnusta %{handle} ei löytynyt."
- zero: "ei henkilöitä"
+ zero: "Ei henkilöitä"
photos:
- comment_email_subject: "kuva käyttäjältä %{name}"
+ comment_email_subject: "Kuva käyttäjältä %{name}"
create:
integrity_error: "Kuvan lataus epäonnistui. Oletko varma, että se oli kuva?"
runtime_error: "Kuvan lataus epäonnistui. Onhan turvavyösi kiinni?"
@@ -859,7 +877,7 @@ fi:
new:
back_to_list: "Takaisin listaan"
new_photo: "Uusi kuva"
- post_it: "lähetä!"
+ post_it: "Lähetä!"
new_photo:
empty: "{file} on tyhjä, valitse tiedostot uudelleen ilman kyseistä tiedostoa."
invalid_ext: "{file} sisältää viallisen tiedostopäätteen. Tuetut muodot ovat {extensions}."
@@ -868,13 +886,13 @@ fi:
or_select_one_existing: "tai valitse joku jo lisäämistäsi kuvista: %{photos}"
upload: "Lisää uusi profiilikuva!"
photo:
- view_all: "näytä kaikki käyttäjän %{name} kuvat"
+ view_all: "Näytä kaikki käyttäjän %{name} kuvat"
show:
- collection_permalink: "tallenna pysyvä linkki"
+ collection_permalink: "Tallenna pysyvä linkki"
delete_photo: "Poista kuva"
- edit: "muokkaa"
+ edit: "Muokkaa"
edit_delete_photo: "Muokkaa kuvan kuvausta / poista kuva"
- make_profile_photo: "aseta profiilikuvaksi"
+ make_profile_photo: "Aseta profiilikuvaksi"
show_original_post: "Näytä alkuperäinen julkaisu"
update_photo: "Päivitä kuva"
update:
@@ -886,13 +904,13 @@ fi:
show:
destroy: "Poista"
not_found: "Valitettavasti tätä julkaisua ei löytynyt."
- permalink: "pysyvä linkki"
+ permalink: "Pysyvä linkki"
photos_by:
one: "Yksi kuva käyttäjältä %{author}"
other: "%{count} kuvaa käyttäjältä %{author}"
zero: "Ei kuvia käyttäjältä %{author}"
reshare_by: "Uudelleenjaettu käyttäjältä %{author}"
- previous: "edellinen"
+ previous: "Edellinen"
privacy: "Yksityisyys"
privacy_policy: "Tietosuojakäytäntö"
profile: "Profiili"
@@ -904,7 +922,7 @@ fi:
last_name: "Sukunimi"
nsfw_check: "Merkitse kaikki jakamani sisältö NSFW:ksi"
nsfw_explanation: "NSFW ('not safe for work' - 'sopimatonta työpaikalle') on Diaspora*n itseohjautuva yhteisöstandardi sisällölle, joka on mahdollisesti sopimatonta katsottavaksi työpaikalla. Valitse tämä asetus, jos suunnittelet julkaisevasi sellaista materiaalia säännöllisesti, jotta kaikki jakamasi sisältö piilotetaan virrasta ja näytetään vain, jos kukin niin haluaa."
- nsfw_explanation2: "Jos et halua käyttää tätä asetusta ole hyvä ja lisää #nsfw tagi julkaisuusi aina, kun haluat jakaa sellaista sisältöä."
+ nsfw_explanation2: "Jos et halua käyttää tätä asetusta, ole hyvä ja lisää #nsfw-tagi julkaisuusi aina, kun haluat jakaa työpaikalle sopimatonta sisältöä."
update_profile: "Päivitä profiili"
your_bio: "Elämäkertasi"
your_birthday: "Syntymäpäiväsi"
@@ -915,7 +933,7 @@ fi:
your_private_profile: "Yksityinen profiilisi"
your_public_profile: "Julkinen profiilisi"
your_tags: "Kuvaile itseäsi viidellä sanalla"
- your_tags_placeholder: "esim. #elokuvat #kissat #matkailu #opettaja #turku"
+ your_tags_placeholder: "Esim. #elokuvat #kissat #matkailu #opettaja #turku"
update:
failed: "Profiilin päivitys epäonnistui"
updated: "Profiili päivitetty"
@@ -923,7 +941,7 @@ fi:
reactions:
one: "1 reaktio"
other: "%{count} reaktiota"
- zero: "Ei yhtään reaktiota"
+ zero: "Ei reaktioita"
registrations:
closed: "Rekisteröityminen on suljettu tässä Diaspora-podissa."
create:
@@ -937,22 +955,21 @@ fi:
update: "Päivitä"
invalid_invite: "Antamasi kutsulinkki ei ole enää voimassa!"
new:
- continue: "Jatka"
create_my_account: "Luo käyttäjätili!"
- diaspora: "<3 diaspora*"
- email: "SÄHKÖPOSTI"
+ email: "Sähköposti"
enter_email: "Syötä sähköpostiosoite"
enter_password: "Syötä salasana (vähintään kuusi merkkiä)"
enter_password_again: "Syötä sama salasana kuin edellä"
enter_username: "Valitse käyttäjänimi (vain kirjaimet, numerot ja alaviivat sallittuja)"
- hey_make: "HEI,<br/>JULKAISE<br/>JOTAIN."
join_the_movement: "Liity joukkoon!"
- password: "SALASANA"
- password_confirmation: "SALASANA UUDESTAAN"
- sign_up: "REKISTERÖIDY"
+ password: "Salasana"
+ password_confirmation: "Salasana uudestaan"
+ sign_up: "Rekisteröidy"
sign_up_message: "Yhteisöpalvelu suurella ♥:llä"
submitting: "Lähettää..."
- username: "KÄYTTÄJÄNIMI"
+ terms: "Luomalla tilin hyväksyt %{terms_link}"
+ terms_link: "palvelun käyttöehdot"
+ username: "Käyttäjänimi"
report:
comment_label: "<b>Kommentti</b>:<br>%{data}"
confirm_deletion: "Oletko varma, että haluat poistaa kohteen?"
@@ -978,14 +995,14 @@ fi:
success: "Olet nyt jakamassa."
helper:
new_requests:
- one: "%{count} uusi pyyntö!"
+ one: "Uusi pyyntö!"
other: "%{count} uutta pyyntöä!"
- zero: "ei uusia pyyntöjä"
+ zero: "Ei uusia pyyntöjä"
manage_aspect_contacts:
- existing: "Olemassa olevat henkilöt"
- manage_within: "Muokkaa henkilöitä näkymässä"
+ existing: "Olemassa olevat kontaktit"
+ manage_within: "Muokkaa kontakteja näkymässä"
new_request_to_person:
- sent: "lähetetty!"
+ sent: "Lähetetty!"
reshares:
comment_email_subject: "Käyttäjän %{resharer} uudelleenjako käyttäjän %{author} julkaisusta."
create:
@@ -998,7 +1015,7 @@ fi:
zero: "Jaa uudelleen"
reshare_confirmation: "Jaetaanko käyttäjän %{author} julkaisu uudelleen?"
reshare_original: "Jaa alkuperäinen uudelleen"
- reshared_via: "kautta"
+ reshared_via: "Jaettu uudelleen"
show_original: "Näytä alkuperäinen"
search: "Haku"
services:
@@ -1010,7 +1027,7 @@ fi:
destroy:
success: "Tunnistuksen poisto onnistui."
failure:
- error: "palvelun yhdistämisessä tapahtui virhe"
+ error: "Palveluun yhdistämisessä tapahtui virhe"
finder:
fetching_contacts: "Diaspora etsii %{service}-ystäviäsi. Katso uudelleen muutaman minuutin kuluttua."
no_friends: "Facebook-kavereita ei löytynyt."
@@ -1020,19 +1037,19 @@ fi:
connect_to_tumblr: "Yhdistä Tumblriin"
connect_to_twitter: "Yhdistä Twitteriin"
connect_to_wordpress: "Yhdistä WordPressiin"
- disconnect: "katkaise yhteys"
+ disconnect: "Katkaise yhteys"
edit_services: "Muokkaa palveluita"
- logged_in_as: "kirjauduttu käyttäjänä"
+ logged_in_as: "Kirjauduttu käyttäjänä"
no_services: "Et ole vielä yhdistänyt palveluita."
- really_disconnect: "katkaise yhteys palveluun %{service}?"
+ really_disconnect: "Katkaistaanko yhteys palveluun %{service}?"
services_explanation: "Palveluihin yhdistäminen antaa sinulle mahdollisuuden julkaista Diasporaan lähettämäsi julkaisut myös niissä."
inviter:
click_link_to_accept_invitation: "Paina tätä linkkiä hyväksyäksesi kutsun"
join_me_on_diaspora: "Liity seuraani Diasporaan*"
remote_friend:
- invite: "kutsu"
+ invite: "Kutsu"
not_on_diaspora: "Ei vielä Diasporassa"
- resend: "lähetä uudelleen"
+ resend: "Lähetä uudelleen"
settings: "Asetukset"
share_visibilites:
update:
@@ -1047,16 +1064,18 @@ fi:
know_email: "Tiedätkö heidän sähköpostiosoitteitansa? Kutsu heidät!"
your_diaspora_username_is: "Diaspora-käyttäjätunnuksesi on: %{diaspora_handle}"
aspect_dropdown:
- add_to_aspect: "Lisää henkilö"
+ add_to_aspect: "Lisää kontakti"
+ mobile_row_checked: "%{name} (poista)"
+ mobile_row_unchecked: "%{name} (lisää)"
toggle:
one: "%{count} näkymässä"
other: "%{count} näkymässä"
- zero: "Lisää henkilö"
+ zero: "Lisää kontakti"
contact_list:
- all_contacts: "Kaikki henkilöt"
+ all_contacts: "Kaikki kontaktit"
footer:
- logged_in_as: "kirjauduttu sisään käyttäjällä %{name}"
- your_aspects: "näkymäsi"
+ logged_in_as: "Kirjauduttu sisään käyttäjänä %{name}"
+ your_aspects: "Näkymäsi"
invitations:
by_email: "Sähköpostilla"
dont_have_now: "Sinulla ei ole yhtään kutsua jäljellä, mutta lisää tulee pian!"
@@ -1072,7 +1091,7 @@ fi:
public_explain:
atom_feed: "Atom-syöte"
control_your_audience: "Hallitse yleisöäsi"
- logged_in: "kirjauduttu palveluun %{service}"
+ logged_in: "Kirjauduttu palveluun %{service}"
manage: "Hallitse yhdistettyjä palveluita"
new_user_welcome_message: "Käytä #hashtageja luokitellaksesi julkaisusi ja löytääksesi ihmisiä, jotka jakavat kiinnostuksen kohteesi. Kutsu upeita ihmisiä paikalle @Maininnoilla."
outside: "Julkiset julkaisut näkyvät Diasporan ulkopuolelle."
@@ -1080,8 +1099,8 @@ fi:
title: "Yhdistä ulkoisia palveluita"
visibility_dropdown: "Muuta tästä pudotusvalikosta julkaisusi näkyvyyttä. (Suosittelemme, että teet tästä ensimmäisestä julkaisustasi julkisen.)"
publisher:
- all: "kaikki"
- all_contacts: "kaikki henkilöt"
+ all: "Kaikki"
+ all_contacts: "Kaikki kontaktit"
discard_post: "Hylkää julkaisu"
formatWithMarkdown: "Voit käyttää %{markdown_link}-merkintäkieltä muotoillaksesi julkaisuasi"
get_location: "Nouda sijaintisi"
@@ -1090,7 +1109,7 @@ fi:
hello: "Hei kaikki, olen #%{new_user_tag}. "
i_like: "Kiinnostukseni kohteita ovat %{tags}."
invited_by: "Kiitos kutsusta, "
- newhere: "UusiTäällä"
+ newhere: "uusitäällä"
poll:
add_a_poll: "Lisää kysely"
add_poll_answer: "Lisää vastausvaihtoehto"
@@ -1110,7 +1129,7 @@ fi:
reshare: "Jaa uudelleen"
stream_element:
connect_to_comment: "Yhdistä tähän käyttäjään kommentoidaksesi hänen julkaisuaan"
- currently_unavailable: "kommentointi ei tällä hetkellä ole mahdollista"
+ currently_unavailable: "Kommentointi ei ole tällä hetkellä mahdollista"
dislike: "En tykkää"
hide_and_mute: "Piilota ja vaimenna julkaisu"
ignore_user: "Sivuuta %{name}"
@@ -1118,10 +1137,10 @@ fi:
like: "Tykkää"
nsfw: "Tämän julkaisun lähettäjä on merkinnyt sen ei-työturvalliseksi. %{link}"
shared_with: "Jaettu heidän kanssaan: %{aspect_names}"
- show: "näytä"
+ show: "Näytä"
unlike: "Peru tykkäys"
via: "%{link} kautta"
- via_mobile: "mobiililaitteen kautta"
+ via_mobile: "Mobiililaitteen kautta"
viewable_to_anyone: "Kuka tahansa verkossa näkee tämän julkaisun"
simple_captcha:
label: "Kirjoita kentässä oleva koodi:"
@@ -1130,6 +1149,20 @@ fi:
failed: "Ihmisen suorittama varmennus epäonnistui"
user: "Salainen kuva ja koodi olivat erilaiset"
placeholder: "Kirjoita kuvan arvo"
+ statistics:
+ active_users_halfyear: "Aktiivisia käyttäjiä puolen vuoden aikana"
+ active_users_monthly: "Aktiivisia käyttäjiä kuukausittain"
+ closed: "Suljettu"
+ disabled: "Ei käytettävissä"
+ enabled: "Käytettävissä"
+ local_comments: "Paikalliset kommentit"
+ local_posts: "Paikalliset julkaisut"
+ name: "Nimi"
+ network: "Verkko"
+ open: "Avaa"
+ services: "Palvelut"
+ total_users: "Käyttäjiä yhteensä"
+ version: "Versio"
status_messages:
create:
success: "Onnistuneesti mainittu: %{names}"
@@ -1139,12 +1172,11 @@ fi:
no_message_to_display: "Ei näytettäviä viestejä."
new:
mentioning: "Mainitse: %{person}"
- too_long:
- one: "tilapäivityksen merkkimäärä voi olla enimmillään %{count}"
- other: "tilapäivityksen merkkimäärä voi olla enimmillään %{count}"
- zero: "tilapäivityksen merkkimäärä voi olla enimmillään %{count}"
+ too_long: "Sinun täytyy lyhentää tilapäivitystäsi, sillä se voi sisältää enimmillään %{count} merkkiä. Tällä hetkellä päivityksessäsi on %{current_length} merkkiä."
stream_helper:
hide_comments: "Piilota kaikki kommentit"
+ no_more_posts: "Olet saavuttanut virran päätepisteen."
+ no_posts_yet: "Julkaisuja ei vielä ole."
show_comments:
few: "Näytä %{count} muuta kommenttia"
many: "Näytä %{count} muuta kommenttia"
@@ -1156,10 +1188,10 @@ fi:
activity:
title: "Oma toimintani"
aspects:
- title: "Näkymäsi"
+ title: "Näkymäni"
aspects_stream: "Näkymät"
comment_stream:
- contacts_title: "Ihmiset, joiden julkaisuaja olet kommentoinut"
+ contacts_title: "Ihmiset, joiden julkaisuja olet kommentoinut"
title: "Kommentoimasi julkaisut"
community_spotlight_stream: "Yhteisön valokeila"
followed_tag:
@@ -1183,7 +1215,6 @@ fi:
title: "Julkinen toiminta"
tags:
contacts_title: "Tästä tagista pitävät ihmiset"
- tag_prefill_text: "Puhuttaessa asiasta %{tag_name}, olen sitä mieltä että... "
title: "%{tags} merkityt julkaisut"
tag_followings:
create:
@@ -1196,16 +1227,13 @@ fi:
tags:
show:
follow: "Seuraa tagia #%{tag} "
- followed_by_people:
- one: "%{count} seuraaja"
- other: "%{count} seuraajaa"
- zero: "kukaan ei seuraa"
following: "Seurataan tagia #%{tag}"
- nobody_talking: "Kukaan ei vielä keskustele tagista %{tag}."
none: "Tyhjää tagia ei ole olemassa!"
- people_tagged_with: "Tagilla %{tag} merkityt ihmiset"
- posts_tagged_with: "Tagilla #%{tag} merkityt julkaisut"
stop_following: "Lopeta tagin #%{tag} seuraaminen"
+ tagged_people:
+ one: "1 henkilö merkitty tagilla %{tag}"
+ other: "%{count} henkilöä merkitty tagilla %{tag}"
+ zero: "Ketään ei ole merkitty tagilla %{tag}"
terms_and_conditions: "Käyttöehdot"
undo: "Peruuta?"
username: "Käyttäjätunnus"
@@ -1218,9 +1246,9 @@ fi:
success: "Tilisi on lukittu. Meiltä voi mennä 20 minuuttia tilisi sulkemiseen. Kiitos, kun kokeilit Diasporaa."
wrong_password: "Syötetty salasana ei vastannut nykyistä salasanaasi."
edit:
- also_commented: "...joku kommentoi julkaisua jota olet myös itse kommentoinut"
+ also_commented: "joku kommentoi julkaisua, jota olet itse kommentoinut"
auto_follow_aspect: "Näkymä automaattisesti seurattaville käyttäjille:"
- auto_follow_back: "Ryhdy jakamaan automaattisesti niiden henkilöiden kanssa, jotka alkavat jakamaan sinun kanssasi"
+ auto_follow_back: "Ryhdy jakamaan automaattisesti niiden käyttäjien kanssa, jotka alkavat jakaa sinun kanssasi"
change: "Vaihda"
change_email: "Vaihda sähköpostiosoite"
change_language: "Vaihda kieli"
@@ -1228,35 +1256,41 @@ fi:
character_minimum_expl: "täytyy olla vähintään kuusi merkkiä"
close_account:
dont_go: "Hei, älä lähde!"
- if_you_want_this: "Jos todella haluat tätä, kirjoita salasanasi alle ja napsauta 'Sulje käyttäjätili'"
- lock_username: "Tämä lukitsee käyttäjänimesi, jos päätät kirjautua uudelleen."
- locked_out: "Kirjaudut ulos ja käyttäjätilisi lukitaan."
- make_diaspora_better: "Haluamme sinun auttavan Diasporan parantamisessa, joten voit lähtemisen sijaan auttaa meitä. Jos haluat lähteä, haluamme sinun tietävän, mitä tapahtuu seuraavaksi."
+ if_you_want_this: "Jos todella haluat tämän tapahtuvan, kirjoita salasanasi alle ja napsauta 'Sulje käyttäjätili'"
+ lock_username: "Käyttäjänimesi lukitaan. Et pysty luomaan uutta tiliä tälle podille samalla ID:llä."
+ locked_out: "Sinut kirjataan ulos ja käyttäjätilisi lukitaan, kunnes tilisi on poistettu."
+ make_diaspora_better: "Näkisimme mielelläme sinun jäävän ja auttavan Diasporan parantamisessa lähtemisen sijaan. Jos kuitenkin haluat varmasti lähteä, käyttäjätilillesi suoritetaan seuraavat toimenpiteet:"
mr_wiggles: "Herra Töpö on surullinen, kun lähdet"
- no_turning_back: "Tällä hetkellä tästä ei ole paluuta."
- what_we_delete: "Poistamme kaikki julkaisusi ja profiilisi tiedot niin pian kuin se on inhimillisesti mahdollista. Kommenttisi jäävät paikoilleen, mutta ne yhdistetään Diaspora-tunnukseesi nimesi sijasta."
+ no_turning_back: "Tästä ei ole paluuta! Jos olet aivan varma, syötä salasanasi alle."
+ what_we_delete: "Poistamme kaikki julkaisusi ja profiilisi tiedot niin pian kuin se on mahdollista. Kommenttisi jäävät paikoilleen, mutta ne yhdistetään nimesi sijasta Diaspora-tunnukseesi."
close_account_text: "Sulje käyttäjätili"
- comment_on_post: "...joku kommentoi julkaisuasi"
+ comment_on_post: "joku kommentoi julkaisuasi"
current_password: "Nykyinen salasana"
current_password_expl: "se, jolla kirjaudut sisään..."
+ download_export: "Lataa profiilini"
+ download_export_photos: "Lataa kaikki kuvat"
download_photos: "Lataa kaikki kuvat"
- download_xml: "Lataa tiedot XML-muodossa"
edit_account: "Muokkaa käyttäjätiliä"
email_awaiting_confirmation: "Olemme lähettäneet sinulle aktivointilinkin osoitteeseen %{unconfirmed_email}. Jatkamme alkuperäisen osoitteesi %{email} käyttämistä siihen saakka, kunnes aktivoit uuden osoitteesi kyseisen linkin kautta."
export_data: "Vie tietoja"
+ export_in_progress: "Profiilidataasi käsitellään parhaillaan. Tarkista käsittelyn tila hetken kuluttua uudelleen."
+ export_photos_in_progress: "Kuvatiedostojasi käsitellään parhaillaan. Tarkista tilanne uudelleen hetken kuluttua."
following: "Jakamisen asetukset"
getting_started: "Uudet käyttäjäasetukset"
+ last_exported_at: "(Viimeksi päivitetty %{timestamp})"
liked: "joku tykkää julkaisustasi"
- mentioned: "...sinut mainitaan julkaisussa"
+ mentioned: "sinut mainitaan julkaisussa"
new_password: "Uusi salasana"
- photo_export_unavailable: "Kuvien vienti ei tällä hetkellä mahdollista"
- private_message: "...saat yksityisviestin"
+ private_message: "saat yksityisviestin"
receive_email_notifications: "Vastaanota sähköposti-ilmoituksia, kun:"
- reshared: "...joku jakaa julkaisusi uudelleen"
- show_community_spotlight: "Näytä Yhteisön Valokeila virrassa"
- show_getting_started: "Ota aloitusohjeet uudelleen käyttöön"
+ request_export: "Pyydä profiilidataani"
+ request_export_photos_update: "Päivitä kuvani"
+ request_export_update: "Päivitä profiilidatani"
+ reshared: "joku jakaa julkaisusi uudelleen"
+ show_community_spotlight: "Näytä \"yhteisön valokeila\" virrassa"
+ show_getting_started: "Näytä aloitusohjeet"
someone_reported: "joku lähetti ilmoituksen"
- started_sharing: "...aloittaa jakamaan kanssasi"
+ started_sharing: "joku alkaa jakaa kanssasi"
stream_preferences: "Virran asetukset"
your_email: "Sähköpostiosoitteesi"
your_handle: "Diaspora-tunnuksesi"
@@ -1273,7 +1307,9 @@ fi:
who_are_you: "Kuka olet?"
privacy_settings:
ignored_users: "Sivuutetut käyttäjät"
- stop_ignoring: "Lakkaa sivuuttamasta"
+ no_user_ignored_message: "Et sivuuta tällä hetkellä yhtäkään käyttäjää"
+ stop_ignoring: "Lopeta sivuuttaminen"
+ strip_exif: "Poista ladatuista kuvatiedostoista metadata, kuten sijainti, tekijä ja kameran malli (suositeltu)"
title: "Yksityisyysasetukset"
public:
does_not_exist: "Käyttäjää %{username} ei ole olemassa!"
@@ -1292,7 +1328,7 @@ fi:
webfinger:
fetch_failed: "webfinger-profiilin %{profile_url} haku epäonnistui"
hcard_fetch_failed: "tapahtui virhe haettaessa hcard:ia tilille %{account}"
- no_person_constructed: "Yhtäkään henkilöä ei pystytty kokoamaan tältä hcard:ilta."
+ no_person_constructed: "Yhtäkään henkilöä ei pystytty kokoamaan tältä hcardilta."
not_enabled: "webfinger-palvelua ei ilmeisesti ole aktivoitu tilin, %{account}, isännälle"
xrd_fetch_failed: "tapahtui virhe haettaessa xrd:tä käyttäjätilille %{account}"
welcome: "Tervetuloa!"
diff --git a/config/locales/diaspora/fil.yml b/config/locales/diaspora/fil.yml
index eb86ba7c0..ef6f6e684 100644
--- a/config/locales/diaspora/fil.yml
+++ b/config/locales/diaspora/fil.yml
@@ -70,10 +70,6 @@ fil:
confirm_remove_aspect: "Are you sure you want to delete this crew?"
make_aspect_list_visible: "make crew list visible?"
remove_aspect: "Fire this crew"
- few: "%{count} crews"
- helper:
- are_you_sure: "Are you sure you want to delete this crew?"
- aspect_not_empty: "Crew not empty"
index:
handle_explanation: "This is your diaspora id. Like an email address, you can give this to people to reach you."
help:
@@ -82,7 +78,6 @@ fil:
tag_feature: "#feature"
tag_question: "#question"
no_contacts: "No mateys"
- many: "%{count} crews"
new:
name: "Pangalan"
no_contacts_message:
@@ -94,10 +89,8 @@ fil:
family: "Kin"
friends: "Mateys"
work: "Shipmates"
- two: "%{count} aspects"
zero: "no aspects"
contacts:
- few: "%{count} contacts"
index:
add_to_aspect: "Add contacts to %{name}"
all_contacts: "All yer mateys"
@@ -248,10 +241,8 @@ fil:
people:
add_contact_small:
add_contact_from_tag: "magdagdag ng kakilala mula sa tag"
- few: "%{count} na tao"
helper:
results_for: " mga resulta para sa %{params}"
- many: "%{count} na tao"
one: "1 person"
other: "%{count} people"
person:
@@ -265,7 +256,6 @@ fil:
add_some: "magdagdag ng ilan"
edit: "baguhin"
you_have_no_tags: "wala ka pang mga tag!"
- two: "%{count} na tao"
zero: "no people"
photos:
new:
@@ -333,13 +323,7 @@ fil:
hide_and_mute: "Hide and Mute"
shared_with: "Fired at: %{aspect_names}"
status_messages:
- too_long:
- few: "please make your status messages less than %{count} characters"
- many: "please make your status messages less than %{count} characters"
- one: "please make your status messages less than %{count} character"
- other: "please make your status messages less than %{count} characters"
- two: "please make your status messages less than %{count} characters"
- zero: "please make your status messages less than %{count} characters"
+ too_long: "{\"few\"=>\"please make your status messages less than %{count} characters\", \"many\"=>\"please make your status messages less than %{count} characters\", \"one\"=>\"please make your status messages less than %{count} character\", \"other\"=>\"please make your status messages less than %{count} characters\", \"two\"=>\"please make your status messages less than %{count} characters\", \"zero\"=>\"please make your status messages less than %{count} characters\"}"
stream_helper:
show_comments:
few: "Show %{count} more comments"
diff --git a/config/locales/diaspora/fr.yml b/config/locales/diaspora/fr.yml
index 9ceaa927c..c6c2b3f31 100644
--- a/config/locales/diaspora/fr.yml
+++ b/config/locales/diaspora/fr.yml
@@ -12,6 +12,7 @@ fr:
_home: "Accueil"
_photos: "Photos"
_services: "Services"
+ _statistics: "Statistiques"
_terms: "conditions d'utilisation"
account: "Compte"
activerecord:
@@ -40,7 +41,7 @@ fr:
reshare:
attributes:
root_guid:
- taken: "C'est bon, hein ? Vous avez déjà repartagé ce message !"
+ taken: "C'est fini, oui ? Vous avez déjà repartagé ce message !"
user:
attributes:
email:
@@ -102,9 +103,13 @@ fr:
? "yes"
: Oui
user_search:
- account_closing_scheduled: "La fermeture du compte %{name} est plannifiée. Elle sera effectuée sous peu."
+ account_closing_scheduled: "La fermeture du compte %{name} est planifiée. Elle sera effectuée sous peu."
+ account_locking_scheduled: "Le compte de %{name} va être verrouillé dans quelques instants."
+ account_unlocking_scheduled: "Le compte de %{name} va être déverrouillé dans quelques instants."
add_invites: "ajouter des invitations"
are_you_sure: "Êtes-vous sûr de vouloir fermer ce compte ?"
+ are_you_sure_lock_account: "Êtes-vous sûr de vouloir verrouiller ce compte ?"
+ are_you_sure_unlock_account: "Êtes-vous sûr de vouloir déverrouiller ce compte ?"
close_account: "Fermer ce compte"
email_to: "Adresse électronique de la personne à inviter"
under_13: "Afficher les utilisateurs de moins de 13 ans"
@@ -113,12 +118,13 @@ fr:
other: "%{count} utilisateurs trouvés"
zero: "aucun utilisateur trouvé"
view_profile: "Afficher le profil"
- you_currently: "Il vous reste actuellement %{user_invitation} invitations %{link}"
+ you_currently:
+ other: "Il vous reste actuellement %{user_invitation} invitations %{link}"
weekly_user_stats:
amount_of:
- one: "nombre de nouveaux utilisateurs cette semaine: %{count}"
- other: "nombre de nouveaux utilisateurs cette semaine: %{count}"
- zero: "nombre de nouveaux utilisateurs cette semaine: aucun"
+ one: "%{count} nouvel utilisateur cette semaine."
+ other: "%{count} nouveaux utilisateurs cette semaine."
+ zero: "Aucun nouvel utilisateur cette semaine."
current_server: "La date actuelle du serveur est %{date}"
ago: "Il y a %{time}"
all_aspects: "Tous les aspects"
@@ -127,7 +133,7 @@ fr:
unknown_person: "Personne inconnue"
video_title:
unknown: "Titre de vidéo inconnu"
- are_you_sure: "Êtes-vous certain-e ?"
+ are_you_sure: "Êtes-vous certain ?"
are_you_sure_delete_account: "Souhaitez-vous vraiment supprimer votre compte ? Cette action est définitive !"
aspect_memberships:
destroy:
@@ -136,10 +142,8 @@ fr:
success: "La personne a été retirée de l'aspect"
aspects:
add_to_aspect:
- failure: "L’ajout du contact à l’aspect a échoué."
- success: "Le contact a été ajouté à l’aspect."
- aspect_contacts:
- done_editing: "fin de la modification"
+ failure: "L’ajout du contact à l'aspect a échoué."
+ success: "Le contact a été ajouté à l'aspect."
aspect_listings:
add_an_aspect: "+ Ajouter un aspect"
deselect_all: "Tout désélectionner"
@@ -152,36 +156,31 @@ fr:
contacts_not_visible: "Les contacts dans cet aspect ne se verront pas les uns les autres."
contacts_visible: "Les contacts dans cet aspect pourront se voir entre eux."
create:
- failure: "La création de l’aspect a échoué."
- success: "Votre nouvel aspect %{name} a été créé."
+ failure: "La création de l'aspect a échoué."
+ success: "Un nouvel aspect %{name} a été créé."
destroy:
failure: "%{name} n'est pas vide et n'a pas pu être supprimé."
success: "%{name} a été supprimé."
edit:
- add_existing: "Ajouter un contact existant"
+ aspect_chat_is_enabled: "Les contacts de cet aspect peuvent chatter avec vous."
+ aspect_chat_is_not_enabled: "Les contacts de cet aspect ne peuvent pas chatter avec vous."
aspect_list_is_not_visible: "Les contacts dans cet aspect ne peuvent pas se voir entre eux."
aspect_list_is_visible: "Les contacts dans cet aspect peuvent se voir entre eux."
confirm_remove_aspect: "Voulez-vous vraiment supprimer cet aspect ?"
- done: "Terminé"
- make_aspect_list_visible: "permettre aux contacts de cet aspect de se voir entre eux ?"
- manage: "Gérer"
+ grant_contacts_chat_privilege: "permettre aux contacts de cet aspect de chatter avec vous ?"
+ make_aspect_list_visible: "Permettre aux contacts de cet aspect de se voir entre eux ?"
remove_aspect: "Supprimer cet aspect"
- rename: "renommer"
+ rename: "Renommer"
set_visibility: "Régler la visibilité"
- update: "mettre à jour"
- updating: "mise à jour"
- few: "%{count} aspects"
- helper:
- are_you_sure: "Voulez-vous vraiment supprimer cet aspect ?"
- aspect_not_empty: "L’aspect n’est pas vide"
- remove: "supprimer"
+ update: "Mettre à jour"
+ updating: "En cours de mise à jour"
index:
diaspora_id:
content_1: "Votre identifiant diaspora* est :"
- content_2: "Communiquez-le à tout le monde et ils pourront vous trouver sur Diaspora."
+ content_2: "Communiquez-le à n'importe qui et il pourra vous trouver sur diaspora*."
heading: "Identifiant diaspora*"
donate: "Faire un don"
- handle_explanation: "Ceci est votre identifiant diaspora*. Comme une adresse de courrier électronique, vous pouvez le communiquer à d'autres personnes pour leur permettre de vous joindre."
+ handle_explanation: "Ceci est votre identifiant diaspora*. Comme une adresse de courrier électronique, communiquez-le à d'autres personnes pour leur permettre de vous contacter."
help:
any_problem: "Un problème ?"
contact_podmin: "Contacter l'administrateur de votre pod !"
@@ -191,7 +190,7 @@ fr:
feature_suggestion: "... une %{link} ?"
find_a_bug: "... trouvé un %{link} ?"
have_a_question: "... une %{link} ?"
- here_to_help: "La communauté Diaspora est là !"
+ here_to_help: "La communauté diaspora* est là !"
mail_podmin: "E-mail du podmin"
need_help: "Besoin d'aide ?"
tag_bug: "bug"
@@ -200,31 +199,26 @@ fr:
tutorial_link_text: "Tutoriels"
tutorials_and_wiki: "%{faq}, %{tutorial} & %{wiki} : Aide pour les débutants."
introduce_yourself: "Ceci est votre flux. Rejoignez-nous et présentez-vous."
- keep_diaspora_running: "Participez à un développement rapide de Diaspora avec un don mensuel !"
+ keep_diaspora_running: "Participez à un développement rapide de diaspora* par un don mensuel !"
keep_pod_running: "Permettez à %{pod} de fonctionner rapidement et offrez une dose de café mensuelle à nos serveurs !"
new_here:
follow: "Suivez %{link} et souhaitez la bienvenue aux nouveaux utilisateurs de diaspora* !"
learn_more: "En savoir plus"
- title: "Bienvenue Nouvel Utilisateur"
+ title: "Accueillir les nouveaux utilisateurs"
no_contacts: "Aucun contact"
no_tags: "+ Trouver un tag à suivre"
people_sharing_with_you: "Personnes partageant avec vous"
- post_a_message: "publier un message >>"
+ post_a_message: "Publier un message >>"
services:
- content: "Vous pouvez connecter les services suivants à Diaspora :"
+ content: "Vous pouvez connecter les services suivants à diaspora* :"
heading: "Services connectés"
- unfollow_tag: "Arrêter de suivre #%{tag}"
- welcome_to_diaspora: "Bienvenue sur Diaspora*, %{name} !"
- many: "%{count} aspects"
- move_contact:
- error: "Erreur lors du déplacement du contact : %{inspect}"
- failure: "n'a pas fonctionné %{inspect}"
- success: "Personne déplacée vers le nouvel aspect"
+ unfollow_tag: "Ne plus suivre #%{tag}"
+ welcome_to_diaspora: "Bienvenue sur diaspora*, %{name} !"
new:
create: "Créer"
name: "Nom (uniquement visible par vous)"
no_contacts_message:
- community_spotlight: "actualités de la communauté"
+ community_spotlight: "Actualités de la communauté"
or_spotlight: "Ou vous pouvez partager avec %{link}"
try_adding_some_more_contacts: "Vous pouvez rechercher ou inviter plus de contacts."
you_should_add_some_more_contacts: "Vous devez ajouter un peu plus de contacts !"
@@ -237,17 +231,9 @@ fr:
family: "Famille"
friends: "Amis"
work: "Travail"
- selected_contacts:
- manage_your_aspects: "Gérer vos aspects."
- no_contacts: "Vous n'avez encore aucun contact."
- view_all_community_spotlight: "Voir toutes les actualités de la communauté"
- view_all_contacts: "Afficher tous les contacts"
- show:
- edit_aspect: "modifier l'aspect"
- two: "%{count} aspects"
update:
- failure: "Votre aspect %{name} a un nom trop long pour être enregistré."
- success: "Votre aspect « %{aspect_name} » a été modifié."
+ failure: "Votre aspect %{name} a un nom trop long."
+ success: "Votre aspect %{name} a été modifié."
zero: "aucun aspect"
back: "Retour"
blocks:
@@ -258,51 +244,45 @@ fr:
failure: "Je ne pouvais plus cesser d'ignorer cet utilisateur. #evasion"
success: "Voyons ce qu'ils ont à dire ! #sayhello"
bookmarklet:
- explanation: "Publiez sur Diaspora depuis n'importe où en ajoutant %{link} à vos marque-pages."
+ explanation: "Publiez sur diaspora* depuis n'importe où en ajoutant %{link} à vos marque-pages."
heading: "Bookmarklet"
- post_something: "Publiez sur Diaspora"
+ post_something: "Publiez sur diaspora*"
post_success: "Publié ! Fermeture !"
cancel: "Annuler"
comments:
- few: "%{count} commentaires"
- many: "%{count} commentaires"
new_comment:
comment: "Commenter"
commenting: "Commentaire en cours d'envoi..."
one: "1 commentaire"
other: "%{count} commentaires"
- two: "%{count} commentaires"
- zero: "aucun commentaire"
+ zero: "Aucun commentaire"
contacts:
create:
failure: "Impossible de créer le contact"
- few: "%{count} contacts"
index:
add_a_new_aspect: "Ajouter un nouvel aspect"
- add_to_aspect: "ajouter les contacts à %{name}"
- add_to_aspect_link: "ajoutez les contacts à %{name}"
+ add_contact: "Ajouter ce contact"
+ add_to_aspect: "Ajouter les contacts à %{name}"
all_contacts: "Tous les contacts"
- community_spotlight: "Actualités de la communauté"
- many_people_are_you_sure: "Voulez-vous vraiment commencer une conversation privée avec plus de %{suggested_limit} contacts ? Envoyer des messages à cet aspect peut être un meilleur moyen de les contacter."
+ community_spotlight: "Actualité de la communauté"
my_contacts: "Mes Contacts"
no_contacts: "On dirait que vous avez besoin d'ajouter quelques contacts !"
+ no_contacts_in_aspect: "Vous n'avez pas encore de contacts dans cet aspect. Voici une liste des contacts existants que vous pouvez ajouter à cet aspect."
no_contacts_message: "Consultez %{community_spotlight}"
- no_contacts_message_with_aspect: "Consultez %{community_spotlight} ou %{add_to_aspect_link}"
only_sharing_with_me: "Partage uniquement avec moi"
- remove_person_from_aspect: "Enlever %{person_name} de \"%{aspect_name}\""
+ remove_contact: "Retirer ce contact"
start_a_conversation: "Démarrer une conversation"
title: "Contacts"
+ user_search: "Checher un contact"
your_contacts: "Vos contacts"
- many: "%{count} contacts"
one: "1 contact"
other: "%{count} contacts"
sharing:
people_sharing: "Personnes partageant avec vous :"
spotlight:
- community_spotlight: "Actualités de la communauté"
+ community_spotlight: "Actualité de la communauté"
suggest_member: "Suggérer un membre"
- two: "%{count} contacts"
- zero: "contact"
+ zero: "Aucun contact"
conversations:
conversation:
participants: "Participants"
@@ -311,7 +291,8 @@ fr:
no_contact: "Hé, vous avez besoin d'ajouter le contact d'abord !"
sent: "Message envoyé"
destroy:
- success: "La conversation a été supprimée."
+ delete_success: "Conversation effacée avec succès"
+ hide_success: "Conversation masquée avec succès"
helper:
new_messages:
few: "%{count} nouveaux messages"
@@ -325,19 +306,20 @@ fr:
create_a_new_conversation: "commencer une nouvelle discussion"
inbox: "Boîte de réception"
new_conversation: "Nouvelle discussion"
- no_conversation_selected: "aucune conversation sélectionnée"
- no_messages: "aucun message"
+ no_conversation_selected: "Aucune conversation sélectionnée"
+ no_messages: "Aucun message"
new:
abandon_changes: "Abandonner les changements ?"
send: "Envoyer"
sending: "Envoi…"
- subject: "sujet"
- to: "pour"
+ subject: "Sujet"
+ to: "Pour"
new_conversation:
fail: "Message invalide"
show:
- delete: "supprimer et bloquer la conversation"
- reply: "répondre"
+ delete: "Supprimer la conversation"
+ hide: "masquer et mettre en muet la conversation"
+ reply: "Répondre"
replying: "Réponse en cours d'envoi..."
date:
formats:
@@ -353,7 +335,7 @@ fr:
login_try_again: "Merci de vous <a href='%{login_link}'>connecter</a> et d'essayer de nouveau."
post_not_public: "Le message que vous essayez de voir n'est pas public !"
post_not_public_or_not_exist: "Le message que vous essayez de voir n'est pas public, ou n'existe pas !"
- fill_me_out: "Remplissez-moi"
+ fill_me_out: "Écrire ici"
find_people: "Rechercher des personnes ou des #tags"
help:
account_and_data_management:
@@ -361,7 +343,7 @@ fr:
close_account_q: "Comment puis-je supprimer mon compte ?"
data_other_podmins_a: "Une fois que vous avez partagé avec des personnes d'un autre pod, chacun des messages que vous partagez avec eux ainsi qu'une copie des informations de votre profil sont stockés sur leur pod, et sont accessibles par l'administrateur de la base de données de ce pod. Quand vous supprimez un message ou des informations de votre profil ces données sont supprimées de votre pod et de tous les autres pods sur lesquels elles étaient stockées."
data_other_podmins_q: "Est-ce que les administrateurs des autres pods peuvent voir mes informations ?"
- data_visible_to_podmin_a: "La communication entre les pods est toujours chiffrée (en utilisant SSL et le propre chiffrage d'échange de diaspora*), mais le stockage des données sur les pods ne sont pas chiffrés. S'il le veut, l'administrateur de la base de données de votre pod (généralement la personne qui administre le pod) peut accéder à toutes les données de profil et à tous vos messages (comme c'est le cas pour la plupart des sites web qui stockent des données d'utilisateurs). Utiliser votre propre pod fournit plus de vie privée parce que vous avez le contrôle de l'accès à la base de données."
+ data_visible_to_podmin_a: "La communication *entre* les pods est toujours chiffrée (en utilisant SSL et le propre chiffrage d'échange de diaspora*), mais le stockage des données sur les pods n'est pas chiffré. S'il le veut, l'administrateur de la base de données de votre pod (généralement la personne qui gère le pod) peut accéder à toutes les données de profil et à tout ce que vous publiez (comme c'est le cas pour la plupart des sites web qui stockent des données d'utilisateurs). Utiliser votre propre pod garantit plus de vie privée parce que vous avez le contrôle de l'accès à la base de données."
data_visible_to_podmin_q: "Quelle quantité de mes informations l'administrateur du pod peut-il voir ?"
download_data_a: "Oui. En bas de l'onglet Compte de votre page de paramètres il y a deux boutons pour télécharger vos données."
download_data_q: "Puis-je télécharger une copie de toutes les données contenues dans mon compte ?"
@@ -373,50 +355,63 @@ fr:
change_aspect_of_post_q: "Une fois que j'ai publié quelque chose, puis-je changer les aspects qui peuvent le voir ?"
contacts_know_aspect_a: "Non, ils ne peuvent en aucun cas voir le nom des aspects où vous les avez placés."
contacts_know_aspect_q: "Est-ce que mes contacts savent dans quels aspects je les ai mis ?"
- contacts_visible_a: "Si vous cochez cette option, les contacts de cet aspect pourront voir qui d'autres est présent dedans, sur votre page de profil en dessous de votre image. Il est préférable de choisir cette option uniquement si tous les contacts de cet aspect se connaissent mutuellement. Ils ne pourront toutefois pas voir le nom de l'aspect."
- contacts_visible_q: "Que signifie \"rendre les contacts dans cet aspect visibles entre eux\" ?"
- delete_aspect_a: "Dans la liste des aspects sur le côté gauche de la page principale, pointez votre souris sur l'aspect que vous désirez supprimer. Cliquez sur le petit crayon d'édition qui apparaît sur la droite. Clique sur le bouton de suppression dans la boîte qui apparait."
- delete_aspect_q: "Comment puis-je supprimer un aspect ?"
- person_multiple_aspects_a: "Oui. Allez sur votre page de contacts et cliquez sur \"Mes Contacts\". Pour chaque contact, vous pouvez utiliser le menu sur la droite pour l'ajouter (ou le retirer) d'autant d'aspects que vous le souhaitez. Ou, vous pouvez l'ajouter à un nouvel aspect (ou le retirer d'un aspect) en cliquant sur le bouton de sélection des aspects sur leur page de profil. Ou, vous pouvez même juste passer le pointeur de votre souris sur leur nom là où vous le voyez dans le flux et une carte de visite va apparaître. Vous pouvez changer les aspects auxquels ils appartiennent directement dedans."
+ contacts_visible_a: "Si vous cochez cette option, les contacts de cet aspect pourront voir qui d'autre est présent dedans, sur votre page de profil en dessous de votre image. Il est préférable de choisir cette option uniquement si tous les contacts de cet aspect se connaissent mutuellement. Ils ne pourront toutefois pas voir le nom de l'aspect."
+ contacts_visible_q: "Que signifie « rendre les contacts dans cet aspect visibles entre eux » ?"
+ delete_aspect_a: "Dans la liste des aspects sur le côté gauche de la page principale, pointez votre souris sur l aspect que vous désirez supprimer. Cliquez sur le petit crayon d'édition qui apparaît sur la droite. Clique sur le bouton de suppression dans la boîte qui apparaît."
+ delete_aspect_q: "Comment puis-je supprimer une aspect ?"
+ person_multiple_aspects_a: "Oui. Allez sur votre page de contacts et cliquez sur Mes contacts. Pour chaque contact, vous pouvez utiliser le menu sur la droite pour l'ajouter (ou le retirer) d'autant de aspects que vous le souhaitez. Ou, vous pouvez l'ajouter à un nouvel aspect (ou le retirer d'un aspect) en cliquant sur le bouton de sélection des aspects sur sa page de profil. Ou encore, vous pouvez même juste passer le pointeur de votre souris sur son nom là où vous le voyez dans le flux et un « carte de visite » va apparaître. Vous pouvez changer les aspects auxquels ils appartiennent directement dedans."
person_multiple_aspects_q: "Puis-je ajouter une personne à plusieurs aspects ?"
- post_multiple_aspects_a: "Oui. Quand vous êtes en train d'écrire un message, utilisez le bouton de sélection des aspects pour sélectionner ou désélectionner des aspects. Votre message sera visible par tous les aspects que vous sélectionnez. Vous pouvez aussi sélectionner les aspects auxquels vous voulez partager dans le panneau latéral. Lorsque vous partagez, le(s) aspect(s) que vous avez sélectionné(s) dans la liste sur la gauche seront automatiquement sélectionnés dans le sélectionneur d'aspects quand vous écrivez un nouveau message."
+ post_multiple_aspects_a: "Oui. Quand vous êtes en train d'écrire un message, utilisez le bouton de sélection des aspects pour sélectionner ou désélectionner des aspects. Votre message sera visible par tous les aspects que vous sélectionnez. Vous pouvez aussi sélectionner les aspects auxquels vous voulez partager dans le panneau latéral. Lorsque vous partagez, le(s) aspect(s) que vous avez sélectionné(s) dans la liste sur la gauche seront automatiquement sélectionnés dans le sélectionneur de aspects quand vous écrivez un nouveau message."
post_multiple_aspects_q: "Puis-je envoyer un message à plusieurs aspects à la fois ?"
remove_notification_a: "Non."
- remove_notification_q: "Si je supprime quelqu'un de l'un de mes aspects, ou toutes les personnes d'un aspect, sont elles prévenues ?"
+ remove_notification_q: "Si je supprime quelqu'un de l'un de mes aspects, ou toutes les personnes d'un aspect, sont-elles prévenues ?"
rename_aspect_a: "Oui. Dans votre liste d'aspects sur le côté gauche de la page principale, placez votre souris sur l'aspect que vous voulez renommer. Cliquez sur le petit crayon \"éditer\" qui apparaît sur la droite. Cliquez sur \"renommer\" dans la boîte qui apparaît."
rename_aspect_q: "Puis-je renommer un aspect ?"
- restrict_posts_i_see_a: "Oui. Cliquez sur Mes Aspects dans la barre latérale puis cliquez sur des aspects individuels dans la liste pour les sélectionner ou les déselectionner. Seuls les messages des personnes de ces aspects apparaîtront dans votre flux."
- restrict_posts_i_see_q: "Puis-je afficher uniquement les messages de certains aspects ?"
+ restrict_posts_i_see_a: "Oui. Cliquez sur Mes aspects dans la barre latérale puis cliquez sur l'un ou l'autre aspect dans la liste pour les sélectionner ou les retirer. Seuls les messages des personnes appartenant à ces aspects apparaîtront dans votre flux."
+ restrict_posts_i_see_q: "Puis-je afficher uniquement les messages de certaines aspects ?"
title: "Aspects"
- what_is_an_aspect_a: "Les Aspects sont un moyen de grouper vos contacts sur diaspora*. Un Aspect est l'une des facettes que vous montrez au monde. Cela pourrait être qui vous êtes au travail, ou qui vous êtes pour votre famille, ou qui vous êtes pour les amis de votre club ou association."
+ what_is_an_aspect_a: "Les aspects sont le moyen de grouper vos contacts sur diaspora*. Un aspect est l'une des faces que vous montrez au monde. Cela pourrait être qui vous êtes au travail, ou qui vous êtes pour votre famille, ou qui vous êtes pour les amis de votre club ou association."
what_is_an_aspect_q: "Qu'est-ce qu'un aspect ?"
- who_sees_post_a: "Si vous créez un message privé, il sera uniquement visible par les gens que vous avez placé dans cet aspect (ou les aspects, si vous le publiez à plusieurs aspects). Les contacts que vous avez et qui ne sont pas dans ces aspects n'ont aucun moyen de voir le message, sauf si vous l'avez rendu public. Seuls les messages publics seront visibles à quiconque ne sera pas placé dans vos aspects."
+ who_sees_post_a: "Si vous créez un message privé, il sera uniquement visible par les gens que vous avez placés dans cet aspect (ou les aspects, si vous le publiez à plusieurs aspects). Les contacts que vous avez et qui ne sont pas dans ces aspects n'ont aucun moyen de voir le message, sauf si vous l'avez rendu public. Seuls les messages publics seront visibles à quiconque ne sera pas placé dans vos aspects."
who_sees_post_q: "Lorsque je publie un message dans un aspect, qui peut le voir ?"
- foundation_website: "site internet de la fondation diaspora"
+ chat:
+ add_contact_roster_a: |-
+ Tout d'abord, vous devez activer le chat pour l'un des aspects dans lequel cette personne se trouve. Pour ce faire, allez sur %{contacts_page}, sélectionnez l'aspect désiré et cliquez sur l'icône du chat pour activer le chat pour cet aspect.
+ %{toggle_privilege} Vous pouvez, si vous préférez, créer un aspect dédié appeler "Chat" et ajouter les personnes avec qui vous souhaitez discuter dans cet aspect. Une fois fait, ouvrez l'interface du chat et sélectionner la personne avec qui vous souhaitez discuter.
+ add_contact_roster_q: "Comment chatter avec quelqu'un dans diaspora* ?"
+ contacts_page: "page des contacts"
+ title: "Chat"
+ faq: "FAQ"
+ foundation_website: "site Internet de la fondation diaspora*"
getting_help:
- get_support_a_hashtag: "posez une question dans un message public sur diaspora* en utilisant le hashtag %{question}"
+ get_support_a_faq: "Lire la page %{faq} de notre wiki"
+ get_support_a_hashtag: "Posez une question dans un message public sur diaspora* en utilisant le hashtag %{question}"
get_support_a_irc: "rejoignez-nous sur %{irc} (Tchat instantané)"
get_support_a_tutorials: "référez-vous à nos %{tutorials}"
get_support_a_website: "visitez notre %{link}"
get_support_a_wiki: "recherchez dans le %{link}"
get_support_q: "Que faire si ma question n'a pas de réponse dans la FAQ ? À quels autres endroits puis-je obtenir de la documentation ?"
- getting_started_a: "Vous avez de la chance. Essayez la %{tutorial_series} sur notre site web. Elle vous montrera pas à pas les étapes d'inscription et vous apprendra toutes les choses de base à savoir concernant l'utilisation de diaspora*."
+ getting_started_a: "Vous avez de la chance. Essayez la %{tutorial_series} sur le site web du projet. Elle vous guidera pas à pas dans les étapes d'inscription et vous apprendra toutes les bases concernant l'utilisation de diaspora*."
getting_started_q: "Aidez-moi ! J'ai besoin d'un peu d'aide pour débuter !"
title: "Obtenir de l'aide"
getting_started_tutorial: "Série de tutoriels \"Mes premiers pas\""
here: "ici"
irc: "IRC"
keyboard_shortcuts:
- keyboard_shortcuts_a1: "Dans le flux, vous pouvez utiliser les raccourcis clavier suivant :"
+ keyboard_shortcuts_a1: "Dans le flux, vous pouvez utiliser les raccourcis clavier suivants :"
keyboard_shortcuts_li1: "j - Aller au message suivant"
keyboard_shortcuts_li2: "k - Aller au message précédent"
keyboard_shortcuts_li3: "c - Commenter le message courant"
keyboard_shortcuts_li4: "l - Aimer le message courant"
+ keyboard_shortcuts_li5: "r - Repartager ce message"
+ keyboard_shortcuts_li6: "m - Afficher l'ensemble du message"
+ keyboard_shortcuts_li7: "o - Ouvrir le premier lien de ce message"
+ keyboard_shortcuts_li8: "ctrl + entrée - Envoyer le message en cours de rédaction"
keyboard_shortcuts_q: "Quels sont les raccourcis clavier existants ?"
title: "Raccourcis clavier"
markdown: "Markdown"
mentions:
- how_to_mention_a: "Tapez le symbole \"@\" et commencez à taper leur nom. Un menu déroulant devrait apparaître pour vous permettre de les choisir plus facilement. Notez qu'il est uniquement possible de mentionner des gens que vous avez ajouté à un aspect."
+ how_to_mention_a: "Tapez le symbole \"@\" et commencez à taper leur nom. Un menu déroulant devrait apparaître pour vous permettre de les choisir plus facilement. Notez qu'il est uniquement possible de mentionner des gens que vous avez ajoutés à un aspect."
how_to_mention_q: "Comment puis-je mentionner quelqu'un lorsque je rédige un message ?"
mention_in_comment_a: "Non, pas pour le moment."
mention_in_comment_q: "Puis-je mentionner quelqu'un dans un commentaire ?"
@@ -430,25 +425,25 @@ fr:
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_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 utilisateurs à partir de la section Photos de la barre latérale de son profil."
+ 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 ?"
- subscribe_feed_a: "Oui, mais ce n'est pas encore une fonctionnalité terminée et le formatage des résultats est encore un peu brute. Si vous voulez toutefois l'essayer, allez sur la page de profil de quelqu'un et cliquez sur le bouton de flux RSS de votre navigateur, ou vous pouvez copier l'URL du profil (ex : https://joindiaspora.com/people/somenumber, et le coller dans un lecteur de flux RSS. Le résultat du flux ressemble à ceci : https://joindiaspora.com/public/username.atom. Diaspora utilise Atom plutôt que RSS."
+ subscribe_feed_a: "Oui, mais cette fonctionnalité est encore imparfaite et le formatage des résultats reste assez rustique. Si vous voulez tout de même l'essayer, allez sur la page de profil de quelqu'un et cliquez sur le bouton de flux RSS de votre navigateur. Ou alors, vous pouvez copier l'adresse du profil (p. ex. https://joindiaspora.com/people/un-nombre) et la coller dans un lecteur de flux RSS. L'adresse de flux qui en résultera ressemblera à https://joindiaspora.com/public/nom-d-utilisateur.atom : en effet, diaspora* utilise Atom plutôt que RSS."
subscribe_feed_q: "Puis-je m'inscrire aux messages publics d'une personne avec un lecteur de flux ?"
title: "Divers"
pods:
find_people_a: "Invitez vos amis en utilisant le lien de courriel dans la barre latérale. Suivez des #tags pour découvrir d'autres gens partageants vos intérêts, et ajoutez ceux qui publient des choses qui vous intéressent dans un aspect. Annoncez que vous être #nouveauici dans un message public."
find_people_q: "Je viens de rejoindre un pod, comment puis-je trouver des personnes pour partager avec elles ?"
title: "Pods"
- use_search_box_a: "Si vous connaissez leur identifiant diaspora* complet (ex : nomdutilisateur@nomdupod.org), vous pouvez les trouver en les recherchant avec. Si vous êtes sur le même pod vous pouvez les retrouver avec uniquement nomdutilisateur. Une alternative est de les rechercher par leur nom de profil (le nom que vous voyez à l'écran). Si une recherche ne fonctionne pas la première fois, réessayez un petit peu plus tard."
+ use_search_box_a: "Si vous connaissez leur identifiant diaspora* complet (p. ex. : nomdutilisateur@nomdupod.org), vous pouvez les trouver par ce biais. Si vous êtes sur le même pod vous pouvez les retrouver juste avec leur nom d'utilisateur. Une alternative est de les rechercher par leur nom de profil (le nom que vous voyez à l'écran). Si une recherche ne donne rien la première fois, réessayez un peu plus tard."
use_search_box_q: "Comment dois-je utiliser le champ de recherche pour trouver quelqu'un en particulier ?"
- what_is_a_pod_a: "Un pod est un serveur faisant tourner le logiciel diaspora* et connecté au réseau diaspora*. \"Pod\" est une métaphore pour le pot de plantes, chaque compte utilisateur étant une graine dans le pot. Il y a beaucoup de pods différents. Vous pouvez communiquer avec vos amis de la même manière peu importe le pod où ils sont. (Vous pouvez comparer un pod diaspora* à un fournisseur d'adresses email : il y a les pods publics, les pods privés, et avec quelques efforts vous pouvez installer le votre)."
+ what_is_a_pod_a: "Un pod est un serveur faisant tourner le logiciel diaspora* et connecté au réseau diaspora*. \"Pod\" désigne en anglais les cosses de certaines plantes, chaque compte utilisateur étant métaphoriquement une graine dans la cosse. Il y a beaucoup de pods différents. Vous pouvez communiquer avec vos amis de la même manière, peu importe le pod où ils sont. Vous pouvez comparer un pod diaspora* à un fournisseur d'adresses courriel : il y a les pods publics, les pods privés, et avec quelques efforts vous pouvez même installer le vôtre."
what_is_a_pod_q: "Qu'est-ce qu'un pod ?"
posts_and_posting:
char_limit_services_a: "Dans ce cas votre publication est limitée au nombre minimum de caractères (140 pour Twitter; 1000 pour Tumblr), et le nombre de caractères restant est affiché lorsque l'icône de ce service est sélectionnée. Vous pouvez toujours poster sur ces services si votre publication est plus longue que la limite, mais le texte sera tronqué sur ces services."
- char_limit_services_q: "Quelle est la limite de caractères pour les messages partagés avec un service connecté qui à une limite de caractères plus petite ?"
+ 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 (ex : http://www.youtube.com/watch?v=nnnnnnnnnnn) au sein de votre message et la vidéo ou l'audio seront intégrés automatiquement. Les quelques sites qui sont supportés sont : Youtube, Vimeo, SoundCloud, Flickr et bien d'autres. Diaspora* utilise oEmbed pour cette version. Nous supportons de nouveaux sites tout le temps. Souvenez-vous de toujours publier des liens complets et simples : pas de liens raccourcis, pas d'opérateurs après l'URL de base; et laissez-lui un peu de temps avant de rafraîchir la page après avoir publié un message pour voir son 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. 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_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.) ?"
@@ -461,90 +456,101 @@ fr:
insert_images_comments_a2: "cela peut être utilisé pour insérer des images à partir du web dans les commentaires ou les messages."
insert_images_comments_q: "Puis-je insérer des images dans un commentaire ?"
insert_images_q: "Comment puis-je insérer des images dans un message ?"
+ post_location_a: "Dans l'éditeur, cliquez sur l'icône en forme d'épingle à côté de l'appareil photo. Ceci va insérer votre emplacement à partir d'OpenStreetMap. Vous pourrez modifier votre position - pour inclure uniquement la ville plutôt que la rue par exemple."
+ post_location_q: "Comment puis-je ajouter ma position à un message ?"
+ post_notification_a: "Vous trouverez une icône en forme de cloche à côté du X en haut à droite d'un message. Cliquez sur cette option pour activer ou désactiver les notifications pour ce message."
+ post_notification_q: "Comment puis-je activer ou désactiver les notifications pour un message ?"
+ post_poll_a: "Cliquez sur l'icône en forme de graphique pour générer un sondage. Saisissez une question et au moins deux réponses. N'oubliez pas de rendre votre message public si vous souhaitez que tout le monde puisse participer à votre sondage."
+ post_poll_q: "Comment puis-je ajouter un sondage à mon message ?"
+ post_report_a: "Cliquez sur l'icône en forme de triangle d'alerte en haut à droite du message à signaler à votre podmin puis saisissez une raison dans la boîte de dialogue."
+ post_report_q: "Comment puis-je signaler un message offensant ?"
size_of_images_a: "Non. Les images sont automatiquement redimensionnées pour s'adapter au flux. Markdown n'a pas de code pour spécifier la taille d'une image."
size_of_images_q: "Puis-je améliorer la taille des images dans les messages ou les commentaires ?"
stream_full_of_posts_a1: "Votre flux est constitué de trois types de messages:"
- stream_full_of_posts_li1: "Les publications des personnes avec qui vous êtes en train de partager vont appraître sous deux formes : les messages publics et les messages limités à l'aspect avec lequel vous partagez. Pour retirer ces publications de votre flux, cessez simplement de partager avec la personne."
+ stream_full_of_posts_li1: "Les publications des personnes avec qui vous êtes en train de partager vont apparaître sous deux formes : les messages publics et les messages limités à l'aspect avec lequel vous partagez. Pour retirer ces publications de votre flux, cessez simplement de partager avec la personne."
stream_full_of_posts_li2: "Les messages publics contiennent l'un des tags que vous suivez. Pour les supprimer, cessez de suivre le tag."
- stream_full_of_posts_li3: "Les messages publics des personnes affichés dans la liste des gens mis en valeur. Ils peuvent être supprimés en décochant l'option \"Montrer les personnes mises en valeur ?\" dans l'onglet Compte de vos paramètres."
- stream_full_of_posts_q: "Pourquoi mon flux est-il plein de messages provenants de personnes que je ne connais pas et avec lesquelles je ne partage pas ?"
+ stream_full_of_posts_li3: "Les messages publics des personnes affichées dans la liste des gens mis en valeur. Ils peuvent être supprimés en décochant l'option \"Montrer les personnes mises en valeur ?\" dans l'onglet Compte de vos paramètres."
+ stream_full_of_posts_q: "Pourquoi mon flux est-il plein de messages provenant de personnes que je ne connais pas et avec lesquelles je ne partage pas ?"
title: "Messages et publications"
private_posts:
can_comment_a: "Seuls les utilisateurs placés dans cet aspect et connectés à diaspora* peuvent commenter ou aimer votre message privé."
can_comment_q: "Qui peut commenter ou aimer mon message privé ?"
- can_reshare_a: "Personne. Les messages privés ne sont pas repartageables. Les utilisateurs identifiés dans diaspora* dans cet aspect peuvent potentiellement le copier et le coller cependant."
+ can_reshare_a: "Personne. Il n'est pas permis de repartage un message privé. Cependant, les utilisateurs appartenant à cet aspect sont susceptibles de le copier et le coller."
can_reshare_q: "Qui peut repartager mes messages privés ?"
- see_comment_a: "Seuls les gens avec qui le message a été partagé (les gens qui sont dans les aspects sélectionnés par le rédacteur original) peuvent voir ses commentaires et les aimer. "
+ see_comment_a: "Seuls les gens avec qui le message a été partagé (les gens qui sont dans les aspects sélectionnés par le rédacteur original) peuvent voir ses commentaires et les \"j'aime\". "
see_comment_q: "Lorsque je commente ou que j'aime un message privé, qui peut le voir ?"
title: "Messages privés"
who_sees_post_a: "Seuls les utilisateurs placés dans cet aspect et connectés à diaspora* peuvent voir votre message privé."
- who_sees_post_q: "Lorsque j'envois un message à un aspect (ex : un message privé), qui peut le voir ?"
+ who_sees_post_q: "Lorsque j'envoie un message à un aspect (c'est-à-dire un message privé), qui peut le voir ?"
private_profiles:
title: "Profils privés"
- whats_in_profile_a: "La biographie, la localisation, le sexe, et l'anniversaire. Ce sont les éléments dans le bas de la section de l'édition de la page de profil. Toutes ces informations sont optionnelles - c'est à vous de décider si vous les renseignez ou nin. Les utilisateurs connectés que vous avez ajouté à vos aspects sont les seuls qui peuvent lire votre profil privé. Ils verront aussi les messages privés publiés dans les aspects dont ils font partie, mélangés avec vos publications publiques, lorsque ils visiteront votre page de profil."
+ whats_in_profile_a: "La biographie, la localisation, le genre, et l'anniversaire. Ce sont les éléments dans le bas de la section de l'édition de la page de profil. Toutes ces informations sont optionnelles — c'est à vous de décider si vous les renseignez ou non. Les utilisateurs connectés que vous avez ajoutés à vos aspects sont les seuls qui peuvent lire votre profil privé. Ils verront aussi les messages privés publiés dans les aspects dont ils font partie, mélangés avec vos publications publiques, lorsqu'ils visiteront votre page de profil."
whats_in_profile_q: "Qu'est ce que mon profil privé ?"
- who_sees_profile_a: "N'importe quel utilisateur avec qui vous êtes en train de partager (ce qui signifie que vous avez ajouté dans l'un de vos aspects). Cependant, les gens qui vous suivent, mais que vous ne suivez pas, verrons uniquement vos informations publiques."
+ who_sees_profile_a: "N'importe quel utilisateur connecté avec lequel vous partagez (ce qui signifie que vous l'avez ajouté dans l'un de vos aspects). Les gens qui vous suivent, mais que vous ne suivez pas, verrons uniquement vos informations publiques."
who_sees_profile_q: "Qui peut voir mon profil privé ?"
- who_sees_updates_a: "N'importe qui dans vos aspects peuvent voir les modifications de votre profil privé. "
+ who_sees_updates_a: "N'importe qui dans vos aspects peut voir les modifications de votre profil privé. "
who_sees_updates_q: "Qui peut voir les mises à jour de mon profil privé ?"
public_posts:
- can_comment_reshare_like_a: "N'importe quel utilisateur connecté à diaspora* peut commenter, repartager, ou aimer votre post public."
+ can_comment_reshare_like_a: "N'importe quel utilisateur connecté à diaspora* peut commenter, repartager, ou aimer votre message public."
can_comment_reshare_like_q: "Qui peut commenter, repartager, ou aimer mon message public ?"
- deselect_aspect_posting_a: "Dé-sélectionner des aspects n'affectera pas les messages publics. Ils apparaîtront toujours dans le flux de tous vos contacts. Pour rendre un message visible seulement à des aspects spécifiques, vous avez besoin de sélectionner ces aspects via le bouton sous la publication en cours de rédaction."
- deselect_aspect_posting_q: "Que ce passe t-il lorsque je dé-sélectionne un ou plusieurs aspects au moment ou je rédige un message public ?"
- find_public_post_a: "Les messages publics apparaîtront dans le flux de tout ceux qui vous suivent. Si vous incluez des #tags dans votre message public, tout ceux qui suivent ces tags trouveront votre message dans leurs flux. Tout message public a aussi une URL spécifique que n'importe qui peut voir, sauf s'ils ne sont pas connectés - ces messages publiques peuvent êtres échangés directement sur Twitter, les blogs, etc. Les messages publics peuvent aussi être indexés par les moteurs de recherche."
- find_public_post_q: "Comment les autres personnes peuvent elles trouver mes messages publics ?"
- see_comment_reshare_like_a: "N'importe quel utilisateur connecté à diaspora* et n'importe qui d'autre sur internet. Les commentaires, \"likes\", et repartages des messages publics sont aussi publics."
+ deselect_aspect_posting_a: "Décocher des aspects n'affectera pas les messages publics : ils apparaîtront toujours dans le flux de tous vos contacts. Pour qu'un message ne soit visible qu'à certains aspects, vous devez sélectionner ces aspects via le bouton qui se trouve sous la boite de rédaction."
+ deselect_aspect_posting_q: "Que se passe-t-il lorsque je décoche un ou plusieurs aspects au moment où je rédige un message public ?"
+ find_public_post_a: "Les messages publics apparaîtront dans le flux de tous ceux qui vous suivent. Si vous incluez des #tags dans votre message public, tous ceux qui suivent ces tags trouveront votre message dans leurs flux. Tout message public a aussi une URL spécifique que n'importe qui peut voir, sauf s'ils ne sont pas connectés - ces messages publics peuvent êtres échangés directement sur Twitter, les blogs, etc. Les messages publics peuvent aussi être indexés par les moteurs de recherche."
+ find_public_post_q: "Comment les autres personnes peuvent-elles trouver mes messages publics ?"
+ see_comment_reshare_like_a: "N'importe quel utilisateur connecté à diaspora* et n'importe qui d'autre sur Internet. Les commentaires, « j'aime », et repartages des messages publics sont aussi publics."
see_comment_reshare_like_q: "Lorsque je commente, repartage, ou aime un message public, qui peut le voir ?"
title: "Messages publics"
who_sees_post_a: "N'importe qui utilisant internet peut potentiellement voir un message que vous marquez comme public, donc soyez sûrs de vouloir rendre ce message public. C'est le meilleur moyen de s'ouvrir sur le monde."
who_sees_post_q: "Lorsque je publie quelque chose publiquement, qui peut le voir ?"
public_profiles:
title: "Profils publics"
- what_do_tags_do_a: "Ils aident les gens à mieux vous connaître. Votre photo de profil apparaîtra également dans le panneau latéral sur la gauche des pages de ces tags, au milieu de tout le monde les ayant dans leur profil public."
+ what_do_tags_do_a: "Ils aident les gens à mieux vous connaître. Votre photo de profil apparaîtra également dans le panneau latéral sur la gauche des pages de ces tags, avec tous ceux qui les ont dans leur profil public."
what_do_tags_do_q: "Qu'est ce que font les tags sur mon profil public ?"
- whats_in_profile_a: "Votre nom, les cinq tags que vous choisissez pour vous décrire, et votre photo. C'est l'ensemble des éléments dans la partie haute de votre page d'édition de profil. Vous pouvez créer un profil avec des informations vous identifiant ou vous laissant anonyme selon votre souhait. Votre page de profil montre uniquement les messages publics que vous avez crée."
- whats_in_profile_q: "Qu'il-y-a t-il dans mon profil public ?"
- who_sees_profile_a: "N'importe quel utilisateur de diaspora* connecté ainsi que plus généralement internet peut le voir. Chaque profil a une URL directe, permettant d'avoir un lien pointant dessus sur des sites extérieurs. Il peut être indexé par les moteurs de recherche."
+ whats_in_profile_a: "Votre nom, les cinq tags que vous choisissez pour vous décrire, et votre photo. C'est l'ensemble des éléments dans la partie haute de votre page d'édition de profil. Vous pouvez créer un profil avec des informations vous identifiant ou vous laissant anonyme selon votre souhait. Votre page de profil montre uniquement les messages publics que vous avez créés."
+ whats_in_profile_q: "Qu'y a-t-il dans mon profil public ?"
+ who_sees_profile_a: "N'importe quel utilisateur connecté à diaspora*, ainsi que le reste d'Internet, peut le voir. Chaque profil a une URL directe, permettant d'avoir un lien pointant dessus depuis des sites extérieurs. Il peut être indexé par les moteurs de recherche."
who_sees_profile_q: "Qui peut voir mon profil public ?"
- who_sees_updates_a: "N'importe qui peut voir ces changements si il visite votre page de profil."
+ who_sees_updates_a: "N'importe qui peut voir ces changements en visitant votre page de profil."
who_sees_updates_q: "Qui peut voir les mises à jour de mon profil public ?"
resharing_posts:
reshare_private_post_aspects_a: "Non, il n'est pas possible de repartager un message privé. Ceci dans le but de respecter les intentions du rédacteur initial qui souhaite uniquement partager avec un groupe particulier de personnes."
- reshare_private_post_aspects_q: "Puis repartager un message privé uniquement avec certains aspects ?"
- reshare_public_post_aspects_a: "Non, lorsque vous repartagez un message public il devient automatiquement l'un de vos messages publics. Pour le partager avec certaines aspects, copiez et collez le contenu du message dans un nouveau."
- reshare_public_post_aspects_q: "Puis repartager un message public uniquement avec certains aspects ?"
+ reshare_private_post_aspects_q: "Puis-je repartager un message privé uniquement avec certains aspects ?"
+ reshare_public_post_aspects_a: "Non, lorsque vous repartagez un message public il devient automatiquement l'un de vos messages publics. Pour le partager avec certains aspects, copiez et collez le contenu du message dans un nouveau."
+ reshare_public_post_aspects_q: "Puis-je repartager un message public uniquement avec certains aspects ?"
title: "Repartager les messages."
sharing:
add_to_aspect_a1: "Imaginons qu'Amy ajoute Ben dans un aspect, mais Ben n'a pas (encore) ajouté Amy dans un aspect :"
add_to_aspect_a2: "On dit que c'est un partage asymétrique. Si Ben ajoute aussi Amy dans un aspect alors cela deviendra un partage mutuel, avec les messages publics et privés de Amy et Ben, et leurs messages privés concernés dans leurs flux, etc. "
- add_to_aspect_li1: "Ben recevra une notifications indiquant que Amy \"a commencé à partager\" avec Ben."
+ add_to_aspect_li1: "Ben recevra une notification indiquant que Amy « a commencé à partager » avec Ben."
add_to_aspect_li2: "Amy commencera à voir les messages publics de Ben dans son flux."
add_to_aspect_li3: "Amy ne verra aucun des messages privés de Ben."
add_to_aspect_li4: "Ben ne verra pas les messages publics ou privés d'Amy dans son flux."
- add_to_aspect_li5: "Mais si Ben se rend sur la page de profil d'Amy, alors il verra les messages privés d'Amy qu'elle a rédigé pour l'aspect dans lequel il se trouve (de la même façon que ses messages publics qui peuvent êtres vu par tout le monde)."
+ add_to_aspect_li5: "Mais si Ben se rend sur la page de profil d'Amy, alors il verra les messages privés d'Amy qu'elle a rédigé pour l'aspect dans lequel il se trouve (de la même façon que ses messages publics qui peuvent être vu par tout le monde)."
add_to_aspect_li6: "Ben sera autorisé à voir le profil privé d'Amy (bio, localisation, genre, anniversaire)."
- add_to_aspect_li7: "Amy apparaîtra en tant que \"Seulement en train de partager avec moi\" sur la page des contacts de Ben."
- add_to_aspect_q: "Que ce passe t-il lorsque j'ajoute quelqu'un dans l'un de mes aspects ? Ou lorsque quelqu'un m'ajoute dans l'un de ses aspects ?"
+ add_to_aspect_li7: "Amy apparaîtra en tant que « Seulement en train de partager avec moi » sur la page des contacts de Ben."
+ add_to_aspect_li8: "Amy sera également capable de @mentionner Ben dans un message."
+ add_to_aspect_q: "Que se passe-t-il lorsque j'ajoute quelqu'un dans l'un de mes aspects ? Ou lorsque quelqu'un m'ajoute dans l'un de ses aspects ?"
list_not_sharing_a: "Non. Mais vous pouvez voir si quelqu'un partage avec vous en visitant sa page de profil. Si c'est le cas, la barre sous son image de profil sera verte. Si non, elle sera grise. Vous devriez recevoir une notification à chaque fois qu'une personne commence à partager avec vous."
- list_not_sharing_q: "Existe-il une liste des personnes que j'ai ajouté à un de mes aspects mais qui ne m'ont pas ajouté à l'un des leurs ?"
- only_sharing_a: "Il y a des personnes qui vous ont ajouté dans l'un de leurs aspects, mais qui ne font pas (encore) partie de l'un des votres. En d'autres termes, ils partagent avec vous, mais vous ne partagez pas avec eux (partage asymétrique). Si vous les ajoutez dans un aspect, ils apparaîtront dans cet aspect et pas dans \"partage uniquement avec vous\". Voir ci-dessus."
+ list_not_sharing_q: "Existe-t-il une liste des personnes que j'ai ajoutées à un de mes aspects mais qui ne m'ont pas ajouté à l'une des leurs ?"
+ only_sharing_a: "Il y a des personnes qui vous ont ajouté dans l'un de leurs aspect, mais qui ne font pas (encore) partie de l'un des vôtres. En d'autres termes, ils partagent avec vous, mais vous ne partagez pas avec eux (partage asymétrique). Si vous les ajoutez dans un aspect, ils apparaîtront dans cet aspect et pas dans « partage uniquement avec vous ». Voir ci-dessus."
only_sharing_q: "Qui sont les gens listés dans \"Partage seulement avec moi\" de ma page de contacts ?"
- see_old_posts_a: "Non. Ils seront seulement autorisés à voir vos nouveaux messages pour cet aspect. Ils (et n'importe qui d'autre) peuvent voir vos vieux messages publics sur votre page de profil, et ils les verront aussi dans leur flux."
- see_old_posts_q: "Lorsque j'ajoute quelqu'un dans un aspect, peut-il voir les anciens messages que j'ai déjà publié dans cet aspect ?"
+ see_old_posts_a: "Non. Ceux que vous venez d'ajouter seront seulement autorisés à voir vos nouveaux messages pour cet aspect. Ils (et n'importe qui d'autre) peuvent voir vos anciens messages publics sur votre page de profil, et ils les verront aussi dans leur flux."
+ see_old_posts_q: "Lorsque j'ajoute quelqu'un dans un aspect, peut-il voir les anciens messages que j'ai déjà publiés dans cet aspect ?"
+ sharing_notification_a: "Vous devriez recevoir une notification à chaque fois que quelqu'un commence à partager avec vous."
+ sharing_notification_q: "Comment puis-je savoir quand quelqu'un commence à partager avec moi ?"
title: "Partage"
tags:
filter_tags_a: "Ce n'est pas encore possible directement via diaspora*, mais certains %{third_party_tools} permettant cela ont été écrits."
filter_tags_q: "Comment puis-je filtrer/exclure certaines tags de mon flux ?"
- followed_tags_a: "Après avoir recherché un tag vous pouvez cliquer sur le bouton en haut de la page de tags pour \"suivre\" ce tag. Il apparaîtra dans votre liste de tags suivis sur la gauche. Cliquer sur l'un des tags que vous suivez vous emmène sur la page du tag donc vous pouvez voir les messages récents contenant le tag. Cliquez sur \"#Tags suivis\" pour voir un flux de messages incluant l'un ou l'intégralité des tags que vous suivez. "
+ followed_tags_a: "Après avoir recherché un tag vous pouvez cliquer sur le bouton en haut de la page de tags pour \"suivre\" ce tag. Il apparaîtra dans votre liste de tags suivis sur la gauche. Cliquer sur l'un des tags que vous suivez vous emmène sur la page du tag donc vous pouvez voir les messages récents contenant le tag. Cliquez sur \"#Tags suivis\" pour voir un flux de messages incluant l'un des tags que vous suivez ou leur intégralité. "
followed_tags_q: "Que sont les \"#Tags Suivis\" et comment puis-je suivre un tag ?"
people_tag_page_a: "Il y a des personnes qui ont listé ce tag pour se décrire elles-même dans leur profil public."
people_tag_page_q: "Qui sont les personnes listées sur la partie gauche d'une page de tag ?"
tags_in_comments_a: "Un tag ajouté dans un commentaire apparaîtra toujours sous forme de lien pointant sur la page de ce tag, mais cela ne fera pas apparaître ce message (ou ce commentaire) sur la page du tag. Cela fonctionne uniquement pour les tags dans un message."
tags_in_comments_q: "Puis-je insérer des tags dans un commentaire ou juste dans des messages ?"
title: "Tags"
- what_are_tags_for_a: "Les tags sont une manière de catégoriser un message, généralement par sujets. Rechercher un tag montre tous les messages avec ce tag que vous pouvez voir (à la fois dans les messages publics et privés). Cela laisse les personnes qui sont intéressées par un sujet précis trouver les messages publics le concernant."
- what_are_tags_for_q: "A quoi servent les tags ?"
+ what_are_tags_for_a: "Les tags sont une manière de catégoriser un message, généralement par sujets. Rechercher un tag montre tous les messages avec ce tag que vous pouvez voir (à la fois dans les messages publics et privés). Cela permet aux personnes qui sont intéressées par un sujet précis de trouver les messages publics le concernant."
+ what_are_tags_for_q: "À quoi servent les tags ?"
third_party_tools: "outils tiers"
title_header: "Aide"
tutorial: "tutoriel"
@@ -573,16 +579,16 @@ fr:
new:
already_invited: "Les personnes suivantes n'ont pas accepté votre invitation :"
aspect: "Aspect"
- check_out_diaspora: "Essayez Diaspora !"
+ check_out_diaspora: "Essayez diaspora* !"
codes_left:
one: "Plus qu'une invitation disponible avec ce code."
other: "Encore %{count} invitations disponibles avec ce code."
zero: "Plus d'invitation disponible avec ce code."
comma_separated_plz: "Vous pouvez entrer plusieurs adresses de courrier électronique séparées par des virgules."
- if_they_accept_info: "s'ils acceptent, ils seront ajoutés à l'aspect dans lequel vous les avez invités."
- invite_someone_to_join: "Inviter quelqu'un à rejoindre Diaspora !"
+ if_they_accept_info: "s'ils acceptent, ils seront ajoutés à l'aspect auquel vous les avez invités."
+ invite_someone_to_join: "Invitez quelqu'un à rejoindre diaspora* !"
language: "Langue"
- paste_link: "Partagez ce lien auprès de vos amis pour les inviter sur Diaspora*, ou bien envoyez-leur directement le lien par courriel."
+ paste_link: "Partagez ce lien auprès de vos amis pour les inviter sur diaspora*, ou bien envoyez-leur directement le lien par courriel."
personal_message: "Message personnel"
resend: "Envoyer à nouveau"
send_an_invitation: "Envoyer une invitation"
@@ -592,18 +598,18 @@ fr:
layouts:
application:
back_to_top: "Retour en haut"
- powered_by: "PROPULSÉ PAR diaspora*"
- public_feed: "Flux diaspora* public pour %{name}"
+ powered_by: "Propulsé par diaspora*"
+ public_feed: "Flux diaspora* public de %{name}"
source_package: "téléchargez le code source"
- toggle: "activer/désactiver la version mobile"
+ toggle: "Activer/désactiver la version mobile"
whats_new: "Quoi de neuf ?"
- your_aspects: "vos aspects"
+ your_aspects: "Vos aspects"
header:
- admin: "admin"
- blog: "blog"
- code: "code"
+ admin: "Adminstrateur"
+ blog: "Blog"
+ code: "Code"
help: "Aide"
- login: "connexion"
+ login: "Connexion"
logout: "Déconnexion"
profile: "Profil"
recent_notifications: "Notifications"
@@ -621,20 +627,20 @@ fr:
people_like_this:
one: "%{count} personne aime"
other: "%{count} personnes aiment"
- zero: "Personne n'aime ça"
+ zero: "Personne n'aime"
people_like_this_comment:
one: "%{count} personne aime"
other: "%{count} personnes aiment"
zero: "Personne n'aime ça"
limited: "Limité"
more: "Plus"
- next: "suivant"
+ next: "Suivant"
no_results: "Aucun résultat trouvé"
notifications:
also_commented:
- one: "%{actors} a également commenté sur %{post_link} de %{post_author}."
- other: "%{actors} ont également commenté sur %{post_link} de %{post_author}."
- zero: "%{actors} a également commenté sur %{post_link} de %{post_author}."
+ one: "%{actors} a également commenté sur le message %{post_link} de %{post_author}."
+ 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é."
@@ -642,7 +648,7 @@ fr:
comment_on_post:
one: "%{actors} a commenté votre message %{post_link}."
other: "%{actors} ont commenté votre message %{post_link}."
- zero: "%{actors} a commenté sur votre %{post_link}."
+ zero: "%{actors} n'a commenté sur votre message %{post_link}."
helper:
new_notifications:
few: "%{count} nouvelles notifications"
@@ -669,23 +675,24 @@ fr:
mark_read: "Marquer comme lu"
mark_unread: "Marquer comme non lu"
mentioned: "Vous mentionnant"
+ no_notifications: "Vous ne avez pas encore de notifications."
notifications: "Notifications"
reshared: "Repartagé"
show_all: "montrer tout"
show_unread: "montrer les non-lus"
started_sharing: "A commencé à partager"
liked:
- one: "%{actors} a aimé votre %{post_link}."
- other: "%{actors} ont aimé votre %{post_link}."
- zero: "%{actors} a aimé votre %{post_link}."
+ one: "%{actors} a aimé votre message %{post_link}."
+ other: "%{actors} ont aimé votre message %{post_link}."
+ zero: "%{actors} a aimé votre message %{post_link}."
liked_post_deleted:
one: "%{actors} a aimé votre message supprimé."
other: "%{actors} ont aimé votre message supprimé."
zero: "%{actors} a aimé votre message supprimé."
mentioned:
- one: "%{actors} vous a mentionné(e) dans un %{post_link}."
- other: "%{actors} vous ont mentionné(e) dans un %{post_link}."
- zero: "%{actors} vous a mentionné(e) dans un %{post_link}."
+ one: "%{actors} vous a mentionné(e) dans le message %{post_link}."
+ 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é."
@@ -696,52 +703,113 @@ fr:
other: "%{actors} vous ont envoyé un message."
zero: "%{actors} vous a envoyé un message."
reshared:
- one: "%{actors} a repartagé votre %{post_link}."
- other: "%{actors} ont repartagé votre %{post_link}."
- zero: "%{actors} a repartagé votre %{post_link}."
+ one: "%{actors} a repartagé votre message %{post_link}."
+ other: "%{actors} ont repartagé votre message %{post_link}."
+ zero: " %{actors} n'a repartagé votre message %{post_link}."
reshared_post_deleted:
- one: "%{actors} a partagé le message que vous avez supprimé."
- other: "%{actors} ont partagé le message que vous avez supprimé."
- zero: "%{actors} a partagé votre message supprimé."
+ one: "%{actors} a repartagé le message que vous avez supprimé."
+ other: "%{actors} ont repartagé le message que vous avez supprimé."
+ zero: "%{actors} n'a repartagé votre message supprimé."
started_sharing:
one: "%{actors} a commencé à partager avec vous."
other: "%{actors} ont commencé à partager avec vous."
zero: "%{actors} a commencé à partager avec vous."
notifier:
+ a_limited_post_comment: "Vous avez un nouveau commentaire sur un message à visibilité limitée."
a_post_you_shared: "un message."
+ a_private_message: "Vous avez un nouveau message privé à consulter sur diaspora*."
accept_invite: "Acceptez votre invitation sur diaspora* !"
- click_here: "cliquez ici"
+ click_here: "Cliquez ici"
comment_on_post:
reply: "Répondre ou voir le message de %{name} >"
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}"
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: |-
+ Bonjour %{name},
+
+ Vos données personnelles ont été traitées et vous pouvez à présent les télécharger en cliquant sur [ce lien](%{url}).
+
+ Cordialement,
+
+ Le messager automatique de diaspora*
+ subject: "Vos données personnelles sont prêtes à être téléchargées, %{name}"
+ export_failure_email:
+ body: |-
+ Bonjour %{name},
+
+ Il y a eu un problème lors du traitement de vos données personnelles en vue d'un téléchargement.
+ Merci de bien vouloir réessayer.
+
+ Avec toutes nos excuses,
+
+ Le messager automatique de diaspora*
+ subject: "Il y a eu un problème avec vos données, %{name}"
+ export_photos_email:
+ body: |-
+ Bonjour %{name},
+
+ Vos photos ont été préparées et sont prêtes à être téléchargées en suivant [ce lien](%{url}).
+
+ Cordialement,
+
+ Le messager automatique de diaspora*
+ subject: "%{name}, vos photos sont prêtes à être téléchargées."
+ export_photos_failure_email:
+ body: |-
+ Bonjour %{name},
+
+ Il y a eu un problème lors du traitement de vos photos en vue d'un téléchargement.
+ Merci de bien vouloir réessayer.
+
+ Avec toutes nos excuses,
+
+ Le messager automatique de diaspora*
+ subject: "Il y a eu un problème avec vos photos, %{name}"
hello: "Bonjour %{name} !"
invite:
message: |-
Bonjour !
- Vous avez été invité-e à rejoindre Diaspora* !
+ Vous avez été invité(e) à rejoindre diaspora* !
- Pour commencer, cliquez sur ce lien :
+ Cliquez sur ce lien pour vous lancer dans l'aventure :
%{invite_url}
Bien le bonjour chez vous,
- Le robot de courriel de Diaspora*
+ Le messager automatique de diaspora*
[1] : %{invite_url}
invited_you: "%{name} vous a invité(e) sur diaspora*"
liked:
- liked: "%{name} a épinglé votre message"
+ liked: "%{name} a aimé votre message"
view_post: "Voir le message >"
mentioned:
mentioned: "vous a mentionné(e) dans un message :"
subject: "%{name} vous a mentionné(e) sur diaspora*"
private_message:
reply_to_or_view: "Répondre ou voir cette conversation >"
+ remove_old_user:
+ body: |-
+ Bonjour,
+
+ En raison de l'inactivité de votre compte diaspora* %{pod_url}, nous sommes au regret de vous informer que le système l'a identifié comme devant être supprimé automatiquement. Cette procédure se déclenche après une période d'inactivité supérieure à %{after_days} jours.
+
+ Vous pouvez éviter la perte de votre compte en vous connectant à celui-ci avant %{remove_after}, dans ce cas la procédure de suppression sera automatiquement annulée.
+
+ Cette maintenance est effectuée pour assurer aux utilisateurs actifs le meilleur fonctionnement possible de cette instance de diaspora*. Nous vous remercions de votre compréhension.
+
+ Si vous souhaitez conserver votre compte, veuillez vous identifier ici :
+ %{login_url}
+
+ Nous espérons vous revoir bientôt !
+
+ Le messager automatique de diaspora*
+ subject: "Votre compte diaspora* a été signalé comme devant être supprimé en raison de son inactivité"
report_email:
body: |-
Bonjour,
@@ -755,7 +823,7 @@ fr:
Cordialement,
- Le robot d'email de diaspora*
+ Le messager automatique de diaspora*
[1]: %{url}
subject: "Un nouveau %{type} a été marqué comme offensant."
@@ -766,8 +834,8 @@ fr:
reshared: "%{name} a repartagé votre message"
view_post: "Voir le message >"
single_admin:
- admin: "Votre administrateur Diaspora"
- subject: "Un message concernant votre compte Diaspora :"
+ admin: "Votre administrateur diaspora*"
+ subject: "Un message concernant votre compte diaspora* :"
started_sharing:
sharing: "a commencé à partager avec vous !"
subject: "%{name} a commencé à partager avec vous sur diaspora*"
@@ -786,7 +854,6 @@ fr:
add_contact_from_tag: "ajouter ce contact à partir de ce tag"
aspect_list:
edit_membership: "modifier l'appartenance à vos aspects"
- few: "%{count} personnes"
helper:
is_not_sharing: "%{name} ne partage pas avec vous"
is_sharing: "%{name} partage avec vous"
@@ -800,11 +867,10 @@ fr:
search_handle: "Utilisez leur identifiant diaspora* (nomutilisateur@urldupod) pour être sûr de trouver vos amis."
searching: "Recherche en cours, veuillez patienter ..."
send_invite: "Toujours rien ? Envoyez leur une invitation !"
- many: "%{count} personnes"
one: "1 personne"
other: "%{count} personnes"
person:
- add_contact: "ajouter un contact"
+ add_contact: "Ajouter un contact"
already_connected: "Déjà connecté"
pending_request: "Requête en attente"
thats_you: "C'est vous !"
@@ -816,7 +882,7 @@ fr:
in_aspects: "dans les aspects"
location: "Localisation"
photos: "Photos"
- remove_contact: "supprimer ce contact"
+ remove_contact: "Supprimer ce contact"
remove_from: "Supprimer %{name} de %{aspect} ?"
show:
closed_account: "Ce compte a été fermé."
@@ -829,18 +895,17 @@ fr:
not_connected: "Vous n'êtes pas connecté(e) avec cette personne"
recent_posts: "Messages récents"
recent_public_posts: "Messages publics récents"
- return_to_aspects: "Retourner à votre page des aspects"
+ return_to_aspects: "Retourner à la page de vos aspects"
see_all: "Tout afficher"
- start_sharing: "commencer à partager"
+ start_sharing: "Commencer à partager"
to_accept_or_ignore: "accepter ou ignorer ceci"
sub_header:
add_some: "ajouter quelques"
- edit: "modifier"
- you_have_no_tags: "vous n'avez pas de tags !"
- two: "%{count} personnes"
+ edit: "Modifier"
+ you_have_no_tags: "Vous n'avez pas de tag !"
webfinger:
fail: "Impossible de trouver %{handle}."
- zero: "personne"
+ zero: "Personne"
photos:
comment_email_subject: "photo de %{name}"
create:
@@ -867,7 +932,7 @@ fr:
show:
collection_permalink: "Lien permanent à la collection"
delete_photo: "Supprimer la photo"
- edit: "modifier"
+ edit: "Modifier"
edit_delete_photo: "Modifier la description de la photo / supprimer la photo"
make_profile_photo: "Choisir comme photo de profil"
show_original_post: "Montrer le message original"
@@ -880,20 +945,20 @@ fr:
title: "Un message de %{name}"
show:
destroy: "Supprimer"
- not_found: "Désolé, nous n'avons pas pu trouver ce message."
- permalink: "lien permanent"
+ not_found: "Impossible de trouver ce message."
+ permalink: "Lien permanent"
photos_by:
one: "Une photo par %{author}"
other: "%{count} photos par %{author}"
zero: "Pas de photo par %{author}"
reshare_by: "Repartagé par %{author}"
- previous: "précédent"
+ previous: "Précédent"
privacy: "Vie privée"
privacy_policy: "Règles de confidentialité"
profile: "Profil"
profiles:
edit:
- allow_search: "Permettre à tous de vous rechercher dans Diaspora"
+ allow_search: "Permettre à tous de vous rechercher dans diaspora*"
edit_profile: "Modifier le profil"
first_name: "Prénom"
last_name: "Nom de famille"
@@ -923,9 +988,9 @@ fr:
two: "%{count} réactions"
zero: "0 réaction"
registrations:
- closed: "Les inscriptions sont fermées sur ce pod Diaspora."
+ closed: "Les inscriptions sont fermées sur ce pod diaspora*."
create:
- success: "Vous avez rejoint Diaspora !"
+ success: "Vous avez rejoint diaspora* !"
edit:
cancel_my_account: "Clôturer mon compte"
edit: "Modifier %{name}"
@@ -935,15 +1000,12 @@ fr:
update: "Mettre à jour"
invalid_invite: "Le lien d'invitation que vous avez fourni n'est plus valide !"
new:
- continue: "CONTINUER"
create_my_account: "Créer mon compte !"
- diaspora: "<3 Diaspora*"
email: "COURRIEL"
enter_email: "Saisissez une adresse de courrier électronique"
enter_password: "Saisissez un mot de passe (d'au moins six caractères)"
enter_password_again: "Saisissez à nouveau le même mot de passe"
enter_username: "Choisissez un nom d'utilisateur (uniquement des lettres, chiffres et caractères de soulignement)"
- hey_make: "HÉ !<br/>FAÎTES<br/>QUELQUE CHOSE."
join_the_movement: "Rejoignez le mouvement !"
password: "MOT DE PASSE"
password_confirmation: "CONFIRMATION DU MOT DE PASSE"
@@ -957,21 +1019,21 @@ fr:
comment_label: "<b>Commentaire</b>:<br>%{data}"
confirm_deletion: "Etes vous vraiment sur de vouloir supprimer cet élément ?"
delete_link: "Supprimer l’élément"
- not_found: "<u>Le message/commentaire n'a pas été trouvé. Il a pu être supprimé par l'utilisateur !</u>"
+ not_found: "<u>Le message/commentaire n'a pas été trouvé. On dirait qu'il a été supprimé par l'utilisateur !</u>"
post_label: "<b>Message</b>: %{title}"
reason_label: "Raison : %{text}"
reported_label: "<b>Signalé par</b> %{person}"
review_link: "Marqué comme revu."
status:
- created: "Un rapport a été créé"
+ created: "Un signalement a été créé"
destroyed: "Le message a été détruit"
failed: "Il y a eu un problème."
- marked: "Ce rapport a été marqué comme revu"
+ marked: "Ce signalement a été marqué comme revu"
title: "Vue d'ensemble des signalements."
requests:
create:
sending: "En cours d'envoi"
- sent: "Vous avez demandé à partager avec %{name}. Il le verra lors de sa prochaine connexion à Diaspora."
+ sent: "Vous avez demandé à partager avec %{name}. Il devrait le voir lors de sa prochaine connexion à diaspora*."
destroy:
error: "Veuillez sélectionner un aspect !"
ignore: "Requête de contact ignorée."
@@ -996,20 +1058,17 @@ fr:
reshare:
deleted: "Le message original a été supprimé par l'auteur."
reshare:
- few: "%{count} partages"
- many: "%{count} partages"
- one: "1 partage"
- other: "%{count} partages"
- two: "%{count} partages"
+ one: "1 repartage"
+ other: "%{count} repartages"
zero: "Repartager"
- reshare_confirmation: "Partager le message d'%{author} ?"
- reshare_original: "Partager l'original"
+ reshare_confirmation: "Repartager le message de %{author} ?"
+ reshare_original: "Repartager l'original"
reshared_via: "repartagé par"
show_original: "Afficher l'original"
search: "Rechercher"
services:
create:
- already_authorized: "Un utilisateur dont l'id diaspora est %{diaspora_id} a déjà autorisé ce compte %{service_name}."
+ already_authorized: "Un utilisateur dont l'identifiant diaspora* est %{diaspora_id} a déjà autorisé ce compte %{service_name}."
failure: "L'authentification a échoué."
read_only_access: "Accès en lecture seule, veuillez réessayer d'autoriser plus tard"
success: "Authentification réussie."
@@ -1018,7 +1077,7 @@ fr:
failure:
error: "une erreur s'est produite lors de la connexion avec ce service"
finder:
- fetching_contacts: "Diaspora est en train d'importer vos amis %{service}. Revenez dans quelques minutes."
+ fetching_contacts: "Diaspora* est en train d'importer vos amis %{service}. Revenez dans quelques minutes."
no_friends: "Aucun ami Facebook trouvé."
service_friends: "Amis %{service}"
index:
@@ -1031,13 +1090,13 @@ fr:
logged_in_as: "connecté(e) en tant que"
no_services: "Vous n'êtes connecté à aucun service pour le moment."
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 vous donne la possibilité d'y publier vos messages depuis diaspora*."
inviter:
click_link_to_accept_invitation: "Suivez ce lien pour accepter l'invitation"
join_me_on_diaspora: "Rejoignez-moi sur diaspora*"
remote_friend:
invite: "inviter"
- not_on_diaspora: "Pas encore sur Diaspora"
+ not_on_diaspora: "Pas encore sur diaspora*"
resend: "envoyer à nouveau"
settings: "Paramètres"
share_visibilites:
@@ -1049,17 +1108,16 @@ fr:
add_new_contact: "Ajouter un nouveau contact"
create_request: "Rechercher par identifiant diaspora*"
diaspora_handle: "diaspora@pod.org"
- enter_a_diaspora_username: "Entrez un nom d'utilisateur Diaspora :"
+ enter_a_diaspora_username: "Entrez un nom d'utilisateur diaspora* :"
know_email: "Connaissez-vous leur adresse de courrier électronique ? Vous devriez les inviter"
- your_diaspora_username_is: "Votre nom d'utilisateur Diaspora est : %{diaspora_handle}"
+ your_diaspora_username_is: "Votre nom d'utilisateur diaspora* est : %{diaspora_handle}"
aspect_dropdown:
add_to_aspect: "Ajouter le contact"
+ mobile_row_checked: "%{name} (retirer)"
+ mobile_row_unchecked: "%{name} (ajouter)"
toggle:
- few: "Dans %{count} aspects"
- many: "Dans %{count} aspects"
one: "Dans %{count} aspect"
other: "Dans %{count} aspects"
- two: "Dans %{count} aspects"
zero: "Ajouter le contact"
contact_list:
all_contacts: "Tous les contacts"
@@ -1074,7 +1132,7 @@ fr:
invite_someone: "Inviter quelqu'un"
invite_your_friends: "Invitez vos amis"
invites: "Invitations"
- invites_closed: "Les invitations sont actuellement fermées sur ce pod Diaspora"
+ invites_closed: "Les invitations sont actuellement fermées sur ce pod diaspora*"
share_this: "Partagez ce lien par courriel, sur un blog ou via votre réseau social favori !"
notification:
new: "Nouveau/nouvelle %{type} de %{from}"
@@ -1084,7 +1142,7 @@ fr:
logged_in: "connecté(e) à %{service}"
manage: "Gérer les services connectés"
new_user_welcome_message: "Utilisez les #tags pour classer vos messages et trouver des personnes qui partagent vos intérêts. Interpellez des personnes géniales avec les @Mentions"
- outside: "Les messages publics pourront être vus par d'autres en dehors de Diaspora."
+ outside: "Les messages publics pourront être vus par tous, même en dehors de diaspora*."
share: "Partager"
title: "Mettre en place des services connectés"
visibility_dropdown: "Utilisez ce menu déroulant pour modifier la visibilité de votre message. (Nous vous conseillons de rendre public ce premier message.)"
@@ -1135,10 +1193,25 @@ fr:
simple_captcha:
label: "Entrez le code dans le champ"
message:
- default: "Le code ne correspond pas à l'image"
+ default: "Le code fourni ne correspond pas à l'image"
failed: "La vérification anti-robot a échoué"
user: "L'image et le code sont différents"
placeholder: "Saisissez le contenu de l'image"
+ statistics:
+ active_users_halfyear: "Utilisateurs actifs par semestre"
+ active_users_monthly: "Utilisateurs actifs par mois"
+ closed: "Fermé"
+ disabled: "Indisponible"
+ enabled: "Disponible"
+ local_comments: "Commentaires locaux"
+ local_posts: "Messages locaux"
+ name: "Nom"
+ network: "Réseau"
+ open: "Ouvert"
+ registrations: "Inscriptions"
+ services: "Services"
+ total_users: "Total d'utilisateurs"
+ version: "Version"
status_messages:
create:
success: "Mention de : %{names}"
@@ -1148,15 +1221,11 @@ fr:
no_message_to_display: "Aucun message à afficher."
new:
mentioning: "Mentionne : %{person}"
- too_long:
- few: "merci de bien vouloir écrire des messages de moins de %{count} caractères"
- many: "merci de bien vouloir écrire des messages de moins de %{count} caractères"
- one: "merci de bien vouloir écrire des messages de moins de %{count} caractère"
- other: "merci de bien vouloir écrire des messages de moins de %{count} caractères"
- two: "votre statut doit faire moins de %{count} caractères"
- zero: "merci de bien vouloir écrire des messages de moins de %{count} caractère"
+ too_long: "Veillez à écrire un message de statut de %{count} caractères au plus. Il compte actuellement %{current_length} caractères."
stream_helper:
hide_comments: "Masquer tous les commentaires"
+ no_more_posts: "Vous avez atteint la fin de ce flux."
+ no_posts_yet: "Il n'y a pas encore de message ici."
show_comments:
one: "Montrer un commentaire supplémentaire"
other: "Montrer %{count} commentaires supplémentaires"
@@ -1178,8 +1247,8 @@ fr:
title: "#Tags Suivis"
followed_tags_stream: "#Tags Suivis"
like_stream:
- contacts_title: "Personnes dont vous avez épinglé les commentaires"
- title: "Flux des éléments épinglés"
+ contacts_title: "Personnes dont vous avez aimé les commentaires"
+ title: "Flux des éléments aimés"
mentioned_stream: "@Mentions"
mentions:
contacts_title: "Personnes qui vous ont mentionné"
@@ -1192,7 +1261,6 @@ fr:
title: "Activité publique"
tags:
contacts_title: "Personnes qui suivent ce tag"
- tag_prefill_text: "Une chose que j'aime à propos de %{tag_name} est... "
title: "Messages tagués : %{tags}"
tag_followings:
create:
@@ -1203,18 +1271,16 @@ fr:
failure: "Impossible de ne plus suivre #%{name}. Peut-être ne le suivez-vous déjà plus?"
success: "Hélas! Vous ne suivez plus #%{name}."
tags:
+ name_too_long: "Votre tag doit faire moins de %{count} caractères (actuellement, %{current_length})"
show:
follow: "Suivre #%{tag}"
- followed_by_people:
- one: "suivi par une personne"
- other: "suivi par %{count} personnes"
- zero: "suivi par personne"
following: "Suivre #%{tag}"
- nobody_talking: "Personne ne parle encore de %{tag}."
none: "Le tag vide n'existe pas !"
- people_tagged_with: "Personnes taguées avec %{tag}"
- posts_tagged_with: "Publications taguées avec #%{tag}"
stop_following: "Arrêter de suivre #%{tag}"
+ tagged_people:
+ one: "1 personne marquée avec %{tag}"
+ other: "%{count} personnes marquées avec %{tag}"
+ zero: "Personne n'est marqué avec %{tag}"
terms_and_conditions: "Conditions d'utilisation"
undo: "Annuler ?"
username: "Nom d'utilisateur"
@@ -1224,11 +1290,11 @@ fr:
email_not_confirmed: "L'adresse électronique n'a pas pu être activée. Lien erroné ?"
destroy:
no_password: "Veuillez introduire votre mot de passe actuel pour fermer votre compte."
- success: "Votre compte a été bloqué. 20 minutes pourraient être nécessaires pour la finalisation de sa fermeture. Merci d'avoir essayé d'utiliser Diaspora."
+ 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 introduit ne correspond pas à votre mot de passe actuel."
edit:
- also_commented: "…quelqu'un d'autre commente une publication de votre contact ?"
- auto_follow_aspect: "Aspect pour les utilisateurs suivis automatiquement :"
+ also_commented: "…quelqu'un commente un message que vous avez déjà commenté."
+ auto_follow_aspect: "Aspects où ranger les utilisateurs suivis automatiquement :"
auto_follow_back: "Suivre automatiquement en retour ceux qui vous suivent"
change: "Modifier"
change_email: "Changer d'adresse électronique"
@@ -1237,44 +1303,51 @@ fr:
character_minimum_expl: "doit comporter au moins six caractères"
close_account:
dont_go: "Hey, s'il vous plaît ne partez pas !"
- if_you_want_this: "Si vous le voulez vraiment, tapez votre mot de passe ci-dessous et cliquez sur 'Supprimer le compte'"
- lock_username: "Ceci bloquera votre nom d'utilisateur si jamais vous décidiez de revenir."
- locked_out: "Vous serez déconnecté et bloqué de votre compte."
- make_diaspora_better: "Nous avons besoin de vous pour rendre Diaspora meilleur, vous devriez nous aider au lieu de partir. Si vous voulez partir, on voudrait que vous sachiez ce qu'il se passera prochainement."
+ if_you_want_this: "Si vous êtes sûr de vous, saisissez votre mot de passe ci-dessous et cliquez sur 'Supprimer le compte'"
+ lock_username: "Votre nom d'utilisateur sera bloqué. Vous ne pourrez pas créer un nouveau compte sur ce pod avec le même ID."
+ locked_out: "Vous serez déconnecté et bloqué de votre compte 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, voici ce qui va se passer à présent :"
mr_wiggles: "Mr Wiggles sera triste de vous voir partir."
- no_turning_back: "Pour l'instant, on ne peut pas revenir en arrière."
- what_we_delete: "Nous supprimerons tous vos envois et les données de votre profil dès que possible. Vos commentaires resteront sur le site, mais seront associés à votre identifiant diaspora* plutôt qu'à votre nom.."
+ no_turning_back: "Il n'est pas possible de revenir en arrière ! Si vous êtes sûr de vous, saisissez votre mot de passe ci-dessous."
+ what_we_delete: "Nous supprimerons tous vos messages et toutes les données de votre profil dès que possible. Vos commentaires sur les messages d'autres gens resteront sur le site, mais seront associés à votre identifiant diaspora* plutôt qu'à votre nom."
close_account_text: "Fermer le compte"
- comment_on_post: "…quelqu'un commente votre publication ?"
+ 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 ..."
+ download_export: "Télécharger mon profil"
+ download_export_photos: "Télécharger mes photos"
download_photos: "télécharger mes photos"
- download_xml: "télécharger mon XML"
edit_account: "Modifier le compte"
email_awaiting_confirmation: "Nous vous avons envoyé un lien d'activation à %{unconfirmed_email}. Jusqu'à ce que vous suiviez ce lien et activiez la nouvelle adresse, nous allons continuer à utiliser votre adresse originale %{email}."
export_data: "Exporter des données"
- following: "Paramètres de suivi"
+ export_in_progress: "Nous sommes en train de traiter vos données. Veuillez vérifier à nouveau l'avancement dans un moment."
+ export_photos_in_progress: "Nous sommes en train de traiter vos photos. Merci de revenir ici dans quelques instants."
+ following: "Paramètres de partage"
getting_started: "Préférences de nouvel utilisateur"
- liked: "... quelqu'un a épinglé votre message ?"
- mentioned: "…vous êtes mentionné-e dans une publication ?"
+ last_exported_at: "(Dernière mise à jour à %{timestamp})"
+ liked: "…quelqu'un a aimé votre message."
+ mentioned: "…l'on vous mentionne dans un message."
new_password: "Nouveau mot de passe"
- photo_export_unavailable: "L'exportation des photos est actuellement indisponible"
- private_message: "…vous recevez un message privé ?"
+ private_message: "…vous recevez un message privé."
receive_email_notifications: "Recevoir des notifications par courrier électronique lorsque…"
- reshared: "...quelqu'un a partagé votre message ?"
- show_community_spotlight: "Afficher les actualités de la communauté dans votre flux ?"
+ request_export: "Demander mes données de profil"
+ request_export_photos: "Demander mes photos"
+ request_export_photos_update: "Rafraichir mes photos."
+ request_export_update: "Rafraîchir mes données de profil"
+ reshared: "…quelqu'un a repartagé votre message."
+ show_community_spotlight: "Afficher les actualités de la communauté dans votre flux"
show_getting_started: "Réactiver la page de découverte"
someone_reported: "Quelqu'un a signalé un message"
- started_sharing: "... quelqu'un commence à partager avec vous ?"
+ started_sharing: "…quelqu'un commence à partager avec vous."
stream_preferences: "Préférences du flux"
your_email: "Votre adresse électronique"
your_handle: "Votre identifiant diaspora*"
getting_started:
awesome_take_me_to_diaspora: "Impressionnant ! Guidez-moi vers diaspora*"
- community_welcome: "La communauté Diaspora* est heureuse de vous avoir à bord !"
- connect_to_facebook: "Nous pouvons accélerer un peu les choses en %{link} à Diaspora. Cela va importer votre nom et votre photo et activer l'écriture de messages entre les comptes."
+ community_welcome: "La communauté diaspora* est heureuse de vous avoir à son bord !"
+ connect_to_facebook: "Nous pouvons accélérer un peu les choses en %{link} à diaspora*. Cela importera vos nom et photo, et vous permettra de publier des messages sur plusieurs services à la fois."
connect_to_facebook_link: "connectant votre compte Facebook"
- hashtag_explanation: "Les tags vous permettent de parler de vos intérêts et de les suivre. Ils sont aussi un excellent moyen de rencontrer de nouvelles personnes sur Diaspora."
+ hashtag_explanation: "Les tags vous permettent de parler de vos centres d'intérêt et de suivre ce qui s'en dit. Ils sont aussi un excellent moyen de rencontrer de nouvelles personnes sur diaspora*."
hashtag_suggestions: "Essayez de suivre des tags comme #art, #films, #french, etc."
saved: "Sauvé !"
well_hello_there: "Bienvenue !"
@@ -1282,7 +1355,9 @@ fr:
who_are_you: "Qui êtes-vous ?"
privacy_settings:
ignored_users: "Utilisateurs ignorés"
+ no_user_ignored_message: "Vous n'ignorez actuellement aucun autre utilisateur"
stop_ignoring: "Arrêter d'ignorer"
+ strip_exif: "Retirer des images téléversées les métadonnées telles que lieu de prise, auteur et modèle d'appareil photo (recommandé)"
title: "Paramètres de confidentialité"
public:
does_not_exist: "L'utilisateur %{username} n'existe pas !"
diff --git a/config/locales/diaspora/fy.yml b/config/locales/diaspora/fy.yml
index 665bf20ad..9ff896c3a 100644
--- a/config/locales/diaspora/fy.yml
+++ b/config/locales/diaspora/fy.yml
@@ -15,11 +15,8 @@ fy:
are_you_sure: "Bisto wis?"
aspects:
edit:
- done: "Klear"
update: "fernij"
updating: "fernije"
- helper:
- remove: "fuorthelje"
index:
diaspora_id:
content_1: "Dyn Diaspora ID is:"
@@ -40,8 +37,6 @@ fy:
family: "Famylje"
friends: "Freonen"
work: "Wurk"
- selected_contacts:
- view_all_contacts: "Toan alle kontakten"
back: "Tebek"
cancel: "Annulearje"
comments:
@@ -51,16 +46,12 @@ fy:
contacts:
create:
failure: "Koe gjin kontakt oanmeitsje"
- few: "%{count} kontakten"
index:
- add_to_aspect_link: "kontakten tafoegje oan %{name}"
all_contacts: "Alle Kontakten"
title: "Kontakten"
your_contacts: "Dyn Kontakten"
- many: "%{count} kontakten"
one: "1 kontakt"
other: "%{count} kontakten"
- two: "%{count} kontakten"
zero: "kontakten"
conversations:
create:
@@ -131,9 +122,7 @@ fy:
password: "Wachtwurd"
password_confirmation: "Wachtwurd konfirmaasje"
people:
- few: "%{count} minsken"
one: "1 persoan"
- two: "%{count} minsken"
zero: "gjin minsken"
previous: "foarrige"
privacy: "Privacy"
diff --git a/config/locales/diaspora/ga.yml b/config/locales/diaspora/ga.yml
index 494ace06a..ff30fbb12 100644
--- a/config/locales/diaspora/ga.yml
+++ b/config/locales/diaspora/ga.yml
@@ -33,18 +33,12 @@ ga:
are_you_sure: "An bhfuil tú cinnte?"
are_you_sure_delete_account: "An bhfuil tú cinnte go dteastaíonn uait do chuntas a dhúnadh? Ní féidir é seo a chealaigh!"
aspects:
- aspect_contacts:
- done_editing: "eagarthóireacht déanta"
aspect_listings:
edit_aspect: "%{name} a chur in eagar"
edit:
- done: "Déanta"
rename: "athainmnigh"
update: "uasdátaigh"
updating: "nuashonrú"
- few: "%{count} gnéithe"
- helper:
- remove: "bain"
index:
diaspora_id:
heading: "ID Diaspora"
@@ -55,7 +49,6 @@ ga:
tag_feature: "gné"
new_here:
learn_more: "Breis eolais"
- many: "%{count} gnéithe"
new:
create: "Cruthaigh"
one: "gné amháin"
@@ -64,24 +57,20 @@ ga:
family: "Gaolmhara"
friends: "Cháirde"
work: "Obair"
- two: "%{count} gnéithe"
zero: "gan ghnéithe"
back: "Ar ais"
cancel: "Cealaigh"
contacts:
- few: "%{count} teagmhálacha"
index:
all_contacts: "Gach Teagmhálacha"
community_spotlight: "Spotsolas Pobail"
my_contacts: "Mo Theagmhálacha"
title: "Teagmhálacha"
your_contacts: "Do Theagmhálacha"
- many: "%{count} teagmhálacha"
one: "Teagmháil amháin"
other: "%{count} teagmhálacha"
spotlight:
community_spotlight: "Spotsolas Pobail"
- two: "%{count} teagmhálacha"
zero: "teagmhálacha"
conversations:
index:
@@ -143,8 +132,6 @@ ga:
password: "Pasfhocal"
password_confirmation: "Deimhniú pásfhocal"
people:
- few: "%{count} daoine"
- many: "%{count} daoine"
one: "duine amháin"
other: "%{count} daoine"
person:
@@ -155,7 +142,6 @@ ga:
location: "Suíomh"
show:
message: "Teachtaireacht"
- two: "%{count} daoine"
zero: "gan duine"
photos:
destroy:
diff --git a/config/locales/diaspora/gd.yml b/config/locales/diaspora/gd.yml
new file mode 100644
index 000000000..2d6532d39
--- /dev/null
+++ b/config/locales/diaspora/gd.yml
@@ -0,0 +1,300 @@
+# Copyright (c) 2010-2013, Diaspora Inc. This file is
+# licensed under the Affero General Public License version 3 or later. See
+# the COPYRIGHT file.
+
+
+
+gd:
+ _applications: "Prògraman"
+ _comments: "Beachdan"
+ _contacts: "Càirdean"
+ _help: "Cuideachadh"
+ _home: "Dachaigh"
+ _photos: "dealbhan"
+ _services: "Seirbheisean"
+ account: "Cunntas"
+ activerecord:
+ errors:
+ models:
+ person:
+ attributes:
+ diaspora_handle:
+ taken: "Tha seo clàraichte mar-thà."
+ user:
+ attributes:
+ email:
+ taken: "Tha seo clàraichte mar-thà."
+ person:
+ invalid: "Tha seo neo-bhrìgheil."
+ username:
+ invalid: "Tha seo neo-bhrìgheil. Chan fhaodar ach a-u, 0-9 agus _ a chleachdadh."
+ taken: "Tha seo clàraichte mar-thà."
+ admins:
+ admin_bar:
+ pages: "Duilleagan"
+ stats:
+ 2weeks: "Cola-deug"
+ daily: "Gu làitheil"
+ month: "Mìos"
+ usage_statistic: "Staitistigs Cleachdaidh"
+ week: "Seachdain"
+ ago: "o chionn %{time}"
+ are_you_sure: "A bheil thu cinnteach?"
+ are_you_sure_delete_account: "A bheil thu cinnteach gu bheil thu airson do chunntas a dhùnadh? Chan urrainn dhut seo atharradh!"
+ aspects:
+ aspect_listings:
+ deselect_all: "Na tagh na h-uile"
+ edit_aspect: "Deasaich %{name}"
+ select_all: "Tagh na h-uile"
+ edit:
+ update: "ùraich"
+ updating: "ag ùrachadh"
+ index:
+ diaspora_id:
+ content_1: "'S e seo an ID diaspora* agad:"
+ content_2: "Ma bheireas tu do chuideigin e, faodaidh iad gad lorg air diaspora*."
+ heading: "ID diaspora*"
+ help:
+ email_link: "Post-d"
+ feature_suggestion: "... a bheil thu airson %{link} a mholadh?"
+ find_a_bug: "... an do lorg thu %{link}?"
+ have_a_question: "... a bheil %{link} agad?"
+ tag_bug: "mearachd"
+ tag_feature: "comharra"
+ tag_question: "ceist"
+ services:
+ content: "Faodaidh tu ceangal a dhèanamh eadar diaspora* agus na sèirbheisean na leanas."
+ heading: "Dèan ceangal ri Sèirbheis"
+ welcome_to_diaspora: "Fàilte gu diaspora*, a %{name}!"
+ new:
+ create: "Dèan"
+ seed:
+ acquaintances: "Muinntireachd"
+ family: "Teaghlach"
+ friends: "Càirdean"
+ back: "Air ais"
+ cancel: "Sgùir"
+ comments:
+ new_comment:
+ comment: "Thoir beachd air"
+ commenting: "a' toirt beachd air..."
+ one: "1 bheachd"
+ other: "%{count} beachdan"
+ zero: "Gun bheachd"
+ contacts:
+ index:
+ all_contacts: "Càirdean gu lèir"
+ my_contacts: "Mo Chàirdean"
+ no_contacts_message: "Thoir sùil air %{community_spotlight}"
+ title: "Càirdean"
+ your_contacts: "Do Chàirdean"
+ one: "1 chàraid"
+ other: "%{count} càirdean"
+ zero: "càirdean"
+ conversations:
+ create:
+ fail: "Teachdaireachd neo-bhrìgheil"
+ helper:
+ new_messages:
+ one: "1 theachdaireachd ùr"
+ other: "%{count} teachdaireachdan ùra"
+ zero: "0 teachdaireachd ùr"
+ new:
+ send: "Cuir"
+ sending: "a' cur..."
+ subject: "cuspair"
+ to: "gu"
+ show:
+ reply: "freagair"
+ replying: "a' freagairt..."
+ date:
+ formats:
+ birthday: ""
+ birthday_with_year: ""
+ fullmonth_day: ""
+ delete: "Dubh às"
+ email: "Post-d"
+ fill_me_out: "Lìon a-steach"
+ find_people: "Rannsaich airson daoine no #tagaichean"
+ help:
+ irc: ""
+ markdown: ""
+ private_posts:
+ title: "Brathan prìobhaideachd"
+ public_posts:
+ title: "Brathan poblach"
+ wiki: ""
+ hide: "Falaich"
+ invitations:
+ new:
+ language: "Cànan"
+ resend: "Cuir a-rithist"
+ to: "Gu"
+ layouts:
+ application:
+ powered_by: "a' ruith air diaspora*"
+ whats_new: "dè tha dol?"
+ header:
+ admin: "riaghladh"
+ blog: "blog"
+ login: "log a-steach"
+ logout: "Log a-mach"
+ profile: "Profaidhl"
+ settings: "Roghainnean"
+ limited: "Earranta"
+ more: "Tuilleadh"
+ next: "air adhart"
+ notifications:
+ index:
+ and: "agus"
+ post: "brath"
+ private_message:
+ one: "Tha %{actors} air teachdaireachd a chur thugad."
+ other: "Tha %{actors} air teachdaireachd a chur thugad."
+ zero: "Tha %{actors} air teachdaireachd a chur thugad."
+ notifier:
+ a_post_you_shared: "brath."
+ click_here: "cliog an seo"
+ comment_on_post:
+ reply: "Thoir sùil air no sgrìobh freagairt ris a' bhrath a sgrìobh %{name} >"
+ hello: "Halò a %{name}!"
+ invite:
+ message: |-
+   Halo!
+
+ Fhuair thu cuireadh gus gabhail ann an diaspora*!
+
+ Cliog air a' cheangal seo airson tòiseachadh
+
+ [%{invite_url}][1]
+
+
+ Dùrachdan,
+
+ An robot diaspora!
+
+ [1]: %{invite_url}
+ liked:
+ liked: "Tha do brath còrdadh ri %{name}"
+ view_post: "Seall air a' bhrath >"
+ mentioned:
+ mentioned: "air iomradh a thoirt ort ann am brath:"
+ subject: "Thug %{name} iomradh ort air diaspora*"
+ private_message:
+ reply_to_or_view: "Seall air a' bhrath seo no cuir freagairt ris >"
+ reshared:
+ reshared: "Tha %{name} air do bhrath a sgaoileadh"
+ view_post: "Seall air a' bhrath >"
+ started_sharing:
+ view_profile: "Thoir sùil air profaidhl %{name}"
+ thanks: "Tapadh leat,"
+ ok: "Ceart ma-thà"
+ or: "no"
+ password: "Facal-faire"
+ password_confirmation: "Dearbh d' fhacal-faire"
+ people:
+ index:
+ no_results: "Haidh! Feumaidh tu rannsachadh airson rudeigin."
+ one: "duine"
+ person:
+ already_connected: "Ceangailte mar-thà"
+ pending_request: "Iarrtas a' feitheamh ri dearbhadh"
+ thats_you: "'S tusa a th' ann!"
+ profile_sidebar:
+ born: "Co-là-breith"
+ edit_my_profile: "Deasaich mo phrofaidhl"
+ gender: "Gnè"
+ photos: "Dealbhan"
+ show:
+ closed_account: "Tha an cunntas seo dùinte."
+ mention: "Thoir iomradh air"
+ message: "Cuir brath"
+ sub_header:
+ edit: "deasaich"
+ photos:
+ edit:
+ editing: "Deasachadh"
+ new:
+ new_photo: "Dealbh ùr"
+ show:
+ edit: "deasaich"
+ posts:
+ show:
+ destroy: "Dubh às"
+ previous: "air ais"
+ privacy: "Prìobhaideachd"
+ privacy_policy: "Poileasaidh Prìobhaideachd"
+ profile: "Profaidhl"
+ profiles:
+ edit:
+ allow_search: "Am faod daoine rannsachadh air do shon air diaspora*"
+ edit_profile: "Deasaich profaidhl"
+ first_name: "D' ainm-baistidh"
+ last_name: "Do sloinneadh"
+ update_profile: "Ùraich profaidhl"
+ your_bio: "Mud dheidhinn"
+ your_birthday: "Co-là-breith agad"
+ your_gender: "Do ghnè"
+ your_location: "Cò às a tha thu?"
+ your_name: "D' ainm"
+ your_photo: "Do dhealbh"
+ your_tags: "Còig faclan a' toirt iomradh ort"
+ your_tags_placeholder: "mar eisimpleir #filmichean #piseagan #siubhal #tidsear #eabhraignuadh"
+ update:
+ updated: "Profaidhl air ùrachadh"
+ public: "Poblach"
+ registrations:
+ edit:
+ cancel_my_account: "Dùin mo chunntas"
+ edit: "Deasaich %{name}"
+ unhappy: "Mì-thoilichte?"
+ update: "Ùraich"
+ new:
+ create_my_account: "Cruthaich mo chunntas!"
+ email: "POST-D"
+ enter_email: "Cuir a-steach seòladh post-d"
+ enter_password: "Tagh facal-faire (co-dhiù sia litrichean)"
+ enter_password_again: "Sgrìobh am facal-faire a-rithist"
+ enter_username: "Tagh ainm-cleachdadh (a-u, 0-9 agus _ a-mhàin)"
+ join_the_movement: "Gabh anns an iomairt!"
+ password: "FACAL-FAIRE"
+ sign_up: "CLÀRAICH"
+ username: "AINM-CLEACHDAIDH"
+ requests:
+ create:
+ sending: "a' cur"
+ new_request_to_person:
+ sent: "air a chur!"
+ search: "Rannsaich"
+ services:
+ index:
+ connect_to_facebook: "Dèan ceangal ri Facebook"
+ connect_to_tumblr: "Dèan ceangal ri Tumblr"
+ connect_to_twitter: "Dèan ceangal ri Twitter"
+ edit_services: "Deasaich sèirbheisean"
+ remote_friend:
+ resend: "cuir a-rithist"
+ settings: "Roghainnean"
+ shared:
+ add_contact:
+ diaspora_handle: ""
+ public_explain:
+ atom_feed: ""
+ share: "Sgaoil"
+ publisher:
+ preview: "Ro-shealladh"
+ share: "Sgaoil"
+ reshare:
+ reshare: "Sgaoil"
+ terms_and_conditions: "Cùmhnantan"
+ username: "Ainm-cleachdaidh"
+ users:
+ edit:
+ change: "Atharraich"
+ edit_account: "Deasaich cunntas"
+ following: "Roghainnean sgaoilidh"
+ your_email: "Do phost-d"
+ your_handle: "ID diaspora* agad"
+ privacy_settings:
+ title: "Roghainnean Prìobhaideachd"
+ welcome: "Fàilte!" \ No newline at end of file
diff --git a/config/locales/diaspora/gl.yml b/config/locales/diaspora/gl.yml
index c9e24a0b1..7430d4836 100644
--- a/config/locales/diaspora/gl.yml
+++ b/config/locales/diaspora/gl.yml
@@ -45,6 +45,7 @@ gl:
no_results: "Non se atopou nada."
_contacts: "Contactos"
welcome: "Benvido!"
+ _terms: "termos"
activerecord:
@@ -179,6 +180,7 @@ gl:
contacts_visible: "Os contactos deste aspecto poderán verse os uns aos outros."
contacts_not_visible: "Os contactos deste aspecto non poderán verse os uns aos outros."
edit:
+ grant_contacts_chat_privilege: "Permitir aos contactos do aspecto conversar con vostede?"
make_aspect_list_visible: "Deixar que os contactos deste aspecto vexan a lista de membros?"
remove_aspect: "Eliminar o aspecto"
confirm_remove_aspect: "Está seguro de que quere eliminar este aspecto?"
@@ -189,6 +191,8 @@ gl:
rename: "Renomear"
aspect_list_is_visible: "Os contactos do aspecto poden ver a lista dos membros."
aspect_list_is_not_visible: "Os contactos do aspecto non poden ver a lista dos membros."
+ aspect_chat_is_enabled: "Os contactos do aspecto poden conversar con vostede."
+ aspect_chat_is_not_enabled: "Os contactos do aspecto non poden conversar con vostede."
update: "Actualizar"
updating: "Actualizando…"
aspect_contacts:
@@ -336,8 +340,10 @@ gl:
my_contacts: "Contactos"
all_contacts: "Todos os contactos"
only_sharing_with_me: "Só eles comparten"
- remove_person_from_aspect: "Eliminar a %{person_name} de «%{aspect_name}»"
+ add_contact: "Engadir un contacto"
+ remove_contact: "Retirar o contacto"
many_people_are_you_sure: "Está seguro de que quere iniciar unha conversa privada con máis de %{suggested_limit} contactos? Para comunicarse con eles, quizais sexa mellor publicar neste aspecto."
+ user_search: "Busca de usuarios"
spotlight:
community_spotlight: "Estrelas da comunidade"
suggest_member: "Suxerir un membro"
@@ -559,6 +565,14 @@ gl:
people_tag_page_a: "Trátase de persoas que teñen a etiqueta na lista de etiquetas coas que se describen no seu perfil público."
filter_tags_q: "Como podo filtrar ou excluír algunha etiqueta da miña onda?"
filter_tags_a: "Iso aínda non pode facerse directamente a través de diaspora*, aínda que existen algunhas %{third_party_tools} que poderían dispoñer desta funcionalidade."
+ keyboard_shortcuts:
+ keyboard_shortcuts_q: "Que atallos de teclado hai dispoñíbeis?"
+ keyboard_shortcuts_a1: "Na vista da onda pode usar os seguintes atallos:"
+ keyboard_shortcuts_li1: "j — Ir á seguinte publicación"
+ keyboard_shortcuts_li2: "k — Volver á publicación anterior"
+ keyboard_shortcuts_li3: "c — Deixar un comentario na publicación actual"
+ keyboard_shortcuts_li4: "l — Indicar que lle gusta a publicación actual"
+ title: "Atallos de teclado"
miscellaneous:
title: "Outras"
back_to_top_q: "Existe algún xeito de volver rapidamente á parte superior dunha páxina despois de baixar?"
@@ -694,6 +708,7 @@ gl:
index:
notifications: "Notificacións"
mark_all_as_read: "Marcalas todas como lidas"
+ mark_all_shown_as_read: "Marcas todas as mostradas como lidas"
mark_read: "Marcar como lido"
mark_unread: "Marcar como non lido"
show_all: "Mostralo todo"
@@ -782,6 +797,22 @@ gl:
O robot do correo de diaspora*
[1]: %{invite_url}
+ remove_old_user:
+ subject: "A súa conta de diaspora* marcouse para a súa eliminación por inactividade"
+ body: |-
+ Ola,
+
+ Parece que perdeu interese na súa conta de %{pod_url}, leva %{after_days} días sen usala. Para que os usuarios activos do servidor teñan acceso a máis recursos, gustaríanos eliminar calquera conta non desexada da nosa base de datos.
+
+ Encantaríanos que vostede continuase a formar parte da comunidade de diaspora*, e se quere manter a conta será benvido.
+
+ Para non perder a conta, non ten máis que acceder ao servidor coa conta antes de %{remove_after}. Ao acceder, aproveite para botar un ollo a diaspora*. Cambiou moito desde a súa última visita, e pensamos que as melloras que fixemos han encherlle o ollo. Siga algunhas #etiquetas para atopar contidos que lle interesen.
+
+ Pode acceder ao sitio desde: %{login_url}. Se esqueceu os seus datos de acceso, pode solicitar recuperalos desde a mesma páxina.
+
+ Esperamos volvelo ver axiña,
+
+ O robot de correo electrónico de diaspora*!
people:
zero: "ninguén."
one: "unha persoa."
@@ -956,6 +987,8 @@ gl:
password: "Contrasinal"
continue: "Continuar"
submitting: "Enviando…"
+ terms: "Ao crear unha conta estás a aceptar as %{terms_link}."
+ terms_link: "condicións do servizo"
create:
success: "Xa está en diaspora*!"
edit:
@@ -1138,10 +1171,7 @@ gl:
no_message_to_display: "Non hai mensaxes que amosar."
destroy:
failure: "Non foi posíbel eliminar a publicación."
- too_long:
- zero: "As súas mensaxes de estado non poden ter ningún carácter. Curioso, va que si?"
- one: "As súas mensaxes de estado non poden ter máis dun carácter. Elíxao ben!"
- other: "As súas mensaxes de estado non poden ter máis de %{count} caracteres."
+ too_long: "A súa mensaxes de estado non pode ter máis de %{count} caracteres. Agora mesmo contén %{current_length} caracteres."
stream_helper:
show_comments:
@@ -1149,6 +1179,8 @@ gl:
one: "Amosar o comentario que falta"
other: "Amosar %{count} comentarios máis"
hide_comments: "Ocultar os comentarios"
+ no_more_posts: "Chegou ao final da súa onda."
+ no_posts_yet: "Aínda non hai publicacións."
tags:
show:
@@ -1259,18 +1291,19 @@ gl:
close_account:
dont_go: "Non marche, por favor!"
- make_diaspora_better: "Queremos que nos axude a mellorar diaspora*, así que debería axudar en vez de marchar. Pero se vai marchar, queremos que saiba o que lle espera."
+ make_diaspora_better: "Gustaríanos que quedase e nos axudase a mellorar diaspora* en vez de marchar. Pero se de verdade quere marchar, isto será o que suceda a continuación:"
mr_wiggles: 'Botarémolo de menos.'
- what_we_delete: "Eliminaranse as súas publicacións e datos do perfil canto antes. Os seus comentarios seguirán por aí, pero pasarán a estar asociados co seu identificador de diaspora* en lugar do seu nome."
- locked_out: "Pecharase a súas sesión e non poderá volver entrar coa súa conta."
- lock_username: "Se lle entra a morriña, non poderá volver empregar o seu usuario."
- no_turning_back: "De momento, non hai xeito de volver atrás."
+ what_we_delete: "Eliminaranse as súas publicacións e datos do perfil canto antes. Os seus comentarios nas publicacións de terceiros seguirán aparecendo, pero pasarán a estar asociados co seu identificador de diaspora* en lugar do seu nome."
+ locked_out: "Pecharase a súas sesión e non poderá volver entrar coa súa conta ata que se elimine."
+ lock_username: "Bloquearase o seu usuario, e non poderá volver a crear unha conta no mesmo servidor co mesmo identificador."
+ no_turning_back: "Non hai volta atrás! Se está seguro, introduza o seu contrasinal a continuación."
if_you_want_this: "Se está seguro de que isto é o que quere, escriba o seu contrasinal a continuación e prema o botón de «Pechar a conta»."
privacy_settings:
title: "Configuración da intimidade"
ignored_users: "Usuarios ignorados"
stop_ignoring: "Deixar de ignorar"
+ no_user_ignored_message: "De momento non está a ignorar ningún usuario"
destroy:
success: "Bloqueouse a súa conta. Pode levar ata 20 minutos pechala completamente. Grazas por darlle unha oportunidade a diaspora*."
diff --git a/config/locales/diaspora/he.yml b/config/locales/diaspora/he.yml
index c479a7bcc..0d96e7878 100644
--- a/config/locales/diaspora/he.yml
+++ b/config/locales/diaspora/he.yml
@@ -122,8 +122,6 @@ he:
add_to_aspect:
failure: "אירע כשל בהוספת איש הקשר להיבט."
success: "איש הקשר נוסף בהצלחה להיבט."
- aspect_contacts:
- done_editing: "סיום עריכה"
aspect_listings:
add_an_aspect: "+ הוספת היבט"
deselect_all: "ביטול בחירה"
@@ -142,23 +140,15 @@ he:
failure: "%{name} אינו ריק ולא ניתן להסירו"
success: "%{name} הוסר בהצלחה."
edit:
- add_existing: "הוספת איש קשר קיים"
aspect_list_is_not_visible: "אנשי הקשר בהיבט זה אינם יכולים לראות זה את זה."
aspect_list_is_visible: "אנשי הקשר בהיבט זה יכולים לראות זה את זה."
confirm_remove_aspect: "האם אתם בטוחים שברצונכם למחוק היבט זה?"
- done: "בוצע"
make_aspect_list_visible: "לאפשר לאנשי הקשר בהיבט זה לראות זה את זה?"
- manage: "ניהול"
remove_aspect: "מחיקת היבט זה"
rename: "שינוי שם"
set_visibility: "קביעת נראות"
update: "עדכון"
updating: "בעדכון"
- few: "%{count} היבטים"
- helper:
- are_you_sure: "האם אכן ברצונך למחוק היבט זה?"
- aspect_not_empty: "ההיבט אינו ריק"
- remove: "הסרה"
index:
diaspora_id:
content_1: "המזהה שלך בדיאספורה* הוא:"
@@ -199,11 +189,6 @@ he:
heading: "קישור שירותים"
unfollow_tag: "הפסקת עקיבה אחרי #%{tag}"
welcome_to_diaspora: "ברוך בואך לדיאספורה*, %{name}!"
- many: "%{count} היבטים"
- move_contact:
- error: "שגיאה בהעברת איש הקשר: %{inspect}"
- failure: "אירע כשל - %{inspect}"
- success: "איש הקשר הועבר להיבט חדש"
new:
create: "יצירה"
name: "שם (מופיע בפניך בלבד)"
@@ -221,14 +206,6 @@ he:
family: "משפחה"
friends: "חברים"
work: "עבודה"
- selected_contacts:
- manage_your_aspects: "ניהול ההיבטים שלך."
- no_contacts: "אין לך עדיין אנשי קשר כאן."
- view_all_community_spotlight: "הצגת כל הפרסומים החשובים בקהילה"
- view_all_contacts: "הצגת כל אנשי הקשר"
- show:
- edit_aspect: "עריכת היבט"
- two: "%{count} היבטים"
update:
failure: "ההיבט שלך, %{name}, לא נשמר מכיוון שהשם שלו היה ארוך מדי."
success: "ההיבט שלך, %{name}, נערך בהצלחה."
@@ -248,36 +225,27 @@ he:
post_success: "פורסם! נסגר!"
cancel: "ביטול"
comments:
- few: "%{count} תגובות"
- many: "%{count} תגובות"
new_comment:
comment: "תגובה"
commenting: "התגובה נשלחת..."
one: "תגובה אחת"
other: "%{count} תגובות"
- two: "%{count} תגובות"
zero: "אין תגובות"
contacts:
create:
failure: "אירע כשל ביצירת איש קשר"
- few: "%{count} אנשי קשר"
index:
add_a_new_aspect: "הוספת היבט חדש"
add_to_aspect: "הוספת אנשי קשר ל-%{name}"
- add_to_aspect_link: "הוספת אנשי קשר ל-%{name}"
all_contacts: "כל אנשי הקשר"
community_spotlight: "פרסומים חשובים בקהילה"
- many_people_are_you_sure: "האם אכן ברצונך לפתוח בשיחה פרטית עם למעלה מ־%{suggested_limit} אנשי קשר? פרסום הודעה להיבט זה עשוי להיות דרך טובה יותר ליצירת קשר אתם."
my_contacts: "אנשי הקשר שלי"
no_contacts: "נראה שכדאי לך להוסיף עוד קצת אנשי קשר!"
no_contacts_message: "כדאי לבדוק %{community_spotlight}"
- no_contacts_message_with_aspect: "כדאי לבדוק %{community_spotlight} או %{add_to_aspect_link}"
only_sharing_with_me: "רק אלו המשתפים אתי"
- remove_person_from_aspect: "הסרת %{person_name} מההיבט \"%{aspect_name}\""
start_a_conversation: "התחלת שיחה"
title: "אנשי קשר"
your_contacts: "אנשי הקשר שלך"
- many: "%{count} אנשי קשר"
one: "איש קשר אחד"
other: "%{count} אנשי קשר"
sharing:
@@ -285,7 +253,6 @@ he:
spotlight:
community_spotlight: "פרסומים חשובים בקהילה"
suggest_member: "המלצה על חבר"
- two: "%{count} אנשי קשר"
zero: "אנשי קשר"
conversations:
conversation:
@@ -294,8 +261,6 @@ he:
fail: "הודעה שגויה"
no_contact: "הי, יש להוסיף את איש הקשר קודם!"
sent: "ההודעה נשלחה"
- destroy:
- success: "השיחה הוסרה בהצלחה"
helper:
new_messages:
few: "%{count} הודעות חדשות"
@@ -365,6 +330,10 @@ he:
getting_started_tutorial: "סדרת מדריכים למתחילים"
here: "כאן"
irc: "IRC"
+ mentions:
+ mention_in_comment_a: "לא, לא כרגע."
+ mention_in_comment_q: "האם אני יכול להזכיר מישהו בהערה?"
+ see_mentions_q: "האם יש דרך לראות פוסטים שבהם אני מוזכר?"
third_party_tools: "כלים צד שלישי"
tutorial: "מדריך"
tutorials: "מדריכים"
@@ -574,7 +543,6 @@ he:
add_contact_from_tag: "הוספת איש קשר מתגית"
aspect_list:
edit_membership: "עריכת חברות בהיבט"
- few: "%{count} אנשים"
helper:
is_not_sharing: "%{name} לא משתף/ת איתך"
is_sharing: "%{name} משתף/ת איתך"
@@ -588,7 +556,6 @@ he:
search_handle: "השתמשו במזהה דיאספורה* (username@pod.tld) כדי להיות בטוחים שתמצאו את חבריכם."
searching: "החיפוש מתבצע, נא להמתין בסבלנות..."
send_invite: "עדיין לא מצאתם? שלחו הזמנה!"
- many: "%{count} אנשים"
one: "אדם אחד"
other: "%{count} אנשים"
person:
@@ -625,7 +592,6 @@ he:
add_some: "הוספת כמה"
edit: "עריכה"
you_have_no_tags: "אין לך תגיות כלל!"
- two: "%{count} אנשים"
webfinger:
fail: "מצטערים, לא ניתן למצוא את %{handle}."
zero: "אין אנשים"
@@ -720,15 +686,12 @@ he:
update: "עדכון"
invalid_invite: "הקישור להזמנה שסיפקת אינו תקף יותר!"
new:
- continue: "המשך"
create_my_account: "יצירת החשבון שלי"
- diaspora: "<3 דיאספורה*"
email: דוא"ל
enter_email: "נא להזין כתובת דוא״ל"
enter_password: "הזינו סיסמה (שישה תווים לפחות)"
enter_password_again: "יש להזין את אותה הסיסמה כמקודם"
enter_username: "נא לבחור שם משתמש (אותיות, מספרים וקווים תחתונים בלבד)"
- hey_make: "שלום,<br/>בואו<br/>לשנות."
join_the_movement: "צרפו אותי!"
password: "סיסמה"
password_confirmation: "אימות סיסמה"
@@ -912,10 +875,7 @@ he:
no_message_to_display: "אין הודעה להצגה."
new:
mentioning: "אזכור: %{person}"
- too_long:
- one: "נא לקצר את הודעות הסטטוס שלך לפחות מתו אחד"
- other: "נא לקצר את הודעות הסטטוס שלך לפחות מ-%{count} תווים"
- zero: "נא לקצר את הודעות הסטטוס שלך לפחות מ-%{count} תווים"
+ too_long: "{\"one\"=>\"נא לקצר את הודעות הסטטוס שלך לפחות מתו אחד\", \"other\"=>\"נא לקצר את הודעות הסטטוס שלך לפחות מ-%{count} תווים\", \"zero\"=>\"נא לקצר את הודעות הסטטוס שלך לפחות מ-%{count} תווים\"}"
stream_helper:
hide_comments: "הסתרת כל התגובות"
show_comments:
@@ -953,7 +913,6 @@ he:
title: "פעילות ציבורית"
tags:
contacts_title: "אנשים ששותפים לתגית הזו"
- tag_prefill_text: "העניין ב-%{tag_name} הוא... "
title: "הודעות שתויגו: %{tags}"
tag_followings:
create:
@@ -966,15 +925,8 @@ he:
tags:
show:
follow: "עקיבה אחר #%{tag}"
- followed_by_people:
- one: "נעקבת על ידי מישהו אחד"
- other: "נקעבת על ידי %{count} אנשים"
- zero: "לא נעקב על ידי איש"
following: "במעקב אחר #%{tag}"
- nobody_talking: "אף אחד עדיין לא פרסם על %{tag}."
none: "התגית הריקה לא קיימת!"
- people_tagged_with: "אנשים המתויגים כ-%{tag}"
- posts_tagged_with: "הודעות המתויגות עם #%{tag}"
stop_following: "הפסקת עקיבה אחר #%{tag}"
terms_and_conditions: "תנאי שימוש"
undo: "האם לבטל?"
@@ -1012,7 +964,6 @@ he:
current_password: "סיסמה נוכחית"
current_password_expl: "זאת המשמשת לכניסה..."
download_photos: "הורדת התמונות שלי"
- download_xml: "הורדת ה-xml שלי"
edit_account: "עריכת חשבון"
email_awaiting_confirmation: "שלחנו קישור הפעלה לכתובת %{unconfirmed_email}. עד שתעקבו אחר קישור זה ותפעילו את הכתובת החדשה, אנו נמשיך להשתמש בכתובת המקורית: %{email}."
export_data: "יצוא המידע שלך"
@@ -1021,7 +972,6 @@ he:
liked: "...מישהו אהב הודעה שלך?"
mentioned: "...מישהו הזכיר אותך בהודעה?"
new_password: "סיסמה חדשה"
- photo_export_unavailable: "לא ניתן לייצא תמונות כרגע"
private_message: "...קיבלת הודעה פרטית?"
receive_email_notifications: "ברצונך לקבל התראות בדוא״ל כאשר..."
reshared: "...מישהו משתף מחדש הודעה שלך?"
diff --git a/config/locales/diaspora/hi.yml b/config/locales/diaspora/hi.yml
index 09145f86e..5715ccba3 100644
--- a/config/locales/diaspora/hi.yml
+++ b/config/locales/diaspora/hi.yml
@@ -11,8 +11,6 @@ hi:
helper:
unknown_person: "अजनबी"
aspects:
- edit:
- add_existing: "मौजूदा संपर्क जोड़ें"
index:
help:
tag_question: "प्रश्न"
diff --git a/config/locales/diaspora/hu.yml b/config/locales/diaspora/hu.yml
index ac0f71a43..64c94b220 100644
--- a/config/locales/diaspora/hu.yml
+++ b/config/locales/diaspora/hu.yml
@@ -128,8 +128,6 @@ hu:
add_to_aspect:
failure: "A kapcsolatot nem sikerült felvenni a csoportba."
success: "A kapcsolat hozzáadva a csoporthoz."
- aspect_contacts:
- done_editing: "szerkesztés kész"
aspect_listings:
add_an_aspect: "+ Új csoport"
deselect_all: "Kijelölések törlése"
@@ -148,23 +146,18 @@ hu:
failure: "%{name} nem üres, így nem lehet törölni."
success: "%{name} csoport sikeresen törölve."
edit:
- add_existing: "Létező kapcsolat hozzáadása"
+ aspect_chat_is_enabled: "A csoport tagjai beszélgethetnek veled."
+ aspect_chat_is_not_enabled: "A csoport tagjai nem beszélgethetnek veled."
aspect_list_is_not_visible: "csoportlista rejtett a csoporttagok számára"
aspect_list_is_visible: "csoportlista látható a csoporttagok számára"
confirm_remove_aspect: "Biztos, hogy törölni akarod a csoportot?"
- done: "Kész"
+ grant_contacts_chat_privilege: "feljogosítod a csoport tagjait, hogy beszélgethessenek veled?"
make_aspect_list_visible: "a csoporttagok láthatják egymást"
- manage: "Szerkesztés"
remove_aspect: "Csoport törlése"
rename: "átnevezés"
set_visibility: "Láthatóság beállítása"
update: "frissítés"
updating: "frissítés"
- few: "%{count} csoport"
- helper:
- are_you_sure: "Biztos, hogy törlöd a csoportot?"
- aspect_not_empty: "A csoport nem üres"
- remove: "eltávolítás"
index:
diaspora_id:
content_1: "A te diaspora* azonosítód:"
@@ -205,11 +198,6 @@ hu:
heading: "Összekapcsolt szolgáltatások"
unfollow_tag: "Követés leállítása #%{tag}"
welcome_to_diaspora: "Üdv a diaspora* közösségi oldalon, %{name}!"
- many: "%{count} csoport"
- move_contact:
- error: "Hiba a kapcsolat mozgatásakor: %{inspect}"
- failure: "nem működött: %{inspect}"
- success: "Más csoportba tett téged."
new:
create: "Létrehoz"
name: "Név"
@@ -227,14 +215,6 @@ hu:
family: "Család"
friends: "Barátok"
work: "Munka"
- selected_contacts:
- manage_your_aspects: "Csoportok kezelése"
- no_contacts: "Itt még nincs ismerősöd."
- view_all_community_spotlight: "Minden figyelem középpontjában lévő tartalom"
- view_all_contacts: "Összes kapcsolat"
- show:
- edit_aspect: "csoport szerkesztése"
- two: "%{count} csoport"
update:
failure: "A %{name} nevű csoportodnak túl hosszú a neve."
success: "%{name} csoport szerkesztve."
@@ -254,36 +234,30 @@ hu:
post_success: "Elküldve! Bezárás!"
cancel: "Mégsem"
comments:
- few: "%{count} hozzászólás"
- many: "%{count} hozzászólás"
new_comment:
comment: "Hozzászólás"
commenting: "Hozzászólok.."
one: "1 hozzászólás"
other: "%{count} hozzászólás"
- two: "%{count} hozzászólás"
zero: "nincs hozzászólás"
contacts:
create:
failure: "Kapcsolat létrehozása sikertelen"
- few: "%{count} ismerős"
index:
add_a_new_aspect: "Új csoport"
+ add_contact: "Ismerős hozzáadása"
add_to_aspect: "Kapcsolatok hozzáadása %{name}"
- add_to_aspect_link: "ismerősök hozzáadása: %{name}"
all_contacts: "Összes ismerős"
community_spotlight: "A figyelem középpontjában"
- many_people_are_you_sure: "Biztos, hogy magánbeszélgetést akarsz kezdeményezni több mint %{suggested_limit} személlyel? Talán jobb lenne, ha bejegyzést írnál ennek a csoportnak."
my_contacts: "Kapcsolataim"
no_contacts: "Nincs ismerősöd."
no_contacts_message: "Tekintsd meg %{community_spotlight} álló népszerű tagokat"
- no_contacts_message_with_aspect: "Tekintsd meg %{community_spotlight} álló népszerű közösségi tagokat vagy lehetőségedben áll még %{add_to_aspect_link}"
only_sharing_with_me: "Követők"
- remove_person_from_aspect: "%{person_name} eltávolítása a(z) \"%{aspect_name}\" csoportból."
+ remove_contact: "Ismerős eltávolítása"
start_a_conversation: "Beszélgetés indítása"
title: "Ismerősök"
+ user_search: "Felhasználó keresése"
your_contacts: "Ismerőseid"
- many: "%{count} ismerős"
one: "1 ismerős"
other: "%{count} ismerős"
sharing:
@@ -291,7 +265,6 @@ hu:
spotlight:
community_spotlight: "A figyelem középpontjában"
suggest_member: "Javasolj egy tagot"
- two: "%{count} ismerős"
zero: "nincs ismerős"
conversations:
conversation:
@@ -300,8 +273,6 @@ hu:
fail: "Érvénytelen üzenet"
no_contact: "Hé, először kapcsolatot kell hozzáadnod!"
sent: "Üzenet elküldve"
- destroy:
- success: "Üzenetváltás sikeresen eltávolítva"
helper:
new_messages:
few: "%{count} új üzenet"
@@ -326,7 +297,7 @@ hu:
new_conversation:
fail: "Érvénytelen üzenet"
show:
- delete: "beszélgetés törlése és blokkolása"
+ delete: "beszélgetés törlése"
reply: "válasz"
replying: "Válaszolás..."
date:
@@ -649,6 +620,26 @@ hu:
click_link: "Ahhoz, hogy aktiváld az új email címedet (%{unconfirmed_email}), kattints erre a linkre:"
subject: "Kérlek aktiváld az új email címedet: %{unconfirmed_email}"
email_sent_by_diaspora: "Ezt az emailt a %{pod_name} küldte. Ha nem szeretnél ilyen leveleket kapni,"
+ export_photos_email:
+ body: |-
+ Szia %{name},
+
+ A képeidet feldolgoztuk és immár letölthetőek a következő címen: %{url}.
+
+ Üdv,
+
+ A diaspora* üzenetküldő automatája.
+ subject: "A képeid letölthetőek, %{name}"
+ export_photos_failure_email:
+ body: |-
+ Szia %{name},
+
+ Hiba lépett fel a képeid letöltéshez való előkészítése során. Kérlek próbáld meg újra!
+
+ Elnézésedet kérjük,
+
+ A diaspora* üzenetküldő automatája.
+ subject: "Gond adódott a képeiddel kapcsolatban, %{name}"
hello: "Szia %{name}!"
invite:
message: |-
@@ -719,7 +710,6 @@ hu:
add_contact_from_tag: "ismerős hozzáadása címkéből"
aspect_list:
edit_membership: "csoport tagság szerkesztése"
- few: "%{count} személy"
helper:
is_not_sharing: "%{name} nem oszt meg veled tartalmakat"
is_sharing: "%{name} megoszt veled"
@@ -733,7 +723,6 @@ hu:
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..."
send_invite: "Még mindig semmi? Küldj meghívót!"
- many: "%{count} személy"
one: "1 személy"
other: "%{count} személy"
person:
@@ -770,7 +759,6 @@ hu:
add_some: "adj hozzá néhányat"
edit: "szerkesztés"
you_have_no_tags: "nincs címkéd!"
- two: "%{count} ember"
webfinger:
fail: "Sajnáljuk, de nem találjuk őt: %{handle}."
zero: "senki"
@@ -867,15 +855,12 @@ hu:
update: "Frissítés"
invalid_invite: "Ez a meghívó többé nem érvényes!"
new:
- continue: "tovább"
create_my_account: "Fiók létrehozása!"
- diaspora: "Diaspora*"
email: "E-MAIL"
enter_email: "Írd be 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_username: "Válassz egy felhasználónevet (csak angol betű, szám és aláhúzás megengedett)"
- hey_make: "GYERÜNK,<br/>KEZDJ<br/>BELE!"
join_the_movement: "Csatlakozz!"
password: "JELSZÓ"
password_confirmation: "JELSZÓ MEGERŐSÍTÉS"
@@ -887,7 +872,7 @@ hu:
comment_label: "<b>Hozzászólás</b>:<br>%{data}"
confirm_deletion: "Biztosan törölni akarod ezt az elemet?"
delete_link: "Elem törlése"
- not_found: "<u>A bejegyzés/hozzászólás nem található, valószínűleg törölte a felhasználó.</u>"
+ not_found: "<u>A bejegyzés/hozzászólás nem található. Valószínűleg törölte a felhasználó.</u>"
post_label: "<b>Bejegyzés</b>: %{title}"
reason_label: "Indok: %{text}"
reported_label: "<b>Jelentette:</b> %{person}"
@@ -1080,11 +1065,11 @@ hu:
no_message_to_display: "Nincs üzenet."
new:
mentioning: "Megemlít: %{person}"
- too_long:
- other: "Rövidíts. Az állapotfrissítésed hossza nem lehet több %{count} leütésnél"
- zero: "Rövidíts. Az állapotfrissítésed hossza nem lehet több %{count} leütésnél"
+ too_long: "Rövidíts. Az állapotfrissítésed nem lehet hosszabb %{count} leütésnél. Jelenleg %{current_length} karakterből áll"
stream_helper:
hide_comments: "hozzászólások elrejtése"
+ no_more_posts: "Elérted a hírfolyam végét."
+ no_posts_yet: "Még nincsenek bejegyzések."
show_comments:
few: "Még %{count} hozzászólás megtekintése"
many: "Még %{count} hozzászólás megtekintése"
@@ -1119,11 +1104,10 @@ hu:
contacts_title: "Személyek a Hírfolyamodban"
title: "Hírfolyam"
public:
- contacts_title: "Friss poszterek"
+ contacts_title: "Legújabb szerzők"
title: "Nyilvános tevékenység"
tags:
contacts_title: "Emberek, akik ezeket a címkéket követik"
- tag_prefill_text: "%{tag_name} témával kapcsolatban csak annyit, hogy... "
title: "Bejegyzés megjelölve: %{tags}"
tag_followings:
create:
@@ -1136,14 +1120,8 @@ hu:
tags:
show:
follow: "Címke követése"
- followed_by_people:
- other: "%{count} ember követi"
- zero: "senki sem követi"
following: "#%{tag} követve"
- nobody_talking: "Senki nem beszélt még erről: %{tag}."
none: "Az üres címke nem létezik!"
- people_tagged_with: "Személy felcímkézve: %{tag}"
- posts_tagged_with: "Bejegyzések felcímkézve: #%{tag}"
stop_following: "Címke-követés leállítása #%{tag}"
terms_and_conditions: "Felhasználási feltételek"
undo: "Visszavonod?"
@@ -1154,7 +1132,7 @@ hu:
email_not_confirmed: "Email cím aktiválása sikertelen. Rossz a link?"
destroy:
no_password: "Add meg a jelszavad, hogy megszüntesd a fiókod."
- success: "A fiókod le van zárva. 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."
+ 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."
edit:
also_commented: "más is hozzászólt az ismerősöd bejegyzéséhez?"
@@ -1167,30 +1145,31 @@ hu:
character_minimum_expl: "legalább hat karakter legyen"
close_account:
dont_go: "Hé, kérlek ne menj!"
- if_you_want_this: "Ha tényleg ezt akarod, írd be a jelszavad és kattints a \"Fiók törlése\" gombra."
- lock_username: "Le tudod védeni a felhasználóneved, ha esetleg mégis úgy döntenél, hogy újra feliratkozol."
- locked_out: "Ki fogunk léptetni és kizárunk a fiókodból."
- 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 el akarod hagyni az oldalt, kérlek olvasd el mi fog következni."
+ if_you_want_this: "Ha tényleg ezt akarod, írd be a jelszavad a lenti mezőbe és kattints a \"Fiók törlése\" gombra."
+ 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:"
mr_wiggles: "Vuk szomorú lesz, ha távozni lát."
- no_turning_back: "Nincs visszaút."
- what_we_delete: "Töröljük az összes bejegyzésedet és adatodat amint tudjuk. A hozzászólásaid megmaradnak, de a neved helyett csak a diaspora* azonosítód lesz látható mellettük."
+ 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."
close_account_text: "Fiók törlése"
comment_on_post: "valaki hozzászólt egy bejegyzésedhez?"
current_password: "Jelenlegi jelszó"
current_password_expl: "amelyikkel bejelentkezel..."
+ download_export_photos: "Képeim letöltése"
download_photos: "Képeim letöltése"
- download_xml: "Saját XML 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_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"
getting_started: "Új felhasználó beállításai"
liked: "valakinek tetszik a bejegyzésed?"
mentioned: "megemlítettek téged egy bejegyzésben?"
new_password: "Új jelszó"
- photo_export_unavailable: "Fényképek kivitele jelenleg nem lehetséges"
private_message: "személyes üzenetet kaptál?"
receive_email_notifications: "Szeretnél értesítést kapni levélben, ha:"
+ request_export_photos_update: "Képeim frissítése"
reshared: "valaki újraosztotta a bejegyzésedet?"
show_community_spotlight: "A \"figyelem középpontjában\" szereplő tartalmak megjelenítése a hírfolyamban"
show_getting_started: "\"Kezdő lépések\" újra engedélyezése"
@@ -1212,6 +1191,7 @@ hu:
who_are_you: "Ki is vagy?"
privacy_settings:
ignored_users: "Mellőzött felhasználók"
+ no_user_ignored_message: "Jelenleg nem mellőzöl más felhasználót"
stop_ignoring: "Mellőzés feloldása"
title: "Adatvédelmi beállítások"
public:
diff --git a/config/locales/diaspora/hy.yml b/config/locales/diaspora/hy.yml
index aeed6b167..7d9190647 100644
--- a/config/locales/diaspora/hy.yml
+++ b/config/locales/diaspora/hy.yml
@@ -7,10 +7,13 @@
hy:
_applications: "Հավելվածներ"
_comments: "Մեկնաբանություններ"
- _contacts: "Կոնտակտներ"
+ _contacts: "Մարդիկ"
+ _help: "Օգնություն"
_home: "Գլխավոր էջ"
- _photos: "նկարներ"
+ _photos: "Նկարներ"
_services: "Ծառայություններ"
+ _statistics: "Վիճակագրություն"
+ _terms: "Պայմաններ"
account: "Հաշիվ"
activerecord:
errors:
@@ -23,6 +26,14 @@ hy:
attributes:
diaspora_handle:
taken: "արդեն օգտագործվում է։"
+ poll:
+ attributes:
+ poll_answers:
+ not_enough_poll_answers: "Անբավարար քանակությամբ հարցման պատասխաններ եք գրել։"
+ poll_participation:
+ attributes:
+ poll:
+ already_participated: "Արդեն մասնակցել ես էս հարցմանը։"
request:
attributes:
from_id:
@@ -39,13 +50,15 @@ hy:
invalid: "անվավեր է"
username:
invalid: "անվավեր է։ Թույլատրվում են միայն տառեր, թվեր և ներքևի գծեր։"
- taken: "արդեն զբաղված է"
+ taken: "արդեն օգտագործվում է։"
admins:
admin_bar:
correlations: "Կախվածություններ"
pages: "Էջեր"
pod_stats: "Փոդի վիճակագրություն"
- user_search: "Օգտատերի որոնում"
+ report: "Զեկույցներ"
+ sidekiq_monitor: "Sidekiq մոնիտոր"
+ user_search: "Օգտատիրոջ որոնում"
weekly_user_stats: "Օգտատերերի շաբաթական վիճակագրություն"
correlations:
correlations_count: "Correlations with Sign In Count:"
@@ -76,14 +89,37 @@ hy:
other: "%{count} օգատատեր"
zero: "%{count} օգատատեր"
week: "Շաբաթ"
+ user_entry:
+ account_closed: "Հաշիվը փակված է"
+ diaspora_handle: "դիասպորայի ID(username@pod.am)"
+ email: "Էլ․ հասցե"
+ guid: "ՈւՂԵՑՈՒՅՑ (չխառնվես իրար ։Ճ )"
+ id: "ID"
+ last_seen: "Վեջին անգամ երևացել է"
+ ? "no"
+ : Ոչ
+ nsfw: "#քխ"
+ unknown: "Անհայտ"
+ ? "yes"
+ : Այո
user_search:
+ account_closing_scheduled: "%{name}ի հաշիվը փակվում է։ Մի քանի րոպեի ընթացքում կավարտենք։"
+ account_locking_scheduled: "%{name}ի հաշիվը պլանավորում է արգելափակել։ Դա կկատարվի մի քանի րոպեների ընթացքում․․․"
+ account_unlocking_scheduled: "%{name}ի հաշիվը պլանավորում է ապարգելափակել։ Դա կկատարվի մի քանի րոպեների ընթացքում․․․"
add_invites: "ավելացնել հրավերներ"
+ are_you_sure: "Համոզվա՞ծ ես,որ ուզում ես փակել այս հաշիվը։"
+ are_you_sure_lock_account: "Համոզվա՞ծ ես, որ ուզում ես արգելափակել այս հաշիվը։"
+ are_you_sure_unlock_account: "Համոզվա՞ծ ես, որ ուզում ես ապարգելափակել այս հաշիվը։"
+ close_account: "Փակել հաշիվը"
email_to: "Հրավիրել նամակով"
+ under_13: "Ցուցադրել օգտատերերին որ 13 (COPPA)֊ից ցածր են։"
users:
one: "%{count} օգտատեր գտնվեց"
other: "%{count} օգտատեր գտնվեց"
zero: "%{count} օգտատեր գտնվեց"
- you_currently: "ներկա պահին դու ունես %{user_invitation} հրավեր ուղարկելու հնարավորություն. %{link}"
+ view_profile: "Դիտել անձնական էջը"
+ you_currently:
+ other: "ներկա պահին դու ունես %{user_invitation} հրավեր ուղարկելու հնարավորություն. %{link}"
weekly_user_stats:
amount_of:
one: "այս շաբաթվա նոր օգտատերերի քանակը՝ %{count}"
@@ -94,22 +130,20 @@ hy:
all_aspects: "Բոլոր խմբերը"
application:
helper:
- unknown_person: "անհայտ անձ"
+ unknown_person: "Անհայտ անձ"
video_title:
unknown: "Տեսանյութի անհայտ վերնագիր"
are_you_sure: "Համոզվա՞ծ ես"
are_you_sure_delete_account: "Համոզվա՞ծ ես, որ ուզում ես փակել հաշիվդ։ Էլ վերականգնել չի լինի։"
aspect_memberships:
destroy:
- failure: "Խմբից անձի հեռացումը ձախողվեց"
+ failure: "Չստացվեց խմբից հեռացնել այս մարդուն։"
no_membership: "Չստացվեց գտնել ընտրված կոնտակտին այդ խմբում"
- success: "Անձը հաջողությամբ հեռացվեց խմբից"
+ success: "Այս մարդը հաջողությամբ հեռացվեց խմբից։"
aspects:
add_to_aspect:
- failure: "Չստացվեց կոնտակտը այդ խմբին ավելացնել"
- success: "Կոնտակտը բարեհաջող ավելացվեց այդ խմբին։"
- aspect_contacts:
- done_editing: "պատրաստ է"
+ failure: "Չստացվեց այդ խումբ մարդ ավելացնել։"
+ success: "Բարեհաջող ավելացվեց այդ խումբ։"
aspect_listings:
add_an_aspect: "+ Ստեղծել նոր խումբ"
deselect_all: "Ապանշել ամբողջը"
@@ -118,58 +152,60 @@ hy:
aspect_stream:
make_something: "Ստեղծիր"
stay_updated: "Եղիր տեղեկացված"
- stay_updated_explanation: "Քո լրահոսը հեղեղված է ընկերներիդ գործողություններով, պիտակներով, որոնց հետևում ես, և համայնքի որոշ կրեատիվ անդամների գրառումներով։"
- contacts_not_visible: "Այս խմբի կոնտակտները տեսանելի չեն միմյանց համար։"
- contacts_visible: "Այս խմբի կոնտակտները կկարողանան տեսնել միմյանց։"
+ stay_updated_explanation: "Քո լրահոսը հեղեղված է ընկերներիդ գործողություններով, պիտակներով, որոնց հետևում ես, և համայնքի որոշ ստեղծարար անդամների գրառումներով։"
+ contacts_not_visible: "Այս խմբի մարդիկ չեն կարողանա տեսնել միմյանց։"
+ contacts_visible: "Այս խմբի մարդիկ կկարողանան տեսնել միմյանց։"
create:
failure: "Չհաջողվեց ստեղծել խումբը։"
success: "Քո նոր %{name} խումբը պատրաստ է"
destroy:
failure: "%{name}-ը դատարկ չէ և չի կարող ջնջվել։"
- success: "%{name} բարեհաջող ջնջվեց։"
+ success: "%{name}-ը բարեհաջող ջնջվեց։"
edit:
- add_existing: "Ավելացնել գոյություն ունեցող կոնտակտ"
+ aspect_chat_is_enabled: "Այս խմբի ընկերներդ կարող են չաթվել քո հետ։"
+ aspect_chat_is_not_enabled: "Այս խմբի ընկերներդ չենք կարող չաթվել քո հետ։"
aspect_list_is_not_visible: "խմբի ցուցակը տեսանելի չէ նրա անդամներին"
aspect_list_is_visible: "խմբի ցուցակը տեսանելի է նրա անդամներին"
confirm_remove_aspect: "Վստա՞հ ես, որ ուզում ես ջնջել այս խումբը։"
- done: "Պատրաստ է"
- make_aspect_list_visible: "այս խմբի կոնտակտներին դարձնե՞լ տեսանելի միմյանց համար։"
+ grant_contacts_chat_privilege: "Այս խմբի ընկերներին տա՞լ քո հետ չաթվելու պատիվ ու հնարավորություն։"
+ make_aspect_list_visible: "Դարձնե՞լ այս խմբի մարդկանց տեսանելի միմյանց համար։"
remove_aspect: "Ջնջել այս խումբը"
rename: "վերանվանել"
- update: "թարմացնել"
+ set_visibility: "Կարգավորել տեսանելիությունը"
+ update: "Թարմացնել"
updating: "թարմացվում է"
- few: "%{count} խմբեր"
- helper:
- are_you_sure: "Վստա՞հ ես, որ ուզում ես ջնջել այս խումբը։"
- aspect_not_empty: "Խումբը դատարկ չէ"
- remove: "հեռացնել"
index:
diaspora_id:
- content_1: "Քո Diaspora ID-ն՝"
- content_2: "Հաղորդիր սա որևիցե մեկին, և նա կկարողանա գտնել քեզ Diaspora-ում։"
- heading: "Diaspora ID"
+ content_1: "Քո դիասպորայի ID-ն՝"
+ content_2: "Փոխանցիր սա ցանկացած մեկին, և նա կկարողանա գտնել քեզ դիասպորայում։"
+ heading: "դիասպորայի ID"
donate: "Նվիրաբերել"
handle_explanation: "Սա քո Diaspora ID-ն է։ Մարդիկ կարող են գտնել քեզ ինչպես քո էլ. հասցեով, այնպես էլ քո Diaspora ID-ով։"
help:
- do_you: "Դու."
+ any_problem: "Խնդիրնեն կա՞ն։"
+ contact_podmin: "Կապվի՛ր քո փոդի ադմինի հետ։"
+ do_you: "Արդյո՞ք."
email_feedback: "Կարող ես նաև %{link}-ին ուղարկել քո կարծիքը։"
email_link: "էլ․ փոստ"
- feature_suggestion: "… %{link} ունե՞ք։"
- find_a_bug: "… %{link} ե՞ս գտել։"
- have_a_question: "… %{link} ունե՞ս։"
+ feature_suggestion: "… %{link} ունե՞ս։"
+ find_a_bug: "… %{link} ես գտել։"
+ have_a_question: "… %{link} ունես։"
here_to_help: "Համայնքն այստե՜ղ է։"
+ mail_podmin: "Փոդմինի էլ․փոստը"
need_help: "Օգնությու՞ն"
tag_bug: "բագ"
tag_feature: "առաջարկություն"
tag_question: "հարց"
- introduce_yourself: "Սա քո լրահոսն է։ Ընկղմվիր և ներկայացրու քեզ։"
+ tutorial_link_text: "Ուսուցանող նյութեր"
+ tutorials_and_wiki: "%{faq}, %{tutorial}, և %{wiki}՝ օգնություն առաջին քայլերիդ համար։"
+ introduce_yourself: "Սա քո լրահոսն է։  Ընկղմվիր ու ներկայացրու ինքդ քեզ։"
keep_diaspora_running: "Օգնի՛ր Diaspora-ի արագ զարգացմանը ամսական նվիրատվությամբ։"
keep_pod_running: "Փող քցվենք %{pod} -ի առողջության համար:"
new_here:
follow: "Հետևիր %{link}-ին և ողջունիր Diaspora*-ի նոր օգտատերերին։"
learn_more: "Իմանալ ավելին"
title: "Ողջունի՛ր նորեկներին"
- no_contacts: "Կոնտակտներ չկան"
+ no_contacts: "Ոչ ոք չկա"
no_tags: "+ Հետևելու պիտակ գտնել"
people_sharing_with_you: "Քեզ հետ կիսվող մարդիկ"
post_a_message: "հաղորդագրություն գրել >>"
@@ -178,36 +214,23 @@ hy:
heading: "Միացնել ծառայությունները"
unfollow_tag: "Դադարել հետևել #%{tag}-ին"
welcome_to_diaspora: "Բարի գալուստ Diaspora*, %{name} ջան։"
- many: "%{count} խմբեր"
- move_contact:
- error: "Չստացվեց կոնտակտը տեղափոխել՝ %{inspect}"
- failure: "չաշխատեց %{inspect}"
- success: "Անձը տեղափոխվեց նոր խումբ։"
new:
create: "Ստեղծել"
name: "Անունը (միայն քեզ է տեսանելի)"
no_contacts_message:
community_spotlight: "համայնքի նորությունները"
or_spotlight: "Կամ կարող ես կիսվել %{link}-ով։"
- try_adding_some_more_contacts: "Կարող ես ևս ընկերներ փնտրել կամ հրավիրել նրանց։"
- you_should_add_some_more_contacts: "Լավ կլինի՝ մի քանի կոնտակտ ավելացնես։"
+ try_adding_some_more_contacts: "Կարող ես ևս փնտրել մարդկանց կամ հրավիրել։"
+ you_should_add_some_more_contacts: "Լավ կլինի՝ մի քանի մարդ ավելացնես։"
no_posts_message:
start_talking: "Բոլորը դավադրաբար լռում են դեռ։"
one: "1 խումբ"
- other: "%{count} խմբեր"
+ other: "%{count} խումբ"
seed:
acquaintances: "Ծանոթներ"
family: "Ընտանիք"
friends: "Ընկերներ"
work: "Աշխատանք"
- selected_contacts:
- manage_your_aspects: "Կարգավորել խմբերը"
- no_contacts: "Դու դեռ ոչ մի կոնտակտ չունես այստեղ։"
- view_all_community_spotlight: "Դիտել համայնքի բոլոր նորությունները"
- view_all_contacts: "Տես բոլոր կոնտակտները"
- show:
- edit_aspect: "փոփոխել խումբը"
- two: "%{count} խումբ"
update:
failure: "Քո՝ %{name} խմբի անունը շատ երկար է և չի կարող պահպանվել։"
success: "Քո՝ %{name} խումբը հաջողությամբ փոփոխվեց։"
@@ -221,60 +244,65 @@ hy:
failure: "Չստացվեց դադարեցնել արհամարհել այդ օգտատիրոջը։"
success: "Եկ տեսնենք՝ ինչ ունեն նրանք ասելու։ #sayhello"
bookmarklet:
- post_something: "Գրառել Diaspora-ում"
+ explanation: "Գրառիր դիասպորայում ցանկացած տեղից նշելով այս հղումը => %{link}"
+ heading: "Նշագրում (Bookmarklet)"
+ post_something: "Գրառել դիասպորայում"
post_success: "Գրառվեց։ Փակվում եմ։ ։Ճ"
cancel: "Չեղարկել"
comments:
- few: "%{count} մեկնաբանություն"
- many: "%{count} մենկնաբանություններ"
new_comment:
comment: "Մեկնաբանել"
commenting: "Մեկնաբանվում է…"
one: "1 մեկնաբանություն"
- other: "%{count} մեկնաբանություններ"
- two: "%{count} մեկնաբանություն"
+ other: "%{count} մեկնաբանություն"
zero: "մեկնաբանություն չկա"
contacts:
create:
failure: "Չհաջողվեց կապ հաստատել"
- few: "%{count} ընկերներ"
index:
add_a_new_aspect: "Նոր խումբ ավելացնել"
- add_to_aspect: "ընկերներ ավելացնել %{name} խմբին"
- add_to_aspect_link: "Ընկերներ ավելացնել %{name}-ին"
+ add_contact: "Ընկեր ավելացնել"
+ add_to_aspect: "%{name} խմբին մարդ ավելացնել"
all_contacts: "Բոլոր ընկերները"
community_spotlight: "Համայնքի նորությունները"
- many_people_are_you_sure: "Համոզվա՞ծ ես, որ խոսակցություն ես ուզում սկսել ավելի քան %{suggested_limit} մարդկանց հետ։ Ամբողջ խմբի համար գրառում կատարելը կարող է ավելի հարմար ուղի լինել նրանց հետ հաղորդակցվելու համար։"
my_contacts: "Իմ ընկերները"
no_contacts: "Երևում է՝ նոր ընկերների կարիք ունես։"
+ no_contacts_in_aspect: "Այս խմբում դեռ ոչ մեկին չես ավելացրել։ Ներքևում այս պահի քո բոլոր ընկերների ցուցակն է, ում կարող ես ավելացնել այս խմբին։"
no_contacts_message: "Ստուգել %{community_spotlight}"
- no_contacts_message_with_aspect: "Աչքի անցկացրու %{community_spotlight}-ը կամ %{add_to_aspect_link}"
only_sharing_with_me: "Միայն ինձ հետ կիսվողները"
- remove_person_from_aspect: "Հեռացնել %{person_name}-ին %{aspect_name}-ից"
+ remove_contact: "Ջնջել ընկերոջը"
start_a_conversation: "Խոսակցություն սկսել"
- title: "Կոնտակտներ"
+ title: "Մարդիկ"
+ user_search: "Օգտատերերի որոնում"
your_contacts: "Քո կոնտակտները"
- many: "%{count} ընկերներ"
- one: "1 կոնտակտ"
- other: "%{count} ընկեր"
+ one: "1 հոգի"
+ other: "%{count} հոգի"
sharing:
people_sharing: "Քեզ հետ կիսվող մարդիկ"
spotlight:
community_spotlight: "Համայնքի նորությունները"
- two: "%{count} ընկեր"
- zero: "կոնտակտ"
+ suggest_member: "Անդամ առաջարկի՛ր"
+ zero: "Ոչ ոք չկա"
conversations:
+ conversation:
+ participants: "Մասնակիցները"
create:
+ fail: "Անվավեր հաղորդագրություն"
+ no_contact: "Հեե՜յ, սկզբում կոնտակտին պիտի ավելացնես։"
sent: "Նամակն ուղարկված է"
destroy:
- success: "Զրույցը հաջողությամբ ջնջվեց"
+ delete_success: "Զրույցը հաջողությամբ ջնջվեց"
+ hide_success: "Զրույցը հաջողությամբ թաքցվեց"
helper:
new_messages:
one: "1 նոր նամակ"
other: "%{count} նոր նամակներ"
zero: "Նոր նամակ չկա"
index:
+ conversations_inbox: "Զրույցներ ֊ Մուտքային"
+ create_a_new_conversation: "Նոր զրույց սկսել"
inbox: "Մուտքային նամակներ"
+ new_conversation: "Նոր զրույց"
no_conversation_selected: "ոչ մի խոսակցություն չի ընտրվել"
no_messages: "նամակ չկա"
new:
@@ -282,9 +310,11 @@ hy:
send: "Ուղարկել"
sending: "Ուղարկվում է․․․"
subject: "թեմա"
- to: ""
+ new_conversation:
+ fail: "Անվավեր հաղորդագրություն"
show:
delete: "ջնջել և արգելափակել խոսակցությունը"
+ hide: "Թաքցնել և ձայնազրկել զրույցը"
reply: "պատասխանել"
replying: "Պատասխանը ուղարկվում է..."
date:
@@ -300,20 +330,243 @@ hy:
invalid_fields: "Անվավեր դաշտեր"
login_try_again: "<a href='%{login_link}'>մուտք գործիր</a> և փորձիր նորից:"
post_not_public: "Գրառումը, որ փորձում ես դիտել, հրապարակային չէ։"
+ post_not_public_or_not_exist: "Գրառումը, որ փորձում ես դիտել, հանրային չէ կամ գոյություն չունի։"
fill_me_out: "Լրացրու՛ ինձ"
find_people: "Գտնել մարդկանց կամ #պիտակներ"
+ help:
+ account_and_data_management:
+ close_account_a: "Գնա Կարգավորումներ -> Հաշիվ ու սեղմիր էջի ամենաներքևի «Փակել հաշիվս» կոճակը։"
+ close_account_q: "Ինչպե՞ս ջնջեմ իմ հաշիվը։"
+ data_other_podmins_a: "Հենց կիսվեցիր ինչ֊որ մեկի հետ այլ փոդից քո բոլոր գրառումները, որ կիսվում ես իրենց հետ և քո էջի կրկնօրինակը պահվում են (քեշավորվում) իրենց փոդում և հասանելի են այդ փոդի տվյալների բազայի ադմինին։ Երբ դու ջնջում ես որևէ գրառում կամ էջիդ տվյալները, դրանք ջնջվում են քո փոդից և բոլոր այլ փոդերից, ուր պահվում էին մինչ այդ։"
+ data_other_podmins_q: "Կարո՞ղ են փոդի ադմինները տեսնել իմ տեղեկատվությունը։"
+ data_visible_to_podmin_a: "Հաղորդակցությունը փոդերի միջև միշտ կոդավորված է (SSԼ֊ով և Դիասպորա*֊ի սեփական տեղափոխման կոդավորմամբ), սակայն տվյալների պահպանումը փոդերում կոդավորված չէ։ Եթե ցանկանա, քո փոդի տվյալների բազայի ադմինիստրատորին (սովորաբար համընկնում է փոդը աշխատեցնողի հետ) հասանելի են քո անձնական էջը և մնացած ամենը, որ գրառում ես (ճիշտ նույնպես ինչպես մյուս կայքերում, որ պահպանում են օգտատիրոջ տվյալները)։ Եթե աշխատեցնես քո փոդը, կունենաս ավելի շատ գաղտնիություն, քանզի այդ ժամանակ դու ես կառավարում տվյալների բազայի մուտքը։"
+ data_visible_to_podmin_q: "Իմ հաշվում եղած տվյալների ո՞ր մասը կարող է տեսնել իմ փոդի ադմինը։"
+ download_data_a: "Այո՛․ գնա Կարգավորումներ -> Հաշիվ, էջի ամենաներքևում կա երկու կոճակ քո տվյալները ներբեռնելու համար։"
+ download_data_q: "Կարո՞ղ եմ ներբեռնել իմ հաշվում եղած բոլոր տվյալների պատճեն։"
+ move_pods_a: "Հետագայում հնարավոր կլինի տեղափոխել քո հաշիվը մի փոդից դեպի մյուսը, սակայն այժմ դա հնարավոր չէ։ Դու միշտ կարող ես բացել նոր հաշիվ ու ավելացնել քո ընկենրեին այնտեղի խմբերին և խնդրել նրանց, որ ավելացնեն քո նոր հաշիվը իրենց մոտ։"
+ move_pods_q: "Ինչպե՞ս տեղափոխեմ իմ հաշիվը մի փոդից դեպի մյուսը:"
+ title: "Հաշվի և տվյալների կառավարում"
+ aspects:
+ change_aspect_of_post_a: "Ոչ, բայց դու միշտ էլ կարող ես անել նոր գրառում նույն բովանդակությամբ ու տեսանելի դարձնել այլ խմբերի։"
+ change_aspect_of_post_q: "Երբ արդեն կատարել եմ գրառումը, կարո՞ղ եմ փոխել խմբերին, ում այն տեսանելի է։"
+ contacts_know_aspect_a: "Չէ, նրանք չեն կարող տեսնել՝ քո որ խմբում են իրենք ոչ մի դեպքում։ Միայն եթե դու իրենց ասես կամ ցույց տաս։"
+ contacts_know_aspect_q: "Իմ ընկերները գիտե՞ն՝ որ խմբում եմ իրենց դրել։"
+ contacts_visible_a: "Եթե ընտրես այդ կետը, ապա այդ խմբի մարդիկ կկարողանան տեսնել խմբում ուրիշ ով կա․ քո էջի վրա, ավատարիդ տակ։ Դա արժի ընտրել էն դեպքում, եթե այդ խմբում բոլոր մարդիկ իրար ճանաչում են։ Նրանք միևնույն է չեն կարողանա տեսնել՝ ինչպես է խումբը կոչվում։"
+ contacts_visible_q: "Ի՞նչ է անում «այս խմբի մարդկանց դարձնե՞լ տեսանելի միմյանց համար» կետը։"
+ delete_aspect_a: "Քո կոնտակտների էջում ձախ կողմի ցանցում սեղմիր խմբի վրա, որ ուզում ես ջնջել։ Ապա, երբ խմբի անունը մեծ կհայտնվի վերևում , սեղմիր նկարված փոքրիկ աղբարկղը [ «Ջնջել» ]։"
+ delete_aspect_q: "Ինչպե՞ս ջնջեմ խումբը։"
+ person_multiple_aspects_a: "Այո։ Գնա քո կոնտակտների էջ և սեղմիր «Իմ ընկերները»։ Յուրաքանչյուր մարդու համար կարող ես օգտագործել աջ կողմի ցանկը նրան քանի խմբում ուզես ավելացնելու կամ հանելու համար։ Կամ կարող ես ավելացնել կամ հանել մարդկանց նոր խմբից սեղմելով խումբ ընտրող կոճակը իրենց էջի վրա։ Կամ էլ կարող ես պարզապես կուրսորդ նրանց վրա պահել ցանկացած այլ տեղ, ասենք լրահոսումդ, և կհայտնվի նրանց մասին ընդհանուր տեղեկատվությամբ պատուհանը։ Հենց այդտեղի աջ մասում էլ կարող ես փոփոխություններ անել։"
+ person_multiple_aspects_q: "Կարո՞ղ եմ մարդուն ավելացնել մի քանի խմբի մեջ։"
+ post_multiple_aspects_a: "Հա։ Երբ գրառում ես անում, օգտագործիր խմբերը ընտրելու կոճակը խմբերը ներառելու կամ հանելու համար։ Քո գրառումը տեսանելի կլինի բոլոր նշված խմբերին։ Նաև կարող ես ընտրել խմբեր ձախ ցանկից («Իմ խմբերը»)։ Երբ գրառում ես, խումբը կամ խմբերը, որ ընտրել ես այդ ցուցակում, ինքնաբերաբար կնշվեն խումբ ընտրելու մասում։"
+ post_multiple_aspects_q: "Կարո՞ղ եմ միանգամից մի քանի խմբերի համար գրառել։"
+ remove_notification_a: "Ո՛չ։ Նրանք նաև չեն ծանուցվում, երբ փոխում ես իրենց խումբը, եթե արդեն սկսել ես կիսվել իրենց հետ։"
+ remove_notification_q: "Եթե ես ջնջում եմ ինչ֊որ մեկին իմ խմբերից, նրանք զգուշացվո՞ւմ են դրա մասին։"
+ rename_aspect_a: "Ահա, քո խմբերի ցուցակում՝ կոնտակտների էջի ձախ կողմում , տար կուրսորդ այն խմբի վրա, որ ուզում ես վերանվանել։ Սեղմիր դրա վրա ու երբ կհայտնվի խմբի անունը մեծ, սեղմիր անվան կողքի մատիտի վրա՝ «վերանվանել»։"
+ rename_aspect_q: "Ինչպե՞ս վերանվանել խումբը։"
+ restrict_posts_i_see_a: "Ահա։ Սեղմիր «Իմ խմբերը» ձախ կողմում ապա սեղմիր կոնկրետ խմբերին, որ նշես կամ ապանշես դրանք։ Միայն նշված խմբերի մարդկանց գրառումները կհայտնվեն քո լրահոսում։"
+ restrict_posts_i_see_q: "Կարո՞ղ եմ այնպես անել, որ տեսնեմ միայն կոնկրետ խմբի ընկերներիս գրառումները։"
+ title: "Խմբերի մասին"
+ what_is_an_aspect_a: "Խմբերը քո դիասպորայի ընկերներին խմբավորելու ձևն են։ Էդ քեզ թողնում ա կարգավորել, թե ով ես դու տարբեր խմբերում, օրինակ՝ աշխատավայրում ոնցն ես ու ինչ ես կիսվում իրենց հետ, ընկերների կամ ինչ֊որ սպեցիֆիկ խմբավորման հետ ինչպիսին ես ու ինչ ես կրկին կիսվում իրենց հետ։"
+ what_is_an_aspect_q: "Ի՞նչ է խումբը։"
+ who_sees_post_a: "Եթե սահմանափակ գրառում ես անում, դա միայն տեսանելի կլինի այն մարդկանց, ում ավելացրել ես այդ խմբի մեջ (կամ այդ խմբերի մեջ եթե մի քանի խումբ ես ընտրել)։ Քո մյուս ընկերները, որ այդ խմբում չեն, չունեն տարբերակ դա տեսնելու, քանի դեռ գրառումը հրապակայաին չանես։ Միայն հրապարակային գրառումներն են, որ տեսանելի են մարդկանց, ովքեր չկան քո խմբ(եր)ում։"
+ who_sees_post_q: "Երբ ես գրառում եմ որևէ խմբի համար, ո՞վ է դա տեսնում։"
+ chat:
+ add_contact_roster_a: "Առաջին հերթին, պետք է չաթը ակտիվացնես խմբերից մեկի համար, ուր այդ մարդը կա։ Սա անելու համար գնա %{contacts_page}, ընտրիր ուզածդ խումբը և սեղմիր չաթի պատկերի վրա, որ ակտիվացնես չաթը։ %{toggle_privilege} Դու կարող ես ստեղծել հատուկ խումբ «Չաթ» անվամբ ու ավելացնել էնտեղ այն մարդկանց, ում հետ հավես ունես չաթվելու։ Երբ սա անես, բացիր չաթվելու ինտերֆեյսը, ընտրիր ում հետ ես ուզում չաթվել։"
+ add_contact_roster_q: "Ինչպե՞ս չաթվել Դիասպորայում։"
+ contacts_page: "ընկերների էջ"
+ title: "Չաթ"
+ faq: "ՀՏՀ"
+ foundation_website: "Դիասպորա հիմնադրամի կայքը"
+ getting_help:
+ get_support_a_faq: "Կարդա մեր %{faq}֊ն վիքիում"
+ get_support_a_hashtag: "հարցրու Սփյուռքում հրապարակային գրառմամբ ու օգտագործիր %{question} հեշթագը"
+ 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_a: "Դու բախտավոր ե՜ս։ Փորձիր %{tutorial_series} մեր նախագծի կայքում։ Այն քեզ կօգնի քայլ առ քայլ հասկանալ գրանցման գործընթացը և կսովորեցնի բոլոր հիմունքային բաները, որ քեզ անհրաժեշտ են Սփյուռքից (diaspora֊այից) օգտվելու համար։"
+ getting_started_q: "Օգնեե՜ք։ Ես սկզբնական օգնության կարիք ունեմ, որ կարողանամ սկսել։"
+ title: "Օգնություն"
+ getting_started_tutorial: "«ԻՆչպե՞ս սկսել» ուսուցանող նյութերի շարքը"
+ here: "այստեղ"
+ irc: "IRC"
+ keyboard_shortcuts:
+ keyboard_shortcuts_a1: "Լրահոսում կարող ես օգտագարծել ստեղնաշարային հետևյալ կրճատումները․"
+ keyboard_shortcuts_li1: "j - գնալ հարոջդ գրառում (<b>J</b>ump)"
+ keyboard_shortcuts_li2: "k - գնալ դեպի նախրդ գրառումը (I J <b>K</b> L)"
+ keyboard_shortcuts_li3: "c - մեկնաբանել տվյալ գրառումը (<b>C</b>omment)"
+ keyboard_shortcuts_li4: "l - հավանել տվյալ գրառումը(<b>L</b>ike)"
+ keyboard_shortcuts_li5: "r ֊ Տարածել տվյալ գրառումը (<b>R</b>eshare)"
+ keyboard_shortcuts_li6: "m - մեծ բացել տվյալ գրառումը"
+ keyboard_shortcuts_li7: "o ֊ բացել այս գրառման առաջին հղումը (<b>O</b>pen)"
+ keyboard_shortcuts_li8: "ctrl+enter֊ Ուղարկել նամակը, որ հավաքում էիր"
+ keyboard_shortcuts_q: "Ի՞նչ ստեղնաշարային կրճատումներ կան։"
+ title: "Կարճված հրամաններ"
+ markdown: "Նշաձև(Markdown)"
+ mentions:
+ how_to_mention_a: "Հավաքիր «@» և սկսիր հավաքել այդ մարդու անունը։ Բացվող ցանկ կհայտնվի, որտեղից կարող ես ընտրել մարդկանց հեշտությամբ։ Ի դեպ, նշել հնարավոր է միայն այն մարդկանց, ում ավելացրել ես խմբերումդ։"
+ how_to_mention_q: "Ինչպե՞ս նշեմ ինչ֊որ մեկին գրառում անելիս։"
+ mention_in_comment_a: "Ոչ, դեռ ոչ։"
+ mention_in_comment_q: "Կարո՞ղ եմ նշել ինչ֊որ մեկին մեկնաբանության մեջ։"
+ see_mentions_a: "Ահա, սեղմիր «@Հիշատակումներ»֊ը հիմնական էջի ձախ կողմում։"
+ see_mentions_q: "Կարո՞ղ եմ տեսնել այն գրառումները, ուր ես հիշատակված եմ։"
+ title: "Նշումների մասին"
+ what_is_a_mention_a: "Նշումը դա տվյալ մարդու էջին տանող հղումն է, որ հայտնվում է գրառման մեջ։ Երբ ինչ֊որ մեկը նշվում է գրառման մեջ, նա ծանուցվում է այդ մասինը, ինչը հրավիրում է նրա ուշադրությունը դեպի գրառում։"
+ what_is_a_mention_q: "Ի՞նչ է «Նշումը»։"
+ miscellaneous:
+ back_to_top_a: "Այո։ Զննիչիդ պատուհանի աջ֊ներքևի անկյունում գտնվող մոխրագույն սլաքը հենց դրա համար է նախատեսված։"
+ back_to_top_q: "Կա որդյո՞ք որևէ կարճ տարբերակ բարձրանալու էջի սկիզբ, երբ բավականին իջել եմ ներքև։"
+ diaspora_app_q: "Դիասպորայի հավելված կա Android֊ի կամ iOS֊ի համար։"
+ photo_albums_a: "Ոչ, դեռ։ Ինչևէ, կարող ես դիտել տվյալ մարդու բոլոր վերբեռնած նկարները իր էջի «Նկարներ» բաժնում։"
+ photo_albums_q: "Կա՞ն տեսանյութերի կամ նկարների ալբոմներ։"
+ subscribe_feed_a: "Ահա, բայց սա դեռ շատ լավ մշակված ֆունկցիա չէ և արդյունքները ձևավորումը շատ կոպիտ է։ Եթե ուզում ես միևնույն է փորձել (իսկ դա արժի փորձել ;Ճ), գնա ինչ֊որ մեկի էջ և սեղմիր հոսքի(feed) կոճակը քո զննիչից (բրաուզեր) կամ պատճենիր նրա էջի հղումը (օրինակ)"
+ subscribe_feed_q: "Կարո՞ղ եմ բաժանորդագրվել ինչ֊որ մեկի հրապարակային գրառումներին ընթերցիչով։"
+ title: "Խառը"
+ pods:
+ find_people_a: "Հրավիրի՛ր ընկերներիդ օգտագործելով աջ կողմի հղումը։ Հետևիր #պիտակներին , որպեսզի բացահայտես ուրիշների, որ կիսում են քո հետաքրքրությունները և ավելացրու խմբերում նրանց, ով գրառում է քեզ հետաքրքրող բաներ։ Ասա, #ԵսՆորեկԵմ հանրային գրառմամբ ու մարդիկ կկարողանան գտնել քեզ։"
+ find_people_q: "Ես հենց նոր միացա փոդին, ինչպե՞ս կարող եմ գտնել մարդկանց ու կիսվել նրանց հետ։"
+ title: "Փոդեր"
+ use_search_box_a: "Եթե գիտես նրանց ամբողջական դիասպորայի անունը (օրինակ՝ mard@podname.am), կարող ես փնտրել դրանով։ Եթե նույն փոդում եք, կարող ես միայն օգտանունը փնտրել («mard» էս դեպքում)։ Մյուս տարբերակը նրանց էջում երևացող անվամբ փնտրելն ա (էս դեպքում օրինակ կարող է լինել Ադամ մարդ Առաջինյան)։ Եթե որոնումը չի աշխատում առաջին անգամ, նորից փորձիր։"
+ use_search_box_q: "Ինչպե՞ս օգտագործեմ որոնման դաշտը կոնկրետ մարդկանց գտնելու համար։"
+ what_is_a_pod_a: "Փոդը այն սերվերն է, որի վրա աշխատում է Դիասպորայի ծրագիրը և որը կապված է Դիասպորայաի ցանցին։ «Փոդը» մետաֆորա է /անգլերենում/, որ վերաբերում է պատիճներին, որ իրենց մեջ պարունակում են սերմեր/հաշիվը անգլերենում կոչում են «սերմ»/, ճիշտ նույն ձև ոնց սերվերը իր մեջ պարունակում է հաշիվները։ Կան բազում տարբեր փոդեր։ Դու կարող ես ընկերներ ավելացնել այլ փոդերից և հաղորդակցվել նրանց հետ։ Կարող ես մտածել, որ Դիասպորայի փոդերը /ինչպիսին է օրինակ Սփյուռքը/ նման են էլ․ փոստ տրամադրողներին․ կան հանրային փոդեր, անձնական փոդեր և որոշ ջանք ներդնելու դեպքում նույնիսկ կարող ես քո սեփականը ստեղծել։"
+ what_is_a_pod_q: "Ի՞նչ է փոդը։"
+ posts_and_posting:
+ char_limit_services_a: "Այս դեպքում քո գրառումը սահամաձակված է ավելի քիչ քանակ նշաններով (140 թուիթերի դեպքում, 1000 Թամբլրի դեպքում), և դեռևս մնացող նշանների քանակը ցուցադրվում է, երբ այդ սերվիսի կոճակը սեղմված է։ Դուք միևնույն է կարող եք կատարել այդ սերվիսներում ավելի երկար գրառումներ քան նրանց սահմանափակումն է թողնում, սակայն տեքստը կկարճեցվի այդ սերվիսներում։"
+ char_limit_services_q: "Նշանների ինչպիսի՞ սահամանափակում կա միացված այնպիսի սերվիսով տարածվող գրառումների համար, ուր կա նշանների սահամանափակում։"
+ character_limit_a: "65,535 նշան։ 65,395֊ով ավելի շատ նշան է քան Թուիթերում։ ;Ճ"
+ character_limit_q: "Նշանների ինչպիսի՞ սահամանափակում կա գրառում անելիս։"
+ embed_multimedia_a: "Սովորաբար կարող ես ուղղակի դնել հղումը (օրինակ՝ http://www․youtube․com/watch?v=nananananana) քո գրառման մեջ և տեսանյութը կամ ձայնագրությունը ինքնաբերաբար կներառվեն։ Այս պահին սպասարկվում են․ YouTube, Vimeo, SoundCloud, Flickr և մի քանի այլ։ Դիասպորան օգտագործում է oEmbed այս ֆունկցիոնալը ապահովելու համար։ Մենք աշխատում ենք ավելի շատ մեդիա աղբյուրներ սպասարկել։ Փորձիր հնարավորինս պարզ անել գրառումը․ ամբողջական հղում /առանց կարճացնելու/, չդնել օպերատորներ հիմնական հղումից հետո և մի քիչ սպասիր մինչ էջը թարմացնելը։"
+ embed_multimedia_q: "Ինչպե՞ս ներառել տեսանյութ, ձայնագրություններ կամ այլ մուլտիմեդիա իմ գրառումների մեջ։"
+ format_text_a: "Օգտագործելով հեշտացված համակարգը՝ %{markdown}։ Կարող ես գտնել նշաձևի ամբողջ սինտաքսը %{here}։ Նախադիտելու կոճակը շատ օգտակար է էդպիսի դեպքերում, որովհետև կարող ես տեսնել՝ ինչ տեսք կունենա քո գրառումը այն անելուց հետո։"
+ format_text_q: "Ինչպե՞ս կարող եմ ձևավորել իմ տեքստը գրառման մեջ ( մուգ(bold), թեք(italic) և այլն )։"
+ hide_posts_a: "Եթե մկնիկդ պահես գրառման վերևում, X է հայտնվում աջ կողմում։ Սեղմիր դրա վրա գրառումը թաքցնելու և դրա ծանուցումները անջատելու համար։ Եթե հետո գնաս գրառած մարդու էջ, կրկին կտեսնես գրառումը։"
+ hide_posts_q: "Ինչպե՞ս թաքցնել գրառումը։"
+ image_text: "նկարի տեքստը"
+ image_url: "նկարի url֊ը"
+ insert_images_a: "Սեղմիր տեսախցիկի պատկերիկը գրառման մեջ նկար ավելացնելու համար։ Կրկին սեղմիր հաջորդ նկարը ավելացնելու համար կամ կարող ես միանգամից մի քանի նկար ընտրել։"
+ insert_images_comments_a1: "Չես կարող մեկնաբանություններում նկարներ վերբեռնել, միայն հետևյալ նշաձևով"
+ insert_images_comments_a2: "կարող է օգտագործվել գրառումներում կամ մեկնաբանություններում համացանցից նկարներ ներառելու համար։"
+ insert_images_comments_q: "Կարո՞ղ եմ նկար ավելացնել մեկնաբանության մեջ։"
+ insert_images_q: "Ինչպե՞ս նկար ներառեմ գրառումների մեջ։"
+ post_location_a: "Սեղմիր գնդասեղի պատկերիկի վրա, որ գրառում անելու դաշտում տեսախցիկի կողքն է։ Կարող ես փոխել քո տեղակայությունը, հնարավոր է ուզենաս միայն քաղաքը ներառել ամբողջական հասցեի փոխարեն։"
+ post_location_q: "Ինչպե՞ս գրառմանը տեղակայություն ավելացնեմ։"
+ post_notification_a: "Աջ վերևի անկյունում՝ X-ի կողքը կտեսնես զանգի պատկերիկ։ Սեղմիր այդ գրառման մասին ծանուցումներ ստանալ֊չստանալու համար։"
+ post_notification_q: "Ինչպե՞ս սկսել կամ դադարել ծանուցումներ ստանալ գրառման մասին։"
+ post_poll_a: "Սեղմիր դիագրամի պատկերիկի վրա։ Մուտքագրիր հարցը և առնվազն երկու պատասխան։ Չմոռանաս գրառումը հրապարակային անել, եթե ուզում ես՝ բոլորը կարողանան մասնակցել հարցմանը։"
+ post_poll_q: "Ինչպե՞ս հարցում ավելացնեմ գրառմանը։"
+ post_report_a: "Սեղմիր տագնապային եռանկյունիկը, որ տեղեկացնես այդ գրառման մասին պոդմինիդ։ Մուտքագրիր դրա մասին զեկուցելու պատճառը։"
+ post_report_q: "Ինչպե՞ս տեղեկացնել վիրավորական գրառման մասին։"
+ size_of_images_a: "Չէ, նկարների չափը մեխանիկորեն փոխվում է հոսքին կամ առանձին գրառման չափին համապատասխան։ Նշաձևը չունի կոդ նկարի չափը սահմանելու համար։"
+ size_of_images_q: "Կարո՞ղ եմ հարմարեցնել նկարների չափերը գրառման կամ մեկնաբանությունների մեջ։"
+ stream_full_of_posts_a1: "Քո լրահոսը բաղկացած է երեք տեսակի գրառումներից․"
+ stream_full_of_posts_li1: "Գրառումներ այն մարդկանցից, ում հետ դու կիսվում ես, որ կրկին երկու տեսակի են լինում հրապարակային գրառումներ և սահամանափակ գրառումներ, որ կիսված են որևէ խմբի հետ․ որի մաս ես դու։ Որպեսզի չտեսնես այս տիպի գրառումները, պարզապես դադարեցրու կիսվելը այդ մարդկանց հետ։"
+ stream_full_of_posts_li2: "Հրապարակային գրառումներ, որ պարունակում են պիտակներ (թեգեր), որոնց դու հետևում ես։ Այս տիպի գրառումներից ազատվելու համար, դադարեցրու հետևելը այդ պիտակներին։"
+ stream_full_of_posts_li3: "Հրապարակային գրառումներ այն մարդկանցից, ովքեր նշված են համայնքի նորությունների ակնարկում։ Սրանք կարող են հեռացվել քո Հաշվի Կարգավորումներից հանելով չռթիկը «Ցուցադրե՞լ համայնքի նորութությունները լրահոսումդ։» կետից առաջ։"
+ stream_full_of_posts_q: "Ինչո՞ւ է իմ լրահոսը լի գրառումներով այնպիսի մարդկանց, ում ես չեմ ճանաչում ու ում հետ չեմ կիսվում։"
+ title: "Գրառելու և գրառումների մասին"
+ private_posts:
+ can_comment_a: "Միայն դիասպորա մուտք գործած մարդիկ, ում դրել ես համապատասխան խմբի մեջ կկարողանան մեկնաբանել կամ հավանել քո անձնական գրառումը։"
+ can_comment_q: "Ո՞վ կարող է մեկնաբանել կամ հավանել իմ անձնական գրառումը։"
+ 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_q: "Ի՞նչ կա իմ անձնական էջում։"
+ 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: "Ո՞վ կարող է մեկնաբանել, հավանել կամ տարածել իմ հրապարակային գրառումները։"
+ deselect_aspect_posting_a: "Խմբեր ապանշելը ոչ մի ազդեցություն չի թողնում հրապարակային գրառումների վրա․ դրանք միևնույն է հրապարակային են և կհայտնվեն բոլոր ընկերներիդ հոսքերում։ Եթե ուզում ես միայն որոշ խմբերի համար գրառում անել, պետք է նշես այդ խմբերը գրառելու դաշտի ներքևում և գրառես միայն իրենց համար։"
+ deselect_aspect_posting_q: "Ի՞նչ է տեղի ունենում, երբ ապանշում եմ որոշ խմբեր հրապարակային գրառում կատարելիս։"
+ find_public_post_a: "Հրապարակային գրառումները հայտնվում են քեզ հետևող բոլոր մարդկանց հոսքերում։ Եթե ներառել ես #պիտակներ, այդ պիտակներին հետևող մարդիկ ևս կտեսնեն գրառումդ իրենց հոսքում։ Հրապարակային գրառումն ունի նաև ցանկացած մարդու տեսանելի հղում, անգամ եթե նա դիասպորա մուտք գործած չէ․ այսպիսով հրապարակային գրառումները կարող են հղվել Թուիթերից, բլոգերից և այլ տեղերից։ Հրապարակային գրառումները նաև կարող են ինդեքսավորվել որոնողական համակարգերի կողմից։"
+ find_public_post_q: "Ինչպե՞ս կարող են մարդիկ գտնել իմ հրապարակային գրառումը։"
+ see_comment_reshare_like_a: "Հրապարակային գրառումների մեկնաբանությունները, հավանումները կամ տարածումները ևս հրապարակային են։ Դիասպորա մուտք գործած ցանկացած մարդ, ինչպես նաև համացանցում շրջող ցանկացած մեկը կարող է տեսնել հրապարակային գրառման հետ քո «շփումը»։"
+ see_comment_reshare_like_q: "Երբ ես մեկնաբանում, տարածում կամ հավանում եմ հրապարակային գրառումը, ո՞վ կարող է դա տեսնել։"
+ title: "Հրապարակային գրառումների մասին"
+ who_sees_post_a: "Համացանցից օգտվող ցանկացած մարդ պոտենցիալ կարող է տեսնել հրապարակային գրառումը, այնպես որ զգոն եղիր հրապարակային գրառում անելուց։ ;Ճ"
+ who_sees_post_q: "Երբ գրառում եմ հրապարակայնորեն, ո՞վ կարող է տեսնել։"
+ public_profiles:
+ title: "Հպարակայաին էջիս մասին"
+ what_do_tags_do_a: "Հիմնականում արևի տակ տաքանում են։ ։Ճ Իսկ եթե լուրջ, դրանք օգնում են մարդկանց ճանաչել քեզ, ինչպես նաև քո նկարը կհայտնվի այդ պիտակի էջում մյուս բոլոր մարդկանց հետ, ովքեր դրել են իրենց մոտ այդ պիտակը։"
+ what_do_tags_do_q: "Ի՞նչ են անում իմ հրապարակային էջի պիտակները։"
+ whats_in_profile_a: "Քո հրապարակային էջը քո անունն է, օգտանունը, հինգ պիտակները, որ նշել ես քեզ նկարագրելու համար և նկարդ, եթե էս դաշտերը լրացրել ես։ Դու ազատ ես ներառելու և չներառելու այս ինֆորմացիան (ինչպես նաև գրելու այստեղ ինչ ուզես֊չուզես ;Ճ). դաշտերը պարատադիր չեն։ Քո հրապարակային էջը ներառում է նաև քո հրապարակային գրառումները։"
+ whats_in_profile_q: "Ի՞նչն է իմ հրապարակային էջը։"
+ who_sees_profile_a: "Ցանկացած դիասպորա մուտք գործած մարդ, ինչպես նաև մնացյալ համացանցը տեսնում է դա։ Ցանկացած էջ ունի ուղիղ հղում դեպի իրեն և այդպիսով կարող է անմիջականորեն հղվել արտաքին կայքերից։ Ինչպես նաև որոնողական համակարգերը ինդեքսավորում են դա։"
+ who_sees_profile_q: "Ո՞վ է տեսնում իմ հրապարակային էջը։"
+ 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: "Գրառումները տարածելու մասին"
+ sharing:
+ add_to_aspect_a1: "Հմ, արի օրինակ նայենք հետևյալ դեպքը․ Շամիրամը ավելացրել է Արային իր խմբերում, բայց Արան (դեռ) չի ավելացրել Շամիրամին։"
+ 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_li8: "Շամիրամը կկարողանա հիշատակել Արային գրառման մեջ։"
+ add_to_aspect_q: "Ի՞նչ է տեղի ունենում, երբ ինչ֊որ մեկին ավելացնում եմ իմ խմբերի մեջ, կամ երբ ինչ֊որ մեկն ինձ է ավելացնում իր խմբերի մեջ։"
+ list_not_sharing_a: "Ոչ, սակայն ստուգել արդյոք որևէ մեկը կիսվում է քեզ հետ, թե ոչ կարող ես այցելելով իր էջ։ Եթե նա կիսվում է,ապա կոճակը, որը ցույց է տալիս իր համար ընտրած խումբդ կլինի կանաչ, եթե ոչ, ապա՝ մոխրագույն։"
+ list_not_sharing_q: "Կա արդյո՞ք այն մարդկանց ցուցակ, որոնց ես ավելացրել եմ իմ խմբերից որևէ մեկին, իսկ նրանք ինձ՝ ոչ։"
+ only_sharing_a: "Սրանք այն մարդիկ են, ով ավելացրել է քեզ իր խմբերում, իսկ դու (դեռ) չես ավելացրել նրանց քո խմբերից որևէ մեկին։ Այլ կերպ ասած՝ նրան կիսվում են քո հետ, իսկ դու իրենց հետ չես կիսվում․ կարող ես մտածել, որ նրանք «հետևում են» քեզ(ոչ պարանոյալ իմաստով ։Դ)։ Եթե ավելացնես նրանց որևէ խմբում, կհայտնվեն էդ խմբի տակ և ոչ թե «Միայն ինձ հետ կիսվողները» բաժնում։ Տես վերևում։"
+ only_sharing_q: "Ովքե՞ր են «Միայն իմ հետ կիսվողները» իմ կոնտակտների էջում։"
+ see_old_posts_a: "Ոչ։ Նա միայն կկարողանա տեսնել քո հետագա գրառումները այդ խմբի համար։ Նա (և մնացած այլոք) կարող է տեսնել քո հին հրապարակային գրառումները (ինչպես քո էջում, այնպես էլ իրենց լրահոսում)։"
+ see_old_posts_q: "Երբ նոր մեկին ավելացնում եմ որևէ խումբ, կարո՞ղ է նա տեսնել իմ հին գրառումները նախատեսված այդ խմբի համար։"
+ sharing_notification_a: "Դու ամենայն հավանականությամբ ծանուցում կստանաս, երբ որևէ մեկը սկսի կիսվել քո հետ։"
+ sharing_notification_q: "Ինչպե՞ս իմանամ, որ ինչ֊որ մեկը սկսեց կիսվել իմ հետ։"
+ title: "Կիսվելու մասին"
+ tags:
+ filter_tags_a: "Սա դեռ հասանելի չի հենց դիասպորայի միջոցով, բայց %{third_party_tools} կարող է օգնել քեզ։"
+ filter_tags_q: "Ինչպե՞ս կարող եմ բացառել որոշ պիտակներ իմ լրահոսից։"
+ followed_tags_a: "Որևէ պիտակ փնտրելուց սեղմելով պիտակի էջի վերևի մասում գտնվող կոճակին՝ կարող ես հետևել դրան։ Դրանից հետո այն կհայտնվի քո հետևվող պիտակների ցուցակում։ Սեղմելով որևէ պիտակի վրա՝ կհայտնվես այդ պիտակի էջում և կտեսնես վերջին գրառումները նշված այդ պիտակով։ Սեղմիր #Հետևվող պիտակներ-ի վրա և կտեսնես բոլոր քո պիտակներով նշված գրառումների հոսք։"
+ followed_tags_q: "Ի՞նչ է #Հետևվող պիտակներ-ը և ինչպե՞ս կարող եմ հետևել որևէ պիտակի։"
+ people_tag_page_a: "Դրանք այն մարդիկ են, ովքեր նկարագրել են իրենց այդ պիտակով։"
+ people_tag_page_q: "Ովքե՞ր են պիտակի էջի ձախ կողմում ցուցադրվող մարդիկ։"
+ tags_in_comments_a: "Մեկնաբանության մեջ ավելացված պիտակը կլինի հղում դեպի այդ պիտակի էջ, սակայն այդ մեկնաբանությունը չի հայտնվի պիտակի էջում։ Պիտակի էջում հայտնվում են այդ պիտակով գրառումները միայն։"
+ tags_in_comments_q: "Կարո՞ղ եմ պիտակներ ավելացնել նաև մեկնաբանությունների մեջ, թե՞ միայն գրառումներում։"
+ title: "Պիտակների մասին"
+ what_are_tags_for_a: "Պիտակները գրառումը կատեգորիաներով դասակարգելու համար են․ հիմնականում ըստ թեմայի։ Փնտրելով պիտակը՝ դու կտեսնես բոլոր քեզ հասանելի այն հրապարակային և սահմանափակ գրառումները, որոնք նշված են այդ պիտակով։ Սա հնարավորություն է տալիս մարդկանց, ովքեր հետաքրքրված են որևէ թեմայով, գտնել հրապարակային գրառումներ դրա վերաբերյալ։"
+ what_are_tags_for_q: "Ինչի՞ համար են պիտակները։"
+ third_party_tools: "երրորդ կողմի գործիքներ"
+ title_header: "Օգնություն"
+ tutorial: "ուսուցանող նյութ"
+ tutorials: "ուսուցանող նյութեր"
+ wiki: "վիկի"
hide: "Թաքցնել"
+ ignore: "Արհամարհել"
invitation_codes:
excited: "%{name} ուրախ է քեզ այստեղ տեսնել։"
invitations:
a_facebook_user: "Facebook-յան օգտատեր"
+ check_token:
+ not_found: "Հրավերի համարը(token) չգտնվեց"
create:
already_contacts: "Այս մարդու հետ արդեն կապ հաստատել ես"
already_sent: "Այս մարդուն արդեն հրավիրել ես։"
+ empty: "Գոնե մի էլ․փոստ գրիր։"
no_more: "Այլևս հրավեր ուղարկելու իրավունք չունես։"
note_already_sent: "Հրավերները արդեն ուղարկվել են հետևյալ հադցեներին. %{emails}"
own_address: "Դու չես կարող հրավեր ուղարկել քո սեփական հասցեին։"
- rejected: "Հետևյալ էլ.հասցեների հետ կապված խնդիրներ կան՝ "
+ rejected: "Հետևյալ էլ. հասցեների հետ կապված խնդիրներ կան՝ "
sent: "Հրավերներ ուղարկվեցին հետևյալ անձանց՝ %{emails}"
edit:
accept_your_invitation: "Ընդունի՛ր հրավերդ"
@@ -334,25 +587,27 @@ hy:
personal_message: "Անձնական նամակ"
resend: "Կրկին ուղարկել"
send_an_invitation: "Հրավեր ուղարկել"
- send_invitation: "Հրավեր ուղարկել"
+ send_invitation: "Ուղարկել հրավերը"
+ sending_invitation: "Հրավերը ուղարկվում է․․․"
to: "Ու՞մ"
layouts:
application:
back_to_top: "Թռնել վերև"
- powered_by: "DIASPORA*-Ի ՀԻՄԱՆ ՎՐԱ"
+ powered_by: "Ստեղծել է դիասպորան"
public_feed: "%{name}-ի հրապարակային հոսքը Diaspora-ում։"
source_package: "ներբեռնել սկզբնական կոդի փաթեթը"
toggle: "թոգլ մոբայլ"
- whats_new: "ի՞նչ կա"
+ whats_new: "Ի՞նչ կա"
your_aspects: "քո խմբերը"
header:
- admin: "ղեկավար"
+ admin: "ադմին"
blog: "բլոգ"
code: "ծածկագիր"
+ help: "Օգնություն"
login: "մտնել"
logout: "Դուրս գալ"
- profile: "Անձնական էջ"
- recent_notifications: "Վերջին ծանուցումներ"
+ profile: "Իմ էջը"
+ recent_notifications: "Վերջին ծանուցումները"
settings: "Կարգավորումներ"
view_all: "Դիտել ամբողջը"
likes:
@@ -379,9 +634,9 @@ hy:
other: "%{actors} նույնպես մեկնաբանել են %{post_author}-ի %{post_link}-ը։"
zero: "%{actors}-ը նույնպես մեկնաբանել է %{post_author}-ի %{post_link}-ը։"
also_commented_deleted:
- one: "%{actors}-ը մեկնաբանել է ջնջված գրառումը։"
- other: "%{actors} մեկնաբանել են ջնջված գրառումը։"
- zero: "%{actors} մեկնաբանել են ջնջված գրառումը։"
+ one: "%{actors} հոգի մեկնաբանել է ջնջված գրառումը։"
+ other: "%{actors} հոգի մեկնաբանել են ջնջված գրառումը։"
+ zero: "%{actors} հոգի մեկնաբանել է ջնջված գրառումը։"
comment_on_post:
one: "%{actors} մեկնաբանեց քո %{post_link}։"
other: "%{actors} մեկնաբանեցին քո %{post_link}։"
@@ -392,57 +647,106 @@ hy:
other: "%{count} նոր ծանուցում"
zero: "Նոր ծանուցում չկա"
index:
- and: "և"
+ all_notifications: "Բոլոր ծանուցումները"
+ also_commented: "Եվս մեկնաբանած"
+ and: "ու"
and_others:
- one: "ևս մեկը"
- other: "ևս %{count}-ը"
- zero: "այլևս ոչ ոք"
+ one: "ու ևս մեկը"
+ other: "ու ևս %{count}-ը"
+ zero: "ու այլևս ոչ ոք"
+ comment_on_post: "Մեկնաբանել գրառումը"
+ liked: "Հավանած"
mark_all_as_read: "Նշել ամբողջը որպես ընթերցված"
+ mark_all_shown_as_read: "Նշել բոլոր ցուցադրվածները որպես կարդացված։"
+ mark_read: "Նշել որպես նայած"
mark_unread: "Նշել որպես չկարդացված"
+ mentioned: "Նշվածներ"
+ no_notifications: "Ոչ մի ծանուցում չունես դեռ։"
notifications: "Ծանուցումներ"
+ reshared: "Տարածվածներ"
+ show_all: "Ցուցադրել բոլորը"
+ show_unread: "Ցուցադրել չնայածները"
+ started_sharing: "Սկսեց կիսվել"
liked:
one: "%{actors} հավանել է քո %{post_link}ը։"
other: "%{actors} հավանել են քո %{post_link}ը։"
zero: "%{actors} հավանել են քո %{post_link}ը։"
liked_post_deleted:
- one: "%{actors}-ը հավանել է քո ջնջված գրառումը։"
- other: "%{actors} հավանել են քո ջնջված գրառումը։"
- zero: "%{actors} հավանել են քո ջնջված գրառումը։"
+ one: "%{actors} հոգի հավանել է ջնջված գրառումդ։"
+ other: "%{actors} հոգի հավանել են ջնջված գրառումդ։"
+ zero: "%{actors} հոգի հավանել է ջնջված գրառումդ։"
mentioned:
one: "%{actors} հիշատակեց քեզ %{post_link}-ում։"
other: "%{actors} հիշատակեցին քեզ %{post_link}-ում։"
zero: "%{actors} հիշատակեցին քեզ %{post_link}-ում։"
mentioned_deleted:
- one: "%{actors}-ը նշել է քեզ ջնջված գրառման մեջ։"
- other: "%{actors} նշել են քեզ ջնջված գրառման մեջ։"
- zero: "%{actors} նշել են քեզ ջնջված գրառման մեջ։"
- post: "Գրառում"
+ one: "%{actors} հոգի նշել է քեզ ջնջված գրառման մեջ։"
+ other: "%{actors} հոգի նշել են քեզ ջնջված գրառման մեջ։"
+ zero: "%{actors} հոգի նշել է քեզ ջնջված գրառման մեջ։"
+ post: "գրառում"
private_message:
- one: "%{actors}-ը քեզ նամակ է ուղարկել։"
- other: "%{actors} քեզ նամակ են ուղարկել։"
- zero: "%{actors} քեզ նամակ են ուղարկել։"
+ one: "%{actors} հոգի քեզ նամակ է ուղարկել։"
+ other: "%{actors} հոգի քեզ նամակ են ուղարկել։"
+ zero: "%{actors} հոգի քեզ նամակ է ուղարկել։"
reshared:
one: "%{actors} տարածել է քո %{post_link}։"
other: "%{actors} տարածել են քո %{post_link}։"
zero: "%{actors} տարածել է քո %{post_link}։"
reshared_post_deleted:
- one: "%{actors} տարածել է քո ջնջված գրառումը։"
- other: "%{actors} տարածել են քո ջնջված գրառումը։"
- zero: "%{actors} տարածել է քո ջնջված գրառումը։"
+ one: "%{actors} հոգի տարածել է ջնջված գրառումդ։"
+ other: "%{actors} հոգի տարածել են ջնջված գրառումդ։"
+ zero: "%{actors} հոգի տարածել է ջնջված գրառումդ։"
started_sharing:
- one: "%{actors} սկսեց կիսվել հետդ։"
- other: "%{actors} սկսեցին կիսվել հետդ։"
- zero: "%{actors} սկսեցին կիսվել հետդ։"
+ one: "%{actors} հոգի սկսեց կիսվել հետդ։"
+ other: "%{actors} հոգի սկսեցին կիսվել հետդ։"
+ zero: "%{actors} հոգի սկսեց կիսվել հետդ։"
notifier:
+ a_limited_post_comment: "Նոր մեկնաբանություն կա Դիասպորայում սահամանափակ գրառման տակ․ նայիր։"
a_post_you_shared: "գրառումը։"
+ a_private_message: "Դիասպորայում նոր անձնական նամակ ունես․ աչքի անցկացրու։"
accept_invite: "Ընդունի՛ր քո՝ Diaspora*-ի հրավերը։"
click_here: "սեղմի՛ր այստեղ"
comment_on_post:
reply: "Պատասխանիր կամ տես %{name}-ի գրառումը >"
confirm_email:
- click_link: "Որպեսզի ակտիվացնես քո նոր էլ.հասցեն՝ %{unconfirmed_email}, հետևիր այս հղմանը՝"
+ click_link: "Որպեսզի ակտիվացնես քո նոր %{unconfirmed_email} էլ.հասցեն, հետևիր այս հղմանը՝"
subject: "Ակտիվացրու քո նոր էլ.հասցեն՝ %{unconfirmed_email}"
email_sent_by_diaspora: "Այս նամակը ուղարկվել է %{pod_name}-ի կողմից։ Եթե այլևս չեք ուզում ստանալ նմանատիպ նամակներ,"
+ export_email:
+ body: |-
+ Ողջո՜ւյն, %{name}, ։Ճ
+
+ Քո տվյալները մշակվեցին և պատրաստ են ներբեռնվելու համար հետևյալ [հղմամբ](%{url})։
+
+ Սիրով, դիասպորայի էլ․ նամակների ժրաջան ռոբոտ։
+ subject: "Քո անձնական տեղեկատվությունը պատրաստ է ներբեռնելու համար, %{name}։"
+ export_failure_email:
+ body: |-
+ Ողջո՜ւյն, %{name}, ։Ճ
+ Մեզ մոտ խնդիրներ առաջացան քո տվյալները ներբեռնելու համար մշակելիս։
+ Խնդրում եմ․ նորից փորձիր։
+ Կնրերես,
+
+ Սիրով, դիասպորայի էլ․ նամակների ժրաջան ռոբոտ։
+ subject: "Ներողություն, քո տվյալների հետ ինչ֊որ խնդիր առաջացավ, %{name}։"
+ export_photos_email:
+ body: |-
+ Ողջո՜ւյն, %{name},
+
+ Քո նկարները արդեն մշակվեցին ու պատրաստ են ներբեռնվելու համար ահա [այս հղմամբ](%{url})․
+
+ Սիրով, դիասպորայի էլ․ նամակների ժրաջան ռոբոտից։
+ subject: "Նկարներդ պատրաստ են ներբեռնվելու համար, %{name}"
+ export_photos_failure_email:
+ body: |-
+ Ողջո՜ւյն, %{name},
+
+ Մեզ մոտ խնդիր առաջացավ քո նկարները ներբեռնելու համար մշակելիս։
+ Խնդրում եմ․ նորից փորձիր։
+
+ կներես,
+ դիասպորայի էլ․ նամակների ժրաջան ռոբոտ։
+ subject: "%{name}, նկարներիդ հետ ինչ֊որ խնդիր առաջացավ։"
hello: "Ողջու՜յն, %{name}։"
invite:
message: |-
@@ -465,12 +769,46 @@ hy:
liked: "%{name}-ը հավանել է քո գրառումը"
view_post: "Նայել գրառումը >"
mentioned:
- mentioned: "նշել է քեզ գրառման մեջ։"
+ mentioned: "նշել է քեզ գրառման մեջ․"
subject: "%{name}-ը նշել է քեզ Diaspora*-ում"
private_message:
reply_to_or_view: "Պատասխանիր կամ տես այս երկխոսությունը >"
+ remove_old_user:
+ body: |-
+ Ողջույն,
+
+ Էնպիսի տպավորություն է, որ այլևս չունես %{pod_url}֊ի քո հաշվի կարիքը, քանի որ չես օգտագործել այն արդեն %{after_days} օր։ Որպեսզի դիասպորայի ակտիվ օգտատերերը հանգիստ ու հարմար օգտագործեն դիասպորայի այս փոդը, մենք ուզում ենք ջնջել այն հաշիվները, որոնց կարիքն էլ չկա։
+
+ Մենք շատ ենք ուզում, որ մնաս դիասպորայի համայնքի մաս ու ազատ ես մեր հետ մնալու, եթե ցանկություն ունես։
+
+ Եթե ուզում ես, որ հաշիվդ չփակվի, պետք է ընդամենը մուտք գործես քո հաշիվ մինչ %{remove_after}։ Երբ մուտք գործես, մի քիչ պտտվիր դիասպորայով։ Այն շատ է փոխվել քո վերջին այցելությունից հետո, տես ինչ նորություններ կան, տես ոնց է այն լավացել։ Հետևիր #պիտակների, որ գտնես քո սիրած բաները։
+
+ Մուտք գործիր այստեղ․ %{login_url}։ Եթե մոռացել ես քո մուտք գործելու տվյալները, կարող ես հիշեցում ստանալ այդ էջից։
+
+ Դե, մի՜նչ հանդիպում ;Ճ,
+
+ Սիրով, դիասպորայի էլ․ նամակների ժրաջան ռոբոտ։
+ subject: "Դիասպորայի քո հաշիվը որոշվել է ջնջել ակտիվ չլինելու պատճառով։"
+ report_email:
+ body: |-
+ Ողջույն,
+
+ %{type}֊ը %{id} ID֊ով նշվել է որպես վիրավորական։
+
+ [%{url}][1] 
+
+ Խնդրում եմ աչքի անցկացրո՛ւ հնարավորինս շուտ։
+
+
+ Սիրով, դիասպորայի էլ․ նամակների ժրաջան ռոբոտ։
+
+ [1]․ %{url}
+ subject: "Եվս մի %{type} նշվել է որպես վիրավորական"
+ type:
+ comment: "մեկնաբանություն"
+ post: "գրառում"
reshared:
- reshared: "%{name}-ը տարածեց քո գրառումը"
+ reshared: "%{name}-ը տարածել է քո գրառումը"
view_post: "Նայել գրառումը >"
single_admin:
admin: "Diaspora-ի քո ադմինիստրատոր"
@@ -478,7 +816,7 @@ hy:
started_sharing:
sharing: "սկսեց կիսվել քո հետ։"
subject: "%{name}-ը սկսեց կիսվել քո հետ Diaspora*-ում"
- view_profile: "Տես %{name}-ի անձնական էջը"
+ view_profile: "Տես %{name}-ի էջը"
thanks: "Շնորհակալություն,"
to_change_your_notification_settings: "ծանուցումների կարգավորումները փոխելու համար"
nsfw: "քըխ"
@@ -488,23 +826,26 @@ hy:
password_confirmation: "Գաղտնաբառի հաստատում"
people:
add_contact:
- invited_by: "քեզ հրավիրել է"
+ invited_by: "Քեզ հրավիրել է"
add_contact_small:
add_contact_from_tag: "Ավելացնել կոնտակտ թեգից"
aspect_list:
edit_membership: "փոփոխել խմբի անդամներին"
- few: "%{count} մարդ"
helper:
+ is_not_sharing: "%{name}֊ը հետդ չի կիսվում"
+ is_sharing: "%{name} սկսեց կիսվել քո հետ ։)"
results_for: " արդյունքներ %{params}-ի համար"
index:
- looking_for: "%{tag_link} պիտակո՞վ գրառումներ ես փնտրում։"
- no_one_found: "...և ոչ ոք չգտնվեց։"
- no_results: "Հե՜յ։ Մի բան գտնելու կարիք ունես։"
+ couldnt_find_them: "Չկարողացա՞ր նրանց գտնել։"
+ looking_for: "%{tag_link} պիտակով գրառումնե՞ր ես փնտրում։"
+ no_one_found: "...և ոչինչ չգտնվեց։"
+ no_results: "Հե՛յ, պետք է կոնկրետ մի բան փնտրես։"
results_for: "որոնման արդյունքները"
+ search_handle: "Օգտագործիր(username@pod.am) դիասպորայի ID-ին, որ հաստատ գտնես ընկերներիդ։"
searching: "փնտրվում է, խնդրում ենք լինել համբերատար..."
- many: "%{count} մարդ"
+ send_invite: "Դեռ ոչի՞նչ։ Հրավեր ուղարկի՛ր։"
one: "1 հոգի"
- other: "%{count} մարդ"
+ other: "%{count} հոգի"
person:
add_contact: "Ընդլայնել կապերը:"
already_connected: "Արդեն կապված եք:"
@@ -513,18 +854,19 @@ hy:
profile_sidebar:
bio: "կենսագրություն"
born: "ծննդյան ամսաթիվ"
- edit_my_profile: "Խմբագրել իմ անձնական էջը"
+ edit_my_profile: "Խմբագրել իմ էջը"
gender: "սեռ"
in_aspects: "խմբերում"
- location: "տեղակայություն"
+ location: "Տեղակայություն"
+ photos: "Նկարները"
remove_contact: "ջնջել ընկերոջը"
remove_from: "Ջնջե՞լ %{name}-ին %{aspect} խմբից։"
show:
- closed_account: "Այս հաշիվը փակված է։"
+ closed_account: "Այս հաշիվը փակվել է։"
does_not_exist: "Այս անձը գոյություն չունի։ Համենայն դեպս Diaspora-ում։"
- has_not_shared_with_you_yet: "%{name}-ը չի կիսվել քո հետ որևէ գրառմամբ։"
+ has_not_shared_with_you_yet: "%{name}-ը դեռ չի կիսվել քո հետ որևէ գրառմամբ։"
ignoring: "Դու արհամարհում ես %{name}-ի բոլոր գրառումները։"
- incoming_request: "%{name}-ը ցանկանում է կիսվել քեզ հետ։"
+ incoming_request: "%{name}-ը ցանկանում է կիսվել քեզ հետ"
mention: "Նշել"
message: "Հաղորդագրություն"
not_connected: "Այս մարդու հետ չես կիսվում։"
@@ -538,7 +880,6 @@ hy:
add_some: "ավելացներ որևէ"
edit: "խմբագրել"
you_have_no_tags: "դու չունես որևէ պիտակ։"
- two: "%{count} մարդ"
webfinger:
fail: "Կներես, մենք չկարողացանք գտնել %{handle}։"
zero: "մարդ չկա"
@@ -558,6 +899,7 @@ hy:
post_it: "հրապարակի՛ր սա"
new_photo:
empty: "{file}-ը դատարկ է, կրկին ընտրիր ֆայլերը առանց դրա։"
+ invalid_ext: "{file}֊ը անհամապատասխան ընդլայնման է։ Միայն {extensions} են թույլատրվում։"
size_error: "{file}-ը չափից դուրս մեծ է, առավելագույն չափն է՝ {sizeLimit}։"
new_profile_photo:
or_select_one_existing: "կամ ընտրիր արդեն գոյություն ունեցող նկարներիցդ մեկը՝ %{photos}"
@@ -568,7 +910,7 @@ hy:
collection_permalink: "հավաքածուի սկզբնաղբյուրը"
delete_photo: "Ջնջել նկարը"
edit: "խմբագրել"
- edit_delete_photo: "Փոխել նկարի նկարագրությունը կամ ջնջել նկարը"
+ edit_delete_photo: "Փոխել նկարի նկարագրությունը կամ ջնջել այն"
make_profile_photo: "դարձնել գլխավոր նկար"
show_original_post: "Ցույց տալ սկզբնական գրառումը"
update_photo: "Փոխել նկարը"
@@ -585,25 +927,30 @@ hy:
photos_by:
one: "Մեկ նկար %{author}-ից"
other: "%{count} նկար %{author}-ից"
- zero: "Ոչ մի նկար %{author}-ից"
+ zero: "%{author}-ը ոչ մի նկար չունի"
reshare_by: "տարածվել է %{author}-ից"
previous: "նախորդ"
- privacy: "Անձնական"
- privacy_policy: "Անձնական քաղաքականություն"
- profile: "Անձնական էջ"
+ privacy: "Գաղտնիություն"
+ privacy_policy: "Գաղտնիության քաղաքականություն"
+ profile: "Իմ էջը"
profiles:
edit:
allow_search: "Թույլատրել մարդկանց փնտրել քեզ Diaspora-ի սահմաններում"
- edit_profile: "Խմբագրել անձնական էջը"
+ edit_profile: "Խմբագրել իմ էջը"
first_name: "Անուն"
last_name: "Ազգանուն"
- update_profile: "Թարմացնել անձնական էջը"
+ nsfw_check: "Նշել բոլոր իմ գրառածները որպես ՔԽ"
+ nsfw_explanation: |-
+ Լատինատառ NSFW («not safe for work»` ոչ ապահով աշխատանքի համար) պիտակը դիասպորայի ինքնավար համայնքի ստանդարտն է այնպիսի բովանդակության համար, որ անհարմար կլինի դիտել աշխատավայրում։ Եթե նախատեսում ես նմանատիպ նյութեր հաճախ դնել, խնդրում ենք նշել այս կետը, որպեսզի քո բոլոր գրառումները թաքցվեն մարդկանց լրահոսերից, եթե նրանք չեն ընտրել դիտել դրանք։
+ Հայերենում կիրառում ենք նաև ՔԽ պիտակը։
+ nsfw_explanation2: "Եթե չընտրես այս տարբերակը, խնդրում ենք ավելացնել #nsfw պիտակը ամեն անգամ, երբ նման բովանդակությամբ գրառում կանես։ (Հայերենում «նման բովանդակության» գրառումները կոչել ենք քխ, սակայն քանի որ դա չի թաքցնում գրառումները, ապա պետք է նշել լատինատառ թեգը, որպեսզի գրառումը իրոք դիտարկվի դիասպորայի կողմից որպես քխ։"
+ update_profile: "Թարմացնել իմ էջը"
your_bio: "Կենսագրություն"
your_birthday: "Ծննդյան ամսաթիվ"
your_gender: "Սեռ"
your_location: "Որտե՞ղ ես"
your_photo: "Քո նկարը"
- your_private_profile: "Քո անձնական էջը"
+ your_private_profile: "Քո էջը"
your_public_profile: "Քո հրապարակային էջը"
your_tags: "Նկարագրիր քեզ 5 բառով"
your_tags_placeholder: "օրինակ՝ #կինոնկար #կատուներ #ճանապարհորդություն #ուսուցիչ #Երևան"
@@ -620,7 +967,7 @@ hy:
create:
success: "Դու միացար Diaspora-ին։"
edit:
- cancel_my_account: "Փակել հաշիվս"
+ cancel_my_account: "Չեղարկել հաշիվս"
edit: "Փոփոխել %{name}-ը"
leave_blank: "(թող դատարկ, եթե չես ուզում փոխել դա)"
password_to_confirm: "(փոփոխությունները հաստատելու համար հարկավոր է քո ներկայիս գաղտնաբառը)"
@@ -628,27 +975,42 @@ hy:
update: "Թարմացնել"
invalid_invite: "Հրավերի հղոմը, որ տվել ես, այլևս վավեր չէ։"
new:
- continue: "Շարունակել"
create_my_account: "Ստեղծե՜լ իմ հաշիվը"
- diaspora: "<3 Diaspora*"
- email: "ԷԼ.ՀԱՍՑԵ"
- enter_email: "Մուտքագրիր էլ.հասցե"
+ email: "Էլ․ հասցե"
+ enter_email: "Մուտքագրիր էլ. հասցե"
enter_password: "Մուտքագրիր գաղտնաբառ (առնվազն վեց նիշ)"
enter_password_again: "Մուտքագրիր նույն գաղտնաբառը"
enter_username: "Ընտրիր օգտանուն (միայն տառեր, թվեր և _)"
- hey_make: "ՀԵ՜Յ, <br/>ՍՏԵՂԾԻ՛Ր<br/>ՄԻ ԲԱՆ"
- join_the_movement: "Միանա՜լ շարժմանը"
- password: "ԳԱՂՏՆԱԲԱՌ"
+ join_the_movement: "Միանալ շարժմա՜նը։"
+ password: "Գաղտնաբառ"
password_confirmation: "ԳԱՂՏՆԱԲԱՌԻ ՀԱՍՏԱՏՈՒՄ"
- sign_up: "ԳՐԱՆՑՎԵԼ"
+ sign_up: "Գրանցվել"
sign_up_message: "♥-ով լի սոցիալական ցանց"
- username: "ՕԳՏԱՆՈՒՆ"
+ submitting: "Ուղարկվում է․․․"
+ terms: "Ստեղծելով հաշիվ ընդունում ես %{terms_link}։"
+ terms_link: "օգտագործման պայմանները"
+ username: "Օգտանուն"
+ report:
+ comment_label: "<b>Մեկնաբանություն</b>․<br>%{data}"
+ confirm_deletion: "Համոզվա՞ծ ես գրառումը ջնջելու հարցում։"
+ delete_link: "Ջնջել սա"
+ not_found: "<u>Գրառումը/մեկնաբանությունը չգտնվեց։ Կարծես թե օգտատերը ջնջել է դա։<del></del></u>"
+ post_label: "<b>Գրառում</b>․ %{title}"
+ reason_label: "Պատճառ՝ %{text}"
+ reported_label: "<b>Բողոքողը՝</b> %{person}"
+ review_link: "Նշել որպես դիտված"
+ status:
+ created: "Զեկույց է ստեղծվել"
+ destroyed: "Գրառումը վերացվել է"
+ failed: "Ինչ֊որ բան սխալ գնաց"
+ marked: "Զեկույցը նշվել է որպես դիտված"
+ title: "Բողոքների մասին՝ ընդհանուր"
requests:
create:
sending: "Ուղարկվում է"
sent: "%{name}-ին առաջարկել ես ընկերանալ։ Առաջարկդ կտեսնի, երբ հաջորդ անգամ Diaspora մուտք գործի։"
destroy:
- error: "Խումբ ընտրիր"
+ error: "Պետք է խումբ ընտրես։"
ignore: "Արհամարհված ընկերանալու հայտ"
success: "Դու հիմա կիսվում ես"
helper:
@@ -662,39 +1024,45 @@ hy:
new_request_to_person:
sent: "ուղարկվեց"
reshares:
+ comment_email_subject: "%{resharer}֊ը տարածել է %{author}֊ի գրառումը"
create:
- failure: "Գրառումը տարածելիս խնդիրներ առաջացան։"
+ failure: "Գրառումը տարածելիս խնդիր առաջացավ։"
reshare:
deleted: "Օրիգինալ գրառումը ջնջվել է հեղինակի կողմից։"
reshare:
one: "մեկը տարածել է"
- other: "%{count}-ը տարածել են"
+ other: "%{count} հոգի տարածել են"
zero: "Ոչ ոք չի տարածել"
reshare_confirmation: "Տարածե՞լ %{author}-ի գրառումը"
reshare_original: "Տարածել բնօրինակը"
reshared_via: "Տարածվել է"
show_original: "Ցույց տալ բնօրինակը"
- search: "Որոնում"
+ search: "Որոնել"
services:
create:
- failure: "Նույնականացումը չստացվեց"
+ already_authorized: "Դիասպորայի %{diaspora_id} օգտատերը արդեն վավերացրել է %{service_name} հաշիվը։"
+ failure: "Նույնականացումը չստացվեց։"
+ read_only_access: "Քեզ միայն հասանելի է կարդալը, փորձիր մի անգամ էլ մուտք գործել մի քիչ ուշ"
success: "Նույնականացումը բարեհաջող անցավ։"
destroy:
success: "Նույնականացումը բարեհաջող ջնջվեց։"
failure:
error: "Այդ ծառայությունը միացնելիս խնդիրներ առաջացան"
finder:
+ fetching_contacts: "դիասպորան «միացնում է» %{service}ի քո ընկերներին։ մի քանի րոպեից հետ արի։"
no_friends: "Facebook-ից ընկերներ չգտնվեցին։"
service_friends: "%{service}-ի ընկերները"
index:
connect_to_facebook: "Միացնել Facebook-ին"
connect_to_tumblr: "Միացնել Tumblr-ին"
connect_to_twitter: "Միացնել Twitter-ին"
+ connect_to_wordpress: "Միացնել Wordpress֊ին"
disconnect: "խզել կապը"
edit_services: "Փոփոխել ծառայությունները"
logged_in_as: "համակարգում ես որպես"
no_services: "Դեռևս որևիցե ծառայություն չես միացրել։"
really_disconnect: "խզե՞լ կապը %{service}-ի հետ"
+ services_explanation: "Այլ ծառայություններ միացնելը հնարավորություն է տալիս հրապարակել քո գրառումները այդ ծառայություններով Սփյուռքում գրառելուն զուգընթաց։"
inviter:
click_link_to_accept_invitation: "Անցիր այս հղումով, որ ընդունես քո հրավերը"
join_me_on_diaspora: "Միացի՛ր ինձ DIASPORA*-ում"
@@ -717,6 +1085,12 @@ hy:
your_diaspora_username_is: "Քո Diaspora-ի օգտանունն է՝ %{diaspora_handle}"
aspect_dropdown:
add_to_aspect: "Ավելացնել"
+ mobile_row_checked: "%{name} (ջնջել)"
+ mobile_row_unchecked: "%{name} (ավելացնել)"
+ toggle:
+ one: "%{count} խումբ"
+ other: "%{count} խումբ"
+ zero: "Ավելացնել "
contact_list:
all_contacts: "Բոլոր ընկերները"
footer:
@@ -731,7 +1105,7 @@ hy:
invite_your_friends: "Կանչի՛ր ընկերներիդ"
invites: "Հրավերներ"
invites_closed: "Ներկայից պահին հրավերները հասանելի չեն Diaspora-ի այս փոդում։"
- share_this: "Տարածի՛ր այս հղումը էլ.հասցեի, բլոգի կամ սիրելի սոցիալական ցանցի միջոցով։"
+ share_this: "Տարածի՛ր այս հղումը էլ.հասցեի, բլոգի կամ այլ սոցիալական ցանցի միջոցով։"
notification:
new: "Նոր %{type} %{from}-ից"
public_explain:
@@ -742,19 +1116,33 @@ hy:
new_user_welcome_message: "Օգտագործիր #hashպիտակները՝ գրառումներդ դասակարգելու և հետաքրքրություններդ կիսող մարդկանց գտնելու համար։ Նշիր ընկերներիդ՝ օգտագործելով @Հիշատակել"
outside: "Հրապարակային գրառումները տեսանելի կլինեն Diaspora-ից դուրս։"
share: "Կիսվել"
+ title: "Կարգավորել միացված ծառայությունները"
visibility_dropdown: "Սեղմիր այս սլաքը՝ քո գրառման տեսանելիությունը ընտրելու համար։ (Խորհուրդ կտանք՝ այս առաջինը հրապարակային նշես։)"
publisher:
all: "բոլորը"
all_contacts: "բոլոր կոնտակտները"
+ discard_post: "Չեղարկել գրառումը"
+ formatWithMarkdown: "Կարող ես օգտագործել %{markdown_link} ֊ը , որպեսզի ձևավորես քո գրառումը"
+ get_location: "Պարզել քո տեղակայությունը"
make_public: "դարձնել հանրամատչելի"
new_user_prefill:
hello: "Ողջու՛յն, ժողովուրդ, #%{new_user_tag}։ "
i_like: "Իմ հետաքրքրություններն են՝ %{tags}։ "
invited_by: "Շնորհակալություն հրավերի համար, "
newhere: "ԵսՆորեկԵմ"
+ poll:
+ add_a_poll: "Հարցում ավելացնել"
+ add_poll_answer: "Ավելացնել տարբերակ"
+ option: "Տարբերակ 1"
+ question: "Հարց"
+ remove_poll_answer: "Ջնջել տարբերակը"
post_a_message_to: "Գրառել %{aspect}ի կոնտակտների համար"
posting: "Գրառվում է..."
+ preview: "Նախադիտել"
+ publishing_to: "հրապարակվում է դեպի "
+ remove_location: "Ջնջել տեղակայությունը"
share: "Կիսվել"
+ share_with: "կիսվել"
upload_photos: "Վերբեռնել նկարները"
whats_on_your_mind: "Ի՞նչ կա մտքիդ։"
reshare:
@@ -768,11 +1156,34 @@ hy:
ignore_user_description: "Ուզում ե՞ս արհամարհել օգտատիրոջն ու ջնջել նրան բոլոր խմբերից"
like: "Հավանել"
nsfw: "Այս գրառումը նշված է որպես NSFW հեղինակի կողմից։ %{link}"
+ shared_with: "Տարածվածը տեսանելի է %{aspect_names}֊ին"
show: "ցուցադրել"
unlike: "Ապահավանել"
via: "ըստ %{link}"
via_mobile: "հեռախոսով"
viewable_to_anyone: "Այս գրառումը տեսանելի է համացանցում ամենքին"
+ simple_captcha:
+ label: "Ներմուծիր կոդը տուփիկում․"
+ message:
+ default: "Գաղտնի կոդը չի համապատասխանում նկարին"
+ failed: "Կարող ա՞ մարդ չես։ Մարդ լինելու ստուգումը տապալվեց։ Մի հատ կստուգվես։ ;)"
+ user: "Գաղտնի կոդը և նկարը տարբեր են"
+ placeholder: "Ներմուծիր նկարի արժեքը"
+ statistics:
+ active_users_halfyear: "Կես տարում ակտիվ օգտատերեր"
+ active_users_monthly: "Ամսական ակտիվ օգտատերեր"
+ closed: "Փակ"
+ disabled: "Անհասանելի"
+ enabled: "Հասանելի"
+ local_comments: "Ներքին մեկնաբանություններ"
+ local_posts: "Ներքին գրառումներ"
+ name: "Անուն"
+ network: "Ցանց"
+ open: "Բաց"
+ registrations: "Գրանցումներ"
+ services: "Ծառայություններ"
+ total_users: "Ընդհանուր օգտատերեր"
+ version: "Վարկած"
status_messages:
create:
success: "%{names} բարեհաջող հիշատակվեցին"
@@ -782,12 +1193,11 @@ hy:
no_message_to_display: "Նամկներ չկան ցույց տալու համար"
new:
mentioning: "Հիշատակելով %{person}-ին"
- too_long:
- one: "պակասեցրու գրառումդ %{count} նիշով "
- other: "պակասեցրու գրառումդ %{count} նիշով"
- zero: "պակասեցրու գրառումդ %{count} նիշով"
+ too_long: "{\"one\"=>\"պակասեցրու գրառումդ %{count} նիշով \", \"other\"=>\"պակասեցրու գրառումդ %{count} նիշով\", \"zero\"=>\"պակասեցրու գրառումդ %{count} նիշով\"}"
stream_helper:
hide_comments: "Թաքցնել բոլոր մեկնաբանությունները"
+ no_more_posts: "Հասել ես լրահուսի վերջին։ Կանգ ա՛ռ մի պահ։"
+ no_posts_yet: "Գրառումներ դեռ չկան"
show_comments:
one: "Ցուցադրել ևս մեկ մեկնաբանություն"
other: "Ցուցադրել ևս %{count} մեկնաբանություն"
@@ -810,19 +1220,19 @@ hy:
followed_tags_stream: "#Հետևվող Պիտակներ"
like_stream:
contacts_title: "Մարդիկ, ում գրառումները դու հավանել ես"
+ title: "Հավանել հոսքը"
mentioned_stream: "@Հիշատակումներ"
mentions:
contacts_title: "Մարդիկ, ովքեր հիշատակել են քեզ"
title: "@Հիշատակումներ"
multi:
- contacts_title: "Լրահոսիդ ժողովուրդը"
+ contacts_title: "Լրահոսիդ մարդիկ"
title: "Լրահոս"
public:
contacts_title: "Վերջին գրառում կատարողները"
title: "Հանրային ակտիվություն"
tags:
contacts_title: "Մարդիկ, ովքեր հայթայթել են այս պիտակը"
- tag_prefill_text: "Բանը նրանում է, որ %{tag_name}-ը... "
title: "%{tags} պիտակով գրառումները"
tag_followings:
create:
@@ -833,14 +1243,16 @@ hy:
failure: "Չստացվեց դադարել #%{name}-ին հետևել։ Միգուցե արդեն դադարե՞լ էիր հետևել դրան։"
success: "Սատանան տանի՜։ Դու այլևս չես հետևում #%{name} պիտակին։"
tags:
+ name_too_long: "Պիտակի անվանում է պետք է լինի %{count}ից քիչ նիշ։ Այժմ %{current_length} նիշ է։ Մի քանի նիշ կրճատի՛ր։"
show:
follow: "Հետևել #%{tag}"
following: "Հետևում ես #%{tag}-ին"
- nobody_talking: "Դեռ ոչ ոք չի խոսում %{tag}-ի մասին"
none: "Դատարկ պիտակ գոյություն չունի։"
- people_tagged_with: "%{tag}-ով պիտակավորված մարդիկ"
- posts_tagged_with: "Գրառումը պիտակավորված է #%{tag}-ով"
stop_following: "Դադարել հետևել #%{tag}-ին"
+ tagged_people:
+ one: "Մի հոգի ուն %{tag} պիտակը"
+ other: "%{count} մարդ ունի %{tag} պիտակը"
+ zero: "Ոչ մեկ չունի %{tag} պիտակը"
terms_and_conditions: "Պայմաններ ու դրույթներ"
undo: "Չեղարկե՞լ"
username: "Օգտանուն"
@@ -865,30 +1277,39 @@ hy:
dont_go: "Հեե՜յ, մի հեռացիր, այստեղ լավ է։"
if_you_want_this: "Եթե իրոք վստահ ես, ապա ստորև մուտքագրիր գաղտնաբառդ և սեղմիր \"Փակել հաշիվս\""
lock_username: "Արդյունքում ներկայիս օգտանունդ արգելափակվելու է, եթե որոշես հետագայում ետ գրանցվել։"
+ locked_out: "Դուք դուրս կգաք Ձեր հաշվից և այլևս երբեք չեք կարողանա մտնել։"
make_diaspora_better: "Կուզենայինք, որ օգնեիր դարձնել Diaspora-ն առավել լավ, այնպես որ հեռանալու փոխարեն լավ կլիներ, որ օգնեիր մեզ այդ հարցում։ Բայց եթե որոշել ես գնալ, ապա ծանոթացիր, թե ինչ կլինի դրա արդյունքում՝"
mr_wiggles: "Պրն. Փիսոն կտխրի, եթե դու գնաս"
no_turning_back: "Առայժմ ետդարձի ճանապարհ չկա։"
- what_we_delete: "Մենք ջնջում ենք քո բոլոր գրառումները, անձնական տվյալները ինչքան հնարավոր է շուտ։ Քո մեկնաբանությունները դեռ շրջանառության մեջ կլինեն, բայց կապված կլինեն Diaspora ID-իդ հետ։"
+ what_we_delete: "Մենք ջնջում ենք քո բոլոր գրառումները, անձնական տվյալները ինչքան հնարավոր է շուտ։ Քո մեկնաբանությունները դեռ շրջանառության մեջ կլինեն, բայց կապված կլինեն դիասպորայի ID-իդ հետ։"
close_account_text: "Փակել հաշիվս"
comment_on_post: "...որևէ մեկը մեկնաբանում է քո գրառման տա՞կ։"
current_password: "Ներկայիս գաղտնաբառ"
current_password_expl: "որով մուտք ես գործել..."
+ download_export: "Ներբեռնել իմ էջը"
+ download_export_photos: "Ներբեռնել իմ նկարները"
download_photos: "ներբեռնել իմ նկարները"
- download_xml: "ներբեռնել իմ xml-ը"
edit_account: "Խմբագրել հաշիվը"
email_awaiting_confirmation: "Մենք ուղարկեցինք ակտիվացման հղում հետևյալ էլ.հասցեին՝ %{unconfirmed_email}։ Բայց մինչ դու կանցնես տվյալ հղմամբ և կակտիվացնես քո նոր հասցեն, մենք կշարունակենք օգտագործել քո սկզբնական՝ %{email} էլ.հասցեն։"
export_data: "Դուրս բերել տվյալները"
+ export_in_progress: "Էս պահին վերամշակում ենք քո տվյալները։ Մի քանի րոպեից հետ արի։"
+ export_photos_in_progress: "Հիմա քո նկարները մշակում ենք։ Մի քանի րոպեից հետ արի։"
following: "Հետևելու կարգավորումներ"
getting_started: "Նոր օգտատերի արտոնությունները"
+ last_exported_at: "(Վերջին անգամ թարմացվել է %{timestamp}֊ին)"
liked: "...որևէ մեկը հավանել է քո գրառու՞մը։"
mentioned: "...քեզ հիշատակել են գրառման մե՞ջ։"
new_password: "Նոր գաղտնաբառ"
- photo_export_unavailable: "Հիմա նկար չես կարող դուրս բերել"
private_message: "...անձնական նամա՞կ ես ստանում։"
receive_email_notifications: "Ստանալ ծանուցումներ էլ.հասցեին, երբ..."
+ request_export: "Ստանալ իմ էջի տվյալները"
+ request_export_photos: "Ստանալ իմ նկարները"
+ request_export_photos_update: "Թարմացնել իմ նկարների պահեստը"
+ request_export_update: "Թարմացնել էջիս մասին տեղեկատվությունը պահեստում"
reshared: "...որևէ մեկը տարածում է քո գրառու՞մը։"
show_community_spotlight: "Ցուցադրե՞լ համայնքի նորութությունները լրահոսումդ։"
show_getting_started: "Վերականգնել առաջին անգամ քեզ ողջունած էկրանը"
+ someone_reported: "ինչ֊որ մեկը զեկուցում է։"
started_sharing: "...որևէ մեկը սկսում է կիսվե՞լ քեզ հետ։"
stream_preferences: "Հոսքի նախընտրությունները"
your_email: "Էլ.հասցեն"
@@ -896,7 +1317,9 @@ hy:
getting_started:
awesome_take_me_to_diaspora: "Զի՛լ է։ Տար ինձ Diaspora*"
community_welcome: "Diaspora-ի համայնքը ուրախ է տեսնել քեզ այստեղ։"
+ connect_to_facebook: "Մենք կարողենք ամենը մի քիչ արագացնել %{link} Դիասպորային։ Դա կներմուծի քո անունը, նկարը և հնարավոր կդարձնի գրառելը երկու տեղում միաժամանակ(cross-posting)։"
connect_to_facebook_link: "միացրու քո ֆեյսբուքյան հաշվին"
+ hashtag_explanation: "Հեշթեգերը թույլ են տալիս խոսել քո հետաքրքրությունների մասին և հետևել դրանց։  Ինչպես նաև ահավոր հավես ձև է Սփյուռքում* նոր մարդկանց գտնելու համար։"
hashtag_suggestions: "Փորձիր հետևել պիտակներ, ինչպիսիք են #արվեստ #կինոնկար #gif և այլն։"
saved: "Պահված է"
well_hello_there: "Դե ինչ, ողջու՜յն։"
@@ -904,7 +1327,9 @@ hy:
who_are_you: "Ո՞վ ես դու։"
privacy_settings:
ignored_users: "Արհամարհված օգտատերեր"
+ no_user_ignored_message: "Հիմա էլ ոչ մեկին չես արհամարհում"
stop_ignoring: "Դադարել արհամարհելը"
+ strip_exif: "Հեռացնել վերբեռնվող նկարներից մետադատան, ինչպես օրինակ՝ տեղակայությունը, հեղինակին, տեսախցիկի մոդելը (խորհուրդ է տրվում)"
title: "Գաղտնիության կարգավորումներ"
public:
does_not_exist: "%{username} օգտատերը գոյություն չունի։"
@@ -920,6 +1345,11 @@ hy:
settings_updated: "Կարգավորումները թարմացված են"
unconfirmed_email_changed: "Էլ.հասցեն փոխված է և ակտիվացնելու կարիք ունի։"
unconfirmed_email_not_changed: "Էլ.հասցեի փոփոխումը չհաջողվեց"
+ webfinger:
+ fetch_failed: "չստացվեց ստանալ(fetch) webfinger profile֊ը %{profile_url}ի համար։"
+ hcard_fetch_failed: "%{account} հաշվի hcard֊ը միացնելիս(fetching) խնդիրներ առաջացան"
+ no_person_constructed: "Անհնար եղավ այս hcard֊ից մարդ ձևավորել։"
+ xrd_fetch_failed: "%{account} հաշվից xrd ստանալիս սխալ եղավ"
welcome: "Բարի գալու՜ստ"
will_paginate:
next_label: "հաջորդ &raquo;"
diff --git a/config/locales/diaspora/ia.yml b/config/locales/diaspora/ia.yml
index 584a9c414..36f94343e 100644
--- a/config/locales/diaspora/ia.yml
+++ b/config/locales/diaspora/ia.yml
@@ -12,6 +12,8 @@ ia:
_home: "Initio"
_photos: "photos"
_services: "Servicios"
+ _statistics: "Statisticas"
+ _terms: "terminos"
account: "Conto"
activerecord:
errors:
@@ -24,6 +26,14 @@ ia:
attributes:
diaspora_handle:
taken: "es jam in uso."
+ poll:
+ attributes:
+ poll_answers:
+ not_enough_poll_answers: "Insufficiente optiones de sondage."
+ poll_participation:
+ attributes:
+ poll:
+ already_participated: "Tu ha jam participate a iste sondage."
request:
attributes:
from_id:
@@ -46,6 +56,7 @@ ia:
correlations: "Correlationes"
pages: "Paginas"
pod_stats: "Statisticas de pod"
+ report: "Reportos"
sidekiq_monitor: "Monitor Sidekiq"
user_search: "Recerca de usatores"
weekly_user_stats: "Statisticas septimanal de usatores"
@@ -62,12 +73,40 @@ ia:
tag_name: "Nomine del etiquetta: <b>%{name_tag}</b> Occurrentias: <b>%{count_tag}</b>"
usage_statistic: "Statisticas de uso"
week: "Septimana"
+ user_entry:
+ account_closed: "conto claudite"
+ diaspora_handle: "Pseudonymo de Diaspora"
+ email: "E-mail"
+ guid: "GUID"
+ id: "ID"
+ last_seen: "ultime visita"
+ ? "no"
+ : "no"
+ nsfw: "#nsfw"
+ unknown: "incognite"
+ ? "yes"
+ : si
user_search:
+ 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"
+ 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"
under_13: "Monstrar usatores con minus de 13 annos (COPPA)"
- you_currently: "in iste momento, il te resta %{user_invitation} invitationes %{link}"
+ 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}"
weekly_user_stats:
+ amount_of:
+ one: "Numero de nove usatores iste septimana: %{count}"
+ other: "Numero de nove usatores iste septimana: %{count}"
+ zero: "Numero de nove usatores iste septimana: zero"
current_server: "Le data actual del servitor es %{date}"
ago: "%{time} retro"
all_aspects: "Tote le aspectos"
@@ -87,8 +126,6 @@ ia:
add_to_aspect:
failure: "Le addition del contacto al aspecto ha fallite."
success: "Le contacto ha essite addite al aspecto con successo."
- aspect_contacts:
- done_editing: "modification finite"
aspect_listings:
add_an_aspect: "+ Adder un aspecto"
deselect_all: "Deseliger totes"
@@ -107,28 +144,22 @@ ia:
failure: "%{name} non es vacue e non pote esser removite."
success: "%{name} ha essite removite con successo."
edit:
- add_existing: "Adder un contacto existente"
- aspect_list_is_not_visible: "le lista de aspectos es celate pro alteres in iste aspecto"
- aspect_list_is_visible: "le lista de aspectos es visibile pro alteres in iste aspecto"
+ 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?"
- done: "Finite"
make_aspect_list_visible: "render contactos in iste aspecto visibile le unes pro le alteres?"
remove_aspect: "Deler iste aspecto"
rename: "renominar"
+ set_visibility: "Definir visibilitate"
update: "actualisar"
updating: "actualisation in curso"
- few: "%{count} aspectos"
- helper:
- are_you_sure: "Es tu secur de voler deler iste aspecto?"
- aspect_not_empty: "Aspecto non vacue"
- remove: "remover"
index:
diaspora_id:
- content_1: "Tu identitate in Diaspora es:"
- content_2: "Da lo a alteres e illes potera trovar te in Diaspora."
- heading: "Identitate in Diaspora"
+ content_1: "Tu ID de diaspora* es:"
+ content_2: "Da lo a alteres e illes potera trovar te in diaspora*."
+ heading: "ID de diaspora*"
donate: "Donar"
- handle_explanation: "Isto es tu identitate in Diaspora. Como un adresse de e-mail, tu pote dar isto a personas pro attinger te."
+ handle_explanation: "Isto es tu ID de diaspora*. Como un adresse de e-mail, tu pote dar isto a alteres a fin que illes pote attinger te."
help:
any_problem: "Problema?"
contact_podmin: "Contacta le administrator de tu pod!"
@@ -138,35 +169,30 @@ ia:
feature_suggestion: "... ha un suggestion de %{link}?"
find_a_bug: "... ha trovate un %{link}?"
have_a_question: "... ha un %{link}?"
- here_to_help: "Le communitate de Diaspora es a tu disposition!"
+ here_to_help: "Le communitate de diaspora* es a tu disposition!"
mail_podmin: "E-mail del \"podmin\""
need_help: "Require adjuta?"
- tag_bug: "defecto"
+ tag_bug: "bug"
tag_feature: "functionalitate"
tag_question: "question"
tutorial_link_text: "Tutoriales"
- tutorials_and_wiki: "%{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_diaspora_running: "Mantene le disveloppamento de Diaspora rapide con un donation mensual!"
+ keep_diaspora_running: "Mantene le disveloppamento de diaspora* rapide con un donation mensual!"
keep_pod_running: "Adjuta al mantenentia e melioration de %{pod} (e al caffeination de su gerentes) con un donation mensual!"
new_here:
follow: "Seque %{link} e saluta nove usatores in diaspora*!"
learn_more: "Leger plus"
- title: "Dar le benvenita a nove usatores"
+ title: "Accolliger nove usatores"
no_contacts: "Nulle contacto"
no_tags: "+ Cercar un etiquetta a sequer"
people_sharing_with_you: "Personas qui divide con te"
post_a_message: "publicar un message >>"
services:
- content: "Tu pote connecter le sequente servicios a Diaspora:"
+ content: "Tu pote connecter le sequente servicios a diaspora*:"
heading: "Connecter servicios"
unfollow_tag: "Cessar de sequer #%{tag}"
- welcome_to_diaspora: "Benvenite a Diaspora, %{name}!"
- many: "%{count} aspectos"
- move_contact:
- error: "Error durante le displaciamento del contacto: %{inspect}"
- failure: "non functionava %{inspect}"
- success: "Persona displaciate a un nove aspecto"
+ welcome_to_diaspora: "Benvenite a diaspora*, %{name}!"
new:
create: "Crear"
name: "Nomine (visibile solmente pro te)"
@@ -184,14 +210,6 @@ ia:
family: "Familia"
friends: "Amicos"
work: "Labor"
- selected_contacts:
- manage_your_aspects: "Gerer tu aspectos."
- no_contacts: "Tu non ha ancora contactos hic."
- view_all_community_spotlight: "Vider tote le usatores in evidentia"
- view_all_contacts: "Vider tote le contactos"
- show:
- edit_aspect: "modificar aspecto"
- two: "%{count} aspectos"
update:
failure: "Tu aspecto, %{name}, ha un nomine troppo longe e non pote esser salveguardate."
success: "Tu aspecto, %{name}, ha essite modificate con successo."
@@ -205,42 +223,36 @@ ia:
failure: "Io non poteva cessar de ignorar iste usator. #evasion"
success: "Vamos vider lo que iste usator ha a dicer! #salutes"
bookmarklet:
- explanation: "Invia cosas a Diaspora ab ubique con iste ligamine: %{link}"
+ explanation: "Invia cosas a diaspora* ab ubique con iste ligamine: %{link}"
heading: "Mini-marcapaginas"
- post_something: "Inviar a Diaspora"
- post_success: "Invio succedite!"
+ post_something: "Inviar a diaspora*"
+ post_success: "Invio succedite! Claude…"
cancel: "Cancellar"
comments:
- few: "%{count} commentos"
- many: "%{count} commentos"
new_comment:
comment: "Commentar"
commenting: "Commenta…"
one: "1 commento"
other: "%{count} commentos"
- two: "%{count} commentos"
zero: "nulle commento"
contacts:
create:
failure: "Creation de contacto fallite"
- few: "%{count} contactos"
index:
add_a_new_aspect: "Adder un nove aspecto"
+ add_contact: "Adder contacto"
add_to_aspect: "adder contactos a %{name}"
- add_to_aspect_link: "adder contactos a %{name}"
all_contacts: "Tote le contactos"
community_spotlight: "Usatores in evidentia"
- many_people_are_you_sure: "Es tu secur de voler initiar un conversation private con plus de %{suggested_limit} contactos? Publicar un message in iste aspecto pote esser un melior maniera de contactar les."
my_contacts: "Mi contactos"
no_contacts: "Il pare que tu debe adder alcun contactos!"
no_contacts_message: "Visita %{community_spotlight}"
- no_contacts_message_with_aspect: "Visita %{community_spotlight} o %{add_to_aspect_link}"
only_sharing_with_me: "Solmente qui divide cosas con me"
- remove_person_from_aspect: "Remover %{person_name} de \"%{aspect_name}\""
+ remove_contact: "Remover contacto"
start_a_conversation: "Initiar un conversation"
title: "Contactos"
+ user_search: "Recerca de usatores"
your_contacts: "Tu contactos"
- many: "%{count} contactos"
one: "1 contacto"
other: "%{count} contactos"
sharing:
@@ -248,7 +260,6 @@ ia:
spotlight:
community_spotlight: "Usatores in evidentia"
suggest_member: "Suggerer un membro"
- two: "%{count} contactos"
zero: "contactos"
conversations:
conversation:
@@ -258,9 +269,13 @@ ia:
no_contact: "Tu debe adder le contacto primo."
sent: "Message inviate"
destroy:
- success: "Conversation removite con successo"
+ delete_success: "Le conversation ha essite delite"
+ hide_success: "Le conversation ha essite celate"
index:
+ conversations_inbox: "Conversationes – Cassa de entrata"
+ create_a_new_conversation: "initiar un nove conversation"
inbox: "Cassa de entrata"
+ new_conversation: "Nove conversation"
no_conversation_selected: "nulle conversation seligite"
no_messages: "nulle message"
new:
@@ -269,8 +284,11 @@ ia:
sending: "Invia…"
subject: "subjecto"
to: "a"
+ new_conversation:
+ fail: "Message non valide"
show:
delete: "deler e blocar conversation"
+ hide: "celar e silentiar conversation"
reply: "responder"
replying: "Responde…"
date:
@@ -286,6 +304,7 @@ ia:
invalid_fields: "Campos invalide"
login_try_again: "Per favor <a href='%{login_link}'>aperi session</a> e reproba."
post_not_public: "Le entrata que tu vole vider non es public!"
+ post_not_public_or_not_exist: "Le entrata que tu tenta vider non es public, o non existe."
fill_me_out: "Plena me"
find_people: "Cercar personas o #etiquettas"
help:
@@ -325,8 +344,15 @@ ia:
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_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."
+ add_contact_roster_q: "Como pote io parlar in directo a qualcuno in diaspora*?"
+ contacts_page: "pagina de contactos"
+ title: "Chat"
+ faq: "FAQ"
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}"
@@ -339,6 +365,18 @@ ia:
getting_started_tutorial: "Serie de tutoriales 'Prime passos'"
here: "hic"
irc: "IRC"
+ keyboard_shortcuts:
+ keyboard_shortcuts_a1: "In le vista de fluxo tu pote usar le sequente claves accelerator:"
+ keyboard_shortcuts_li1: "j - saltar al proxime entrata"
+ keyboard_shortcuts_li2: "k - saltar al previe entrata"
+ keyboard_shortcuts_li3: "c - commentar le entrata actual"
+ keyboard_shortcuts_li4: "l - appreciar le entrata actual"
+ keyboard_shortcuts_li5: "r - Repeter iste entrata"
+ keyboard_shortcuts_li6: "m - Displicar iste entrata"
+ keyboard_shortcuts_li7: "o - Aperir le prime ligamine in iste entrata"
+ keyboard_shortcuts_li8: "ctrl + enter - Inviar le message que tu ha scribite"
+ keyboard_shortcuts_q: "Qual claves accelerator es disponibile?"
+ 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."
@@ -350,6 +388,16 @@ ia:
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."
what_is_a_mention_q: "Que es un \"mention\"?"
+ miscellaneous:
+ back_to_top_a: "Si. Post rolar a basso in un pagina, clicca sur le sagitta gris que appare in le angulo dextre al fundo de tu fenestra de navigator."
+ back_to_top_q: "Ha il un maniera rapide de retornar al cyma del pagina post que io rola a basso?"
+ diaspora_app_a: "Il ha plure applicationes de Android in un stadio precoce de disveloppamento. Plures de iste projectos es abandonate e non functiona ben con le version actual de diaspora*. Non expecta troppo de iste apps in iste momento. Actualmente le melior maniera de acceder a diaspora* a partir de tu dispositivo mobile es per medio de un navigator web, perque nos ha designate un version mobile del sito que deberea functionar ben in tote le dispositivos. Actualmente il non ha un app pro iOS. De novo, diaspora* deberea functionar ben in tu navigator."
+ diaspora_app_q: "Ha il un app diaspora* pro Android o iOS?"
+ photo_albums_a: "No, non in iste momento. Nonobstante, tu pote vider un fluxo de su imagines incargate a partir del section Photos in le barra lateral de lor pagina de profilo."
+ photo_albums_q: "Ha il albumes de photos o videos?"
+ subscribe_feed_a: "Si, ma iste functionalitate non es ancora polite e le formato del resultato es assatis crude. Si tu vole essayar lo in omne caso, va al pagina de profilo de un persona e clicca sur le button de syndication in tu navigator, o tu pote copiar le URL del profilo (p.ex. https://joindiaspora.com/people/alcunnumero) e collar lo in un lector de syndication. Le adresse de syndication resultante ha iste aspecto: https://joindiaspora.com/public/nominedeusator.atom (diaspora* usa Atom, non RSS)."
+ subscribe_feed_q: "Pote io subscriber me al entratas public de un persona con un lector de syndication?"
+ title: "Miscellanea"
pods:
find_people_a: "Invita tu amicos usante le ligamine de e-mail in le barra lateral. Seque #etiquettas pro discoperir personas con interesses commun al tues, e adde le personas qui invia cosas de tu interesse a un aspecto. Annuncia tu presentia in disaspora* in un entrata public con le etiquetta #newhere."
find_people_q: "Io ha justo adherite a un pod, como pote io trovar gente con qui divider?"
@@ -432,6 +480,7 @@ ia:
title: "Repeter entratas"
sharing:
add_to_aspect_a1: "Suppone que Julia adde Mario a un aspecto, ma Mario non ha (ancora) addite Julia a un aspecto:"
+ add_to_aspect_a2: "Isto se appella diffusion asymmetric. Si e quando Ben adde Amy a un aspecto alora illo devenirea un intercambio reciproc: le entratas public e private de Amy e de Ben apparerea in le fluxos le un del altere, etc. "
add_to_aspect_li1: "Mario recipera notification del facto que Julia a \"comenciate a divider\" con Mario."
add_to_aspect_li2: "Julia videra ab iste momento in su fluxo le entratas public de Mario."
add_to_aspect_li3: "Julia non videra alcun entrata private de Mario."
@@ -440,18 +489,32 @@ ia:
add_to_aspect_li6: "Ben potera vider le profilo private de Amy (biographia, loco, sexo, die de nascentia)."
add_to_aspect_li7: "Amy apparera sub \"Divide solmente con me\" in le pagina de contactos de Ben."
add_to_aspect_q: "Que eveni quando io adde un persona a un de mi aspectos, o quando un persona me adde a un de su aspectos?"
+ list_not_sharing_a: "No, ma tu pote determinar si un persona divide cosas con te per visitar su pagina de profilo. Si le persona lo face, le barra sub su imagine de profilo es verde; si non, illo es gris. Tu recipe un notification cata vice que un persona comencia a divider cosas con te."
+ list_not_sharing_q: "Ha il un lista de personas que io ha addite a un de mi aspectos, ma qui non me ha addite a un del lores?"
+ only_sharing_a: "Se tracta del personas qui te ha addite a un de lor aspectos, ma qui non es (ancora) in alcun de tu aspectos. In altere parolas, illes divide cosas con te, ma tu non divide alcun cosa con illes (diffusion asymmetric). Si tu les adde a un aspecto, illes apparera sub ille aspecto e non sub \"divide solmente con me\". Vide hic supra."
+ only_sharing_q: "Proque es le personas listate in \"Divide solmente con me\" in mi pagina de contactos?"
+ see_old_posts_a: "No. Ille potera vider solmente le entratas nove in ille aspecto. Ille (e tote le mundo) pote vider tu entratas public ancian in tu pagina de profilo, e ille los videra forsan in su fluxo."
+ see_old_posts_q: "Quando io adde un persona a un aspecto, pote ille vider le ancian entratas que io ha jam inviate a ille aspecto?"
title: "Divider"
tags:
+ filter_tags_a: "Iste functionalitate non es ancora disponibile directemente de diaspora*, ma alcun %{third_party_tools} ha essite scribite que pote fornir lo."
+ filter_tags_q: "Como pote io filtrar/excluder alcun etiquettas de mi fluxo?"
+ followed_tags_a: "Post cercar un etiquetta tu pote cliccar sur le button al cyma del pagina del etiquetta pro \"sequer\" ille etiquetta. Illo apparera in le lista de etiquettas sequite al sinistra. Un clic sur un de tu etiquettas sequite te porta al pagina de ille etiquetta, de sorta que tu pote vider le entrata recente que contine ille etiquetta. Clicca sur \"#etiquettas sequite\" pro vider un fluxo de entratas que include qualcunque etiquetta que tu seque. "
+ followed_tags_q: "Que es \"etiquettas #sequite\" e como seque io un etiquetta?"
+ people_tag_page_a: "Illes es le personas qui ha listate ille etiquetta pro describer se in lor profilos public."
+ people_tag_page_q: "Qui es le personas listate al latere sinistre de un pagina de etiquetta?"
tags_in_comments_a: "Un etiquetta addite a un entrata appare como ligamine al pagina de iste etiquetta, ma non face le message (o commento) in question apparer in iste pagina de etiquetta. Isto functiona solmente pro etiquettas in entratas."
tags_in_comments_q: "Pote io mitter etiquettas in commentos o solmente in messages?"
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"
+ title_header: "Adjuta"
tutorial: "tutorial"
tutorials: "tutoriales"
wiki: "wiki"
hide: "Celar"
+ ignore: "Ignorar"
invitation_codes:
excited: "%{name} es multo felice de vider te hic."
invitations:
@@ -473,10 +536,10 @@ ia:
new:
already_invited: "Le sequente personas non ha acceptate tu invitation:"
aspect: "Aspecto"
- check_out_diaspora: "Discoperi Diaspora!"
+ check_out_diaspora: "Discoperi diaspora*!"
comma_separated_plz: "Tu pote entrar plure adresses de e-mail separante los per commas."
if_they_accept_info: "si iste persona accepta, illa essera addite al aspecto in le qual tu la invitava."
- invite_someone_to_join: "Invita qualcuno a unir se a Diaspora!"
+ invite_someone_to_join: "Invita qualcuno a unir se a diaspora*!"
language: "Lingua"
paste_link: "Divide iste ligamine con tu amicos pro invitar les a diaspora*, o invia le ligamine directemente a illes per e-mail."
personal_message: "Message personal"
@@ -489,7 +552,7 @@ ia:
application:
back_to_top: "Retornar al cyma"
powered_by: "Actionate per diaspora*"
- public_feed: "Fluxo public de Diaspora pro %{name}"
+ public_feed: "Fluxo public de diaspora* pro %{name}"
source_package: "discargar le pacchetto con le codice-fonte"
toggle: "(dis)activar mobile"
whats_new: "que es nove?"
@@ -498,25 +561,73 @@ ia:
admin: "admin"
blog: "blog"
code: "codice"
+ help: "Adjuta"
login: "aperir session"
logout: "Clauder session"
profile: "Profilo"
recent_notifications: "Notificationes recente"
settings: "Configuration"
view_all: "Vider totes"
+ likes:
+ likes:
+ people_dislike_this:
+ one: "%{count} antipathia"
+ other: "%{count} antipathias"
+ zero: "nulle antipathia "
limited: "Limitate"
more: "Plus"
next: "sequente"
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}."
+ comment_on_post:
+ one: "%{actors} commentava tu entrata %{post_link}."
+ other: "%{actors} commentava tu entrata %{post_link}."
+ zero: "%{actors} commentava tu entrata %{post_link}."
index:
+ all_notifications: "Tote le notificationes"
+ also_commented: "Anque commentate"
and: "e"
+ comment_on_post: "Commentar iste entrata"
+ liked: "Appreciate"
mark_all_as_read: "Marcar totes como legite"
+ mark_all_shown_as_read: "Marcar tote le entratas monstrate como legite"
+ mark_read: "Marcar como legite"
mark_unread: "Marcar como non legite"
+ mentioned: "Mentionate"
notifications: "Notificationes"
+ reshared: "Repetite"
+ show_all: "monstrar totes"
+ show_unread: "monstrar non legite"
+ started_sharing: "Comenciate a divider"
+ liked:
+ one: "%{actors} ha appreciate tu entrata %{post_link}."
+ other: "%{actors} ha appreciate tu entrata %{post_link}."
+ zero: "%{actors} ha appreciate tu entrata %{post_link}."
+ mentioned:
+ 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}."
post: "entrata"
+ private_message:
+ one: "%{actors} te ha inviate un message."
+ other: "%{actors} te ha inviate un message."
+ zero: "%{actors} te ha inviate un message."
+ reshared:
+ one: "%{actors} ha repetite tu entrata %{post_link}."
+ other: "%{actors} ha repetite tu entrata %{post_link}."
+ zero: "%{actors} ha repetite tu entrata %{post_link}."
+ started_sharing:
+ one: "%{actors} ha comenciate a divider cosas con te."
+ other: "%{actors} ha comenciate a divider cosas con te."
+ zero: "%{actors} ha comenciate a divider cosas con te."
notifier:
+ a_limited_post_comment: "Il ha un nove commento pro te sur un entrata limitate in diaspora*."
a_post_you_shared: "un entrata."
+ a_private_message: "Il ha un nove message private pro te in diaspora*."
accept_invite: "Accepta tu invitation a diaspora*!"
click_here: "clicca hic"
comment_on_post:
@@ -525,12 +636,54 @@ ia:
click_link: "Pro activar tu nove adresse de e-mail %{unconfirmed_email}, per favor seque iste ligamine:"
subject: "Per favor activa tu nove adresse de e-mail %{unconfirmed_email}"
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: |-
+ Hallo %{name},
+
+ Le tue datos personal ha essite processate e preparate pro discargamento. Pro discargar, seque [iste ligamine](%{url}).
+
+ Amicalmente,
+
+ Le robot messagero de diaspora*!
+ subject: "Datos personal de %{name} preste pro discargamento"
+ export_failure_email:
+ body: |-
+ Hallo %{name},
+
+ Regrettabilemente, un problema ha occurrite durante le preparation de tu datos personal pro discargamento.
+ Per favor, essaya lo de novo!
+
+ Amicalmente,
+
+ Le robot messagero de diaspora*!
+ subject: "Problema con datos personal de %{name}"
+ export_photos_email:
+ body: |-
+ Hallo %{name},
+
+ Le tractamento de tu photos ha terminate e tu pote ora [discargar los per medio de iste ligamine](%{url}).
+
+ Amicalmente,
+
+ Le robot messagero de diaspora*!      
+ subject: "Photos de %{name} preste pro discargar"
+ export_photos_failure_email:
+ body: |-
+ Hallo %{name},
+
+ Un problema ha occurrite durante le tractamento de tu photos pro discargamento.
+ Per favor, essaya lo de novo!
+
+ Con regret,
+
+ Le robot messagero de diaspora*!       
+ subject: "Problema con photos de %{name}"
hello: "Salute %{name}!"
invite:
message: |-
Hallo,
- Tu ha essite invitate a unir te a Diaspora*!
+ Tu ha essite invitate a unir te a diaspora*!
Clicca sur iste ligamine pro comenciar:
@@ -539,7 +692,7 @@ ia:
Cordialmente,
- Le robot de e-mail de Diaspora*
+ Le messagero robotic de diaspora*
[1]: %{invite_url}
invited_you: "%{name} te ha invitate a diaspora*"
@@ -551,12 +704,48 @@ ia:
subject: "%{name} te ha mentionate in diaspora*"
private_message:
reply_to_or_view: "Responde o lege iste conversation >"
+ remove_old_user:
+ body: |-
+ Salute,
+
+ A causa de inactivitate in tu conto de diaspora* a %{pod_url}, nos regretta de informar te que le systema ha marcate iste conto pro elimination. Isto occurre automaticamente post un periodo de inactivitate de plus de %{after_days} dies.
+
+ Tu pote evitar le perdita de iste conto per aperir session ante le %{remove_after}, in le qual caso le elimination essera automaticamente cancellate.
+
+ Isto es pro assecurar que nostre usatores active pote efficacemente utilisar le ressources de iste servitor de diaspora*. Gratias pro tu comprension.
+
+ Si tu vole retener tu conto, aperi session hic: %{login_url}
+
+ Sperante de vider te de novo,
+
+ Le robot de e-mail de diaspora*
+ subject: "Tu conto de diaspora* ha essite marcate pro elimination a causa de inactivitate"
+ report_email:
+ body: |-
+ Salute,
+
+ le %{type} con ID %{id} ha essite marcate como offensive.
+
+ [%{url}][1]
+
+ Per favor revide isto le plus tosto possibile!
+
+
+ Cordialmente,
+
+ Le messagero robotic de diaspora*
+
+ [1]: %{url}
+ subject: "Un nove %{type} ha essite marcate como offensive"
+ type:
+ comment: "commento"
+ post: "entrata"
reshared:
reshared: "%{name} ha repetite tu entrata"
view_post: "Vider entrata >"
single_admin:
- admin: "Tu administrator de Diaspora"
- subject: "Un message concernente tu conto de Diaspora:"
+ admin: "Le tue administrator de diaspora*"
+ subject: "Un message concernente tu conto de diaspora*:"
started_sharing:
sharing: "ha comenciate a divider con te!"
subject: "%{name} comenciava a divider cosas con te in diaspora*"
@@ -575,18 +764,19 @@ ia:
add_contact_from_tag: "adder contacto ab etiquetta"
aspect_list:
edit_membership: "modificar membrato del aspecto"
- few: "%{count} personas"
helper:
is_not_sharing: "%{name} non divide cosas con te"
is_sharing: "%{name} is sharing with you"
results_for: " resultatos pro %{params}"
index:
+ couldnt_find_them: "Non trovate?"
looking_for: "Cerca entratas con le etiquetta %{tag_link}?"
no_one_found: "…e nemo ha essite trovate."
no_results: "Un momento! Tu debe cercar qualcosa."
- results_for: "cercar resultatos pro"
+ 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..."
- many: "%{count} personas"
+ send_invite: "Ancora nihil? Invia un invitation!"
one: "1 persona"
other: "%{count} personas"
person:
@@ -623,7 +813,6 @@ ia:
add_some: "adder alcunes"
edit: "modificar"
you_have_no_tags: "tu non ha etiquettas!"
- two: "%{count} personas"
webfinger:
fail: "%{handle} non ha essite trovate."
zero: "nemo"
@@ -675,10 +864,13 @@ ia:
profile: "Profilo"
profiles:
edit:
- allow_search: "Permitter que on te cerca in Diaspora"
+ allow_search: "Permitter que on te cerca in diaspora*"
edit_profile: "Modificar profilo"
first_name: "Prenomine"
last_name: "Nomine de familia"
+ nsfw_check: "Marcar toto que io divide como NSFW"
+ nsfw_explanation: "NSFW (‘not safe for work’, non appropriate pro le travalio) es un standard communitari pro contento que poterea esser inappropriate a vider durante que on es al travalio. Si tu intende a frequentemente divider tal material, per favor, marca iste option, de sorta que tote le cosas que tu divide essera celate pro le personas qui non ha optate pro vider los."
+ nsfw_explanation2: "Si tu non selige iste option, per favor, adde le etiquetta #nsfw cata vice que tu divide tal material."
update_profile: "Actualisar profilo"
your_bio: "Tu bio"
your_birthday: "Tu data de nascentia"
@@ -695,9 +887,9 @@ ia:
updated: "Profilo actualisate"
public: "Public"
registrations:
- closed: "Le creation de contos es claudite in iste pod de Diaspora."
+ closed: "Le creation de contos es claudite in iste pod de diaspora*."
create:
- success: "Tu ha adherite a Diaspora!"
+ success: "Tu ha adherite a diaspora*!"
edit:
cancel_my_account: "Cancellar mi conto"
edit: "Modificar %{name}"
@@ -707,25 +899,40 @@ ia:
update: "Actualisar"
invalid_invite: "Le ligamine de invitation que tu ha fornite non plus es valide."
new:
- continue: "Continuar"
create_my_account: "Crear mi conto!"
- diaspora: "<3 Diaspora*"
email: "E-MAIL"
enter_email: "Specifica 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)"
- hey_make: "HEY,<br/>CREA<br/>QUALCOSA."
join_the_movement: "Adhere al movimento!"
password: "CONTRASIGNO"
password_confirmation: "CONFIRMA CONTRASIGNO"
sign_up: "CREAR CONTO"
sign_up_message: "Rete social con ♥"
+ submitting: "Submitte…"
+ terms: "Per crear un conto tu accepta le %{terms_link}."
+ terms_link: "conditiones de servicio"
username: "NOMINE DE USATOR"
+ report:
+ comment_label: "<b>Commento</b>:<br>%{data}"
+ confirm_deletion: "Es tu secur de voler deler le elemento?"
+ delete_link: "Deler elemento"
+ not_found: "<u>Le entrata/commento non ha essite trovate. Pare que le usator lo ha delite.</u>"
+ post_label: "<b>Entrata</b>: %{title}"
+ reason_label: "Motivo: %{text}"
+ reported_label: "<b>Reportate per</b> %{person}"
+ review_link: "Marcar como revidite"
+ status:
+ created: "Un reporto ha essite create"
+ destroyed: "Le entrata ha essite destruite"
+ failed: "Qualcosa ha errate"
+ marked: "Le reporto ha essite marcate como revidite"
+ title: "Summario de reportos"
requests:
create:
sending: "Invio in curso"
- sent: "Tu ha demandate de divider con %{name}. Iste persona lo videra le proxime vice que illa aperira session in Diaspora."
+ sent: "Tu ha demandate de divider con %{name}. Iste persona lo videra le proxime vice que illa aperira session in diaspora*."
destroy:
error: "Per favor selige un aspecto!"
ignore: "Demanda de contacto ignorate."
@@ -757,25 +964,26 @@ ia:
failure:
error: "un error occurreva durante le connexion a iste servicio"
finder:
- fetching_contacts: "Diaspora obtene presentemente tu amicos de %{service}. Per favor reveni in alcun pauc minutas."
+ fetching_contacts: "diaspora* obtene presentemente tu amicos de %{service}. Per favor reveni in alcun pauc minutas."
no_friends: "Nulle amico de Facebook trovate."
service_friends: "Amicos de %{service}"
index:
connect_to_facebook: "Connecter a Facebook"
connect_to_tumblr: "Connecter a Tumblr"
connect_to_twitter: "Connecter a Twitter"
+ connect_to_wordpress: "Connecter a WordPress"
disconnect: "disconnecter"
edit_services: "Modificar servicios"
logged_in_as: "identificate como"
no_services: "Tu non ha ancora connectite alcun servicio."
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."
+ services_explanation: "Le connexion a servicios da le possibilitate de publicar tu messages anque in illos si tu los scribe in diaspora*."
inviter:
click_link_to_accept_invitation: "Seque iste ligamine pro acceptar tu invitation"
join_me_on_diaspora: "Veni con me in diaspora*"
remote_friend:
invite: "invitar"
- not_on_diaspora: "Non ancora in Diaspora"
+ not_on_diaspora: "Non ancora in diaspora*"
resend: "reinviar"
settings: "Configuration"
share_visibilites:
@@ -785,11 +993,11 @@ ia:
shared:
add_contact:
add_new_contact: "Adder un nove contacto"
- create_request: "Cercar per ID de Diaspora"
+ create_request: "Cercar per ID de diaspora*"
diaspora_handle: "diaspora@pod.org"
- enter_a_diaspora_username: "Entra un nomine de usator de Diaspora:"
+ enter_a_diaspora_username: "Entra un nomine de usator de diaspora*:"
know_email: "Si tu cognosce su adresse de e-mail, tu deberea invitar le/la."
- your_diaspora_username_is: "Tu nomine de usator de Diaspora es: %{diaspora_handle}"
+ your_diaspora_username_is: "Tu nomine de usator de diaspora* es: %{diaspora_handle}"
aspect_dropdown:
add_to_aspect: "Adder contacto"
contact_list:
@@ -805,8 +1013,8 @@ ia:
invite_someone: "Invitar un persona"
invite_your_friends: "Invitar tu amicos"
invites: "Invitationes"
- invites_closed: "Le invitationes es actualmente claudite pro iste pod de Diaspora."
- share_this: "Divide iste ligamine per e-mail, blog, o tu rete social favorite!"
+ invites_closed: "Le invitationes es actualmente claudite pro iste pod de diaspora*."
+ share_this: "Divide iste ligamine per e-mail, blog o rete social!"
notification:
new: "Nove %{type} de %{from}"
public_explain:
@@ -815,7 +1023,7 @@ ia:
logged_in: "identificate 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."
+ outside: "Le messages public essera visibile pro altere personas foras de diaspora*."
share: "Divider"
title: "Connecter altere servicios"
visibility_dropdown: "Iste menu disrolante es pro cambiar le visibilitate de tu message. (Nos suggere que tu rende iste prime message public.)"
@@ -823,6 +1031,7 @@ ia:
all: "totes"
all_contacts: "tote le contactos"
discard_post: "Abandonar message"
+ formatWithMarkdown: "Tu pote usar %{markdown_link} pro formatar tu entrata"
get_location: "Localisar te"
make_public: "render public"
new_user_prefill:
@@ -830,10 +1039,17 @@ ia:
i_like: "Io me interessa in %{tags}. "
invited_by: "Gratias pro le invitation, "
newhere: "NewHere"
+ poll:
+ add_a_poll: "Adder un sondage"
+ add_poll_answer: "Adder option"
+ option: "Option 1"
+ question: "Question"
+ remove_poll_answer: "Remover option"
post_a_message_to: "Inviar un message a %{aspect}"
posting: "Invio in curso…"
preview: "Previsualisation"
publishing_to: "va publicar in: "
+ remove_location: "Remover loco"
share: "Divider"
share_with: "divider con"
upload_photos: "Incargar photos"
@@ -855,6 +1071,28 @@ ia:
via: "via %{link}"
via_mobile: "via mobile"
viewable_to_anyone: "Iste message es visibile pro tote le mundo in le web"
+ simple_captcha:
+ label: "Scribe le codice in le quadro:"
+ message:
+ default: "Le codice secrete non corresponde al imagine"
+ failed: "Verification human fallite"
+ user: "Le imagine secrete e le codice differe"
+ placeholder: "Scribe le valor del imagine"
+ statistics:
+ active_users_halfyear: "Usatores active per medie anno"
+ active_users_monthly: "Usatores active per mense"
+ closed: "Claudite"
+ disabled: "Non disponibile"
+ enabled: "Disponibile"
+ local_comments: "Commentos local"
+ local_posts: "Entratas local"
+ name: "Nomine"
+ network: "Rete"
+ open: "Aperte"
+ registrations: "Registrationes"
+ services: "Servicios"
+ total_users: "Total de usatores"
+ version: "Version"
status_messages:
create:
success: "Ha essite mentionate: %{names}"
@@ -864,6 +1102,7 @@ ia:
no_message_to_display: "Nulle message a presentar."
new:
mentioning: "Mentiona: %{person}"
+ too_long: "Per favor, non scribe plus de %{count} characteres in tu message de stato. In iste momento illo ha %{current_length} characteres."
stream_helper:
hide_comments: "Celar tote le commentos"
streams:
@@ -897,7 +1136,6 @@ ia:
title: "Activitate public"
tags:
contacts_title: "Personas qui se interessa in iste etiquetta"
- tag_prefill_text: "Le facto sur %{tag_name} es... "
title: "Messages con etiquettas: %{tags}"
tag_followings:
create:
@@ -908,13 +1146,11 @@ ia:
failure: "Impossibile cessar de sequer #%{name}. Esque tu ha jam cessate de sequer lo?"
success: "Guai! Tu non plus seque #%{name}."
tags:
+ name_too_long: "Per favor, non scribe plus de %{count} characteres in le nomine del etiquetta. In iste momento illo ha %{current_length} characteres."
show:
follow: "Sequer #%{tag}"
following: "Sequente #%{tag}"
- nobody_talking: "Nemo parla ancora de \"%{tag}\"."
none: "Le etiquetta vacue non existe!"
- people_tagged_with: "Personas con etiquetta %{tag}"
- posts_tagged_with: "Messages con etiquetta #%{tag}"
stop_following: "Non plus sequer #%{tag}"
terms_and_conditions: "Terminos e conditiones"
undo: "Disfacer?"
@@ -925,12 +1161,12 @@ ia:
email_not_confirmed: "Le adresse de e-mail non poteva esser activate. Ligamine incorrecte?"
destroy:
no_password: "Per favor entra tu contrasigno actual pro clauder tu conto."
- success: "Tu conto ha essite blocate. Le clausura definitive de tu conto pote durar 20 minutas. Gratias pro haber essayate Diaspora."
+ success: "Tu conto ha essite blocate. Le clausura definitive de tu conto pote durar 20 minutas. Gratias pro haber essayate diaspora*."
wrong_password: "Le contrasigno entrate non corresponde a tu contrasigno actual."
edit:
- also_commented: "...un altere persona commenta un entrata de un contacto tue?"
- auto_follow_aspect: "Aspecto pro usatores sequite automaticamente:"
- auto_follow_back: "Sequer automaticamente omne persona qui comencia a sequer te"
+ also_commented: "un persona commenta un entrata que tu ha commentate"
+ auto_follow_aspect: "Aspecto pro contactos automaticamente addite:"
+ auto_follow_back: "Divider automaticamente con omne persona qui comencia a divider con te"
change: "Cambiar"
change_email: "Cambiar adresse de e-mail"
change_language: "Cambiar de lingua"
@@ -941,40 +1177,48 @@ ia:
if_you_want_this: "Si tu vermente vole facer isto, entra hic infra tu contrasigno e clicca sur 'Clauder conto'."
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 partir. Si tu vermente vole partir, nos vole informar te de lo que evenira."
+ 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."
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."
+ 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."
close_account_text: "Clauder conto"
- comment_on_post: "...un persona commenta un entrata tue?"
+ comment_on_post: "un persona commenta un entrata tue"
current_password: "Contrasigno actual"
current_password_expl: "illo con que tu aperi session..."
+ download_export: "Discargar mi profilo"
+ download_export_photos: "Discargar mi photos"
download_photos: "discargar mi photos"
- download_xml: "discargar mi XML"
edit_account: "Modificar conto"
email_awaiting_confirmation: "Nos te ha inviate un ligamine de activation al adresse %{unconfirmed_email}. Usque al momento que tu seque iste ligamine pro activar le nove adresse, nos va continuar a usar tu adresse original %{email}."
export_data: "Exportar datos"
- following: "Configuration de sequimento"
+ export_in_progress: "Le datos personal tue es actualmente sub preparation. Per favor, reveni in alcun momentos."
+ export_photos_in_progress: "Le tractamento de tu photos non ha ancora terminate. Per favor, essaya lo de novo in qualque momentos."
+ following: "Configuration de divider"
getting_started: "Preferentias de nove usator"
- liked: "...un persona apprecia tu entrata?"
- mentioned: "...un persona te mentiona in un entrata sue?"
+ last_exported_at: "(Ultime actualisation: %{timestamp})"
+ liked: "un persona apprecia un entrata tue"
+ mentioned: "un persona te mentiona in un entrata sue"
new_password: "Contrasigno nove"
- photo_export_unavailable: "Le exportation de photos non es actualmente disponibile"
- private_message: "...tu recipe un message private?"
- receive_email_notifications: "Reciper notificationes per e-mail quando..."
- reshared: "...un persona repete tu entrata?"
- show_community_spotlight: "Monstrar \"Usatores in evidentia\" in fluxo?"
- show_getting_started: "Re-activar \"Como initiar\""
- started_sharing: "...un persona comencia a divider cosas con te?"
+ private_message: "tu recipe un message private"
+ receive_email_notifications: "Reciper notificationes per e-mail quando:"
+ request_export: "Requestar le datos de mi profilo"
+ request_export_photos: "Requestar mi photos"
+ request_export_photos_update: "Refrescar mi photos"
+ request_export_update: "Refrescar le datos de mi profilo"
+ 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"
+ started_sharing: "un persona comencia a divider cosas con te"
stream_preferences: "Preferentias de fluxo"
your_email: "Tu adresse de e-mail"
- your_handle: "Tu ID de Diaspora"
+ your_handle: "Tu ID de diaspora*"
getting_started:
awesome_take_me_to_diaspora: "Superbe! Conduce me a diaspora*"
- community_welcome: "Le communitate de Diaspora es felice de dar te le benvenita!"
- 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."
+ 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"
- hashtag_explanation: "Le #etiquettas permitte discuter e sequer tu interesses. Illos anque es un bon maniera de trovar nove personas in Diaspora."
+ 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."
saved: "Salveguardate!"
well_hello_there: "Salutationes a te!"
@@ -983,6 +1227,7 @@ ia:
privacy_settings:
ignored_users: "Usatores ignorate"
stop_ignoring: "Cessar de ignorar"
+ strip_exif: "Remover le metadatos, p.ex. localitate, autor, modello de camera, de imagines incargate (recommendate)"
title: "Configuration de confidentialitate"
public:
does_not_exist: "Le usator %{username} non existe!"
diff --git a/config/locales/diaspora/id.yml b/config/locales/diaspora/id.yml
index 56c2bee63..13165ad5e 100644
--- a/config/locales/diaspora/id.yml
+++ b/config/locales/diaspora/id.yml
@@ -58,8 +58,6 @@ id:
add_to_aspect:
failure: "Failed to add friend to aspect."
success: "Successfully added friend to aspect."
- aspect_contacts:
- done_editing: "Selesai"
aspect_listings:
add_an_aspect: "+ Tambah satu aspek"
deselect_all: "Batalkan semua pilihan"
@@ -77,21 +75,14 @@ id:
failure: "%{name} tidak terisi dan tidak dapat dihapus."
success: "%{name} berhasil dihapus."
edit:
- add_existing: "Tambah kontak yang sudah ada"
aspect_list_is_not_visible: "Kontak di dalam aspek ini tidak dapat saling melihat"
aspect_list_is_visible: "Kontak di dalam aspek ini dapat saling melihat."
confirm_remove_aspect: "Anda yakin ingin menghapus aspek ini?"
- done: "Selesai"
make_aspect_list_visible: "make aspect list visible?"
remove_aspect: "Hapus aspek ini"
rename: "Ganti nama"
update: "Perbarui"
updating: "Memperbarui"
- few: "%{count} aspek"
- helper:
- are_you_sure: "apakah anda yakin untuk menghapus aspek ini?"
- aspect_not_empty: "Aspek tidak kosong"
- remove: "hapus"
index:
diaspora_id:
content_1: "ID diaspora* anda:"
@@ -124,11 +115,6 @@ id:
heading: "Sambungkan Layanan"
unfollow_tag: "Berhenti mengikuti #%{tag}"
welcome_to_diaspora: "Selamat datang di diaspora*, %{name}"
- many: "%{count} aspek"
- move_contact:
- error: "Galat memindahkan kontak : %{inspect}"
- failure: "tidak bekerja %{inspect}"
- success: "Orang tersebut dipindahkan ke Aspek baru"
new:
create: "Buat"
name: "Name"
@@ -146,14 +132,6 @@ id:
family: "Keluarga"
friends: "Teman"
work: "Kerja"
- selected_contacts:
- manage_your_aspects: "Kelola aspek anda."
- no_contacts: "Anda belum memiliki kontak di sini."
- view_all_community_spotlight: "Lihat semua sorotan komunitas"
- view_all_contacts: "Lihat semua kontak"
- show:
- edit_aspect: "Ubah aspek"
- two: "%{count} aspek"
update:
failure: "Nama aspek anda, %{name}, terlalu panjang untuk disimpan."
success: "Aspek anda, %{name}, telah berhasil diubah."
@@ -166,50 +144,38 @@ id:
post_success: "Terkirim! Menutup!"
cancel: "Batal"
comments:
- few: "%{count} comments"
- many: "%{count} comments"
new_comment:
comment: "Komentar"
commenting: "Mengomentari"
one: "1 komentar"
other: "%{count} komentar"
- two: "%{count} komentar"
zero: "tak ada komentar"
contacts:
create:
failure: "gagal membuat kontak"
- few: "%{count} contacts"
index:
add_a_new_aspect: "Tambahkan aspek baru"
add_to_aspect: "Add contacts to %{name}"
- add_to_aspect_link: "tambahkan kontak dengan %{name}"
all_contacts: "Semua Kontak"
community_spotlight: "Sorotan komunitas"
- many_people_are_you_sure: "Apakah kamu mau memulai perbincangan pribadi lebih dari %{suggested_limit} kontak? Mengirim ke Aspek ini mungkin cara yang lebih baik untuk menghubungi mereka."
my_contacts: "Kontakku"
no_contacts: "No contacts."
no_contacts_message: "Lihat juga %{community_spotlight}"
- no_contacts_message_with_aspect: "Lihat %{community_spotlight} atau %{add_to_aspect_link}"
only_sharing_with_me: "Hanya berbagi dengan saya"
- remove_person_from_aspect: "Hapus %{aspect_name} dari \"%{person_name}\""
start_a_conversation: "Mulai pembicaraan"
title: "Kontak"
your_contacts: "Kontakmu"
- many: "%{count} kontak"
one: "1 kontak"
other: "%{count} kontak"
sharing:
people_sharing: "Orang-orang yang berbagi dengan anda"
spotlight:
community_spotlight: "Sorotan Komunitas"
- two: "%{count} kontak"
zero: "kontak"
conversations:
create:
fail: "Pesan tak valid"
sent: "Pesan terkirim"
- destroy:
- success: "Pembicaraan berhasil dihapus"
helper:
new_messages:
few: "%{count} new messages"
@@ -454,7 +420,6 @@ id:
add_contact_from_tag: "tambah kontak dari tag"
aspect_list:
edit_membership: "sunting keanggotaan Aspek"
- few: "%{count} people"
helper:
results_for: " hasil untuk %{params}"
index:
@@ -462,7 +427,6 @@ id:
no_one_found: "...dan tak menemukan siapapun."
no_results: "Hei! Kamu harus cari sesuatu."
results_for: "hasil pencarian untuk"
- many: "%{count} people"
one: "1 person"
other: "%{count} people"
person:
@@ -498,7 +462,6 @@ id:
add_some: "tambah beberapa"
edit: "sunting"
you_have_no_tags: "kamu tak punya tag!"
- two: "%{count} people"
webfinger:
fail: "Maaf, kita tak dapat mencari %{handle}"
zero: "no people"
@@ -636,13 +599,7 @@ id:
status_messages:
helper:
no_message_to_display: "Tidak ada pesan yang dapat ditampilkan."
- too_long:
- few: "please make your status messages less than %{count} characters"
- many: "please make your status messages less than %{count} characters"
- one: "please make your status messages less than %{count} character"
- other: "please make your status messages less than %{count} characters"
- two: "please make your status messages less than %{count} characters"
- zero: "please make your status messages less than %{count} characters"
+ too_long: "{\"few\"=>\"please make your status messages less than %{count} characters\", \"many\"=>\"please make your status messages less than %{count} characters\", \"one\"=>\"please make your status messages less than %{count} character\", \"other\"=>\"please make your status messages less than %{count} characters\", \"two\"=>\"please make your status messages less than %{count} characters\", \"zero\"=>\"please make your status messages less than %{count} characters\"}"
stream_helper:
hide_comments: "hide comments"
show_comments:
@@ -681,7 +638,6 @@ id:
close_account:
what_we_delete: "We delete all of your posts, profile data, as soon as humanly possible. Your comments will hang around, but be associated with your Diaspora Handle."
download_photos: "Unduh foto-fotoku"
- download_xml: "Unduh xmlku"
email_awaiting_confirmation: "We have sent you an activation link to %{unconfirmed_email}. Till you follow this link and activate the new address, we will continue to use your original address %{email}."
new_password: "New Password"
receive_email_notifications: "Receive email notificaions?"
diff --git a/config/locales/diaspora/io.yml b/config/locales/diaspora/io.yml
index b2103b2a4..fefe1fda1 100644
--- a/config/locales/diaspora/io.yml
+++ b/config/locales/diaspora/io.yml
@@ -44,8 +44,6 @@ io:
are_you_sure: "Ka vu esas certa?"
are_you_sure_delete_account: "Ka vu certe volas klozar vua konto? To ne povas esar desfacota."
aspects:
- aspect_contacts:
- done_editing: "finis redaktar"
aspect_listings:
add_an_aspect: "+ Adjuntez aspekto"
deselect_all: "Des-selektez omna"
@@ -59,17 +57,14 @@ io:
destroy:
success: "%{name} sucesoze efacesis."
edit:
- add_existing: "Adjuntez existanta konocato"
aspect_list_is_not_visible: "Konocati en ita aspekto ne povas vidar l'una l'altra."
aspect_list_is_visible: "Konocati en ita aspekto povas vidar l'una l'altra."
confirm_remove_aspect: "Ka vu certe volas efacar ita aspekto?"
- done: "Finis"
make_aspect_list_visible: "igar konocati en ita aspekto videbla a l'una l'altra?"
remove_aspect: "Efacez ita aspekto"
rename: "ri-nomizez"
update: "aktualigez"
updating: "aktualigas"
- few: "%{count} aspekti"
index:
donate: "Donacar"
help:
@@ -79,7 +74,6 @@ io:
new_here:
learn_more: "Lektez pluse"
title: "Bonvenez Nova Uzanti"
- many: "%{count} aspekti"
new:
create: "Kreez"
name: "Nomo (nur videbla da tu)"
@@ -94,13 +88,6 @@ io:
acquaintances: "Konocati"
family: "Familio"
friends: "Amiki"
- selected_contacts:
- manage_your_aspects: "Direktar tua aspekti."
- no_contacts: "Tu ankore ne havas konocati hike"
- view_all_contacts: "Regardez omna konocati"
- show:
- edit_aspect: "redaktez aspekto"
- two: "%{count} aspekti"
back: "Retro-irar"
cancel: "Anular"
contacts:
@@ -159,7 +146,6 @@ io:
public: "Publika"
registrations:
new:
- continue: "Durar"
password: "PASOVORTO"
search: "Serchar"
services:
diff --git a/config/locales/diaspora/is.yml b/config/locales/diaspora/is.yml
index 0bc2b1a42..4dc8d956f 100644
--- a/config/locales/diaspora/is.yml
+++ b/config/locales/diaspora/is.yml
@@ -68,8 +68,6 @@ is:
add_to_aspect:
failure: "Ekki tókst að bæta tengilið við ásýnd."
success: "Það heppnaðist að bæta tengilið við ásýnd."
- aspect_contacts:
- done_editing: "búið að breyta"
aspect_listings:
add_an_aspect: "+ Bæta við ásýnd"
deselect_all: "Velja ekkert"
@@ -86,23 +84,15 @@ is:
failure: "%{name} er ekki tóm og því ekki hægt að fjarlægja hana."
success: "það heppnaðist að fjarlægja %{name}."
edit:
- add_existing: "Bæta við tengilið sem er þegar til"
aspect_list_is_not_visible: "Tengiliðir í þessari ásýnd geta ekki séð hvern annan."
aspect_list_is_visible: "Tengiliðir í þessari ásýnd geta séð hvern annan."
confirm_remove_aspect: "Ertu viss um að þú viljir eyða þessari ásýnd?"
- done: "Búið"
make_aspect_list_visible: "gera þáttökulista ásýndar sýnilegan öðrum?"
- manage: "Stjórna"
remove_aspect: "Eyða þessari ásýnd"
rename: "breyta nafni"
set_visibility: "Stilla sýnileika"
update: "uppfæra"
updating: "uppfæri"
- few: "%{count} ásýndir"
- helper:
- are_you_sure: "Ertu viss um að þú viljir eyða þessari ásýnd?"
- aspect_not_empty: "Ásýnd er ekki tóm"
- remove: "fjarlægja"
index:
diaspora_id:
content_1: "Diaspora*-auðkennið þitt er:"
@@ -122,20 +112,17 @@ is:
tag_feature: "#feature"
tag_question: "#question"
new_here:
+ follow: "Fylgstu með %{link} og bjóddu nýja notendur velkomna á Diaspora*!"
learn_more: "Vita meira"
+ title: "Bjóða Nýja Notendur Velkomna"
no_contacts: "Engir tengiliðir"
no_tags: "+ finna merki til að fylgjast með"
people_sharing_with_you: "Fólk sem deilir með þér:"
post_a_message: "skrifa skilaboð >>"
services:
- heading: "Tengja tjónustur"
+ heading: "Tengja Þjónustur"
unfollow_tag: "Hætta að fylgjast með #%{tag}"
welcome_to_diaspora: "Velkomin í Diaspora* %{name}!"
- many: "%{count} ásýndir"
- move_contact:
- error: "Villa við að breyta tengiliði: %{inspect}"
- failure: "virkaði ekki %{inspect}"
- success: "Aðili fluttur í nýja ásýnd"
new:
create: "Búa til"
name: "Nafn (sýnilegt þér einum)"
@@ -153,14 +140,6 @@ is:
family: "Fjölskylda"
friends: "Vinir"
work: "Vinna"
- selected_contacts:
- manage_your_aspects: "Sýsla með ásýndir."
- no_contacts: "Þú ert ekki enn með neina tengiliði hér."
- view_all_community_spotlight: "Sjá allt sem efst er á baugi í samfélaginu"
- view_all_contacts: "Sjá alla tengiliði"
- show:
- edit_aspect: "breyta ásýndum"
- two: "%{count} ásýndir"
update:
failure: "Ásýnd þín, %{name}, hefur of langt nafn til að hægt sé að vista hana."
success: "Ásýnd þinni, %{name}, hefur verið breytt."
@@ -173,22 +152,17 @@ is:
post_success: "Sent! Loka!"
cancel: "Hætta við"
comments:
- few: "%{count} comments"
- many: "%{count} comments"
new_comment:
comment: "Athugasemd"
commenting: "Athugasemd gerð..."
one: "1 comment"
other: "%{count} comments"
- two: "%{count} comments"
zero: "no comments"
contacts:
create:
failure: "Ekki tókst að mynda tengsl"
- few: "%{count} tengsl"
index:
add_to_aspect: "Add contacts to %{name}"
- add_to_aspect_link: "bæta tengiliðum við %{name}"
all_contacts: "Allir tengiliðir"
community_spotlight: "Efst á baugi í samfélaginu"
my_contacts: "Tengiliðirnir mínir"
@@ -196,21 +170,17 @@ is:
start_a_conversation: "Hefja umræðu"
title: "Tengiliðir"
your_contacts: "Þínir tegiliðir"
- many: "%{count} tengiliðir"
one: "1 tengiliður"
other: "%{count} tengiliðir"
sharing:
people_sharing: "Fólk sem deilir með þér:"
spotlight:
community_spotlight: "Efst á baugi í samfélaginu"
- two: "%{count} tengiliðir"
zero: "tengiliðir"
conversations:
create:
fail: "Ógild skilaboð"
sent: "Skilaboð send"
- destroy:
- success: "Umræða hefur verið fjarlægð"
helper:
new_messages:
one: "1 ný skilaboð"
@@ -279,6 +249,7 @@ is:
if_they_accept_info: "ef þau þiggja boðið, verður þeim bætt við þá ásýnd sem þú bauðst þeim á."
invite_someone_to_join: "Bjóddu einhverjum að tengjast Díaspora*!"
language: "Tungumál"
+ paste_link: "Deildu þessum tengil með vinum þínum til þess að bjóða þeim á diaspora*, eða sendu þeim tengilinn beint í gegnum tölvupóst."
personal_message: "Persónuleg skilaboð"
resend: "Endursenda"
send_an_invitation: "Sendu boðsmiða"
@@ -450,14 +421,12 @@ is:
invited_by: "þér var boðið af"
aspect_list:
edit_membership: "breyta aðild að ásýnd"
- few: "%{count} people"
helper:
results_for: " niðurstöður fyrir %{params}"
index:
no_one_found: "...og enginn fannst."
no_results: "Hey! Þú þarft að leita að einhverju."
results_for: "Notendur sem samsvara %{search_term}"
- many: "%{count} people"
one: "1 person"
other: "%{count} people"
person:
@@ -484,7 +453,6 @@ is:
to_accept_or_ignore: "að samþykkja eða hunsa það."
sub_header:
edit: "breyta"
- two: "%{count} people"
webfinger:
fail: "Því miður, %{handle} fannst ekki."
zero: "no people"
@@ -569,7 +537,6 @@ is:
unhappy: "Óhamingjusamur?"
update: "Uppfæra"
new:
- continue: "Halda áfram"
create_my_account: "Create my account"
email: "NETFANG"
enter_email: "Gefðu upp netfang"
@@ -681,13 +648,7 @@ is:
failure: "Ekki tókst að eyða færslu"
helper:
no_message_to_display: "Engin skilaboð að sýna!"
- too_long:
- few: "please make your status messages less than %{count} characters"
- many: "please make your status messages less than %{count} characters"
- one: "please make your status messages less than %{count} character"
- other: "please make your status messages less than %{count} characters"
- two: "please make your status messages less than %{count} characters"
- zero: "please make your status messages less than %{count} characters"
+ too_long: "{\"few\"=>\"please make your status messages less than %{count} characters\", \"many\"=>\"please make your status messages less than %{count} characters\", \"one\"=>\"please make your status messages less than %{count} character\", \"other\"=>\"please make your status messages less than %{count} characters\", \"two\"=>\"please make your status messages less than %{count} characters\", \"zero\"=>\"please make your status messages less than %{count} characters\"}"
stream_helper:
hide_comments: "fela athugasemdir"
show_comments:
diff --git a/config/locales/diaspora/it.yml b/config/locales/diaspora/it.yml
index ff0b43f14..a6cafadb5 100644
--- a/config/locales/diaspora/it.yml
+++ b/config/locales/diaspora/it.yml
@@ -78,20 +78,29 @@ it:
other: "%{count} utenti"
zero: "%{count} utenti"
week: "1 settimana"
+ user_entry:
+ ? "no"
+ : "No"
+ ? "yes"
+ : Si
user_search:
add_invites: "aggiungi inviti"
+ close_account: "Chiudi l'account"
email_to: "Email a cui mandare l'invito"
under_13: "Mostra utenti sotto i 13 anni (Children's Online Privacy Protection Act)"
users:
one: "trovato %{count} utente"
other: "trovati %{count} utenti"
zero: "trovati %{count} utenti"
- you_currently: "al momento hai %{user_invitation} inviti a disposizione %{link}"
+ you_currently:
+ one: "al momento hai un invito a disposizione %{link}"
+ other: "al momento hai %{count} inviti a disposizione %{link}"
+ zero: "al momento non hai inviti a disposizione %{link}"
weekly_user_stats:
amount_of:
- one: "totale dei nuovi utenti di questa settimana: %{count}"
- other: "totale di nuovi utenti questa settimana: %{count}"
- zero: "totale di nuovi utenti questa settimana: nessuno"
+ one: "Numero di nuovi utenti questa settimana: %{count}"
+ other: "Numero di nuovi utenti questa settimana: %{count}"
+ zero: "Numero di nuovi utenti questa settimana: nessuno"
current_server: "La data attuale del server è %{date}"
ago: "%{time} fa"
all_aspects: "Tutti gli aspetti"
@@ -111,8 +120,6 @@ it:
add_to_aspect:
failure: "Errore nell'aggiungere il contatto all'aspetto."
success: "Il contatto è stato aggiunto all'aspetto."
- aspect_contacts:
- done_editing: "modifica eseguita"
aspect_listings:
add_an_aspect: "+ Aggiungi un aspetto"
deselect_all: "Deseleziona tutti"
@@ -131,22 +138,14 @@ it:
failure: "%{name} non è stato rimosso perché non è vuoto."
success: "%{name} è stato rimosso con successo."
edit:
- add_existing: "Aggiungi un contatto esistente"
aspect_list_is_not_visible: "i Contatti in questo aspetto non sono visibili tra loro"
aspect_list_is_visible: "I Contatti in questo aspetto sono visibili tra loro"
confirm_remove_aspect: "Sei sicuro di voler eliminare questo aspetto?"
- done: "Fatto"
make_aspect_list_visible: "Vuoi che i contatti di questo aspetto vedano gli altri che ne fanno parte?"
- manage: "Gestisci"
remove_aspect: "Elimina questo aspetto"
rename: "rinomina"
update: "aggiorna"
updating: "aggiornamento in corso"
- few: "%{count} aspetti"
- helper:
- are_you_sure: "Sei sicuro di voler eliminare questo aspetto?"
- aspect_not_empty: "Aspetto non vuoto"
- remove: "rimuovi"
index:
diaspora_id:
content_1: "Il tuo ID è:"
@@ -170,9 +169,9 @@ it:
tag_feature: "idea"
tag_question: "domanda"
tutorial_link_text: "Guide"
- tutorials_and_wiki: "%{tutorial} & %{wiki}: Un aiuto per i tuoi primi passi"
+ tutorials_and_wiki: "%{faq}, %{tutorial} & %{wiki}: un aiuto per i tuoi primi passi."
introduce_yourself: "Questo è il tuo stream. Sali a bordo e presentati!"
- keep_diaspora_running: "Fai andare veloce lo sviluppo di Diaspora con una donazione mensile!"
+ keep_diaspora_running: "Velocizza lo sviluppo di diaspora con una donazione mensile!"
keep_pod_running: "Mantieni %{pod} veloce e scattante, la tua donazione mensile sarà il caffè per i nostri server!"
new_here:
follow: "Segui %{link} per dare il benvenuto ai nuovi iscritti su Diaspora*!"
@@ -186,12 +185,7 @@ it:
content: "Puoi collegare i seguenti servizi a Diaspora:"
heading: "Servizi connessi"
unfollow_tag: "Smetti di seguire #%{tag}"
- welcome_to_diaspora: "Diaspora ti dà il benvenuto, %{name}!"
- many: "%{count} aspetti"
- move_contact:
- error: "Errore nello spostare il contatto: %{inspect}"
- failure: "non ha funzionato %{inspect}"
- success: "Persona spostata in un altro aspetto"
+ welcome_to_diaspora: "Benvenuto in diaspora, %{name}!"
new:
create: "Crea"
name: "Nome (visibile solo a te)"
@@ -209,14 +203,6 @@ it:
family: "Famiglia"
friends: "Amici"
work: "Lavoro"
- selected_contacts:
- manage_your_aspects: "Modifica gli aspetti."
- no_contacts: "Ancora non hai contatti."
- view_all_community_spotlight: "Tutti gli utenti in evidenza"
- view_all_contacts: "Mostra tutti i contatti"
- show:
- edit_aspect: "modifica aspetto"
- two: "%{count} aspetti"
update:
failure: "Il tuo aspetto, %{name}, ha un nome troppo lungo per poter essere salvato."
success: "Il tuo aspetto, %{name}, è stato modificato con successo."
@@ -230,42 +216,33 @@ it:
failure: "Non posso smettere di ignorare l'utente. #evasion"
success: "Vediamo cosa hanno da dire! #sayhello"
bookmarklet:
- explanation: "Condividi su Diaspora quando vuoi aggiungendo %{link} tra i preferiti."
+ explanation: "Condividi su diaspora* quando vuoi aggiungendo %{link} tra i preferiti."
heading: "Bookmarklet"
post_something: "Pubblica su Diaspora"
post_success: "Inviato! Chiusura in corso!"
cancel: "Annulla"
comments:
- few: "%{count} commenti"
- many: "%{count} commenti"
new_comment:
comment: "Commenta"
commenting: "Invio commento in corso..."
one: "1 commento"
other: "%{count} commenti"
- two: "%{count} commenti"
zero: "nessun commento"
contacts:
create:
failure: "Impossibile creare il contatto"
- few: "%{count} contatti"
index:
add_a_new_aspect: "Aggiungi un aspetto"
add_to_aspect: "aggiungi i contatti a %{name}"
- add_to_aspect_link: "aggiungi contatti a %{name}"
all_contacts: "Tutti i contatti"
community_spotlight: "In evidenza nella comunità"
- many_people_are_you_sure: "Stai inviando un messaggio privato a più di %{suggested_limit} contatti. Vuoi farlo davvero? Forse potrebbe essere più opportuno pubblicarlo su un aspetto!"
my_contacts: "I miei contatti"
no_contacts: "Probabilmente devi aggiungere qualche contatto!"
no_contacts_message: "Scopri gli utenti %{community_spotlight}"
- no_contacts_message_with_aspect: "Scopri gli utenti %{community_spotlight} oppure %{add_to_aspect_link}"
only_sharing_with_me: "Condividono con me"
- remove_person_from_aspect: "Rimuovi %{person_name} da \"%{aspect_name}\""
start_a_conversation: "Inizia una conversazione"
title: "Contatti"
your_contacts: "I tuoi contatti"
- many: "%{count} contatti"
one: "1 contatto"
other: "%{count} contatti"
sharing:
@@ -273,7 +250,6 @@ it:
spotlight:
community_spotlight: "In evidenza nella comunità"
suggest_member: "Suggerisci un utente"
- two: "%{count} contatti"
zero: "contatti"
conversations:
conversation:
@@ -282,8 +258,6 @@ it:
fail: "Messaggio non valido"
no_contact: "Hey, devi prima aggiungere un contatto!"
sent: "Messaggio inviato"
- destroy:
- success: "Conversazione rimossa con successo"
helper:
new_messages:
one: "%{count} nuovo messaggio"
@@ -301,6 +275,8 @@ it:
sending: "Invio in corso..."
subject: "oggetto"
to: "a"
+ new_conversation:
+ fail: "Messaggio non valido"
show:
delete: "elimina e blocca la conversazione"
reply: "rispondi"
@@ -318,6 +294,7 @@ it:
invalid_fields: "Campi non validi"
login_try_again: "Per favore <a href='%{login_link}'> accedi </a> e riprova"
post_not_public: "Il post che stai cercando di vedere non è pubblico!"
+ post_not_public_or_not_exist: "Il post che stai cercando di visualizzare non è pubblico o non esiste!"
fill_me_out: "Scrivi qui"
find_people: "Cerca persone o #tag"
help:
@@ -382,6 +359,13 @@ it:
title: "Menzioni"
what_is_a_mention_a: "Una menzione in un post è un link alla pagina del profilo di una persona. Quando qualcuno è menzionato riceve una notifica che richiama la sua attenzione al post stesso."
what_is_a_mention_q: "Cosa è una \"menzione\"?"
+ miscellaneous:
+ back_to_top_a: "Si. Dopo averla fatta scorrere in basso, clicca sulla freccia grigia che appare nell`angolo in basso a destra della finestra del tuo browser."
+ back_to_top_q: "C`è un modo veloce per tornare in cima ad una pagina una volta che l'ho fatta scorrere in basso?"
+ diaspora_app_q: "Esiste l'app diaspora per Android o iOS?"
+ photo_albums_a: "Al momento no. Tuttavia puoi vedere uno stream delle loro foto caricate dalla sezione foto nella barra laterale del loro profilo."
+ photo_albums_q: "Ci sono album di foto o video?"
+ title: "Varie"
pods:
find_people_a: "Puoi invitare i tuoi amici inviando per email il link che trovi sulla barra laterale. Inizia a seguire dei #tag per scoprire altre persone con cui hai interessi in comune e aggiungi ai tuoi aspetti quelle interessanti. Puoi anche scrivere un post annunciando che sei #NuovoUtente e vedrai che qualcuno si presenterà per darti il benvenuto."
find_people_q: "Mi sono appena registrato su un pod, come trovo persone con cui condividere?"
@@ -413,6 +397,7 @@ it:
stream_full_of_posts_a1: "Il tuo stream si compone di tre tipi di posts"
stream_full_of_posts_li1: "I posts delle persone con cui condividi, sono di due tipi: messaggi pubblici e messaggi limitati solo ad alcuni aspetti che condividi. Per rimuovere questi post dal tuo stream, semplicemente elimina la condivisione con la persona"
stream_full_of_posts_li2: "I messaggi pubblici contengono un tag che stai seguendo. Per rimuoverli, smetti di seguire il tag."
+ stream_full_of_posts_li3: "Post pubblici di utenti in evidenza. Questi possono essere rimossi cliccando sull'opzione \"mostra utenti in evidenza nello stream?\" nella scheda account delle tue impostazioni."
stream_full_of_posts_q: "Perchè il mio stream è pieno di post di gente che non conosco e con cui non condivido nulla?"
title: "I post"
private_posts:
@@ -427,6 +412,7 @@ it:
who_sees_post_q: "Quando posto un messaggio ad un Aspetto (es: un messaggio privato), chi può vederlo?"
private_profiles:
title: "Profili privati"
+ whats_in_profile_a: "Biografia, luogo, sesso e data di nascita. Sono tutti dati della sezione inferiore della pagina editabile del profilo. Tutte queste informazioni sono opzionali (sta a te se inserirle o no). Gli utenti registrati che hai aggiunto ai tuoi aspetti sono le sole persone che possono vedere il tuo profilo privato. Essi potranno anche vedere i post privati pertinenti agli aspetti di cui fanno parte, assieme ai post pubblici, quando visitano la pagina del tuo profilo."
whats_in_profile_q: "Cosa c'è nel mio profilo privato?"
who_sees_profile_a: "Qualunque utente loggato con cui lo stai condividendo (cioè, lo hai aggiunto ad uno dei tuoi aspetti). Tuttavia, le persone che ti seguono, ma che tu non segui, vedranno solo le tue informazioni pubbliche."
who_sees_profile_q: "Chi vede il mio profilo privato?"
@@ -435,8 +421,12 @@ it:
public_posts:
can_comment_reshare_like_a: "Qualunque utente di diaspora* loggato può commentare, ri-condividere, o mettere mi piace sul tuo post pubblico."
can_comment_reshare_like_q: "Chi può commentare, ri-condividere, o mettere mi piace sul mio post pubblico?"
+ deselect_aspect_posting_a: "Deselezionare aspetti non affetta post pubblici. Questi continueranno ad apparire nei stream di tutti i tuoi contatti. Per visualizzare un post solo su specifici aspetti, seleziona questi aspetti in basso sotto colui che lo ha pubblicato."
deselect_aspect_posting_q: "Cosa succede quando deseleziono uno o più Aspetti quando creo un post pubblico?"
+ find_public_post_a: "Il tuo post pubblico verrá mostrato nello stream di coloro che ti seguono. Se includi #tags nel tuo post pubblico, allora chiunque segue questi \"tags\" potrà trovare il tuo post nel suo stream. Ogni post pubblico ha anche un URL specifico che chiunque può vedere, anche se non hanno effettuato l'accesso (dato che i post pubblici potrebbero essere link da Twitter, blogs etc.). I post pubblici potrebbero anche essere indicizzati da motori di ricerca."
find_public_post_q: "Le altre persone come possono trovare i miei post?"
+ see_comment_reshare_like_a: "Tutti gli utenti che abbiano effettuato l'accesso in diaspora* e chiunque in internet. Commenti, \"mi piace\" e condivisioni di post pubblici sono anch'essi pubblici."
+ see_comment_reshare_like_q: "Chi può vedere i miei commenti, condivisioni o \"mi piace\" nei post pubblici?"
title: "Post pubblici"
who_sees_post_a: "Potenzialmente chiunque stia utilizzando internet può vedere un post che hai segnato come pubblico, perciò assicurati di voler rendere per davvero il tuo post pubblico. E' un fantastico modo di allungarsi verso il mondo."
who_sees_post_q: "Quando posto qualcosa pubblicamente, chi può vederla?"
@@ -451,21 +441,43 @@ it:
who_sees_updates_a: "Chiunque visiti la tua pagina del profilo può vedere i cambiamenti."
who_sees_updates_q: "Chi vede gli aggiornamenti del mio profilo pubblico?"
resharing_posts:
+ reshare_private_post_aspects_a: "No, non è possibile condividere un post privato. Ciò per rispettare le intenzioni di chi lo ha originalmente condiviso, il quale lo ha condiviso solamente con un gruppo particolare di persone."
+ reshare_private_post_aspects_q: "Posso condividere un post privato con solo certi aspetti?"
+ reshare_public_post_aspects_a: "No, quando condividi un post pubblico questo diventa automaticamente un tuo post pubblico. Per poterlo condividere con solo certi aspetti, copia e incolla il contenuto del post in un nuovo post."
+ reshare_public_post_aspects_q: "Posso condividere un post pubblico con solo certi aspetti?"
title: "Ri-condividere post"
sharing:
add_to_aspect_a1: "Poniamo che Amy aggiunga Ben ad un Aspetto, ma Ben non abbia (ancora) aggiunto Amy ad un Aspetto."
+ add_to_aspect_a2: "Questa è nota come condivisione assimetrica. Solo e quando Ben aggiungerà Amy ad un aspetto allora questa diventerà una condivisione mutua, con i post pubblici e rilevanti post privati di entrambi visibili nei relativi stream, etc. "
add_to_aspect_li1: "Bill riceverà una notifica che dirà che Amy ha \"iniziato a condividere\" con lui."
add_to_aspect_li2: "Amy inizierà a vedere i post pubblici di Ben nel suo profilo."
add_to_aspect_li3: "Amy non vedrà alcun post privato di Ben."
add_to_aspect_li4: "Ben non vedrà i post pubblici o privati di Amy nel suo stream."
add_to_aspect_li5: "Ma se Ben andrà nella pagina del profilo di Amy, allora vedrà i messaggi privati di Amy che lei crea per il suo Aspetto in cui c'è lui (e anche i suoi post pubblici che chiunque può vedere)."
add_to_aspect_li6: "Ben potrà vedere il profilo privato di Amy (biografia, luogo, sesso, compleanno)."
+ add_to_aspect_li7: "Amy apparirà nella pagina di Ben \"condividono con me\"."
+ add_to_aspect_q: "Cosa succede quando aggiungo qualcuno ad uno dei miei aspetti? Oppure quando qualcuno mi aggiunge ad uno dei suoi aspetti?"
+ list_not_sharing_a: "No, però puoi vedere se una persona ti sta seguendo visitando la pagina del suo profilo. Se lo stanno facendo, allora la barra sotto il loro profilo sarà verde; nel caso contrario sarà grigia. Dovresti ricevere una notifica ogniqualvolta qualcuno inizia a seguirti."
+ list_not_sharing_q: "C`è una lista di persone che ho aggiunto ad uno dei miei aspetti, ma che non mi hanno ancora aggiunto ai loro?"
+ only_sharing_a: "Queste sono le persone che ti hanno aggiunto ad uno dei loro aspetti, ma che non sono (ancora) in nessuno dei tuoi aspetti. In altre parole, loro ti stanno seguendo ma tu no (condivisione asimmetrica). Se tu li aggiungi ad un aspetto, allora appariranno in quell`aspetto e non più in \"condividono con me\". Vedi sopra."
+ only_sharing_q: "Chi sono le persone elencate in \"condividono con me\" nella mia pagina dei contatti?"
+ see_old_posts_a: "No. Potrà solamente vedere post nuovi di quel aspetto. Loro (e ogni altro) potranno vedere i tuoi vecchi post pubblici sulla pagina del tuo profilo e sul loro stream."
+ see_old_posts_q: "Quando aggiungo qualcuno ad un aspetto, può questi vedere post vecchi che ho già postato in quel aspetto?"
title: "Condividendo"
tags:
+ filter_tags_a: "Ciò non è ancora disponibile in diaspora*, ma alcuni %{third_party_tools} sono già stati scritti per poter provvedere a questo servizio."
+ filter_tags_q: "Come posso filtrare/escludere alcuni tag dal mio stream?"
+ followed_tags_a: "Dopo aver cercato una tag puoi cliccare sul bottone in cima alla pagina della tag e seguire la tag. Questa apparirà così nella lista delle tue tag seguite sulla sinistra. Cliccando su una delle tue tag seguite verrai portato sulla pagina di quella tag e in questo modo potrai vedere i post recenti contenenti quella tag. Clicca su \"#Followed Tags\" per vedere uno stream di post che includano una delle tue tag seguite. "
+ followed_tags_q: "Cosa sono le \"#Followed Tags\" e come posso seguirle?"
+ people_tag_page_a: "Sono persone che hanno elencato quel tag per descrivere se stessi nel loro profilo pubblico."
+ people_tag_page_q: "Chi sono quelle persone elencate nella parte sinistra della pagina del tag?"
+ tags_in_comments_a: "Un tag aggiunto ad un commento verrà mostrato come un link alla pagina di quel tag, ma non farà apparire quel post (o commento) nella pagina di quel tag. Ciò funziona solo con le tag nei post."
tags_in_comments_q: "Posso mettere dei tag nei commenti o solo nei post?"
title: "Tag"
+ what_are_tags_for_a: "Le tag sono un modo per categorizzare un post, normalmente per argomento. Cercando un tag verranno mostrati tutti i post con quel tag (sia pubblici che privati). Ciò permette a coloro interessati a certi argomenti di trovare i post pubblici su di essi."
what_are_tags_for_q: "A cosa servono i tag?"
third_party_tools: "tool di terze parti"
+ title_header: "Aiuto"
tutorial: "guida"
tutorials: "guide"
wiki: "wiki"
@@ -499,7 +511,7 @@ it:
zero: "Ti restano 0 inviti"
comma_separated_plz: "Puoi inserire più indirizzi di posta separati da virgole."
if_they_accept_info: "se accettano, saranno aggiunti all'aspetto in cui li hai invitati."
- invite_someone_to_join: "Invita qualcuno ad entrare in Diaspora!"
+ invite_someone_to_join: "Invita qualcuno ad entrare in diaspora*!"
language: "Lingua"
paste_link: "Condividi questo link con i tuoi amici per invitarli su Diaspora*, puoi anche inviarlo per email."
personal_message: "Messaggio privato"
@@ -512,8 +524,7 @@ it:
application:
back_to_top: "Torna all'inizio"
powered_by: "POWERED BY DIASPORA*"
- public_feed: "Feed pubblici Diaspora di %{name}"
- source_package: ""
+ public_feed: "Feed pubblici diaspora* di %{name}"
toggle: "attiva/disattiva versione mobile"
whats_new: "novità"
your_aspects: "i tuoi aspetti"
@@ -577,6 +588,7 @@ it:
other: "%{count} nuove notifiche"
zero: "Nessuna nuova notifica"
index:
+ all_notifications: "Vedi tutte le notifiche"
and: "e"
and_others:
few: "e altre %{count} persone"
@@ -585,7 +597,7 @@ it:
other: "e altre %{count} persone"
two: "e altre %{count} persone"
zero: "e nessun altro"
- mark_all_as_read: "Segna come lette"
+ mark_all_as_read: "Segnalali tutti come letti"
mark_read: "Segna come letto"
mark_unread: "Segna come non letti"
mentioned: "Menzionato"
@@ -622,7 +634,7 @@ it:
reshared:
one: "%{actors} ha condiviso il tuo %{post_link}."
other: "%{actors} hanno condiviso il tuo %{post_link}."
- zero: "%{actors} ha condiviso il tuo %{post_link}."
+ zero: "%{actors} hanno condiviso il tuo %{post_link}."
reshared_post_deleted:
few: "%{actors} hanno condiviso il post che hai eliminato."
many: "%{actors} hanno condiviso il post che hai eliminato."
@@ -673,6 +685,9 @@ it:
subject: "%{name} ti ha menzionato su Diaspora*"
private_message:
reply_to_or_view: "Rispondi o leggi questa conversazione >"
+ report_email:
+ type:
+ comment: "Commento"
reshared:
reshared: "%{name} ha condiviso il tuo post"
view_post: "Leggi il post >"
@@ -697,7 +712,6 @@ it:
add_contact_from_tag: "aggiungi contatto dal #tag"
aspect_list:
edit_membership: "modifica appartenenza all'aspetto"
- few: "%{count} persone"
helper:
is_not_sharing: "%{name} non condivide con te"
is_sharing: "%{name} sta condividendo con te"
@@ -707,11 +721,10 @@ it:
looking_for: "Cerchi i post con il tag %{tag_link}?"
no_one_found: "...e nessuno è stato trovato."
no_results: "Ehi! Devi inserire qualcosa da cercare."
- results_for: "risultati della ricerca di"
+ results_for: "Risultati della ricerca di %{search_term}"
search_handle: "Utilizza la loro ID diaspora* (nomeutente@pod.tld) per essere sicuro di trovare i tuoi amici."
searching: "ricerca in corso, devi avere pazienza..."
send_invite: "Ancora niente? Manda un invito!"
- many: "%{count} persone"
one: "una persona"
other: "%{count} persone"
person:
@@ -725,7 +738,7 @@ it:
edit_my_profile: "Modifica il mio profilo"
gender: "sesso"
in_aspects: "negli aspetti"
- location: "dove ti trovi"
+ location: "Luogo"
photos: "Foto"
remove_contact: "rimuovi contatto"
remove_from: "Rimuovere %{name} da %{aspect}?"
@@ -748,7 +761,6 @@ it:
add_some: "aggiungi"
edit: "modifica"
you_have_no_tags: "non hai alcun tag!"
- two: "%{count} persone"
webfinger:
fail: "Spiacenti, non possiamo trovare %{handle}."
zero: "nessuna persona"
@@ -846,26 +858,24 @@ it:
update: "Aggiorna"
invalid_invite: "L'invito che hai usato non è più valido!"
new:
- continue: "Continua"
create_my_account: "Crea il mio account!"
- diaspora: "<3 Diaspora*"
email: "EMAIL"
enter_email: "Inserisci un indirizzo email"
enter_password: "Scegli una password (minimo 6 caratteri)"
enter_password_again: "Scrivi di nuovo la password per verifica"
enter_username: "Scegli un nome utente (usa solo lettere, numeri e trattino basso)"
- hey_make: "HEY,<br/>CREA<br/>QUALCOSA."
join_the_movement: "Partecipa al movimento!"
password: "PASSWORD"
password_confirmation: "CONFERMA PASSWORD"
sign_up: "ISCRIVITI"
sign_up_message: "Il Social Network con un ♥ così"
submitting: "Invio..."
+ terms_link: "Termini di servizio"
username: "NOME UTENTE"
requests:
create:
sending: "Invio in corso..."
- sent: "Hai chiesto di condividere con %{name}. Gli sarà notificato al prossimo accesso su Diaspora."
+ sent: "Hai chiesto di condividere con %{name}. Gli sarà notificato al prossimo accesso su diaspora*."
destroy:
error: "Seleziona un aspetto!"
ignore: "Richiesta di contatto ignorata."
@@ -909,7 +919,7 @@ it:
failure:
error: "si è verificato un errore durante la connessione a quel servizio"
finder:
- fetching_contacts: "Diaspora sta importando i tuoi amici su %{service}, il risultato sarà visibile tra alcuni minuti."
+ fetching_contacts: "diaspora* sta importando i tuoi amici su %{service}, il risultato sarà visibile tra alcuni minuti."
no_friends: "Non ho trovato amici su Facebook."
service_friends: "Amici su %{service}"
index:
@@ -922,7 +932,7 @@ it:
logged_in_as: "accesso effettuato come"
no_services: "Ancora non hai collegato alcun servizio."
really_disconnect: "disconnettere %{service}?"
- services_explanation: "Il collegamento ad altri servizi ti dà la possibilità di pubblicare i post che invii su Diaspora"
+ services_explanation: "Il collegamento ad altri servizi ti dà la possibilità di pubblicare i post che invii su diaspora*."
inviter:
click_link_to_accept_invitation: "Vai a questo indirizzo per accettare l'invito"
join_me_on_diaspora: "Vieni con me su DIASPORA*"
@@ -942,7 +952,7 @@ it:
diaspora_handle: "diaspora@pod.org"
enter_a_diaspora_username: "Inserisci un nome utente Diaspora"
know_email: "Conosci i loro indirizzi email? Dovresti invitarli"
- your_diaspora_username_is: "Il tuo ID è: %{diaspora_handle}"
+ your_diaspora_username_is: "Il tuo nome utente (ID) è: %{diaspora_handle}"
aspect_dropdown:
add_to_aspect: "Aggiungi"
toggle:
@@ -966,7 +976,7 @@ it:
invite_your_friends: "Invita i tuoi amici"
invites: "Inviti"
invites_closed: "Al momento non è permesso spedire inviti per questo pod Diaspora."
- share_this: "Condividi questo link tramite email, blog, o su altri social network!"
+ share_this: "Condividi questo link tramite email, blog, o altri social network!"
notification:
new: "Nuovo %{type} da %{from}"
public_explain:
@@ -990,6 +1000,9 @@ it:
i_like: "I miei interessi sono %{tags}."
invited_by: "Grazie per l'invito, "
newhere: "NuovoUtente"
+ poll:
+ add_a_poll: "Aggiungi un sondaggio"
+ option: "Opzione 1"
post_a_message_to: "Invia un messaggio a %{aspect}"
posting: "Invio in corso..."
preview: "Anteprima"
@@ -1020,8 +1033,8 @@ it:
label: "Inserisci il codice nel box"
message:
default: "Il codice segreto non corrisponde all'immagine"
- user: "L'immagine segreta e il codice non coincidevano"
- placeholder: "Inserisci il valore nell'immagine"
+ user: "L'immagine segreta e il codice non coincidono"
+ placeholder: "Inserisci il valore dell'immagine"
status_messages:
create:
success: "Menzionati con successo: %{names}"
@@ -1031,10 +1044,7 @@ it:
no_message_to_display: "Nessun messaggio da visualizzare."
new:
mentioning: "Stai menzionando: %{person}"
- too_long:
- one: "per favore scrivi i tuoi stati con meno di %{count} carattere"
- other: "per favore scrivi i tuoi stati con meno di %{count} caratteri"
- zero: "per favore scrivi i tuoi stati con meno di %{count} caratteri"
+ too_long: "Per favore scrivi i tuoi stati con meno di %{count} carattere. Al momento ci sono %{current_length} caratteri"
stream_helper:
hide_comments: "Nascondi i commenti"
show_comments:
@@ -1072,7 +1082,6 @@ it:
title: "Attività pubblica"
tags:
contacts_title: "Persone con questo tag"
- tag_prefill_text: "A proposito di %{tag_name} ..."
title: "Post con tag: %{tags}"
tag_followings:
create:
@@ -1085,15 +1094,8 @@ it:
tags:
show:
follow: "Segui #%{tag}"
- followed_by_people:
- one: "Seguita da una persona"
- other: "Seguito da %{count} persone"
- zero: "Seguito da nessuno"
following: "Stai seguendo #%{tag}"
- nobody_talking: "Nessuno sta ancora parlando di %{tag}."
none: "Il tag vuoto non esiste!"
- people_tagged_with: "Persone con il tag %{tag}"
- posts_tagged_with: "Post con il tag #%{tag}"
stop_following: "Smetti di seguire #%{tag}"
terms_and_conditions: "Termini e condizioni d'uso"
undo: "Annullare?"
@@ -1104,10 +1106,10 @@ it:
email_not_confirmed: "L'email non è stata attivata. C'è un errore nel link?"
destroy:
no_password: "Per favore inserisci la password per chiudere l'account."
- success: "Il tuo account è stato bloccato. Il processo di chiusura dovrebbe essere completato in circa 20 minuti. Grazie per aver provato Diaspora."
+ success: "Il tuo account è stato bloccato. Il processo di chiusura dovrebbe essere completato in circa 20 minuti. Grazie per aver provato diaspora*."
wrong_password: "La password inserita non corrisponde."
edit:
- also_commented: "...qualcuno commenta un post dopo di te?"
+ also_commented: "qualcuno ha commentato un post che hai commentato"
auto_follow_aspect: "Scegli un aspetto per gli utenti seguiti in automatico:"
auto_follow_back: "Segui automaticamente chi inizia a seguirti"
change: "Cambia"
@@ -1118,42 +1120,40 @@ it:
close_account:
dont_go: "Dai, non te ne andare!"
if_you_want_this: "Se vuoi davvero farlo, scrivi la tua password e clicca sul bottone 'Chiudi l'account'"
- lock_username: "Questa operazione bloccherà il tuo nome utente, nel caso che tu volessi iscriverti nuovamente non potrai usarlo."
- locked_out: "Sarai disconnesso e non potrai più accedere al tuo account."
- make_diaspora_better: "Vorremmo che tu ci aiutassi a migliorare Diaspora, considera che puoi darci una mano invece di andare via. Se sei davvero convinto, vogliamo che tu sappia come funzionerà la rimozione del tuo account."
+ lock_username: "Il tuo nome utente verrà bloccato. Non potrai creare un nuovo account su questo pod con lo stesso ID."
+ locked_out: "Sarai disconnesso e non potrai più accedere al tuo account fino a che non è stato eliminato."
+ make_diaspora_better: "Vorremmo che tu ci aiutassi a migliorare diaspora*, considera che puoi darci una mano invece di andare via. Se sei davvero convinto, vogliamo che tu sappia come funzionerà la rimozione del tuo account."
mr_wiggles: "Il Fantasma Formaggino ti perseguiterà perché te ne vai!"
- no_turning_back: "Al momento, non è possibile tornare indietro."
- what_we_delete: "Cancelleremo tutti i tuoi post e i dati del profilo nel tempo più breve possibile. I commenti che hai lasciato rimarranno abbinati al tuo ID Diaspora."
+ no_turning_back: "Al momento, non è possibile tornare indietro! Se sei veramente sicuro allora inserisci la tua password qui sotto."
+ what_we_delete: "Cancelleremo tutti i tuoi post e i dati del profilo nel tempo più breve possibile. I commenti che hai lasciato su post di altre persone rimarranno visibili ma verranno associati al tuo ID di diaspora* al posto che al tuo nome."
close_account_text: "Chiudi l'account"
- comment_on_post: "...qualcuno commenta un tuo post?"
+ comment_on_post: "qualcuno commenta un tuo post"
current_password: "Password attuale"
current_password_expl: "quella con cui accedi..."
download_photos: "scarica le mie foto"
- download_xml: "scarica il mio xml"
edit_account: "Modifica account"
email_awaiting_confirmation: "Il link di attivazione è stato spedito a %{unconfirmed_email}. Continueremo ad usare la tua email originale %{email} finché non cliccherai sul link e attiverai il nuovo indirizzo."
- export_data: "Esporta Dati"
+ export_data: "Esporta dati"
following: "Impostazioni dei contatti"
getting_started: "Preferenze nuovo utente"
- liked: "...a qualcuno piace un tuo post?"
- mentioned: "...sei menzionato in un post?"
+ liked: "a qualcuno piace un tuo post"
+ mentioned: "sei menzionato in un post"
new_password: "Nuova password"
- photo_export_unavailable: "Al momento l'esportazione delle foto non è disponibile "
- private_message: "...hai ricevuto un messaggio privato?"
- receive_email_notifications: "Ricevi notifiche via email quando..."
- reshared: "...qualcuno condivide un tuo post?"
- show_community_spotlight: "Vuoi vedere nel tuo Stream anche gli utenti in evidenza?"
- show_getting_started: "Riattiva la Guida iniziale"
- started_sharing: "...qualcuno vuole condividere con te?"
- stream_preferences: "Preferenze dello Stream"
+ private_message: "hai ricevuto un messaggio privato"
+ receive_email_notifications: "Ricevi notifiche via email quando:"
+ reshared: "qualcuno ha condiviso un tuo post"
+ show_community_spotlight: "Mostra nel tuo stream anche gli utenti in evidenza"
+ show_getting_started: "Mostra la guida iniziale"
+ started_sharing: "qualcuno ha iniziato a seguirti"
+ stream_preferences: "Preferenze dello stream"
your_email: "La tua email"
your_handle: "Il tuo ID"
getting_started:
awesome_take_me_to_diaspora: "Fantastico! Fammi entrare in Diaspora*"
- community_welcome: "La comunità di Diaspora ti dà il benvenuto a bordo!"
- connect_to_facebook: "Possiamo rendere le cose veloci %{link} a Diaspora. Così caricherai il nome e la tua foto, oltre che abilitare la condivisione dei post."
+ community_welcome: "La comunità di diaspora* ti dà il benvenuto a bordo!"
+ connect_to_facebook: "Possiamo rendere le cose veloci con %{link} a diaspora*. Così caricherai il nome e la tua foto, oltre che abilitare la condivisione dei post."
connect_to_facebook_link: "collegando il tuo account Facebook"
- hashtag_explanation: "I tag ti permettono di parlare dei tuoi interessi e di seguirli. Sono anche un ottimo sistema per trovare nuove persone su Diaspora."
+ hashtag_explanation: "Gli hashtags ti permettono di parlare dei tuoi interessi e di seguirli. Sono anche un ottimo sistema per trovare nuove persone su diaspora*."
hashtag_suggestions: "Prova a seguire tag tipo #art, #movies, #gif, ecc."
saved: "Salvato!"
well_hello_there: "Ciao!"
diff --git a/config/locales/diaspora/ja.yml b/config/locales/diaspora/ja.yml
index 7a1e04dd4..35b64ed3b 100644
--- a/config/locales/diaspora/ja.yml
+++ b/config/locales/diaspora/ja.yml
@@ -66,8 +66,6 @@ ja:
add_to_aspect:
failure: "連絡先をアスペクトに追加するのに失敗しました。"
success: "連絡先をアスペクトに追加するのに成功しました。"
- aspect_contacts:
- done_editing: "編集完了"
aspect_listings:
add_an_aspect: "アスペクトを追加する"
deselect_all: "すべて選択解除"
@@ -85,21 +83,14 @@ ja:
failure: "%{name}に連絡先が残っているので削除できません。"
success: "%{name}さんを除外するのに成功しました。"
edit:
- add_existing: "既存の連絡先を追加する"
aspect_list_is_not_visible: "このアスペクトのメンバー一覧はメンバーへ公開されていません"
aspect_list_is_visible: "このアスペクトのメンバー一覧はメンバーに公開されています"
confirm_remove_aspect: "このアスペクトを本当に削除していいですか。"
- done: "完了"
make_aspect_list_visible: "アスペクトのメンバー一覧を公開しますか。"
remove_aspect: "このアスペクトを削除する"
rename: "名前の変更"
update: "更新"
updating: "更新中"
- few: "アスペクト%{count}集"
- helper:
- are_you_sure: "本当にこのアスペクトを削除しますか。"
- aspect_not_empty: "アスペクトは空ではありません。"
- remove: "削除"
index:
diaspora_id:
content_1: "あなたのダイアスポラIDは:"
@@ -118,6 +109,7 @@ ja:
tag_bug: "#bug"
tag_feature: "#feature"
tag_question: "#question"
+ tutorial_link_text: "チュートリアル"
introduce_yourself: "これがあなたのストリームです。 飛び込んで自己紹介をしてみましょう。"
new_here:
follow: "%{link}をフォローしてダイアスポラ*の新しいユーザーを歓迎しましょう!"
@@ -132,11 +124,6 @@ ja:
heading: "外部サービス連携"
unfollow_tag: "#%{tag} のフォローを中止する"
welcome_to_diaspora: "%{name}さん、ダイアスポラへようこそ!"
- many: "アスペクト%{count}集"
- move_contact:
- error: "連絡先の移動にエラーが発生しました: %{inspect}"
- failure: "連絡先を移動させるのに失敗しました:%{inspect}"
- success: "連絡先を新しいアスペクトに移動させました。"
new:
create: "新規作成"
name: "Name"
@@ -154,14 +141,6 @@ ja:
family: "家族"
friends: "友達"
work: "仕事"
- selected_contacts:
- manage_your_aspects: "アスペクトを管理する"
- no_contacts: "ここにはまだ連絡先がありません。"
- view_all_community_spotlight: "すべてのコミュニティスポットライトを見る"
- view_all_contacts: "すべての連絡先を見る"
- show:
- edit_aspect: "アスペクトを編集する"
- two: "%{count} aspects"
update:
failure: "アスペクト名「%{name}」は長すぎて保存できませんでした。"
success: "アスペクト「%{name}」の編集に成功しました。"
@@ -179,50 +158,38 @@ ja:
post_success: "投稿完了!ウィンドウを閉じます。"
cancel: "取り消す"
comments:
- few: "コメント%{count}件"
- many: "コメント%{count}件"
new_comment:
comment: "コメント"
commenting: "コメント投稿中…"
one: "コメント1件"
other: "コメント%{count}件"
- two: "コメント%{count}件"
zero: "コメントがありません"
contacts:
create:
failure: "連絡先の作成に失敗しました。"
- few: "連絡先%{count}件"
index:
add_a_new_aspect: "新しいアスペクトを追加する"
add_to_aspect: "Add contacts to %{name}"
- add_to_aspect_link: "%{name}さんを連絡先に追加する"
all_contacts: "すべての連絡先"
community_spotlight: "コミュニティスポットライト"
- many_people_are_you_sure: "本当に%{suggested_limit}以上の連絡先と非公開の会話を開始しますか? このアスペクトに投稿する方が、彼らと連絡を取るより良い方法かもしれません。"
my_contacts: "私の連絡先"
no_contacts: "No contacts."
no_contacts_message: "%{community_spotlight}をチェックアウトする"
- no_contacts_message_with_aspect: "%{community_spotlight}または%{add_to_aspect_link}をチェックアウトする"
only_sharing_with_me: "自分だけに共有する"
- remove_person_from_aspect: "%{person_name}さんを%{aspect_name}から削除する"
start_a_conversation: "会話を開始する"
title: "連絡先"
your_contacts: "あなたの連絡先"
- many: "連絡先%{count}件"
one: "連絡先1件"
other: "連絡先%{count}件"
sharing:
people_sharing: "あなたに共有している人たち:"
spotlight:
community_spotlight: "コミュニティスポットライト"
- two: "連絡先%{count}件"
zero: "連絡先無し"
conversations:
create:
fail: "無効なメッセージです。"
sent: "メッセージを送信しました"
- destroy:
- success: "会話を削除するのに成功しました。"
helper:
new_messages:
few: "新着メッセージ%{count}通"
@@ -262,6 +229,11 @@ ja:
post_not_public: "閲覧しようとした投稿は公開されていません!"
fill_me_out: "記入して"
find_people: "Find people"
+ help:
+ irc: "IRC"
+ markdown: "マークダウン"
+ tutorial: "チュートリアル"
+ wiki: "wiki"
hide: "隠す"
invitations:
a_facebook_user: "Facebookユーザー"
@@ -480,7 +452,6 @@ ja:
add_contact_from_tag: "タグより連絡先を追加する"
aspect_list:
edit_membership: "アスペクト所属を編集する"
- few: "%{count}人の連絡先"
helper:
is_sharing: "%{name}さんがあなたに共有しています"
results_for: "%{params}の検索結果"
@@ -490,7 +461,6 @@ ja:
no_results: "何かを検索しないといけません。"
results_for: "検索結果:"
searching: "検索中です。もうしばらくお待ちください..."
- many: "%{count}人の連絡先"
one: "1人の連絡先"
other: "%{count}人の連絡先"
person:
@@ -525,7 +495,6 @@ ja:
sub_header:
edit: "編集"
you_have_no_tags: "タグがありません"
- two: "%{count} people"
webfinger:
fail: "%{handle}が見つかりませんでした。"
zero: "連絡先無し"
@@ -622,7 +591,6 @@ ja:
unhappy: "何かご不満ですか。"
update: "更新"
new:
- continue: "続ける"
create_my_account: "Create my account"
email: "メール"
enter_email: "メールアドレスを入力してください。"
@@ -743,6 +711,7 @@ ja:
all: "すべて"
all_contacts: "全ての連絡先"
discard_post: "投稿を破棄する"
+ get_location: "位置情報を取得する"
make_public: "公開にする"
new_user_prefill:
hello: "こんにちはみなさん。私は%{new_user_tag}です。 "
@@ -762,6 +731,7 @@ ja:
hide_and_mute: "Hide and Mute"
ignore_user: "%{name}さんを無視する"
like: "これ好き!"
+ show: "表示"
unlike: "これ好き!を取り消す"
via: "via %{link}"
viewable_to_anyone: "この投稿はウェブ上の誰からでも見ることができます。"
@@ -774,13 +744,7 @@ ja:
no_message_to_display: "表示するメッセージがありません。"
new:
mentioning: "%{person}さんのメンション"
- too_long:
- few: "please make your status messages less than %{count} characters"
- many: "please make your status messages less than %{count} characters"
- one: "please make your status messages less than %{count} character"
- other: "please make your status messages less than %{count} characters"
- two: "please make your status messages less than %{count} characters"
- zero: "please make your status messages less than %{count} characters"
+ too_long: "{\"few\"=>\"please make your status messages less than %{count} characters\", \"many\"=>\"please make your status messages less than %{count} characters\", \"one\"=>\"please make your status messages less than %{count} character\", \"other\"=>\"please make your status messages less than %{count} characters\", \"two\"=>\"please make your status messages less than %{count} characters\", \"zero\"=>\"please make your status messages less than %{count} characters\"}"
stream_helper:
hide_comments: "コメントを非表示にする"
show_comments:
@@ -818,10 +782,7 @@ ja:
show:
follow: "#%{tag}をフォローする"
following: "#%{tag}をフォロー中"
- nobody_talking: "%{tag}についての投稿はまだありません。"
none: "空のタグは存在しません!"
- people_tagged_with: "%{tag}とタグ付けられている人々"
- posts_tagged_with: "#%{tag}とタグ付けられている投稿"
stop_following: "#%{tag}のフォローを中止する"
terms_and_conditions: "利用規約"
undo: "元に戻す"
@@ -831,7 +792,9 @@ ja:
email_confirmed: "E-Mail %{email} activated"
email_not_confirmed: "E-Mail could not be activated. Wrong link?"
destroy:
+ no_password: "アカウントの使用を停止するためにパスワードを入力してください。"
success: "アカウントはロックされました。 アカウントを削除するには20分程度かかります。 ダイアスポラをお試しいただきありがとうございます。"
+ wrong_password: "パスワードが一致しません。"
edit:
also_commented: "他の人も連絡先の投稿にコメントしたとき"
auto_follow_back: "Automatically follow back if a someone follows you"
@@ -841,12 +804,12 @@ ja:
change_password: "パスワード変更"
character_minimum_expl: "少なくとも6字以上でなければいけません。"
close_account:
+ lock_username: "ユーザー名はロックされます。このポッド上で、同じIDのアカウントを作ることはできません。"
what_we_delete: "We delete all of your posts, profile data, as soon as humanly possible. Your comments will hang around, but be associated with your Diaspora Handle."
close_account_text: "アカウントを削除する"
comment_on_post: "自分の投稿にコメントがあったとき"
current_password: "現在のパスワード"
download_photos: "写真をダウンロードする"
- download_xml: "XMLをダウンロードする"
edit_account: "アカウント編集"
email_awaiting_confirmation: "We have sent you an activation link to %{unconfirmed_email}. Till you follow this link and activate the new address, we will continue to use your original address %{email}."
export_data: "データ出力"
diff --git a/config/locales/diaspora/ka.yml b/config/locales/diaspora/ka.yml
index 06429357e..9a464a641 100644
--- a/config/locales/diaspora/ka.yml
+++ b/config/locales/diaspora/ka.yml
@@ -62,8 +62,6 @@ ka:
add_to_aspect:
failure: "კონტაქტის ასპექტში დამატება ჩაიშალა."
success: "კონტაქტი წარმატებით დაემატა ასპექტში."
- aspect_contacts:
- done_editing: "რედაქტირების დასრულება"
aspect_listings:
add_an_aspect: "+ ასპექტის დამატება"
deselect_all: "ყველა მონიშვნის მოხსნა"
@@ -81,21 +79,14 @@ ka:
failure: "%{name} ცარიელი არ არის და მას ვერ წაშლით."
success: "%{name} წარმატებით წაიშალა."
edit:
- add_existing: "არსებული კონტაქტის დამატება"
aspect_list_is_not_visible: "ასპექტის სია დამალულია ამ ასპექტში მყოფთათვის."
aspect_list_is_visible: "ასპექტის სია ხილულია ამ ასპექტში მყოფთათვის"
confirm_remove_aspect: "დარწმუნებული ხართ რომ ამ ასპექტის წაშლა გსურთ?"
- done: "დასრულება"
make_aspect_list_visible: "გახდნენ ამ ასპექტში არსებული კონტაქტები ერთმანეთისთვის ხილულნი?"
remove_aspect: "ამ ასპექტის წაშლა"
rename: "გადარქმევა"
update: "განახლება"
updating: "ნახლდება"
- few: "%{count} aspects"
- helper:
- are_you_sure: "დარწმუნებული ხართ რომ ამ ასპექტის წაშლა გსურთ?"
- aspect_not_empty: "ასპექტი არ არის ცარიელი"
- remove: "წაშლა"
index:
diaspora_id:
content_1: "თქვენი Diaspora-ს ID არის:"
@@ -128,11 +119,6 @@ ka:
content: "დიასპორაში შეგიძლია დაუკავშირდე შემდეგ სერვისებს:"
heading: "სერვისებთან დაკავშირება"
unfollow_tag: "შეწყვიტე გაყოლა #%{tag}"
- many: "%{count} ასპექტი"
- move_contact:
- error: "კონტაქტის გადაყვანისას დაფიქსირდა შეცდომა: %{inspect}"
- failure: "არ მუშაობს %{inspect}"
- success: "პერსონა გადაყვანილია ახალ ასპექტში"
new:
create: "შექმნა"
name: "სახელი (ხედავთ მხოლოდ თქვენ)"
@@ -150,14 +136,6 @@ ka:
family: "ოჯახი"
friends: "მეგობრები"
work: "სამსახური"
- selected_contacts:
- manage_your_aspects: "თქვენი ასპექტების მართვა."
- no_contacts: "თქვენ ჯერ არცერთი კონტაქტი არ გყავთ."
- view_all_community_spotlight: "ყველა რეკომენდაციის ნახვა"
- view_all_contacts: "ყველა კონტაქტის ნახვა"
- show:
- edit_aspect: "ასპექტის რედაქტირება"
- two: "%{count} ასპექტი"
update:
failure: "თქვენს ასპექტს, %{name}, აქვს ძალიან დიდი სახელი და არ შეიძლება მისი შენახვა"
success: "თქვენი ასპექტი, %{name}, წარმატებით დარედაქტირდა."
@@ -173,48 +151,36 @@ ka:
post_success: "გამოქვეყნდა! იხურება!"
cancel: "გაუქმება"
comments:
- few: "%{count} კომენტარი"
- many: "%{count} კომენტარი"
new_comment:
comment: "კომენტარი"
one: "1 კომენტარი"
other: "%{count} კომენტარი"
- two: "%{count} კომენტარი"
zero: "კომენტარები არ არის"
contacts:
create:
failure: "კომენატარის შექმნა ვერ მოხერხდა"
- few: "%{count} კონტაქტი"
index:
add_a_new_aspect: "დაამატე ახალი ასპექტი"
add_to_aspect: "%{name} დაამატე კონტაქტებში"
- add_to_aspect_link: "დაამატე კონტაქტებში %{name}"
all_contacts: "ყველა კონტაქტი"
- many_people_are_you_sure: "დარწმუნებული ხართ რომ გინდათ პირადი საუბრის დაწყება %{suggested_limit} კონტაქტთან? ამ ასპექტში დაპოსტვა უფრო კარგი საშუალებაა მათთან დასაკავშირებლად."
my_contacts: "ჩემი კონტაქტები"
no_contacts: "მგონი კიდევ რამოდენიმე კონტაქტის დამატება გჭირდება"
no_contacts_message: "ნახე %{community_spotlight}"
- no_contacts_message_with_aspect: "ნახე %{community_spotlight} ან %{add_to_aspect_link}"
only_sharing_with_me: "აზიარებს მხოლოდ ჩემთან"
- remove_person_from_aspect: "ამოშლა %{person_name} \"%{aspect_name}\"-დან"
start_a_conversation: "დაიწყე საუბარი"
title: "კონტაქტები"
your_contacts: "შენი კონტაქტები"
- many: "%{count} კონტაქტი"
one: "1 კონტაქტი"
other: "%{count} კონტაქტი"
sharing:
people_sharing: "ხალხი, რომელიც აზიარებს შენთან:"
spotlight:
community_spotlight: "Community Spotlight"
- two: "%{count} კონტაქტი"
zero: "კონტაქტები"
conversations:
create:
fail: "არასწორი წერილი"
sent: "წერილი გაგზავნილია"
- destroy:
- success: "დიალოგი წარმატებით წაიშალა"
helper:
new_messages:
few: "%{count} new messages"
@@ -456,7 +422,6 @@ ka:
add_contact_from_tag: "დაამატე კონტაქტი თაგიდან"
aspect_list:
edit_membership: "edit aspect membership"
- few: "%{count} ადამიანს"
helper:
results_for: " რეზულტატი %{params}-სთვის"
index:
@@ -464,7 +429,6 @@ ka:
no_one_found: "...და ვერავინ ვერ მოიძებნა."
no_results: "რამე უნდა მოძებნო!"
results_for: "მოძებნე რეზულტატები"
- many: "%{count} ადამიანს"
one: "1 პერსონა"
other: "%{count} ადამიანს"
person:
@@ -500,7 +464,6 @@ ka:
add_some: "დაამატე"
edit: "რედაქტირება"
you_have_no_tags: "შენ არ გაქვს თაგები!"
- two: "%{count}"
webfinger:
fail: "ბოდიში, ვერ ვიპოვეთ %{handle}."
zero: "არ არის ხალხი"
@@ -753,13 +716,7 @@ ka:
no_message_to_display: "არ არის მესიჯები."
new:
mentioning: "Mentioning: %{person}"
- too_long:
- few: "please make your status messages less than %{count} characters"
- many: "please make your status messages less than %{count} characters"
- one: "please make your status messages less than %{count} character"
- other: "please make your status messages less than %{count} characters"
- two: "please make your status messages less than %{count} characters"
- zero: "please make your status messages less than %{count} characters"
+ too_long: "{\"few\"=>\"please make your status messages less than %{count} characters\", \"many\"=>\"please make your status messages less than %{count} characters\", \"one\"=>\"please make your status messages less than %{count} character\", \"other\"=>\"please make your status messages less than %{count} characters\", \"two\"=>\"please make your status messages less than %{count} characters\", \"zero\"=>\"please make your status messages less than %{count} characters\"}"
stream_helper:
hide_comments: "დამალე ყველა კომენატარი"
show_comments:
diff --git a/config/locales/diaspora/kk.yml b/config/locales/diaspora/kk.yml
index 408c9d918..8987b1e02 100644
--- a/config/locales/diaspora/kk.yml
+++ b/config/locales/diaspora/kk.yml
@@ -5,21 +5,75 @@
kk:
+ _comments: "Түсініктемелер"
+ _contacts: "Байланыстар"
_home: "Үйге"
_photos: "Суреттер"
+ _services: "Қызмет атқарулар"
+ _statistics: "Статистикасы"
+ account: "Есепшот"
are_you_sure: "Сенімдісіз бе?"
aspects:
+ aspect_listings:
+ select_all: "Барлықты таңдап ал"
edit:
- done: "Аяқталды"
rename: "Атын өзгерту"
+ update: "жаңала"
+ updating: "жаңала"
+ index:
+ help:
+ tag_bug: "қате"
+ tag_question: "сұрақ"
+ new:
+ create: "жасау"
+ one: "1 аспектісі"
+ seed:
+ family: "Жанұя"
+ friends: "достар"
+ work: "жұмыс"
back: "Артқа"
+ comments:
+ new_comment:
+ comment: "түсініктеме"
+ one: "1 түсініктеме"
+ zero: "түсініктемелер жоқ"
+ conversations:
+ new:
+ subject: "тақырып"
+ to: "үшін"
delete: "Өшіру"
+ invitations:
+ new:
+ aspect: "Аспектісі"
+ language: "тіл"
+ to: "Үшін"
+ limited: "Шектеулі"
+ more: "Көбірек"
next: "Келесі"
no_results: "Нәтижелер табылмады"
+ notifications:
+ index:
+ no_notifications: "Сізде әлі ешқандай хабарландыруларды жоқ."
+ ok: "ЖАҚСЫ"
or: "немесе"
password: "Құпиясөз"
previous: "Алдыңғы"
+ public: "Қоғамдық"
search: "Іздеу"
settings: "Құрал саймандар"
+ shared:
+ aspect_dropdown:
+ mobile_row_checked: "%{name}(жою)"
+ mobile_row_unchecked: "%{name} (үстеу)"
+ statistics:
+ closed: "Жабық"
+ enabled: "Жетімді"
+ name: "Аты"
+ network: "Желі"
+ open: "Ашық"
+ services: "Қызмет атқарулар"
+ total_users: "Жалпы пайдаланушылар"
+ version: "Нұсқа"
+ terms_and_conditions: "Шарт және шарттар"
username: "Қолданушының аты"
welcome: "Қош келдіңіз!" \ No newline at end of file
diff --git a/config/locales/diaspora/kn.yml b/config/locales/diaspora/kn.yml
index 2162163ae..ae7f35c0e 100644
--- a/config/locales/diaspora/kn.yml
+++ b/config/locales/diaspora/kn.yml
@@ -45,7 +45,9 @@ kn:
nsfw: "ಎನ್ ಎಸ್ ಎಫ್ ಡಬೣಯೂ"
ok: "ಒಪ್ಪಿಗೆ"
or: "ಅಥವಾ"
- password: "ಸಂಜ್ಞೆ"
+ password: |-
+
+ ಸಂಜ್ಞೆ
password_confirmation: "ಸಂಜ್ಞೆ ದೃಢೀಕರಣ"
previous: "ಹಿಂದಿನ"
privacy: "ಖಾಸಗಿತನ"
diff --git a/config/locales/diaspora/ko.yml b/config/locales/diaspora/ko.yml
index 3d116d3a9..14d38167e 100644
--- a/config/locales/diaspora/ko.yml
+++ b/config/locales/diaspora/ko.yml
@@ -82,7 +82,8 @@ ko:
users:
other: "%{count}명의 사용자를 찾았습니다"
zero: "%{count}명의 사용자를 찾았습니다"
- you_currently: "현재 %{user_invitation} 초대가 남았습니다 %{link}"
+ you_currently:
+ other: "현재 %{user_invitation} 초대가 남았습니다 %{link}"
weekly_user_stats:
amount_of:
other: "이번 주 새 사용자 수: %{count}"
@@ -106,8 +107,6 @@ ko:
add_to_aspect:
failure: "컨택을 애스펙에 추가하는데 실패했습니다."
success: "컨택을 애스펙에 성공적으로 추가했습니다."
- aspect_contacts:
- done_editing: "고치기 완료"
aspect_listings:
add_an_aspect: "+ 애스펙 추가"
deselect_all: "선택 해제"
@@ -126,22 +125,14 @@ ko:
failure: "%{name} 애스펙이 비어있지 않아 지울 수 없습니다."
success: "%{name} 애스펙을 성공적으로 지웠습니다."
edit:
- add_existing: "있는 컨택 추가"
aspect_list_is_not_visible: "애스펙의 다른 사람들에게 애스펙 목록을 숨깁니다."
aspect_list_is_visible: "애스펙의 다른 사람들에게 애스펙 목록을 보입니다."
confirm_remove_aspect: "이 애스펙을 지우려는게 확실합니까?"
- done: "완료"
make_aspect_list_visible: "이 애스펙의 컨택이 서로 볼 수 있게 할까요?"
- manage: "관리"
remove_aspect: "이 애스펙 지우기"
rename: "이름 바꾸기"
update: "갱신"
updating: "갱신중"
- few: "애스펙 %{count}개"
- helper:
- are_you_sure: "이 애스펙을 지우려는게 확실합니까?"
- aspect_not_empty: "애스펙이 비어있지 않습니다"
- remove: "지우기"
index:
diaspora_id:
content_1: "내 디아스포라 아이디:"
@@ -181,11 +172,6 @@ ko:
heading: "서비스를 연결하세요"
unfollow_tag: "#%{tag} 태그 팔로우 멈추기"
welcome_to_diaspora: "%{name}님, 디아스포라에 오신걸 환영합니다!"
- many: "애스펙 %{count}개"
- move_contact:
- error: "컨택 옮기기 오류: %{inspect}"
- failure: "%{inspect} 작동 안 함"
- success: "사람이새 애스펙으로 옮겨졌습니다"
new:
create: "만들기"
name: "이름(나만 볼 수 있습니다)"
@@ -203,14 +189,6 @@ ko:
family: "가족"
friends: "친구"
work: "직장"
- selected_contacts:
- manage_your_aspects: "내 애스펙 관리하기."
- no_contacts: "아직 여기에 아무 컨택도 없습니다."
- view_all_community_spotlight: "커뮤니티 스포트라이트 모두 보기"
- view_all_contacts: "모든 컨택 보기"
- show:
- edit_aspect: "애스펙 고치기"
- two: "애스펙 %{count}개"
update:
failure: "%{name} 애스펙은 이름이 너무 길어 저장할 수 없습니다."
success: "%{name} 애스펙을 성공적으로 고쳤습니다."
@@ -229,36 +207,27 @@ ko:
post_success: "올렸습니다! 닫힙니다!"
cancel: "취소"
comments:
- few: "댓글 %{count}개"
- many: "댓글 %{count}개"
new_comment:
comment: "댓글 달기"
commenting: "댓글 다는 중···"
one: "댓글 한 개"
other: "댓글 %{count}개"
- two: "댓글 %{count}개"
zero: "댓글 없음"
contacts:
create:
failure: "컨택을 만들 수 없습니다"
- few: "컨택 %{count}명"
index:
add_a_new_aspect: "새 애스펙 추가"
add_to_aspect: "%{name} 애스펙에 컨택 추가"
- add_to_aspect_link: "%{name} 애스펙으로 추가하세요"
all_contacts: "모든 컨택"
community_spotlight: "커뮤니티 스포트라이트"
- many_people_are_you_sure: "컨택 %{suggested_limit}명보다 많은 사람들에게 쪽지를 보내려 하십니까? 해당 애스펙에 게시물을 공유하길 권합니다."
my_contacts: "내 컨택"
no_contacts: "컨택을 좀 추가하는게 어때요?"
no_contacts_message: "%{community_spotlight}를 확인하세요"
- no_contacts_message_with_aspect: "%{community_spotlight}를 확인하거나 %{add_to_aspect_link}"
only_sharing_with_me: "나와만 공유하고 있는 사람들"
- remove_person_from_aspect: "\"%{aspect_name} 애스펙에서 %{person_name}님 지우기"
start_a_conversation: "대화를 시작하세요"
title: "컨택"
your_contacts: "내 컨택"
- many: "컨택 %{count}명"
one: "컨택 한 명"
other: "컨택 %{count}명"
sharing:
@@ -266,7 +235,6 @@ ko:
spotlight:
community_spotlight: "커뮤니티 스포트라이트"
suggest_member: "회원 제안"
- two: "컨택 %{count}명"
zero: "컨택"
conversations:
conversation:
@@ -275,8 +243,6 @@ ko:
fail: "유효하지 않은 쪽지"
no_contact: "컨택부터 추가하세요!"
sent: "쪽지를 보냈습니다"
- destroy:
- success: "대화를 성공적으로 지웠습니다"
helper:
new_messages:
few: "새 쪽지 %{count}개"
@@ -344,6 +310,7 @@ ko:
title: "공유"
tags:
title: "태그"
+ tutorial: "따라하기"
tutorials: "간단 설명서"
wiki: "위키"
hide: "숨기기"
@@ -557,7 +524,6 @@ ko:
add_contact_from_tag: "태그에서 컨택 추가"
aspect_list:
edit_membership: "속한 애스펙 고치기"
- few: "%{count}명"
helper:
results_for: "%{params} 결과"
index:
@@ -566,7 +532,6 @@ ko:
no_results: "검색 결과가 없습니다"
results_for: "검색 결과:"
searching: "검색중입니다, 잠시만 기다려주십시오···"
- many: "%{count}명"
one: "한 명"
other: "%{count}명"
person:
@@ -603,7 +568,6 @@ ko:
add_some: "추가하기"
edit: "고치기"
you_have_no_tags: "태그가 없습니다!"
- two: "%{count}명"
webfinger:
fail: "%{handle} 핸들을 찾을 수 없습니다."
zero: "없음"
@@ -701,15 +665,12 @@ ko:
update: "갱신하기"
invalid_invite: "내가 제공한 초대 링크가 더 이상 유효하지 않습니다!"
new:
- continue: "계속"
create_my_account: "내 계정 만들기!"
- diaspora: "♥ 디아스포라*"
email: "이메일"
enter_email: "이메일 주소를 입력하세요"
enter_password: "암호를 입력하세요 (최소 여섯 자)"
enter_password_again: "암호를 다시 입력하세요"
enter_username: "사용자 이름을 고르세요 (로마자, 아라비아 숫자, 밑줄 문자_ 만)"
- hey_make: "자,<br/>뭔가<br/>만들어보세요."
join_the_movement: "합류하세요!"
password: "암호"
password_confirmation: "암호 확인"
@@ -885,9 +846,7 @@ ko:
no_message_to_display: "표시할 게시물이 없습니다."
new:
mentioning: "%{person}님을 멘션합니다"
- too_long:
- other: "상태 메시지를 %{count}자보다 적게 줄여주세요"
- zero: "상태 메시지를 %{count}자보다 적게 줄여주세요"
+ too_long: "{\"other\"=>\"상태 메시지를 %{count}자보다 적게 줄여주세요\", \"zero\"=>\"상태 메시지를 %{count}자보다 적게 줄여주세요\"}"
stream_helper:
hide_comments: "모든 댓글 숨기기"
show_comments:
@@ -928,7 +887,6 @@ ko:
title: "공개 활동"
tags:
contacts_title: "이 태그를 파고있는 사람들"
- tag_prefill_text: "%{tag_name} 태그를 달고 공유하세요!"
title: "태그: %{tags}"
tag_followings:
create:
@@ -942,10 +900,7 @@ ko:
show:
follow: "#%{tag} 태그 팔로우하기"
following: "#%{tag} 태그 팔로우중"
- nobody_talking: "아직 %{tag} 태그가 달린 게시물이 없습니다."
none: "빈 태그는 존재하지 않습니다!"
- people_tagged_with: "%{tag} 태그가 달린 사람들"
- posts_tagged_with: "#%{tag} 태그가 달린 게시물"
stop_following: "#%{tag} 태그 팔로우 멈추기"
terms_and_conditions: "이용약관"
undo: "돌이키겠습니까?"
@@ -981,7 +936,6 @@ ko:
current_password: "원래 암호"
current_password_expl: "로그인할 때 썼던 암호"
download_photos: "내 사진 다운로드"
- download_xml: "내 xml 다운로드"
edit_account: "계정 고치기"
email_awaiting_confirmation: "%{unconfirmed_email} 로 활성화 링크를 보냈습니다. 이 링크를 따라 새 주소를 활성화하기 전까지는 원래 이메일 주소 %{email} 를 사용합니다."
export_data: "자료 뽑아내기"
@@ -990,7 +944,6 @@ ko:
liked: "누군가가 내 게시물을 좋아할 때"
mentioned: "내가 멘션되었을 때"
new_password: "새 암호"
- photo_export_unavailable: "지금은 사진을 뽑아낼 수 없습니다"
private_message: "쪽지를 받았을 때"
receive_email_notifications: "이럴 때 이메일 알림을 받겠습니다"
reshared: "누군가 내 게시물을 재공유할 때"
diff --git a/config/locales/diaspora/lt.yml b/config/locales/diaspora/lt.yml
index 1fa7387b5..00fd1e119 100644
--- a/config/locales/diaspora/lt.yml
+++ b/config/locales/diaspora/lt.yml
@@ -58,8 +58,6 @@ lt:
add_to_aspect:
failure: "Nepavyko priskirti kontakto kategorijai."
success: "Kontaktas sėkmingai priskirtas kategorijai."
- aspect_contacts:
- done_editing: "Pakeista"
aspect_listings:
add_an_aspect: "Pridėti kategoriją"
deselect_all: "Nepasirinkti nieko"
@@ -77,21 +75,14 @@ lt:
failure: "%{name} negali būti pašalintas, nes nėra tuščias."
success: "%{name} sėkmingai pašalintas."
edit:
- add_existing: "Pridėti egzistuojantį kontaktą"
aspect_list_is_not_visible: "Kategorijų sąrašo nemato kiti esantys šioje kategorijoje"
aspect_list_is_visible: "Kategorijų sąrašas matomas kietiems esantiems šioje kategorijoje"
confirm_remove_aspect: "Ar tikrai norite ištrinti šią kategoriją?"
- done: "Atlikta"
make_aspect_list_visible: "Ar leisti šios kategorijos kontaktams matyti vienas kitą?"
remove_aspect: "Ištrinti kategoriją"
rename: "Pervardinti"
update: "Atnaujinti"
updating: "Atnaujinama..."
- few: "%{count} kategorijų"
- helper:
- are_you_sure: "Ar tikrai norite ištrinti šią kategoriją?"
- aspect_not_empty: "Kategorijoje nėra kontaktų"
- remove: "šalinti"
index:
diaspora_id:
content_1: "Jūsų unikalus Diaspora ID:"
@@ -124,11 +115,6 @@ lt:
heading: "Prijungti paslaugas"
unfollow_tag: "Sustabdyti sekimą #%{tag}"
welcome_to_diaspora: "Sveiki atvykę į tinklapį Diaspora, %{name}!"
- many: "%{count} kategorijų"
- move_contact:
- error: "Klaida perkeliant kontaktą: %{inspect}"
- failure: "Nepavyko %{inspect}"
- success: "Kontaktas perkeltas į kitą kategoriją"
new:
create: "Sukurti"
name: "Vardas (matomas tik Jums)"
@@ -146,14 +132,6 @@ lt:
family: "Šeima"
friends: "Draugai"
work: "Darbas"
- selected_contacts:
- manage_your_aspects: "Tvarkyti savo kategorijas."
- no_contacts: "Kol kas neturite nei vieno kontakto."
- view_all_community_spotlight: "Matyti viską kas yra bendruomenės dėmesio centre"
- view_all_contacts: "Rodyti visus kontaktus"
- show:
- edit_aspect: "Keisti kategoriją"
- two: "%{count} kategorijos"
update:
failure: "Kategorijos %{name} pavadinimas yra per ilgas."
success: "Kategorija %{name} sėkmingai pakeista."
@@ -166,50 +144,38 @@ lt:
post_success: "Įrašas išsiųstas!"
cancel: "Atšaukti"
comments:
- few: "%{count} komentarų"
- many: "%{count} komentarų"
new_comment:
comment: "Komentuoti"
commenting: "Siunčiamas komentaras..."
one: "1 komentaras"
other: "%{count} komentarų"
- two: "%{count} komentarai"
zero: "Komentarų nėra"
contacts:
create:
failure: "Nepavyko sukurti kontakto"
- few: "%{count} kontaktų"
index:
add_a_new_aspect: "Sukurti kategoriją"
add_to_aspect: "Pridėti kontaktus į kategoriją %{name}"
- add_to_aspect_link: "Pridėti kontaktus į kategoriją %{name}"
all_contacts: "Visi kontaktai"
community_spotlight: "Bendruomenės dėmesio centre"
- many_people_are_you_sure: "Ar tikrai norite pradėti privatų pokalbį su daugiau nei %{suggested_limit} kontaktų? Paskelbti įrašą šioje kategorijoje gali būti geresnis būdas."
my_contacts: "Mano kontaktai"
no_contacts: "Pridėkite daugiau kontaktų!"
no_contacts_message: "Peržiūrėti %{community_spotlight}"
- no_contacts_message_with_aspect: "Peržiūrėti %{community_spotlight} arba %{add_to_aspect_link}"
only_sharing_with_me: "Tik tie, kurie su manimi dalijasi"
- remove_person_from_aspect: "Ištrinti %{person_name} iš kategorijos \"%{aspect_name}\""
start_a_conversation: "Pradėti pokalbį"
title: "Kontaktai"
your_contacts: "Jūsų kontaktai"
- many: "%{count} kontaktų"
one: "1 kontaktas"
other: "%{count} kontaktų"
sharing:
people_sharing: "Žmonės dalijasi su jumis:"
spotlight:
community_spotlight: "Bendruomenės dėmesio centre"
- two: "%{count} kontaktai"
zero: "kontaktai"
conversations:
create:
fail: "Netinkamas pranešimas"
sent: "Pranešimas išsiųstas"
- destroy:
- success: "Pokalbis sėkmingai ištrintas"
helper:
new_messages:
few: "%{count} nauji pranešimai"
@@ -225,7 +191,6 @@ lt:
send: "Siųsti"
sending: "Siunčiama..."
subject: "Tema"
- to: ""
show:
delete: "Ištrinti ir užblokuoti pokalbį"
reply: "Atrašyti"
@@ -417,14 +382,12 @@ lt:
password: "Slaptažodis"
password_confirmation: "Slaptažodžio patvirtinimas"
people:
- few: "%{count} people"
helper:
results_for: " \"%{params}\" rezultatai"
index:
no_one_found: "... ir nieko nepavyko rasti."
no_results: "Labas! Nieko nerasta."
results_for: "ieškoti rezultatų pagal"
- many: "%{count} people"
one: "1 person"
other: "%{count} people"
person:
@@ -446,7 +409,6 @@ lt:
not_connected: "You are not connected with this person"
return_to_aspects: "Grįžti į aspektų puslapį"
to_accept_or_ignore: "priimti arba ignoruoti."
- two: "%{count} people"
zero: "no people"
photos:
destroy:
@@ -602,11 +564,7 @@ lt:
status_messages:
helper:
no_message_to_display: "Žinučių nėra."
- too_long:
- few: "Sutrumpinkite savo statuso pranešimą %{count} ženklais"
- one: "Sutrumpinkite savo statuso pranešimą %{count} ženklu"
- other: "Sutrumpinkite savo statuso pranešimą %{count} ženklų"
- zero: "Sutrumpinkite savo statuso pranešimą %{count} ženklų"
+ too_long: "{\"few\"=>\"Sutrumpinkite savo statuso pranešimą %{count} ženklais\", \"one\"=>\"Sutrumpinkite savo statuso pranešimą %{count} ženklu\", \"other\"=>\"Sutrumpinkite savo statuso pranešimą %{count} ženklų\", \"zero\"=>\"Sutrumpinkite savo statuso pranešimą %{count} ženklų\"}"
stream_helper:
hide_comments: "Slėpti visus komentarus"
show_comments:
@@ -643,7 +601,6 @@ lt:
close_account:
what_we_delete: "We delete all of your posts, profile data, as soon as humanly possible. Your comments will hang around, but be associated with your Diaspora Handle."
download_photos: "atsisiųsti mano nuotraukas"
- download_xml: "atsisiųsti mano duomenis xml formatu"
email_awaiting_confirmation: "We have sent you an activation link to %{unconfirmed_email}. Till you follow this link and activate the new address, we will continue to use your original address %{email}."
export_data: "Eksportuoti duomenis"
new_password: "Naujas slaptažodis"
diff --git a/config/locales/diaspora/lv.yml b/config/locales/diaspora/lv.yml
index 39f29885c..9d040980e 100644
--- a/config/locales/diaspora/lv.yml
+++ b/config/locales/diaspora/lv.yml
@@ -5,15 +5,185 @@
lv:
+ _applications: "Lietotnes"
_comments: "Komentāri"
+ _contacts: "Kontakti"
_home: "Mājās"
+ _photos: "Fotogrāfijas:"
+ _services: "Servisi"
account: "Konts"
+ activerecord:
+ errors:
+ models:
+ contact:
+ attributes:
+ person_id:
+ taken: "ir jābūt unikālam starp lietotāja kontaktiem."
+ person:
+ attributes:
+ diaspora_handle:
+ taken: "ir aizņemts."
+ reshare:
+ attributes:
+ root_guid:
+ taken: "Baigi labais, jā? Tu jau esi dalījies ar šo ierakstu!"
+ user:
+ attributes:
+ email:
+ taken: "ir aizņemts."
+ person:
+ invalid: "nav derīgs."
+ username:
+ invalid: "nav derīgs. Ir atļauti tikai burti, cipari un apakšsvītras."
+ taken: "ir aizņemts."
+ ago: "pirms %{time}"
+ all_aspects: "Visas grupas"
+ application:
+ helper:
+ unknown_person: "nezināma persona"
+ video_title:
+ unknown: "Nenosaukts video"
+ are_you_sure: "Vai esi pārliecināts?"
+ are_you_sure_delete_account: "Vai tiešām vēlaties slēgt savu kontu? To nevarēs atjaunot!"
+ aspect_memberships:
+ destroy:
+ failure: "Neizdevās noņemt personu no grupas"
+ success: "Persona tika veiksmīgi noņemta no grupas"
+ aspects:
+ add_to_aspect:
+ failure: "Nesanāca pievienot kontaktu grupai."
+ success: "Kontakts veiksmīgi pievienots grupai."
+ aspect_listings:
+ add_an_aspect: "+ Pievienot grupu"
+ deselect_all: "Atlasīt neko"
+ edit_aspect: "Labot %{name}"
+ select_all: "Izvēlēties visus"
+ contacts_not_visible: "Kontakti šajā grupā nevarēs viens otru redzēs."
+ contacts_visible: "Kontakti šajā grupā varēs viens otru redzēt."
+ create:
+ failure: "Grupas izveide neizdevās."
+ success: "Grupa %{name} tika izveidota."
+ destroy:
+ failure: "%{name} nav tukša un to nevar noņemt."
+ success: "%{name} tika veiksmīgi noņemta."
+ edit:
+ aspect_list_is_not_visible: "Kontakti šajā grupā neredz viens otru."
+ aspect_list_is_visible: "Kontakti šajā grupā var redzēt viens otru."
+ confirm_remove_aspect: "Vai jūs tiešām vēlaties dzēst šo grupu?"
+ make_aspect_list_visible: "ļaut kontaktiem šajā grupā viens otru redzēt?"
+ remove_aspect: "Dzēst šo grupu"
+ rename: "pārsaukt"
+ update: "atjaunot"
+ updating: "atjauno"
+ index:
+ diaspora_id:
+ content_1: "Tavs diaspora* ID:"
+ content_2: "Dod to citiem, lai viņi varētu tevi atrast diaspora* tīklā."
+ heading: "diaspora* ID"
+ donate: "Ziedot"
+ handle_explanation: "Šis ir tavs diaspora* ID. Tā ir kā e-pasta adrese, kuru tu dod, lai cilvēki varētu ar tevi sazināties."
+ help:
+ do_you: "Ja tev ir:"
+ feature_suggestion: "... %{link}?"
+ find_a_bug: "... zināma %{link}?"
+ have_a_question: "... %{link}?"
+ here_to_help: "Diaspora* kopiena tev palīdzēs!"
+ need_help: "Nepieciešama palīdzība?"
+ tag_bug: "kļūda"
+ tag_feature: "uzlabojums"
+ tag_question: "jautājums"
+ introduce_yourself: "Šī ir tava plūsma. Sāk rakstīt un iepazīstini ar sevi."
+ new_here:
+ follow: "Seko %{link} un sveicini jaunos lietotājus diaspora*!"
+ learn_more: "Lasīt vairāk"
+ title: "Sveicināti, jaunie lietotāji"
+ no_contacts: "Nav kontaktu"
+ no_tags: "+ Atrodi birku, kurai sekot"
+ services:
+ content: "Tu vari pieslēgt šādus servisus savam diaspora* profilam:"
+ heading: "Pieslēgt servisus"
+ unfollow_tag: "Vairs nerādīt %{tag}"
+ welcome_to_diaspora: "Laipni lūgti diaspora*, %{name}!"
+ new:
+ create: "Izveidot"
+ name: "Nosaukums (redzams tikai tev)"
+ no_contacts_message:
+ community_spotlight: "Kopienas uzmanībā"
+ or_spotlight: "Vai arī tu vari dalīties ar saiti %{link}"
+ try_adding_some_more_contacts: "Tu vari meklēt vai uzaicināt vairāk cilvēku."
+ you_should_add_some_more_contacts: "Pievieno vairāk cilvēku!"
+ one: "1 grupa"
+ other: "%{count} grupas"
+ seed:
+ acquaintances: "Paziņas"
+ family: "Ģimene"
+ friends: "Draugi"
+ work: "Darbs"
+ update:
+ failure: "Grupas %{name} nosaukums ir pārāk garš, lai to saglabātu."
+ success: "Grupa %{name} tika veiksmīgi labota."
+ zero: "nav grupu"
back: "Atpakaļ"
cancel: "Atcelt"
+ comments:
+ new_comment:
+ comment: "Komentēt"
+ commenting: "Komentē..."
+ one: "1 komentārs"
+ other: "%{count} komentāri"
+ zero: "nav komentāru"
+ contacts:
+ create:
+ failure: "Neizdevās izveidot kontaktu"
+ index:
+ add_a_new_aspect: "Pievienot jaunai grupai"
+ start_a_conversation: "Sākt sarunu"
+ title: "Kontakti"
+ your_contacts: "Tavi kontakti"
+ one: "1 kontakts"
+ other: "%{count} kontakti"
+ zero: "kontakti"
+ conversations:
+ create:
+ sent: "Ziņa aizsūtīta"
+ helper:
+ new_messages:
+ one: "1 jauna ziņa"
+ other: "%{count} jaunas ziņas"
+ zero: "Nav jaunu ziņu"
+ index:
+ inbox: "Ienākošās"
+ new:
+ abandon_changes: "Atcelt izmaiņas?"
+ send: "Sūtīt"
+ sending: "Sūta..."
+ subject: "Virsraksts"
+ to: "Adresāts"
+ show:
+ delete: "Dzēst un bloķēt sarunu"
+ reply: "atbildēt"
+ replying: "Atbild..."
delete: "Dzēst"
+ email: "E-pasts"
+ error_messages:
+ helper:
+ correct_the_following_errors_and_try_again: "Izlabojiet sekojošās kļūdas un mēģiniet vēlreiz."
+ invalid_fields: "Nekorekti lauki"
+ fill_me_out: "Aizpildi mani"
+ find_people: "Meklēt cilvēkus vai #birkas"
hide: "Slēpt"
+ invitations:
+ create:
+ already_sent: "Tu jau esi ielūdzis šo personu."
+ sent: "Ielūgumi ir aizsūtīt: %{emails}"
+ new:
+ language: "Valoda"
+ limited: "Ierobežota piekļuve"
more: "Vairāk"
next: "nākamais"
+ no_results: "Nekas netika atrasts."
+ ok: "Labi"
+ or: "vai"
password: "Parole"
password_confirmation: "Paroles apstiprinājums"
previous: "iepriekšējais"
@@ -23,4 +193,7 @@ lv:
public: "Publisks"
search: "Meklēt"
settings: "Iestatījumi"
- username: "Lietotājvārds" \ No newline at end of file
+ terms_and_conditions: "Noteikumi un nosacījumi"
+ undo: "Atsaukt"
+ username: "Lietotājvārds"
+ welcome: "Sveicināti!" \ No newline at end of file
diff --git a/config/locales/diaspora/mk.yml b/config/locales/diaspora/mk.yml
index e107ceb72..82e7bdcdf 100644
--- a/config/locales/diaspora/mk.yml
+++ b/config/locales/diaspora/mk.yml
@@ -54,16 +54,10 @@ mk:
destroy:
success: "%{name} е отстранет успешно."
edit:
- add_existing: "Додади постоечки контакт"
- done: "Завршено"
make_aspect_list_visible: "make aspect list visible?"
rename: "реименувај"
update: "ажурирај"
updating: "ажурирање"
- few: "%{count} aspects"
- helper:
- aspect_not_empty: "Аспектот не е празен"
- remove: "одстрани"
index:
donate: "Донирај"
handle_explanation: "Ова е вашето diaspora корисничко име. Исто како е-маил адреса, можете да го давате на луѓе за да се сврзат со вас."
@@ -79,11 +73,6 @@ mk:
learn_more: "Научи повеќе"
no_contacts: "Нема контакти"
no_tags: "No tags"
- many: "%{count} aspects"
- move_contact:
- error: "Грешка при преместувањето на контактот: %{inspect}"
- failure: "не проработи %{inspect}"
- success: "Личноста е преместена во нов аспект"
new:
create: "Направи"
name: "Name"
@@ -97,12 +86,6 @@ mk:
family: "Фамилија"
friends: "Пријатели"
work: "Работа"
- selected_contacts:
- no_contacts: "Тука сеуште немате контакти."
- view_all_contacts: "Сите контакти"
- show:
- edit_aspect: "уреди аспект"
- two: "%{count} aspects"
update:
success: "Вашиот аспект, %{name}, беше успешно уреден."
zero: "no aspects"
@@ -112,19 +95,15 @@ mk:
heading: "Diaspora Bookmarklet"
cancel: "Откажи"
comments:
- few: "%{count} comments"
- many: "%{count} comments"
new_comment:
comment: "Коментар"
commenting: "Коментирање..."
one: "1 коментар"
other: "%{count} коментари"
- two: "%{count} коментари"
zero: "нема коментари"
contacts:
create:
failure: "Неуспешно креирање на контакт"
- few: "%{count} contacts"
index:
add_to_aspect: "Add contacts to %{name}"
all_contacts: "Сите контакти"
@@ -134,17 +113,13 @@ mk:
start_a_conversation: "Започни разговор"
title: "Контакти"
your_contacts: "Ваши контакти"
- many: "%{count} контакти"
one: "1 контакт"
sharing:
people_sharing: "Луѓе што споделуваат со тебе:"
- two: "%{count} контакти"
conversations:
create:
fail: "Невалидна порака"
sent: "Пораката е пратена"
- destroy:
- success: "Разговорот е успешно избришан"
helper:
new_messages:
few: "%{count} new messages"
@@ -348,12 +323,10 @@ mk:
password: "Лозинка"
password_confirmation: "Потврда на лозинка"
people:
- few: "%{count} people"
helper:
results_for: " резултати за %{params}"
index:
results_for: "резултати од пребарување за"
- many: "%{count} people"
one: "1 person"
other: "%{count} people"
person:
@@ -373,7 +346,6 @@ mk:
does_not_exist: "Личноста не постои!"
incoming_request: "You have an incoming request from this person."
not_connected: "You are not connected with this person"
- two: "%{count} people"
zero: "no people"
photos:
destroy:
@@ -531,13 +503,7 @@ mk:
status_messages:
helper:
no_message_to_display: "Нема пораки за прикажување."
- too_long:
- few: "please make your status messages less than %{count} characters"
- many: "please make your status messages less than %{count} characters"
- one: "please make your status messages less than %{count} character"
- other: "please make your status messages less than %{count} characters"
- two: "please make your status messages less than %{count} characters"
- zero: "please make your status messages less than %{count} characters"
+ too_long: "{\"few\"=>\"please make your status messages less than %{count} characters\", \"many\"=>\"please make your status messages less than %{count} characters\", \"one\"=>\"please make your status messages less than %{count} character\", \"other\"=>\"please make your status messages less than %{count} characters\", \"two\"=>\"please make your status messages less than %{count} characters\", \"zero\"=>\"please make your status messages less than %{count} characters\"}"
stream_helper:
hide_comments: "hide comments"
show_comments:
@@ -576,7 +542,6 @@ mk:
close_account:
what_we_delete: "We delete all of your posts, profile data, as soon as humanly possible. Your comments will hang around, but be associated with your Diaspora Handle."
download_photos: "симни ги моите слики"
- download_xml: "симни го мојот xml"
email_awaiting_confirmation: "We have sent you an activation link to %{unconfirmed_email}. Till you follow this link and activate the new address, we will continue to use your original address %{email}."
export_data: "Изнеси податоци"
new_password: "Нова лозинка"
diff --git a/config/locales/diaspora/ml.yml b/config/locales/diaspora/ml.yml
index 5f92a6756..57442746d 100644
--- a/config/locales/diaspora/ml.yml
+++ b/config/locales/diaspora/ml.yml
@@ -86,7 +86,8 @@ ml:
one: "%{count} ഉപയോക്താവിനെ കണ്ടെത്തി"
other: "%{count} ഉപയോക്താക്കളെ കണ്ടെത്തി"
zero: "ഒരു ഉപയോക്താവിനെ പോലും കണ്ടെത്തിയില്ല"
- you_currently: "താങ്കൾക്ക് നിലവിൽ %{user_invitation} ക്ഷണങ്ങൾ ഉണ്ട് %{link}"
+ you_currently:
+ other: "താങ്കൾക്ക് നിലവിൽ %{user_invitation} ക്ഷണങ്ങൾ ഉണ്ട് %{link}"
weekly_user_stats:
amount_of:
one: "ഈ ആഴ്ചയിലെ പുതിയ ഉപയോക്താക്കളുടെ എണ്ണം : %{count}"
@@ -111,8 +112,6 @@ ml:
add_to_aspect:
failure: "സമ്പര്‍ക്കം പരിചയത്തിലേക്ക് കൂട്ടിചേര്‍ക്കുന്നതില്‍ പരാജയപ്പെട്ടു."
success: "വിജയകരമായി സമ്പര്‍ക്കം പരിചയത്തിലേക്ക് കൂട്ടിചേര്‍ത്തു."
- aspect_contacts:
- done_editing: "മാറ്റം വരുത്തി കഴിഞ്ഞു"
aspect_listings:
add_an_aspect: "+ഒരു പരിചയം ചേർക്കുക"
deselect_all: "ഒന്നും തിരഞ്ഞെടുക്കാതിരിക്കുക"
@@ -131,21 +130,14 @@ ml:
failure: "%{name} ശുന്യമല്ലാത്തതിനാല്‍ നീക്കാനാകുന്നില്ല."
success: "%{name} വിജയകരമായി നീക്കം ചെയ്തിരിക്കുന്നു."
edit:
- add_existing: "നിലവിലുള്ള സമ്പര്‍ക്കം ചേര്‍കുക"
aspect_list_is_not_visible: "പരിചയത്തിന്റെ പട്ടിക പരിചയത്തിലുള്ള മറ്റൂള്ളവരില്‍നിന്നും മറച്ചുവച്ചിരിക്കുന്നു"
aspect_list_is_visible: "പരിചയപട്ടിക പരിചയത്തിലുള്ളവര്‍ക്ക് ദൃശ്യമാണ്."
confirm_remove_aspect: "താങ്കള്‍ക്ക് ഈ പരിചയം നീക്കണമെന്ന് ഉറപ്പാണോ?"
- done: "ചെയ്തു"
make_aspect_list_visible: "പരിചയം ദൃശ്യമാക്കുക"
remove_aspect: "ഈ പരിചയം നീക്കം ചെയ്യുക"
rename: "പേര് മാറ്റുക"
update: "പുതുക്കുക"
updating: "പുതുക്കുന്നു"
- few: "%{count} പരിചയങ്ങള്‍"
- helper:
- are_you_sure: "നിങ്ങള്‍ ഈ പരിചയം നീക്കം ചെയ്യുവാന്‍ ആഗ്രഹിക്കുന്നു, നിങ്ങള്‍ക്ക് തീര്‍ച്ചയാണോ?"
- aspect_not_empty: "പരിചയം ശൂന്യമല്ല "
- remove: "നീക്കം ചെയ്യു"
index:
diaspora_id:
content_1: "നിങ്ങളുടെ ഡയാസ്പുറ ഐഡി:"
@@ -186,11 +178,6 @@ ml:
heading: "സേവനങ്ങൾ ബന്ധിപ്പിക്കുക"
unfollow_tag: "#%{tag} പിന്തുടരുന്നത് നിർത്തുക"
welcome_to_diaspora: "ഡയാസ്പുറയിലേക്ക് സ്വഗതം, %{name}!"
- many: "%{count} പരിചയങ്ങള്‍"
- move_contact:
- error: "സമ്പര്‍ക്കം മാറ്റാന്‍ സാധിക്കുന്നില്ല : %{inspect}"
- failure: "ശരിയായില്ല. %{inspect}"
- success: "വ്യക്തിയെ പുതിയ പരിചയത്തിലേക്ക് മാറ്റിയിരിക്കുന്നു"
new:
create: "സൃഷ്ടിക്കൂ"
name: "പേരു്"
@@ -208,14 +195,6 @@ ml:
family: "കുടുംബം"
friends: "കൂട്ടുകാര്‍"
work: "ജോലി"
- selected_contacts:
- manage_your_aspects: "താങ്കളുടെ പരിചയങ്ങളെ ക്രമീകരിക്കുക"
- no_contacts: "നിങ്ങൾക്കിതുവരെ സമ്പർക്കങ്ങളൊന്നുമില്ല"
- view_all_community_spotlight: "സാമൂഹിക പ്രാധാന്യം എല്ലാം കാണുക"
- view_all_contacts: "എല്ലാ സമ്പർക്കങ്ങളും കാണുക"
- show:
- edit_aspect: "പരിചയം ചിട്ടപെടുത്തുക"
- two: "%{count} പരിചയങ്ങള്‍"
update:
failure: "താങ്കള്‍ നല്കിയ %{name} എന്ന പരിചയത്തിന്റെ പേര് അനുവദിനീയമായതിലും വലുതാണ്."
success: "നിങ്ങളുടെ പരിചയം, %{name}, വിജയകരമായി ചിട്ടപ്പെടുത്തി."
@@ -235,36 +214,27 @@ ml:
post_success: "കുറിപ്പിട്ടു! അടയ്ക്കുന്നു!"
cancel: "റദ്ദാക്കുക"
comments:
- few: "%{count} അഭിപ്രായങ്ങള്‍"
- many: "%{count} അഭിപ്രായങ്ങള്‍"
new_comment:
comment: "അഭിപ്രായം"
commenting: "അഭിപ്രായം രേഖപ്പെടുത്തുന്നു..."
one: "1 അഭിപ്രായം"
other: "%{count} അഭിപ്രായങ്ങള്‍"
- two: "%{count} comments"
zero: "അഭിപ്രായങ്ങളൊന്നുമില്ല."
contacts:
create:
failure: "സമ്പര്‍ക്കം ഉണ്ടാക്കാനാകുന്നില്ല"
- few: "%{count} സമ്പര്‍ക്കങ്ങള്‍"
index:
add_a_new_aspect: "പുതിയ പരിചയം ചേര്‍ക്കൂ"
add_to_aspect: "സമ്പര്‍ക്കങ്ങള്‍ %{name} പരിചയത്തിലേക്ക് ചേര്‍ക്കുക"
- add_to_aspect_link: "സമ്പര്‍ക്കങ്ങള്‍ %{name} പരിചയത്തിലേക്ക് ചേര്‍ക്കുക"
all_contacts: "എല്ലാ സമ്പര്‍ക്കവും"
community_spotlight: "സാമൂഹിക പ്രാധാന്യം"
- many_people_are_you_sure: "%{suggested_limit}നെക്കാള്‍ കൂടുതല്‍ സമ്പര്‍ക്കങ്ങളുമായി ഒരു സ്വകാര്യസംഭാഷണം തുടങ്ങണമെന്ന് താങ്കള്‍ക്ക് ഉറപ്പാണോ. ഈ പരിചയത്തിലേക്ക് കുറിപ്പ് ചേര്‍ക്കുന്നതായിരിക്കും അവരെ ബന്ധപ്പെടാനുള്ള കൂടുതല്‍ നല്ല മാര്‍ഗ്ഗം."
my_contacts: "എന്റെ സമ്പര്‍ക്കങ്ങള്‍"
no_contacts: "കണ്ടിട്ട് താങ്കള്‍ പുതിയ ചില സമ്പര്‍ക്കങ്ങള്‍ ചേര്‍ക്കേണ്ടതുണ്ട് എന്ന് തോന്നുന്നു!"
no_contacts_message: "%{community_spotlight} കണ്ടുനോക്കു"
- no_contacts_message_with_aspect: "%{community_spotlight} കണ്ടുനോക്കു അല്ലെങ്കില്‍ %{add_to_aspect_link}"
only_sharing_with_me: "നിങ്ങളുമായി മാത്രം പങ്ക് വച്ചത്"
- remove_person_from_aspect: "\"%{aspect_name}\" - ഇല്‍നിന്ന് %{person_name} ഒഴിവാക്കുക"
start_a_conversation: "സംഭാഷണം ആരംഭിക്കൂ"
title: "സമ്പര്‍ക്കങ്ങള്‍"
your_contacts: "നിങ്ങളുടെ സമ്പര്‍ക്കങ്ങള്‍"
- many: "%{count} സമ്പര്‍ക്കങ്ങള്‍"
one: "ഒരു സമ്പര്‍ക്കം"
other: "%{count} മറ്റു സമ്പര്‍ക്കങ്ങള്‍"
sharing:
@@ -272,7 +242,6 @@ ml:
spotlight:
community_spotlight: "സാമൂഹിക പ്രാധാന്യം"
suggest_member: "ഒരു ഉപയോക്ത്താവിനെ നിർദ്ദേശിക്കുക"
- two: "%{count} സമ്പര്‍ക്കങ്ങള്‍"
zero: "സമ്പര്‍ക്കമൊന്നുമില്ല"
conversations:
conversation:
@@ -281,8 +250,6 @@ ml:
fail: "സാധുവല്ലാത്ത സന്ദേശം"
no_contact: "നമസ്കാരം, താങ്കൾ ആദ്യം ഒരു ബന്ധം ചേർക്കണം!"
sent: "സന്ദേശം അയച്ചു."
- destroy:
- success: "സംഭാഷണം വിജയകരമായി നീക്കം ചെയ്തിരിക്കുന്നു."
helper:
new_messages:
few: "%{count} പുതിയ സന്ദേശങ്ങള്‍"
@@ -668,7 +635,6 @@ ml:
add_contact_from_tag: "ടാഗില്‍ നിന്ന് സമ്പര്‍ക്കം ചേര്‍ക്കുക"
aspect_list:
edit_membership: "പരിചയത്തിലെ അംഗത്വം തിരുത്തു"
- few: "%{count} ആളുകള്‍"
helper:
is_not_sharing: "%{name} നിങ്ങളുമായി പങ്കുവെയ്ക്കുന്നില്ല."
is_sharing: "%{name} നിങ്ങളുമായി പങ്കുവെയ്ക്കുന്നു."
@@ -679,7 +645,6 @@ ml:
no_results: "താങ്കള്‍ എന്തിനെങ്കിലും വേണ്ടി തിരയേണ്ടതുണ്ട്."
results_for: "വിവരങ്ങള്‍ക്കായി തെരയുക"
searching: "തിരഞ്ഞുകൊണ്ടിരിക്കുന്നു, ദയവായി കാത്തിരിക്കുക..."
- many: "%{count} ആളുകള്‍"
one: "ഒരാള്‍"
other: "%{count} ആളുകള്‍"
person:
@@ -716,7 +681,6 @@ ml:
add_some: "എന്തെങ്കിലും ചേർക്കൂ"
edit: "തിരുത്തുക"
you_have_no_tags: "താങ്കള്‍ക്ക് ഒരു ടാഗ് പോലുമില്ല!"
- two: "%{count} ആളുകള്‍"
webfinger:
fail: "ക്ഷമിക്കണം, ഞങ്ങള്‍ക്ക് %{handle} കണ്ടെത്താനായില്ല.."
zero: "ആളുകളില്ല"
@@ -808,15 +772,12 @@ ml:
update: "പുതുക്കു"
invalid_invite: "താങ്കൾ നൽകിയ ക്ഷണക്കത്ത് സാധുവല്ല!"
new:
- continue: "തുടരുക"
create_my_account: "എന്റെ അക്കൌണ്ട് സൃഷ്ടിക്കൂ!"
- diaspora: "<3 ഡയസ്പോറ*"
email: "ഈമെയിൽ"
enter_email: "Enter an email"
enter_password: "അടയാളവാക്ക് നല്‍കുക (ആറ് അക്ഷരമെങ്കിലും)"
enter_password_again: "അടയാളവാക്ക് വീണ്ടും നല്‍കുക"
enter_username: "ഉപഭാക്തൃ നാമം തിരഞ്ഞെടുക്കുക (അക്ഷരങ്ങളും സംഖ്യകളും അണ്ടര്‍ സ്കോറും മാത്രം)"
- hey_make: "നമസ്കാരം, എന്തെങ്കിലും <br/>ഉണ്ടാക്കുക<br/>"
join_the_movement: "Join the movement!"
password: "രഹസ്യവാക്ക്"
password_confirmation: "രഹസ്യവാക്ക് ഉറപ്പാക്കൽ"
@@ -984,13 +945,7 @@ ml:
no_message_to_display: "സന്ദേശമൊന്നും കാണിക്കാനില്ല."
new:
mentioning: "സൂചിപ്പിക്കുന്നു: %{person}"
- too_long:
- few: "please make your status messages less than %{count} characters"
- many: "please make your status messages less than %{count} characters"
- one: "please make your status messages less than %{count} character"
- other: "please make your status messages less than %{count} characters"
- two: "please make your status messages less than %{count} characters"
- zero: "please make your status messages less than %{count} characters"
+ too_long: "{\"few\"=>\"please make your status messages less than %{count} characters\", \"many\"=>\"please make your status messages less than %{count} characters\", \"one\"=>\"please make your status messages less than %{count} character\", \"other\"=>\"please make your status messages less than %{count} characters\", \"two\"=>\"please make your status messages less than %{count} characters\", \"zero\"=>\"please make your status messages less than %{count} characters\"}"
stream_helper:
hide_comments: "Hide all comments"
show_comments:
@@ -1031,7 +986,6 @@ ml:
title: "Public Activity"
tags:
contacts_title: "People who dig this tag"
- tag_prefill_text: "The thing about %{tag_name} is... "
title: "Posts tagged: %{tags}"
tag_followings:
create:
@@ -1045,10 +999,7 @@ ml:
show:
follow: "Follow #%{tag}"
following: "Following #%{tag}"
- nobody_talking: "നിലവില്‍ ആരും %{tag}-നെ കുറിച്ച് സംസാരിക്കുന്നില്ല."
none: "The empty tag does not exist!"
- people_tagged_with: "%{tag} ചേര്‍ത്തിട്ടുള്ള ആളുകള്‍"
- posts_tagged_with: "#%{tag} ചേര്‍ത്തിട്ടുള്ള കുറിപ്പുകള്‍"
stop_following: "Stop Following #%{tag}"
terms_and_conditions: "വ്യവസ്ഥകളും നിബന്ധനകളും"
undo: "പൂര്‍വരൂപത്തിലാക്കണോ?"
@@ -1084,7 +1035,6 @@ ml:
current_password: "ഇപ്പോഴത്തെ അടയാളവാക്ക്"
current_password_expl: "താങ്കൾ സൈൻ ഇൻ ചെയ്യുന്ന ആ ഒരെണ്ണം."
download_photos: "എന്റെ ചിത്രങ്ങള്‍ ഇറക്കു"
- download_xml: "എന്റെ എക്സ് എം എല്‍ ഇറക്കു"
edit_account: "അക്കൌണ്ട് തിരുത്തു"
email_awaiting_confirmation: "We have sent you an activation link to %{unconfirmed_email}. Until you follow this link and activate the new address, we will continue to use your original address %{email}."
export_data: "വിവരങ്ങള്‍ ഇറക്കുമതി ചെയ്യു"
@@ -1093,7 +1043,6 @@ ml:
liked: "...someone likes your post?"
mentioned: "...ഒരു കുറിപ്പില്‍ ആരെങ്കിലും സൂചിപ്പിക്കുമ്പോള്‍?"
new_password: "പുതിയ അടയാളവാക്ക്"
- photo_export_unavailable: "ഫോട്ടോ ഇറക്കുമതി നിലവിൽ ലഭ്യമല്ല"
private_message: "...ഒരു സ്വകാര്യ സന്ദേശം കിട്ടുമ്പോള്‍?"
receive_email_notifications: "ഇമെയില്‍ അറിയിപ്പുകള്‍ വേണോ?"
reshared: "...someone reshares your post?"
diff --git a/config/locales/diaspora/ms.yml b/config/locales/diaspora/ms.yml
index a38b58438..56acaece7 100644
--- a/config/locales/diaspora/ms.yml
+++ b/config/locales/diaspora/ms.yml
@@ -48,25 +48,41 @@ ms:
video_title:
unknown: "Tajuk Wayang Tidak Diketahui"
are_you_sure: "Anda yakin?"
+ are_you_sure_delete_account: "Adakah anda pasti anda mahu menutup akaun anda? Ini tidak boleh diundur!"
aspect_memberships:
destroy:
failure: "Gagal mengeluarkan individu daripada aspek"
+ no_membership: "Tidak dapat mencari orang yang dipilih dalam aspek itu"
+ success: "Orang berjaya dikeluarkan dari aspek"
aspects:
+ add_to_aspect:
+ failure: "Gagal untuk menambah kenalan kepada aspek."
+ success: "Berjaya menambah kenalan kepada aspek."
+ aspect_listings:
+ add_an_aspect: "+ Tambah sebuah aspek"
+ deselect_all: "Nyahpilih semua"
+ edit_aspect: "Edit %{name}"
+ select_all: "Pilih semua"
+ aspect_stream:
+ stay_updated: "Kekal Dikemaskini"
+ stay_updated_explanation: "Aliran utama anda dipenuhi dengan semua kenalan anda, tag anda ikuti, dan catatan dari beberapa ahli kreatif komuniti."
+ contacts_not_visible: "Kenalan dalam aspek ini tidak akan dapat melihat satu sama lain."
+ contacts_visible: "Kenalan dalam aspek ini akan dapat melihat satu sama lain."
+ create:
+ failure: "Penciptaan aspek gagal."
+ success: "Aspek baru anda %{name} telah dibuat"
destroy:
+ failure: "%{name} tidak kosong dan tidak boleh dikeluarkan."
success: "%{name} telah berjaya dikeluarkan."
edit:
- add_existing: "Tambah kenalan yang sedia ada"
+ aspect_list_is_not_visible: "Kenalan dalam aspek ini tidak dapat melihat satu sama lain."
+ aspect_list_is_visible: "Kenalan dalam aspek ini dapat melihat satu sama lain."
confirm_remove_aspect: "Adakah anda pasti anda mahu memadam aspek ini?"
- done: "Selesai"
- make_aspect_list_visible: "membuat kenalan dalam aspek ini dapat dilihat antara satu sama lain?"
+ make_aspect_list_visible: "Buat kenalan dalam aspek ini dapat dilihat antara satu sama lain?"
remove_aspect: "Padam aspek ini"
+ rename: "namakan semula"
update: "kemas kini"
updating: "mengemas kini"
- few: "%{count} aspek"
- helper:
- are_you_sure: "Adakah anda pasti anda mahu memadam aspek ini?"
- aspect_not_empty: "Aspek tidak kosong"
- remove: "buang"
index:
diaspora_id:
content_1: "ID Diaspora anda adalah:"
@@ -76,16 +92,29 @@ ms:
handle_explanation: "Ini adalah diaspora id anda. Seperti alamat e-mel, anda boleh memberikan orang-orang ini untuk mencapai anda."
help:
do_you: "Adakah anda:"
+ email_feedback: "%{link} maklumbalas anda, jika anda inginkan"
+ feature_suggestion: "... punyai %{link} cadangan?"
+ find_a_bug: "... mencari %{link}?"
+ have_a_question: "... punyai %{link}?"
+ here_to_help: "Komuniti diaspora* disini!"
+ need_help: "Perlukan Bantuan?"
tag_bug: "#bug"
tag_feature: "#feature"
tag_question: "#question"
+ introduce_yourself: "Ini adalah aliran anda. Sertai dan kenalkan diri anda."
+ new_here:
+ follow: "Ikuti %{link} dan selamat datang pengguna baru ke diaspora *!"
+ learn_more: "Ketahui lebih lanjut"
+ title: "Alukan Pengguna Baru"
+ no_contacts: "Tiada kenalan"
+ no_tags: "+ Cari tag untuk diikuti"
+ people_sharing_with_you: "Orang berkongsi dengan anda"
+ post_a_message: "hantar mesej"
+ services:
+ content: "Anda boleh menyambung perkhidmatan berikut kepada diaspora*:"
+ heading: "Khidmat Perhubungan"
unfollow_tag: "berhenti mengikut #%{tag}"
welcome_to_diaspora: "Selamat datang ke Diaspora, %{name}!"
- many: "%{count} aspek"
- move_contact:
- error: "Ralat memindah kenalan: %{inspect}"
- failure: "tidak berfungsi %{inspect}"
- success: "Orang berpindah kepada aspek baru"
new:
create: "Cipta"
name: "Nama (hanya boleh dilihat oleh anda)"
@@ -103,32 +132,41 @@ ms:
family: "Famili"
friends: "Rakan"
work: "Kerja"
- two: "%{count} aspects"
+ update:
+ failure: "Aspek anda, %{name}, mempunyai nama terlalu panjang untuk disimpan."
+ success: "Aspek anda, %{name}, telah berjaya diedit."
zero: "no aspects"
+ back: "Undur"
bookmarklet:
+ explanation: "Pos kepada diaspora * dari mana-mana sahaja dengan bookmark link ini => %{link}."
+ heading: "Bookmarklet"
+ post_something: "Pos kepada diaspora*"
post_success: "Telah Di Pos! Tutup!"
cancel: "Batal"
comments:
- few: "%{count} komen"
- many: "%{count} komen"
new_comment:
comment: "Komen"
commenting: "Mengulas..."
one: "1 komen"
other: "%{count} komen"
- two: "%{count} komen"
zero: "tiada komen"
contacts:
create:
failure: "Gagal untuk membuat kenalan"
- few: "%{count} kenalan"
index:
add_a_new_aspect: "Tambah aspek baru"
add_to_aspect: "menambah kenalan ke %{name}"
all_contacts: "Semua Kenalan"
- many_people_are_you_sure: "Adakah anda pasti anda mahu untuk memulakan perbualan peribadi dengan lebih daripada% {suggested_limit} kenalan? Posting ke aspek ini mungkin cara yang lebih baik untuk menghubungi mereka."
my_contacts: "Kenalan Saya"
only_sharing_with_me: "Hanya berkongsi dengan saya"
+ start_a_conversation: "Mulakan perbualan"
+ title: "Kenalan-kenalan"
+ your_contacts: "Kenalan Anda"
+ one: "1 kenalan"
+ other: "%{count} kenalan-kenalan"
+ sharing:
+ people_sharing: "Orang berkongsi dengan anda:"
+ zero: "kenalan-kenalan"
conversations:
helper:
new_messages:
@@ -153,6 +191,14 @@ ms:
reply: "balas"
replying: "Membalas..."
delete: "Padam"
+ email: "Emel"
+ error_messages:
+ helper:
+ correct_the_following_errors_and_try_again: "Betulkan kesilapan-kesilapan berikut dan cuba lagi."
+ invalid_fields: "bidang tidak sah"
+ fill_me_out: "Isi"
+ find_people: "Cari orang atau #tag"
+ hide: "Sembunyikan"
invitations:
create:
already_contacts: "Anda telah disambungkan dengan orang ini"
@@ -306,6 +352,8 @@ ms:
a_post_you_shared: "pos."
click_here: "klik di sini"
to_change_your_notification_settings: "untuk menukar tetapan pemberitahuan anda"
+ nsfw: "NSFW"
+ ok: "Baiklah"
or: "atau"
password: "kata laluan"
password_confirmation: "pengesahan kata laluan"
@@ -314,14 +362,12 @@ ms:
add_contact_from_tag: "menambah kenalan dari tag"
aspect_list:
edit_membership: "mengedit keahlian aspek"
- few: "%{count} orang"
helper:
results_for: "keputusan untuk %{params}"
index:
no_one_found: "...dan tiada orang yang dijumpai."
no_results: "Hey! Anda perlu mencari sesuatu."
results_for: "hasil carian untuk"
- many: "%{count} orang"
one: "1 orang"
other: "%{count} orang"
person:
@@ -337,7 +383,6 @@ ms:
add_some: "menambah beberapa"
edit: "mengedit"
you_have_no_tags: "anda tiada tag!"
- two: "%{count} orang"
webfinger:
fail: "Maaf, kami tidak dapat menemui %{handle}."
zero: "tiada orang"
@@ -355,13 +400,14 @@ ms:
other: "%{count} photos by %{author}"
two: "Two photos by %{author}"
zero: "No photos by %{author}"
+ previous: "Terdahulu"
+ privacy: "Privasi"
+ privacy_policy: "Polisi Privasi"
+ profile: "Profil"
+ public: "Awam"
reactions:
- few: "%{count} reactions"
- many: "%{count} reactions"
- one: "1 reaction"
other: "%{count} reactions"
- two: "%{count} reactions"
- zero: "0 reactions"
+ zero: "0 reaksi"
requests:
helper:
new_requests:
@@ -380,6 +426,8 @@ ms:
other: "%{count} reshares"
two: "%{count} reshares"
zero: "Reshare"
+ search: "Cari"
+ settings: "Tetapan"
shared:
aspect_dropdown:
toggle:
@@ -390,13 +438,7 @@ ms:
two: "In %{count} aspects"
zero: "Add contact"
status_messages:
- too_long:
- few: "please make your status messages less than %{count} characters"
- many: "please make your status messages less than %{count} characters"
- one: "please make your status messages less than %{count} character"
- other: "please make your status messages less than %{count} characters"
- two: "please make your status messages less than %{count} characters"
- zero: "please make your status messages less than %{count} characters"
+ too_long: "{\"few\"=>\"please make your status messages less than %{count} characters\", \"many\"=>\"please make your status messages less than %{count} characters\", \"one\"=>\"please make your status messages less than %{count} character\", \"other\"=>\"please make your status messages less than %{count} characters\", \"two\"=>\"please make your status messages less than %{count} characters\", \"zero\"=>\"please make your status messages less than %{count} characters\"}"
stream_helper:
show_comments:
few: "Show %{count} more comments"
@@ -408,8 +450,12 @@ ms:
streams:
aspects:
title: "Your Aspects"
+ terms_and_conditions: "Terma dan Syarat"
+ undo: "Batalkan?"
+ username: "Nama Pengguna"
users:
edit:
close_account:
what_we_delete: "We delete all of your posts, profile data, as soon as humanly possible. Your comments will hang around, but be associated with your Diaspora Handle."
- your_handle: "Your diaspora id" \ No newline at end of file
+ your_handle: "Your diaspora id"
+ welcome: "Selamat datang!" \ No newline at end of file
diff --git a/config/locales/diaspora/nb.yml b/config/locales/diaspora/nb.yml
index 729ced5f5..df5849883 100644
--- a/config/locales/diaspora/nb.yml
+++ b/config/locales/diaspora/nb.yml
@@ -141,8 +141,6 @@ nb:
add_to_aspect:
failure: "Kunne ikke legge kontakt til aspektet."
success: "Kontakt lagt til aspekt."
- aspect_contacts:
- done_editing: "fullfør"
aspect_listings:
add_an_aspect: "+ Lag et nytt aspekt"
deselect_all: "Fjern alle valg"
@@ -161,23 +159,15 @@ nb:
failure: "%{Name} er ikke tom, og kunne ikke fjernes."
success: "%{name} har blitt fjerna."
edit:
- add_existing: "Legg til en eksisterende kontakt"
aspect_list_is_not_visible: "Kontakter i dette aspektet kan ikke se hverandre."
aspect_list_is_visible: "Kontakter i dette aspektet er i stand til å se hverandre."
confirm_remove_aspect: "Er du sikker på at du vil slette dette aspektet?"
- done: "Ferdig"
make_aspect_list_visible: "gjør aspektlisten synlig?"
- manage: "Administrer"
remove_aspect: "Slett dette aspektet"
rename: "endre navn"
set_visibility: "Sett synlighet"
update: "oppdater"
updating: "oppdaterer"
- few: "%{count} aspekter"
- helper:
- are_you_sure: "Er du sikker på at du vil slette dette aspektet?"
- aspect_not_empty: "Aspektet er ikke tomt"
- remove: "fjern"
index:
diaspora_id:
content_1: "diaspora* ID'en din er:"
@@ -218,11 +208,6 @@ nb:
heading: "Koble til tjenester"
unfollow_tag: "Slutt å følge #%{tag}"
welcome_to_diaspora: "Velkommen til Diaspora, %{name}!"
- many: "%{count} aspekter"
- move_contact:
- error: "Feil ved flytting av kontakt: %{inspect}"
- failure: "fungerte ikke % {inspisere}"
- success: "Person flyttet til nytt aspekt"
new:
create: "Opprett"
name: "Navn (bare synlig for deg)"
@@ -240,14 +225,6 @@ nb:
family: "Familie"
friends: "Venner"
work: "Jobb"
- selected_contacts:
- manage_your_aspects: "Håndter aspektene dine."
- no_contacts: "Du har ingen kontakter her enda."
- view_all_community_spotlight: "Se alle community spotlight"
- view_all_contacts: "Vis alle kontakter"
- show:
- edit_aspect: "endre aspekt"
- two: "%{count} aspekter"
update:
failure: "Aspektet ditt, %{name}, har for langt navn."
success: "Aspektet ditt, %{name}, har blitt endra."
@@ -267,36 +244,27 @@ nb:
post_success: "Postet! Lukker!"
cancel: "Avbryt"
comments:
- few: "%{count} kommentarer"
- many: "%{count} kommentarer"
new_comment:
comment: "Kommenter"
commenting: "Kommenterer ..."
one: "1 kommentar"
other: "%{count} kommentarer"
- two: "%{count} kommentarer"
zero: "ingen kommentarer"
contacts:
create:
failure: "Kunne ikke opprette kontakt"
- few: "%{count} kontakter"
index:
add_a_new_aspect: "Legg til nytt aspekt"
add_to_aspect: "Legg kontakter til %{name}"
- add_to_aspect_link: "Legg kontakter til %{name}"
all_contacts: "Alle Kontakter"
community_spotlight: "Fremhevet av Fellesskapet"
- many_people_are_you_sure: "Er du sikker på at du vil starte en privat samtale med flere enn %{suggested_limit} kontakter? Det kan være bedre å poste dette som et innlegg til dette aspektet. "
my_contacts: "Mine Kontakter"
no_contacts: "Ingen kontakter."
no_contacts_message: "Sjekk ut %{community_spotlight}"
- no_contacts_message_with_aspect: "Sjekk ut %{community_spotlight} eller %{add_to_aspect_link}"
only_sharing_with_me: "Deler bare med meg "
- remove_person_from_aspect: "Fjern %{person_name} fra «%{aspect_name}»"
start_a_conversation: "Start en samtale"
title: "Kontakter"
your_contacts: "Dine kontakter"
- many: "%{count} kontakter"
one: "1 kontakt"
other: "%{count} kontakter"
sharing:
@@ -304,7 +272,6 @@ nb:
spotlight:
community_spotlight: "Fremhevet av Fellesskapet"
suggest_member: "Forslå et nytt medlem"
- two: "%{count} kontakter"
zero: "ingen kontakter"
conversations:
conversation:
@@ -313,8 +280,6 @@ nb:
fail: "Ugyldig melding"
no_contact: "Heisann, du må legge til kontakten først."
sent: "Melding sendt"
- destroy:
- success: "Samtale fjernet"
helper:
new_messages:
few: "%{count} nye meldinger"
@@ -813,7 +778,6 @@ nb:
add_contact_from_tag: "legg til kontakt fra tag"
aspect_list:
edit_membership: "endre aspektmedlemskap"
- few: "%{count} personer"
helper:
is_not_sharing: "%{name} deler ikke med deg"
is_sharing: "%{name} deler med deg"
@@ -827,7 +791,6 @@ nb:
search_handle: "Benytt diaspora* ID (brukernavn@pod.tid) for å finne dine venner."
searching: "Søker. Vennligst vent ..."
send_invite: "Finner fremdeles ikke de du søker? Send en invitasjon!"
- many: "%{count} personer"
one: "1 person"
other: "%{count} personer"
person:
@@ -864,7 +827,6 @@ nb:
add_some: "legg til noen"
edit: "endre"
you_have_no_tags: "du har ingen tags!"
- two: "%{count} personer"
webfinger:
fail: "Beklager, vi kunne ikke finne %{handle}."
zero: "ingen personer"
@@ -962,15 +924,12 @@ nb:
update: "Oppdater"
invalid_invite: "Invitasjonslenken som du anga er ikke gyldig lenger!"
new:
- continue: "Fortsett"
create_my_account: "Opprett min konto!"
- diaspora: "<3 diaspora*"
email: "E-POST"
enter_email: "Skriv en e-post"
enter_password: "Skriv inn et passord"
enter_password_again: "Skriv inn samme passord som før"
enter_username: "Velg et brukernavn (kun bokstaver, nummer og understreker)"
- hey_make: "HALLO,<br/>LAG<br/>ET ELLER ANNET."
join_the_movement: "Bli med i nettverket!"
password: "PASSORD"
password_confirmation: "PASSORDBEKREFTELSE"
@@ -1169,13 +1128,7 @@ nb:
no_message_to_display: "Ingen melding å vise."
new:
mentioning: "Nevner: %{person}"
- too_long:
- few: "du bør begrense statusmeldingene dine til %{count} tegn"
- many: "Du bør begrense statusmeldingene dine til %{count} characters"
- one: "du bør begrense statusmeldingene dine til %{count} tegn"
- other: "du må gjøre statusmeldingene dine kortere enn %{count} tegn"
- two: "vær så snill og skriv statusoppdateringer som er under %{count} tegn"
- zero: "Statusmeldinger må være lengre enn ingenting."
+ too_long: "{\"few\"=>\"du bør begrense statusmeldingene dine til %{count} tegn\", \"many\"=>\"Du bør begrense statusmeldingene dine til %{count} characters\", \"one\"=>\"du bør begrense statusmeldingene dine til %{count} tegn\", \"other\"=>\"du må gjøre statusmeldingene dine kortere enn %{count} tegn\", \"two\"=>\"vær så snill og skriv statusoppdateringer som er under %{count} tegn\", \"zero\"=>\"Statusmeldinger må være lengre enn ingenting.\"}"
stream_helper:
hide_comments: "Skjul kommentarer"
show_comments:
@@ -1213,7 +1166,6 @@ nb:
title: "Offentlig aktivitet"
tags:
contacts_title: "Personer som liker denne tag"
- tag_prefill_text: "Greia med %{tag_name} er ... "
title: "Innlegg med tags: %{tags}"
tag_followings:
create:
@@ -1226,15 +1178,8 @@ nb:
tags:
show:
follow: "Følg #%{tag}"
- followed_by_people:
- one: "fulgt av en person"
- other: "fulgt av %{count} personer"
- zero: "ikke fulgt av noen"
following: "Følger #%{tag}"
- nobody_talking: "Ingen snakker om %{tag} ennå."
none: "Den tomme tag'en eksisterer ikke."
- people_tagged_with: "Personer tagget med %{tag}"
- posts_tagged_with: "Innlegg tagget med #%{tag}"
stop_following: "Slutt å følge #%{tag}"
terms_and_conditions: "Vilkår og begrensninger"
undo: "Angre?"
@@ -1270,7 +1215,6 @@ nb:
current_password: "Nåverende passord"
current_password_expl: "den som du logger på med ..."
download_photos: "last ned mine bilder"
- download_xml: "last ned min xml"
edit_account: "Endre konto"
email_awaiting_confirmation: "We have sent you an activation link to %{unconfirmed_email}. Till you follow this link and activate the new address, we will continue to use your original address %{email}."
export_data: "Eksporter Data"
@@ -1279,7 +1223,6 @@ nb:
liked: "noen liker innlegget ditt"
mentioned: "du er omtalt i et innlegg"
new_password: "Nytt Passord"
- photo_export_unavailable: "Eksportering av bilder er for øyeblikket utilgjengelig"
private_message: "du har mottatt en privat melding"
receive_email_notifications: "Motta varsler på e-post når:"
reshared: "noen delte ditt innlegg"
diff --git a/config/locales/diaspora/nds.yml b/config/locales/diaspora/nds.yml
new file mode 100644
index 000000000..c657fda13
--- /dev/null
+++ b/config/locales/diaspora/nds.yml
@@ -0,0 +1,997 @@
+# Copyright (c) 2010-2013, Diaspora Inc. This file is
+# licensed under the Affero General Public License version 3 or later. See
+# the COPYRIGHT file.
+
+
+
+nds:
+ _applications: "Programme"
+ _comments: "Kommentore"
+ _contacts: "Kontakte"
+ _help: "Hülp"
+ _home: "Startsiet"
+ _photos: "Biller"
+ _services: "Deenste"
+ account: "Konto"
+ activerecord:
+ errors:
+ models:
+ contact:
+ attributes:
+ person_id:
+ taken: "mut ünner de Kontakte von dissen Bruker eendüdig ween."
+ person:
+ attributes:
+ diaspora_handle:
+ taken: "is schon vergeven"
+ request:
+ attributes:
+ from_id:
+ taken: "is een Dubbel von een Anfroog, de dat schon gift."
+ reshare:
+ attributes:
+ root_guid:
+ taken: "Teemlich good, wat? Du hest dissen Bidrag all wiederseggt!"
+ user:
+ attributes:
+ email:
+ taken: "is schon vergeven"
+ person:
+ invalid: "is ungüllig."
+ username:
+ invalid: "is ungüllig. Wi erlauvt nur Bookstaven, Nummern und Ünnerstreeke."
+ taken: "is schon vergeven."
+ admins:
+ admin_bar:
+ correlations: "Korrelationen"
+ pages: "Sieten"
+ pod_stats: "Podstatistiken"
+ user_search: "Brukersök"
+ weekly_user_stats: "Weekentliche Brukerstatistiken"
+ correlations:
+ correlations_count: "Korrelationen mit Amelldungstohl:"
+ stats:
+ 2weeks: "Twee Weken"
+ 50_most: "De 50 an meisten benutzten Tags"
+ comments:
+ one: "Een Kommentor"
+ other: "%{count} Kommentore"
+ zero: "Keene Kommentore"
+ daily: "Dag för Dag"
+ display_results: "Zeig Resultate von dat <b>%{segment}</b> Segment"
+ go: "Los"
+ month: "Monat"
+ posts:
+ one: "Een Bidrag"
+ other: "%{count} Bidräg"
+ zero: "Keene Bidräg"
+ shares:
+ one: "Een mol deelt"
+ other: "%{count} mol deelt"
+ zero: "Noch nich deelt."
+ usage_statistic: "Nutzungsstatistiken"
+ users:
+ one: "Een Benutter"
+ other: "%{count} Benutter"
+ zero: "Keene Benutter"
+ week: "Week"
+ user_entry:
+ guid: "GUID"
+ id: "ID"
+ ? "no"
+ : nee
+ nsfw: "#nsfw"
+ ? "yes"
+ : ja
+ user_search:
+ add_invites: "Inladungen dortodoon"
+ close_account: "Konto sluten"
+ email_to: "E-Mail-Adress ton Inladen"
+ under_13: "Zeig Benutters ünner 13 (COPPA)"
+ users:
+ one: "Een Benutter funnen"
+ other: "%{count} Benutter funnen"
+ zero: "Keen Benutter funnen"
+ view_profile: "Profil ankieken"
+ you_currently:
+ one: "Du hest noch eene Inladung öber %{link}"
+ other: "Du hest noch %{count} Inladungen öber %{link}"
+ zero: "Du hest graad keene Inladungen mehr öber %{link}"
+ weekly_user_stats:
+ amount_of:
+ one: "Antohl von nee’e Benutter in disse Week: Een"
+ other: "Antohl von nee’e Benutter in disse Week: %{count}"
+ zero: "Antohl von nee’e Benutter in disse Week: keene"
+ current_server: "Dat Serverdatum is graad %{date}"
+ ago: "%{time} her"
+ all_aspects: "All Aspekte"
+ application:
+ helper:
+ unknown_person: "Unbekannte Person"
+ video_title:
+ unknown: "Unbekannte Videotitel"
+ are_you_sure: "Bist du sicher?"
+ are_you_sure_delete_account: "Bist du di seker, dat du dien Konto tomoken wist? Dat kanns du nich rückgängig moken!"
+ aspect_memberships:
+ destroy:
+ failure: "Kunn Person nich ut’n Aspekt rutdaun."
+ no_membership: "Kunn de utwählte Person nich in den Aspekt finnen."
+ success: "Person erfolgriek ut’n Aspekt rutdoon."
+ aspects:
+ add_to_aspect:
+ failure: "Kunn Kontakt nich ton Aspekt dortodoon."
+ success: "Kontakt erfolgriek ton Aspekt dortodaan."
+ aspect_listings:
+ add_an_aspect: "+ Een Aspekt dortodoon"
+ deselect_all: "All afwählen"
+ edit_aspect: "%{name} bearbeiden"
+ select_all: "All utwählen"
+ aspect_stream:
+ make_something: "Mok wat"
+ stay_updated: "Bliev op den neesten Stand"
+ stay_updated_explanation: "Dien Hauptstream warrd mit all diene Kontakte, de Tags de du folgst und Bidräg von een poor kreative Lüü ut de Gemeenschaft füllt."
+ contacts_not_visible: "Kontakte in dissen Aspekt warrd sick gegensiedich nich seihn künnen."
+ contacts_visible: "Kontakte in dissen Aspekt warrd sick gegensiedich seihn künnen."
+ create:
+ failure: "Kunn Aspekt nich anleggen."
+ success: "Dien nee’en Aspekt %{name} is anleggt worrn."
+ destroy:
+ failure: "%{name} is nich leer un kunn nich wegmakt warrn."
+ success: "%{name} is erfolgriek wegmakt worrn."
+ edit:
+ aspect_list_is_not_visible: "Kontakte in dissen Aspekt künnt sick nich gegensiedich seihn."
+ aspect_list_is_visible: "Kontakte in dissen Aspekt künnt sick gegensiedich seihn."
+ confirm_remove_aspect: "Bist du seker, dat du dissen Aspekt löschen wist?"
+ make_aspect_list_visible: "Kontakte in dissen Aspekt to sick sülbst sichtbor moken?"
+ remove_aspect: "Dissen Aspekt löschen"
+ rename: "Ümnömen"
+ update: "Opfrischen"
+ updating: "Opfrischen"
+ index:
+ diaspora_id:
+ content_1: "Diene diaspora*-ID is:"
+ content_2: "Geev ehr to annere Lüü, dormit se di op diaspora* finnen künnt."
+ heading: "diaspora*-ID"
+ donate: "Spennen"
+ handle_explanation: "Dit is diene diaspora*-ID. Wie eene E-Mail-Adress kannst du ehr an annere Lüü geven, dormit se di erreichen künnt."
+ help:
+ any_problem: "Irgendwelche Probleme?"
+ do_you: "Hest du:"
+ email_feedback: "Diene Meenung per %{link}"
+ email_link: "E-Mail"
+ feature_suggestion: "... een Vörslag för eene nee’e %{link}?"
+ find_a_bug: "... een %{link} funnen?"
+ have_a_question: "... eene %{link}?"
+ here_to_help: "De diaspora*-Gemeenschaft is för di dor!"
+ need_help: "Brukst du Hülp?"
+ tag_bug: "Fehler"
+ tag_feature: "Funktion"
+ tag_question: "Froog"
+ tutorial_link_text: "Anleidungen"
+ tutorials_and_wiki: "%{faq}, %{tutorial} un %{wiki}: Hülp för diene eersten Schritte"
+ introduce_yourself: "Dit is dien Stream. Leg los un stell di vör."
+ new_here:
+ follow: "Folg %{link} un begrööt nee’e Benutters op diaspora*!"
+ learn_more: "Mehr rutkriegen"
+ title: "Begrööt nee’e Benutters"
+ no_contacts: "Keene Kontakte"
+ no_tags: "+ Een Tag ton Folgen finnen"
+ people_sharing_with_you: "Lüü de mit di deelt"
+ post_a_message: "Verfat een Bidrag >>"
+ services:
+ content: "Du kanns disse Deenste mit diaspora* verbinnen:"
+ heading: "Verbinn Deenste"
+ unfollow_tag: "Ophören, #%{tag} to folgen"
+ welcome_to_diaspora: "Willkomen to diaspora*, %{name}!"
+ new:
+ create: "Anleggen"
+ name: "Naam (nur för di sichtbor)"
+ no_contacts_message:
+ or_spotlight: "Or du kanns mit den %{link} deelen"
+ try_adding_some_more_contacts: "Du kanns mehr Kontakte söken or inladen."
+ you_should_add_some_more_contacts: "Du schust een poor mehr Kontakte sluten!"
+ no_posts_message:
+ start_talking: "Noch keener hett wat seggt!"
+ one: "een Aspekt"
+ other: "%{count} Aspekte"
+ seed:
+ acquaintances: "Bekannte"
+ family: "Familie"
+ friends: "Frünnen"
+ work: "Arbeit"
+ update:
+ failure: "De Naam von dien Aspekt, %{name}, wöör to lang ton Spiekern."
+ success: "Dien Aspekt, %{name}, is erfolgriek ännert worrn."
+ zero: "Keene Aspekte"
+ back: "Trüch"
+ blocks:
+ create:
+ failure: "Ik kunn dissen Bruker nich ignoreren. #evasion"
+ success: "Allns kloor, du warrst dissen Bruker nich mehr in dien Stream seihn. #silencio!"
+ destroy:
+ failure: "Ik kunn nich ophören, den Bruker to ignoreren. #evasion"
+ success: "Loot us man kieken, wat de to seggen hebbt! #segghallo"
+ bookmarklet:
+ explanation: "Verfat nee’e Bidräg von öberall, indem du dissen Link to diene Leseteken dortodeist => %{link}"
+ heading: "Leseteken."
+ post_something: "Schriev wat in diaspora*"
+ post_success: "Verfat! Mok to!"
+ cancel: "afbreken"
+ comments:
+ new_comment:
+ comment: "Kommenteren"
+ commenting: "Kommentere..."
+ one: "een Kommentor"
+ other: "%{count} Kommentore"
+ zero: "Keene Kommentore"
+ contacts:
+ create:
+ failure: "Kunn keen Kontakt sluten"
+ index:
+ add_a_new_aspect: "Do een nee’en Kontakt dorto"
+ add_contact: "Kontakt sluten"
+ add_to_aspect: "Kontakte to %{name} dortodoon"
+ all_contacts: "Alle Kontakte"
+ my_contacts: "Miene Kontakte"
+ no_contacts: "Süht so ut, as op du een poor mehr Kontakte sluten muss!"
+ no_contacts_message: "Bekiek doch mal dat %{community_spotlight}"
+ only_sharing_with_me: "Nur mit di deelende"
+ start_a_conversation: "Fang een Snack an"
+ title: "Kontakte"
+ your_contacts: "Diene Kontakte"
+ one: "een Kontakt"
+ other: "%{count} Kontakte"
+ sharing:
+ people_sharing: "Lüü, de mit di deelt:"
+ spotlight:
+ suggest_member: "Slag wen vör"
+ zero: "Keene Kontakte"
+ conversations:
+ conversation:
+ participants: "Bedeeligte"
+ create:
+ fail: "Ungüllige Naricht"
+ no_contact: "He, du muss erst Kontakt sluten!"
+ sent: "Naricht afschickt"
+ helper:
+ new_messages:
+ one: "Eene nee’e Naricht"
+ other: "%{count} nee’e Narichten"
+ zero: "Keene nee’en Narichten"
+ index:
+ inbox: "Ingang"
+ no_conversation_selected: "Keen Snack utwählt"
+ no_messages: "Keene Narichten"
+ new:
+ abandon_changes: "Ännerungen wegsmieten?"
+ send: "Schicken"
+ sending: "Schicken..."
+ subject: "Saak"
+ to: "An"
+ new_conversation:
+ fail: "Ungüllige Naricht"
+ show:
+ delete: "Snack löschen"
+ reply: "Antwoorden"
+ replying: "antwoord..."
+ delete: "Löschen"
+ email: "E-Mail"
+ error_messages:
+ helper:
+ correct_the_following_errors_and_try_again: "Kiek mol de folgenden Fehler dörch und versök dat nochmol."
+ invalid_fields: "Ungüllige Feller"
+ login_try_again: "Bidde <a href='%{login_link}'>meld di an</a> un versök dat nochmol."
+ post_not_public: "De Bidrag, den du versökst, di antokieken, is nich opentlich!"
+ fill_me_out: "Füll mi ut"
+ find_people: "Lüü or #Tags finnen"
+ help:
+ account_and_data_management:
+ data_other_podmins_q: "Künnt de Administrateren von annere Pods miene Informationen seihn?"
+ data_visible_to_podmin_q: "Wie veel von miene Informationen kann de Pod-Administrator seihn?"
+ title: "Konto- un Datenverwaltung"
+ aspects:
+ change_aspect_of_post_q: "Kann ik de Aspekte ännern, de een Bidrag seen künnt, wenn ik em schon afschickt heb?"
+ contacts_know_aspect_q: "Weet miene Kontakte, in welche Aspekte ik jüm doon heb?"
+ contacts_visible_q: "Wat heet „Kontakte in dissen Aspekt to sick sülbst sichtbor moken“?"
+ delete_aspect_q: "Wie lösch ik een Aspekt?"
+ person_multiple_aspects_q: "Kann ik eene Person in mehrere Aspekte doon?"
+ post_multiple_aspects_q: "Kann ik Inhalt an mehrere Aspekte mit eens verfaten?"
+ remove_notification_a: "Nee."
+ remove_notification_q: "Wenn ik wen ut een or mehrere von miene Aspekte rutdoo, ward he doröber benarichtigt?"
+ rename_aspect_q: "Kann ik een Aspekt ümnömen?"
+ title: "Aspekte"
+ what_is_an_aspect_q: "Wat is een Aspekt?"
+ who_sees_post_q: "Wer sütt dat, wenn ik wat an bestimmte Aspekte verfat?"
+ getting_help:
+ get_support_a_hashtag: "froog in een opentlichen Bidrag op diaspora* mit den %{question} Hashtag"
+ get_support_a_irc: "komm to us in den %{irc} (Echttied-Tippsnack)"
+ get_support_a_tutorials: "bekiek unsere %{tutorials}"
+ get_support_a_website: "bekiek unsere %{link}"
+ get_support_a_wiki: "sök in dat %{link}"
+ get_support_q: "Wat, wenn de FAQ miene Froog nich beantwoord? Wo kann ik noch Hülp kriegen?"
+ getting_started_a: "Du hest Glück. Probeer de %{tutorial_series} op unsere Projektsiet ut. De warrd die Schritt för Schritt dörch de Registreerung föhren un die all de grundlegenden Saaken bibringen, de du öber dat Bruken von diaspora* weten muss."
+ getting_started_q: "Hülp! Ik bruk een beten grundlegende Hülp, üm lostoleggen!"
+ title: "Krieg Hülp"
+ here: "hier"
+ irc: "IRC"
+ markdown: "Markdown"
+ mentions:
+ how_to_mention_q: "Wie kann ik wen erwähnen, wenn ik een Bidrag schriev?"
+ mention_in_comment_a: "Nee, graad nich."
+ mention_in_comment_q: "Kann ik wen in een Kommentar erwähnen?"
+ see_mentions_q: "Gift dat eene Mööglichkeit, de Bidräg to seen, in de ik erwähnt worn bin?"
+ title: "Erwähnungen"
+ what_is_a_mention_q: "Wat is eene „Erwähnung“?"
+ miscellaneous:
+ photo_albums_q: "Gift dat Biller- or Videoalben?"
+ title: "Verschedenes"
+ pods:
+ title: "Pods"
+ what_is_a_pod_q: "Wat is een Pod?"
+ posts_and_posting:
+ character_limit_a: "65.535 Teken. Dat sünd 65.395 Teken mehr as op Twitter! ;)"
+ character_limit_q: "Wat is de Tekenbegrenzung för Bidräg?"
+ image_text: "Bildtext"
+ image_url: "Bildadress"
+ insert_images_q: "Wie kann ik Biller in miene Bidräg bringen?"
+ size_of_images_q: "Kann ik de Grött von Biller in Bidräg or Kommantore ännern?"
+ title: "Bidräg un Verfaten"
+ private_posts:
+ can_reshare_q: "Wer kann mien privaten Bidrag wiederseggen?"
+ title: "Private Bidräg"
+ public_posts:
+ find_public_post_q: "Wie künnt annere Lüü miene opentlichen Bidräg finnen?"
+ title: "Opentliche Bidräg"
+ public_profiles:
+ title: "Opentliche Profile"
+ who_sees_profile_q: "Wer sütt mien opentliches Profil?"
+ resharing_posts:
+ title: "Wiederseggen von Bidräg"
+ sharing:
+ title: "Deelen"
+ tags:
+ title: "Tags"
+ third_party_tools: "Drittanbeederwarktüüch"
+ title_header: "Hülp"
+ tutorial: "Anleidung"
+ tutorials: "Anleidungen"
+ wiki: "Wiki"
+ hide: "versteken"
+ ignore: "Ignoreren"
+ invitation_codes:
+ excited: "%{name} is hen un weg, di hier to seihn."
+ invitations:
+ a_facebook_user: "Een Facebook-Benutter"
+ check_token:
+ not_found: "Inladungstoken nich funnen"
+ create:
+ already_contacts: "Du bist schon mit disse Person verbunnen"
+ already_sent: "Du hest disse Person schon inlad."
+ empty: "Bidde geev minstens eene E-Mail-Adress in."
+ no_more: "Du kannst keene Inladungen mehr schicken."
+ note_already_sent: "Inladungen sind schon schickt worrn an: %{emails}"
+ own_address: "Du kanns keene Inladung an diene egene Adress schicken."
+ rejected: "Bi disse E-Mail-Adressen geev dat Probleme: "
+ sent: "Inladungen sind schickt worrn an: %{emails}"
+ edit:
+ accept_your_invitation: "Nimm diene Inladung an"
+ your_account_awaits: "Dien Konto töövt op di!"
+ new:
+ already_invited: "Disse Lüü hebbt diene Inladung nich annommen:"
+ aspect: "Aspekt"
+ check_out_diaspora: "Bekiek mal diaspora*!"
+ codes_left:
+ one: "Eene Inladung op dissen Code öber"
+ other: "%{count} Inladungen op dissen Code öber"
+ zero: "Keene Inladungen op dissen Code öber"
+ comma_separated_plz: "Du kanns mehrere E-Mail-Adressen dörch Kommas trennt ingeben."
+ if_they_accept_info: "wenn se annehmt, warrd se von sülbst to den Aspekt dortodoon, in den du jüm inlad hest."
+ invite_someone_to_join: "Lad eenen to diaspora* in!"
+ language: "Sprook"
+ paste_link: "Deel dissen Link mit diene Frünnen oder schick jüm direkt een Nettbreef dormit, üm jüm to diaspora* intoladen."
+ personal_message: "Persönliche Naricht"
+ resend: "Nochmool schicken"
+ send_an_invitation: "Eene Inladung schicken"
+ send_invitation: "Inladung afschicken"
+ sending_invitation: "Schick Inladung..."
+ to: "An"
+ layouts:
+ application:
+ back_to_top: "Trüch no boben"
+ powered_by: "Andreven von diaspora*"
+ public_feed: "Opentliche diaspora*-Feed för %{name}"
+ source_package: "lad dat Quellcodepaket rünner"
+ toggle: "Mobile Ansicht ümschalten"
+ whats_new: "Wat gift dat Nee’es?"
+ your_aspects: "Diene Aspekte"
+ header:
+ admin: "Admin"
+ blog: "Blog"
+ code: "Code"
+ help: "Hülp"
+ login: "Anmellen"
+ logout: "Afmellen"
+ profile: "Profil"
+ recent_notifications: "Letzte Benarichtigungen"
+ settings: "Instellungen"
+ view_all: "All ankieken"
+ likes:
+ likes:
+ people_dislike_this:
+ one: "Eener mag dat nich"
+ other: "%{count} Lü mögt dat nich"
+ zero: "Keener mag dat nich"
+ people_like_this:
+ one: "Eener mag dat"
+ other: "%{count} Lü mögt dat"
+ zero: "Keener mag dat"
+ people_like_this_comment:
+ one: "Eener mag dissen Kommentor"
+ other: "%{count} Lü mögt dissen Kommentor"
+ zero: "Keener mag dissen Kommentor"
+ limited: "Inschränkt"
+ more: "Mehr"
+ next: "Neegste"
+ no_results: "Keene Resultate funnen"
+ notifications:
+ also_commented:
+ one: "%{actors} hett ok %{post_author}s Bidrag %{post_link} kommenteert."
+ other: "%{actors} hebbt ok %{post_author}s Bidrag %{post_link} kommenteert."
+ zero: "Keener hett ok %{post_author}s Bidrag %{post_link} kommenteert."
+ also_commented_deleted:
+ one: "%{actors} hett een löschten Bidrag kommenteert."
+ other: "%{actors} hebbt een löschten Bidrag kommenteert."
+ zero: "Keener hett een löschten Bidrag kommenteert."
+ comment_on_post:
+ one: "%{actors} hett dien Bidrag %{post_link} kommenteert."
+ other: "%{actors} hebbt dien Bidrag %{post_link} kommenteert."
+ zero: "Keener hett dien Bidrag %{post_link} kommenteert."
+ helper:
+ new_notifications:
+ one: "Eene nee’e Benarichtigung"
+ other: "%{count} nee’e Benarichtigungen"
+ zero: "Keene nee’en Benarichtigungen"
+ index:
+ all_notifications: "Alle Benarichtigungen"
+ and: "un"
+ and_others:
+ one: "un noch een"
+ other: "un %{count} annere"
+ zero: "un sonst keener"
+ mark_all_as_read: "All as lesen markeren"
+ mark_unread: "As unlesen markeren"
+ notifications: "Benarichtigungen"
+ liked:
+ one: "%{actors} mag dien Bidrag %{post_link}."
+ other: "%{actors} mögt dien Bidrag %{post_link}."
+ zero: "Keener mag dien Bidrag %{post_link}."
+ liked_post_deleted:
+ one: "%{actors} mag dien löschten Bidrag."
+ other: "%{actors} mögt dien löschten Bidrag."
+ zero: "Keener mag dien löschten Bidrag."
+ mentioned:
+ one: "%{actors} hett di in den Bidrag %{post_link} erwähnt."
+ other: "%{actors} hebbt di in den Bidrag %{post_link} erwähnt."
+ zero: "Keener hett di in den Bidrag %{post_link} erwähnt."
+ mentioned_deleted:
+ one: "%{actors} hett di in een löschten Bidrag erwähnt."
+ other: "%{actors} hebbt di in een löschten Bidrag erwähnt."
+ zero: "Keener hett di in een löschten Bidrag erwähnt."
+ post: "Bidrag"
+ private_message:
+ one: "%{actors} hett di eene Naricht schickt"
+ other: "%{actors} hebbt di eene Naricht schickt"
+ zero: "Keener hett di eene Naricht schickt"
+ reshared:
+ one: "%{actors} hett dien Bidrag %{post_link} wiederseggt."
+ other: "%{actors} hebbt dien Bidrag %{post_link} wiederseggt."
+ zero: "Keener hett dien Bidrag %{post_link} wiederseggt."
+ reshared_post_deleted:
+ one: "%{actors} hett dien löschten Bidrag wiederseggt."
+ other: "%{actors} hebbt dien löschten Bidrag wiederseggt."
+ zero: "Keener hett dien löschten Bidrag wiederseggt."
+ started_sharing:
+ one: "%{actors} hett anfungen, mit di to deelen"
+ other: "%{actors} hebbt anfungen, mit di to deelen"
+ zero: "Keener hett anfungen, mit di to deelen"
+ notifier:
+ a_post_you_shared: "een Bidrag."
+ accept_invite: "Nimm diene diaspora*-Inladung an!"
+ click_here: "klick hier"
+ comment_on_post:
+ reply: "%{name}s Bidrag antwoorden or ankieken >"
+ confirm_email:
+ click_link: "Bidde folg dissen Link, üm diene nee’e E-Mail-Adress %{unconfirmed_email} in gang to setten:"
+ subject: "Bidde set diene nee’e E-Mail-Adress %{unconfirmed_email} in gang"
+ email_sent_by_diaspora: "Disse E-Mail is von %{pod_name} schickt worrn. Wenn du keene seuke E-Mails mehr kriegen wist,"
+ hello: "Hallo %{name}!"
+ invite:
+ message: |-
+ Hallo!
+
+ Du bist inlad worrn, op diaspora* to kommen!
+
+ Klick op dissen Link, üm antofangen
+
+ [%{invite_url}][1]
+
+
+ Alles Leeve,
+
+ De E-Mail-Roboter von diaspora*!
+
+ [1]: %{invite_url}
+ invited_you: "%{name} hett di to diaspora* inlad."
+ liked:
+ liked: "%{name} mag dien Bidrag"
+ view_post: "Bidrag ankieken >"
+ mentioned:
+ mentioned: "hett di in een Bidrag erwähnt:"
+ subject: "%{name} hett di op diaspora* erwähnt"
+ private_message:
+ reply_to_or_view: "Dissen Snack antwoorden or ankieken >"
+ reshared:
+ reshared: "%{name} hett dien Bidrag wiederseggt"
+ view_post: "Bidrag ankieken >"
+ single_admin:
+ admin: "Dien diaspora*-Administrater"
+ subject: "Eene Naricht öber dien diaspora*-Konto:"
+ started_sharing:
+ sharing: "hett anfungen, mit di to deelen!"
+ subject: "%{name} hett anfungen, mit di op diaspora* to deelen"
+ view_profile: "%{name}s Profil ankieken"
+ thanks: "Danke,"
+ to_change_your_notification_settings: "üm diene Benarichtigungsinstellungen to ännern"
+ nsfw: "NSFW (unpassend för den Arbeidsplatz)"
+ ok: "OK"
+ or: "or"
+ password: "Passwoort"
+ password_confirmation: "Passwoortbestätigung"
+ people:
+ add_contact:
+ invited_by: "Du bist inladen worrn von"
+ add_contact_small:
+ add_contact_from_tag: "Kontakt öber een Hashtag sluten"
+ aspect_list:
+ edit_membership: "Aspekttogehörigkeit ännern"
+ helper:
+ is_not_sharing: "%{name} deelt nich mit di"
+ is_sharing: "%{name} deelt mit di"
+ results_for: " Resultate för %{params}"
+ index:
+ looking_for: "Sökst du no Bidräg, de mit %{tag_link} taggt sind?"
+ no_one_found: "...un nix is funnen worrn."
+ no_results: "He! Du muss no wat söken."
+ results_for: "%{search_term} entsprekende Benutter"
+ searching: "sök, bidde wees geduldig..."
+ one: "eene Person"
+ other: "%{count} Lüü"
+ person:
+ add_contact: "Kontakt sluten"
+ already_connected: "Schon verbunnen"
+ pending_request: "Utstohnde Anfroog"
+ thats_you: "Dat bist du!"
+ profile_sidebar:
+ bio: "Beschriebung"
+ born: "Geburtsdag"
+ edit_my_profile: "Mien Profil ännern"
+ gender: "Geschlecht"
+ in_aspects: "in Aspekte"
+ location: "Ort"
+ photos: "Biller"
+ remove_contact: "Kontakt wegmaken"
+ remove_from: "%{name} ut %{aspect} wegmaken?"
+ show:
+ closed_account: "Dit Konto is tomokt worrn."
+ does_not_exist: "De Person gift dat nich!"
+ has_not_shared_with_you_yet: "%{name} hett noch keene Bidräg mit di deelt!"
+ ignoring: "Du ignoreerst alle Bidräg von %{name}."
+ incoming_request: "%{name} will mit di deelen"
+ mention: "Erwähnung"
+ message: "Naricht"
+ not_connected: "Du deels nich mit disse Person"
+ recent_posts: "Letzte Bidräg"
+ recent_public_posts: "Letzte Opentliche Bidräg"
+ return_to_aspects: "Trüch to diene Aspekte-Siet"
+ see_all: "Alle ankieken"
+ start_sharing: "mit Deelen anfangen"
+ to_accept_or_ignore: "üm dat antonehmen or to ignoreren."
+ sub_header:
+ add_some: "do een poor dorto"
+ edit: "ännern"
+ you_have_no_tags: "du hest keene Tags!"
+ webfinger:
+ fail: "Deit mi leed, wi kunnen %{handle} nich finnen."
+ zero: "keene Lüü"
+ photos:
+ comment_email_subject: "%{name}s Bild"
+ create:
+ integrity_error: "Hoochladen von dat Bild fehlslaan. Bist du seker, dat dat een Bild wöör?"
+ runtime_error: "Hoochladen von dat Bild fehlslaan. Bist du seker, dat du di ansnallt hest?"
+ type_error: "Hoochladen von dat Bild fehlslaan. Bist du seker, dat du een Bild dortodoon hest?"
+ destroy:
+ notice: "Bild löscht."
+ edit:
+ editing: "Änner"
+ new:
+ back_to_list: "Trüch to de Liste"
+ new_photo: "Nee’es Bild"
+ post_it: "verfat dat!"
+ new_photo:
+ empty: "{file} is leer, bidde wähl de Dateien noch mol ohne er ut."
+ invalid_ext: "{file} hett een ungülliges Enn. Nur {extensions} sind erlaubt."
+ size_error: "{file} is to groot, Dateien dröfft höchstens {sizeLimit} groot ween."
+ new_profile_photo:
+ or_select_one_existing: "or een von de %{photos} utwählen, de du schon hoochlad hest."
+ upload: "Nee’es Profilbild hoochladen!"
+ photo:
+ view_all: "Alle Biller von%{name} ankieken"
+ show:
+ collection_permalink: "Permalink to disse Sammlung"
+ delete_photo: "Bild löschen"
+ edit: "ännern"
+ edit_delete_photo: "Bildbeschriebung ännern / Bild löschen"
+ make_profile_photo: "as Profilbild bruken"
+ show_original_post: "Originalbidrag anzeigen"
+ update_photo: "Bild opfrischen"
+ update:
+ error: "Kunn Bild nich ännern."
+ notice: "Bild is erfolgriek opfrischt worrn."
+ posts:
+ presenter:
+ title: "Een Bidrag von %{name}"
+ show:
+ destroy: "Löschen"
+ not_found: "Deit mi leed, wi kunnen den Bidrag nich finnen."
+ permalink: "Permalink"
+ photos_by:
+ one: "Een Bild von %{author}"
+ other: "%{count} Biller von %{author}"
+ zero: "Keene Biller von %{author}"
+ reshare_by: "Wiederseggt von %{author}"
+ previous: "Vörherige"
+ privacy: "Privatsphäre"
+ privacy_policy: "Datenschutz"
+ profile: "Profil"
+ profiles:
+ edit:
+ allow_search: "Lüü erlauben, op diaspora* no di to söken"
+ edit_profile: "Profil ännern"
+ first_name: "Vörnaam"
+ last_name: "Nonaam"
+ update_profile: "Bild opfrischen"
+ your_bio: "Diene Beschriebung"
+ your_birthday: "Dien Geburtsdag"
+ your_gender: "Dien Geschlecht"
+ your_location: "Dien Ort"
+ your_name: "Dien Naam"
+ your_photo: "Dien Bild"
+ your_private_profile: "Dien privates Profil"
+ your_public_profile: "Dien opentliches Profil"
+ your_tags: "Beschriev di sülbst in fiev Wüür"
+ your_tags_placeholder: "to’n Bispel #Filme #Katten #Reisen #Lehrer #NewYork"
+ update:
+ failed: "Kunn Profil nich opfrischen"
+ updated: "Profil opfrischt"
+ public: "Opentlich"
+ reactions:
+ one: "Eene Reaktion"
+ other: "%{count} Reaktionen"
+ zero: "Keene Reaktionen"
+ registrations:
+ closed: "Registrerungen sind op dissen diaspora*-Pod sloten."
+ create:
+ success: "Du bist nu bi diaspora*!"
+ edit:
+ cancel_my_account: "Slut mien Konto"
+ edit: "%{name} ännern"
+ leave_blank: "(lot dat leer, wenn du dat nich ännern wist)"
+ password_to_confirm: "(wi brukt dien jetziges Passwoort, üm de Ännerung to bestätigen)"
+ unhappy: "Unglücklich?"
+ update: "Ännern"
+ invalid_invite: "Dien Inladungslink is nich mehr güllig!"
+ new:
+ create_my_account: "Legg mien Konto an!"
+ email: "E-MAIL-ADRESS"
+ enter_email: "Geev een E-Mail-Adress in"
+ enter_password: "Geev een Passwoort in (minnens söss Teken)"
+ enter_password_again: "Geev dat glieke Passwoort wie vörher in"
+ enter_username: "Sök di een Benutternaam ut (nur Bookstaven, Nummern un Ünnerstreeke)"
+ join_the_movement: "Mok bi de Bewegung mit!"
+ password: "PASSWOORT"
+ password_confirmation: "PASSWOORTBESTÄTIGUNG"
+ sign_up: "REGISTREREN"
+ sign_up_message: "Soziales Nettwarken mit een ♥"
+ username: "BENUTTERNAAM"
+ report:
+ comment_label: "<b>Kommentor</b>:<br>%{data}"
+ delete_link: "Indrag löschen"
+ post_label: "<b>Bidrag:</b>: %{title}"
+ requests:
+ create:
+ sending: "Schick"
+ sent: "Du hest beden, mit %{name} to deelen. He schull dat seihn, wenn he sik dat neegste Mol bi diaspora* anmellt."
+ destroy:
+ error: "Bidde wähl een Aspekt ut!"
+ ignore: "Ignorerte Kontaktanfroogen."
+ success: "Du deelst nu."
+ helper:
+ new_requests:
+ one: "Eene nee’e Anfroog!"
+ other: "%{count} nee’e Anfroogen!"
+ zero: "Keene nee’en Anfroogen"
+ manage_aspect_contacts:
+ existing: "Existerende Kontakte"
+ manage_within: "Verwalt Kontakte in"
+ new_request_to_person:
+ sent: "schickt!"
+ reshares:
+ comment_email_subject: "%{resharer}s Version von %{author}s Bidrag"
+ create:
+ failure: "Dat geev een Fehler bin Wiederseggen von den Bidrag."
+ reshare:
+ deleted: "Originalbidrag von den Autor löscht."
+ reshare:
+ one: "Een mol wiederseggt"
+ other: "%{count} mol wiederseggt"
+ zero: "Keen mol wiederseggt"
+ reshare_confirmation: "%{author}s Bidrag wiederseggen?"
+ reshare_original: "Original wiederseggen"
+ reshared_via: "wiederseggt öber"
+ show_original: "Original anzeigen"
+ search: "Söken"
+ services:
+ create:
+ already_authorized: "Een Bruker mit de diaspora-ID %{diaspora_id} hett dit %{service_name}-Konto schon autoriseert."
+ failure: "Authentifizeeren fehlslaan."
+ success: "Authentifizeeren erfolgriek."
+ destroy:
+ success: "Autoriseeren erfolgriek rückgängig mokt."
+ failure:
+ error: "dat geev een Fehler bin Verbinnen mit den Deenst"
+ finder:
+ fetching_contacts: "diaspora* lad diene Frünnen von %{service} graad in, bidde kiek in een poor Minuten noch mol trüch."
+ no_friends: "Keene Facebook-Frünnen funnen."
+ service_friends: "%{service}-Frünnen"
+ index:
+ connect_to_facebook: "Mit Facebook verbinnen"
+ connect_to_tumblr: "Mit Tumblr verbinnen"
+ connect_to_twitter: "Mit Twitter verbinnen"
+ connect_to_wordpress: "Mit Wordpress verbinnen"
+ disconnect: "Verbinnung trennen"
+ edit_services: "Deenste ännern"
+ logged_in_as: "anmellt as"
+ no_services: "Du hest noch keene Deenste verbunnen."
+ really_disconnect: "Verbinnung to %{service} trennen?"
+ inviter:
+ click_link_to_accept_invitation: "Folg dissen Link, üm diene Inladung to akzepteren"
+ join_me_on_diaspora: "Komm to mi op diaspora*"
+ remote_friend:
+ invite: "inladen"
+ not_on_diaspora: "Noch nich op diaspora*"
+ resend: "nochmol schicken"
+ settings: "Instellungen"
+ share_visibilites:
+ update:
+ post_hidden_and_muted: "%{name}s Bidrag is verstekt worrn und Benarichtigungen sind stummschalt worrn."
+ see_it_on_their_profile: "Wenn du nee’es von dissen Bidrag sehn wist, bekiek %{name}s Profilsiet."
+ shared:
+ add_contact:
+ add_new_contact: "Een nee’en Kontakt sluten"
+ create_request: "Anhand von de diaspora*-ID finnen"
+ diaspora_handle: "diaspora@pod.org"
+ enter_a_diaspora_username: "Geev een diaspora*-Benutternaam in:"
+ know_email: "Du kennst jümmer E-Mail-Adress? Du schust jüm inladen"
+ your_diaspora_username_is: "Dien diaspora*-Benutternaam is: %{diaspora_handle}"
+ aspect_dropdown:
+ add_to_aspect: "Kontakt sluten"
+ toggle:
+ one: "In een Aspekt"
+ other: "In %{count} Aspekte"
+ zero: "Kontakt sluten"
+ contact_list:
+ all_contacts: "Alle Kontakte"
+ footer:
+ logged_in_as: "anmellt as %{name}"
+ your_aspects: "Diene Aspekte"
+ invitations:
+ by_email: "Per E-Mail"
+ dont_have_now: "Du hest graad keene, aber mehr Inladungen kommt bald!"
+ from_facebook: "Von Facebook"
+ invitations_left: "%{count} öber"
+ invite_someone: "Lad wen in"
+ invite_your_friends: "Lad dien Frünnen in"
+ invites: "Inladungen"
+ invites_closed: "Inladungen sind op dissen diaspora*-Pod graad sloten"
+ share_this: "Deel dissen Link öber E-Mail, dien Blog oder soziale Nettwaark!"
+ notification:
+ new: "Nee’e %{type} von %{from}"
+ public_explain:
+ atom_feed: "Atom-Feed"
+ control_your_audience: "Legg diene anpielte Grupp fast"
+ logged_in: "anmellt bi %{service}"
+ manage: "Verbunnene Deenste verwalten"
+ new_user_welcome_message: "Bruk #Hashtags, üm diene Bidräg intoordnen un Lüü to finnen, de diene Interessen deelt. Rop nah tolle Lüü mit @Erwähnungen"
+ share: "Deelen"
+ title: "Verbunnene Deenste inrichten"
+ publisher:
+ all: "All"
+ all_contacts: "alle Kontakte"
+ discard_post: "Bidrag löschen"
+ make_public: "opentlich moken"
+ new_user_prefill:
+ hello: "Moin all, Ik bin #%{new_user_tag}. "
+ i_like: "Ik interessier mi för %{tags}. "
+ invited_by: "Danke för de Inladung, "
+ newhere: "NeeHier"
+ post_a_message_to: "Verfat eene Naricht an %{aspect}"
+ posting: "Verfat..."
+ preview: "Vörschau"
+ publishing_to: "veropentlichen to: "
+ share: "Deelen"
+ share_with: "deelen mit"
+ upload_photos: "Biller hoochladen"
+ whats_on_your_mind: "Wat geiht di dörch den Kopp?"
+ reshare:
+ reshare: "Wiederseggen"
+ stream_element:
+ connect_to_comment: "Verbinn di mit dissen Bruker, üm sien Bidrag to kommenteren"
+ currently_unavailable: "Kommenteren is graad nich parat"
+ dislike: "Mag ik nich"
+ hide_and_mute: "Bidrag versteken un stummschalten"
+ ignore_user: "%{name} ignoreren"
+ ignore_user_description: "Bruker ignorieren un ut alle Aspekte wegmoken?"
+ like: "Mag ik"
+ nsfw: "Disse Bidrag is von sien Autor as NSFW markeert worrn. %{link}"
+ shared_with: "Deelt mit: %{aspect_names}"
+ show: "anzeigen"
+ unlike: "Mag ik nich mehr"
+ via: "öber %{link}"
+ viewable_to_anyone: "Disse Bidrag is för alle in’t Internet sichtbor."
+ status_messages:
+ create:
+ success: "Erfolgriek erwähnt: %{names}"
+ destroy:
+ failure: "Kunn Bidrag nich löschen"
+ helper:
+ no_message_to_display: "Keene Narichten ton anzeigen."
+ new:
+ mentioning: "Erwähn: %{person}"
+ too_long: "Bidde mok dien Bidrag kötter as %{count} Teken. In Moment is he %{current_length} Teken lang"
+ stream_helper:
+ hide_comments: "Verstek alle Kommentare"
+ no_more_posts: "Du bist an't Enn von'n Stream ankommen."
+ no_posts_yet: "Dat gift noch keen Bidräg."
+ show_comments:
+ one: "Zeig een annern Kommentor"
+ other: "Zeig %{count} annere Kommentore"
+ zero: "Keene annern Kommentore"
+ streams:
+ activity:
+ title: "Mien Rumröören"
+ aspects:
+ title: "Miene Aspekte"
+ aspects_stream: "Aspekte"
+ comment_stream:
+ contacts_title: "Lüü, von de du de Bidräg kommenteert hest"
+ title: "Kommentierte Bidräg"
+ followed_tag:
+ add_a_tag: "Een Tag dortodoon"
+ follow: "Folgen"
+ title: "#Folgte Tags"
+ followed_tags_stream: "#Folgte Tags"
+ like_stream:
+ contacts_title: "Lüü, von de du de Bidräg magst"
+ mentioned_stream: "@Erwähnungen"
+ mentions:
+ contacts_title: "Lüü, de di erwähnt hebbt"
+ title: "@Erwähnungen"
+ multi:
+ contacts_title: "Lüü in dien Stream"
+ title: "Stream"
+ public:
+ contacts_title: "Letzte Verfater"
+ title: "Opentliches Rumröören"
+ tags:
+ title: "Bidräg tagged mit: %{tags}"
+ tag_followings:
+ create:
+ failure: "Kunn #%{name} nich folgen. Folgst du dat schon?"
+ none: "Du kanns keen leeres Tag folgen!"
+ success: "Hurra! Du folgst nu #%{name}."
+ destroy:
+ failure: "Kunn nich ophören, #%{name} to folgen. Villicht folgst du dat schon gor nich mehr?"
+ success: "Alas! Du folgst #%{name} nich mehr."
+ tags:
+ show:
+ follow: "Folg #%{tag}"
+ following: "Du folgst #%{tag}"
+ none: "Den leeren Tag gift dat nich!"
+ stop_following: "#%{tag} nich mehr folgen"
+ terms_and_conditions: "Allgemeene Geschäftsregeln"
+ undo: "Rückgängig moken?"
+ username: "Benutternaam"
+ users:
+ confirm_email:
+ email_confirmed: "E-Mail-Adress %{email} in gang set"
+ email_not_confirmed: "Kunn E-Mail-Adress nich in gang setten. Falsche Link?"
+ destroy:
+ no_password: "Bidde geev dien jetziges Passwoort in, üm dien Konto to sluten."
+ success: "Dien Konto is sparrt worrn. Wi brukt bit to 20 Minuten, üm dien Konto vullständig to sluten. Danke, dat du diaspora* utprobeert hest."
+ wrong_password: "Dat ingebene Passwoort het dien jetziges Passwoort nich entsproken."
+ edit:
+ also_commented: "wen een Bidrag kommenteert, den du ok kommenteert hest"
+ auto_follow_aspect: "Aspekt för automatisch slotene Kontakte:"
+ auto_follow_back: "Automatisch mit Benutter deelen, de anfangt, mit mi to deelen"
+ change: "Ännern"
+ change_email: "E-Mail-Adress ännern"
+ change_language: "Sprook ännern"
+ change_password: "Passwoort ännern"
+ character_minimum_expl: "mut minstens söss Teken lang ween"
+ close_account:
+ dont_go: "He, bidde goh nich!"
+ if_you_want_this: "Wenn du wirklich wist, dat dat passeert, geev dien Passwoort ünnen in un klick op „Konto sluten“"
+ lock_username: "Dien Brukernaam ward sparrt. Du warst op dissen Pod keen nee'es Konto mit de sülbe ID anleggen künnen."
+ locked_out: "Du warst afmellt warden un ut dien Konto utsparrt warn, bit dat löscht worn is."
+ make_diaspora_better: "Wi deen dat good finnen, wenn du bliffst un uns hülpst, diaspora* beter to moken, statt wegtogohn. Wenn du aber wirklich weggohn wist, ward dat hier as neegstes passeern:"
+ mr_wiggles: "Herrn Wiggles warrd trurig ween, di gahn to seihn."
+ no_turning_back: "Dat gift keen Trüch! Wenn du di wirklich seker bist, geev ünnen dien Passwoort in."
+ what_we_delete: "Wi warrd all diene Bidräg un Profildaten so schnell, as dat man geiht, löschen. Diene Kommentare op de Bidräg von annere Lüü ward immer noch to seen ween, aber se ward mit diene diaspora*-ID statt mit dien Naam verknüppt."
+ close_account_text: "Konto sluten"
+ comment_on_post: "wen dien Bidrag kommenteert"
+ current_password: "Jetziges Passwoort"
+ current_password_expl: "dat, mit dat du di anmellst..."
+ download_photos: "miene Biller rünnerladen"
+ edit_account: "Konto ännern"
+ email_awaiting_confirmation: "Wie hebbt di een Link ton In-Gang-Setten an %{unconfirmed_email} schickt. Bit du dissen Link folgst und diene nee’e E-Mail-Adress in gang sets, warrd wi wieder diene ole Adress %{email} bruken."
+ export_data: "Daten exporteren"
+ following: "Deelen-Instellungen"
+ getting_started: "Instellungen för nee’e Benutter"
+ liked: "wen dien Bidrag mag"
+ mentioned: "du in een Bidrag erwähnt warrst"
+ new_password: "Nee’es Passwoort"
+ private_message: "du eene private Naricht kriegst"
+ receive_email_notifications: "E-Mail-Benarichtigungen kriegen wenn:"
+ reshared: "wen dien Bidrag wiederseggt"
+ show_getting_started: "Anfangshenwiese weer anzeigen"
+ started_sharing: "wen anfangt, mit di to deelen"
+ stream_preferences: "Stream-Instellungen"
+ your_email: "Diene E-Mail-Adress"
+ your_handle: "Diene diaspora*-ID"
+ getting_started:
+ awesome_take_me_to_diaspora: "Toll! Bring mi to diaspora*"
+ community_welcome: "De Gemeenschaft von diaspora* freit sik, di an Boord to hebben!"
+ hashtag_explanation: "Mit Hashtags kannst du öber diene Interessen snacken und jüm folgen. Se sind ok eene tolle Mööglichkeit, üm nee'e Lüü op diaspora* kennen to lernen."
+ hashtag_suggestions: "Versök mol, Tags wie #Kunst, #Filme, #gif oder so to folgen"
+ saved: "Spiekert!"
+ well_hello_there: "Naja, hallo erstmool!"
+ what_are_you_in_to: "Wat magst du?"
+ who_are_you: "Wer bist du?"
+ privacy_settings:
+ ignored_users: "Ignorerte Bruker"
+ no_user_ignored_message: "Du ignoreerst graad keene annern Bruker"
+ stop_ignoring: "Nich mehr ignoreren"
+ title: "Privatsphäre-Instellungen"
+ public:
+ does_not_exist: "Den Bruker %{username} gift dat nich!"
+ update:
+ email_notifications_changed: "E-Mail-Benarichtigungen ännert"
+ follow_settings_changed: "Folgen-Instellungen ännert"
+ follow_settings_not_changed: "Ännern von de Folgen-Instellungen fehlslaan."
+ language_changed: "Sprook ännert"
+ language_not_changed: "Kunn Sprook nich ännern"
+ password_changed: "Passwoort ännert. Du kannst di nu mit dien nee’es Passwoort anmellen."
+ password_not_changed: "Ännern von’t Passwoort fehlslaan"
+ settings_not_updated: "Opfrischen von de Instellungen fehlslaan"
+ settings_updated: "Instellungen opfrischt"
+ unconfirmed_email_changed: "E-Mail-Adress ännert. Mutt in gang set warrn."
+ unconfirmed_email_not_changed: "Ännern von de E-Mail-Adress fehlslaan"
+ webfinger:
+ fetch_failed: "Kunn Webfinger-Profil för %{profile_url} nich afropen"
+ hcard_fetch_failed: "Dat geev een Problem bien afropen von de hcard för %{account}"
+ not_enabled: "Dat sütt so ut, as op Webfinger för %{account} sien Host nich aktiveert is"
+ xrd_fetch_failed: "Dat geev een Problem bien afropen von de xrd von dat Konto %{account}"
+ welcome: "Willkomen!"
+ will_paginate:
+ next_label: "neegste &raquo;"
+ previous_label: "&laquo; vörherige" \ No newline at end of file
diff --git a/config/locales/diaspora/ne.yml b/config/locales/diaspora/ne.yml
index 2e208d37f..0eae89161 100644
--- a/config/locales/diaspora/ne.yml
+++ b/config/locales/diaspora/ne.yml
@@ -13,8 +13,6 @@ ne:
helper:
unknown_person: "अपरिचित व्यक्ति"
aspects:
- helper:
- remove: "हटाउनुहोस्"
index:
help:
tag_question: "प्रश्न"
diff --git a/config/locales/diaspora/nl.yml b/config/locales/diaspora/nl.yml
index 2425f3f65..858cccbcb 100644
--- a/config/locales/diaspora/nl.yml
+++ b/config/locales/diaspora/nl.yml
@@ -10,9 +10,10 @@ nl:
_contacts: "Contacten"
_help: "Help"
_home: "Home"
- _photos: "foto's"
+ _photos: "Foto's"
_services: "Diensten"
- _terms: "voorwaarden"
+ _statistics: "Statistieken"
+ _terms: "Voorwaarden"
account: "Account"
activerecord:
errors:
@@ -40,7 +41,7 @@ nl:
reshare:
attributes:
root_guid:
- taken: "Je hebt dit bericht al doorgegeven!"
+ taken: "Goed bericht zeker? Je hebt dit bericht al doorgegeven!"
user:
attributes:
email:
@@ -48,22 +49,22 @@ nl:
person:
invalid: "is ongeldig."
username:
- invalid: "is ongeldig. We staan alleen letters, nummers, en underscores toe."
+ invalid: "is ongeldig. We staan alleen letters, cijfers, en liggende streepjes toe."
taken: "is al in gebruik."
admins:
admin_bar:
correlations: "Correlaties"
pages: "Pagina's"
pod_stats: "Pod Statistieken"
- report: "Rapporten"
+ report: "Meldingen"
sidekiq_monitor: "Sidekiq monitor"
user_search: "Gebruiker Zoeken"
- weekly_user_stats: "Wekelijkse Gebruiker Statistieken"
+ weekly_user_stats: "Wekelijkse Gebruikersstatistieken"
correlations:
correlations_count: "Correlaties met inlogtelling:"
stats:
- 2weeks: "2 Weken"
- 50_most: "50 Meest Populaire Tags"
+ 2weeks: "2 weken"
+ 50_most: "50 meest populaire tags"
comments:
one: "%{count} reactie"
other: "%{count} reacties"
@@ -71,7 +72,7 @@ nl:
current_segment: "Het huidige segment heeft gemiddeld <b>%{post_yest}</b> berichten per gebruiker sinds <b>%{post_day}</b>"
daily: "Dagelijks"
display_results: "Resultaten uit het <b>%{segment}</b>-segment"
- go: "gaan"
+ go: "Zoeken"
month: "Maand"
posts:
one: "%{count} bericht"
@@ -81,42 +82,46 @@ nl:
one: "%{count} doorgave"
other: "%{count} doorgaven"
zero: "%{count} doorgaven"
- tag_name: "Tag Naam: <b>%{name_tag}</b> Count: <b>%{count_tag}</b>"
- usage_statistic: "Verbruiks Statistieken"
+ tag_name: "Tag: <b>%{name_tag}</b> Count: <b>%{count_tag}</b>"
+ usage_statistic: "Gebruiksstatistieken"
users:
one: "%{count} gebruiker"
other: "%{count} gebruikers"
zero: "%{count} gebruikers"
week: "Week"
user_entry:
- account_closed: "account afgesloten"
- diaspora_handle: "Diaspora id"
+ account_closed: "Account afgesloten"
+ diaspora_handle: "diaspora* id"
email: "E-mailadres"
guid: "GUID"
id: "ID"
- last_seen: "laatst gezien"
+ last_seen: "Laatst gezien"
? "no"
- : nee
+ : Nee
nsfw: "#nsfw"
- unknown: "onbekend"
+ unknown: "Onbekend"
? "yes"
- : ja
+ : Ja
user_search:
account_closing_scheduled: "Het account van %{name} is ingepland om te worden beëindigd. Dit zal over enkele momenten worden verwerkt..."
- add_invites: "voeg uitnodigingen toe"
+ account_locking_scheduled: "Het account van %{name} staat ingepland voor blokkeren. De opdracht wordt zo meteen verwerkt..."
+ account_unlocking_scheduled: "Het account van %{name} staat ingepland voor deblokkeren. De opdracht wordt zo meteen verwerkt..."
+ add_invites: "Voeg uitnodigingen toe"
are_you_sure: "Weet je zeker dat je dit account wilt beëindigen?"
- close_account: "afsluiten account"
+ are_you_sure_lock_account: "Weet je zeker dat je dit account wilt blokkeren?"
+ are_you_sure_unlock_account: "Weet je zeker dat je dit account wilt deblokkeren?"
+ close_account: "Afsluiten account"
email_to: "E-mail om uit te nodigen"
under_13: "Toon gebruikers onder de 13 (COPPA)"
users:
one: "%{count} gebruiker gevonden"
other: "%{count} gebruikers gevonden"
zero: "%{count} gebruikers gevonden"
- view_profile: "bekijk profiel"
+ view_profile: "Bekijk profiel"
you_currently:
- one: "je hebt %{count} uitnodiging over %{link}"
- other: "je hebt %{count} uitnodigingen over %{link}"
- zero: "je hebt geen uitnodingen over %{link}"
+ one: "Je hebt %{count} uitnodiging over %{link}"
+ other: "Je hebt %{count} uitnodigingen over %{link}"
+ zero: "Je hebt geen uitnodingen over %{link}"
weekly_user_stats:
amount_of:
one: "Aantal nieuwe gebruikers deze week: %{count}"
@@ -124,25 +129,23 @@ nl:
zero: "Aantal nieuwe gebruikers deze week: geen"
current_server: "Huidige server datum is %{date}"
ago: "%{time} geleden"
- all_aspects: "Alle Aspecten"
+ all_aspects: "Alle aspecten"
application:
helper:
- unknown_person: "onbekend persoon"
+ unknown_person: "Onbekende persoon"
video_title:
unknown: "Onbekende Videotitel"
are_you_sure: "Weet je het zeker?"
are_you_sure_delete_account: "Weet je zeker dat je jouw account wil sluiten? Dit kan niet teruggedraaid worden!"
aspect_memberships:
destroy:
- failure: "Persoon verwijderen van aspect mislukt"
+ failure: "Persoon verwijderen uit aspect mislukt"
no_membership: "Kon de geselecteerde persoon niet vinden in dat aspect"
- success: "Persoon succesvol van aspect verwijderd"
+ success: "Persoon succesvol uit aspect verwijderd"
aspects:
add_to_aspect:
failure: "Contact toevoegen aan aspect is mislukt."
success: "Contact is met succes toegevoegd aan aspect."
- aspect_contacts:
- done_editing: "klaar met bewerken"
aspect_listings:
add_an_aspect: "+ Voeg aspect toe"
deselect_all: "Deselecteer alles"
@@ -150,7 +153,7 @@ nl:
select_all: "Selecteer alles"
aspect_stream:
make_something: "Schrijf iets"
- stay_updated: "Blijf up-to-date"
+ stay_updated: "Blijf op de hoogte"
stay_updated_explanation: "De standaard stream is gevuld met berichten van al je contacten, met alle tags die je volgt en met berichten van een aantal creatieve leden van de community."
contacts_not_visible: "Contacten in dit aspect zullen elkaar niet kunnen zien."
contacts_visible: "Contacten in dit aspect zullen elkaar kunnen zien."
@@ -161,23 +164,18 @@ nl:
failure: "%{name} is niet leeg en kan niet verwijderd worden."
success: "%{name} is met succes verwijderd."
edit:
- add_existing: "Voeg een bestaand contact toe"
+ aspect_chat_is_enabled: "Contacten binnen dit aspect kunnen met jou chatten."
+ aspect_chat_is_not_enabled: "Contacten binnen dit aspect kunnen niet met jou chatten."
aspect_list_is_not_visible: "Contacten in dit aspect kunnen elkaar niet zien:"
aspect_list_is_visible: "contactlijst van aspect is zichtbaar voor anderen in aspect"
confirm_remove_aspect: "Weet je zeker dat je dit aspect wilt verwijderen?"
- done: "Klaar"
- make_aspect_list_visible: "maak contacten in dit aspect zichtbaar voor elkaar?"
- manage: "Beheren"
+ grant_contacts_chat_privilege: "Contacten in aspect chat autorisatie verlenen?"
+ make_aspect_list_visible: "Contacten in dit aspect voor elkaar zichtbaar maken?"
remove_aspect: "Verwijder dit aspect"
- rename: "hernoem"
+ rename: "Hernoemen"
set_visibility: "Instellen zichtbaarheid"
update: "Bijwerken"
- updating: "aan het bijwerken"
- few: "%{count} aspecten"
- helper:
- are_you_sure: "Weet je zeker dat je dit aspect wilt verwijderen?"
- aspect_not_empty: "Aspect niet leeg"
- remove: "verwijderen"
+ updating: "Aan het bijwerken"
index:
diaspora_id:
content_1: "Jouw diaspora* ID is:"
@@ -208,26 +206,21 @@ nl:
new_here:
follow: "Volg %{link} en verwelkom nieuwe diaspora* gebruikers!"
learn_more: "Meer informatie"
- title: "Nieuwe Gebruikers"
+ title: "Nieuwe gebruikers verwelkomen"
no_contacts: "Geen contacten"
no_tags: "+ Vind een tag"
people_sharing_with_you: "Mensen die met jou delen"
- post_a_message: "plaats een bericht >>"
+ post_a_message: "Plaats een bericht >>"
services:
content: "Je kunt de volgende services met diaspora* verbinden:"
heading: "Verbind diensten"
unfollow_tag: "Stop met volgen van #%{tag}"
welcome_to_diaspora: "Welkom bij diaspora*, %{name}!"
- many: "%{count} aspecten"
- move_contact:
- error: "Probleem bij het verplaatsen van contact: %{inspect}"
- failure: "werkte niet %{inspect}"
- success: "Persoon naar nieuw aspect verplaatst"
new:
create: "Aanmaken"
name: "Naam (alleen zichtbaar voor jou)"
no_contacts_message:
- community_spotlight: "community aanrader"
+ community_spotlight: "Community aanrader"
or_spotlight: "Of je kan delen met %{link}\n"
try_adding_some_more_contacts: "Je kunt meer contacten zoeken of uitnodigen."
you_should_add_some_more_contacts: "Voeg wat meer contacten toe!"
@@ -240,18 +233,10 @@ nl:
family: "Familie"
friends: "Vrienden"
work: "Werk"
- selected_contacts:
- manage_your_aspects: "Beheer je aspecten."
- no_contacts: "Je hebt hier momenteel nog geen contacten."
- view_all_community_spotlight: "Zie alle community spotlights"
- view_all_contacts: "Bekijk alle contacten"
- show:
- edit_aspect: "bewerk aspect"
- two: "%{count} aspecten"
update:
failure: "De naam van je aspect, %{name}, is te lang om op te slaan."
success: "Je aspect, %{name}, is succesvol aangepast."
- zero: "geen aspecten"
+ zero: "Geen aspecten"
back: "Terug"
blocks:
create:
@@ -267,36 +252,31 @@ nl:
post_success: "Gepost!"
cancel: "Annuleren"
comments:
- few: "%{count} reacties"
- many: "%{count} reacties"
new_comment:
comment: "Reactie"
commenting: "Reageren..."
one: "1 reactie"
other: "%{count} reacties"
- two: "%{count} reacties"
- zero: "geen reacties"
+ zero: "Geen reacties"
contacts:
create:
failure: "Verbinding maken mislukt"
- few: "%{count} contacten"
index:
add_a_new_aspect: "Voeg een aspect toe"
- add_to_aspect: "voeg contacten toe aan %{name}"
- add_to_aspect_link: "contacten toevoegen aan %{name}"
- all_contacts: "Alle Contacten"
+ add_contact: "Toevoegen contactpersoon"
+ add_to_aspect: "Voeg contacten toe aan %{name}"
+ all_contacts: "Alle contacten"
community_spotlight: "Community aanrader"
- many_people_are_you_sure: "Weet je zeker dat je een privégesprek wil starten met meer dan %{suggested_limit} contacten? Een bericht plaatsen in dit aspect is waarschijnlijk een betere manier om met hen te communiceren."
- my_contacts: "Mijn Contacten"
+ my_contacts: "Mijn contacten"
no_contacts: "Voeg wat contacten toe!"
+ no_contacts_in_aspect: "Je hebt nog geen contacten in dit aspect. Hieronder staat de lijst met je huidige contacten die je aan dit aspect kunt toevoegen."
no_contacts_message: "Bekijk %{community_spotlight} eens"
- no_contacts_message_with_aspect: "Bekijk %{community_spotlight} eens, of %{add_to_aspect_link}"
only_sharing_with_me: "Delen alleen met mij"
- remove_person_from_aspect: "Verwijder %{person_name} uit \"%{aspect_name}\""
- start_a_conversation: "Start een conversatie"
+ remove_contact: "Verwijderen contactpersoon"
+ start_a_conversation: "Plaats een bericht"
title: "Contacten"
- your_contacts: "Jouw Contacten"
- many: "%{count} contacten"
+ user_search: "Zoek gebruiker"
+ your_contacts: "Jouw contacten"
one: "1 contact"
other: "%{count} contacten"
sharing:
@@ -304,8 +284,7 @@ nl:
spotlight:
community_spotlight: "Community aanrader"
suggest_member: "Suggereer een lid"
- two: "%{count} contacten"
- zero: "contacten"
+ zero: "Geen contacten"
conversations:
conversation:
participants: "Deelnemers"
@@ -314,7 +293,8 @@ nl:
no_contact: "Hallo, je moet wel eerst een contactpersoon toevoegen!"
sent: "Privébericht verzonden"
destroy:
- success: "Privégesprek succesvol verwijderd"
+ delete_success: "De conversatie is verwijderd"
+ hide_success: "De conversatie is verborgen"
helper:
new_messages:
one: "1 nieuw bericht"
@@ -322,22 +302,23 @@ nl:
zero: "Geen nieuwe berichten"
index:
conversations_inbox: "Conversaties - inbakje"
- create_a_new_conversation: "start een nieuwe conversatie"
+ create_a_new_conversation: "Start een nieuwe conversatie"
inbox: "Postvak In"
new_conversation: "Nieuwe conversatie"
- no_conversation_selected: "geen privégesprek geselecteerd"
- no_messages: "geen privéberichten"
+ no_conversation_selected: "Geen privégesprek geselecteerd"
+ no_messages: "Geen privéberichten"
new:
abandon_changes: "Wijzigingen annuleren?"
send: "Verstuur"
sending: "Verzenden..."
- subject: "onderwerp"
- to: "aan"
+ subject: "Onderwerp"
+ to: "Aan"
new_conversation:
fail: "Ongeldig bericht"
show:
- delete: "verwijder en blokkeer privégesprek"
- reply: "beantwoord"
+ delete: "Verwijder gesprek"
+ hide: "Verberg en onderdruk gesprekken"
+ reply: "Beantwoorden"
replying: "Beantwoorden..."
date:
formats:
@@ -354,51 +335,60 @@ nl:
post_not_public: "Het bericht dat je probeert de bekijken is niet openbaar!"
post_not_public_or_not_exist: "Het bericht dat je wilt bekijken is niet openbaar, of het bestaat niet!"
fill_me_out: "Vul me in!"
- find_people: "Vind mensen of #tags"
+ find_people: "Zoek mensen of #tags"
help:
account_and_data_management:
- close_account_a: "Ga naar de onderkant van je instellingenpagina en klik op de 'Sluit Account' knop."
- close_account_q: "Hoe verwijder ik mijn zaadje (account)?"
- data_other_podmins_a: "Als je met iemand op een andere pod deelt, worden alle berichten die je met die persoon deelt, alsmede een kopie van je profielgegevens, opgeslagen (gecached) op die pod en dus zijn die gegevens toegankelijk voor die andere podbeheerder. Als je een bericht of profielgegevens verwijdert, dan worden die gegevens zowel van je eigen pod, als van die andere pods, waar de gegevens ook bewaard werden, verwijderd."
+ close_account_a: "Ga naar de onderkant van je instellingenpagina en klik op de 'Sluit Account' knop. Je wordt dan gevraagd om he wachtwoord om het proces af te ronden. Onthoud goed: als je je account sluit, zul je je <strong>nooit</strong> meer opnieuw met die gebruikersnaam kunnen registreren."
+ close_account_q: "Hoe verwijder ik mijn account?"
+ data_other_podmins_a: "Als je met iemand op een andere pod deelt, worden alle berichten die je met die persoon deelt, alsmede een kopie van je profielgegevens, opgeslagen (gecached) op die pod en dus zijn die gegevens toegankelijk voor die andere podbeheerder. Als je een bericht of profielgegevens verwijdert, dan worden die gegevens zowel van je eigen pod, als van die andere pods, waar de gegevens ook bewaard werden, verwijderd. Je afbeeldingen worden nooit op een andere pod opgeslagen, alleen de links ernaartoe worden verstuurd naar andere pods."
data_other_podmins_q: "Kunnen de beheerders van andere pods mijn informatie bekijken?"
- data_visible_to_podmin_a: "De communicatie *tussen* de pods is altijd versleuteld (met SSL en diaspora*'s eigen transportversleuteling), maar opslag van de gegevens op een pod is niet versleuteld. Als hij/zij dat zou willen, dan kan de databasebeheerder (in de regel de podbeheerder) al je profielgegevens en alle berichten die je plaatst bekijken. Dat geldt overigens voor de meeste websites. Als je je eigen pod draait, heb je dus meer privacy, omdat je dan zelf de toegang tot de database beheert."
+ data_visible_to_podmin_a: "Kort antwoord: alles. De communicatie *tussen* de pods is altijd versleuteld (met SSL en diaspora*'s eigen transportversleuteling), maar opslag van de gegevens op een pod is niet versleuteld. Als hij/zij dat zou willen, dan kan de databasebeheerder (in de regel de podbeheerder) al je profielgegevens en alle berichten die je plaatst bekijken (net als bij de meeste andere websites). Daarom bieden wij je de keuze om zelf de pod waarvan je de podmin vertrouwt te kiezen waarop je een account wilt hebben. Als je je eigen pod draait, heb je dus meer privacy, omdat je dan zelf de toegang tot de database beheert."
data_visible_to_podmin_q: "Hoeveel van mijn gegevens kan de podbeheerder zien?"
- download_data_a: "Ja. Onderaan het Account tabblad in je instellingenpagina zijn twee knoppen waarmee je je gegevens kunt downloaden."
- download_data_q: "Kan ik een kopie van al mijn gegevens in dit zaadje (account) downloaden?"
+ download_data_a: "Ja. Onderaan het Account tabblad in je instellingenpagina zijn twee knoppen: een knop waarmee je jouw gegevens kunt downloaden en eentje voor het downloaden van je foto's."
+ download_data_q: "Kan ik een kopie van al mijn gegevens in dit account downloaden?"
move_pods_a: "In de toekomst zul je je gegevens van de ene pod kunnen exporteren en importeren in de andere, maar dat kan nu nog niet. Je kunt altijd een nieuw account op een andere pod aanmaken en je contacten toevoegen aan aspecten op die nieuwe pod en hun vragen ook je nieuwe account aan hun aspecten toe te voegen."
- move_pods_q: "Hoe verplaats ik mijn zaadje (account) van de ene pod naar een andere?"
+ move_pods_q: "Hoe verplaats ik mijn account van de ene pod naar een andere?"
title: "Account- en gegevensbeheer"
aspects:
change_aspect_of_post_a: "Nee, maar je kunt altijd een identiek bericht maken en dat voor een ander aspect plaatsen."
change_aspect_of_post_q: "Als ik een bericht heb geplaatst, kan ik dan de aspecten die het kunnen zien later nog wijzigen?"
contacts_know_aspect_a: "Nee, ze kunnen de naam van een aspect nooit zien."
contacts_know_aspect_q: "Weten mijn contacten in welke aspecten ik ze heb gestopt?"
- contacts_visible_a: "Als je deze optie aankruist, dan kunnen de contactpersonen in dat aspect op jouw profielpagina de andere leden van dat aspect zien. Je kunt dit het beste alleen selecteren als de contactpersonen elkaar toch al kennen. Ze kunnen niet zien hoe je het aspect hebt genoemd."
+ contacts_visible_a: "Als je deze optie aankruist, dan kunnen de contactpersonen in dat aspect op jouw profielpagina de andere leden van dat aspect zien. Je kunt dit het beste alleen selecteren als de contactpersonen elkaar toch al kennen, bijvoorbeeld als het aspect gelijkloopt met bijvoorbeeld een groep mensen in je echte leven. Ze kunnen niet zien hoe je het aspect hebt genoemd."
contacts_visible_q: "Wat betekent \"maak alle contacten in dit aspect zichtbaar voor elkaar\"?"
- delete_aspect_a: "Selecteer het betreffende aspect in de lijst in de linkerkolom. Klik op de naam en druk op de 'bewerk' pen. In het popup venstertje klik je daarna op de verwijder knop."
+ delete_aspect_a: "Selecteer het betreffende aspect in de lijst in de linkerkolom. Klik op het aspect en druk op de 'bewerk' pen, of ga naar je contactenpagina en selecteer het betreffende aspect. Druk daana op het prullenbakpictogram rechtsboven op de pagina."
delete_aspect_q: "Hoe verwijder ik een aspect?"
- person_multiple_aspects_a: "Ja. Ga naar je contacten pagina en klik op Mijn contacten. Voor elk contact kun je het menu rechts gebruiken om ze aan aspecten toe te voegen of ze eruit te verwijderen. Of je kunt ze aan een of meer aspecten koppelen op hun eigen profielpagina. Of je kunt ergens waar je hun naam op het scherm ziet met de muis eroverheen gaan en meteen daar in het popup venstertje de aspecten (de)selecteren."
+ person_multiple_aspects_a: "Ja. Ga naar je contacten pagina en klik op 'Mijn contacten'. Voor elk contact kun je het menu rechts gebruiken om ze aan aspecten toe te voegen of ze eruit te verwijderen. Of je kunt ze aan een of meer aspecten koppelen met de aspectenselector op hun eigen profielpagina. Of je kunt ergens waar je hun naam op het scherm ziet met de muis eroverheen gaan en meteen daar in het popup venstertje de aspecten (de)selecteren."
person_multiple_aspects_q: "Kan ik iemand in meerdere aspecten plaatsen?"
- post_multiple_aspects_a: "Ja. Als je een bericht plaatst, kun je de aspecten selector gebruiken om aspecten te selecteren of deselecteren. Je bericht zal alleen zichtbaar zijn voor alle aspecten die je selecteert. Je kunt ook aspecten in de linker zijbalk selecteren. Als je dan een bericht plaatst, zal het zichtbaar zijn voor de dan geselecteerde aspecten."
+ post_multiple_aspects_a: "Ja. Als je een bericht plaatst, kun je de aspecten selector gebruiken om aspecten te selecteren of deselecteren. 'Alle aspecten' is de standaardinstelling. Je bericht zal alleen zichtbaar zijn voor alle aspecten die je selecteert. Je kunt ook aspecten in de linker zijbalk selecteren. Als je dan een bericht plaatst, zal het zichtbaar zijn voor de dan geselecteerde aspecten."
post_multiple_aspects_q: "Kan ik in één keer een bericht plaatsen voor meerdere aspecten tegelijk?"
- remove_notification_a: "Nee."
+ remove_notification_a: "Nee. Ze worden ook niet geïnformeerd als je ze aan meer aspecten toevoegt wanneer je al met ze deelt."
remove_notification_q: "Als ik iemand uit een aspect verwijder, wordt die persoon daarover dan geïnformeerd?"
- rename_aspect_a: "Ja. In de lijst met aspecten in de linkerkolom kies je het te hernoemen aspect. Klik op het kleine 'bewerk' pennetje rechts van het aspect. Klik op hernoemen in het menu dat verschijnt."
- rename_aspect_q: "Kan ik een aspect een nieuwe naam geven?"
+ rename_aspect_a: "Klik op \"Mijn aspecte\" in de linkerkolom en klik op op het kleine 'bewerk' pennetje rechts van het aspect, of ga naar je contactenpagina en selecteer het betreffende aspect. Klik dan op het Bewerken pictogram naast de aspectnaam bovenaan deze pagina. Wijzig dan de naam en klik op \"Bijwerken\"."
+ rename_aspect_q: "Hoe kan ik een aspect een nieuwe naam geven?"
restrict_posts_i_see_a: "Ja. Klik op Mijn Aspecten in de linkerkolom en klik dan op de afzonderlijke aspecten om ze te (de)selecteren. Je ziet in je Stream dan alleen de berichten van de mensen in de geselecteerde aspecten."
- restrict_posts_i_see_q: "Kan ik ook alleen berichten zien van bepaalde aspecten?"
+ restrict_posts_i_see_q: "Kan ik in mijn stream ook alleen berichten zien van bepaalde aspecten?"
title: "Aspecten"
what_is_an_aspect_a: "Aspecten zijn de manier waarop je je contacten groepeert in diaspora*. Een aspect is een van de manieren waarop je je manifesteert in je eigen wereld. Het kan op je werk zijn, je familie, of je vrienden of een club waar je bijhoort."
what_is_an_aspect_q: "Wat is een aspect?"
- who_sees_post_a: "Als je een 'beperkt' bericht plaatst, is het alleen zichtbaar voor de mensen die je in dat aspect (of die aspecten als je meer aspecten hebt gekozen) hebt gestopt. Contactpersonen die niet in het betreffende aspect zitten, zullen het bericht niet kunnen zien, tenzij je het een openbaar bericht maakt. Alleen openbare berichten zijn ook zichtbaar voor mensen die niet in je aspect(en) zitten."
+ who_sees_post_a: "Als je een 'beperkt' bericht plaatst, is het alleen zichtbaar voor de mensen die je in dat aspect (of die aspecten als je meer aspecten hebt gekozen) hebt gestopt. Contactpersonen die niet in het betreffende aspect zitten, zullen het bericht niet kunnen zien. Beperkte berichten zijn nooit zichtbaar voor mensen die niet in je aspect(en) zitten."
who_sees_post_q: "Als ik een bericht plaats voor een aspect, wie ziet dat dan?"
- foundation_website: "diaspora foundation website"
+ chat:
+ add_contact_roster_a: |-
+ Eerst moet je de chatmogeljikheid inschakelen voor een van de aspecten waar die persoon in zit. Ga naar de %{contacts_page}, selecteer het aspect en klik op het chat pictogram om chat voor het aspect mogelijk te maken.
+ %{toggle_privilege} Je kunt, als je dat wilt, een speciaal aspect genaamd 'Chat' maken en daar personen met wie je wilt chatten aan toevoegen. Als je dat hebt gedaan, open dan de chat interface en selecteer de persoon met wie je wilt chatten.
+ add_contact_roster_q: "Hoe kan ik met iemand binnen diaspora* chatten?"
+ contacts_page: "contactpersonenpagina"
+ title: "Chat"
+ faq: "FAQ"
+ foundation_website: "diaspora* foundation website"
getting_help:
- get_support_a_hashtag: "zet de vraag in een openbaar bericht op diaspora* met de %{question} hashtag"
- get_support_a_irc: "doe mee op %{irc} (live chat)"
- get_support_a_tutorials: "bekijk onze %{tutorials}"
- get_support_a_website: "bezoek onze %{link}"
- get_support_a_wiki: "zoek de %{link}"
+ get_support_a_faq: "Lees onze %{faq} pagina op wiki"
+ get_support_a_hashtag: "Zet de vraag in een openbaar bericht op diaspora* met de %{question} hashtag"
+ get_support_a_irc: "Doe mee op %{irc} (live chat)"
+ get_support_a_tutorials: "Bekijk onze %{tutorials}"
+ get_support_a_website: "Bezoek onze %{link}"
+ get_support_a_wiki: "Zoek de %{link}"
get_support_q: "Wat nou als mijn vraag niet wordt beantwoord in de FAQ? Waar kan ik dan ondersteuning krijgen?"
getting_started_a: "Je hebt geluk. Probeer de %{tutorial_series} op onze projectsite. Daarin word je stap voor stap door het aanmeldingsproces meegenomen en krijg je de basiskennis om met diaspora* te kunnen werken."
getting_started_q: "Help! Ik heb wat beginnersinstructies nodig om te beginnen!"
@@ -408,10 +398,14 @@ nl:
irc: "IRC"
keyboard_shortcuts:
keyboard_shortcuts_a1: "In de Stream kun je de volgende sneltoetsen gebruiken:"
- keyboard_shortcuts_li1: "j - ga naar het volgende bericht"
- keyboard_shortcuts_li2: "k - ga naar het vorige bericht"
- keyboard_shortcuts_li3: "c - reageer op het huidige bericht"
- keyboard_shortcuts_li4: "l - vind het huidige bericht leuk"
+ keyboard_shortcuts_li1: "j - Ga naar het volgende bericht"
+ keyboard_shortcuts_li2: "k - Ga naar het vorige bericht"
+ keyboard_shortcuts_li3: "c - Reageer op het huidige bericht"
+ keyboard_shortcuts_li4: "l - Vind het huidige bericht leuk"
+ keyboard_shortcuts_li5: "r - Het huidige bericht doorgeven"
+ keyboard_shortcuts_li6: "m - Het huidige bericht uitbreiden"
+ keyboard_shortcuts_li7: "o - De eerste link in het huidige bericht openen"
+ keyboard_shortcuts_li8: "ctrl + enter - Verstuur het bericht dat je schreef"
keyboard_shortcuts_q: "Welke sneltoetsen kunnen worden gebruikt?"
title: "Sneltoetsen"
markdown: "Opmaak"
@@ -426,16 +420,13 @@ nl:
what_is_a_mention_a: "Een vermelding is een link naar iemands profielpagina in een bericht. Als iemand in een bericht wordt vermeld, dan ontvangt die persoon een melding met een verwijzing naar dat bericht."
what_is_a_mention_q: "Wat is een \"vermelding\"?"
miscellaneous:
- back_to_top_a: "Ja. Klik op de grijze pijl die rechtsonder in het browservenster verschijnt."
+ back_to_top_a: "Ja. Na het omlaag scrollen klik je op de grijze pijl rechtsonder in het browservenster."
back_to_top_q: "Kun ik snel naar de bovenkaant van de pagina gaan, als ik een eind naar beneden gegaan ben?"
- diaspora_app_a: |-
- Er zijn verschillende Android apps in ontwikkeling. Sommige oudere pogingen werken niet met de huidige versie van diaspora*. Verwacht op dit moment niet te veel van deze apps.
- De beste manier om nu met je smartphone gebruik te kunnen maken van diaspora* is met een gewone browser, omdat we een mobiele versie van diaspora* hebben ontwikkeld die op alle apparaten moet werken.
- Er is op dit moment geen iOS app. Maar ook op dat platform kun je het beste je browser gebruiken.
+ diaspora_app_a: "Er zijn verschillende Android apps in ontwikkeling. Sommige oudere pogingen werken niet met de huidige versie van diaspora*. Verwacht op dit moment niet te veel van deze apps. Er is op dit moment geen iOS app. De beste manier om nu met je smartphone gebruik te kunnen maken van diaspora* is met een gewone browser, omdat we een mobiele versie van diaspora* hebben ontwikkeld die op alle apparaten moet werken, hoewel die versie nu nog niet alle functionaliteit bezit."
diaspora_app_q: "Bestaat er een diaspora* app voor Android of iOS?"
- photo_albums_a: "Nee, momenteel niet. Maar je kunt wel een stream van geüploade afbeeldingen in de fotosectie in het menu van profielpagina's zien."
+ photo_albums_a: "Nee, momenteel niet. Maar je kunt wel de door iemans geüploade afbeeldingen zien onder de Foto's tab in hun profielpagina's."
photo_albums_q: "Zijn er foto- of videoalbums?"
- subscribe_feed_a: "Ja, maar dit is nog niet heel mooi opgelost en de opmaak van de berichten is nog ongepolijst. Als je het wilt proberen, dan ga je naar iemands profielpagina en klik je op de 'feed' knop, of je kopieert de profiel URL (bijv. https://joindiaspora.com/people/somenumber) en plakt die in een feed reader. Het adres lijkt dan op https://joindiaspora.com/public/username.atom. diaspora* gebruikt geen RSS, maar wel Atom."
+ subscribe_feed_a: "Ja, maar dit is nog niet heel mooi opgelost en de opmaak van de berichten is nog ongepolijst. Als je het wilt proberen, dan ga je naar iemands profielpagina en klik je op de 'feed' knop, of je kopieert de profiel URL (bijv. https://joindiaspora.com/people/eennummer) en plakt die in een feed reader. Het adres van de feed lijkt dan op https://joindiaspora.com/public/username.atom. diaspora* gebruikt geen RSS, maar wel Atom."
subscribe_feed_q: "Kan ik mezelf op iemands openbare berichten abonneren om die in een feed reader te volgen?"
title: "Diverse"
pods:
@@ -444,29 +435,34 @@ nl:
title: "Pods"
use_search_box_a: "Als je de volledige diaspora* ID kent (bijvoorbeeld gebruikersnaam@podnaam.org), dan kun je die persoon vinden door naar die ID te zoeken. Als je iemand op je eigen pod zoekt, dan hoef je alleen naar de gebruikersnaam te zoeken. Alternatief is om te zoeken naar de profielnaam (de naam die je op het scherm ziet). Als een zoekopdracht geen resultaat toont, probeer het dan nog een keer."
use_search_box_q: "Hoe gebruik ik de zoekoptie om iemand te vinden?"
- what_is_a_pod_a: "Een pod is een server die de diaspora* software draait en die is verbonden met het diaspora* netwerk. \"Pod\" is een metafoor die verwijst naar de pods (zaadbol) op een plant en die de zaden bevat, net zoals een server een aantal accounts bevat. Er zijn verschillende soorten pods. Je kunt vrienden van andere pods toevoegen aan jouw netwerk en met hen communiceren. Een diaspora* pod lijkt wel een beetje op een e-mailprovider: er zijn publieke pods, besloten pods en met enige moeite kun je ook je eigen pod draaien."
+ what_is_a_pod_a: "Een pod is een server die de diaspora* software draait en die is verbonden met het diaspora* netwerk. \"Pod\" is een metafoor die verwijst naar de pods (zaadbol) op een plant en die de zaden bevat, net zoals een server een aantal accounts bevat. Er zijn verschillende soorten pods. Je kunt vrienden van andere pods toevoegen aan jouw netwerk en met hen communiceren. Je hoeft niet op een andere pod ook een account te hebbe! Een is genoeg. Een diaspora* pod lijkt zo wel een beetje op een e-mailprovider. Er zijn publieke pods, besloten pods en met enige moeite kun je ook je eigen pod draaien."
what_is_a_pod_q: "Wat is een pod?"
posts_and_posting:
- char_limit_services_a: "In dat geval wordt je bericht beperkt tot het kleinere aantal (140 in geval van Twitter, 1000 bij Tumblr) en het resterende aantal tekens wordt getoond als het pictogram van de betreffende dienst oplicht. Je kunt wel langere berichten delen, maar de tekst wordt voor die diensten ingekort."
- char_limit_services_q: "Wat is het maximum aantal tekens voor delen van berichten met diensten die een kleiner maximum aantal hanteren?"
+ char_limit_services_a: "In dat geval wordt je bericht beperkt tot het kleinere aantal (140 in geval van Twitter, 1000 bij Tumblr) en het resterende aantal tekens wordt getoond als het pictogram van de betreffende dienst oplicht. Je kunt wel langere berichten delen, maar de tekst wordt voor die diensten ingekort en aangevuld met een link naar het bericht op diaspora*."
+ char_limit_services_q: "Wat gebeurt er als ik mijn bericht wil delen met diensten die een kleiner maximum aantal tekens hanteren?"
character_limit_a: "65.535 tekens. Dat is 65.395 meer dan bij Twtter! ;)"
character_limit_q: "Wat is het maximale aantal tekens per bericht?"
- embed_multimedia_a: |-
- Je kunt gewoon de URL (bijv. http://www.youtube.com/watch?v=nnnnnnnnn) in een bericht plakken en de video of audio wordt automatisch ingebed.
- Sites de worden ondersteund zijn bijvoorbeeld YouTube, Vimeo, SoundCloud, Flickr en nog een paar. diaspora* gebruikt oEmbed voor deze mogelijkheden. We blijven nieuwe formaten toevoegen.
- Let erop om altijd de enkelvoudige, niet verkorte links te plaatsen. Zet ook geen andere commando's achter de URL en heb even geduld voordat je de pagina ververst om een voorbeeld te zien.
+ embed_multimedia_a: "Je kunt gewoon de URL (bijv. http://www.youtube.com/watch?v=nnnnnnnnn) in een bericht plakken en de video of audio wordt automatisch ingebed. Sites die worden ondersteund zijn bijvoorbeeld YouTube, Vimeo, SoundCloud, Flickr en nog een paar. diaspora* gebruikt oEmbed voor deze mogelijkheid. We blijven nieuwe formaten toevoegen. Let erop om altijd de enkelvoudige, volledige, niet verkorte links te plaatsen. Zet ook geen andere commando's achter de URL en heb even geduld voordat je de pagina ververst om een voorbeeld te zien."
embed_multimedia_q: "Hoe plaats ik video-, audio- of multimediabestanden in een bericht?"
format_text_a: "Je kunt een eenvoudige methode gebruiken die %{markdown} heet. Je vindt de volledige syntax %{here}. De voorbeeld-knop is handig, want daardoor kun je zien hoe het bericht eruit gaat zien als je het later plaatst."
format_text_q: "Hoe kan ik de tekst in mij berichten opmaken (vet, schuin etc.)?"
hide_posts_a: "Als je met de muis aan de bovenkant van een bericht staat, verschijnt er een X rechts ervan. Klik daarop om het bericht te verbergen en om notificaties erover te onderdrukken. Je kunt het bericht nog wel zien op de profielpagina van de persoon die het geplaatst had."
- hide_posts_q: "Hoe verberg ik een bericht? Hoe voorkom ik notificaties over bericht waarop ik heb gereageerd?"
+ hide_posts_q: "Hoe verberg ik een bericht?"
image_text: "afbeeldingstekst"
image_url: "afbeeldingsURL"
insert_images_a: "Klik op het kleine camera-pictogram om een afbeelding op te nemen. Je kunt nog een keer op de camera klikken om nog een afbeelding op te nemen, of je kunt verschillende afbeeldingen in één keer selecteren om te uploaden."
- insert_images_comments_a1: "De volgende Markdown code"
+ insert_images_comments_a1: "Je kunt geen afbeeldingen toevoegen aan reacties, maar de volgende Markdown code"
insert_images_comments_a2: "kan worden gebruikt om afbeeldingen van het internet in reacties en berichten op te nemen."
insert_images_comments_q: "Kan ik afbeeldingen plaatsen in reacties?"
insert_images_q: "Hoe plaats ik een afbeelding in een bericht?"
+ post_location_a: "Klik op het punaise pictogram naast de camaera in het invoerveld. Hiermee voeg je de locatie via OpenStreetMap toe. Je kunt de locatie wijzigen, want misschien wil je liever alleen de plaatsnaam in plaats van het hele adres opgeven."
+ post_location_q: "Hoe voeg ik mijn locatie toe aan een bericht?"
+ post_notification_a: "Je ziet een pictogram van een bel naast de X rechtsboven een bericht. Klik erop om meldingen erover in- of uit te schakelen."
+ post_notification_q: "Hoe krijg ik meldingen, of stop ik het ontvangen van meldingen, over een bericht?"
+ post_poll_a: "Klik op het grafiekenpictogram om een peiling te maken. Voer een vraag in en tenminste twee antwoorden. Vergeet niet om je peiling openbaar te maken als je iedereen mee wilt laten stemmen."
+ post_poll_q: "Hoe voeg ik een peiling toe aan een bericht?"
+ post_report_a: "Klik op het waarschuwingsdriehoekje rechtsboven het bericht om het te rapporteren aan je podmin. Geef in het tekstveld de reden op waarvoor je het meldt."
+ post_report_q: "Hoe meld ik een aanstootgevend bericht?"
size_of_images_a: "Nee. Afbeeldingen worden automatisch geschaald om te passen binnen de Stream. Markdown heeft geen code om de afmetingen te bepalen."
size_of_images_q: "Kan ik de afmetingen van afbeeldingen in reacties of berichten aanpassen?"
stream_full_of_posts_a1: "Je stream bestaat uit drie soorten berichten:"
@@ -478,82 +474,85 @@ nl:
stream_full_of_posts_q: "Waarom staat mijn stream vol met berichten van mensen die ik niet ken en met wie ik niet deel?"
title: "Berichten en publiceren"
private_posts:
- can_comment_a: "Alleen de in diaspora* ingelogde gebruikers die jij in dat aspect hebt geplaatst, kunnen jouw privébericht leuk vinden of erop reageren."
+ can_comment_a: "Alleen de in diaspora* ingelogde gebruikers die jij in dat aspect hebt zitten voordat jey het besloten bericht plaatste, kunnen het bericht leuk vinden of erop reageren."
can_comment_q: "Wie kan reageren op mijn privébericht, of dat leuk vinden?"
- can_reshare_a: "Niemand. Privéberichten zijn niet te delen. Ingelogde diaspora* gebruikers die jij in dat aspect hebt geplaatst, kunnen het bericht wel zien en dus kopiëren en ergens inplakken."
+ can_reshare_a: "Niemand. Besloten berichten zijn niet te delen. Ingelogde diaspora* gebruikers die jij in dat aspect hebt geplaatst, kunnen het bericht wel zien en dus kopiëren en ergens inplakken, Maar jij moet besluiten om die mensen te vertrouwen."
can_reshare_q: "Wie kan mijn privébericht doorgeven?"
see_comment_a: "Alleen de mensen met wie dat bericht werd gedeeld (dus de mensen die de berichtplaatser in een aspect heeft geplaatst) kunnen reacties zien en zien dat wie het leuk vond. "
see_comment_q: "Als ik een privébericht leuk vind of erop reageer, wie kan dat zien?"
title: "Privéberichten"
- who_sees_post_a: "Alleen de in diaspora* ingelogde gebruikers die jij in dat aspect hebt geplaatst, kunnen jouw privébericht zien."
+ who_sees_post_a: "Alleen de in diaspora* ingelogde gebruikers die jij in dat aspect hebt zitten voordat je het besloten bericht plaatste, kunnen het zien."
who_sees_post_q: "Als ik een bericht plaats voor een aspect (bijvoorbeeld een privébericht), wie kan dat dan zien?"
private_profiles:
title: "Privéprofielen"
- whats_in_profile_a: "Biografie, locatie, geslacht en geboortedatum. De zaken onderaan de profielpagina. Al deze informatie is optioneel, je bepaalt zelf wat je invult. Ingelogde gebruikers die je in een van je aspecten hebt geplaatst, zijn de enige personen die je privéprofiel kunnen zien. Ze zien ook de privéberichten die je plaatst voor de aspecten waar ze lid van zijn, samen met je openbare berichten als ze jouw profielpagina bezoeken."
+ whats_in_profile_a: "Je privé profielpagina bevat je biografie, locatie, geslacht en geboortedatum als je dat hebt ingevuld.Al deze informatie is optioneel, je bepaalt zelf wat je invult. Ingelogde gebruikers die je in een van je aspecten hebt geplaatst, zijn de enige personen die je privéprofiel kunnen zien. Ze zien ook de besloten berichten die je plaatst voor de aspecten waar ze lid van zijn, samen met je openbare berichten als ze jouw profielpagina bezoeken."
whats_in_profile_q: "Wat staat er in mijn privéprofiel?"
who_sees_profile_a: "Iedere ingelogde gebruiker met wie jij deelt (oftewel die jij in een aspect hebt geplaatst) kan het zien. Maar mensen die jou volgen, terwijl jij ze niet volgt, zien alleen je openbare informatie."
who_sees_profile_q: "Wie kan mijn privéprofiel zien?"
- who_sees_updates_a: "Iedereen in jouw aspecten kan de wijzigingen van je privé profiel zien. "
- who_sees_updates_q: "Wie ziet de wijzigingen van mijn privé profiel?"
+ who_sees_updates_a: "Iedereen in jouw aspecten kan de wijzigingen van je privéprofiel zien. "
+ who_sees_updates_q: "Wie ziet de wijzigingen van mijn privéprofiel?"
public_posts:
can_comment_reshare_like_a: "Iedere in diaspora* ingelogde gebruiker kan op je openbare berichten reageren, ze leuk vinden of ze doorgeven."
can_comment_reshare_like_q: "Wie kan reageren op mijn openbare berichten, ze leuk vinden of ze doorgeven?"
- deselect_aspect_posting_a: "Ook als je aspecten deseleteert, blijft een openbaar bericht openbaar. Het verschijnt nog steeds in de stream van al je contacten. Om een bericht alleen zichtbaar te laten zijn voor bepaalde aspecten, moet je die aspecten selecteren via de knop onder het tekstinvoerveld."
- deselect_aspect_posting_q: "Wat gebeurt er als ik een of meer aspecten delectereer als ik een openbaar bericht plaats?"
- find_public_post_a: "Je openbare berichten verschijnen in de stream van iedereen die jou volgt, Als je ook #tags in je openbare bericht opneemt, dan krijgt ook iedereen die die tags volgt jouw berichten in hun stream. Ieder openbaar bericht heeft ook een unieke specifieke URL, die iedereen kan zien, ook mensen die niet zijn ingelogd. Naar openbare berichten kan dus gelikt worden vanaf Twitter, blogs etc. Openbare berichten kunnen ook worden geïndexeerd door zoekmachines,"
- find_public_post_q: "Hoe kunnen andere mensen mij openbare berichten vinden?"
- see_comment_reshare_like_a: "Iedere in diaspora* ingelogde gebruiker, maar ook iedereen op het internet. Reacties, het leuk vinden en het delen van openbare berichten zijn ook openbaar."
- see_comment_reshare_like_q: "Als ik reageer op een openbaar bericht, het leuk vindt of het doorgeeft, wie ziet dat dan?"
+ deselect_aspect_posting_a: "Ook als je aspecten deselecteert, blijft een openbaar bericht openbaar. Het verschijnt nog steeds in de stream van al je contacten. Om een bericht alleen zichtbaar te laten zijn voor bepaalde aspecten, moet je die aspecten selecteren via de knop onder het tekstinvoerveld."
+ deselect_aspect_posting_q: "Wat gebeurt er als ik een of meer aspecten deselecteer als ik een openbaar bericht plaats?"
+ find_public_post_a: "Je openbare berichten verschijnen in de stream van iedereen die jou volgt, Als je ook #hashtags in je openbare bericht opneemt, dan krijgt ook iedereen die die tags volgt jouw berichten in hun stream. Ieder openbaar bericht heeft ook een unieke specifieke URL, die iedereen kan zien, ook mensen die niet zijn ingelogd. Naar openbare berichten kan dus gelinkt worden vanaf Twitter, blogs etc. Openbare berichten kunnen ook worden geïndexeerd door zoekmachines,"
+ find_public_post_q: "Hoe kunnen andere mensen mijn openbare berichten vinden?"
+ see_comment_reshare_like_a: "Reacties, leuk vinden en het delen van openbare berichten zijn ook openbaar zichtbaar. Iedere in diaspora* ingelogde gebruiker, maar ook iedereen op het internet kan jouw interacties op openbare berichten zien."
+ see_comment_reshare_like_q: "Als ik reageer op een openbaar bericht, het leuk vind of het doorgeef, wie ziet dat dan?"
title: "Openbare berichten"
- who_sees_post_a: "In beginsel kan iedereen op het internet je berichten lezen als je ze als openbaar markeert. Dus let wel even op als je openbare berichten plaatst. Het een heel mooie manier om de wereld te informeren."
+ who_sees_post_a: "In beginsel kan iedereen op het internet je berichten lezen als je ze als openbaar markeert. Dus let wel even op als je openbare berichten plaatst. Het is een heel mooie manier om de wereld te informeren."
who_sees_post_q: "Wie kan mijn openbare berichten zien?"
public_profiles:
title: "Openbare profielen"
what_do_tags_do_a: "Ze helpen om mensen jou te leren kennen. Je profielfoto verschijnt ook links op de tagpagina's, samen met die van andere personen die die tag in hun openbare profiel hebben opgenomen."
what_do_tags_do_q: "Wat is het nut van de tags op mijn openbare profielpagina?"
- whats_in_profile_a: "Je naam, vijf tags die je zelf kiest en je profielfoto. Het zijn de zaken bovenaan je profielpagina, Je kunt de informatie zo identificeerbaar of zo anoniem maken als je zelf wilt. Je profielpagina toont ook al je openbare berichten."
+ whats_in_profile_a: "Je openbare profiel bevat je naam, vijf tags die je zelf kiest en je profielfoto, als je dat hebt opgegeven, alles is optioneel - je bepaalt zelf wat je op wilt geven. Je kunt de informatie zo identificeerbaar of zo anoniem maken als je zelf wilt. Je profielpagina toont ook al je openbare berichten."
whats_in_profile_q: "Wat staat er in mijn openbare profiel?"
- who_sees_profile_a: "Iedere ingelogde diaspora* gebruiker, maar eigenlijk iedereen op het internet, kan je openbare profiel zien. Elk profiel heeft een direct URL, waardoor ernaar gelinkt kan worden vanaf externe sites. Oo zoekmachines zouden het kunnen indexeren."
+ who_sees_profile_a: "Iedere ingelogde diaspora* gebruiker, maar eigenlijk iedereen op het internet, kan je openbare profiel zien. Elk profiel heeft een direct URL, waardoor ernaar gelinkt kan worden vanaf externe sites. Ook zoekmachines zouden het kunnen indexeren."
who_sees_profile_q: "Wie kan mijn openbare profiel zien?"
who_sees_updates_a: "Iedereen kan de wijzigingen zien als ze je profielpagina bezoeken."
who_sees_updates_q: "Wie ziet de wijzigingen aan mijn openbare profiel?"
resharing_posts:
- reshare_private_post_aspects_a: "Nee, je kunt een privébericht niet doorgeven. Dat kan niet omdat we de intenties van de originele plaatser, die het alleen met bepaalde groepen wilde delen, respecteren."
- reshare_private_post_aspects_q: "Kan ik een privébericht delen met specifieke aspecten?"
- reshare_public_post_aspects_a: "Nee. Als je een openbaar bericht doorgeeft, wordt het automatisch een van jouw openbare berichten. Om het alleen met bepaalde aspecten te delen, moet je de inhoud kopiëren en in een nieuw bericht plakken."
+ reshare_private_post_aspects_a: "Nee, je kunt een besloten bericht niet doorgeven. Dat kan niet omdat we de intenties van de originele plaatser, die het alleen met bepaalde groepen wilde delen, respecteren."
+ reshare_private_post_aspects_q: "Kan ik een besloten bericht delen met specifieke aspecten?"
+ reshare_public_post_aspects_a: "Nee. Als je een openbaar bericht doorgeeft, wordt het automatisch een van jouw openbare berichten. Om het alleen met bepaalde aspecten te delen, moet je de inhoud kopiëren en in een nieuw, besloten bericht plakken."
reshare_public_post_aspects_q: "Kan ik openbare berichten doorgeven naar alleen bepaalde aspecten?"
title: "Berichten doorgeven"
sharing:
add_to_aspect_a1: "Laten we zeggen dat Amy Ben toevoegt aan een aspect, maar dat Ben Amy (nog) niet een aan aspect heeft toegevoegd."
- add_to_aspect_a2: "Dit heet asymmetrisch delen. Als Ben Amy ook aan een aspect toevoegd, dan heet dat samen delen, waarbij Ben en Amy allebei de openbare berichten en de relevante privéberichten in hun stream zien. "
+ add_to_aspect_a2: "Dit heet asymmetrisch delen. Als Ben Amy ook aan een aspect toevoegt, dan heet dat samen delen, waarbij Ben en Amy allebei de openbare berichten en de relevante besloten berichten in hun stream zien en Amy zou ook Ben's privéprofiel kunnen zien. Ze kunnen elkaar ook privéberichten sturen."
add_to_aspect_li1: "Ben ontvangt dan een melding dat Amy is begonnen met hem te delen."
add_to_aspect_li2: "Amy zal vanaf dat moment de openbare berichten van Ben in haar stream zien verschijnen."
- add_to_aspect_li3: "Amy ziet geen van de privéberichten in haar stream."
+ add_to_aspect_li3: "Amy ziet geen van de privéberichten van Ben in haar stream."
add_to_aspect_li4: "Ben ziet geen van Amy's openbare of privéberichten in zijn stream."
- add_to_aspect_li5: "Maar als Ben naar Amy's profielpagina gaat, dan ziet zijn Amy's privéberichten die ze plaatst in de aspecten waar ze Ben in heeft geplaatst, maar ook de openbare berichten, die iedereen op haar openbare profielpagina kan zien."
+ add_to_aspect_li5: "Maar als Ben naar Amy's profielpagina gaat, dan ziet hij Amy's besloten berichten die ze plaatste in de aspecten waar ze Ben in heeft geplaatst (en ook de openbare berichten, die iedereen op haar openbare profielpagina kan zien)."
add_to_aspect_li6: "Ben kan ook Amy's privéprofiel zien (bio, locatie, geslacht en geboortedatum)."
- add_to_aspect_li7: "Amy verschijnt onder \"Deel alleen met mij\" op Ben's contactenpagina."
- add_to_aspect_q: "Wat gebeurt er als ik iemand toevoeg aan een van mijn aspecten? Of als iemand mij een een van zijn/haar aspecten toevoegt?"
- list_not_sharing_a: "Nee, maar je kunt zien of iemand met jou deelt door hun profielpagina te bezoeken. Als ze jou in een aspect hebben opgenomen, is het balkje onder hun profielfoto groen. Zo niet, dan is de balk grijs. Je krijgt een melding als iemand met jou begint te delen."
+ add_to_aspect_li7: "Amy verschijnt onder \"Deelt alleen met mij\" op Ben's contactenpagina."
+ add_to_aspect_li8: "Amy zal ook Ben in een bericht kunnen @vermelden."
+ add_to_aspect_q: "Wat gebeurt er als ik iemand toevoeg aan een van mijn aspecten of als iemand mij een een van zijn/haar aspecten toevoegt?"
+ list_not_sharing_a: "Nee, maar je kunt zien of iemand met jou deelt door hun profielpagina te bezoeken. Als ze jou in een aspect hebben opgenomen, is het knopje met de aspecten waarin je ze hebt geplaatst groen. Zo niet, dan is de knop grijs.."
list_not_sharing_q: "Is er een overzicht van mensen die ik aan een aspect heb toegevoegd, maar die mij niet in een aspect hebben staan?"
- only_sharing_a: "Dat zijn mensen die jou aan een van hun aspecten hebben toegevoegd, maar die (nog) niet een een van jouw aspecten zitten. Met andere woorden: zijn delen wel met jou, maar je deelt niet met hen (asymmetrisch delen). Als je ze aan een aspect toevoegt, verschijnen ze voortaan onder dat aspect. Zie verder boven bij 'delen'."
+ only_sharing_a: "Dat zijn mensen die jou aan een van hun aspecten hebben toegevoegd, maar die (nog) niet in een van jouw aspecten zitten. Met andere woorden: zij delen wel met jou, maar je deelt niet met hen (asymmetrisch delen): je zou kunnen zeggen dat ze jou volgen. Als je ze aan een aspect toevoegt, verschijnen ze voortaan onder dat aspect en niet meer onder \"Delen alleen met mij\". Zie hierboven."
only_sharing_q: "Wie zijn de mensen die staan onder \"Delen alleen met mij\" op mijn contactenpagina?"
see_old_posts_a: "Nee, ze zien alleen je berichten voor dat aspect vanaf dat moment. Zij (en ieder ander natuurlijk) kunnen wel je eerdere openbare berichten op jouw profielpagina zien en die kunnen ze ook in hun eigen stream zien."
see_old_posts_q: "Als ik iemand aan een aspect toevoeg, kan die persoon dan de berichten zien die ik eerder voor dat aspect heb geplaatst?"
+ sharing_notification_a: "Je krijgt ook een melding als iemand met jou begint te delen."
+ sharing_notification_q: "Hoe weet ik of iemand begint om met mij te delen?"
title: "Delen"
tags:
filter_tags_a: "Dit kan niet niet in diaspora* zelf, maar sommige %{third_party_tools} kunnen dat wel voor je regelen."
filter_tags_q: "Hoe kan ik tags uit mijn stream filteren/uitsluiten?"
- followed_tags_a: "Nadat je een tag gezocht hebt (met #naamvandetag), kun je op de \"Volg #tag\" knop bovenaan in het scherm drukken. Die tag verschijnt dan ik de lijst met gevolgde tags links in het scherm. Als je op een van de tags klikt, verschijnt de tagpagina met de berichten waar die tag in staat. Klik op \"#Gevolgde Tags\" om een stream te zien met alle berichten waarin een van de door jou gevolgde tags staat. "
+ followed_tags_a: "Nadat je een tag gezocht hebt (met #naamvandetag), kun je op de \"Volg #tag\" knop bovenaan in het scherm drukken. Die tag verschijnt dan in de lijst met gevolgde tags links in het scherm. Als je op een van de tags klikt, verschijnt de tagpagina met de recente berichten met die tag. Klik op \"#Gevolgde Tags\" om een stream te zien met alle berichten met een van de door jou gevolgde tags."
followed_tags_q: "Wat zijn de \"#Gevolgde Tags\" en hoe volg ik een tag?"
people_tag_page_a: "Dat zijn de mensen die deze tag in hun openbare profielpagina hebben opgenomen."
people_tag_page_q: "Wie zijn de mensen die links op de tagpagina staan vermeld?"
tags_in_comments_a: "Een tag in een reactie verschijnt wel als een link naar de tags pagina, maar laat het bericht of de reactie niet zien op de tag pagina. Dat werkt alleen voor berichten."
tags_in_comments_q: "Kan ik tags in reacties plaatsen, of alleen in berichten?"
title: "Tags"
- what_are_tags_for_a: "Tags gebruik je om berichten te categoriseren, meestal per onderwerp. Als je zoekt op tags, dan zie alles berichten die met die tag zijn geplaatst (zowel openbare als besloten). Dit laat mensen die geïnteresseerd zijn in een bepaald onderwerp de openbare berichten erover makkelijk vinden."
+ what_are_tags_for_a: "Tags gebruik je om berichten te categoriseren, meestal per onderwerp. Als je zoekt op tags, dan zie alle berichten die met die tag zijn geplaatst (zowel openbare als besloten) als je ze mag zien. Dit laat mensen die geïnteresseerd zijn in een bepaald onderwerp de openbare berichten erover makkelijk vinden."
what_are_tags_for_q: "Waar gebruik je tags voor?"
- third_party_tools: "tools van derde partijen"
+ third_party_tools: "Tools van derde partijen"
title_header: "Hulp"
tutorial: "instructie"
tutorials: "instructies"
@@ -600,18 +599,18 @@ nl:
layouts:
application:
back_to_top: "Terug naar top"
- powered_by: "POWERED BY DIASPORA*"
+ powered_by: "Powered by diaspora*"
public_feed: "Publieke diaspora* kanaal van %{name}"
- source_package: "download het broncode pakket"
- toggle: "switch mobiele versie"
- whats_new: "wat is nieuw op Diaspora?"
- your_aspects: "jouw aspecten"
+ source_package: "Download het broncode pakket"
+ toggle: "Switch mobiele versie"
+ whats_new: "Wat is nieuw op Diaspora?"
+ your_aspects: "Jouw aspecten"
header:
- admin: "beheer"
- blog: "blog"
- code: "code"
+ admin: "Beheer"
+ blog: "Blog"
+ code: "Code"
help: "Help"
- login: "inloggen"
+ login: "Inloggen"
logout: "Uitloggen"
profile: "Profiel"
recent_notifications: "Recente notificaties"
@@ -620,32 +619,26 @@ nl:
likes:
likes:
people_dislike_this:
- few: "%{count} mensen vinden dit niet leuk"
- many: "%{count} mensen vinden dit niet leuk"
one: "%{count} persoon vindt dit niet leuk"
other: "%{count} mensen vinden dit niet leuk"
- two: "%{count} niet leuk"
- zero: "niemand vindt dit niet leuk"
+ zero: "Niemand vindt dit niet leuk"
people_like_this:
- few: "%{count} mensen vinden dit leuk"
- many: "%{count} mensen vinden dit leuk"
one: "%{count} persoon vindt dit leuk"
other: "%{count} mensen vinden dit leuk"
- two: "%{count} leuk"
- zero: "niemand vindt dit leuk"
+ zero: "Niemand vindt dit leuk"
people_like_this_comment:
one: "%{count} persoon vindt dit leuk"
other: "%{count} mensen vinden dit leuk"
- zero: "niemand vindt dit leuk"
+ zero: "Niemand vindt dit leuk"
limited: "Beperkt"
more: "Meer"
- next: "volgende"
+ next: "Volgende"
no_results: "Geen resultaten gevonden"
notifications:
also_commented:
- one: "%{actors} heeft ook op %{post_author} zijn %{post_link} gereageerd."
- other: "%{actors} hebben ook op %{post_author} zijn %{post_link} gereageerd."
- zero: "%{actors} heeft ook op %{post_author} zijn %{post_link} gereageerd."
+ one: "%{actors} heeft ook op %{post_author}'s %{post_link} gereageerd."
+ other: "%{actors} hebben ook op %{post_author}'s %{post_link} gereageerd."
+ zero: "%{actors} heeft ook op %{post_author}'s %{post_link} gereageerd."
also_commented_deleted:
few: "%{actors} hebben gereageerd op een verwijderd bericht."
many: "%{actors} heeft gereageerd op een verwijderde post."
@@ -683,10 +676,11 @@ nl:
mark_read: "Markeren als gelezen"
mark_unread: "Markeer ongelezen"
mentioned: "Vermeld"
+ no_notifications: "Je hebt nog geen meldingen."
notifications: "Notificaties"
reshared: "Doorgegeven"
- show_all: "toon alles"
- show_unread: "toon ongelezen"
+ show_all: "Toon alles"
+ show_unread: "Toon ongelezen"
started_sharing: "Begon te delen"
liked:
one: "%{actors} vindt jouw %{post_link} leuk."
@@ -724,22 +718,63 @@ nl:
other: "%{actors} hebben jouw verwijderde bericht doorgegeven."
zero: "%{actors} hebben jouw verwijderde bericht doorgegeven."
started_sharing:
- few: "%{actors} delen nu met jou."
- many: "%{actors} delen nu met jou."
one: "%{actors} deelt nu met jou."
other: "%{actors} delen nu met jou."
- two: "%{actors} zijn met je gaan delen."
- zero: "%{actors} deelt nu met jou."
+ zero: "%{actors} delen nu met jou."
notifier:
+ a_limited_post_comment: "Er is een nieuwe reactie op een besloten bericht in diaspora* dat je even moet beoordelen."
a_post_you_shared: "een bericht."
- accept_invite: "Accepteer jouw diaspora* uitnodiging!"
- click_here: "klik hier"
+ a_private_message: "Er is een nieuw privébericht voor jou in diaspora*."
+ accept_invite: "Accepteer je diaspora* uitnodiging!"
+ click_here: "Klik hier"
comment_on_post:
reply: "Reageer of bekijk %{name}'s bericht >"
confirm_email:
click_link: "Om je nieuwe e-mailadres te activeren %{unconfirmed_email}, klik op deze link:"
subject: "Activeer je nieuwe e-mailadres alstublieft %{unconfirmed_email}"
email_sent_by_diaspora: "Deze mail is gestuurd door %{pod_name}. Als je dit soort e-mail's niet meer wilt ontvangen,"
+ export_email:
+ body: |-
+ Hallo %{name},
+
+ Je gegevens zijn verwerkt en staan klaar. Je kunt ze downloaden door het volgen van [deze link](%{url}).
+
+ Groetjes,
+
+ De diaspora* e-mailrobot!      
+ subject: "Je persoonlijke gegevens staan klaar voor downloaden, %{name}"
+ export_failure_email:
+ body: |-
+ Hallo %{name}
+
+ we constateerden een probleempje bij het verwerken van de persoonlijke gegevens die je wilt downloaden.
+ Probeer het opnieuw!
+
+ Excuus,
+
+ De diaspora* e-mailrobot!       
+ subject: "Onze excuses, er was een probleempje met je gegevens, %{name}"
+ export_photos_email:
+ body: |-
+ Hallo, %{name}
+
+ Je foto's zijn verwerkt en staan klaar voor downloaden via [deze link] (%{url})
+
+ Groeten,
+
+ De diaspora* e-mailrobot!
+ subject: "Je foto's staan klaar voor downloaden, %{name}"
+ export_photos_failure_email:
+ body: |-
+ Hallo %{name}
+
+ er trad een fout op bij het klaarzetten van je foto's voor downloaden.
+ Probeer het opnieuw!
+
+ Sorry,
+
+ De diaspora* e-mailrobot!
+ subject: "Er was een probleempje met je fofo's, %{name}"
hello: "Hoi %{name}!"
invite:
message: |-
@@ -765,6 +800,22 @@ nl:
subject: "%{name} heeft jou vermeld op diaspora*"
private_message:
reply_to_or_view: "Reageer op of bekijk dit privégesprek >"
+ remove_old_user:
+ body: |-
+ Hallo,
+
+ het lijkt erop dat je je account op %{pod_url} niet meer nodig hebt, omdat je het meer dan %{after_days} dagen niet hebt gebruikt. Om onze actieve gebruikers goede prestaties van de server te geven, willen we ongebruikte accounts verwijderen uit de database.
+
+ We zouden je graag als lid van deze diaspora* gemeenschap willen behouden, dus je kunt je account wel houden als je dat wilt.
+
+ Als je je account wilt aanhouden, log dan in vóór %{remove_after}. En kijk daarna gerust weer even rond in diaspora*. Er is veel veranderd sinds je hier de laatste keer bent geweest en we denken dat je de verbeteringen wel leuk vindt. Volg wat #hashtags om voor jou relevante content te vinden.
+
+ Log hier in: %{login_url}. Als je je inloggegevens kwijt bent, vraag ze dan op vanaf die pagina.
+
+ Hopelijk tot ziens,
+
+ De diaspora* e-mailrobot!
+ subject: "Je diaspora* account is gemarkeerd voor verwijdering wegens inactiviteit"
report_email:
body: |-
Hallo,
@@ -804,10 +855,9 @@ nl:
add_contact:
invited_by: "Je bent uitgenodigd door"
add_contact_small:
- add_contact_from_tag: "contact toevoegen van tag"
+ add_contact_from_tag: "Contact toevoegen van tag"
aspect_list:
- edit_membership: "bewerk aspect lidmaatschap"
- few: "%{count} personen"
+ edit_membership: "Bewerken aspect lidmaatschap"
helper:
is_not_sharing: "%{name} deelt niet met jou"
is_sharing: "%{name} deelt met jou"
@@ -819,13 +869,12 @@ nl:
no_results: "Heey! Je moet wel ergens naar zoeken."
results_for: "zoekresultaten voor %{search_term}"
search_handle: "Gebruik hun diaspora* ID (gebruikersnaam@pod.tld) om je vrienden te vinden."
- searching: "zoeken, even geduld..."
+ searching: "Zoeken, even geduld..."
send_invite: "Nog steeds niets? Stuur een uitnodiging!"
- many: "%{count} mensen"
one: "1 persoon"
other: "%{count} mensen"
person:
- add_contact: "voeg contact toe"
+ add_contact: "Voeg contact toe"
already_connected: "Al verbonden"
pending_request: "Openstaand verzoek"
thats_you: "Dat ben jij!"
@@ -834,10 +883,10 @@ nl:
born: "geboortedatum"
edit_my_profile: "Bewerk mijn profiel"
gender: "geslacht"
- in_aspects: "in de aspecten"
+ in_aspects: "In de aspecten"
location: "locatie"
photos: "Foto's"
- remove_contact: "verwijder contact"
+ remove_contact: "Verwijder contact"
remove_from: "Verwijder %{name} uit %{aspect}?"
show:
closed_account: "Deze account is gesloten."
@@ -848,20 +897,19 @@ nl:
mention: "Noemen"
message: "Bericht"
not_connected: "Je deelt niet met deze persoon"
- recent_posts: "Recente Berichten"
- recent_public_posts: "Recente Openbare Berichten"
+ recent_posts: "Recente berichten"
+ recent_public_posts: "Recente openbare berichten"
return_to_aspects: "Ga terug naar je aspecten pagina"
see_all: "Zie alles"
- start_sharing: "start met delen"
+ start_sharing: "Start met delen"
to_accept_or_ignore: "om te accepteren of te negeren."
sub_header:
- add_some: "voeg wat toe"
- edit: "bewerk"
- you_have_no_tags: "je hebt geen tags!"
- two: "%{count} mensen"
+ add_some: "Voeg wat toe"
+ edit: "Bewerken"
+ you_have_no_tags: "Je hebt geen tags!"
webfinger:
fail: "Sorry, we konden %{handle} niet vinden."
- zero: "niemand"
+ zero: "Niemand"
photos:
comment_email_subject: "%{name}'s foto"
create:
@@ -874,8 +922,8 @@ nl:
editing: "Bewerken"
new:
back_to_list: "Terug naar de lijst"
- new_photo: "Nieuwe Foto"
- post_it: "plaats het!"
+ new_photo: "Nieuwe foto"
+ post_it: "Plaats het!"
new_photo:
empty: "{file} is leeg, selecteer de bestanden opnieuw zonder deze."
invalid_ext: "{file} heeft een ongeldige extensie. Alleen {extensions} zijn toegestaan."
@@ -884,15 +932,15 @@ nl:
or_select_one_existing: "of selecteer een van je al bestaande %{photos}\n"
upload: "Upload een nieuwe profielfoto!"
photo:
- view_all: "bekijk al %{name}'s foto's"
+ view_all: "Bekijk al %{name}'s foto's"
show:
- collection_permalink: "collectie permalink"
- delete_photo: "Verwijder Foto"
- edit: "bewerk"
+ collection_permalink: "Permalink collectie"
+ delete_photo: "Verwijderen foto"
+ edit: "Bewerken"
edit_delete_photo: "Bewerk foto-omschrijving / verwijder foto"
- make_profile_photo: "kies als profielfoto"
+ make_profile_photo: "Maak profielfoto"
show_original_post: "Toon origineel bericht"
- update_photo: "Update foto"
+ update_photo: "Bijwerken foto"
update:
error: "Foto veranderen niet gelukt."
notice: "Foto succesvol veranderd."
@@ -902,7 +950,7 @@ nl:
show:
destroy: "Verwijder"
not_found: "Sorry, dat bericht konden we niet vinden."
- permalink: "permalink"
+ permalink: "Permalink"
photos_by:
few: "%{count} foto's door %{author}"
many: "%{count} foto's door %{author}"
@@ -911,7 +959,7 @@ nl:
two: "Twee foto's door %{author}"
zero: "Geen foto's van %{author}"
reshare_by: "Doorgegeven door %{author}"
- previous: "vorige"
+ previous: "Vorige"
privacy: "Privacy"
privacy_policy: "Privacybeleid"
profile: "Profiel"
@@ -922,7 +970,7 @@ nl:
first_name: "Voornaam"
last_name: "Achternaam"
nsfw_check: "Markeer al mijn berichten als NSFW"
- nsfw_explanation: "NSFW ('not safe for work') is de standaard waarmee de diaspora* gemeenschap er zelf voor zorgt om mogelijk aanstootgevende berichten te markeren en af te schermen. Als je vaak mogelijk aanstootgevend materiaal plaatst, kun je het beste deze optie aankruisen, zodat de berichten niet in de stream van andere zichtbaar zijn, tenzij zij er zelf voor kiezen om de berichten wel te willen zien."
+ nsfw_explanation: "NSFW ('not safe for work') is de standaard waarmee de diaspora* gemeenschap er zelf voor zorgt om mogelijk aanstootgevende berichten te markeren en af te schermen. Als je vaak materiaal plaatst dat anderen aanstootgevend zouden kunnen vinden, kun je het beste deze optie in je profiel aankruisen, zodat de berichten niet in de stream van anderen zichtbaar zijn, tenzij zij er zelf voor kiezen om de berichten wel te willen zien."
nsfw_explanation2: "Als je deze optie niet selecteert, voeg dan de tag #nsfw toe aan ieder mogelijk aanstootgevend bericht."
update_profile: "Profiel bijwerken"
your_bio: "Jouw bio"
@@ -940,12 +988,9 @@ nl:
updated: "Profiel bijgewerkt"
public: "Openbaar"
reactions:
- few: "%{count} reacties"
- many: "%{count} reacties"
one: "1 reactie"
other: "%{count} reacties"
- two: "%{count} reactions"
- zero: "0 reacties"
+ zero: "Geen reacties"
registrations:
closed: "Registratie op deze diaspora* pod is niet mogelijk."
create:
@@ -959,29 +1004,26 @@ nl:
update: "Bijwerken"
invalid_invite: "De uitnodigingslink die je gebruikt is niet langer geldig!"
new:
- continue: "Ga door"
create_my_account: "Maak mijn account aan!"
- diaspora: "<3 diaspora*"
- email: "E-MAIL"
+ email: "E-mail"
enter_email: "Vul een e-mailadres in"
enter_password: "Vul een wachtwoord in (zes karakters minimaal)"
enter_password_again: "Vul hetzelfde wachtwoord nogmaals in"
enter_username: "Kies een gebruikersnaam (alleen letters, nummers, en underscores)"
- hey_make: "HEEY,<br/>MAAK<br/>IETS"
join_the_movement: "Sluit je aan!"
- password: "WACHTWOORD"
+ password: "Wachtwoord"
password_confirmation: "Wachtwoordbevestiging"
- sign_up: "AANMELDEN"
- sign_up_message: "Social Networking met een ♥"
+ sign_up: "Aanmelden"
+ sign_up_message: "Sociaal networken met een ♥"
submitting: "Verwerken..."
terms: "Door het aanmaken van een account accepteer je de %{terms_link}."
terms_link: "gebruiksvoorwaarden"
- username: "GEBRUIKER"
+ username: "Gebruiker"
report:
comment_label: "<b>Reactie</b>:</b>%{data}"
confirm_deletion: "Weet je zeker dat je het wilt verwijderen?"
delete_link: "Verwijder bericht"
- not_found: "<u>Het bericht/de reactie is niet gevonden. Het lijkt erop dat de gebruiker het al heeft verwijderd!</u>"
+ not_found: "<u>Bericht/Reactie niet gevonden. Het lijkt erop dat de gebruiker het al heeft verwijderd!</u>"
post_label: "<b>Bericht</b>: %{title}"
reason_label: "Reden: %{text}"
reported_label: "<b>Gemeld door</b> %{person}"
@@ -995,24 +1037,21 @@ nl:
requests:
create:
sending: "Versturen..."
- sent: "Je hebt gevraagd te delen met %{name}. Hij of zij zou het de eerstvolgende keer dat hij of zij inlogt op diaspora* moeten zien ."
+ sent: "Je hebt gevraagd te delen met %{name}. Hij of zij zou het de eerstvolgende keer dat hij of zij inlogt op diaspora* moeten zien."
destroy:
error: "Selecteer een aspect!"
ignore: "Contactverzoek genegeerd."
success: "Jullie delen nu."
helper:
new_requests:
- few: "%{count} nieuwe verzoeken!"
- many: "%{count} nieuwe verzoeken!"
- one: "nieuw verzoek!"
+ one: "Nieuw verzoek!"
other: "%{count} nieuwe verzoeken!"
- two: "%{count} nieuwe verzoeken!"
- zero: "geen nieuwe verzoeken"
+ zero: "Geen nieuwe verzoeken"
manage_aspect_contacts:
existing: "Bestaande contacten"
manage_within: "Beheer contacten in"
new_request_to_person:
- sent: "verzonden!"
+ sent: "Verzonden!"
reshares:
comment_email_subject: "%{resharer}'s doorgifte van %{author}'s post"
create:
@@ -1023,9 +1062,9 @@ nl:
one: "1 keer doorgegeven"
other: "%{count} keer doorgegeven"
zero: "Doorgeven"
- reshare_confirmation: "%{author}'s post doorgeven?"
+ reshare_confirmation: "%{author}'s bericht doorgeven?"
reshare_original: "Origineel doorgeven"
- reshared_via: "doorgegeven via"
+ reshared_via: "Doorgegeven via"
show_original: "Toon origineel"
search: "Zoek"
services:
@@ -1037,33 +1076,33 @@ nl:
destroy:
success: "Authenticatie succesvol vernietigd."
failure:
- error: "er ging iets mis bij het verbinden met die service"
+ error: "Er ging iets mis bij het verbinden met die service"
finder:
fetching_contacts: "diaspora* is je %{service} vrienden aan het invullen, probeer het over een paar minuten nog een keer."
no_friends: "Geen Facebook vrienden gevonden."
- service_friends: "%{service} Vrienden"
+ service_friends: "%{service} vrienden"
index:
connect_to_facebook: "Verbind met Facebook"
connect_to_tumblr: "Verbind met Tumblr"
connect_to_twitter: "Verbind met Twitter"
connect_to_wordpress: "Verbinden met Wordpress"
- disconnect: "koppel los"
+ disconnect: "Loskoppelen"
edit_services: "Bewerk services"
- logged_in_as: "ingelogd als"
+ logged_in_as: "Ingelogd als"
no_services: "Je hebt nog geen services verbonden."
- really_disconnect: "verbreek verbinding met %{service}?"
+ really_disconnect: "Verbreek verbinding met %{service}?"
services_explanation: "Verbinden met andere diensten biedt je de mogelijkheid om je diaspora* berichten ook daar te plaatsen"
inviter:
click_link_to_accept_invitation: "Klik op deze link om de uitnodiging te accepteren"
join_me_on_diaspora: "Volg me op diaspora*"
remote_friend:
- invite: "uitnodigen"
+ invite: "Uitnodigen"
not_on_diaspora: "Nog niet op diaspora*"
- resend: "herstuur"
+ resend: "Opnieuw versturen"
settings: "Instellingen"
share_visibilites:
update:
- post_hidden_and_muted: "%{name}'s bericht is verborgen, en notificaties worden niet getoond."
+ post_hidden_and_muted: "%{name}'s bericht is verborgen en notificaties worden niet getoond."
see_it_on_their_profile: "Als je updates van dit bericht wilt zien, bezoek %{name}'s profiel pagina."
shared:
add_contact:
@@ -1075,6 +1114,8 @@ nl:
your_diaspora_username_is: "Jouw diaspora* gebruikersnaam is: %{diaspora_handle}"
aspect_dropdown:
add_to_aspect: "Voeg contact toe"
+ mobile_row_checked: "%{name} (verwijderen)"
+ mobile_row_unchecked: "%{name} (toevoegen)"
toggle:
few: "In %{count} aspecten"
many: "In %{count} aspecten"
@@ -1085,8 +1126,8 @@ nl:
contact_list:
all_contacts: "Alle contacten"
footer:
- logged_in_as: "ingelogd als %{name}"
- your_aspects: "jouw aspecten"
+ logged_in_as: "Ingelogd als %{name}"
+ your_aspects: "Jouw aspecten"
invitations:
by_email: "Via e-mail"
dont_have_now: "Momenteel heb je er geen, maar meer uitnodigingen volgen spoedig!"
@@ -1101,8 +1142,8 @@ nl:
new: "Nieuw %{type} van %{from}"
public_explain:
atom_feed: "Atom feed"
- control_your_audience: "Beheer je Publiek"
- logged_in: "verbonden met %{service}"
+ control_your_audience: "Beheer je publiek"
+ logged_in: "Verbonden met %{service}"
manage: "beheer verbonden services"
new_user_welcome_message: "Gebruik #hashtags om je berichten te classificeren en mensen te vinden die je interesses delen. Vermeld interessante mensen met @Mentions."
outside: "Openbare berichten zijn zichtbaar voor mensen buiten diaspora*."
@@ -1110,12 +1151,12 @@ nl:
title: "Stel verbonden services in"
visibility_dropdown: "Gebruik dit dropdown menu om de zichtbaarheid van je post aan te selecteren. (We suggereren je eerste post publiek te maken.)"
publisher:
- all: "al"
- all_contacts: "alle contacten"
+ all: "Alle"
+ all_contacts: "Alle contacten"
discard_post: "Maak veld leeg"
formatWithMarkdown: "Je kunt %{markdown_link} gebruiken om je bericht op te maken"
get_location: "Haal je locatie op"
- make_public: "maak openbaar"
+ make_public: "Maak openbaar"
new_user_prefill:
hello: "Hallo iedereen, ik ben #%{new_user_tag}. "
i_like: "Ik ben geïnteresseerd in %{tags}."
@@ -1130,17 +1171,17 @@ nl:
post_a_message_to: "Plaats een bericht aan %{aspect}"
posting: "Plaatsen..."
preview: "Voorbeeld"
- publishing_to: "delen met: "
+ publishing_to: "Publiceren naar: "
remove_location: "Verwijder locatie"
share: "Delen"
- share_with: "deel met"
+ share_with: "Delen met"
upload_photos: "Upload fotos"
whats_on_your_mind: "Waar denk je aan?"
reshare:
reshare: "Doorgeven"
stream_element:
connect_to_comment: "Verbind met deze gebruiker om op zijn of haar berichten te reageren"
- currently_unavailable: "reageren nog niet beschikbaar"
+ currently_unavailable: "Reageren nu niet beschikbaar"
dislike: "Vind ik niet meer leuk"
hide_and_mute: "Verberg en blokkeer bericht"
ignore_user: "Negeer %{name}"
@@ -1148,18 +1189,33 @@ nl:
like: "Vind ik leuk"
nsfw: "Dit bericht is aangemerkt als NSFW door de auteur. %{link}"
shared_with: "Gedeeld met: %{aspect_names}"
- show: "laat zien"
+ show: "Laat zien"
unlike: "vind ik niet meer leuk"
- via: "via %{link}"
- via_mobile: "via mobiel"
+ via: "Via %{link}"
+ via_mobile: "Via mobiel"
viewable_to_anyone: "Deze post is zichtbaar voor iedereen op het internet"
simple_captcha:
- label: "Voer de code in in het veld:"
+ label: "Voer de code in dit veld in:"
message:
default: "De ingevoerde geheime code is niet hetzelfde als de afbeelding"
failed: "Menselijke verificatie mislukt"
user: "De geheime afbeelding en de ingevoerde code zijn verschillend"
placeholder: "Geef de waarde van de afbeelding op"
+ statistics:
+ active_users_halfyear: "Actief laatste half jaar"
+ active_users_monthly: "Actieve per maand"
+ closed: "Besloten"
+ disabled: "Niet beschikbaar"
+ enabled: "Beschikbaar"
+ local_comments: "Lokale reacties"
+ local_posts: "Lokale berichten"
+ name: "Naam"
+ network: "Netwerk"
+ open: "Open"
+ registrations: "Registraties"
+ services: "Services"
+ total_users: "Aantal gebruikers"
+ version: "Versie"
status_messages:
create:
success: "Succesvol genoemd: %{names}"
@@ -1169,12 +1225,11 @@ nl:
no_message_to_display: "Geen bericht om te weergeven."
new:
mentioning: "Noem: %{person}"
- too_long:
- one: "zorg ervoor dat je statusbericht korter is dan %{count} teken"
- other: "zorg ervoor dat je statusberichten korter zijn dan %{count} tekens"
- zero: "zorg ervoor dat je statusberichten korter zijn dan %{count} tekens"
+ too_long: "Zorg ervoor dat je statusbericht korter is dan %{count} tekens. Nu is het %{current_length} tekens lang"
stream_helper:
hide_comments: "Verberg alle reacties"
+ no_more_posts: "Je bent aan het eind van je stream beland."
+ no_posts_yet: "Er zijn nog geen berichten."
show_comments:
few: "Toon nog %{count} andere reacties."
many: "Toon nog %{count} andere reacties."
@@ -1186,11 +1241,11 @@ nl:
activity:
title: "Mijn activiteit"
aspects:
- title: "Jouw Aspecten"
+ title: "Mijn aspecten"
aspects_stream: "Aspecten"
comment_stream:
contacts_title: "Mensen op wiens berichten je hebt gereageerd"
- title: "Reacties op jou berichten"
+ title: "Reacties op jouw berichten"
community_spotlight_stream: "Community aanrader"
followed_tag:
add_a_tag: "Voeg een tag toe"
@@ -1200,20 +1255,19 @@ nl:
followed_tags_stream: "#Gevolgde Tags"
like_stream:
contacts_title: "Mensen wiens posts je leuk vind"
- title: "Prikbord"
+ title: "Interessante stream"
mentioned_stream: "@Vermeldingen"
mentions:
contacts_title: "Mensen die jou hebben genoemd"
title: "@Mij"
multi:
- contacts_title: "Volk in je Verkenstream"
+ contacts_title: "Mensen in je stream"
title: "Stream"
public:
contacts_title: "Recente Posters"
- title: "Publieke activiteit"
+ title: "Openbare activiteit"
tags:
contacts_title: "Mensen die deze tag cool vinden"
- tag_prefill_text: "Over %{tag_name} gesproken, ... "
title: "Posts getagged: %{tags}"
tag_followings:
create:
@@ -1224,19 +1278,17 @@ nl:
failure: "Het is niet gelukt om te stoppen met het volgen van #%{name}. Misschien ben je al succesvol gestopt met volgen?"
success: "Jammer! Je bent gestopt met het volgen van #%{name}."
tags:
+ name_too_long: "Zorg ervoor dat je tagnaam korter is dan %{count} tekens. Nu is dat %{current_length} tekens."
show:
follow: "Volg #%{tag}"
- followed_by_people:
- one: "gevolgd door %{count}"
- other: "gevolgd door %{count}"
- zero: "gevolgd door niemand"
following: "Volgt #%{tag}"
- nobody_talking: "Nog niemand heeft het over %{tag}."
none: "Deze lege tag bestaat niet!"
- people_tagged_with: "Personen gemerkt met %{tag}"
- posts_tagged_with: "Berichten gemerkt met #%{tag}"
stop_following: "Stop met volgen van #%{tag}"
- terms_and_conditions: "Termen en Condities"
+ tagged_people:
+ one: "1 persoon heeft getagged met %{tag}"
+ other: "%{count} personen hebben getagged met %{tag}"
+ zero: "Niemand heeft getagged met %{tag}"
+ terms_and_conditions: "Algemene voorwaarden"
undo: "Ongedaan maken?"
username: "Gebruikersnaam"
users:
@@ -1248,7 +1300,7 @@ nl:
success: "Je account is op slot gezet. Het kan tot 20 minuten duren voordat het sluiten van je account voltooid is. Bedankt voor het uitproberen van diaspora*."
wrong_password: "Het ingevoerde wachtwoord komt niet overeen met je huidige wachtwoord."
edit:
- also_commented: "iemand na jou op een bericht van jouw contact reageert"
+ also_commented: "iemand reageert op een bericht waarop jij reageerde op"
auto_follow_aspect: "Aspect voor automatisch gevolgde gebruikers:"
auto_follow_back: "Automatisch terugvolgen wanneer iemand jou volgt"
change: "Verander"
@@ -1257,35 +1309,42 @@ nl:
change_password: "Verander wachtwoord"
character_minimum_expl: "moet ten minste zes karakters bevatten"
close_account:
- dont_go: "Hey, ga alsjeblieft niet weg!"
- if_you_want_this: "Als je dit echt wilt, typ je wachtwoord onder in en klik 'Sluit Account'"
- lock_username: "Dit vergrendelt je gebruikersnaam als je besluit om weer te registeren."
- locked_out: "Je wordt afgemeld en buitengesloten van je account."
- make_diaspora_better: "We willen graag dat je ons helpt om diaspora* te verbeteren, dus help ons in plaats van weg te gaan. Als je wel weg wilt gaan, dan vertellen we je wat er dan gebeurt."
+ dont_go: "He daar, ga alsjeblieft niet weg!"
+ if_you_want_this: "Als je dit echt wilt, typ je wachtwoord hieronder in en klik op 'Sluit Account'"
+ lock_username: "Dit vergrendelt je gebruikersnaam. Je kunt op deze pod later niet een nieuw account met dezelfde ID maken."
+ locked_out: "Je wordt afgemeld en afgesloten van je account totdat het is verwijderd."
+ make_diaspora_better: "We zouden liever willen dat je ons helpt om diaspora* te verbeteren dan dat je weggaat. Als je echt weg wilt gaan, dan vertellen we je wat er dan gebeurt:"
mr_wiggles: "Mr Wiggles zal het niet leuk vinden je te zien gaan"
- no_turning_back: "Op het moment is er geen weg terug."
- what_we_delete: "We verwijderen al je berichten en profielgegevens zo snel mogelijk. Je reacties blijven bewaard ten behoeve van de context maar zijn gekoppeld aan je diaspora* ID, niet aan jouw naam."
+ no_turning_back: "Er geen weg terug. Als je door wilt gaan, voer dan hieronder je wachtwoord in."
+ what_we_delete: "We verwijderen al je berichten en profielgegevens zo snel mogelijk. Je reacties blijven bewaard ten behoeve van de context maar ze zijn gekoppeld aan je diaspora* ID, niet aan jouw naam."
close_account_text: "Sluit account"
comment_on_post: "iemand op jouw bericht reageert"
current_password: "Huidig wachtwoord"
current_password_expl: "het wachtwoord waar je mee inlogt..."
- download_photos: "download mijn foto's"
- download_xml: "download mijn xml"
+ download_export: "Download mijn profiel"
+ download_export_photos: "Download mijn foto's"
+ download_photos: "Download mijn foto's"
edit_account: "Bewerk account"
email_awaiting_confirmation: "We hebben een activatielink verzonden naar %{unconfirmed_email}. Totdat je het adres geactiveerd hebt zullen we je originele adress blijven gebruiken %{email}."
export_data: "Exporteer data"
+ export_in_progress: "We zijn bezig je aanvraag te verwerken. Controleer het opnieuw over een paar ogenblikken."
+ export_photos_in_progress: "We verwerken nu je foto's. Kom zometeen terug."
following: "Volgvoorkeuren"
getting_started: "Nieuwe gebruikersvoorkeuren"
+ last_exported_at: "(Laatst bijgewerkt op %{timestamp})"
liked: "iemand je bericht leuk vindt"
mentioned: "je genoemd wordt in een bericht"
new_password: "Nieuw wachtwoord"
- photo_export_unavailable: "Foto's exporteren is op dit moment niet beschikbaar"
private_message: "je een privébericht ontvangt"
receive_email_notifications: "Ontvang e-mail notificaties wanneer:"
+ request_export: "Aanvragen van mijn profielgegevens"
+ request_export_photos: "Vraag mijn foto's op"
+ request_export_photos_update: "Ververs mijn foto's"
+ request_export_update: "Ververs mijn profielgegevens"
reshared: "iemand jouw bericht doorgeeft"
show_community_spotlight: "Laat Community Spotlight zien in Stream"
- show_getting_started: "Maak Beginnen opnieuw mogelijk"
- someone_reported: "iemand zond een melding in"
+ show_getting_started: "Laat beginnerstips zien"
+ someone_reported: "Iemand zond een melding in"
started_sharing: "iemand met je begint te delen"
stream_preferences: "Stream voorkeuren"
your_email: "Jouw e-mail"
@@ -1294,7 +1353,7 @@ nl:
awesome_take_me_to_diaspora: "Super! Neem me naar diaspora*"
community_welcome: "De diaspora* gemeenschap is blij je aan boord te hebben!"
connect_to_facebook: "We kunnen het een beetje vlotter laten lopen door de %{link} naar diaspora*. Dit haalt je naam en foto op en maakt delen van berichten mogelijk."
- connect_to_facebook_link: "verbinden met je Facebook account"
+ connect_to_facebook_link: "Verbinden met je Facebook account"
hashtag_explanation: "Hashtags maken het je makkelijk je interesses volgen. Bovendien kunnen ze je helpen bij het vinden van nieuwe contacten op diaspora*."
hashtag_suggestions: "Probeer het volgen van tags zoals #art, #movies, #gif, etc. eens uit."
saved: "Opgeslagen!"
@@ -1303,7 +1362,9 @@ nl:
who_are_you: "Wie ben je?"
privacy_settings:
ignored_users: "Genegeerde Gebruikers"
+ no_user_ignored_message: "Je negeert momenteel geen andere gebruiker"
stop_ignoring: "Stop negeren"
+ strip_exif: "Verwijder metadata van de geüploade afbeeldingen, zoals locatie, auteur en cameratype (aanbevolen)"
title: "Privacy Instellingen"
public:
does_not_exist: "Gebruiker %{username} bestaat niet!"
@@ -1320,11 +1381,11 @@ nl:
unconfirmed_email_changed: "E-mail gewijzigd. Nog te activeren."
unconfirmed_email_not_changed: "E-mail wijzigen mislukt"
webfinger:
- fetch_failed: "ophalen van webfinger profiel is mislukt voor %{profile_url}"
- hcard_fetch_failed: "er was een probleem bij het ophalen van de hcard voor %{account}"
+ fetch_failed: "Ophalen van webfinger profiel voor %{profile_url} is mislukt."
+ hcard_fetch_failed: "Er was een probleem bij het ophalen van de hcard voor %{account}"
no_person_constructed: "Er kon geen persoon worden gemaakt van deze hcard."
- not_enabled: "webfinger lijkt niet aan te staan voor %{account}'s provider"
- xrd_fetch_failed: "er was een probleem bij het verkrijgen van de xrd van het account %{account}"
+ not_enabled: "Webfinger lijkt niet aan te staan voor %{account}'s provider"
+ xrd_fetch_failed: "Er was een probleem bij het verkrijgen van de xrd van het account %{account}"
welcome: "Welkom!"
will_paginate:
next_label: "volgende &raquo;"
diff --git a/config/locales/diaspora/nn.yml b/config/locales/diaspora/nn.yml
index 4328c516e..85641c75c 100644
--- a/config/locales/diaspora/nn.yml
+++ b/config/locales/diaspora/nn.yml
@@ -86,7 +86,8 @@ nn:
one: "ein brukar funne"
other: "%{count} brukarar funne"
zero: "ingen brukarar funne"
- you_currently: "du har %{user_invitation} igjen %{link}"
+ you_currently:
+ other: "du har %{user_invitation} igjen %{link}"
weekly_user_stats:
amount_of:
one: "Mengd nye brukarar denne veka: %{count}"
@@ -111,8 +112,6 @@ nn:
add_to_aspect:
failure: "Klarte ikkje å leggja kontakten til aspektet."
success: "La kontakten til aspektet."
- aspect_contacts:
- done_editing: "endringar er ferdige"
aspect_listings:
add_an_aspect: "+ Legg til eit aspekt"
deselect_all: "Vel vekk alle"
@@ -131,21 +130,14 @@ nn:
failure: "%{name} må vera tom for å kunna slettast."
success: "%{name} vart fjerna."
edit:
- add_existing: "Legg til ein kontakt som finst frå før av"
aspect_list_is_not_visible: "aspektet er gøymt frå andre i aspektet"
aspect_list_is_visible: "aspektlista er synleg for andre i aspektet"
confirm_remove_aspect: "Er du sikker på at du vil sletta aspektet?"
- done: "Utført"
make_aspect_list_visible: "skal kontaktane i dette aspektet kunna sjå kvarandre?"
remove_aspect: "Slett dette aspektet"
rename: "gje nytt namn"
update: "oppdatering"
updating: "oppdaterer"
- few: "%{count} aspekt"
- helper:
- are_you_sure: "Er du trygg på at du vil sletta dette aspektet?"
- aspect_not_empty: "Aspektet er ikkje tomt"
- remove: "fjern"
index:
diaspora_id:
content_1: "Diaspora-ID-en din er:"
@@ -185,11 +177,6 @@ nn:
heading: "Kopla tenester"
unfollow_tag: "Slutt å følgja #%{tag}"
welcome_to_diaspora: "Velkomen til Diaspora, %{name}!"
- many: "%{count} aspekt"
- move_contact:
- error: "Klarte ikkje å flytta kontakten: %{inspect}"
- failure: "verka ikkje %{inspect}"
- success: "Personen vart flytta til eit nytt aspekt"
new:
create: "Lag"
name: "Namn (berre du kan sjå det)"
@@ -207,14 +194,6 @@ nn:
family: "Familie"
friends: "Vener"
work: "Arbeid"
- selected_contacts:
- manage_your_aspects: "Handsam aspekta dine."
- no_contacts: "Du har ingen kontaktar her enno."
- view_all_community_spotlight: "Sjå alle kreative medlemer"
- view_all_contacts: "Syn alle kontaktane"
- show:
- edit_aspect: "endra aspektet"
- two: "%{count} aspekt"
update:
failure: "Aspektet ditt, %{name}, hadde eit for langt namn til å bli lagra."
success: "Aspektet ditt, %{name}, er vorte endra."
@@ -234,36 +213,27 @@ nn:
post_success: "Sendt. Lukkar."
cancel: "Avbryt"
comments:
- few: "%{count} kommentarar"
- many: "%{count} kommentarar"
new_comment:
comment: "Kommenter"
commenting: "Kommenterer …"
one: "1 kommentar"
other: "%{count} kommentarar"
- two: "%{count} kommentarar"
zero: "ingen kommentarar"
contacts:
create:
failure: "Klarte ikkje å laga kontakten"
- few: "%{count} kontaktar"
index:
add_a_new_aspect: "Legg til eit nytt aspekt"
add_to_aspect: "legg kontaktar til %{name}"
- add_to_aspect_link: "legg kontaktar til i %{name}"
all_contacts: "Alle kontaktane"
community_spotlight: "Kreative medlemer"
- many_people_are_you_sure: "Er du sikker på at du vil starte ein privat samtale med meir enn %{suggested_limit} kontaktar? Å dele dette i eit aspekt kan vere ein betre måte å kontakte dei på."
my_contacts: "Kontaktane mine"
no_contacts: "Du må leggja til nokre kontaktar."
no_contacts_message: "Ta ein titt på %{community_spotlight}"
- no_contacts_message_with_aspect: "Ta ein titt på %{community_spotlight} eller %{add_to_aspect_link}"
only_sharing_with_me: "Deler berre med meg"
- remove_person_from_aspect: "Fjerna %{person_name} frå \"%{aspect_name}\""
start_a_conversation: "Start ein samtale"
title: "Kontaktar"
your_contacts: "Kontaktane dine"
- many: "%{count} kontaktar"
one: "1 kontakt"
other: "%{count} kontaktar"
sharing:
@@ -271,7 +241,6 @@ nn:
spotlight:
community_spotlight: "Kreative medlemer"
suggest_member: "Foreslå eit medlem"
- two: "%{count} kontaktar"
zero: "kontaktar"
conversations:
conversation:
@@ -280,8 +249,6 @@ nn:
fail: "Ugyldig melding"
no_contact: "Hei, du må leggje til kontakten først!"
sent: "Meldinga er sendt"
- destroy:
- success: "Samtalen blei fjerna"
helper:
new_messages:
few: "%{count} nye meldingar"
@@ -546,7 +513,6 @@ nn:
add_contact_from_tag: "legg til kontakt frå etiketten"
aspect_list:
edit_membership: "endra aspektmedlemskap"
- few: "%{count} personar"
helper:
is_not_sharing: "%{name} delar ikkje med deg"
is_sharing: "%{name} delar med deg"
@@ -557,7 +523,6 @@ nn:
no_results: "Du må søkja etter noko."
results_for: "søkjeresultat for"
searching: "me leiter, ver ven og vent litt..."
- many: "%{count} personar"
one: "1 person"
other: "%{count} personar"
person:
@@ -594,7 +559,6 @@ nn:
add_some: "legg til noko"
edit: "endra"
you_have_no_tags: "du har ingen etikettar."
- two: "%{count} personar"
webfinger:
fail: "Vi fann dessverre ikkje %{handle}."
zero: "ingen personar"
@@ -686,15 +650,12 @@ nn:
update: "Oppdater"
invalid_invite: "Invitasjonslenkja du nytta er ikkje lengjer gyldig!"
new:
- continue: "Vidare"
create_my_account: "Lag kontoen min."
- diaspora: "♥ Diaspora*"
email: "E-POST"
enter_email: "Skriv ei e-postadresse"
enter_password: "Skriv eit passord (minst seks teikn)"
enter_password_again: "Skriv passordet éin gong til"
enter_username: "Vel eit brukarnamn (berre bokstavar, tal og understrekingsteikn)"
- hey_make: "HEI,<br/>LAG<br/>NOKO."
join_the_movement: "Vert med i rørsla!"
password: "PASSORD"
password_confirmation: "Passordstadfesting"
@@ -860,13 +821,7 @@ nn:
no_message_to_display: "Ingen innlegg kan synast."
new:
mentioning: "Nemner: %{person}"
- too_long:
- few: "sjå til at statusmeldingane dine har færre enn %{count} teikn"
- many: "sjå til at statusmeldingane dine har færre enn %{count} teikn"
- one: "sjå til at statusmeldingane dine har færre enn %{count} teikn"
- other: "sjå til at statusmeldingane dine har færre enn %{count} teikn"
- two: "sjå til at statusmeldingane dine har færre enn %{count} teikn"
- zero: "sjå til at statusmeldingane dine har færre enn %{count} teikn"
+ too_long: "{\"few\"=>\"sjå til at statusmeldingane dine har færre enn %{count} teikn\", \"many\"=>\"sjå til at statusmeldingane dine har færre enn %{count} teikn\", \"one\"=>\"sjå til at statusmeldingane dine har færre enn %{count} teikn\", \"other\"=>\"sjå til at statusmeldingane dine har færre enn %{count} teikn\", \"two\"=>\"sjå til at statusmeldingane dine har færre enn %{count} teikn\", \"zero\"=>\"sjå til at statusmeldingane dine har færre enn %{count} teikn\"}"
stream_helper:
hide_comments: "Gøym alle kommentarane"
show_comments:
@@ -904,7 +859,6 @@ nn:
title: "Offentleg aktivitet"
tags:
contacts_title: "Personar som elskar denne etiketten"
- tag_prefill_text: "Greia med %{tag_name} er... "
title: "Innlegg merka med: %{tags}"
tag_followings:
create:
@@ -918,10 +872,7 @@ nn:
show:
follow: "Følg #%{tag}"
following: "Følgjer #%{tag}"
- nobody_talking: "Det er enno ingen som taler om %{tag}."
none: "Det finnast ikkje tomme tags!"
- people_tagged_with: "Personar som er merka med %{tag}"
- posts_tagged_with: "Meldingar som er merka med #%{tag}"
stop_following: "Følg ikkje #%{tag} lenger"
terms_and_conditions: "Vilkår og retningslinjer"
undo: "Gjera om?"
@@ -957,7 +908,6 @@ nn:
current_password: "Gjeldande passord"
current_password_expl: "det du loggar på med..."
download_photos: "Last ned bileta mine"
- download_xml: "Last ned xml-en min"
edit_account: "Endra kontoen"
email_awaiting_confirmation: "Vi har sendt ei aktiveringslenkje til %{unconfirmed_email}. Vi vil halda fram med å senda til originaladressa di, %{email}, fram til du følgjer lenkja og tek i bruk den nye."
export_data: "Eksporter data"
@@ -966,7 +916,6 @@ nn:
liked: "… nokon liker innlegget ditt?"
mentioned: "… du er nemnt i eit innlegg?"
new_password: "Nytt passord"
- photo_export_unavailable: "For tida er det ikkje mogleg å eksportera bilete"
private_message: "… du mottek ei privat melding?"
receive_email_notifications: "Få e-postvarsel når …"
reshared: "… nokon deler innlegget ditt vidare?"
diff --git a/config/locales/diaspora/pa.yml b/config/locales/diaspora/pa.yml
index e5de45f08..617f470eb 100644
--- a/config/locales/diaspora/pa.yml
+++ b/config/locales/diaspora/pa.yml
@@ -29,9 +29,6 @@ pa:
edit:
make_aspect_list_visible: "make aspect list visible to others in aspect"
rename: "ਨਾਂ-ਬਦਲੋ"
- few: "%{count} aspects"
- helper:
- remove: "ਹਟਾਓ"
index:
handle_explanation: "This is your diaspora handle. Like an email address, you can give this to people to reach you."
help:
@@ -41,7 +38,6 @@ pa:
tag_question: "#question"
no_contacts: "ਕੋਈ ਸੰਪਰਕ ਨਹੀਂ"
no_tags: "No tags"
- many: "%{count} aspects"
new:
name: "Name"
no_contacts_message:
@@ -53,7 +49,6 @@ pa:
seed:
family: "ਪਰਿਵਾਰ"
work: "ਕੰਮ"
- two: "%{count} aspects"
zero: "no aspects"
back: "ਪਿੱਛੇ"
bookmarklet:
@@ -61,13 +56,10 @@ pa:
heading: "Diaspora Bookmarklet"
cancel: "ਰੱਦ ਕਰੋ"
comments:
- few: "%{count} comments"
- many: "%{count} comments"
new_comment:
comment: "ਟਿੱਪਣੀ"
commenting: "ਟਿੱਪਣੀ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ..."
contacts:
- few: "%{count} contacts"
index:
add_to_aspect: "Add contacts to %{name}"
no_contacts: "No contacts."
@@ -233,10 +225,8 @@ pa:
password: "ਪਾਸਵਰਡ"
password_confirmation: "ਪਾਸਵਰਡ ਪੁਸ਼ਟੀ"
people:
- few: "%{count} people"
helper:
results_for: "%{params} ਲਈ ਨਤੀਜੇ"
- many: "%{count} people"
one: "1 person"
other: "%{count} people"
person:
@@ -353,13 +343,7 @@ pa:
status_messages:
helper:
no_message_to_display: "ਵੇਖਾਉਣ ਲਈ ਕੋਈ ਸੁਨੇਹਾ ਨਹੀਂ ਹੈ।"
- too_long:
- few: "please make your status messages less than %{count} characters"
- many: "please make your status messages less than %{count} characters"
- one: "please make your status messages less than %{count} character"
- other: "please make your status messages less than %{count} characters"
- two: "please make your status messages less than %{count} characters"
- zero: "please make your status messages less than %{count} characters"
+ too_long: "{\"few\"=>\"please make your status messages less than %{count} characters\", \"many\"=>\"please make your status messages less than %{count} characters\", \"one\"=>\"please make your status messages less than %{count} character\", \"other\"=>\"please make your status messages less than %{count} characters\", \"two\"=>\"please make your status messages less than %{count} characters\", \"zero\"=>\"please make your status messages less than %{count} characters\"}"
stream_helper:
hide_comments: "ਟਿੱਪਣੀਆਂ ਓਹਲੇ ਕਰੋ"
show_comments:
diff --git a/config/locales/diaspora/pl.yml b/config/locales/diaspora/pl.yml
index d236f0897..f0f8b691c 100644
--- a/config/locales/diaspora/pl.yml
+++ b/config/locales/diaspora/pl.yml
@@ -10,8 +10,10 @@ pl:
_contacts: "Kontakty"
_help: "Pomoc"
_home: "Główna"
- _photos: "zdjęcia"
+ _photos: "Zdjęcia"
_services: "Usługi"
+ _statistics: "Statystyki"
+ _terms: "warunki"
account: "Konto"
activerecord:
errors:
@@ -95,10 +97,27 @@ pl:
other: "%{count} użytkowników"
zero: "Żaden użytkownik"
week: "Tydzień"
+ user_entry:
+ account_closed: "konto zamknięte"
+ diaspora_handle: "Identyfikator Diaspory"
+ email: "Email"
+ guid: "GUID"
+ id: "ID"
+ last_seen: "ostatnio widziany"
+ ? "no"
+ : nie
+ nsfw: "#nsfw"
+ unknown: "nieznany"
+ ? "yes"
+ : tak
user_search:
- account_closing_scheduled: "Konto należące do %{name} jest przewidziane do zamknięcia. Zostanie to wykonane w przecigu kilku minut..."
+ account_closing_scheduled: "Konto należące do %{name} jest przewidziane do zamknięcia. Zostanie to wykonane w przecigu kilku chwil..."
+ account_locking_scheduled: "Konto użytkownika %{name} oznaczone do zablokowania. Zostanie przetworzone za kilka chwil..."
+ account_unlocking_scheduled: "Konto użytkownika %{name} oznaczone do odblokowania. Zostanie przetworzone za kilka chwil..."
add_invites: "dodaj zaproszenia"
are_you_sure: "Czy na pewno chcesz zamknąć to konto?"
+ are_you_sure_lock_account: "Na pewno zablokować to konto?"
+ are_you_sure_unlock_account: "Na pewno odblokować to konto?"
close_account: "zamknij konto"
email_to: "Zaproś przez e-mail"
under_13: "Wyświetl użytkowników młodszych niż 13 lat."
@@ -127,9 +146,9 @@ pl:
all_aspects: "Wszystkie aspekty"
application:
helper:
- unknown_person: "nieznana osoba"
+ unknown_person: "Nieznana osoba"
video_title:
- unknown: "Wideo bez nazwy"
+ unknown: "Film bez tytułu"
are_you_sure: "Czy na pewno?"
are_you_sure_delete_account: "Czy na pewno chcesz zamknąć swoje konto? Tego nie można cofnąć!"
aspect_memberships:
@@ -141,8 +160,6 @@ pl:
add_to_aspect:
failure: "Nie udało się dodać kontaktu do aspektu."
success: "Dodano kontakt to aspektu."
- aspect_contacts:
- done_editing: "zakończono edycję"
aspect_listings:
add_an_aspect: "+ Dodaj aspekt"
deselect_all: "Odznacz wszystkie"
@@ -161,23 +178,18 @@ pl:
failure: "%{name} nie jest pusty i nie może być usunięty."
success: "%{name} został usunięty."
edit:
- add_existing: "Dodaj istniejący kontakt"
+ aspect_chat_is_enabled: "Kontakty w tym aspekcie mogą z tobą czatować."
+ aspect_chat_is_not_enabled: "Kontakty w tym aspekcie nie mogą z tobą czatować."
aspect_list_is_not_visible: "Kontakty z tego aspektu nie widzą się nawzajem."
aspect_list_is_visible: "Kontakty z tego aspektu mogą zobaczyć się nawzajem."
confirm_remove_aspect: "@{m,f:Jesteś|n:Czy na}{ pew}{m:ien|f:na|n:no}{m,f:, że } chcesz usunąć ten aspekt?"
- done: "Zrobione"
- make_aspect_list_visible: "ustawić kontakty w tym aspekcie jako widoczne dla wszystkich?"
- manage: "Zarządzaj"
+ grant_contacts_chat_privilege: "przyznać kontaktom z aspektu prawa do czatu?"
+ make_aspect_list_visible: "Sprawić aby kontakty w tym aspekcie widziały się wzajemnie?"
remove_aspect: "Usuń ten aspekt"
- rename: "zmień nazwę"
+ rename: "Zmień nazwę"
set_visibility: "Ustaw widoczność"
- update: "aktualizuj"
- updating: "aktualizowanie"
- few: "Aspekty: %{count}"
- helper:
- are_you_sure: "@{m,f:Jesteś|n:Czy na}{ pew}{m:ien|f:na|n:no}{m,f:, że } chcesz usunąć ten aspekt?"
- aspect_not_empty: "Aspekt nie jest pusty"
- remove: "usuń"
+ update: "Aktualizuj"
+ updating: "Aktualizowanie"
index:
diaspora_id:
content_1: "Twój identyfikator w sieci Diaspora* to:"
@@ -218,11 +230,6 @@ pl:
heading: "Podłącz usługi"
unfollow_tag: "Przestań obserwować #%{tag}"
welcome_to_diaspora: "Witaj w Diasporze, %{name}!"
- many: "Aspekty: %{count}"
- move_contact:
- error: "Błąd przy przenoszeniu kontaktu: %{inspect}"
- failure: "nie zadziałało %{inspect}"
- success: "Osoba została przeniesiona do nowego aspektu"
new:
create: "Stwórz"
name: "Nazwa (widoczna tylko dla Ciebie)"
@@ -240,18 +247,10 @@ pl:
family: "Rodzina"
friends: "Znajomi"
work: "Praca"
- selected_contacts:
- manage_your_aspects: "Zarządzanie aspektami."
- no_contacts: "Nie masz żadnych kontaktów."
- view_all_community_spotlight: "Wyświetl wszystkich w centrum uwagi"
- view_all_contacts: "Wyświetl wszystkie kontakty"
- show:
- edit_aspect: "edycja aspektu"
- two: "Aspekty: %{count}"
update:
failure: "Aspekt %{name} nie mógł zostać zapisany z powodu zbyt długiej nazwy."
success: "Edycja aspektu %{name} powiodła się."
- zero: "brak aspektów"
+ zero: "Brak aspektów"
back: "Powrót"
blocks:
create:
@@ -267,36 +266,31 @@ pl:
post_success: "Wpis został opublikowany! Okno zostanie zamknięte!"
cancel: "Anuluj"
comments:
- few: "Komentarze: %{count}"
- many: "Komentarze: %{count}"
new_comment:
comment: "Skomentuj"
commenting: "Dodawanie komentarza..."
one: "1 komentarz"
other: "Komentarze: %{count}"
- two: "Komentarze: %{count}"
zero: "brak komentarzy"
contacts:
create:
failure: "Nie udało się utworzyć kontaktu"
- few: "%{count} kontakty"
index:
add_a_new_aspect: "Dodaj aspekt"
+ add_contact: "Dodaj kontakt"
add_to_aspect: "dodaj kontakty do %{name}"
- add_to_aspect_link: "dodaj kontakty do %{name}"
all_contacts: "Wszystkie kontakty"
community_spotlight: "W centrum uwagi"
- many_people_are_you_sure: "Czy na pewno chcesz rozpocząć prywatną rozmowę z więcej niż %{suggested_limit} osobami? Możesz po prostu opublikować swoją wiadomość w tej grupie. "
my_contacts: "Moje kontakty"
no_contacts: "Wygląda na to, że musisz dodać kilka kontaktów!"
+ no_contacts_in_aspect: "Nie masz jeszcze żadnych kontaktów w tym aspekcie. Poniżej widnieje lista kontaktów które możesz do niego dodać."
no_contacts_message: "Sprawdź kto jest %{community_spotlight}"
- no_contacts_message_with_aspect: "Sprawdź kto jest w %{community_spotlight} lub %{add_to_aspect_link}"
only_sharing_with_me: "Udostępniający tylko mnie"
- remove_person_from_aspect: "Usuń %{person_name} z aspektu \"%{aspect_name}\""
+ remove_contact: "Usuń kontakt"
start_a_conversation: "Rozpocznij rozmowę"
title: "Kontakty"
+ user_search: "Wyszukiwanie użytkowników"
your_contacts: "Twoje kontakty"
- many: "%{count} kontaktów"
one: "1 kontakt"
other: "%{count} kontaktów"
sharing:
@@ -304,7 +298,6 @@ pl:
spotlight:
community_spotlight: "W centrum uwagi społeczności"
suggest_member: "Zasugeruj członka"
- two: "%{count} kontakty"
zero: "kontakty"
conversations:
conversation:
@@ -314,7 +307,8 @@ pl:
no_contact: "Hej! Najpierw należy dodać kontakt!"
sent: "Wiadomość została wysłana"
destroy:
- success: "Pomyślnie usunięto rozmowę"
+ delete_success: "Rozmowa usunięta"
+ hide_success: "Rozmowa ukryta"
helper:
new_messages:
few: "%{count} nowe wiadomości"
@@ -338,7 +332,8 @@ pl:
new_conversation:
fail: "Nieprawidłowa wiadomość"
show:
- delete: "usuń i zablokuj rozmowę"
+ delete: "usuń rozmowę"
+ hide: "ukryj i wycisz rozmowę"
reply: "odpowiedz"
replying: "Odpowiadanie..."
date:
@@ -394,8 +389,15 @@ pl:
what_is_an_aspect_q: "Czym jest aspekt?"
who_sees_post_a: "Jeśli zamieszczasz wpis o ograniczonej widoczności, będzie on widoczny tylko dla ludzi którzy znajdują się w danym aspekcie (lub aspektach, jeśli post jest ograniczony do wielu aspektów). Kontakty które należą do innych aspektów nie będą miały jak zobaczyć wpisu, chyba że uczynisz go publicznym. Tylko publiczne posty będą widoczne dla kogokolwiek spoza Twoich aspektów."
who_sees_post_q: "Kiedy udostępniam w aspekcie, kto widzi mój wpis?"
+ chat:
+ add_contact_roster_a: "Najpierw musisz włączyć czat dla aspektu w którym osoba się znajduje. Aby to zrobić, idź do %{contacts_page}, wybierz aspekt który chcesz zmienić i kliknij na ikonę czatu dla aspektu. %{toggle_privilege} Możesz, jeżeli wolisz, utworzyć specjalny aspekt nazwany \"Czat\" i dodać do niego wszystkie osoby z którymi chcesz czatować. Gdy już to zrobisz, możesz otworzyć interfejs czatu i wybrać osoby z którymi chcesz czatować."
+ add_contact_roster_q: "Jak mogę czatować z kimś na diasporze*?"
+ contacts_page: "strony kontaktów"
+ title: "Czat"
+ faq: "często zadawane pytania"
foundation_website: "strona fundacji diaspora"
getting_help:
+ get_support_a_faq: "Przeczytaj stronę %{faq} na wiki"
get_support_a_hashtag: "zapytaj o diasporę* w publicznym wpisie używając tagu %{question}"
get_support_a_irc: "dołącz do nas na %{irc} w rozmowie na żywo"
get_support_a_tutorials: "sprawdć nasze %{tutorials}"
@@ -408,6 +410,17 @@ pl:
getting_started_tutorial: "serię samouczków \"Pierwsze kroki\""
here: "Tutaj"
irc: "IRC"
+ keyboard_shortcuts:
+ keyboard_shortcuts_a1: "W widoku strumienia możesz używać tych skrótów:"
+ keyboard_shortcuts_li1: "j - przejdź do następnego wpisu"
+ keyboard_shortcuts_li2: "k - przejdź do poprzedniego wpisu"
+ keyboard_shortcuts_li3: "c - skomentuj bieżacy wpis"
+ keyboard_shortcuts_li4: "l - polub bieżący wpis"
+ keyboard_shortcuts_li5: "r - Przekaż dalej bieżący wpis"
+ keyboard_shortcuts_li6: "m - Rozwiń bieżący wpis"
+ keyboard_shortcuts_li7: "o - Otwórz pierwszy link w bieżącym wpisie"
+ keyboard_shortcuts_q: "Jakie skróty klawiszowe są dostępne?"
+ title: "Skróty klawiszowe"
markdown: "Markdown"
mentions:
how_to_mention_a: "Wprowadź znak \"@\", a po nim zacznij wpisywać imię osoby. Pojawi się menu, które pozwoli Ci wybrać tą osobę. Pamiętaj, że w ten sposób wspomnisz tylko o osobach, które dodałeś do któregoś z aspektów."
@@ -627,7 +640,7 @@ pl:
zero: "nikt nie lubi"
limited: "Ograniczone"
more: "Więcej"
- next: "następny"
+ next: "Następny"
no_results: "Niczego nie znaleziono"
notifications:
also_commented:
@@ -668,9 +681,11 @@ pl:
comment_on_post: "Komentarz do wpisu"
liked: "Polubili"
mark_all_as_read: "Oznacz wszystkie jako przeczytane"
+ mark_all_shown_as_read: "Oznacz widoczne jako przeczytane"
mark_read: "Oznacz jako przeczytane"
mark_unread: "Oznacz jako nieprzeczytane"
mentioned: "Wspomnieli o tobie"
+ no_notifications: "Nie masz jeszcze powiadomień"
notifications: "Powiadomienia"
reshared: "Przekazali dalej"
show_all: "pokaż wszystkie"
@@ -726,7 +741,9 @@ pl:
other: "%{actors} zaczęli/ły Ci udostępniać."
zero: "%{actors} zaczęli Ci udostępniać."
notifier:
+ a_limited_post_comment: "Pojawił się nowy komentarz w ograniczonym wpisie na diasporze*. Zapoznaj się z nim."
a_post_you_shared: "wpis."
+ a_private_message: "Masz nową wiadomość w diaspora*"
accept_invite: "Zaakceptuj zaproszenie do diaspory*!"
click_here: "kliknij tutaj"
comment_on_post:
@@ -735,6 +752,27 @@ pl:
click_link: "Aby aktywować nowy adres e-mail %{unconfirmed_email}, kliknij to łącze:"
subject: "Aktywuj nowy adres e-mail %{unconfirmed_email}"
email_sent_by_diaspora: "Ta wiadomość została wysłana przez %{pod_name}. Jeśli nie chcesz otrzymywać takich wiadomości,"
+ export_email:
+ body: |-
+ Dzień dobry %{name},
+
+ Twoje dane zostały przetworzone i są już gotowe do pobrania przez przejście pod [ten link](%{url}).
+
+ Trzymaj się!
+
+ Automat e-mailowy diaspory*.
+ subject: "Twoje prywatne dane są gotowe do pobrania, %{name}"
+ export_failure_email:
+ body: |-
+ Cześć %{name},
+
+ Napotkaliśmy na problem podczas przetwarzania Twoich prywatnych danych do pobrania.
+ Spróbuj ponownie!
+
+ Na razie!
+
+ Automat e-mailowy diaspory*.
+ subject: "Przykro nam, %{name}, ale wystąpił problem z Twoimi danymi"
hello: "Cześć %{name}!"
invite:
message: |-
@@ -761,6 +799,22 @@ pl:
subject: "%{name} wspomniał o Tobie na diasporze*"
private_message:
reply_to_or_view: "Odpowiedz lub wyświetl wątek >"
+ remove_old_user:
+ body: |-
+ Witaj,
+
+ Wygląda na to, że nie zależy Ci już na koncie na %{pod_url}, skoro nie używałeś go przez %{after_days} dni. Aby upewnić się co do jak najlepszej wydajności tego poda diaspory*, chcielibyśmy usunąć porzucone konta z naszej bazy danych.
+
+ Bardzo chcemy, abyś pozostał częścią społeczności diaspory*. Zatrzymaj to konto, jeśli tylko chcesz.
+
+ Jeśli chcesz, aby Twoje konto nie zostało usunięte, wystarczy, że zalogujesz się na nie przed %{remove_after}. Po zalogowaniu poświęć kilka chwil, aby rozejrzeć się po diasporze*. Zmieniła się bardzo, odkąd ostatnio się logowałeś. Mamy nadzieję, że przypadną Ci do gustu ulepszenia, jakie wprowadziliśmy. Obserwuj różne #tagi, żeby odkryć treści, które polubisz.
+
+ Zaloguj się tu: %{login_url}. Jeśli zapomniałeś danych do logowania, możesz na tej stronie poprosić o przypomnienie ich.
+
+ Do zobaczenia, mam nadzieję.
+
+ Automat e-mailowy diaspory*!
+ subject: "Twoje konto zostało przeznaczone do usunięcia z powodu braku aktywności."
report_email:
body: |-
Witaj!
@@ -803,7 +857,6 @@ pl:
add_contact_from_tag: "Dodaj znajomego ze znacznika"
aspect_list:
edit_membership: "edycja przynależności do aspektów"
- few: "Osoby: %{count}"
helper:
is_not_sharing: "%{name} Ci nie udostępnia."
is_sharing: "%{name} udostępnia Ci."
@@ -817,7 +870,6 @@ pl:
search_handle: "Użyj identyfikatora diaspory* (użytkownik@pod.example.com) aby mieć pewność, że znajdziesz swoich znajomych."
searching: "wyszukiwanie, proszę czekać..."
send_invite: "Wciąż nic nowego? Wyślij zaproszenie!"
- many: "Osoby: %{count}"
one: "1 osoba"
other: "Osoby: %{count}"
person:
@@ -854,7 +906,6 @@ pl:
add_some: "dodaj"
edit: "edycja"
you_have_no_tags: "nie masz znaczników!"
- two: "Osoby: %{count}"
webfinger:
fail: "Nie odnaleziono %{handle}."
zero: "nie ma nikogo"
@@ -906,7 +957,7 @@ pl:
other: "%{count} zdjęcia od %{author}"
zero: "Brak zdjęć od %{author}"
reshare_by: "Przekazane dalej przez %{author}"
- previous: "poprzedni"
+ previous: "Poprzedni"
privacy: "Prywatność"
privacy_policy: "Polityka prywatności"
profile: "Profil"
@@ -953,27 +1004,26 @@ pl:
update: "Aktualizacja"
invalid_invite: "Podane łącze do zaproszenia jest nieważne!"
new:
- continue: "Kontynuuj"
create_my_account: "Utwórz konto!"
- diaspora: "<3 diaspora*"
email: "E-MAIL"
enter_email: "Wpisz adres e-mail"
enter_password: "Podaj hasło (maks. 6 znaków)"
enter_password_again: "Wprowadź ponownie to samo hasło"
enter_username: "Wybierz nazwę użytkownika (możliwe litery, cyfry i podkreślniki)"
- hey_make: "HEJ ,<br/>ZRÓB<br/>COŚ."
join_the_movement: "Dołącz do ruchu!"
password: "HASŁO"
password_confirmation: "POTWIERDZENIE HASŁA"
sign_up: "REJESTRACJA"
sign_up_message: "Social Networking z ♥"
submitting: "Wysyłanie..."
+ terms: "Zakładając konto akceptujesz %{terms_link}."
+ terms_link: "warunki korzystania z serwisu"
username: "NAZWA UŻYTKOWNIKA"
report:
comment_label: "<b>Komentarz</b>:<br/>%{data}"
confirm_deletion: "Czy masz pewność, że chcesz usunąć ten element?"
delete_link: "Usuń element"
- not_found: "<u>Ten wpis lub komentarz nie został znaleziony. Wygląda na to, że został usunięty!</u>"
+ not_found: "<u>Ten wpis/komentarz nie został znaleziony. Wygląda na to, że został usunięty przez autora!</u>"
post_label: "<b>Wpis</b>: %{title}"
reason_label: "Powód: %{text}"
reported_label: "<b>Zgłoszony przez</b> %{person}"
@@ -1068,6 +1118,8 @@ pl:
your_diaspora_username_is: "Twój nazwa użytkownika na diasporze* to: %{diaspora_handle}"
aspect_dropdown:
add_to_aspect: "Dodaj kontakt"
+ mobile_row_checked: "%{name} (usuń)"
+ mobile_row_unchecked: "%{name} (dodaj)"
toggle:
few: "W %{count} aspektach"
many: "W %{count} aspektach"
@@ -1152,6 +1204,21 @@ pl:
failed: "Nieprawidłowo przepisany obrazek"
user: "Tajny obrazek i kod są różne"
placeholder: "Wpisz tekst z obrazka"
+ statistics:
+ active_users_halfyear: "Aktywni użytkownicy w półroczu"
+ active_users_monthly: "Aktywni użytkownicy miesięcznie"
+ closed: "Zamknięte"
+ disabled: "Nie dostępne"
+ enabled: "Dostępne"
+ local_comments: "Lokalne komentarze"
+ local_posts: "Lokalne wpisy"
+ name: "Nazwa"
+ network: "Sieć"
+ open: "Otwarte"
+ registrations: "Rejestracje"
+ services: "Usługi"
+ total_users: "W sumie użytkowników"
+ version: "Wersja"
status_messages:
create:
success: "Pomyślnie wspomniano o: %{names}"
@@ -1161,14 +1228,11 @@ pl:
no_message_to_display: "Brak wiadomości do wyświetlenia."
new:
mentioning: "Wspominasz o: %{person}"
- too_long:
- few: "skróć swoje wiadomości statusowe do mniej niż %{count} znaków"
- many: "skróć swoje wiadomości statusowe do mniej niż %{count} znaków"
- one: "skróć swoje wiadomości statusowe do mniej niż %{count} znaku"
- other: "skróć swoje wiadomości statusowe do mniej niż %{count} znaków"
- zero: "skróć swoje wiadomości statusowe do mniej niż %{count} znaków"
+ too_long: "Skróć swoją wiadomość statusową poniżej %{count} znaków. Obecnie jej długość to %{current_length} znaków."
stream_helper:
hide_comments: "Ukryj wszystkie komentarze"
+ no_more_posts: "Dotarłeś do końca strumienia."
+ no_posts_yet: "Nie ma jeszcze żadnych wpisów."
show_comments:
few: "Wyświetl %{count} komentarze więcej"
many: "Wyświetl %{count} komentarzy więcej"
@@ -1206,7 +1270,6 @@ pl:
title: "Działalność publiczna"
tags:
contacts_title: "Osoby, które wykopały ten znacznik"
- tag_prefill_text: "Jeśli chodzi o %{tag_name}, to... "
title: "Oznaczone wpisy: %{tags}"
tag_followings:
create:
@@ -1217,20 +1280,18 @@ pl:
failure: "Nie udało się zatrzymać obserwowania: #% {name}. Może już tego nie obserwujesz?"
success: "Nie obserwujesz już: #%{name}"
tags:
+ name_too_long: "Proszę skróć nazwę taga do mniej niż %{count} znaków. Obecnie zawiera %{current_length} znaków."
show:
follow: "Obserwuj #%{tag}"
- followed_by_people:
- few: "obserwowane przez %{count} osoby"
- many: "obserwowane przez %{count} osób"
- one: "obserwowane przez jedną osobę"
- other: "obserwowane przez %{count} osób."
- zero: "nie obserwowane przez nikogo"
following: "Obserwowanie #%{tag}"
- nobody_talking: "Nikt jeszcze nie rozmawia o %{tag}."
none: "Pusty znacznik nie istnieje!"
- people_tagged_with: "Osoby oznaczone jako #%{tag}"
- posts_tagged_with: "Wpisy oznaczone jako #%{tag}"
stop_following: "Przestań obserwować #%{tag}"
+ tagged_people:
+ few: "%{count} osoby otagowane %{tag}"
+ many: "%{count} osób otagowanych %{tag}"
+ one: "1 osoba otagowana %{tag}"
+ other: "%{count} osób otagowanych %{tag}"
+ zero: "Nikogo otagowanego %{tag}"
terms_and_conditions: "Regulamin"
undo: "Cofnąć?"
username: "Nazwa użytkownika"
@@ -1240,7 +1301,7 @@ pl:
email_not_confirmed: "Nie można aktywować adresu e-mail. Nieprawidłowe łącze?"
destroy:
no_password: "Wpisz hasło, aby zamknąć konto."
- success: "Konto zostało zablokowane. Dokończymy usuwanie Twojego konta w ciągu najbliższych 20 minut. Dziękujemy za wypróbowanie diaspory*."
+ success: "Konto zostało zablokowane. Usuwanie Twojego konta może zająć nam do 20 minut. Dziękujemy za wypróbowanie diaspory*."
wrong_password: "Wprowadzone hasło nie jest zgodne z aktualnym hasłem."
edit:
also_commented: "...ktoś skomentuje wpis mający mój komentarz"
@@ -1254,29 +1315,32 @@ pl:
close_account:
dont_go: "Prosimy, nie odchodź!"
if_you_want_this: "Jeśli naprawdę tego chcesz, wpisz swoje hasło poniżej i kliknij \"Zamknij konto\"."
- lock_username: "Nazwa użytkownika zostanie zablokowana, jeśli zdecydujesz się wrócić."
- locked_out: "Zostaniesz wylogowa@{m:ny|f:na|n:ny/na} i konto zostanie zablokowane."
- make_diaspora_better: "Pomóż nam ulepszyć diasporę*, zamiast opuszczać sieć. Jeśli naprawdę odchodzisz, chcemy poinformować Cię o tym, co się potem stanie."
+ lock_username: "Nazwa Twojego konta zostanie zablokowana. Na tym porzie nie będziesz już mógł stworzyć nowego, o tym samym identyfikatorze."
+ locked_out: "Zostaniesz wylogowa@{m:ny|f:na|n:ny/na} i zablokowany, dopóki Twoje konto nie zostanie usunięte."
+ make_diaspora_better: "Wolelibyśmy, żebyś został tu i pomógł nam ulepszyć diasporę*, zamiast opuszczać sieć. Jednak jeśli naprawdę odchodzisz, oto co się potem stanie:"
mr_wiggles: "Pan Łaskotka będzie niepocieszony, widząc, że odchodzisz"
- no_turning_back: "Aktualnie, nie ma odwrotu."
+ no_turning_back: "Nie ma już odwrotu! Jeśli naprawdę jesteś pewien, wpisz swoje hasło poniżej."
what_we_delete: "Usuniemy wszystkie Twoje wpisy i dane profilu najszybciej jak to tylko możliwe. Twoje komentarze pozostaną tam gdzie były, ale będą skojarzone z Twoim Identyfikatorem diaspory* zamiast z imieniem."
close_account_text: "Zamknij konto"
comment_on_post: "...ktoś dodał komentarz do mojego wpisu"
current_password: "Bieżące hasło"
current_password_expl: "to, którego używasz do logowania"
+ download_export: "Pobierz mój profil"
download_photos: "pobierz moje zdjęcia"
- download_xml: "pobierz mój xml"
edit_account: "Edycja konta"
email_awaiting_confirmation: "Łącze aktywacyjne zostało wysłane na adres \"%{unconfirmed_email}\". Do momentu kliknięcia łącza i aktywacji nowego adresu, nadal będziemy korzystać z obecnego \"%{email}\"."
export_data: "Eksport danych"
+ export_in_progress: "Przetwarzamy twoje dane. Sprawdź ponownie za kilka minut."
following: "Ustawienia udostępniania"
getting_started: "Ustawienia nowego użytkownika"
+ last_exported_at: "(ostatnio aktualizowano o %{timestamp})"
liked: "...ktoś polubił mój wpis"
mentioned: "...ktoś wspomniał mnie we wpisie"
new_password: "Nowe hasło"
- photo_export_unavailable: "Eksportowanie zdjęć jest aktualnie niedostępne"
private_message: "...otrzymam prywatną wiadomość"
receive_email_notifications: "Wysyłaj powiadomienia e-mail jeśli..."
+ request_export: "Poproś o dane mojego profilu"
+ request_export_update: "Odśwież dane mojego profilu"
reshared: "...ktoś przekazał dalej mój wpis"
show_community_spotlight: "Wyświetlić wyróżnionych użytkowników w Strumieniu?"
show_getting_started: "Ponownie włącz - Pierwsze kroki"
@@ -1298,7 +1362,9 @@ pl:
who_are_you: "Kim jesteś?"
privacy_settings:
ignored_users: "Ignorowani użytkownicy"
+ no_user_ignored_message: "Nie ignorujesz żadnego użytkownika"
stop_ignoring: "Przestań ignorować"
+ strip_exif: "Usuń metadane takie jak lokalizacja, autor i model aparatu z wgrywanych zdjęć (rekomendowane)"
title: "Ustawienia prywatności"
public:
does_not_exist: "Użytkownik %{username} nie istnieje!"
diff --git a/config/locales/diaspora/pt-BR.yml b/config/locales/diaspora/pt-BR.yml
index 1fab7ec15..9cac45af4 100644
--- a/config/locales/diaspora/pt-BR.yml
+++ b/config/locales/diaspora/pt-BR.yml
@@ -12,6 +12,8 @@ pt-BR:
_home: "Início"
_photos: "Fotos"
_services: "Serviços"
+ _statistics: "Estatística"
+ _terms: "Termos"
account: "Conta"
activerecord:
errors:
@@ -54,7 +56,7 @@ pt-BR:
correlations: "Correlações"
pages: "Páginas"
pod_stats: "Status do Servidor"
- report: "Relatórios"
+ report: "Relatos"
sidekiq_monitor: "Monitor Sidekiq"
user_search: "Busca de Usuários"
weekly_user_stats: "Estatísticas Semanais"
@@ -140,10 +142,8 @@ pt-BR:
add_to_aspect:
failure: "Não foi possível adicionar o contato ao aspecto."
success: "Contato adicionado ao aspecto com sucesso."
- aspect_contacts:
- done_editing: "Edição concluída"
aspect_listings:
- add_an_aspect: "+ Adicione um aspecto"
+ add_an_aspect: "+ Adicione um Aspecto"
deselect_all: "Desmarcar tudo"
edit_aspect: "Editar %{name}"
select_all: "Selecionar tudo"
@@ -160,30 +160,25 @@ pt-BR:
failure: "%{name} não está vazio e por isso não pode ser removido."
success: "%{name} foi removido com sucesso."
edit:
- add_existing: "Adicione um contato existente"
+ aspect_chat_is_enabled: "Contatos neste aspecto são capazes de falar com você."
+ aspect_chat_is_not_enabled: "Contatos neste aspecto não são capazes de falar com você."
aspect_list_is_not_visible: "Contatos neste aspecto não podem ver uns aos outros."
aspect_list_is_visible: "Contatos neste aspecto podem ver uns aos outros."
- confirm_remove_aspect: "Tem certeza que deseja deletar este aspecto?"
- done: "Feito"
- make_aspect_list_visible: "Tornar contatos nesse aspecto visíveis entre si?"
- manage: "Gerenciar"
- remove_aspect: "Deletar este aspecto"
+ confirm_remove_aspect: "Tem certeza que deseja apagar este aspecto?"
+ grant_contacts_chat_privilege: "Conceder aos contatos neste aspecto privilégios de bate-papo?"
+ make_aspect_list_visible: "Tornar contatos desse aspecto visíveis entre si?"
+ remove_aspect: "Apagar este aspecto"
rename: "Renomear"
- set_visibility: "Configurar Visibilidade"
+ set_visibility: "Configurar visibilidade"
update: "atualizar"
updating: "atualizando"
- few: "%{count} aspectos"
- helper:
- are_you_sure: "Tem certeza em deletar este aspecto?"
- aspect_not_empty: "Aspecto não está vazio"
- remove: "remover"
index:
diaspora_id:
- content_1: "Seu diaspora* ID é:"
+ content_1: "Sua diaspora* ID é:"
content_2: "Forneça-o às pessoas e elas poderão te encontrar em diaspora*."
heading: "diaspora* ID"
donate: "Faça uma Doação"
- handle_explanation: "Esse é seu diaspora* ID. Como um endereço de e-mail, você pode fornecê-lo para que outras pessoas contatem com você."
+ handle_explanation: "Essa é sua diaspora* ID. Como um endereço de e-mail, você pode fornecê-la para que outras pessoas contatem com você."
help:
any_problem: "Algum Problema?"
contact_podmin: "Entre em contato com o administrador do seu servidor!"
@@ -200,14 +195,14 @@ pt-BR:
tag_feature: "feature"
tag_question: "pergunta"
tutorial_link_text: "Tutoriais"
- tutorials_and_wiki: "%{faq}, %{tutorial} & %{wiki}: Ajuda para seus primeiros passos."
+ tutorials_and_wiki: "%{faq}, %{tutorial} & %{wiki}: ajudas para seus primeiros passos."
introduce_yourself: "Este é seu fluxo. Se apresente!"
keep_diaspora_running: "Mantenha o desenvolvimento de diaspora* acelerado com uma doação mensal!"
- keep_pod_running: "Mantenha %{pod} rodando bem e compre o café para nossos servidores com uma doação mensal!"
+ keep_pod_running: "Mantenha %{pod} funcionando bem e pague um café para nossos voluntários com uma doação fixa mensal!"
new_here:
follow: "Siga %{link} e dê boas vindas aos novos usuários de Diaspora*!"
learn_more: "Saiba mais"
- title: "Dê as boas vindas aos novos usuários"
+ title: "Dê boas vindas aos novatos"
no_contacts: "Nenhum contato"
no_tags: "+ Procurar uma tag para seguir"
people_sharing_with_you: "Pessoas compartilhando com você"
@@ -217,11 +212,6 @@ pt-BR:
heading: "Conectar Serviços"
unfollow_tag: "Parar de seguir #%{tag}"
welcome_to_diaspora: "Bem-vindo(a) a diaspora*, %{name}!"
- many: "%{count} aspectos"
- move_contact:
- error: "Não foi possível mover o contato: %{inspect}"
- failure: "Falhou %{inspect}"
- success: "Pessoa movida para o novo aspecto"
new:
create: "Criar"
name: "Nome (só é visível para você)"
@@ -239,14 +229,6 @@ pt-BR:
family: "Família"
friends: "Amigos"
work: "Trabalho"
- selected_contacts:
- manage_your_aspects: "Gerencie seus aspectos."
- no_contacts: "Você não tem nenhum contato aqui ainda."
- view_all_community_spotlight: "Ver todos os destaques da comunidade"
- view_all_contacts: "Ver todos os contatos"
- show:
- edit_aspect: "editar aspecto"
- two: "%{count} aspectos"
update:
failure: "Seu aspecto %{name} tem um nome muito longo para ser salvo."
success: "Seu aspecto %{name} foi editado com sucesso."
@@ -260,42 +242,36 @@ pt-BR:
failure: "Eu não conseguirei parar de ignorar este usuário. #evasão"
success: "Vamos ver o que eles têm a dizer! #digaoi"
bookmarklet:
- explanation: "Publique em diaspora* de qualquer lugar favoritando este link => %{link}."
+ explanation: "Publique em diaspora* de qualquer lugar favoritando este link: %{link}"
heading: "Favoritos"
post_something: "Publicar em diaspora*"
post_success: "Publicado! Fechando!"
cancel: "Cancelar"
comments:
- few: "%{count} comentários"
- many: "%{count} comentários"
new_comment:
comment: "Comentar"
commenting: "Comentando..."
one: "1 comentário"
other: "%{count} comentários"
- two: "%{count} comentários"
zero: "nenhum comentário"
contacts:
create:
failure: "Falha em criar contato"
- few: "%{count} contatos"
index:
add_a_new_aspect: "Adicione um novo aspecto"
+ add_contact: "Adicionar contato"
add_to_aspect: "Adicionar contatos para %{name}"
- add_to_aspect_link: "adicionar contatos para %{name}"
- all_contacts: "Todos Contatos"
+ all_contacts: "Todos os Contatos"
community_spotlight: "Destaque da Comunidade"
- many_people_are_you_sure: "Tem certeza de que deseja iniciar uma conversa privada com mais de %{suggested_limit} contatos? Uma publicação para o aspecto que eles estão pode ser uma melhor maneira de contactá-los."
my_contacts: "Meus Contatos"
no_contacts: "Parece que você precisa adicionar mais contatos!"
no_contacts_message: "Veja %{community_spotlight}"
- no_contacts_message_with_aspect: "Veja %{community_spotlight} ou %{add_to_aspect_link}"
only_sharing_with_me: "Só compartilhando comigo"
- remove_person_from_aspect: "Remover %{person_name} de \"%{aspect_name}\""
+ remove_contact: "Remover contato"
start_a_conversation: "Iniciar uma conversa"
title: "Contatos"
+ user_search: "Busca de Usuário"
your_contacts: "Seus Contatos"
- many: "%{count} contatos"
one: "1 contato"
other: "%{count} contatos"
sharing:
@@ -303,7 +279,6 @@ pt-BR:
spotlight:
community_spotlight: "Destaque da Comunidade"
suggest_member: "Sugerir um membro"
- two: "%{count} contatos"
zero: "contatos"
conversations:
conversation:
@@ -313,7 +288,8 @@ pt-BR:
no_contact: "Cuidado, você precisa adicionar o contato primeiro!"
sent: "Mensagem enviada"
destroy:
- success: "Conversa removida com sucesso"
+ delete_success: "Conversa excluída com sucesso"
+ hide_success: "Conversa escondida com sucesso"
helper:
new_messages:
few: "%{count} novas mensagens"
@@ -324,7 +300,7 @@ pt-BR:
zero: "Nenhuma mensagem nova"
index:
conversations_inbox: "Conversas - Caixa de Entrada"
- create_a_new_conversation: "começar uma nova conversa"
+ create_a_new_conversation: "iniciar uma nova conversa"
inbox: "Entrada"
new_conversation: "Nova conversa"
no_conversation_selected: "nenhuma conversa selecionada"
@@ -338,7 +314,8 @@ pt-BR:
new_conversation:
fail: "Mensagem inválida"
show:
- delete: "deletar e bloquear esta conversa"
+ delete: "apagar e fechar esta conversa"
+ hide: "Esconder e silenciar conversa"
reply: "responder"
replying: "Respondendo..."
date:
@@ -346,7 +323,7 @@ pt-BR:
birthday: "%d %B"
birthday_with_year: "%d de %B de %Y"
fullmonth_day: "%d de %B"
- delete: "Deletar"
+ delete: "Apagar"
email: "Email"
error_messages:
helper:
@@ -377,8 +354,8 @@ pt-BR:
contacts_know_aspect_q: "Meus contactos sabem em que aspectos eu os coloquei?"
contacts_visible_a: "Se você selecionar esta opção, então os contatos daquele aspecto serão capazes de ver quem mais está lá dentro, na sua página de perfil, sob a sua imagem pessoal. É melhor selecionar esta opção somente se todos os contatos naquele aspecto se conhecerem. Eles ainda não serão capazes de poder ver o nome do aspecto."
contacts_visible_q: "O que significa \"tornar contatos neste aspecto visíveis entre eles\"?"
- delete_aspect_a: "Na sua lista de aspectos do lado esquerdo na página principal, aponte o mouse para o aspecto que você quer deletar. Clique no pequeno lápis de edição que aparece à direita. Clique no botão Deletar na caixa que aparece."
- delete_aspect_q: "Como eu deleto um aspecto?"
+ delete_aspect_a: "Na sua lista de aspectos do lado esquerdo na página principal, aponte o mouse para o aspecto que você quer apagar. Clique no pequeno lápis de edição que aparece à direita. Clique no botão Apagar na caixa que aparece."
+ delete_aspect_q: "Como eu apago um aspecto?"
person_multiple_aspects_a: "Sim. Vá até sua página de contatos e clique em meus contatos. Para cada contato você pode usar o menu à direita para adicioná-los para (ou removê-los de) tantos aspectos quanto você quiser. Ou você pode adicioná-los a um novo aspecto (ou removê-los de um aspecto) clicando no botão seletor de aspectos na sua página de perfil. Ou você pode ainda apenas mover o cursor sobre o nome que você vê no fluxo, e um 'cartão flutuante' aparecerá. Você pode mudar os aspectos que estão à direita."
person_multiple_aspects_q: "Posso adicionar uma pessoa a múltiplos aspectos?"
post_multiple_aspects_a: "Sim. Quando você está fazendo uma publicação, use o botão seletor de aspectos para selecionar ou desselecionar aspectos. Sua publicação será visível a todos os aspectos que você selecionou. Você pode também selecionar na barra lateral os aspectos para os quais você quer publicar. Quando você publica, o(s) aspecto(s) que você selecionou da lista à esquerda será(ão) automaticamente selecionado(s) no seletor de aspectos."
@@ -403,7 +380,7 @@ pt-BR:
get_support_a_wiki: "procure o %{link}"
get_support_q: "E se minha pergunta não for respondida neste FAQ? Onde mais eu posso encontrar ajuda?"
getting_started_a: "Você está com sorte. Tente o %{tutorial_series} no nosso site do projeto. Ele te levará passo-a-passo através do processo de registro e te ensinará todas as coisas básicas que você precisa saber para utilizar diaspora*."
- getting_started_q: "Socorro! Preciso de ajuda para começar!"
+ getting_started_q: "Socorro! Preciso de alguma ajuda básica para começar!"
title: "Obter ajuda"
getting_started_tutorial: "tutorial da série 'Começando'"
here: "aqui"
@@ -414,6 +391,9 @@ pt-BR:
keyboard_shortcuts_li2: "k - pular para a publicação anterior"
keyboard_shortcuts_li3: "c - comentar a publicação atual"
keyboard_shortcuts_li4: "l - curtir a publicação atual"
+ keyboard_shortcuts_li5: "Recompartilhar a publicação atual"
+ keyboard_shortcuts_li6: "Expandir a publicação atual"
+ keyboard_shortcuts_li7: "Abrir o primeiro link na publicação atual"
keyboard_shortcuts_q: "Quais teclas de atalho estão disponíveis?"
title: "Teclas de atalho"
markdown: "Markdown"
@@ -469,6 +449,8 @@ pt-BR:
insert_images_comments_a2: "pode ser usado para inserir imagens da web aos comentários assim como às publicações."
insert_images_comments_q: "Posso inserir imagens em comentários?"
insert_images_q: "Como eu insiro imagens às publicações?"
+ post_poll_a: "Clique no ícone gráfico para gerar uma enquete. Digite uma pergunta e pelo menos duas respostas. Não se esqueça de colocar sua postagem como publica, se você quer que todos sejam capazes de participar de sua enquete."
+ post_poll_q: "Como posso adicionar uma enquete para a minha publicação?"
size_of_images_a: "Não. Imagens são redimensionadas automaticamente para preencherem o fluxo. Markdown não tem um código para especificar o tamanho de uma imagem."
size_of_images_q: "Posso personalizar o tamanho das imagens em publicações ou comentários?"
stream_full_of_posts_a1: "Seu fluxo é composto de três tipos de publicações:"
@@ -537,6 +519,7 @@ pt-BR:
add_to_aspect_li5: "Mas se Ben vai até a página de perfil de Amy, então ele verá publicações privadas que Amy tenha feito ao aspecto dela do qual que ele faça parte (assim como publicações públicas que qualquer pessoa pode ver lá)."
add_to_aspect_li6: "Ben será capaz de ver o perfil privado de Amy (bio, localização, sexo, aniversário)."
add_to_aspect_li7: "Amy aparecerá sob \"Só compartilhando comigo\" na página de contatos de Ben."
+ add_to_aspect_li8: "Amy também será capaz de @mencionar Ben em uma publicação."
add_to_aspect_q: "O que acontece quando eu adiciono alguém a um dos meus aspectos? Ou quando alguém me adiciona a um dos aspectos deles?"
list_not_sharing_a: "Não, mas você pode ver se algumas pessoas estão compartilhando com você ou não, visitando o perfil deles. Se eles estão, a barra sob a foto de perfil deles estará verde; se não, estará cinza. Você deve receber uma notificação cada vez que alguém começa a compartilhar com você."
list_not_sharing_q: "Existe uma lista de pessoas as quais eu adicionei a um de meus aspectos, mas que não tenham me adicionado a um dos aspectos deles?"
@@ -544,6 +527,8 @@ pt-BR:
only_sharing_q: "Quem são as pessoas listadas em \"Só compartilhando comigo\" em minha página de contatos?"
see_old_posts_a: "Não. Eles somente serão capazes de ver novas publicações para o aspecto. Eles (e todos os demais) podem ver suas publicações públicas antigas na sua página de perfil, e eles também podem vê-las no fluxo deles."
see_old_posts_q: "Quando eu adiciono alguém a um aspecto, eles podem ver publicações antigas que eu já tenha feito para aquele aspecto?"
+ sharing_notification_a: "Você recebera uma notificação cada vez que alguém começar a compartilhar com você."
+ sharing_notification_q: "Como saber quando alguém começar a compartilhar comigo?"
title: "Compartilhando"
tags:
filter_tags_a: "Ainda não é possível diretamente através de diaspora*, mas algumas %{third_party_tools} tem sido escritas para poder prover isto."
@@ -611,7 +596,7 @@ pt-BR:
whats_new: "O que há de novo?"
your_aspects: "Seus aspectos"
header:
- admin: "Administrador"
+ admin: "Administração"
blog: "Blog"
code: "Código"
help: "Ajuda"
@@ -643,13 +628,13 @@ pt-BR:
zero: "ninguém curtiu"
limited: "Limitado"
more: "Mais"
- next: "Próximo"
+ next: "próximo"
no_results: "Nenhum Resultado Encontrado"
notifications:
also_commented:
- one: "%{actors} também comentou sobre a %{post_link} de %{post_author}."
- other: "%{actors} também comentaram sobre a %{post_link} de %{post_author}."
- zero: "%{actors} comentou sobre a %{post_link} de %{post_author}."
+ one: "%{actors} também comentou sobre %{post_link} de %{post_author}."
+ other: "%{actors} também comentaram sobre %{post_link} de %{post_author}."
+ zero: "%{actors} comentou sobre %{post_link} de %{post_author}."
also_commented_deleted:
one: "%{actors} comentou em uma publicação apagada."
other: "%{actors} comentaram em uma publicação apagada."
@@ -677,21 +662,22 @@ pt-BR:
other: "e %{count} outros"
two: "e %{count} outros"
zero: "e mais ninguém"
- comment_on_post: "Comentar na publicação"
+ comment_on_post: "Comentou na publicação"
liked: "Curtiu"
mark_all_as_read: "Marcar tudo como lido"
+ mark_all_shown_as_read: "marcar tudo como lido"
mark_read: "Marcar como lido"
mark_unread: "Marcar como não lida"
mentioned: "Mencionou"
notifications: "Notificações"
- reshared: "Re-compartilhada"
+ reshared: "Recompartilhou"
show_all: "mostrar tudo"
show_unread: "mostrar não lido"
started_sharing: "Começou a compartilhar"
liked:
- one: "%{actors} curtiu sua %{post_link}."
- other: "%{actors} curtiram sua %{post_link}."
- zero: "%{actors} curtiu sua %{post_link}."
+ one: "%{actors} curtiu sua publicação %{post_link}."
+ other: "%{actors} curtiram sua publicação %{post_link}."
+ zero: "%{actors} curtiu sua publicação %{post_link}."
liked_post_deleted:
one: "%{actors} curtiu sua publicação apagada."
other: "%{actors} curtiram sua publicação apagada."
@@ -710,9 +696,9 @@ pt-BR:
other: "%{actors} te enviaram uma mensagem."
zero: "Ninguém te enviou uma mensagem."
reshared:
- one: "%{actors} recompartilhou a sua %{post_link}."
- other: "%{actors} recompartilharam a sua %{post_link}."
- zero: "%{actors} recompartilhou a sua %{post_link}."
+ one: "%{actors} recompartilhou a sua publicação %{post_link}."
+ other: "%{actors} recompartilharam a sua publicação %{post_link}."
+ zero: "%{actors} recompartilhou a sua publicação %{post_link}."
reshared_post_deleted:
one: "%{actors} recompartilhou sua publicação apagada."
other: "%{actors} recompartilharam sua publicação apagada."
@@ -722,7 +708,9 @@ pt-BR:
other: "%{actors} começaram a compartilhar com você."
zero: "Ninguém está compartilhando com você."
notifier:
+ a_limited_post_comment: "Há um novo comentário em um post limitado na diáspora * para você conferir"
a_post_you_shared: "uma publicação."
+ a_private_message: "Há uma nova mensagem privada no diáspora * para você conferir"
accept_invite: "Aceite Seu Convite Para Diaspora*!"
click_here: "clique aqui"
comment_on_post:
@@ -731,6 +719,29 @@ pt-BR:
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}"
email_sent_by_diaspora: "Este email foi enviado por %{pod_name}. Se você deseja parar de receber emails como este,"
+ export_email:
+ body: |-
+ Olá %{name},
+
+ Os seus dados foram processados e estão prontos para transferência, seguindo [este link](%{url}).
+
+ Felicidades,
+
+ Diáspora * email automatico!
+ subject: "Os seus dados pessoais estão prontos para transferência, %{name}"
+ export_failure_email:
+ body: |-
+ Olá %{name}
+
+ Encontramos um problema ao processar seus dados pessoais para transferência.
+ Por favor, tente novamente!
+
+ Desculpe,
+
+ Diáspora * email automatico!
+ subject: "Lamentamos, houve um problema com seus dados, %{name}"
+ export_photos_email:
+ subject: "Suas fotos estão prontas para baixar %{name}"
hello: "Olá %{name}!"
invite:
message: |-
@@ -756,6 +767,8 @@ pt-BR:
subject: "%{name} mencionou você em Diaspora*"
private_message:
reply_to_or_view: "Responder ou visualizar esta conversa >"
+ remove_old_user:
+ subject: "A sua conta no diaspora* foi marcada para a remoção devido a inatividade"
report_email:
body: |-
Olá,
@@ -800,7 +813,6 @@ pt-BR:
add_contact_from_tag: "adicionar contato de tag"
aspect_list:
edit_membership: "editar participação no aspecto"
- few: "%{count} pessoas"
helper:
is_not_sharing: "%{name} não está compartilhando com você"
is_sharing: "%{name} está compartilhando com você"
@@ -811,10 +823,9 @@ pt-BR:
no_one_found: "...e ninguém foi encontrado."
no_results: "Ei! Você precisa procurar por alguma coisa."
results_for: "Resultado da busca por %{search_term}"
- search_handle: "Para que você encontre seus amigos, use o diaspora* ID deles (nomedeusuario@pod.tld)."
+ search_handle: "Para que você encontre seus amigos, use a diaspora* ID deles (nomedeusuario@nomedopod.org)."
searching: "pesquisando, por favor tenha paciência..."
send_invite: "Nada ainda? Envie um convite!"
- many: "%{count} pessoas"
one: "1 pessoa"
other: "%{count} pessoas"
person:
@@ -825,7 +836,7 @@ pt-BR:
profile_sidebar:
bio: "Biografia"
born: "Aniversário"
- edit_my_profile: "Editar Meu Perfil"
+ edit_my_profile: "Editar meu perfil"
gender: "Sexo"
in_aspects: "em aspectos"
location: "Localização"
@@ -851,7 +862,6 @@ pt-BR:
add_some: "adicione algo"
edit: "editar"
you_have_no_tags: "você não tem tags!"
- two: "%{count} pessoas"
webfinger:
fail: "Desculpe, não conseguimos encontrar %{handle}."
zero: "nenhuma pessoa"
@@ -862,7 +872,7 @@ pt-BR:
runtime_error: "O envio falhou! Você colocou seu cinto de segurança?"
type_error: "O envio da foto falhou. Tem certeza que a imagem é válida?"
destroy:
- notice: "Foto deletada."
+ notice: "Foto apagada."
edit:
editing: "Editando"
new:
@@ -880,9 +890,9 @@ pt-BR:
view_all: "Ver todas as fotos do(a) %{name}"
show:
collection_permalink: "links permanentes"
- delete_photo: "Deletar Foto"
+ delete_photo: "Apagar Foto"
edit: "Editar"
- edit_delete_photo: "Editar descrição / deletar foto"
+ edit_delete_photo: "Editar descrição / apagar foto"
make_profile_photo: "Marcar como foto do perfil"
show_original_post: "Ver publicação original"
update_photo: "Atualizar Foto"
@@ -893,7 +903,7 @@ pt-BR:
presenter:
title: "Uma publicação de %{name}"
show:
- destroy: "Deletar"
+ destroy: "Apagar"
not_found: "Desculpe! Não foi possível encontrar."
permalink: "link permanente"
photos_by:
@@ -901,7 +911,7 @@ pt-BR:
other: "%{count} fotos de %{author}"
zero: "Não há fotos de %{author}"
reshare_by: "Recompartilhado por %{author}"
- previous: "Anterior"
+ previous: "anterior"
privacy: "Privacidade"
privacy_policy: "Política de Privacidade"
profile: "Perfil"
@@ -949,21 +959,20 @@ pt-BR:
update: "Atualizar"
invalid_invite: "O link com o convite não é mais válido."
new:
- continue: "Continue"
create_my_account: "Criar minha conta!"
- diaspora: "♥ Diaspora*"
email: "EMAIL"
enter_email: "Digite o email"
enter_password: "Digite a senha (mínimo de seis caracteres)"
enter_password_again: "Digite novamente a tua senha"
enter_username: "Escolha um nome de usuário (use somente letras, números e sublinhados)"
- hey_make: "HEY,<br/>FAÇA<br/>ALGO."
join_the_movement: "Junte-se ao movimento!"
password: "SENHA"
password_confirmation: "CONFIRMAÇÃO DE SENHA"
sign_up: "INSCREVER"
sign_up_message: "Rede social com um ♥"
submitting: "Enviando..."
+ terms: "Ao criar uma conta você aceita os %{terms_link}."
+ terms_link: "Termos de Serviço"
username: "USUÁRIO"
report:
comment_label: "<b>Comentário</b>:<br>%{data}"
@@ -975,11 +984,11 @@ pt-BR:
reported_label: "<b>Relatado por</b> %{person}"
review_link: "Marcar como revisado"
status:
- created: "Um relatório foi criado"
+ created: "Um relato foi criado"
destroyed: "A publicação foi destruída"
failed: "Alguma coisa deu errado"
- marked: "O relatório foi marcado como revisado"
- title: "Visão Geral de Relatórios"
+ marked: "Um relato foi marcado como revisado"
+ title: "Visão Geral de Relatos"
requests:
create:
sending: "Enviando"
@@ -1006,7 +1015,7 @@ pt-BR:
create:
failure: "Houve um erro ao recompartilhar esta publicação."
reshare:
- deleted: "A publicação original foi deletada pelo autor."
+ deleted: "A publicação original foi apagada pelo autor."
reshare:
one: "1 recompartilhamento"
other: "%{count} recompartilhamentos"
@@ -1023,7 +1032,7 @@ pt-BR:
read_only_access: "O nível de acesso é somente-leitura, por favor tente autorização novamente mais tarde"
success: "Sucesso na autenticação."
destroy:
- success: "Autenticação deletada com sucesso."
+ success: "A autenticação foi apagada com sucesso."
failure:
error: "houve um erro na conexão deste serviço"
finder:
@@ -1056,7 +1065,7 @@ pt-BR:
shared:
add_contact:
add_new_contact: "Adicione um novo contato"
- create_request: "Procurar por diaspora* ID"
+ create_request: "Procurar pela diaspora* ID"
diaspora_handle: "diaspora@pod.org"
enter_a_diaspora_username: "Digite um nome de usuário diaspora*:"
know_email: "Você sabe seus e-mails? Convide-os!"
@@ -1078,7 +1087,7 @@ pt-BR:
from_facebook: "Do Facebook"
invitations_left: "%{count} restantes"
invite_someone: "Convidar alguém"
- invite_your_friends: "Convide seus amigos"
+ invite_your_friends: "Convide seus Amigos"
invites: "Convites"
invites_closed: "Convites estão temporariamente desativados neste servidor diaspora*"
share_this: "Compartilhe este link via email, blog, ou redes sociais!"
@@ -1107,7 +1116,7 @@ pt-BR:
invited_by: "Obrigado pelo convite, "
newhere: "Novato"
poll:
- add_a_poll: "Adcionar uma enquete"
+ add_a_poll: "Adicionar uma enquete"
add_poll_answer: "Adicionar opção"
option: "Opção 1"
question: "Pergunta"
@@ -1149,24 +1158,23 @@ pt-BR:
create:
success: "Mencionados com sucesso: %{names}"
destroy:
- failure: "Falha ao deletar a publicação"
+ failure: "Falha ao apagar a publicação"
helper:
no_message_to_display: "Nenhuma mensagem para mostrar."
new:
mentioning: "Mencionando: %{person}"
- too_long:
- one: "por favor, crie mensagens de status com menos de %{count} caracteres"
- other: "por favor, crie mensagens de status com menos de %{count} caracteres"
- zero: "por favor, crie mensagens de status com menos de %{count} caracteres"
+ too_long: "Por favor, faça com que suas mensagens de status sejam menores que %{count} caracteres. Neste momento elas estão com %{current_length} caracteres."
stream_helper:
hide_comments: "Ocultar todos os comentários"
+ no_more_posts: "Você chegou ao final do fluxo."
+ no_posts_yet: "Não existem publicações ainda."
show_comments:
one: "Ver mais um comentário"
other: "Ver mais %{count} comentários"
zero: "Nenhum comentário"
streams:
activity:
- title: "Minhas Atividades"
+ title: "Minha Atividade"
aspects:
title: "Meus Aspectos"
aspects_stream: "Aspectos"
@@ -1186,16 +1194,15 @@ pt-BR:
mentioned_stream: "@Menções"
mentions:
contacts_title: "Pessoas que você mencionou"
- title: "Suas menções"
+ title: "@Menções"
multi:
- contacts_title: "Pessoas em seus Fluxos"
- title: "Fluxos"
+ contacts_title: "Pessoas em seu Fluxo"
+ title: "Fluxo"
public:
contacts_title: "Publicadores Recentes"
title: "Atividade Pública"
tags:
contacts_title: "Pessoas que seguem essa tag"
- tag_prefill_text: "Uma coisa sobre %{tag_name} é... "
title: "Publicações com a tag: %{tags}"
tag_followings:
create:
@@ -1208,17 +1215,14 @@ pt-BR:
tags:
show:
follow: "Seguir #%{tag}"
- followed_by_people:
- one: "Seguido por uma pessoa"
- other: "Seguido por %{count} pessoas"
- zero: "Seguido por ninguém"
following: "Seguindo #%{tag}"
- nobody_talking: "Ninguém está falando sobre %{tag} ainda."
none: "A tag vazia não existe!"
- people_tagged_with: "Pessoas marcadas com %{tag}"
- posts_tagged_with: "Publicações marcadas com #%{tag}"
stop_following: "Parar de seguir #%{tag}"
- terms_and_conditions: "Termos e condições"
+ tagged_people:
+ one: "1 pessoa marcada com %{tag}"
+ other: "%{count} pessoas marcadas com %{tag}"
+ zero: "Ninguém marcado com %{tag}"
+ terms_and_conditions: "Termos e Condições"
undo: "Desfazer?"
username: "Usuário"
users:
@@ -1246,13 +1250,13 @@ pt-BR:
make_diaspora_better: "Nós queremos que você faça diaspora* melhor, então nos ajude ao invés de sair. Se você quer mesmo sair, queremos que você saiba o que ainda acontecerá."
mr_wiggles: "Mr Wiggles ficará triste se você for."
no_turning_back: "Atualmente, não tem volta."
- what_we_delete: "Vamos deletar todas as suas publicações e informações do perfil assim que possível. Seus comentários ainda ficarão, mas serão associados ao seu diaspora* ID ao invés do seu nome."
+ what_we_delete: "Vamos apagar todas as suas publicações e informações do perfil assim que possível. Seus comentários ainda ficarão, mas serão associados a sua diaspora* ID ao invés do seu nome."
close_account_text: "Encerrar conta"
comment_on_post: "alguém comenta sua publicação"
current_password: "Senha Atual"
current_password_expl: "o que você usa atualmente..."
+ download_export: "Baixar o meu perfil"
download_photos: "Baixar minhas fotos"
- download_xml: "Baixar meu XML"
edit_account: "Editar Conta"
email_awaiting_confirmation: "Temos que lhe enviar um link para a confirmação do email %{unconfirmed_email}. Enquanto você não confirmar o seu novo endereço de email, nós continuaremos utilizando o endereço antigo: %{email}."
export_data: "Exportar dados"
@@ -1261,17 +1265,18 @@ pt-BR:
liked: "alguém curte sua publicação"
mentioned: "você é mencionado(a) em uma publicação"
new_password: "Nova senha"
- photo_export_unavailable: "Exportação de fotos indisponível no momento."
private_message: "você recebe uma mensagem privada"
receive_email_notifications: "Receber notificações por email quando:"
+ request_export: "Solicitar dados do meu perfil"
+ request_export_update: "Atualizar dados do meu perfil"
reshared: "alguém recompartilha sua publicação"
- show_community_spotlight: "Mostrar Destaque da Comunidade no fluxo"
- show_getting_started: "Mostrar dicas de Como Começar"
- someone_reported: "alguém enviou um relatório"
+ show_community_spotlight: "Mostrar Destaque da Comunidade no Fluxo"
+ show_getting_started: "Mostrar dicas de como começar"
+ someone_reported: "alguém envia um relato"
started_sharing: "alguém começa a compartilhar com você"
- stream_preferences: "Preferências do fluxo"
+ stream_preferences: "Preferências do Fluxo"
your_email: "Seu Email"
- your_handle: "Seu diaspora* ID"
+ your_handle: "Sua diaspora* ID"
getting_started:
awesome_take_me_to_diaspora: "Incrível! Leve-me ao Diaspora*."
community_welcome: "A comunidade diaspora* está feliz em tê-lo(a) a bordo!"
@@ -1285,6 +1290,7 @@ pt-BR:
who_are_you: "Quem é você?"
privacy_settings:
ignored_users: "Usuários Ignorados"
+ no_user_ignored_message: "Você não está ignorando nenhum outro usuário"
stop_ignoring: "Parar de ignorar"
title: "Configurações de Privacidade"
public:
diff --git a/config/locales/diaspora/pt-PT.yml b/config/locales/diaspora/pt-PT.yml
index 8602fc21a..0fd961d92 100644
--- a/config/locales/diaspora/pt-PT.yml
+++ b/config/locales/diaspora/pt-PT.yml
@@ -31,15 +31,15 @@ pt-PT:
reshare:
attributes:
root_guid:
- taken: "Assim tão bom, hein? Já repartilhou essa publicação!"
+ taken: "Assim tão bom? Já repartilhou essa publicação!"
user:
attributes:
email:
taken: "já foi escolhido."
person:
- invalid: "não é válido."
+ invalid: "é inválido."
username:
- invalid: "é inválido. Só permitimos letras, números e underscores."
+ invalid: "é inválido. Nós só permitimos letras, números e sublinhados."
taken: "já foi escolhido."
admins:
admin_bar:
@@ -97,14 +97,14 @@ pt-PT:
zero: "Número de novos utilizadores esta semana: nenhum"
current_server: "A data do servidor atual é %{date}"
ago: "Há %{time} atrás"
- all_aspects: "Todos os grupos"
+ all_aspects: "Todos os Grupos"
application:
helper:
unknown_person: "pessoa desconhecida"
video_title:
- unknown: "Vídeo com título desconhecido"
+ unknown: "Título de vídeo desconhecido"
are_you_sure: "Tem a certeza?"
- are_you_sure_delete_account: "Você tem a certeza que deseja encerrar a sua conta? Isto não pode ser anulado!"
+ are_you_sure_delete_account: "Tem a certeza que deseja encerrar a sua conta? Isto não pode ser anulado!"
aspect_memberships:
destroy:
failure: "Erro ao remover a pessoa do grupo"
@@ -112,21 +112,19 @@ pt-PT:
success: "Pessoa removida com sucesso do grupo"
aspects:
add_to_aspect:
- failure: "Falha ao adicionar contacto ao grupo."
+ failure: "Não foi possível adicionar o contacto ao grupo."
success: "Contacto adicionado ao grupo com sucesso."
- aspect_contacts:
- done_editing: "finalizar edição"
aspect_listings:
add_an_aspect: "+ Adicionar um grupo"
- deselect_all: "Limpar a seleção"
- edit_aspect: "Alterar %{name}"
+ deselect_all: "Desmarcar todos"
+ edit_aspect: "Editar %{name}"
select_all: "Selecionar todos"
aspect_stream:
make_something: "Efeute algo"
stay_updated: "Mantenha-se atualizado"
stay_updated_explanation: "No seu fluxo geral pode encontrar todos os seus contactos, as etiquetas que segue e as publicações de alguns membros criativos da comunidade."
- contacts_not_visible: "Contactos neste grupo não se verão uns aos outros."
- contacts_visible: "Contactos neste grupo ver-se-ão uns aos outros."
+ contacts_not_visible: "Os contactos neste grupo não poderão ver-se uns aos outros."
+ contacts_visible: "Os contactos neste grupo poderão ver-se uns aos outros."
create:
failure: "A criação do grupo falhou."
success: "O seu novo grupo %{name} foi criado"
@@ -134,21 +132,14 @@ pt-PT:
failure: "%{name} não se encontra vazio e não pôde ser removido."
success: "%{name} foi removido(a) com sucesso."
edit:
- add_existing: "Adicionar um contacto existente"
aspect_list_is_not_visible: "Os contactos neste grupo não podem ver-se uns aos outros."
aspect_list_is_visible: "Os contactos neste grupo podem ver-se uns aos outros."
- confirm_remove_aspect: "Tem a certeza que deseja eliminar este grupo?"
- done: "Feito"
+ confirm_remove_aspect: "Tem a certeza que deseja apagar este grupo?"
make_aspect_list_visible: "tornar visíveis uns aos outros nos contactos deste grupo?"
- remove_aspect: "Eliminar este grupo"
- rename: "mudar o nome"
+ remove_aspect: "Apagar este grupo"
+ rename: "renomear"
update: "atualizar"
updating: "a atualizar"
- few: "%{count} grupos"
- helper:
- are_you_sure: "Tem a certeza que deseja eliminar este grupo?"
- aspect_not_empty: "Grupo não vazio"
- remove: "remover"
index:
diaspora_id:
content_1: "A sua identificação diaspora* é:"
@@ -158,10 +149,10 @@ pt-PT:
handle_explanation: "Esta é a sua identificação no diaspora*. Tal como num endereço de e-mail, pode dá-la às pessoas para o contactarem."
help:
any_problem: "Algum problema?"
- contact_podmin: "Contacte o administrador do seu pod!"
+ contact_podmin: "Contacte o administrador do seu servidor!"
do_you: "Tem:"
email_feedback: "%{link} o seu feedback, se preferir"
- email_link: "Email"
+ email_link: "Corrreio Eletrónico"
feature_suggestion: "... tem uma sugestão para %{link}?"
find_a_bug: "... encontrar uma %{link}?"
have_a_question: "... uma %{link}?"
@@ -178,29 +169,24 @@ pt-PT:
keep_pod_running: "Mantenha %{pod} a funcionar com rapidez e compre aos servidores o \"café deles\" doando mensalmente!"
new_here:
follow: "Siga %{link} e dê as boas-vindas aos novos utilizadores do diaspora*!"
- learn_more: "Saiba mais"
+ learn_more: "Saber mais"
title: "Dê as boas-vindas a novos utilizadores"
- no_contacts: "Não há contactos"
+ no_contacts: "Nenhuns contactos"
no_tags: "+ Encontre uma etiqueta para seguir"
people_sharing_with_you: "Pessoas a partilhar consigo"
post_a_message: "publicar uma mensagem >>"
services:
content: "Pode conetar os seguintes serviços ao diaspora*:"
- heading: "Ligar serviços"
+ heading: "Conetar Serviços"
unfollow_tag: "Deixar de seguir #%{tag}"
welcome_to_diaspora: "Bem-vindo ao diaspora*, %{name}!"
- many: "%{count} grupos"
- move_contact:
- error: "Erro ao mover o contacto: %{inspect}"
- failure: "não funcionou %{inspect}"
- success: "Pessoa movida para o novo grupo"
new:
create: "Criar"
name: "Nome (apenas visível para si)"
no_contacts_message:
community_spotlight: "destaque da comunidade"
or_spotlight: "Ou pode partilhar com %{link}"
- try_adding_some_more_contacts: "Pode pesquisar ou convidar mais contactos."
+ try_adding_some_more_contacts: "Pode procurar ou convidar mais contactos."
you_should_add_some_more_contacts: "Devia adicionar mais alguns contactos!"
no_posts_message:
start_talking: "Ainda ninguém disse nada!"
@@ -211,14 +197,6 @@ pt-PT:
family: "Família"
friends: "Amigos"
work: "Trabalho"
- selected_contacts:
- manage_your_aspects: "Gerir os seus grupos."
- no_contacts: "Ainda não tem quaisquer grupos aqui."
- view_all_community_spotlight: "Ver todos os destaques da comunidade"
- view_all_contacts: "Ver todos os contactos"
- show:
- edit_aspect: "editar grupo"
- two: "%{count} grupos"
update:
failure: "O seu grupo, %{name}, tinha um nome grande demais para ser guardado."
success: "O seu grupo, %{name}, foi editado com sucesso."
@@ -238,36 +216,27 @@ pt-PT:
post_success: "Publicado! A fechar!"
cancel: "Cancelar"
comments:
- few: "%{count} comentários"
- many: "%{count} comentários"
new_comment:
comment: "Comentar"
commenting: "A comentar..."
one: "1 comentário"
other: "%{count} comentários"
- two: "%{count} comentários"
zero: "não há comentários"
contacts:
create:
failure: "Erro ao criar contacto"
- few: "%{count} contactos"
index:
add_a_new_aspect: "Adicionar um novo grupo"
add_to_aspect: "Adicionar contactos a %{name}"
- add_to_aspect_link: "adicionar contactos a %{name}"
all_contacts: "Todos os contactos"
community_spotlight: "Destaques da comunidade"
- many_people_are_you_sure: "Tem a certeza de que deseja começar um conversa privada com mais de %{suggested_limit} contactos? Publicar para este grupo pode ser uma forma melhor de os contactar."
my_contacts: "Os meus contactos"
no_contacts: "Parece que precisa de adicionar alguns contactos."
no_contacts_message: "Verifique %{community_spotlight}"
- no_contacts_message_with_aspect: "Verifique %{community_spotlight} ou %{add_to_aspect_link}"
only_sharing_with_me: "Apenas a partilhar comigo"
- remove_person_from_aspect: "Remover %{person_name} de \"%{aspect_name}\""
start_a_conversation: "Iniciar uma conversa"
title: "Contactos"
your_contacts: "Os seus contactos"
- many: "%{count} contactos"
one: "1 contacto"
other: "%{count} contactos"
sharing:
@@ -275,7 +244,6 @@ pt-PT:
spotlight:
community_spotlight: "Destaque da comunidade"
suggest_member: "Sugerir um membro"
- two: "%{count} contactos"
zero: "contactos"
conversations:
conversation:
@@ -284,8 +252,6 @@ pt-PT:
fail: "Mensagem inválida"
no_contact: "Cuidado, tem de adicionar primeiro um contacto!"
sent: "A mensagem foi enviada"
- destroy:
- success: "A conversa foi removida com sucesso"
helper:
new_messages:
few: "%{count} novas mensagens"
@@ -305,7 +271,7 @@ pt-PT:
subject: "assunto"
to: "para"
show:
- delete: "apagar e bloquear a conversa"
+ delete: "apagar conversação"
reply: "responder"
replying: "A responder..."
date:
@@ -314,7 +280,7 @@ pt-PT:
birthday_with_year: "%d de %B de %Y"
fullmonth_day: "%d de %B"
delete: "Apagar"
- email: "Email"
+ email: "Correio Eletrónico"
error_messages:
helper:
correct_the_following_errors_and_try_again: "Corrija os seguintes erros e volte a tentar."
@@ -352,14 +318,14 @@ pt-PT:
remove_notification_a: "Não."
remove_notification_q: "Se eu remover alguém de um ou de todos os meus grupos, essa pessoa recebe alguma notificação?"
rename_aspect_a: "Sim. No lado esquerdo da página principal, na sua lista de aspetos, coloque o cursor do rato sobre o aspeto que deseja renomear. Clique no lápis pequeno que está à direita de 'editar'. Clique em renomear na caixa que aparece."
- rename_aspect_q: "Posso renomear um aspecto?"
+ rename_aspect_q: "Eu posso renomear um aspeto?"
restrict_posts_i_see_a: "Sim. Clique em Os Meus Aspectos na barra lateral e em seguida clique em aspectos individuais na lista para seleccioná-los ou desseleccioná-los. Apenas as publicações por pessoas nos aspectos seleccionados apareceção no seu Stream."
restrict_posts_i_see_q: "Posso restringir as publicações que eu só vejo de certos aspetos?"
- title: "Aspetos"
+ title: "Grupos"
what_is_an_aspect_a: "Aspetos é a maneira em que agrupa os seus contactos no diaspora*. Um aspeto é uma daquelas faces que mostra ao mundo. Poderá ser quem você é no emprego, ou quem é para a sua família, ou quem é para os seus amigos num clube ao qual você pertence."
- what_is_an_aspect_q: "O que é um aspeto?"
+ what_is_an_aspect_q: "O que é um grupo?"
who_sees_post_a: "Se colocar uma publicação limitada, esta só irá estar visível para as pessoas que colocou nesse aspeto (ou aspetos, se esta for para múltiplos aspetos). Os seus contactos que não estiverem nesse aspeto, não têm nenhuma maneira de a verem, a não ser que a torne pública. Só as publicações públicas é que estarão visíveis para qualquer pessoa que não tenha sido colocada num dos seus aspetos."
- who_sees_post_q: "Quando publico num aspeto, quem o vê?"
+ who_sees_post_q: "Quando publico num grupo, quem o vê?"
foundation_website: "site da web da fundação diaspora"
getting_help:
get_support_a_hashtag: "pergunte numa publicação pública no diaspora*, utilizando o cardinal %{question}"
@@ -392,40 +358,50 @@ pt-PT:
find_people_q: "Acabei de me associar a um servidor, como posso encontrar pessoas com quem partilhar?"
title: "Servidores"
use_search_box_a: "Se souber a Id. deles completa no diaspora* ID (ex.: sername@podname.org), pode encontrá-los, procurando pela mesma. Se estiver no mesmo pod, pode procurar apenas pelo nome de utilizador. Em alternativa, pode procurá-los pelo nome do perfil deles (o nome que vê no ecrã). Se uma procura não funcionar da primeira vez, tente de novo."
- use_search_box_q: "Como utilizo a caixa de pesquisa para procurar pessoas específicas?"
+ use_search_box_q: "Como é que eu utilizo a caixa de procuras para encontrar uma pessoa específica?"
what_is_a_pod_a: "Um pod e um servidor a correr o software diaspora* e ligado à rede diaspora*. \"Pod\" e uma metáfora referindo-se às vagens nas plantas que contém sementes, da maneira que um servidor contém um número de contas de usuários. Existem muitos pods diferentes. Pode adicionar amigos de outros pods e comunicar com eles. (Pode pensar num pod diaspora* como sendo parecido a um provedor de serviço de email: há pods públicos, pods privados, e com algum esforço pode até mesmo correr o seu próprio)."
what_is_a_pod_q: "O que é um servidor?"
posts_and_posting:
- char_limit_services_q: "Qual é o limite de carateres para publicações compartilhadas através de um servço conetado com um cálculo de carateres pequeno?"
+ char_limit_services_a: "Neste caso a sua publicação é limitada à menor contagem de caracteres (140 no Twitter; 1000 no Tumblr), e o número de caracteres não utilizados é mostrado quando o ícone daquele serviço é assinalado. Ainda poderá publicar nestes serviços se a sua publicação ultrapassar os respetivos limites, no entanto o texto será truncado nesses serviços."
+ char_limit_services_q: "Qual é o limite de carateres para as publicações partilhadas através de um servço conetado com uma contagenm de carateres pequena?"
character_limit_a: "65,535 carateres. Isto é, mais de 65,395 carateres do que o que obtém no Twitter! ;)"
- character_limit_q: "Qual é o limite de caracteres em publicações?"
+ character_limit_q: "Qual é o limite de carateres para as publicações?"
+ embed_multimedia_a: "Geralmente basta colar a hiperligação (por exemplo: http://www.youtube.com/watch?v=nnnnnnnnn) na sua publicação, e o vídeo ou áudio será incorporado automaticamente. Alguns dos sites suportados são: YouTube, Vimeo, SoundCloud e Flickr entre outros. diaspora* utiliza oEmbed para esse efeito. A todo o momento novos sites vão sendo acrescentados a este suporte. Lembre-se de fazer sempre uma publicação de links simples e completos: não utilize links abreviados; nem caracteres depois da hiperligação base; e aguarde um instante antes de refrescar a página para ver a previsão de como ficará depois de publicar."
embed_multimedia_q: "Como é que eu integro um vídeo, áudio, ou outro conteúdo de multimédia numa publicação?"
+ format_text_a: "Ao utilizar um sistema simplificado chamado %{markdown}. Pode encontrar a sintaxe Markdown completa %{here}. O botão de pré-visualização é muito útil aqui, pois permite ver como aparecerá a sua mensagem antes de a compartilhar."
format_text_q: "Como é que eu formato o texto nas minhas publicações (negrito, itálico, etc.)?"
hide_posts_a: "Se apontar o seu rato no topo de uma publicação, aparece um X à direita. Clique-o para ocultar a publicação e cancelar as notificações sobre a mesma. Ainda pode continuar a ver a publicação se visitar a página de perfil da pessoas que a publicou."
hide_posts_q: "Como é que eu oculto uma publicação? Como é que eu deixo de receber notificações sobre uma publicação com o meu comentário?"
image_text: "texto da imagem"
- image_url: "URL da imagem"
+ image_url: "url da imagem"
insert_images_a: "Clique no ícone da câmara para inserir uma imagem numa publicação. Clique novamente no ícone da fotografia para adicionar outra fotografia, ou pode selecionar múltiplas fotografias para as enviar de uma vez."
insert_images_comments_a1: "O código seguinte \"Mardown\""
insert_images_comments_a2: "pode ser utilizado para inserir imagens da web para os comentários, bem como, nas publicações."
- insert_images_comments_q: "Posso inserir imagens em comentários?"
- insert_images_q: "Como insiro imagens em publicações?"
+ insert_images_comments_q: "Eu posso inserir imagens nos comentários?"
+ insert_images_q: "Como é que eu insiro imagens nas publicações?"
size_of_images_a: "Não. As imagens são redimensionadas automaticamente para se ajustarem ao fluxo. A redução não tem um código para especificar o tamanho de uma imagem."
- size_of_images_q: "Posso personalizar o tamanho das imagens em publicações ou comentários?"
+ size_of_images_q: "Eu posso personalizar o tamanho das imagens nas publicações ou comentários?"
stream_full_of_posts_a1: "O seu grupo é constituido até 3 tipos de publicações:"
+ stream_full_of_posts_li1: "Publicações de pessoas com quem você está a compartilhar, que podem ser de dois tipos: publicações públicas ou publicações limitadas compartilhadas com um grupo do qual você faz parte. Para remover essas publicações do seu fluxo, basta parar de compartilhar com essa pessoa."
stream_full_of_posts_li2: "Publicações públicas contendo uma das etiquetas que segue. Para as remover, deixe de seguir a etiqueta."
+ stream_full_of_posts_li3: "Publicações públicas feitas por pessoas listadas em \"Destaque da Comunidade\". Estas podem ser removidas desmarcando a opção \"Mostrar Destaques da Comunidade no Fluxo?\" na aba \"Conta\" das suas \"Definições\"."
stream_full_of_posts_q: "Porque é que o meu grupo está cheio de publicações de pessoas que não conheço, e que não compartilho com elas?"
title: "Publicações e publicar"
private_posts:
+ can_comment_a: "Apenas os utilizadores logados em diaspora* que associou a esse grupo podem comentar ou gostar da sua publicação privada."
can_comment_q: "Quem é que pode comentar ou gostar da minha publicação privada?"
+ can_reshare_a: "Ninguém. Publicações privadas não são recompartilháveis. Entretanto, utilizadores logados em diaspora* que estejam nesse grupo podem potencialmente copiar e colar a publicação."
can_reshare_q: "Quem é que pode recompartilhar a minha publicação privada?"
see_comment_a: "Só as pessoas que compartilham a publicação (as pessoas que foram selecionadas em aspeto por quem publica o original) podem ver os seus comentários e o gosto. "
see_comment_q: "Quando comento ou gosto de uma publicação privada, quem é que pode ver?"
title: "Publicações Privadas"
- who_sees_post_q: "Quando eu coloco uma mensagem num aspeto (ex.:, uma publicação privada), quem a pode ver?"
+ who_sees_post_a: "Apenas os utilizadores logados em diaspora* que associou a esse grupo podem ver a sua publicação privada."
+ who_sees_post_q: "Quando eu publico uma mensagem num aspeto (ex.:, uma publicação privada), quem a pode ver?"
private_profiles:
title: "Perfis Privados"
+ whats_in_profile_a: "Biografia, localização, sexo, e data de nascimento. É o que aparece na parte de baixo da página de edição do perfil. Toda esta informação é opcional - depende de você preencher ou não. Os utilizadores logados que você tenha adicionado aos seus grupos são as únicas pessoas que podem ver o seu perfil privado. Eles também verão as publicações privadas feitas no(s) grupos(s) em que os colocou, misturadas com as publicações públicas feitas por si, quando visitarem a sua página de perfil."
whats_in_profile_q: "O que faz parte do meu perfil privado?"
+ who_sees_profile_a: "Qualquer utilizador logado com quem você esteja a compartilhar (significa que você os adicionou a um dos seus grupos). De qualquer forma, as pessoas que o seguem mas que você não segue, verão apenas a sua informação pública."
who_sees_profile_q: "Quem vê o meu perfil privado?"
who_sees_updates_a: "Qualquer pessoa nos seus aspetos, vê as alterações do seu perfil privado. "
who_sees_updates_q: "Quem vê as atualizações ao meu perfil privado?"
@@ -437,6 +413,7 @@ pt-PT:
see_comment_reshare_like_a: "Qualquer utilizador do diaspora* com sessão iniciada, e também qualquer outra pessoa na Internet pode comentar e compartilhar publicações pública."
see_comment_reshare_like_q: "Quando eu comento em, volto a partilhar, ou gosto de uma publicação pública, quem é que pode ver?"
title: "Publicações Públicas"
+ who_sees_post_a: "Qualquer pessoa que utilize a internet pode potencialmente ver uma publicação marcada por si como pública, por isso assegure-se de que realmente quer que ela seja pública. É uma ótima forma de apelar ao mundo lá fora."
who_sees_post_q: "Quando eu publico qualquer coisa publicamente, quem é que pode ver?"
public_profiles:
title: "Perfis públicos"
@@ -479,7 +456,7 @@ pt-PT:
your_account_awaits: "A sua conta está à espera!"
new:
already_invited: "As pessoas seguintes não aceitaram o seu convite:"
- aspect: "Aspeto"
+ aspect: "Grupo"
check_out_diaspora: "Descubra o diaspora*!"
codes_left:
one: "Resta um convite neste código"
@@ -664,7 +641,7 @@ pt-PT:
thanks: "Obrigado,"
to_change_your_notification_settings: "para alterar as suas definições de notificação"
nsfw: "Conteúdo impróprio"
- ok: "OK"
+ ok: "CONFIRMAR"
or: "ou"
password: "Palavra-passe"
password_confirmation: "Confirmação de palavra-passe"
@@ -675,7 +652,6 @@ pt-PT:
add_contact_from_tag: "adicionar contacto pela etiqueta"
aspect_list:
edit_membership: "editar a participação no grupo"
- few: "%{count} pessoas"
helper:
is_not_sharing: "%{name} não está a partilhar consigo"
is_sharing: "%{name} está a partilhar consigo"
@@ -686,7 +662,6 @@ pt-PT:
no_results: "Ei! Precisa pesquisar por alguma coisa."
results_for: "Utilizadores que correspondem %{search_term}"
searching: "a pesquisar, por favor aguarde..."
- many: "%{count} pessoas"
one: "1 pessoa"
other: "%{count} pessoas"
person:
@@ -723,7 +698,6 @@ pt-PT:
add_some: "adicionar alguns"
edit: "editar"
you_have_no_tags: "não tem etiquetas!"
- two: "%{count} pessoas"
webfinger:
fail: "Lamentamos muito, não conseguimos encontrar %{handle}."
zero: "ninguém"
@@ -778,7 +752,7 @@ pt-PT:
reshare_by: "Partilhado por %{author}"
previous: "anterior"
privacy: "Privacidade"
- privacy_policy: "Política de privacidade"
+ privacy_policy: "Política de Privacidade"
profile: "Perfil"
profiles:
edit:
@@ -818,15 +792,12 @@ pt-PT:
update: "Atualizar"
invalid_invite: "A hiperligação de convite fornecida já não é válida!"
new:
- continue: "Continuar"
create_my_account: "Criar a minha conta!"
- diaspora: "<3 diaspora*"
email: "EMAIL"
enter_email: "Introduza um endereço de email"
enter_password: "Insira uma senha (mínimo de 6 carateres)"
enter_password_again: "Introduza de novo a mesma palavra-passe"
enter_username: "Escolha um nome de utilizador (apenas letras, números e sublinhado (_))"
- hey_make: "OLÁ,<br/>EFETUE<br/>ALGO."
join_the_movement: "Junte-se ao movimento!"
password: "PALAVRA-PASSE"
password_confirmation: "CONFIRMAÇÃO DA SENHA"
@@ -913,8 +884,8 @@ pt-PT:
aspect_dropdown:
add_to_aspect: "Adicionar contacto"
toggle:
- one: "Em %{count} aspeto"
- other: "Em %{count} aspetos"
+ one: "Em %{count} grupo"
+ other: "Em %{count} grupos"
zero: "Adicionar contacto"
contact_list:
all_contacts: "Todos os contactos"
@@ -988,10 +959,7 @@ pt-PT:
no_message_to_display: "Não há mensagens para mostrar."
new:
mentioning: "A mencionar: %{person}"
- too_long:
- one: "por favour, não utilize mais de %{count} carateres nas suas mensagens de estado"
- other: "por favour, não utilize mais de %{count} carateres nas suas mensagens de estado"
- zero: "por favor, não utilize mais de %{count} carateres nas suas mensagens de estado"
+ too_long: "{\"one\"=>\"por favour, não utilize mais de %{count} carateres nas suas mensagens de estado\", \"other\"=>\"por favour, não utilize mais de %{count} carateres nas suas mensagens de estado\", \"zero\"=>\"por favor, não utilize mais de %{count} carateres nas suas mensagens de estado\"}"
stream_helper:
hide_comments: "Ocultar todos comentários"
show_comments:
@@ -1029,7 +997,6 @@ pt-PT:
title: "Atividade pública"
tags:
contacts_title: "Pessoas que gostam desta etiqueta"
- tag_prefill_text: "O que acontece com %{tag_name} é... "
title: "Publicações marcadas: %{tags}"
tag_followings:
create:
@@ -1043,12 +1010,9 @@ pt-PT:
show:
follow: "Seguir #%{tag}"
following: "A Seguir #%{tag}"
- nobody_talking: "Ainda ninguém está a falar sobre %{tag}."
none: "A etiqueta vazia não existe!"
- people_tagged_with: "Pessoas com a etiqueta %{tag}"
- posts_tagged_with: "Publicações com a etiqueta #%{tag}"
stop_following: "Deixar de Seguir #%{tag}"
- terms_and_conditions: "Termos e condições"
+ terms_and_conditions: "Termos e Condições"
undo: "Anular?"
username: "Nome de utilizador"
users:
@@ -1061,7 +1025,7 @@ pt-PT:
wrong_password: "A palavra-passe digitada não corresponde à sua palavra-passe actual."
edit:
also_commented: "alguém comentar numa publicação em que já comentou"
- auto_follow_aspect: "Aspeto para os contactos adicionados automaticamente:"
+ auto_follow_aspect: "Grupo para os contactos adicionados automaticamente:"
auto_follow_back: "Compartilgar automaticamente com os utilizadores que começam a compartilhar consigo"
change: "Alterar"
change_email: "Mudar de email"
@@ -1070,10 +1034,10 @@ pt-PT:
character_minimum_expl: "deve ter pelo menos seis carateres"
close_account:
dont_go: "Ei, por favor não vá!"
- if_you_want_this: "Se realmente quer isto, digite a seguir a sua palavra-passe e clique em 'Encerrar Conta'"
- lock_username: "Isto irá bloquear o seu nome de utilizador se decidir registar-se de novo."
- locked_out: "A sua sessão vai ser terminada e a sua conta bloqueada."
- make_diaspora_better: "Nós queremos que nos ajude a tornar o diaspora* ainda melhor, por isso, poderia ajudar-nos em vez de nos deixar. Se desejar deixar-nos, nós queremos que saiba o que acontece a seguir."
+ if_you_want_this: "Se realmente é o que quer, digite a seguir a sua palavra-passe e clique em 'Encerrar Conta'"
+ lock_username: "O seu nome de utilizador será bloqueado. Não poderá criar uma conta nova neste servidor com a mesma identificação.."
+ locked_out: "A sua sessão será terminada e a sua conta bloqueada até que esta seja apagada."
+ make_diaspora_better: "Nós gostaríamos que ficasse e nos ajude a tornar o diaspora* ainda melhor, em vez de nos deixar. Se realmente desejar deixar-nos, nós queremos que saiba o que irá acontecer a seguir."
mr_wiggles: "Mr Wiggles ficará triste de o(a) ver partir"
no_turning_back: "Atualmente, não há como voltar atrás."
what_we_delete: "Nós iremos apagar todas as suas publicações e os dados do perfil, assim que seja tão humanamente possível. Os seus comentários irão manter-se, mas estes serão associados com a sua Id. do diaspora*, em vez do seu nome."
@@ -1082,7 +1046,6 @@ pt-PT:
current_password: "Palavra-passe atual"
current_password_expl: "aquela que utiliza para iniciar sessão..."
download_photos: "descarregar as minhas fotografias"
- download_xml: "descarregar o meu xml"
edit_account: "Editar conta"
email_awaiting_confirmation: "Enviámos-lhe uma hiperligação de ativação para %{unconfirmed_email}. Até que siga esta hiperligação e ative o novo endereço, continuaremos a utilizar o seu endereço original %{email}."
export_data: "Exportar dados"
@@ -1091,14 +1054,13 @@ pt-PT:
liked: "alguém gosta da sua publicação"
mentioned: "está mencionado numa publicação"
new_password: "Nova palavra-passe"
- photo_export_unavailable: "Exportação de fotografias atualmente indisponível"
private_message: "recebe uma mensagem privada"
receive_email_notifications: "Receber notificações por e-mail quando:"
reshared: "alguém volta a compartilhar a sua publicação"
show_community_spotlight: "Mostrar Destaques da Comunidade nos Seus Meios?"
show_getting_started: "Mostrar dicas de 'Iniciação ...'"
started_sharing: "alguém começa a compartilhar consigo"
- stream_preferences: "Preferências de luxo"
+ stream_preferences: "Preferências de fluxo"
your_email: "O seu endereço de email"
your_handle: "A sua identificação no diaspora*"
getting_started:
@@ -1136,7 +1098,7 @@ pt-PT:
no_person_constructed: "Nenhuma pessoa pôde ser construída através deste hcard."
not_enabled: "o 'webfinger' parece não estar ativado para o anfitrião de %{account}"
xrd_fetch_failed: "ocorreu um erro ao obter o xrd da conta %{account}"
- welcome: "Bem-vindo(a)!"
+ welcome: "Bem-vindo!"
will_paginate:
next_label: "seguinte &raquo;"
previous_label: "&laquo; anterior" \ No newline at end of file
diff --git a/config/locales/diaspora/ro.yml b/config/locales/diaspora/ro.yml
index 2007e0e6d..a0d01322b 100644
--- a/config/locales/diaspora/ro.yml
+++ b/config/locales/diaspora/ro.yml
@@ -58,8 +58,6 @@ ro:
add_to_aspect:
failure: "Nu s-a reuşit adăuga contactul la aspect."
success: "Contactul a fost adăugat cu succes la aspect."
- aspect_contacts:
- done_editing: "terminat de editat"
aspect_listings:
add_an_aspect: "+ Adaugă un aspect"
deselect_all: "Deselectează tot"
@@ -77,20 +75,13 @@ ro:
failure: "%{name} nu este gol şi nu poate fi şters."
success: "%{name} a fost eliminat cu succes."
edit:
- add_existing: "Adaugă o persoană de contact existentă"
aspect_list_is_not_visible: "lista de aspecte nu este vizibila persoanelor adaugate"
aspect_list_is_visible: "lista de aspecte este vizibila persoanelor adaugate"
confirm_remove_aspect: "Eşti sigur că doreşti să ştergi acest aspect?"
- done: "Gata"
remove_aspect: "Şterge acest aspect"
rename: "redenumeşte"
update: "actualizare"
updating: "actualizare"
- few: "%{count} aspecte"
- helper:
- are_you_sure: "Eşti sigur că doreşti să ştergi acest aspect?"
- aspect_not_empty: "Aspectul nu este gol"
- remove: "şterge"
index:
diaspora_id:
content_1: "ID-ul tău pe diaspora* este:"
@@ -122,11 +113,6 @@ ro:
heading: "Conectează servciii"
unfollow_tag: "Nu mai urma #%{tag}"
welcome_to_diaspora: "%{name}, bine ai venit in comunitatea Diaspora!"
- many: "%{count} aspecte"
- move_contact:
- error: "Eroare la mutarea contactului: %{inspect}"
- failure: "nu a mers %{inspect}"
- success: "S-a mutat persoana la noul aspect"
new:
create: "Crează"
name: "Nume (vizibil doar pentru tine)"
@@ -144,14 +130,6 @@ ro:
family: "Familie"
friends: "Prieteni"
work: "Lucru"
- selected_contacts:
- manage_your_aspects: "Gestionează aspectele tale personale"
- no_contacts: "Nu aveți incă nici o persoană de contact."
- view_all_community_spotlight: "Vizualizează toate reflectoarele comunității"
- view_all_contacts: "Vezi toate contactele"
- show:
- edit_aspect: "Editează aspect"
- two: "%{count} aspecte"
update:
failure: "Apectul tău, %{name}, are numele prea lung ca să fie salvat"
success: "Aspectul, %{name}, a fost editat cu succes."
@@ -163,23 +141,18 @@ ro:
post_success: "Publicat! Inchidere!"
cancel: "Anulează"
comments:
- few: "%{count} comentarii"
- many: "%{count} comentarii"
new_comment:
comment: "Comentariu"
commenting: "Comentând..."
one: "1 comentariu"
other: "%{count} comentarii"
- two: "%{count} comentarii"
zero: "nici un comentariu"
contacts:
create:
failure: "Eşuare la crearea contactului"
- few: "%{count} contacte"
index:
add_a_new_aspect: "Adaugă un aspect nou"
add_to_aspect: "adaugă contacte la %{name}"
- add_to_aspect_link: "Adaugă contacte la %{name}"
all_contacts: "Toate contactele"
community_spotlight: "reflectorul comunității"
my_contacts: "Contactele mele"
@@ -189,7 +162,6 @@ ro:
start_a_conversation: "Începe o conversație."
title: "Contacte"
your_contacts: "Contactele Tale"
- many: "%{count} contacte"
one: "1 contact"
other: "%{count} contacte"
sharing:
@@ -197,13 +169,11 @@ ro:
spotlight:
community_spotlight: "reflectorul comunității"
suggest_member: "Propune un membru"
- two: "%{count} contacte"
zero: "contacte"
conversations:
create:
+ fail: "Mesajul nu este valid"
sent: "Mesaj trimis"
- destroy:
- success: "Conversaţia a fost ştearsă cu succes"
helper:
new_messages:
few: "%{count} mesaje noi"
@@ -238,6 +208,15 @@ ro:
fill_me_out: "Umple-mă"
find_people: "Find people"
help:
+ posts_and_posting:
+ post_location_a: "În editor faceți clic pe pictograma PIN de lângă cameră. Acest lucru va introduce locația de OpenStreetMap. Puteți edita locația dvs. - dacă doriți puteți să introduceți doar orașul în loc de adresa specifică."
+ post_location_q: "Cum adaug locația mea la un post?"
+ post_notification_a: "Veți găsi o pictogramă clopoțel, lângă X in dreapta sus a unui post. Faceți clic pentru a activa sau dezactiva notificările pentru acest post."
+ post_notification_q: "Cum pot primi notificări sau opri obtinerea notificări, despre un post?"
+ post_poll_a: "Faceți clic pe pictograma grafic pentru a genera un sondaj. Tastați o întrebare și cel puțin două răspunsuri. Nu uitați să faceți postările dumneavoastră publice dacă vreți ca toată lumea să fie în măsură să participe la sondajul postat."
+ post_poll_q: "Cum adaug un sondaj la mesaj?"
+ post_report_a: "Faceți clic pe pictograma de alertă , triunghi, in dreapta sus a postului să o raporteze admin-ului. Introduceți un motiv pentru raportarea acestui post în caseta de dialog."
+ post_report_q: "Cum pot raporta un mesaj ofensator?"
wiki: "Wiki"
hide: "Ascunde"
invitations:
@@ -344,6 +323,7 @@ ro:
other: "şi celelalte %{count} persoane"
zero: "şi nimeni altul"
mark_all_as_read: "Marchează-le pe toate ca citite"
+ no_notifications: "Deocamdată nu ai notificări."
notifications: "Notificări"
liked:
few: "%{actors} has just liked your %{post_link}."
@@ -436,7 +416,6 @@ ro:
invited_by: "ai fost invitat(ă) de către"
aspect_list:
edit_membership: "editaţi apartenenţa la aspect"
- few: "%{count} persoane"
helper:
results_for: "rezultate pentru %{params}"
index:
@@ -444,7 +423,6 @@ ro:
no_one_found: "... dar nimeni nu a fost găsit."
no_results: "Hey! Trebuie sa cauţi ceva."
results_for: "caută rezultate pentru"
- many: "%{count} persoane"
one: "1 persoană"
other: "%{count} persoane"
person:
@@ -472,12 +450,12 @@ ro:
recent_public_posts: "Ultimele Publicaţii Publice"
return_to_aspects: "Intoarcere către pagina de aspecte"
see_all: "Vezi tot"
+ start_sharing: "Începe să comunici"
to_accept_or_ignore: "pentru a accepta sau ignora."
sub_header:
add_some: "Adaugă pe cineva"
edit: "editare"
you_have_no_tags: "nu ai nici un marcaj!"
- two: "%{count} persoane"
webfinger:
fail: "Ne pare rău, nu am putut găsi %{handle}."
zero: "nimeni"
@@ -530,7 +508,7 @@ ro:
reshare_by: "Partajat de către %{author}"
previous: "anterioare"
privacy: "Confidențialitate"
- privacy_policy: "Politica de Confidenţialitate"
+ privacy_policy: "Politica de confidenţialitate"
profile: "Profil"
profiles:
edit:
@@ -627,6 +605,7 @@ ro:
really_disconnect: "desconectează %{service}?"
inviter:
click_link_to_accept_invitation: "Click pe acest link pentru a accepta invitaţia"
+ join_me_on_diaspora: "Alătură-mi-te pe Diaspora*"
remote_friend:
invite: "invită"
not_on_diaspora: "Deocamdată nu este pe diaspora*"
@@ -638,6 +617,8 @@ ro:
create_request: "Find by Diaspora handle"
enter_a_diaspora_username: "Introduceţi numele de utilizator Diaspora :"
your_diaspora_username_is: "Numele tău de utilizator Diaspora este: %{diaspora_handle}"
+ aspect_dropdown:
+ add_to_aspect: "Adaugă la contacte"
contact_list:
all_contacts: "Toate contactele"
footer:
@@ -668,6 +649,7 @@ ro:
new_user_prefill:
hello: "Salutare tuturor, sunt #%{new_user_tag}. "
invited_by: "Mulţumesc pentru invitaţie, "
+ newhere: "nouvenit"
post_a_message_to: "Postati un mesaj catre %{aspect}"
posting: "Publicare..."
share: "Distribuie"
@@ -677,6 +659,7 @@ ro:
stream_element:
dislike: "I dislike this"
hide_and_mute: "Hide and Mute"
+ ignore_user: "Ignoră utilizatorul %{name}"
like: "I like this"
show: "arată"
unlike: "Nu ȋmi place"
@@ -687,13 +670,7 @@ ro:
failure: "Nu sa putut şterge postul"
helper:
no_message_to_display: "Nici un mesaj nou."
- too_long:
- few: "please make your status messages less than %{count} characters"
- many: "please make your status messages less than %{count} characters"
- one: "please make your status messages less than %{count} character"
- other: "please make your status messages less than %{count} characters"
- two: "please make your status messages less than %{count} characters"
- zero: "please make your status messages less than %{count} characters"
+ too_long: "{\"few\"=>\"please make your status messages less than %{count} characters\", \"many\"=>\"please make your status messages less than %{count} characters\", \"one\"=>\"please make your status messages less than %{count} character\", \"other\"=>\"please make your status messages less than %{count} characters\", \"two\"=>\"please make your status messages less than %{count} characters\", \"zero\"=>\"please make your status messages less than %{count} characters\"}"
stream_helper:
hide_comments: "ascunde comentariile"
show_comments:
@@ -708,6 +685,7 @@ ro:
title: "Activitatea proprie"
aspects:
title: "Your Aspects"
+ aspects_stream: "Aspecte"
followed_tag:
add_a_tag: "Adaugă un tag"
follow: "Urmează"
@@ -731,11 +709,13 @@ ro:
show:
follow: "Urmeaza #%{tag}"
following: "Urmarind #%{tag}"
- nobody_talking: "Nu se povesteste nimic despre %{tag} inca."
- people_tagged_with: "Persoane marcate cu %{tag}"
- posts_tagged_with: "Publicatii marcate cu #%{tag}"
stop_following: "Nu mai urmari #%{tag}"
- terms_and_conditions: "Termeni și Condiții de utilizare:"
+ tagged_people:
+ few: "%{count} persoane etichetate cu %{tag}"
+ one: "O persoană etichetată cu %{tag}"
+ other: "%{count} persoane etichetate cu %{tag}"
+ zero: "Nimeni etichetat cu %{tag}"
+ terms_and_conditions: "Termeni și condiții de utilizare"
undo: "refacem?"
username: "Nume de utilizator"
users:
@@ -757,7 +737,6 @@ ro:
comment_on_post: "...cineva comenteaza pe o publicatie proprie?"
current_password: "Parola curentă"
download_photos: "descarcă fotografiile mele"
- download_xml: "descarcă datele mele (xml)"
edit_account: "Editează cont"
email_awaiting_confirmation: "We have sent you an activation link to %{unconfirmed_email}. Till you follow this link and activate the new address, we will continue to use your original address %{email}."
export_data: "Exportare de date"
diff --git a/config/locales/diaspora/ru.yml b/config/locales/diaspora/ru.yml
index 17c28c00c..f4f3ea7e6 100644
--- a/config/locales/diaspora/ru.yml
+++ b/config/locales/diaspora/ru.yml
@@ -12,6 +12,8 @@ ru:
_home: "Главная"
_photos: "Фотографии"
_services: "Сервисы"
+ _statistics: "Статистика"
+ _terms: "условия"
account: "Аккаунт"
activerecord:
errors:
@@ -39,7 +41,7 @@ ru:
reshare:
attributes:
root_guid:
- taken: "Настолько здорово, да? Вы уже поделились этой записью!"
+ taken: "Здорово, да? Вы уже поделились этой записью!"
user:
attributes:
email:
@@ -96,12 +98,26 @@ ru:
zero: "%{count} пользователей"
week: "Неделя"
user_entry:
+ account_closed: "аккаунт закрыт"
+ diaspora_handle: "Ваша персональная ссылка в диаспора*"
+ email: "Почта"
+ guid: "Групповой идентификатор"
+ id: "Идентификатор"
+ last_seen: "последнее посещение"
? "no"
: Нет
+ nsfw: "#nsfw"
+ unknown: "неизвестно"
? "yes"
: Да
user_search:
+ account_closing_scheduled: "Учётная запись %{name} поставлена в очередь на закрытие. Будет завершено через несколько секунд..."
+ account_locking_scheduled: "Учётная запись %{name} поставлена в очередь на блокирование. Будет завершено через несколько секунд..."
+ account_unlocking_scheduled: "Учётная запись %{name} поставлена в очередь на разблокировку. Будет завершено через несколько секунд..."
add_invites: "добавить приглашения"
+ are_you_sure: "Вы уверены, что хотите закрыть эту учётную запись?"
+ are_you_sure_lock_account: "Вы уверены, что хотите заблокировать этот аккаунт?"
+ are_you_sure_unlock_account: "Вы уверены, что хотите разблокировать этот аккаунт?"
close_account: "Удалить учетную запись"
email_to: "E-mail для приглашения"
under_13: "Показать пользователей моложе 13 (COPPA)"
@@ -130,22 +146,20 @@ ru:
all_aspects: "Все аспекты"
application:
helper:
- unknown_person: "неизвестный пользователь"
+ unknown_person: "Неизвестный пользователь"
video_title:
unknown: "Неизвестное название видеозаписи"
are_you_sure: "Вы уверены?"
are_you_sure_delete_account: "Вы уверены, что хотите закрыть свой аккаунт? Эту процедуру будет невозможно отменить!"
aspect_memberships:
destroy:
- failure: "Не удалось удалить пользователя из аспектов"
- no_membership: "Не удалось найти этого пользователя в аспекте"
- success: "Пользователь успешно удалён из аспектов"
+ failure: "Не удалось удалить пользователя из аспекта."
+ no_membership: "Не удалось найти этого пользователя в аспекте."
+ success: "Пользователь успешно удалён из аспекта."
aspects:
add_to_aspect:
failure: "Не удалось добавить друга в аспект."
success: "Друг добавлен в аспект."
- aspect_contacts:
- done_editing: "редактирование завершено"
aspect_listings:
add_an_aspect: "+ Добавить аспект"
deselect_all: "Отменить выбор"
@@ -164,27 +178,22 @@ ru:
failure: "%{name} не пуст и не может быть удалён."
success: "%{name} успешно удалён."
edit:
- add_existing: "Добавить существующий контакт"
+ aspect_chat_is_enabled: "Контакты из этого аспекта могут общаться с вами."
+ aspect_chat_is_not_enabled: "Контакты из этого аспекта не могут общаться с вами."
aspect_list_is_not_visible: "Контакты в этом аспекте не могут видеть друг друга"
aspect_list_is_visible: "Контакты в этом аспекте могут видеть друг друга"
confirm_remove_aspect: "Вы уверены, что хотите удалить этот аспект?"
- done: "Готово"
- make_aspect_list_visible: "сделать контакты в этом аспекте видимыми друг другу?"
- manage: "Управлять"
+ grant_contacts_chat_privilege: "предоставить контактам в аспекте возможность общаться?"
+ make_aspect_list_visible: "Сделать контакты в этом аспекте видимыми друг другу?"
remove_aspect: "Удалить этот аспект"
- rename: "переименовать"
+ rename: "Переименовать"
set_visibility: "Установить видимость"
update: "Обновить"
- updating: "обновление"
- few: "%{count} аспекта"
- helper:
- are_you_sure: "Вы уверены в том, что хотите удалить этот аспект?"
- aspect_not_empty: "Аспект не пуст"
- remove: "удалить"
+ updating: "Обновление"
index:
diaspora_id:
content_1: "Ваш идентификатор в Диаспоре:"
- content_2: "По нему любой сможет найти вас в Диаспоре."
+ content_2: "По нему любой сможет найти вас в диаспоре*."
heading: "Идентификатор в Диаспоре"
donate: "Пожертвовать"
handle_explanation: "Это ваш идентификатор в Диаспоре. Как и адрес электронной почты, вы можете дать его людям для связи с вами."
@@ -215,22 +224,17 @@ ru:
no_contacts: "Нет контактов"
no_tags: "+ Найти метку"
people_sharing_with_you: "Люди, которые добавили вас"
- post_a_message: "новая запись >>"
+ post_a_message: "Опубликовать запись >>"
services:
content: "Вы можете подключить к Диаспоре следующие сервисы:"
heading: "Подключенные сервисы"
unfollow_tag: "Не следить за меткой #%{tag}"
welcome_to_diaspora: "Добро пожаловать в Диаспору, %{name}!"
- many: "%{count} аспектов"
- move_contact:
- error: "Ошибка при перемещении контакта: %{inspect}"
- failure: "не работает %{inspect}"
- success: "Контакт перемещён в новый аспект"
new:
create: "Создать"
name: "Имя (видно только вам)"
no_contacts_message:
- community_spotlight: "рекомендуемых пользователей."
+ community_spotlight: "Рекомендуемые пользователи"
or_spotlight: "Или вы можете добавить %{link}"
try_adding_some_more_contacts: "Вы можете найти или пригласить других пользователей."
you_should_add_some_more_contacts: "Добавьте больше контактов!"
@@ -243,18 +247,10 @@ ru:
family: "Семья"
friends: "Друзья"
work: "Работа"
- selected_contacts:
- manage_your_aspects: "Управление аспектами."
- no_contacts: "Здесь пока нет ни одного контакта."
- view_all_community_spotlight: "Посмотреть всех рекомендуемых"
- view_all_contacts: "Все контакты"
- show:
- edit_aspect: "редактировать аспект"
- two: "%{count} аспекта"
update:
failure: "Ваш аспект, %{name}, имеет слишком длинное имя для сохранения."
success: "Ваш аспект %{name} успешно отредактирован."
- zero: "нет аспектов"
+ zero: "Нет аспектов"
back: "Назад"
blocks:
create:
@@ -270,36 +266,31 @@ ru:
post_success: "Опубликовано! Закрытие!"
cancel: "Отменить"
comments:
- few: "%{count} комментария"
- many: "%{count} комментариев"
new_comment:
comment: "Комментировать"
commenting: "Комментирование..."
one: "1 комментарий"
other: "%{count} комментариев"
- two: "%{count} комментария"
- zero: "нет комментариев"
+ zero: "Комментариев нет"
contacts:
create:
failure: "Не удалось создать контакт"
- few: "%{count} контакта"
index:
add_a_new_aspect: "Новый аспект"
- add_to_aspect: "добавить контакты в %{name}"
- add_to_aspect_link: "добавить контакты в аспект %{name}"
+ add_contact: "Добавить контакт"
+ add_to_aspect: "Добавить контакты в аспект %{name}"
all_contacts: "Все контакты"
community_spotlight: "Рекомендованные пользователи"
- many_people_are_you_sure: "Вы уверены, что хотите начать приватную беседу с числом контактов более %{suggested_limit}? Возможно, лучше просто сделать запись для этого аспекта."
my_contacts: "Мои контакты"
no_contacts: "Похоже, вам надо добавить несколько контактов!"
+ no_contacts_in_aspect: "Вы еще никого не добавили в этот аспект. Ниже представлен список ваших существующих контактов, которые вы можете добавить в этот аспект."
no_contacts_message: "Загляните на страницу %{community_spotlight}"
- no_contacts_message_with_aspect: "Вы можете проверить страницу %{community_spotlight} или %{add_to_aspect_link}"
only_sharing_with_me: "Только добавившие меня"
- remove_person_from_aspect: "Удалить %{person_name} из \"%{aspect_name}\""
+ remove_contact: "Удалить контакт"
start_a_conversation: "Начать беседу"
title: "Контакты"
+ user_search: "Поиск пользователей"
your_contacts: "Ваши контакты"
- many: "%{count} контактов"
one: "1 контакт"
other: "%{count} контактов"
sharing:
@@ -307,8 +298,7 @@ ru:
spotlight:
community_spotlight: "Рекомендованные пользователи"
suggest_member: "Предложить пользователя"
- two: "%{count} контакта"
- zero: "Контакты"
+ zero: "Нет контактов"
conversations:
conversation:
participants: "Участники"
@@ -317,7 +307,8 @@ ru:
no_contact: "Эй, вам нужно сначала добавить контакт!"
sent: "Сообщение отправлено"
destroy:
- success: "Разговор успешно удалён"
+ delete_success: "Диалог успешно удален"
+ hide_success: "Диалог успешно удален"
helper:
new_messages:
few: "%{count} новых сообщения"
@@ -330,19 +321,20 @@ ru:
create_a_new_conversation: "Начать новый разговор"
inbox: "Входящие"
new_conversation: "Новый разговор"
- no_conversation_selected: "разговор не выбран"
- no_messages: "нет сообщений"
+ no_conversation_selected: "Разговор не выбран"
+ no_messages: "Сообщений нет"
new:
abandon_changes: "Отказаться от изменений?"
send: "Отправить"
sending: "Отправка..."
- subject: "тема"
- to: "кому"
+ subject: "Тема разговора"
+ to: "Кому"
new_conversation:
fail: "Неверное сообщение"
show:
- delete: "удалить и заблокировать разговор"
- reply: "ответить"
+ delete: "Удалить и заблокировать разговор"
+ hide: "Удалить и заблокировать диалог"
+ reply: "Ответить"
replying: "Ответ..."
date:
formats:
@@ -397,9 +389,16 @@ ru:
what_is_an_aspect_q: "Что такое аспект?"
who_sees_post_a: "Если вы создаёте ограниченную запись, её смогут увидеть только люди, которых вы добавили в соответствующий аспект (или аспекты, если вы выбрали несколько). Больше эту запись никто не увидит, если только вы не сделали её публичной. Только публичные записи будут доступны всем, даже тем, кого вы не добавили ни в один из своих аспектов."
who_sees_post_q: "Когда я адресую запись аспекту, кто его видит?"
+ chat:
+ add_contact_roster_a: "Во-первых, вам нужно включить чат для аспекта, в котором находится человек. Для этого перейдите на вкладку %{contacts_page}, выберите нужный вам аспект, и нажмите на иконку сообщений, чтобы включить чат для аспекта. %{toggle_privilege} Вы можете, если хотите, создать особый аспект под названием «Чат» и добавить в него людей, с которыми вы хотите общаться. После того как вы сделаете это, откройте интерфейс сообщений и выберите человека, которому вы хотите написать."
+ add_contact_roster_q: "Как я могу пообщаться с кем-либо в диаспоре*?"
+ contacts_page: "страница пользователя"
+ title: "Беседа"
+ faq: "ЧаВо"
foundation_website: "сайт Diaspora Foundation"
getting_help:
- get_support_a_hashtag: "спросите в публичной записи на Диаспоре*, используя метку %{question}"
+ get_support_a_faq: "Прочитайте нашу %{faq} страницу в вики"
+ get_support_a_hashtag: "задайте вопрос через публичную запись на Диаспоре*, используя метку %{question}"
get_support_a_irc: "присоединяйтесь к нам в %{irc} или джаббер чате diaspora@conference.dukgo.com"
get_support_a_tutorials: "Посмотрите наши %{tutorials}"
get_support_a_website: "Посетите наш %{link}"
@@ -411,7 +410,19 @@ ru:
getting_started_tutorial: "\"Инструкции для начинающих\""
here: "здесь"
irc: "IRC"
- markdown: "Markdown"
+ keyboard_shortcuts:
+ keyboard_shortcuts_a1: "Вы можете использовать следующее сочетание клавиш:"
+ keyboard_shortcuts_li1: "j - перейти к следующей записи"
+ keyboard_shortcuts_li2: "k - перейти к предыдущей записи"
+ keyboard_shortcuts_li3: "c - комментировать текущую запись"
+ keyboard_shortcuts_li4: "l - отметить запись как \"нравится\""
+ keyboard_shortcuts_li5: "r – Репостить текущую запись"
+ keyboard_shortcuts_li6: "m – Показать полностью текущую запись"
+ keyboard_shortcuts_li7: "o – Открыть первую ссылку в текущей записи"
+ keyboard_shortcuts_li8: "ctrl+enter – Отправить сообщение, которое вы написали"
+ keyboard_shortcuts_q: "Какие сочетания клавиш доступны?"
+ title: "Горячие клавиши"
+ markdown: "Форматировать текст"
mentions:
how_to_mention_a: "Напишите знак \"@\" и начните набирать имя. Появится меню с выбором подходящих пользователей. Заметьте, что упоминать пользователя можно только, если вы добавили его в свои аспекты."
how_to_mention_q: "Как мне упомянуть кого-нибудь, когда я создаю запись?"
@@ -430,10 +441,10 @@ ru:
photo_albums_a: "Пока нет. Хотя в боковой панели есть ссылка на поток загруженных фотографий, к которой вы можете получить доступ, если пользователь вас добавил."
photo_albums_q: "Есть ли в диаспоре фото и видео альбомы?"
subscribe_feed_a: "Да, но это ещё не законченная функция и форматирование в фиде будет довольно грубым. Если вы всё равно хотите попробовать, зайдите в чей-нибудь профиль и кликните по кнопке фида в вашем браузере или скопируйте адрес профиля (например https://joindiaspora.com/people/userID) и добавьте в агрегатор. Конечный результат будет выглядеть так: https://joindiaspora.com/public/username.atom Диаспора использует atom протокол, а не rss."
- subscribe_feed_q: "Могу ли я подписаться на чьи-нибудь публичные записи, через агрегатор?"
+ subscribe_feed_q: "Могу ли я подписаться на чьи-нибудь публичные записи через агрегатор?"
title: "Прочее"
pods:
- find_people_a: "Пригласите своих друзей с помощью электронной почты через функцию на боковой панели. Выберите для отслеживания #метки которые вам интересны. Посмотрите ваш поток новостей и найдите единомышленников: добавьте их в «аспекты». Создайте свою первую запись с меткой #новичок и другими метками согласно вашим интересам."
+ find_people_a: "Приглашайте друзей с помощью email-ссылки в боковой панели. Следите за #тегами чтобы найти людей с похожими интересами. Добавляйте людей, пишущих на интересные вам темы, в аспекты. Создайте свою первую запись с меткой #новичок и другими метками согласно вашим интересам."
find_people_q: "Я только что вступил в сообщество, как мне найти собеседников?"
title: "Поды"
use_search_box_a: "Если вы знаете полный адрес (например логин@имяпода.орг), вы можете просто вбить этот адрес в поиск. Если вы находитесь на одном и том же поде, то можете сделать поиск по логину. В остальных случаях вы можете просто сделать поиск по их имени, указанному в профиле (то, которое вы видите на экране). Если поиск не дал результатов, имеет смысл поискать позже - возможно нужный под был временно отключён или перегружен."
@@ -462,7 +473,7 @@ ru:
size_of_images_q: "Могу ли я задавать размер изображений для своей записи?"
stream_full_of_posts_a1: "В вашем потоке появляется три типа записей:"
stream_full_of_posts_li1: "Публичные и приватные записи людей, которых вы добавили. Чтобы убрать их из потока вы можете просто исключить пользователя из своих контактов."
- stream_full_of_posts_li2: "Публичные записи, содержащие метки которые вы отслеживаете. Чтобы убрать их удалите соответствующую метку из списка отслеживаемых."
+ stream_full_of_posts_li2: "Публичные записи с метками, которые вы отслеживаете. Чтобы убрать эти записи, уберите метку из отслеживаемого."
stream_full_of_posts_li3: "Публичные записи пользователей, рекомендуемых сообществом. Вы можете убрать эти записи, изменив соответствующую настройку аккаунта."
stream_full_of_posts_q: "Почему в моём потоке записи людей, которых я не знаю и которых не добавлял?"
title: "Записи и их создание"
@@ -489,16 +500,16 @@ ru:
can_comment_reshare_like_q: "Кто может комментировать мои публичные записи, делиться или отмечать как понравившиеся?"
deselect_aspect_posting_a: "Это не повлияет на саму запись. Если вы хотите, чтобы запись не была доступна одному или нескольким аспектам, вы должны воспользоваться меню, находящимся под полем ввода записи."
deselect_aspect_posting_q: "Что произойдёт, если я исключу один или несколько аспектов в боковой панели при создании публичной записи?"
- find_public_post_a: "Ваши публичные записи будут появляться в лентах людей, которые на вас подписаны. Если вы включаете #метки, то их увидит любой, кто на них подписан или сделает по ним поиск. Также у любой записи есть индивидуальный URL, который может получить каждый, даже не зарегистрированный в диаспоре пользователь. Так что ссылки на публичные записи могут быть опубликованы в твиттере, блогах и вообще где угодно. Также публичные записи индексируются поисковыми движками."
+ find_public_post_a: "Ваши публичные записи будут появляться в лентах людей, которые на вас подписаны. Если вы включаете #метки, то их увидит любой, кто на них подписан или сделает по ним поиск. Также, у любой записи есть индивидуальный URL, который может получить каждый, даже не зарегистрированный в диаспоре пользователь. Так что ссылки на публичные записи могут быть опубликованы в твиттере, блогах и вообще где угодно. Также, публичные записи индексируются поисковыми движками."
find_public_post_q: "Как другие люди смогут обнаружить мою публичную запись?"
see_comment_reshare_like_a: "Любой интернет пользователь. Комментарии, лайки и репосты публичных записей тоже являются публичными."
see_comment_reshare_like_q: "Когда я комментирую, делюсь или отмечаю публичную запись, кто может это видеть?"
title: "Публичные записи"
- who_sees_post_a: "Все интернет пользователи могут увидеть запись, которую вы сделали публичной. Так что проверьте - действительно ли вы хотите этого. С другой стороны это неплохой способ поделиться со всем миром."
+ who_sees_post_a: "Все интернет пользователи могут увидеть запись, которую вы сделали публичной. Так что проверьте - действительно ли вы хотите этого. С другой стороны, это неплохой способ поделиться со всем миром."
who_sees_post_q: "Кто может видеть мои публичные записи?"
public_profiles:
title: "Публичные профили"
- what_do_tags_do_a: "Они помогают людям, понять чем вы интересуетесь. Ваша аватара и имя появятся на странице метки в списке слева среди других людей, использовавших эту метку в их публичных профилях."
+ what_do_tags_do_a: "Они помогают людям понять чем вы интересуетесь. Ваша фотография и имя появятся на странице метки слева в списке среди других людей, использовавших эту метку в их публичных профилях."
what_do_tags_do_q: "Для чего нужны метки в моём публичном профиле?"
whats_in_profile_a: "Ваше имя, пять меток, которые вы выбрали, чтобы описать себя, аватара и лента ваших публичных записей. Вы можете сделать эту информацию настолько личной или настолько анонимной, насколько захотите."
whats_in_profile_q: "Что содержит страница публичного профиля?"
@@ -533,14 +544,14 @@ ru:
tags:
filter_tags_a: "Эта фунция ещё не включена, но вы можете воспользоваться сторонними плагинами по ссылке %{third_party_tools}."
filter_tags_q: "Как отфильтровать/исключить метки из моей ленты?"
- followed_tags_a: "Если вы искали по метке, то можете нажать кнопку \"Подписаться на метку #имяметки\". После этого она появится в боковой колонке в разделе \"Мои метки\". Если вы нажмёте на одну из этих них, то перейдёте на страницу метки, где будут перечислены последние записи, содержащие её. Если вы нажмёте на \"Мои метки\", то увидите ленту с подписками на них, но без подписок на пользователей. "
+ followed_tags_a: "Если вы искали по метке, то можете нажать кнопку \"Подписаться на метку #имяметки\". После этого она появится в боковой колонке в разделе \"Мои метки\". Если вы нажмёте на одну из них, то перейдёте на страницу метки, где будут перечислены последние записи, содержащие её. Если вы нажмёте на \"Мои метки\", то увидите ленту с подписками на них, но без подписок на пользователей. "
followed_tags_q: "Что такое \"#Мои метки\" и как мне на них подписываться?"
people_tag_page_a: "Это люди, указавшие данную метку в качестве описания в своём публичном профиле."
people_tag_page_q: "Кто все эти люди, перечисленные в левой колонке на странице метки?"
tags_in_comments_a: "Метка, добавленная в комментарий будет ссылаться на страницу метки, но сам комментарий и запись, содержащая этот комментарий там не появятся. Это работает только с метками, содержащимися в записи."
- tags_in_comments_q: "Могу ли я поместить метки в комментарии?"
+ tags_in_comments_q: "Могу ли я использовать метки в комментариях, или только в записях?"
title: "Метки"
- what_are_tags_for_a: "Метки дают возможность определить категории для вашей записи. При поиске по метке будут показаны все записи, содержащие её (как публичные, так и доступные вам приватные). Это даёт возможность найти вашу запись через поиск диаспоры, хотя вы всё ещё можете искать нужные записи через поисковый движок, если они публичные."
+ what_are_tags_for_a: "Метки дают возможность определить категории для вашей записи. При поиске по метке будут показаны все записи, содержащие её (как публичные, так и, доступные вам, приватные). Это даёт возможность найти интересующие вас и других людей записи через поиск диаспоры."
what_are_tags_for_q: "Для чего нужны метки?"
third_party_tools: "инструменты сторонних разработчиков"
title_header: "Помощь"
@@ -591,18 +602,18 @@ ru:
layouts:
application:
back_to_top: "Вернуться наверх"
- powered_by: "Основано на Диаспоре*"
+ powered_by: "Основано на диаспоре*"
public_feed: "Публичный поток %{name} в Диаспоре"
source_package: "скачать исходный код"
- toggle: "обычный/мобильный"
- whats_new: "что нового?"
+ toggle: "Обычный/мобильный"
+ whats_new: "Что нового?"
your_aspects: "Ваши аспекты"
header:
- admin: "администратор"
- blog: "блог"
- code: "код"
+ admin: "Администратор"
+ blog: "Блог"
+ code: "Код"
help: "Помощь"
- login: "войти"
+ login: "Войти"
logout: "Выйти"
profile: "Профиль"
recent_notifications: "Последние извещения"
@@ -630,7 +641,7 @@ ru:
zero: "Понравилось:0"
limited: "Ограниченная"
more: "Ещё"
- next: "вперёд"
+ next: "Далее"
no_results: "Результатов не найдено"
notifications:
also_commented:
@@ -673,9 +684,11 @@ ru:
comment_on_post: "Комментарий к записи"
liked: "Понравилась"
mark_all_as_read: "Отметить всё как прочитанное"
+ mark_all_shown_as_read: "Отметить все как прочитанное"
mark_read: "Пометить как прочитанное"
mark_unread: "пометить как непрочитанное"
mentioned: "Упомянул"
+ no_notifications: "У вас нет ни одного оповещения."
notifications: "Уведомления"
reshared: "Поделился"
show_all: "показать всё"
@@ -735,15 +748,47 @@ ru:
other: "%{actors} начали делиться с вами."
zero: "%{actors} начали делиться с вами."
notifier:
+ a_limited_post_comment: "Добавлен новый комментарий на ограниченной записи в диаспоре*."
a_post_you_shared: "запись."
+ a_private_message: "Вам поступило новое личное сообщение в диаспоре*."
accept_invite: "Примите ваше приглашение в Диаспору*!"
- click_here: "нажмите сюда,"
+ click_here: "нажмите здесь"
comment_on_post:
reply: "Ответить или посмотреть запись %{name} >"
confirm_email:
click_link: "Чтобы активировать ваш адрес %{unconfirmed_email}, пожалуйста, перейдите по этой ссылке:"
subject: "Пожалуйста, активируйте ваш новый адрес %{unconfirmed_email}"
email_sent_by_diaspora: "Это письмо было послано %{pod_name}. Если вы не хотите получать подобные письма,"
+ export_email:
+ body: "Здравствуйте, %{name},  Ваши данные были обработаны и готовы для скачивания, следуйте [этой ссылке]%{url}.    Почтовый робот диаспоры*!"
+ subject: "Ваши личные данные готовы для загрузки, %{name}"
+ export_failure_email:
+ body: |-
+ Здравствуйте, %{name}  
+ Мы столкнулись с проблемой при обработке ваших персональных данных для скачивания.
+ Попробуйте снова!
+ С извинениями,
+ Почтовый робот диаспоры*!
+ subject: "Мы сожалеем, что возникли проблемы с вашими данными, %{name}"
+ export_photos_email:
+ body: |-
+ Здравствуйте, %{name} 
+  
+ Ваши фотографии были обработаны и готовы к загрузке, чтобы загрузить их, следуйте [этой ссылке] (%{url}). 
+  
+ С уважением,  
+  Почтовый робот диаспоры*!
+ subject: "Ваши фотографии готовы к загрузке, %{name}"
+ export_photos_failure_email:
+ body: |-
+ Здравствуйте, %{name} 
+
+  Мы столкнулись с проблемой при обработке ваших фотографий. 
+ Будьте добры, попробуйте снова! 
+
+ Приносим свои извинения, 
+  Почтовый робот диаспоры*!
+ subject: "С вашими фотографиями возникла проблема, %{name}"
hello: "Привет, %{name}!"
invite:
message: |-
@@ -769,6 +814,21 @@ ru:
subject: "%{name} упомянул вас в Диаспоре*"
private_message:
reply_to_or_view: "Ответить или посмотреть эту беседу >"
+ remove_old_user:
+ body: |-
+ Привет,
+
+ Всвязи с неактивностью вашей учётной записи diaspora* на %{pod_url}, мы вынуждеы сообщить вам, что система отметила вашу учётную запись к автоматизированному удалению. Это происходит автоматически по прошествию периода неактивности более %{after_days} дней.
+
+ Вы можете избежать потери учётной записи, зайдя в нее до %{remove_after}, в случае чего удаление будет автоматически отменено.
+
+ Эта техническая операция выполняется с целью убедиться в том, что активные пользователи получают большую часть ресурсов данной инстанции diaspora* . Благодарим за понимание.
+
+ Если вы хотите сохранить ваш аккаунт, пожалуйста, войдите в него здесь: %{login_url}
+
+ В надежде увидеть вас снова,
+ Почтовый робот diaspora*!
+ subject: "Ваша учётная запись помечена на удаление по причине неактивности"
report_email:
body: |-
Здравствуйте,
@@ -811,8 +871,7 @@ ru:
add_contact_small:
add_contact_from_tag: "добавить контакт из метки"
aspect_list:
- edit_membership: "редактировать пользователей в аспекте"
- few: "%{count} пользователя"
+ edit_membership: "Редактировать пользователей в аспекте"
helper:
is_not_sharing: "%{name} не добавил вас"
is_sharing: "%{name} делится с вами"
@@ -826,11 +885,10 @@ ru:
search_handle: "Используйте идентификаторы Диаспоры (имя@домен.зона) чтобы найти ваших друзей."
searching: "идёт поиск: пожалуйста, подождите..."
send_invite: "Всё ещё пусто? Пригласите кого-нибудь!"
- many: "%{count} пользователей"
one: "1 пользователь"
other: "%{count} пользователей"
person:
- add_contact: "добавить контакт"
+ add_contact: "Добавить контакт"
already_connected: "Уже подключён"
pending_request: "В ожидании запроса"
thats_you: "Это вы!"
@@ -839,10 +897,10 @@ ru:
born: "День рождения"
edit_my_profile: "Редактировать профиль"
gender: "Пол"
- in_aspects: "в аспектах"
+ in_aspects: "В аспектах"
location: "Местоположение"
photos: "Фотографии"
- remove_contact: "удалить контакт"
+ remove_contact: "Удалить контакт"
remove_from: "Удалить %{name} из %{aspect}?"
show:
closed_account: "Эта учётная запись была закрыта."
@@ -857,13 +915,12 @@ ru:
recent_public_posts: "Последние публичные записи"
return_to_aspects: "Вернуться на страницу аспектов"
see_all: "Показать всё"
- start_sharing: "Добавить"
+ start_sharing: "Начать делиться"
to_accept_or_ignore: "принять или игнорировать."
sub_header:
- add_some: "добавить"
- edit: "редактировать"
- you_have_no_tags: "у вас нет меток!"
- two: "%{count} пользователя"
+ add_some: "Добавить"
+ edit: "Редактировать"
+ you_have_no_tags: "У вас нет меток!"
webfinger:
fail: "К сожалению, мы не смогли найти %{handle}."
zero: "0 пользователей"
@@ -891,11 +948,11 @@ ru:
photo:
view_all: "Посмотреть все фотографии %{name}"
show:
- collection_permalink: "постоянная ссылка на коллекцию"
+ collection_permalink: "Ссылка на коллекцию"
delete_photo: "Удалить фотографию"
- edit: "редактировать"
+ edit: "Редактировать"
edit_delete_photo: "Изменить описание фотографии / удалить фотографию"
- make_profile_photo: "сделать аватаром"
+ make_profile_photo: "Сделать аватаром"
show_original_post: "Показать исходную запись"
update_photo: "Обновить фотографию"
update:
@@ -915,7 +972,7 @@ ru:
other: "%{count} фото пользователя %{author}"
zero: "Нет фото пользователя %{author}"
reshare_by: "Поделился (-лась) %{author}"
- previous: "назад"
+ previous: "Назад"
privacy: "Конфиденциальность"
privacy_policy: "Политика конфиденциальности"
profile: "Профиль"
@@ -926,7 +983,7 @@ ru:
first_name: "Имя"
last_name: "Фамилия"
nsfw_check: "Пометить все мои записи как NSFW"
- nsfw_explanation: "NSFW (‘not safe for work’, \"18+\") — внутренний стандарт сообщества Diaspora* для информации, которая может быть неподходящей для просмотра на рабочем месте. Если вы планируете часто публиковать подобные материалы, отметьте, пожалуйста, эту опцию — и всё, чем вы делитесь, будет спрятано в потоках других пользователей, если они сами не пожелают их посмотреть."
+ nsfw_explanation: "NSFW (‘not safe for work’, \"18+\") — внутренний стандарт сообщества диаспоры* для информации, которая может быть неподходящей для просмотра на рабочем месте. Если вы планируете часто публиковать подобные материалы, отметьте, пожалуйста, эту опцию — и всё, чем вы делитесь, будет спрятано в потоках других пользователей, если они сами не пожелают их посмотреть."
nsfw_explanation2: "Если вы не хотите использовать эту опцию, пожалуйста, добавляйте метку #nsfw каждый раз когда ваша запись содержит подобный материал."
update_profile: "Обновить профиль"
your_bio: "Ваша биография"
@@ -952,7 +1009,7 @@ ru:
registrations:
closed: "На этом сервере Диаспоры регистрация закрыта."
create:
- success: "Вы вступили в Диаспору!"
+ success: "Вы вступили в диаспору*!"
edit:
cancel_my_account: "Отменить регистрацию"
edit: "Редактировать %{name}"
@@ -962,27 +1019,26 @@ ru:
update: "Обновить"
invalid_invite: "Это приглашение уже недействительно!"
new:
- continue: "Продолжить"
create_my_account: "Создать аккаунт"
- diaspora: "<3 Диаспора*"
email: "ПОЧТА"
enter_email: "Введите E-mail"
enter_password: "Введите пароль (не меньше шести символов)"
enter_password_again: "Повторите пароль"
enter_username: "Выберите имя пользователя (только латинские буквы, цифры и подчеркивание)"
- hey_make: "ПРИВЕТ,<br/>СОЗДАЙТЕ<br/>ЧТО-НИБУДЬ."
join_the_movement: "Присоединяйтесь к движению!"
password: "ПАРОЛЬ"
password_confirmation: "ПОДТВЕРЖДЕНИЕ ПАРОЛЯ"
sign_up: "РЕГИСТРАЦИЯ"
sign_up_message: "Социальная сеть с ♥"
submitting: "Отправка..."
+ terms: "Создавая аккаунт вы соглашаетесь с %{terms_link}."
+ terms_link: "условия предоставления услуг"
username: "ИМЯ ПОЛЬЗОВАТЕЛЯ"
report:
comment_label: "<b>Комментарий</b>:<br>%{data}"
confirm_deletion: "Вы уверены, что содержимое противоречит курсу партии?"
delete_link: "Удалить"
- not_found: "<u>Не удалось найти запись или комментарий. Наверное уже удалено пользователем.</u>"
+ not_found: "<u>Не удалось найти запись или комментарий. Наверное, уже удалено пользователем.</u>"
post_label: "<b>Запись</b>: %{title}"
reason_label: "Причина: %{text}"
reported_label: "<b>Донос от</b> %{person}"
@@ -996,7 +1052,7 @@ ru:
requests:
create:
sending: "Отправка"
- sent: "Вы просили добавить %{name}. Они должны увидеть это при следующем входе в Диаспору."
+ sent: "Вы просили добавить %{name}. Они должны увидеть это при следующем входе в диаспору*."
destroy:
error: "Пожалуйста, выберите аспект!"
ignore: "Проигнорированные запросы на дружбу."
@@ -1012,7 +1068,7 @@ ru:
existing: "Существующие контакты"
manage_within: "Управление контактами в"
new_request_to_person:
- sent: "отправлено!"
+ sent: "Отправлено!"
reshares:
comment_email_subject: "запись %{author}, распространённая %{resharer}"
create:
@@ -1077,6 +1133,8 @@ ru:
your_diaspora_username_is: "Ваше имя в Диаспоре: %{diaspora_handle}"
aspect_dropdown:
add_to_aspect: "Добавить контакт"
+ mobile_row_checked: "%{name} (переместить)"
+ mobile_row_unchecked: "%{name} (добавить)"
toggle:
few: "В %{count} аспектах"
many: "В %{count} аспектах"
@@ -1087,7 +1145,7 @@ ru:
all_contacts: "Все контакты"
footer:
logged_in_as: "вошли как %{name}"
- your_aspects: "ваши аспекты"
+ your_aspects: "Ваши аспекты"
invitations:
by_email: "По электронной почте"
dont_have_now: "У вас больше нет приглашений, но новые будут уже скоро!"
@@ -1105,7 +1163,7 @@ ru:
control_your_audience: "Выбирайте свою аудиторию"
logged_in: "вошли в %{service}"
manage: "Управление подключенными сервисами"
- new_user_welcome_message: "Используйте #метки чтобы структурировать свои записи и искать людей с похожими интересами. Привлекайте внимание интересных людей с помощью @Упоминаний."
+ new_user_welcome_message: "Используйте #метки, чтобы структурировать свои записи и искать людей с похожими интересами. Привлекайте внимание интересных людей с помощью @Упоминаний."
outside: "Публичные сообщения доступны для чтения всем, даже за пределами Диаспоры."
share: "Делитесь"
title: "Настройка подключенных сервисов"
@@ -1116,7 +1174,7 @@ ru:
discard_post: "Отменить запись"
formatWithMarkdown: "Используйте %{markdown_link} для оформления текста"
get_location: "Добавить местонахождение"
- make_public: "сделать публичным"
+ make_public: "Сделать публичным"
new_user_prefill:
hello: "Всем привет, я #%{new_user_tag}."
i_like: "Мне интересны %{tags}. "
@@ -1131,17 +1189,17 @@ ru:
post_a_message_to: "Опубликовать сообщение для %{aspect}"
posting: "Отправка..."
preview: "Предпросмотр"
- publishing_to: "публикация в:"
+ publishing_to: "Публикация в:  "
remove_location: "Удалить местонахождение"
share: "Поделиться"
- share_with: "поделиться с"
+ share_with: "Поделиться с"
upload_photos: "Загрузить фотографии"
whats_on_your_mind: "О чём вы думаете?"
reshare:
reshare: "Поделиться"
stream_element:
connect_to_comment: "Подключитесь к этому пользователю, чтобы комментировать его записи"
- currently_unavailable: "комментирование недоступно"
+ currently_unavailable: "В данный момент комментарии недоступны"
dislike: "Не нравится"
hide_and_mute: "Скрыть и отключить уведомления"
ignore_user: "Блокировать пользователя %{name}"
@@ -1161,6 +1219,21 @@ ru:
failed: "Человечность не подтверждена"
user: "Секретное изображение и код не совпадают"
placeholder: "Введите содержимое изображения"
+ statistics:
+ active_users_halfyear: "Активность пользователей за полгода"
+ active_users_monthly: "Активность пользователей ежемесячно"
+ closed: "Закрыто"
+ disabled: "Недоступно"
+ enabled: "Доступно"
+ local_comments: "Местные комментарии"
+ local_posts: "Местные записи"
+ name: "Имя"
+ network: "Сеть"
+ open: "Открыто"
+ registrations: "Регистрации"
+ services: "Службы"
+ total_users: "Всего пользователей"
+ version: "Версия"
status_messages:
create:
success: "Успешно упомянут: %{names}"
@@ -1170,14 +1243,11 @@ ru:
no_message_to_display: "Новых сообщений нет."
new:
mentioning: "Упоминание: %{person}"
- too_long:
- few: "сократите, пожалуйста, ваше сообщение до %{count} символов"
- many: "сократите, пожалуйста, ваше сообщение до %{count} символов"
- one: "сократите, пожалуйста, ваше сообщение до %{count} символа"
- other: "сократите, пожалуйста, ваше сообщение до %{count} символов"
- zero: "сократите, пожалуйста, ваше сообщение до %{count} символов"
+ too_long: "Будьте добры, сократите ваше сообщение до %{count} символов. На данный момент сообщение составляет %{current_length} символов"
stream_helper:
hide_comments: "Скрыть все комментарии"
+ no_more_posts: "Вы достигли конца потока."
+ no_posts_yet: "Ещё нет ни одной записи."
show_comments:
few: "Показать еще %{count} комментария"
many: "Показать еще %{count} комментариев"
@@ -1214,8 +1284,7 @@ ru:
contacts_title: "Последние публиковавшие"
title: "Публичная активность"
tags:
- contacts_title: "Интересуются этими метками"
- tag_prefill_text: "По поводу метки %{tag_name}... "
+ contacts_title: "Интересуются этой меткой"
title: "Записи, отмеченные: %{tags}"
tag_followings:
create:
@@ -1226,20 +1295,18 @@ ru:
failure: "Не вышло перестать следить за меткой #%{name}. Возможно, вы уже отписались от нее?"
success: "Увы! Вы больше не следите за меткой #%{name}."
tags:
+ name_too_long: "Будьте добры, уменьшите размер метки до %{count} символов. Сейчас размер составляет %{current_length} символов."
show:
follow: "Следить за #%{tag}"
- followed_by_people:
- few: "Отслеживают: %{count}"
- many: "Отслеживают: %{count}"
- one: "Отслеживают: %{count}"
- other: "Отслеживают: %{count}"
- zero: "Никто не отслеживает"
following: "Вы следите за меткой #%{tag}"
- nobody_talking: "Никто пока не говорил о %{tag}."
none: "Пустая метка не существует!"
- people_tagged_with: "Люди с меткой %{tag}"
- posts_tagged_with: "Записи с меткой #%{tag}"
stop_following: "Не следить за #%{tag}"
+ tagged_people:
+ few: "%{count} человека с меткой %{tag}"
+ many: "%{count} человек с меткой %{tag}"
+ one: "%{count} человек с меткой %{tag}"
+ other: "%{count} человек с меткой %{tag}"
+ zero: "Нет ни одного человека с меткой %{tag}"
terms_and_conditions: "Условия оказания услуг"
undo: "Отменить?"
username: "Имя пользователя"
@@ -1265,27 +1332,34 @@ ru:
if_you_want_this: "Если вы действительно хотите это сделать, введите ваш пароль и нажмите 'Закрыть аккаунт'."
lock_username: "Это зарезервирует ваше имя пользователя на случай, если вы захотите снова зарегистрироваться."
locked_out: "Будет произведён выход, и вы будете отключены от вашей учетной записи."
- make_diaspora_better: "Мы хотели бы, чтобы вы помогли нам сделать Диаспору лучше вместо того, чтобы просто уйти отсюда. Если вы действительно решили уйти, мы хотим, чтобы вы знали, что случится дальше."
+ make_diaspora_better: "Мы хотели бы, чтобы вы помогли нам сделать диаспору* лучше вместо того, чтобы просто уйти отсюда. Если вы действительно решили уйти, мы хотим, чтобы вы знали, что случится дальше."
mr_wiggles: "Мистер Виглз будет опечален вашим уходом"
no_turning_back: "На данный момент обратного пути нет."
- what_we_delete: "Мы удалим все ваши записи и данные профиля так быстро, как только сможем. Ваши комментарии будут по-прежнему доступны, но они не будут привязаны к вашему идентификатору в Диаспоре."
+ what_we_delete: "Мы удалим все ваши записи и данные профиля так быстро, как только сможем. Ваши комментарии будут по-прежнему доступны, но они не будут привязаны к вашему идентификатору в диаспоре*."
close_account_text: "Закрыть аккаунт"
comment_on_post: "кто-то прокомментировал вашу запись"
current_password: "Текущий пароль"
current_password_expl: "используемый для входа..."
+ download_export: "Скачать данные из моего профиля"
+ download_export_photos: "Загрузить мои фотографии"
download_photos: "Скачать мои фотографии"
- download_xml: "Скачать мою информацию в xml"
edit_account: "Изменить аккаунт"
email_awaiting_confirmation: "Мы послали ссылку для активации на %{unconfirmed_email}. Пока вы не пройдете по ней и не активируете новый адрес, мы будем использовать ваш прежний ящик %{email}."
export_data: "Экспорт информации"
+ export_in_progress: "В настоящее время мы обрабатываем ваши данные. Повторите попытку через несколько минут."
+ export_photos_in_progress: "В данный момент мы обрабатываем ваши фотографии. Будьте добры, проверьте снова через несколько минут."
following: "Настройки подписок"
getting_started: "Новые пользовательские настройки"
+ last_exported_at: "(Последнее обновление было %{timestamp})"
liked: "кому-то понравилась ваша запись"
mentioned: "вы были упомянуты в записи"
new_password: "Новый пароль"
- photo_export_unavailable: "Экспорт фотографий сейчас недоступен"
private_message: "вы получили личное сообщение"
receive_email_notifications: "Получать уведомление по электронной почте, если:"
+ request_export: "Запросить данные из моего профиля"
+ request_export_photos: "Запросить мои фотографии"
+ request_export_photos_update: "Обновить мои фотографии"
+ request_export_update: "Обновить данные из моего профиля"
reshared: "кто-то поделился вашей записью"
show_community_spotlight: "Показывать рекомендуемых пользователей в потоке?"
show_getting_started: "Показать подсказки для новичков"
@@ -1296,18 +1370,20 @@ ru:
your_handle: "Ваш идентификатор в Диаспоре"
getting_started:
awesome_take_me_to_diaspora: "Чудесно! Пустите меня в Диаспору*"
- community_welcome: "Сообщество Диаспоры радо приветствовать вас!"
+ community_welcome: "Сообщество диаспоры* радо приветствовать вас!"
connect_to_facebook: "Мы можем немного ускорить процесс через %{link} на Диаспору. Это действие подгрузит ваше имя и фотографию, а также добавит кросспостинг."
connect_to_facebook_link: "Подключаем ваш Facebook аккаунт"
- hashtag_explanation: "Метки позволяют вам обсуждать и следить за интересующими вас темами. Это также отличный способ поиска единомышленников в Диаспоре."
- hashtag_suggestions: "Попробуйте следующие метки, например #искусство, #кино, #gif и т. п."
+ hashtag_explanation: "Метки позволяют вам обсуждать и следить за интересующими вас темами. Это также отличный способ поиска единомышленников в диаспоре*."
+ hashtag_suggestions: "Попробуйте следующие метки, например #искусство, #art, #кино, #movies, #gif и т. п."
saved: "Сохранено!"
well_hello_there: "Приветствуем вас!"
what_are_you_in_to: "Чем вы интересуетесь?"
who_are_you: "Кто вы?"
privacy_settings:
ignored_users: "Заблокированные пользователи"
+ no_user_ignored_message: "На данный момент вы никого не игнорируете"
stop_ignoring: "Отменить блокирование"
+ strip_exif: "Полоса метаданных, таких как местоположение, автор, и модель камеры от загруженных изображений (рекомендуется)"
title: "Настройки приватности"
public:
does_not_exist: "Пользователя %{username} не существует!"
diff --git a/config/locales/diaspora/sc.yml b/config/locales/diaspora/sc.yml
new file mode 100644
index 000000000..896beb979
--- /dev/null
+++ b/config/locales/diaspora/sc.yml
@@ -0,0 +1,110 @@
+# Copyright (c) 2010-2013, Diaspora Inc. This file is
+# licensed under the Affero General Public License version 3 or later. See
+# the COPYRIGHT file.
+
+
+
+sc:
+ _applications: "Aplicos"
+ _comments: "Cummentos"
+ _contacts: "Cuntatos"
+ _home: "Printzipale"
+ _photos: "Fotos"
+ _services: "Servìtzios"
+ account: "Contu"
+ activerecord:
+ errors:
+ models:
+ contact:
+ attributes:
+ person_id:
+ taken: "depet èssere ùnicu intre sos cuntatos de custu impitadore"
+ person:
+ attributes:
+ diaspora_handle:
+ taken: "est giai istadu pigadu."
+ request:
+ attributes:
+ from_id:
+ taken: "est una còpia de un'àtera rechesta giai esistente."
+ reshare:
+ attributes:
+ root_guid:
+ taken: "Bellu a beru, eh?  Ma as giai cumpartzidu cussu post!"
+ user:
+ attributes:
+ email:
+ taken: "est giai istada impreada."
+ person:
+ invalid: "no est bàlidu."
+ username:
+ invalid: "no est bàlidu. Est possìbile impreare petzi lìteras, nùmeros, e underscores."
+ taken: "est giai istadu pigadu."
+ ago: "%{time} fàghet"
+ all_aspects: "Totu sos aspetos"
+ application:
+ helper:
+ unknown_person: "Pessone disconnota"
+ video_title:
+ unknown: "Tìtulu vìdeo disconnotu"
+ are_you_sure: "Seguru ses?"
+ are_you_sure_delete_account: "Seguru ses de bòlere serrare su contu tuo? Custu non podet èssere annuddadu!"
+ aspects:
+ contacts_not_visible: "Sos cuntatos de custa cara non s'ant a pòdere bìdere intre issos."
+ contacts_visible: "Sos cuntatos de custa cara s'ant a pòdere bìdere intre issos."
+ edit:
+ aspect_list_is_not_visible: "Sos cuntatos de custa cara non si podent bìdere intre issos."
+ aspect_list_is_visible: "Sos cuntatos de custa cara si podent bìdere intre issos."
+ confirm_remove_aspect: "Seguru ses de bòlere burrare custa cara?"
+ make_aspect_list_visible: "Boles chi sos cuntatos de custa cara s'ant a pòdere bìdere intre issos?"
+ remove_aspect: "Burra custa cara"
+ rename: "Càmbia nùmene"
+ update: "Agiorna"
+ updating: "Agiornande"
+ one: "1 cara"
+ other: "%{count} caras"
+ zero: "Peruna cara"
+ back: "In dae segus"
+ cancel: "Annudda"
+ delete: "Burra"
+ email: "P. eletr. (e-mail)"
+ error_messages:
+ helper:
+ correct_the_following_errors_and_try_again: "Currege custos errore e torra a proare."
+ invalid_fields: "Campos non bàlidos"
+ fill_me_out: "Iscrie inoghe"
+ find_people: "Agata pessonas o #etichetas"
+ hide: "Cua"
+ limited: "Limitadu"
+ more: "Àteru"
+ next: "Imbeniente"
+ no_results: "Perunu resurtadu agatadu"
+ notifier:
+ export_photos_email:
+ body: |-
+ Salude, %{name},
+
+ Sas fotos tuas sunt istadas elaboradas e sunt prontas pro èssere iscarrigadas sighinde [custu ligòngiu](%{url}).
+
+ Saludos,
+ Su robot de sa posta eletrònica de diaspora*!
+ nsfw: "NSFW (no est adatu pro unu logu de traballu)"
+ ok: "OK"
+ or: "o"
+ password: "Crae (password)"
+ password_confirmation: "Cunfirma sa crae (password)"
+ previous: "Antepostu"
+ privacy: "Privadesa"
+ privacy_policy: "Normativa pro sa privadesa"
+ profile: "Perfilu"
+ public: "Pùblicu"
+ search: "Chirca"
+ settings: "Impostaduras"
+ terms_and_conditions: "Tèrmines e cunditziones"
+ undo: "Annuddare?"
+ username: "Nùmene impitadore"
+ users:
+ edit:
+ download_export_photos: "Iscàrriga sas fotos meas"
+ export_photos_in_progress: "Semus elaborande sas fotos tuas. Pro piaghere torra a compidare intre pagu."
+ welcome: "Benènnidu!" \ No newline at end of file
diff --git a/config/locales/diaspora/si.yml b/config/locales/diaspora/si.yml
index d6fc6e6e5..b206ad681 100644
--- a/config/locales/diaspora/si.yml
+++ b/config/locales/diaspora/si.yml
@@ -38,8 +38,6 @@ si:
unknown: "නාඳුනන වීඩියෝ මාතෘකාවකි"
are_you_sure: "ඔබට විශ්වාසද ?"
aspects:
- aspect_contacts:
- done_editing: "සංස්කරණය හරි"
aspect_listings:
add_an_aspect: "+ අංගයන් එක් කරන්න"
deselect_all: "සියල්ල නොසලකා හරින්න"
@@ -52,15 +50,10 @@ si:
failure: "%{name} හිස්ව නොපවතී සහ ඉවත් කිරීමට නොහැක."
success: "%{name} සාර්ථකව ඉවත් කරන ලදී."
edit:
- done: "හරි"
remove_aspect: "මෙම අංගය මකාදමන්න"
rename: "නැවත නම් කරන්න"
update: "යාවත්කාල කරන්න"
updating: "යාවත්කාල වෙමින් පවතී"
- few: "අංගයන් %{count}"
- helper:
- aspect_not_empty: "අංගය හිස්ව නැත"
- remove: "ඉවත්කරන්න"
index:
diaspora_id:
content_1: "මෙය ඔබගේ ඩයස්පෝරා ID එකයි:"
@@ -79,9 +72,6 @@ si:
content: "ඔබට පහත සේවාවන් Diaspora සමග සම්බන්ධ කරන්න පුළුවන්:"
heading: "සේවාවන් සම්බන්ධ කරන්න"
welcome_to_diaspora: "ඩයස්පොරා වෙතින් ආයුබොවන්, %{name}!"
- many: "අංගයන් %{count}"
- move_contact:
- success: "පුද්ගලයා නව අංගයට මාරු කරන ලදී"
new:
create: "සාදන්න"
name: "නම (ඔබට පමණක් පෙනෙන)"
@@ -91,12 +81,6 @@ si:
family: "පවුල"
friends: "යහළුවන්"
work: "රැකියාව"
- selected_contacts:
- manage_your_aspects: "ඔබගේ අංගයන් කලමනාකරණය කරන්න"
- view_all_contacts: "සියලු පෙන්වන්න"
- show:
- edit_aspect: "අංගය සංස්කරණය කරන්න"
- two: "අංගයන් %{count}"
update:
failure: "ඔබගේ අංගය, %{name}, හි නම save කිරීමට දිග වැඩියි."
success: "ඔබගේ අංගය, %{name}, සාර්ථකව නැවත සකසන ලදී."
@@ -118,8 +102,6 @@ si:
create:
fail: "පණිවිඩයක් වලංගු නැත"
sent: "පණිවිඩය යැව්වා"
- destroy:
- success: "සංවාදය සාර්ථකව ඉවත් කරන ලදී"
index:
no_conversation_selected: "කිසිම සංවාදයක් තෝරාගෙන නැහැ"
no_messages: "පණිවිඩ නැත"
@@ -190,11 +172,9 @@ si:
or: "හෝ"
password: "මුර පදය"
people:
- few: "පුද්ගලයින් %{count}"
index:
no_results: "හලෝ! ඔයාට මොකක් හරි සෙවීමට අවශ්‍යද ?"
results_for: "සෙවුම් ප්‍රතිඵල සඳහා"
- many: "පුද්ගලයින් %{count}"
one: "එක පුද්ගලයෙක්"
other: "පුද්ගලයින් %{count}"
person:
@@ -203,7 +183,6 @@ si:
born: "උපන්දිනය"
gender: "ලිංගභේදය"
location: "ස්ථානය"
- two: "පුද්ගලයින් %{count}"
zero: "පුද්ගලයින් නැත"
photos:
destroy:
@@ -306,7 +285,6 @@ si:
dont_go: "හලෝ, කරුණාකර යන්න එපා!"
current_password: "දැනට පවතින මුරපදය"
download_photos: "මගේ පින්තූර භාගත කරන්න"
- download_xml: "මගේ xml එක භාගත කරන්න"
getting_started: "නව පරිශීලකගේ අභිරුචියන්"
new_password: "නව මුරපදය"
your_email: "ඔබගේ email"
diff --git a/config/locales/diaspora/sk.yml b/config/locales/diaspora/sk.yml
index f61d11553..cec2fd6e9 100644
--- a/config/locales/diaspora/sk.yml
+++ b/config/locales/diaspora/sk.yml
@@ -19,7 +19,7 @@ sk:
contact:
attributes:
person_id:
- taken: "musí byť jedinečný medzi kontaktmi tohto používateľa."
+ taken: "musí byť jedinečný v kontaktoch tohto používateľa."
person:
attributes:
diaspora_handle:
@@ -31,7 +31,7 @@ sk:
reshare:
attributes:
root_guid:
- taken: "To je dobré, čo? O tento príspevok si sa už raz znova podelil(a)!"
+ taken: "To je dobré, čo? Tento príspevok si už raz niekomu znova ukázal(a)!"
user:
attributes:
email:
@@ -107,11 +107,11 @@ sk:
all_aspects: "Všetky kategórie"
application:
helper:
- unknown_person: "neznámy človek"
+ unknown_person: "Neznámy človek"
video_title:
unknown: "Neznámy názov videa"
are_you_sure: "Si si istý(á)?"
- are_you_sure_delete_account: "Určite chceš zrušiť svoj účet? Táto operácia sa nedá vrátiť späť!"
+ are_you_sure_delete_account: "Určite chceš zrušiť svoj účet? Potom sa to už nedá vrátiť späť!"
aspect_memberships:
destroy:
failure: "Nepodarilo sa odstrániť kontakt z kategórie"
@@ -121,8 +121,6 @@ sk:
add_to_aspect:
failure: "Nepodarilo sa pridať kontakt do kategórie."
success: "Kontakt bol úspešne pridaný do kategórie."
- aspect_contacts:
- done_editing: "úpravy dokončené"
aspect_listings:
add_an_aspect: "+ Pridať kategóriu"
deselect_all: "Odznačiť všetky"
@@ -130,7 +128,7 @@ sk:
select_all: "Označiť všetky"
aspect_stream:
make_something: "Urob niečo"
- stay_updated: "Buď v obraze"
+ stay_updated: "Zostaň v obraze"
stay_updated_explanation: "Na svojej hlavnej nástenke nájdeš všetky svoje kontakty, značky, ktoré sleduješ, a príspevky od niektorých tvorivých členov komunity."
contacts_not_visible: "Kontakty v tejto kategórii sa nebudú môcť navzájom vidieť."
contacts_visible: "Kontakty v tejto kategórii sa budú môcť navzájom vidieť."
@@ -141,23 +139,15 @@ sk:
failure: "Kategória %{name} nie je prázdna, a tak sa nedá odstrániť."
success: "Použ. %{name} bol úspešne odstránený."
edit:
- add_existing: "Pridať existujúci kontakt"
aspect_list_is_not_visible: "Ľudia v tejto kategórii sa nevida"
aspect_list_is_visible: "Kontakty v tejto kategórii sú navzájom viditeľné"
confirm_remove_aspect: "Si si istý(á), že chceš zmazať túto kategóriu?"
- done: "Hotovo"
- make_aspect_list_visible: "povoliť, aby sa kontakty v tejto kategórii navzájom videli?"
- manage: "Spravovať"
+ make_aspect_list_visible: "Povoliť, aby sa kontakty v tejto kategórii navzájom videli?"
remove_aspect: "Zmazať túto kategóriu"
- rename: "premenovať"
+ rename: "Premenovať"
set_visibility: "Nastaviť viditeľnosť"
- update: "aktualizovať"
- updating: "aktualizuje sa"
- few: "%{count} kategórie"
- helper:
- are_you_sure: "Si si istý (-á), že chceš zmazať túto kategóriu?"
- aspect_not_empty: "Kategória nie je prázdna"
- remove: "odstrániť"
+ update: "Aktualizovať"
+ updating: "Aktualizuje sa"
index:
diaspora_id:
content_1: "Tvoje ID na diasporu* je:"
@@ -198,16 +188,11 @@ sk:
heading: "Pripojiť sa k službám"
unfollow_tag: "Prestať sledovať #%{tag}"
welcome_to_diaspora: "Vitaj na diaspore*, %{name}!"
- many: "%{count} kategórií"
- move_contact:
- error: "Chyba pri presúvaní kontaktu: %{inspect}"
- failure: "nefungoval(a) %{inspect}"
- success: "Kontakt bol presunutý do novej kategórie"
new:
create: "Vytvoriť"
name: "Meno (uvidíš ho iba ty)"
no_contacts_message:
- community_spotlight: "v centre pozornosti komunity"
+ community_spotlight: "Aktuality z komunity"
or_spotlight: "Alebo si do kontaktov môžeš pridať používateľov %{link}"
try_adding_some_more_contacts: "Môžeš nájsť alebo pozvať viac ľudí."
you_should_add_some_more_contacts: "Mal(a) by si ešte pridať pár kontaktov!"
@@ -220,18 +205,10 @@ sk:
family: "Rodina"
friends: "Kamaráti"
work: "Práca"
- selected_contacts:
- manage_your_aspects: "Uprav si kategórie."
- no_contacts: "Nemáš tu ešte žiadne kontakty."
- view_all_community_spotlight: "Zobraziť všetky aktuality z komunity"
- view_all_contacts: "Zobraziť všetky kontakty"
- show:
- edit_aspect: "upraviť kategóriu"
- two: "%{count} kategórie"
update:
failure: "Tvoja kategória %{name} má príliš dlhý názov."
success: "Úspešne si upravil(a) kategóriu %{name}."
- zero: "žiadne kategórie"
+ zero: "Žiadne kategórie"
back: "Späť"
blocks:
create:
@@ -247,36 +224,27 @@ sk:
post_success: "Odoslané! Zatvára sa!"
cancel: "Zrušiť"
comments:
- few: "%{count} komentárov"
- many: "%{count} komentárov"
new_comment:
comment: "Okomentovať"
commenting: "Posiela sa komentár..."
one: "1 komentár"
other: "%{count} komentárov"
- two: "%{count} komentáre"
- zero: "žiadne komentáre"
+ zero: "Žiadne komentáre"
contacts:
create:
failure: "Nepodarilo sa vytvoriť kontakt"
- few: "%{count} kontakty"
index:
add_a_new_aspect: "Pridať novú kategóriu"
add_to_aspect: "Pridať kontakty do kategórie %{name}"
- add_to_aspect_link: "pridať kontakt do %{name}"
all_contacts: "Všetky kontakty"
community_spotlight: "Aktuality z komunity"
- many_people_are_you_sure: "Určite chceš začať súkromný rozhovor s viac ako %{suggested_limit} ľuďmi? Poslať príspevok do tejto kategórie môže byť lepší spôsob, ako sa s nimi spojiť."
my_contacts: "Moje kontakty"
no_contacts: "Zdá sa, že potrebuješ pridať pár kontaktov!"
no_contacts_message: "Pozri si %{community_spotlight}"
- no_contacts_message_with_aspect: "Pozri si %{community_spotlight} alebo %{add_to_aspect_link}"
only_sharing_with_me: "Ľudia, ktorí majú v kontaktoch iba mňa"
- remove_person_from_aspect: "Odstrániť použ. %{person_name} z kategórie %{aspect_name}"
start_a_conversation: "Začať rozhovor"
title: "Kontakty"
your_contacts: "Tvoje kontakty"
- many: "%{count} kontaktov"
one: "1 kontakt"
other: "%{count} kontaktov"
sharing:
@@ -284,8 +252,7 @@ sk:
spotlight:
community_spotlight: "Aktuality z komunity"
suggest_member: "Navrhnúť člena"
- two: "%{count} kontakty"
- zero: "kontaktov"
+ zero: "Žiadne kontakty"
conversations:
conversation:
participants: "Účastníci"
@@ -293,8 +260,6 @@ sk:
fail: "Neplatná správa"
no_contact: "Pozor, najprv treba pridať kontakt!"
sent: "Správa odoslaná"
- destroy:
- success: "Rozhovor bol úspešne odstránený"
helper:
new_messages:
few: "%{count} nové správy"
@@ -309,17 +274,17 @@ sk:
inbox: "Poštová schránka"
new_conversation: "Nový rozhovor"
no_conversation_selected: "Nevybral(a) si žiaden rozhovor"
- no_messages: "žiadne správy"
+ no_messages: "Žiadne správy"
new:
abandon_changes: "Zrušiť zmeny?"
send: "Poslať"
sending: "Posiela sa..."
- subject: "predmet"
- to: "príjemca"
+ subject: "Vec"
+ to: "Adresát"
new_conversation:
fail: "Neplatná správa"
show:
- delete: "odstrániť a zablokovať rozhovor"
+ delete: "Odstrániť rozhovor"
reply: "Odpovedať"
replying: "Posiela sa odpoveď..."
date:
@@ -354,7 +319,7 @@ sk:
aspects:
contacts_know_aspect_a: "Nie. Za žiadnych okolností nevidia názov kategórie."
contacts_know_aspect_q: "Vedia ľudia v mojich kontaktoch, do akej kategórie som ich dal(a)?"
- contacts_visible_q: "Čo znamená „urobiť kontakty v tejto kategórii viditeľné pre ostatných“"
+ contacts_visible_q: "Čo znamená „umožniť, aby sa kontakty v tejto kategórii navzájom videli“?"
remove_notification_a: "Nie."
remove_notification_q: "Ak niekoho odstránim z kategórie alebo zo všetkých svojich kategórií, dostane o tom oznam?"
rename_aspect_q: "Môžem premenovať kategóriu?"
@@ -469,16 +434,16 @@ sk:
layouts:
application:
back_to_top: "Späť nahor"
- powered_by: "PREVÁDZKUJE Diaspora*"
- public_feed: "Verejný kanál diaspory* pre použ. %{name}"
+ powered_by: "Prevádzkuje Diaspora*"
+ public_feed: "%{name} &ndash; verejný kanál diaspory*"
source_package: "stiahnuť balík so zdrojovým kódom"
- toggle: "prepnúť mobilnú verziu"
+ toggle: "Prepnúť (na) mobilnú verziu"
whats_new: "Čo je nové?"
your_aspects: "Tvoje kategórie"
header:
- admin: "správca"
+ admin: "Správca"
blog: "Blog"
- code: "kód"
+ code: "Kód"
help: "Pomoc"
login: "Prihlásiť sa"
logout: "Odhlásiť sa"
@@ -497,7 +462,7 @@ sk:
few: "%{count} ľuďom sa to páči"
one: "%{count} človeku sa to páči"
other: "%{count} ľuďom sa to páči"
- zero: "nikomu sa to nepáči"
+ zero: "Nikomu sa to nepáči"
people_like_this_comment:
few: "%{count} ľuďom sa to páči"
one: "%{count} človeku sa to páči"
@@ -505,14 +470,14 @@ sk:
zero: "nikomu sa to nepáči"
limited: "Vyhradený"
more: "Viac"
- next: "ďalej"
+ next: "Ďalej"
no_results: "Žiadne výsledky sa nenašli"
notifications:
also_commented:
- few: "%{actors} tiež okomentovali príspevok %{post_link} od použ. %{post_author}."
- one: "%{actors} tiež okomentoval(a) príspevok %{post_link} od použ. %{post_author}."
- other: "%{actors} tiež okomentovali príspevok %{post_link} od použ. %{post_author}."
- zero: "%{actors} tiež okomentovalo príspevok %{post_link} od použ. %{post_author}."
+ few: "%{actors} okomentovali aj príspevok %{post_link} od použ. %{post_author}."
+ one: "%{actors} okomentoval(a) aj príspevok %{post_link} od použ. %{post_author}."
+ other: "%{actors} okomentovali aj príspevok %{post_link} od použ. %{post_author}."
+ zero: "%{actors} ľudí okomentovalo aj príspevok %{post_link} od použ. %{post_author}."
also_commented_deleted:
few: "%{actors} okomentovali tvoj vymazaný príspevok."
one: "%{actors} okomentoval(a) tvoj vymazaný príspevok."
@@ -590,7 +555,7 @@ sk:
notifier:
a_post_you_shared: "príspevok."
accept_invite: "Odsúhlas svoju pozvánku na Diasporu*!"
- click_here: "klikni sem"
+ click_here: "Klikni sem"
comment_on_post:
reply: "Zobraziť príspevok použ. %{name} alebo naň odpovedať >"
confirm_email:
@@ -647,7 +612,6 @@ sk:
add_contact_from_tag: "pridať kontakt zo značky"
aspect_list:
edit_membership: "upraviť členstvo v kategórii"
- few: "%{count} ľudia"
helper:
is_sharing: "%{name} sa s Tebou o niečo delí"
results_for: "výsledky pre %{params}"
@@ -660,7 +624,6 @@ sk:
search_handle: "Na to, aby ste sa uistili, že nájdete svojich kamarátov, použite ich ID na diasporu*"
searching: "hľadá sa, prosím buď trpezlivý (-á)."
send_invite: "Stále nič? Pošlite pozvánku."
- many: "%{count} ľudí"
one: "1 človek"
other: "%{count} ľudí"
person:
@@ -697,7 +660,6 @@ sk:
add_some: "pridať nejaké"
edit: "upraviť"
you_have_no_tags: "nemáš žiadne značky!"
- two: "%{count} ľudia"
webfinger:
fail: "Prepáč, %{handle} sa nedá nájsť."
zero: "žiadni ľudia"
@@ -750,18 +712,18 @@ sk:
two: "Dve fotky, ktoré nahral(a) %{author}"
zero: "Žiadne fotky, ktoré nahral(a) %{author}"
reshare_by: "Znova ukázal(a) príspevok %{author}"
- previous: "predchádzajúce"
+ previous: "Dozadu"
privacy: "Ochrana súkromia"
- privacy_policy: "Ochrana osobných údajov"
+ privacy_policy: "Ochrana súkromia"
profile: "Profil"
profiles:
edit:
- allow_search: "Povoliť ostatným, aby ťa našli na diaspore*"
+ allow_search: "Umožniť ostatným ľuďom, aby ťa našli na diaspore*"
edit_profile: "Upraviť profil"
first_name: "Krstné meno"
last_name: "Priezvisko"
- nsfw_check: "Označiť všetko, čo som uverejnil(a) ako NSFW"
- nsfw_explanation2: "Ak si nechcete zvoliť túto možnosť, pridajte, prosím, značku #nsfw vždy, keď uverejníte takýto materiál."
+ nsfw_check: "Označiť všetko, čo ukazujem ako NSFW"
+ nsfw_explanation2: "Ak si nechcete zvoliť túto možnosť, pridajte, prosím, značku #nsfw vždy, keď niekomu ukážete takýto materiál."
update_profile: "Aktualizovať profil"
your_bio: "Niečo o tebe"
your_birthday: "Dátum narodenia"
@@ -781,7 +743,7 @@ sk:
few: "%{count} reakcie"
one: "1 reakcia"
other: "%{count} reakcií"
- zero: "0 reakcií"
+ zero: "Žiadne reakcie"
registrations:
closed: "Registrácie sú na tomto serveri diaspory* pozastavené."
create:
@@ -795,15 +757,12 @@ sk:
update: "Aktualizovať"
invalid_invite: "Odkaz na pozvánku, ktorý si zadal(a), už nie je platný!"
new:
- continue: "Pokračovať"
create_my_account: "Založ si účet!"
- diaspora: "<3 diaspora*"
email: "E-MAIL"
enter_email: "Zadaj e-mail"
enter_password: "Zadaj heslo (minimálne šesť znakov)"
enter_password_again: "Zadaj rovnaké heslo ako predtým"
enter_username: "Zadaj používateľské meno (iba písmená, číslice a podčiarkovníky)"
- hey_make: "HEJ,<br/>UROB<br/>NIEČO."
join_the_movement: "Pripoj sa k hnutiu!"
password: "HESLO"
password_confirmation: "POTVRDENIE HESLA"
@@ -813,7 +772,7 @@ sk:
username: "POUŽÍVATEĽ"
report:
comment_label: "<b>Komentár:</b> <br>%{data}"
- confirm_deletion: "Určite chceš vymazať položku?"
+ confirm_deletion: "Určite chceš vymazať túto položku?"
delete_link: "Vymazať položku"
post_label: "<b>Príspevok:</b> %{title}"
reason_label: "Dôvod: %{text}"
@@ -973,7 +932,7 @@ sk:
via_mobile: "mobilom"
viewable_to_anyone: "Tento príspevok si môže pozrieť každý na webe"
simple_captcha:
- label: "Zadajte kód v poli:"
+ label: "Do poľa zadajte kód:"
message:
default: "Tajný kód nie je rovnaký ako ten na obrázku"
user: "Tajný obrázok a kód sa odlišujú."
@@ -986,11 +945,7 @@ sk:
no_message_to_display: "Žiadna správa na zobrazenie."
new:
mentioning: "Spomína sa: %{person}"
- too_long:
- few: "prosím, skráť svoje správy v statuse na menej ako %{count} znakov"
- one: "prosím, skráť svoje správy v statusoch na menej ako %{count} znak"
- other: "prosím, skráť svoje správy v statuse na menej ako %{count} znakov"
- zero: "prosím, skráť svoje správy v statusoch na menej ako %{count} znakov"
+ too_long: "{\"few\"=>\"prosím, skráť svoje správy v statuse na menej ako %{count} znakov\", \"one\"=>\"prosím, skráť svoje správy v statusoch na menej ako %{count} znak\", \"other\"=>\"prosím, skráť svoje správy v statuse na menej ako %{count} znakov\", \"zero\"=>\"prosím, skráť svoje správy v statusoch na menej ako %{count} znakov\"}"
stream_helper:
hide_comments: "schovať komentáre"
show_comments:
@@ -1029,7 +984,6 @@ sk:
title: "Verejná aktivita"
tags:
contacts_title: "Ľudia, ktorí hľadajú tieto značky"
- tag_prefill_text: "%{tag_name} je... "
title: "Príspevky so značkami: %{tags}"
tag_followings:
create:
@@ -1042,16 +996,8 @@ sk:
tags:
show:
follow: "Sledovať #%{tag}"
- followed_by_people:
- few: "sledujú %{count} ľudia"
- one: "sleduje %{count} človek"
- other: "sleduje %{count} ľudí"
- zero: "nikto nesledujue"
following: "Sleduješ #%{tag}"
- nobody_talking: "Nikto ešte nehovorí o téme %{tag}."
none: "Prázdna značka neexistuje!"
- people_tagged_with: "Ľudia označení %{tag}"
- posts_tagged_with: "Príspevky označené značkou #%{tag}"
stop_following: "Prestať sledovať #%{tag}"
terms_and_conditions: "Podmienky"
undo: "Vrátiť zmeny?"
@@ -1087,7 +1033,6 @@ sk:
current_password: "Súčasné heslo"
current_password_expl: "s ktorým sa prihlasuješ."
download_photos: "Stiahnuť si fotky"
- download_xml: "Stiahnuť si xml"
edit_account: "Upraviť účet"
email_awaiting_confirmation: "Poslali sme ti odkaz na aktiváciu %{unconfirmed_email}. Kým neklikneš na tento odkaz a neaktivuješ si novú adresu, budeme stále používať tvoju pôvodnú adresu %{email}."
export_data: "Exportovať dáta"
@@ -1096,7 +1041,6 @@ sk:
liked: "...sa niekomu zapáči tvoj príspevok?"
mentioned: "...ťa niekto spomenie v príspevku?"
new_password: "Nové heslo"
- photo_export_unavailable: "Momentálne sa fotky nedajú exportovať"
private_message: "...dostaneš súkromnú správu?"
receive_email_notifications: "Poslať oznam e-mailom, ak"
reshared: "...sa niekto znova podelí o tvoj príspevok?"
diff --git a/config/locales/diaspora/sl.yml b/config/locales/diaspora/sl.yml
index e646fb828..7dbeb4578 100644
--- a/config/locales/diaspora/sl.yml
+++ b/config/locales/diaspora/sl.yml
@@ -8,6 +8,7 @@ sl:
_applications: "Aplikacije"
_comments: "Komentarji"
_contacts: "Stiki"
+ _help: "Pomoč"
_home: "Domov"
_photos: "slike"
_services: "Storitve"
@@ -45,6 +46,7 @@ sl:
correlations: "Korelacije"
pages: "Strani"
pod_stats: "Statistika Poda"
+ sidekiq_monitor: "Sidekiq zaslon"
user_search: "Iskanje uporabnikov"
weekly_user_stats: "Tedenska statistika uporabnikov"
correlations:
@@ -87,13 +89,15 @@ sl:
user_search:
add_invites: "dodaj vabila"
email_to: "Povabila na e-poštni naslov"
+ under_13: "Prikaži uporabnike mlajše od 13 let (COPPA)"
users:
few: "%{count} najdeni uporabniki"
one: "%{count} najden uporabnik"
other: "%{count} najdenih uporabnikov"
two: "%{count} najdena uporabnika"
zero: "%{count} najdenih uporabnikov"
- you_currently: "trenutno imate na razpolago še %{user_invitation} povabil %{link}"
+ you_currently:
+ other: "trenutno imate na razpolago še %{user_invitation} povabil %{link}"
weekly_user_stats:
amount_of:
few: "Število novih uporabnikov ta teden: %{count}"
@@ -120,8 +124,6 @@ sl:
add_to_aspect:
failure: "Dodajanje stika v vidik ni uspelo."
success: "Dodajanje stika v vidik je uspelo."
- aspect_contacts:
- done_editing: "zaključi urejanje"
aspect_listings:
add_an_aspect: "+ Dodaj vidik"
deselect_all: "Odstrani izbiro"
@@ -140,21 +142,14 @@ sl:
failure: "%{name} ni prazen in ga ni mogoče odstraniti."
success: "%{name} je uspešno odstranjen."
edit:
- add_existing: "Dodaj obstoječi stik"
aspect_list_is_not_visible: "seznam vidikov ni viden ostalim stikom v tem vidiku"
aspect_list_is_visible: "seznam vidikov je viden ostalim stikom v tem vidiku"
confirm_remove_aspect: "Ali ste prepričani, da bi radi izbrisali ta vidik?"
- done: "Končano"
make_aspect_list_visible: "naj bodo stiki v tem vidiku vidni med sabo?"
remove_aspect: "Izbriši ta vidik"
rename: "preimenuj"
update: "posodobi"
updating: "posodabljanje"
- few: "%{count} vidiki"
- helper:
- are_you_sure: "Ste prepričani, da želite izbrisati ta vidik?"
- aspect_not_empty: "Vidik ni prazen"
- remove: "odstrani"
index:
diaspora_id:
content_1: "Vaš Diaspora ID je:"
@@ -177,6 +172,7 @@ sl:
tag_bug: "bug"
tag_feature: "feature"
tag_question: "question"
+ tutorials_and_wiki: "%{faq}, %{tutorial} in %{wiki}: pomoč pri začetnih težavah."
introduce_yourself: "To je vaš tok. Vskočite in predstavite se."
keep_diaspora_running: "Z mesečnim prispevkom pohitrite razvoj Diaspore!"
keep_pod_running: "Pomagajte, da bo %{pod} deloval hitro in plačajte strežnikom kavico z mesečnim prispevkom!"
@@ -193,11 +189,6 @@ sl:
heading: "Povežite storitve"
unfollow_tag: "Nehaj slediti #%{tag}"
welcome_to_diaspora: "Dobrodošli v Diaspori, %{name}!"
- many: "%{count} vidikov"
- move_contact:
- error: "Prestavljanje stika neuspešno: %{inspect}"
- failure: "ni uspelo %{inspect}"
- success: "Oseba je prestavljena v nov vidik"
new:
create: "Ustvari"
name: "Ime (vidno samo vam)"
@@ -215,14 +206,6 @@ sl:
family: "Družina"
friends: "Prijatelji"
work: "Služba"
- selected_contacts:
- manage_your_aspects: "Urejanje pogledov."
- no_contacts: "Zaenkrat ste še brez stikov."
- view_all_community_spotlight: "Poglej vsa središča pozornosti skupnosti"
- view_all_contacts: "Poglej vse stike"
- show:
- edit_aspect: "uredi vidik"
- two: "%{count} vidika"
update:
failure: "Vidik %{name} ima predolgo ime, zato ga ni mogoče shraniti."
success: "Vaš vidik %{name} je bil uspešno posodobljen."
@@ -242,36 +225,27 @@ sl:
post_success: "Objavljeno! Zapiram!"
cancel: "Prekliči"
comments:
- few: "%{count} mnenja"
- many: "%{count} mnenj"
new_comment:
comment: "Napiši mnenje"
commenting: "Pisanje mnenja ..."
one: "1 mnenje"
other: "%{count} mnenj"
- two: "%{count} mnenji"
zero: "nobenega mnenja"
contacts:
create:
failure: "Ustvarjanje stika ni bilo mogoče"
- few: "%{count} stiki"
index:
add_a_new_aspect: "Dodaj nov vidik"
add_to_aspect: "Dodaj stik k %{name}"
- add_to_aspect_link: "dodaj stike k %{name}"
all_contacts: "Vsi stiki"
community_spotlight: "Središče pozornosti skupnosti"
- many_people_are_you_sure: "Ste prepričani, da želite začeti zasebni pogovor z več kot %{suggested_limit} stiki? Morda bi bilo bolje, da bi sporočilo objavili v tem vidiku."
my_contacts: "Moji stiki"
no_contacts: "Izgleda, da morate dodati kakšen stik!"
no_contacts_message: "Preveri %{community_spotlight}"
- no_contacts_message_with_aspect: "Preveri %{community_spotlight} ali %{add_to_aspect_link}"
only_sharing_with_me: "Delijo samo z mano"
- remove_person_from_aspect: "Odstrani %{person_name} iz \"%{aspect_name}\""
start_a_conversation: "Začni pogovor"
title: "Stiki"
your_contacts: "Vaši stiki"
- many: "%{count} stikov"
one: "1 stik"
other: "%{count} stikov"
sharing:
@@ -279,14 +253,14 @@ sl:
spotlight:
community_spotlight: "Središče pozornosti skupnosti"
suggest_member: "Predlagaj člana"
- two: "%{count} stika"
zero: "stiki"
conversations:
+ conversation:
+ participants: "Udeleženci"
create:
fail: "Neveljavno sporočilo"
+ no_contact: "Hej, najprej moraš dodati stike!"
sent: "Sporočilo poslano"
- destroy:
- success: "Pogovor uspešno odstranjen"
helper:
new_messages:
few: "%{count} nova sporočila"
@@ -361,6 +335,7 @@ sl:
resend: "Ponovno pošlji"
send_an_invitation: "Pošlji eno povabilo"
send_invitation: "Pošlji povabilo"
+ sending_invitation: "Pošiljanje povabila..."
to: "Za"
layouts:
application:
@@ -552,8 +527,9 @@ sl:
add_contact_from_tag: "dodaj osebo iz oznake"
aspect_list:
edit_membership: "urejanje članstva vidikov"
- few: "%{count} osebe"
helper:
+ is_not_sharing: "%{name} ne deli s teboj"
+ is_sharing: "%{name} deli s teboj"
results_for: "zadetkov za %{params}"
index:
looking_for: "Iščete morda objave z oznako %{tag_link}?"
@@ -561,7 +537,6 @@ sl:
no_results: "Hej! Za iskanje je potrebno vpisati nekaj."
results_for: "rezultati iskanja za"
searching: "iskanje poteka, bodite potrpežljivi ..."
- many: "%{count} oseb"
one: "1 oseba"
other: "%{count} oseb"
person:
@@ -576,6 +551,7 @@ sl:
gender: "spol"
in_aspects: "v vidikih"
location: "kraj"
+ photos: "Fotografije"
remove_contact: "odstrani stik"
remove_from: "Naj odstranim %{name} iz %{aspect}?"
show:
@@ -597,7 +573,6 @@ sl:
add_some: "dodaj nekaj"
edit: "uredi"
you_have_no_tags: "nimate nobene oznake!"
- two: "%{count} osebi"
webfinger:
fail: "Žal ni bilo mogoče najti %{handle}."
zero: "ni oseb"
@@ -693,15 +668,12 @@ sl:
update: "Posodobi"
invalid_invite: "Povezava na povabilo, ki ste jo uporabili ni več veljavna!"
new:
- continue: "Nadaljuj"
create_my_account: "Ustvari moj račun!"
- diaspora: "<3 Diaspora*"
email: "E-POŠTA"
enter_email: "Vpišite e-naslov"
enter_password: "Vpišite geslo (najmanj šest znakov)"
enter_password_again: "Ponovno vpišite isto geslo"
enter_username: "Izberite uporabniško ime (samo črke, številke in podčrtaji)"
- hey_make: "HEJ,<br/>NAREDI<br/>NEKAJ."
join_the_movement: "Pridružite se gibanju!"
password: "GESLO"
password_confirmation: "POTRDITEV GESLA"
@@ -828,6 +800,7 @@ sl:
all: "vsi"
all_contacts: "vsi stiki"
discard_post: "Zavrzi objavo"
+ get_location: "Pridobi svojo lokacijo"
make_public: "objavi kot javno"
new_user_prefill:
hello: "Zdravo vsem. Jaz sem #%{new_user_tag}. "
@@ -836,6 +809,7 @@ sl:
newhere: "NovTukaj"
post_a_message_to: "Objavi sporočilo v %{aspect}"
posting: "Objavljanje ..."
+ preview: "Predogled"
publishing_to: "objavljanje na: "
share: "Objavi"
share_with: "deli z"
@@ -867,12 +841,7 @@ sl:
no_message_to_display: "Ni sporočil."
new:
mentioning: "Omembe: %{person}"
- too_long:
- few: "vaše spročilo o stanju morajo vsebovati manj kot %{count} znake"
- one: "vaše spročilo o stanju morajo vsebovati manj kot %{count} znak"
- other: "vaše spročilo o stanju morajo vsebovati manj kot %{count} znakov"
- two: "vaše spročilo o stanju morajo vsebovati manj kot %{count} znaka"
- zero: "vaše spročilo o stanju morajo vsebovati manj kot %{count} znakov"
+ too_long: "{\"few\"=>\"vaše spročilo o stanju morajo vsebovati manj kot %{count} znake\", \"one\"=>\"vaše spročilo o stanju morajo vsebovati manj kot %{count} znak\", \"other\"=>\"vaše spročilo o stanju morajo vsebovati manj kot %{count} znakov\", \"two\"=>\"vaše spročilo o stanju morajo vsebovati manj kot %{count} znaka\", \"zero\"=>\"vaše spročilo o stanju morajo vsebovati manj kot %{count} znakov\"}"
stream_helper:
hide_comments: "Skrij vsa mnenja"
show_comments:
@@ -912,7 +881,6 @@ sl:
title: "Javna aktivnost"
tags:
contacts_title: "Ljudje, ki so izbrskali to oznako"
- tag_prefill_text: "Zadeva o %{tag_name} je ... "
title: "Objave označene z: %{tags}"
tag_followings:
create:
@@ -926,10 +894,7 @@ sl:
show:
follow: "Sledite #%{tag}"
following: "Sledenje #%{tag}"
- nobody_talking: "Nihče še ni govoril o %{tag}."
none: "Prazna oznaka ne obstaja!"
- people_tagged_with: "Ljudje, označeni z %{tag}"
- posts_tagged_with: "Objave označene z #%{tag}"
stop_following: "Prenehaj slediti #%{tag}"
terms_and_conditions: "Pravila in pogoji"
undo: "Razveljavi?"
@@ -965,7 +930,6 @@ sl:
current_password: "Trenutno geslo"
current_password_expl: "tisto s katerim ste se prijavili ..."
download_photos: "prenesi moje slike"
- download_xml: "prenesi v xml"
edit_account: "Uredi uporabniški račun"
email_awaiting_confirmation: "Poslali smo vam povezavo za aktiviranje na %{unconfirmed_email}. Dokler ne sledite tej povezavi in ​​aktivirate nov naslov, bomo še naprej uporabljati vaš stari naslov %{email}."
export_data: "Izvozi podatke"
@@ -974,7 +938,6 @@ sl:
liked: "... je nekomu všeč vaša objava?"
mentioned: "... ste omenjeni v objavi?"
new_password: "Novo geslo"
- photo_export_unavailable: "Izvoz slik trenutno ni na voljo"
private_message: "... prejmete zasebno sporočilo?"
receive_email_notifications: "Želite prejemati obvestila po e-pošti, ko ..."
reshared: "... nekdo deli vašo objavo?"
diff --git a/config/locales/diaspora/sr.yml b/config/locales/diaspora/sr.yml
index 0fcdfcecf..9b4694289 100644
--- a/config/locales/diaspora/sr.yml
+++ b/config/locales/diaspora/sr.yml
@@ -58,8 +58,6 @@ sr:
add_to_aspect:
failure: "Неуспешно додавање особе у поглед."
success: "Особа успешно додата у поглед."
- aspect_contacts:
- done_editing: "Готово уређивање"
aspect_listings:
add_an_aspect: "+ Додај поглед"
deselect_all: "Не означи ни један"
@@ -76,21 +74,14 @@ sr:
failure: "%{name} није празан и не може се уклонити."
success: "Поглед %{name} је успешно уклоњен."
edit:
- add_existing: "Додај постојећи контакт"
aspect_list_is_not_visible: "списак погледа је невидљив осталима у погледу"
aspect_list_is_visible: "списак погледа је видљив осталима у погледу"
confirm_remove_aspect: "Јесте ли сигурни да желите да обришете овај поглед?"
- done: "Готово"
make_aspect_list_visible: "Учини контакте у овом погледу видљиве једне другима?"
remove_aspect: "Обриши овај поглед"
rename: "Преименуј"
update: "Ажурирај"
updating: "ажурирање"
- few: "%{count} погледа"
- helper:
- are_you_sure: "Да ли сигурно желиш да обришеш овај поглед?"
- aspect_not_empty: "Поглед није празан"
- remove: "уклони"
index:
diaspora_id:
content_1: "Твој Дијаспора ИД је:"
@@ -123,11 +114,6 @@ sr:
heading: "Повежи сајтове"
unfollow_tag: "Не прати више #%{tag}"
welcome_to_diaspora: "Добродошли на Дијаспору, %{name}!"
- many: "%{count} погледа"
- move_contact:
- error: "Грешка приликом премештања особе: %{inspect}"
- failure: "није успело: %{inspect}"
- success: "Особа премештена у нови поглед."
new:
create: "Направи"
name: "Име (видљиво само теби)"
@@ -145,14 +131,6 @@ sr:
family: "Породица"
friends: "Пријатељи"
work: "Посао"
- selected_contacts:
- manage_your_aspects: "Уреди своје погледе."
- no_contacts: "Још немаш контаката."
- view_all_community_spotlight: "Погледај целу заједницу"
- view_all_contacts: "Види све контакте"
- show:
- edit_aspect: "Измени поглед"
- two: "%{count} погледа"
update:
failure: "Твој поглед, %{name}, има предугачак назив да би се сачувао."
success: "Твој поглед, %{name}, је успешно измењен."
@@ -160,26 +138,48 @@ sr:
back: "Назад"
bookmarklet:
post_something: "Објави на Дијаспори"
+ post_success: "Објављено! Затварам!"
cancel: "Откажи"
comments:
new_comment:
+ comment: "Коментариши"
commenting: "Коментарише се..."
+ one: "1 коментар"
+ zero: "Нема коментара"
contacts:
+ create:
+ failure: "Неуспело креирање контакта"
index:
- add_to_aspect_link: "додај контакт аспекту %{name}"
all_contacts: "Сви контакти"
+ community_spotlight: "Погледи заједнице"
my_contacts: "Моји контакти"
no_contacts: "Изгледа да треба да додаш неке контакте!"
- remove_person_from_aspect: "Уклони %{person_name} из аспекта %{aspect_name}"
+ only_sharing_with_me: "Деле само са вама:"
+ start_a_conversation: "Започни разговор"
title: "Контакти"
your_contacts: "Твоји контакти"
+ one: "1 контакт"
+ sharing:
+ people_sharing: "Људи који деле са вама:"
+ spotlight:
+ community_spotlight: "Погледи заједнице"
+ zero: "Нема контаката"
conversations:
+ create:
+ fail: "Неисправна порука"
+ sent: "Порука послата"
+ index:
+ inbox: "Сандуче"
+ no_conversation_selected: "Разговор није означен"
+ no_messages: "Нема порука"
new:
+ abandon_changes: "Откажи промене:"
send: "Пошаљи"
sending: "Шаљем..."
subject: "наслов"
to: "за"
show:
+ delete: "Обриши разговор"
reply: "одговор"
replying: "Одговарам..."
delete: "Уклони"
@@ -191,23 +191,307 @@ sr:
fill_me_out: "Испуни ме"
find_people: "Тражи људе или #тагове"
hide: "Сакриј"
+ invitations:
+ a_facebook_user: "Фејсбук корисник"
+ check_token:
+ not_found: "Токен позивнице није пронађен"
+ create:
+ already_contacts: "Већ сте повезани са овом особом."
+ already_sent: "Већ сте позвали ову особу."
+ no_more: "Немате више позивница."
+ own_address: "Не можете послати позивницу на своју адресу."
+ rejected: "Ове email адресе имају проблеме: "
+ edit:
+ accept_your_invitation: "Прихвати позивницу"
+ your_account_awaits: "Ваш налог чека!"
+ new:
+ already_invited: "Сљедеће особе нису прихватиле вашу позивницу:"
+ check_out_diaspora: "Провјери diaspora*!"
+ invite_someone_to_join: "Позовите некога да се придружи diaspora*!"
+ language: "Језик"
+ personal_message: "Лична порука"
+ resend: "Пошаљи поново"
+ send_an_invitation: "Пошаљи позивницу"
+ send_invitation: "Пошаљи позивницу"
+ to: "За"
+ layouts:
+ application:
+ back_to_top: "Назад на врх"
+ powered_by: "Покреће diaspora*"
+ toggle: "Мобилна верзија"
+ whats_new: "Ново"
+ header:
+ admin: "Администратор"
+ blog: "Блог"
+ code: "Код"
+ login: "Пријава"
+ logout: "Одјава"
+ profile: "Профил"
+ recent_notifications: "Недавна обавештења"
+ settings: "Подешавања"
+ view_all: "Прикажи све"
limited: "Ограничено"
more: "Још"
next: "следеће"
no_results: "Нема резултата"
+ notifications:
+ index:
+ and: "и"
+ mark_all_as_read: "Означи све као прочитано"
+ notifications: "Обавештења"
+ post: "објава"
+ notifier:
+ a_post_you_shared: "објава"
+ click_here: "Кликните овде"
+ liked:
+ view_post: "Погледајте објаву"
+ mentioned:
+ mentioned: "споменуо/ла вас у објави:"
+ private_message:
+ reply_to_or_view: "Одговорите или погледајте овај разговор:"
+ reshared:
+ view_post: "Погледајте објаву"
+ single_admin:
+ admin: "Ваш diaspora* администратор"
+ subject: "Порука о вашем diaspora* налогу:"
+ started_sharing:
+ sharing: "дели са вама!"
+ thanks: "Хвала,"
+ to_change_your_notification_settings: "да бисте променили подешавање обавештења"
nsfw: "Није пригодно за посао"
ok: "У реду"
or: "или"
password: "Лозинка"
password_confirmation: "Понови лозинку"
+ people:
+ add_contact_small:
+ add_contact_from_tag: "Додај контакт из ознаке"
+ index:
+ no_one_found: "...и нико није пронађен."
+ no_results: "Хеј! Требате нешто потражити."
+ one: "1 особа"
+ person:
+ add_contact: "Додајте контакт"
+ already_connected: "Већ сте повезани"
+ pending_request: "Захтеви на чекању"
+ thats_you: "То сте ви!"
+ profile_sidebar:
+ bio: "Биографија"
+ born: "Дат.рођења"
+ edit_my_profile: "Уреди сопствени профил"
+ gender: "Пол"
+ location: "Локација"
+ remove_contact: "Уклони контакт"
+ show:
+ closed_account: "Овај налог је затворен."
+ does_not_exist: "Особа не постоји!"
+ mention: "Споменуо/ла вас у објави"
+ message: "Порука"
+ not_connected: "Не делите са овом особом"
+ recent_posts: "Недавне објаве"
+ recent_public_posts: "Недавне јавне објаве"
+ see_all: "Погледајте све"
+ start_sharing: "Почните делити"
+ sub_header:
+ add_some: "Додајте неке"
+ edit: "Уреди"
+ you_have_no_tags: "Немате ознака!"
+ zero: "Без особа"
+ photos:
+ create:
+ integrity_error: "Ажурирање слике није успело. Јесте ли сигурни да је то слика?"
+ runtime_error: "Ажурирање слике није успело. Јесте ли сигурни да је сигурносни каиш притегнут?"
+ type_error: "Ажурирање слике није успело. Јесте ли сигурни да сте слику додали?"
+ destroy:
+ notice: "Слика обрисана"
+ edit:
+ editing: "Уређивање"
+ new:
+ back_to_list: "Назад ка листи"
+ new_photo: "Нова слика"
+ post_it: "Објави!"
+ new_profile_photo:
+ upload: "Додајте нову профилну слику!"
+ show:
+ delete_photo: "Обриши слику"
+ edit: "Уреди"
+ edit_delete_photo: "Уреди опис слике / обриши слику"
+ make_profile_photo: "Постави профилну слику"
+ show_original_post: "Прикажи оригиналну објаву"
+ update_photo: "Ажурирај слику"
+ update:
+ error: "Неуспело уређивање слике"
+ notice: "Слика успешно ажурирана."
+ posts:
+ show:
+ destroy: "Обриши"
+ not_found: "Жао нам је, нисмо успели пронаћи такву објаву."
previous: "претходно"
privacy: "Приватност"
privacy_policy: "Политика приватности"
profile: "Профил"
+ profiles:
+ edit:
+ allow_search: "Дозволите особама да вас траже унутар diaspora*"
+ edit_profile: "Уреди профил"
+ first_name: "Име"
+ last_name: "Презиме"
+ update_profile: "Ажурирај профил"
+ your_bio: "Ваша биографија"
+ your_birthday: "Дат.рођења"
+ your_gender: "Пол"
+ your_location: "Ваша локација"
+ your_name: "Ваше име"
+ your_photo: "Ваша слика"
+ your_private_profile: "Ваш приватни профил"
+ your_public_profile: "Ваш јавни профил"
+ your_tags: "Опишите себе у 5 ријечи"
+ update:
+ failed: "Неуспело ажурирање профила"
+ updated: "Ажурирај профил"
public: "Јавно"
+ registrations:
+ closed: "Регистрације су затворене за овај diaspora* под"
+ create:
+ success: "Придружили сте се diaspora*"
+ edit:
+ cancel_my_account: "Поништи мој налог"
+ leave_blank: "(оставите празно ако не желите да промените)"
+ password_to_confirm: "(треба нам ваша тренутна лозинка да потврди ваше промене)"
+ unhappy: "Несрећни?"
+ update: "Ажурирај"
+ new:
+ create_my_account: "Креирај мој налог!"
+ enter_email: "Унесите email"
+ enter_password: "Унесите лозинку (шест знакова минимално)"
+ enter_password_again: "Поновите лозинку"
+ enter_username: "Изаберите корисничко име (само слова, бројеви и доње линије)"
+ join_the_movement: "Придружи се покрету!"
+ sign_up_message: "Друштвена мрежа са ♥"
+ requests:
+ create:
+ sending: "Шаљем"
+ destroy:
+ success: "Сада делите."
+ manage_aspect_contacts:
+ existing: "Постојећи контакти"
+ new_request_to_person:
+ sent: "Послато"
+ reshares:
+ create:
+ failure: "Десила се грешка приликом делења ове објаве"
+ reshare:
+ deleted: "Изворна објава обрисана од стране аутора"
+ reshare_original: "Подели оригинал"
+ reshared_via: "Дељено путем"
+ show_original: "Прикажи оригинал"
search: "Претрага"
+ services:
+ failure:
+ error: "Грешка у току повезивања сервиса"
+ finder:
+ no_friends: "Фејсбук пријатељи нису пронађени."
+ index:
+ connect_to_facebook: "Повежи са Фејсбуком"
+ connect_to_tumblr: "Повежи са Тумблр"
+ connect_to_twitter: "Повежи са Твитером"
+ disconnect: "Прекини везу"
+ edit_services: "Уреди сервисе"
+ logged_in_as: "Пријављен као"
+ no_services: "Нисте још повезали нити један сервис."
+ inviter:
+ click_link_to_accept_invitation: "Следи ову везу да прихватиш своју позивницу"
+ join_me_on_diaspora: "Придружи ми се на diaspora*"
+ remote_friend:
+ invite: "Позови"
+ not_on_diaspora: "Није још на diaspora*"
+ resend: "Пошаљи поново"
settings: "Подешавања"
+ shared:
+ add_contact:
+ add_new_contact: "Додај нови контакт"
+ create_request: "Пронађи помоћу diaspora* ID"
+ diaspora_handle: "diaspora@pod.org"
+ enter_a_diaspora_username: "Унеси diaspora* корисничко име:"
+ know_email: "Знате њихову email адресу? Требали бисте их позвати"
+ aspect_dropdown:
+ add_to_aspect: "Додај контакт"
+ contact_list:
+ all_contacts: "Сви контакти"
+ invitations:
+ by_email: "Помоћу email"
+ dont_have_now: "Тренутно нема, али ускоро стиже још позивница!"
+ from_facebook: "Са Фејсбука"
+ invite_someone: "Позовите некога"
+ invite_your_friends: "Позовите пријатеље"
+ invites: "Захтеви"
+ invites_closed: "Захтеви су тренутно затворени за овај diaspora под"
+ public_explain:
+ outside: "Јавне поруке биће видљиве ван diaspora*."
+ share: "Подели"
+ title: "Уреди повезане сервисе"
+ visibility_dropdown: "Користите овај падајући мени како бисте променили видљивост вашег поста. (Предлажемо да први буде јаван.)"
+ publisher:
+ all: "Сви"
+ all_contacts: "Сви контакти"
+ discard_post: "Одбаци објаву"
+ make_public: "Учини јавним"
+ new_user_prefill:
+ invited_by: "Хвала на позиву, "
+ posting: "Објављујем..."
+ publishing_to: "Објави ка: "
+ share: "Дели"
+ share_with: "Дели са"
+ whats_on_your_mind: "Шта вам је на уму?"
+ reshare:
+ reshare: "Подели"
+ stream_element:
+ connect_to_comment: "Повежите се са овим корисником како бисте коментарисали њихову објаву"
+ currently_unavailable: "Коментарисање тренутно недоступно"
+ dislike: "Не свиђа ми се"
+ hide_and_mute: "Сакриј и утишај објаву"
+ like: "Свиђа ми се"
+ show: "Прикажи"
+ unlike: "Не свиђа ми се"
+ status_messages:
+ destroy:
+ failure: "Неуспело брисање објаве"
+ helper:
+ no_message_to_display: "Нема порука за приказати."
+ stream_helper:
+ hide_comments: "Сакриј све коментаре"
+ streams:
+ comment_stream:
+ contacts_title: "Особе на чије објаве сте ви коментарисали"
+ title: "Коментарисане објаве"
+ followed_tag:
+ add_a_tag: "Додајте ознаку"
+ follow: "Пратите"
+ like_stream:
+ contacts_title: "Особе чије објаве вам се свиђају"
+ mentions:
+ contacts_title: "Особе које су споменуле вас"
+ public:
+ title: "Јавна активност"
+ tag_followings:
+ create:
+ none: "Не можете пратити празну објаву!"
+ tags:
+ show:
+ none: "Празна ознака не постоји!"
terms_and_conditions: "Услови коришћења"
undo: "Врати?"
username: "Корисничко име"
+ users:
+ edit:
+ change_email: "Промени email"
+ change_language: "Промени језик"
+ change_password: "Промени лозинку"
+ close_account_text: "Затвори налог"
+ current_password: "Тренутна лозинка"
+ download_photos: "Преузми моје фотографије"
+ edit_account: "Уреди налог"
+ new_password: "Нова лозинка"
+ your_email: "Ваш email"
+ your_handle: "Ваш diaspora* ID"
welcome: "Добородошли!" \ No newline at end of file
diff --git a/config/locales/diaspora/sv.yml b/config/locales/diaspora/sv.yml
index 964724bd5..a6da9dc02 100644
--- a/config/locales/diaspora/sv.yml
+++ b/config/locales/diaspora/sv.yml
@@ -10,8 +10,9 @@ sv:
_contacts: "Kontakter"
_help: "Hjälp"
_home: "Hem"
- _photos: "foton"
+ _photos: "Bilder"
_services: "Tjänster"
+ _statistics: "Statistik"
_terms: "användningsvillkor"
account: "Konto"
activerecord:
@@ -40,7 +41,7 @@ sv:
reshare:
attributes:
root_guid:
- taken: "Du gillar detta va? Du har nämligen redan delat detta inlägg vidare!"
+ taken: "Du gillar detta, eller hur? Du har nämligen redan delat detta inlägg!"
user:
attributes:
email:
@@ -71,7 +72,7 @@ sv:
current_segment: "Medelantalet inlägg per användare för segmentet <b>%{post_day}</b> är <b>%{post_yest}</b>"
daily: "Dagligen"
display_results: "Visar resultat från segmentet <b>%{segment}</b>"
- go: "gå"
+ go: "Kör"
month: "Månad"
posts:
one: "Ett inlägg"
@@ -103,8 +104,12 @@ sv:
: ja
user_search:
account_closing_scheduled: "Kontot för %{name} är låst och kommer att raderas om en stund."
- add_invites: "lägg till inbjudningar"
+ account_locking_scheduled: "Kontot för användaren %{name} är schemalagt för att låsas. Det kommer ske om en liten stund..."
+ account_unlocking_scheduled: "Kontot för användaren %{name} är schemalagt för att låsas upp. Det kommer ske om en liten stund..."
+ add_invites: "Lägg till inbjudningar"
are_you_sure: "Är du säker på att du vill ta bort ditt konto?"
+ are_you_sure_lock_account: "Är du säker på att du vill låsa detta konto?"
+ are_you_sure_unlock_account: "Är du säker på att du vill låsa upp detta konta?"
close_account: "ta bort konto"
email_to: "Skicka ett e-brev för att bjuda in"
under_13: "Visa användare som är yngre än 13 år"
@@ -114,9 +119,9 @@ sv:
zero: "Inga användare hittades"
view_profile: "visa profil"
you_currently:
- one: "du har bara en invit kvar %{link}"
- other: "du har nu bara %{count} inviter kvar %{link}"
- zero: "you du har inga inviter kvar %{link}"
+ one: "Du har bara en invit kvar %{link}"
+ other: "Du har nu bara %{count} inviter kvar %{link}"
+ zero: "Du har inga inviter kvar %{link}"
weekly_user_stats:
amount_of:
one: "Antalet nya användare denna vecka: en enda"
@@ -127,11 +132,11 @@ sv:
all_aspects: "Alla aspekter"
application:
helper:
- unknown_person: "okänd person"
+ unknown_person: "Okänd person"
video_title:
unknown: "Okänd videotitel"
are_you_sure: "Är du säker?"
- are_you_sure_delete_account: "Är du säker på att du vill stänga ditt konto? Detta kan inte ångras!"
+ are_you_sure_delete_account: "Är du säker på att du vill avsluta ditt konto? Detta kan inte ångras!"
aspect_memberships:
destroy:
failure: "Kunde inte ta bort personen från aspekten"
@@ -141,8 +146,6 @@ sv:
add_to_aspect:
failure: "Personen kunde inte läggas till på aspekten."
success: "Personen lades till i aspekten."
- aspect_contacts:
- done_editing: "dölj"
aspect_listings:
add_an_aspect: "+ Lägg till en aspekt"
deselect_all: "Avmarkera alla"
@@ -153,7 +156,7 @@ sv:
stay_updated: "Håll dig uppdaterad"
stay_updated_explanation: "Din huvudström innefattar alla dina kontakter, de taggar du följer och inlägg från några kreativa medlemmar i gemenskapen."
contacts_not_visible: "Kontakterna i den här aspekten kommer inte att kunna se varandra."
- contacts_visible: "Kontakterna i den här aspekten kommer att kunna se varandra."
+ contacts_visible: "Kontakterna i denna aspekt kommer vara synliga för varandra."
create:
failure: "Aspekten kunde inte skapas."
success: "Din nya aspekt %{name} har skapats"
@@ -161,32 +164,27 @@ sv:
failure: "%{name} är inte tom och kan därför inte tas bort"
success: "%{name} togs bort."
edit:
- add_existing: "Lägg till en befintlig kontakt"
+ aspect_chat_is_enabled: "Kontakterna i denna aspekt har tillåtelse chatta med dig."
+ aspect_chat_is_not_enabled: "Kontakter i denna aspekt har inte privilegier för att chatta med dig."
aspect_list_is_not_visible: "Aspektens kontakter kan inte se vilka som hör till aspekten."
- aspect_list_is_visible: "Aspektens kontakter kan se vilka som hör till aspekten."
+ aspect_list_is_visible: "Kontakter i denna aspekt är synliga för varandra."
confirm_remove_aspect: "Är du säker på att du vill ta bort aspekten?"
- done: "Klar"
- make_aspect_list_visible: "ska kontakterna i denna aspekt vara synliga för varandra? "
- manage: "Hantera"
+ grant_contacts_chat_privilege: "vill du ge kontakter i aspekten chatprivilegier?"
+ make_aspect_list_visible: "Ska kontakterna i denna aspekt vara synliga för varandra?"
remove_aspect: "Ta bort den här aspekten"
- rename: "byt namn"
+ rename: "Byt namn"
set_visibility: "Ange synlighetsgrad"
- update: "uppdatera"
- updating: "uppdaterar"
- few: "%{count} aspekter"
- helper:
- are_you_sure: "Är du säker på att du vill ta bort den här aspekten?"
- aspect_not_empty: "Aspekten är inte tom"
- remove: "ta bort"
+ update: "Uppdatera"
+ updating: "Uppdaterar"
index:
diaspora_id:
- content_1: "Ditt Diaspora-id är:"
- content_2: "Med hjälp av det kan alla hitta dig på Diaspora."
- heading: "Diaspora-id"
+ content_1: "Ditt Diaspora*-id är:"
+ content_2: "Med hjälp av det, kan alla hitta dig på Diaspora*."
+ heading: "Diaspora*-id"
donate: "Donera"
- handle_explanation: "Detta är ditt Diaspora-id. Det är det här du ska ge till dina vänner, om du vill att de ska lägga till dig på Diaspora."
+ handle_explanation: "Detta är ditt Diaspora*-id. Det är det här du ska ge till dina vänner, om du vill att de ska lägga till dig på Diaspora*."
help:
- any_problem: "Några problem?"
+ any_problem: "Har du problem?"
contact_podmin: "Kontakta din pods administratör."
do_you: "Har du:"
email_feedback: "%{link}a din respons, om du föredrar det"
@@ -195,15 +193,15 @@ sv:
find_a_bug: "... hittat en %{link}?"
have_a_question: "... en %{link}?"
here_to_help: "Diasporagemenskapen finns här!"
- mail_podmin: "Podadministratörs e-post"
+ mail_podmin: "Podadministratörens e-post"
need_help: "Behöver du hjälp?"
tag_bug: "bugg"
tag_feature: "förslag"
tag_question: "fråga"
tutorial_link_text: "Nybörjar-guider"
- tutorials_and_wiki: "%{faq}, %{tutorial} och %{wiki} hjälper dig att komma igång."
+ tutorials_and_wiki: "%{faq}, %{tutorial} och %{wiki} hjälper dig komma igång."
introduce_yourself: "Det här är ditt flöde. Hoppa in och presentera dig själv."
- keep_diaspora_running: "Håll Diasporautvecklingen igång med en månatlig donation!"
+ keep_diaspora_running: "Håll igång Diaspora*'s utveckling med en månatlig donation!"
keep_pod_running: "Håll %{pod} igång och ge servrarna sin kaffefix med en månatlig donation!"
new_here:
follow: "Följ %{link} och hälsa nya användare välkomna!"
@@ -212,22 +210,17 @@ sv:
no_contacts: "Inga kontakter"
no_tags: "+ Hitta en tag att följa"
people_sharing_with_you: "Personer som delar med dig"
- post_a_message: "skriv ett inlägg >>"
+ post_a_message: "Skriv ett inlägg >>"
services:
- content: "Du kan koppla ihop Diaspora med följande tjänster:"
+ content: "Du kan koppla ihop Diaspora* med följande tjänster:"
heading: "Ihopkopplade tjänster"
unfollow_tag: "Sluta följa #%{tag}"
- welcome_to_diaspora: "Välkommen till Diaspora, %{name}!"
- many: "%{count} aspekter"
- move_contact:
- error: "Kunde inte flytta kontakt: %{inspect}"
- failure: "fungerade inte %{inspect}"
- success: "Personen flyttades till den nya aspekten"
+ welcome_to_diaspora: "Välkommen till Diaspora*, %{name}!"
new:
create: "Skapa"
name: "Namn (endast synligt för dig)"
no_contacts_message:
- community_spotlight: "gemenskapens rampljus"
+ community_spotlight: "Gemenskapens rampljus"
or_spotlight: "Du kan också dela med %{link}"
try_adding_some_more_contacts: "Du kan söka efter eller bjuda in fler personer."
you_should_add_some_more_contacts: "Du borde lägga till fler kontakter!"
@@ -240,63 +233,50 @@ sv:
family: "Familj"
friends: "Vänner"
work: "Arbete"
- selected_contacts:
- manage_your_aspects: "Hantera dina aspekter."
- no_contacts: "Du har ännu inga kontakter här."
- view_all_community_spotlight: "Se allt i gemenskapens rampljus"
- view_all_contacts: "Se alla kontakter"
- show:
- edit_aspect: "redigera aspekt"
- two: "%{count} aspekter"
update:
failure: "Det namn du valde för din aspekt, %{name}, var för långt för att kunna sparas."
success: "Din aspekt %{name} har nu ändrats."
- zero: "inga aspekter"
+ zero: "Inga aspekter"
back: "Tillbaka"
blocks:
create:
failure: "Jag kunde inte ignorera den användaren. #undvik"
- success: "Nåväl, du kommer inte att se den användaren i din ström igen. #tystnad!"
+ success: "Nåväl, du kommer inte att se den användaren i din ström igen. #silencio!"
destroy:
failure: "Jag kunde inte sluta ignorera den användaren. #undvik"
- success: "Låt oss se vad de har att säga! #säghej"
+ success: "Låt oss se vad de har att säga! #hälsa"
bookmarklet:
- explanation: "Bokmärk %{link} för att kunna göra inlägg på Diaspora varifrån som helst."
+ explanation: "Bokmärk %{link} för att kunna göra inlägg på Diaspora* varifrån som helst."
heading: "Bookmarklet"
- post_something: "Dela på Diaspora"
+ post_something: "Dela på Diaspora*"
post_success: "Skickat! Stänger!"
cancel: "Avbryt"
comments:
- few: "%{count} kommentarer"
- many: "%{count} kommentarer"
new_comment:
comment: "Kommentera"
commenting: "Kommenterar..."
one: "en kommentar"
other: "%{count} kommentarer"
- two: "%{count} kommentarer"
- zero: "inga kommentarer"
+ zero: "Inga kommentarer"
contacts:
create:
failure: "Kunde inte skapa kontakt"
- few: "%{count} kontakter"
index:
add_a_new_aspect: "Lägg till en ny aspekt"
- add_to_aspect: "lägg till kontakter i %{name}"
- add_to_aspect_link: "lägg till kontakter i %{name}"
+ add_contact: "Lägg till kontakt"
+ add_to_aspect: "Lägg kontakter i %{name}"
all_contacts: "Alla kontakter"
community_spotlight: "Gemenskapens rampljus"
- many_people_are_you_sure: "Är du säker på att du vill starta en privat konversation med mer än %{suggested_limit} kontakter? Ett bättre sätt kan vara att posta inlägget i denna aspekt."
my_contacts: "Mina kontakter"
no_contacts: "Det verkar som om att du skulle behöva några fler kontakter!"
+ no_contacts_in_aspect: "Den här aspekten är för närvarande tom. Nedanför kan du se en lista med dina kontakter som du kan lägga till."
no_contacts_message: "Kolla in %{community_spotlight}"
- no_contacts_message_with_aspect: "Kolla in %{community_spotlight} eller %{add_to_aspect_link}"
only_sharing_with_me: "Delar enbart med mig"
- remove_person_from_aspect: "Ta bort %{person_name} från \"%{aspect_name}\""
+ remove_contact: "Ta bort kontakt"
start_a_conversation: "Inled en konversation"
title: "Kontakter"
- your_contacts: "Kontakter"
- many: "%{count} kontakter"
+ user_search: "Användarsökning"
+ your_contacts: "Dina kontakter"
one: "en kontakt"
other: "%{count} kontakter"
sharing:
@@ -304,8 +284,7 @@ sv:
spotlight:
community_spotlight: "Gemenskapens rampljus"
suggest_member: "Föreslå en medlem"
- two: "%{count} kontakter"
- zero: "kontakter"
+ zero: "Inga kontakter"
conversations:
conversation:
participants: "Deltagare"
@@ -314,7 +293,8 @@ sv:
no_contact: "Hallå där! Du måste först lägga till kontakten."
sent: "Meddelandet har skickats"
destroy:
- success: "Konversationen togs bort"
+ delete_success: "Konversationen har tagits bort"
+ hide_success: "Konversationen har döljts"
helper:
new_messages:
one: "Ett nytt meddelande"
@@ -325,19 +305,20 @@ sv:
create_a_new_conversation: "påbörja en ny konversation"
inbox: "Inkorg"
new_conversation: "Ny konversation"
- no_conversation_selected: "ingen konversation vald"
- no_messages: "inga meddelanden"
+ no_conversation_selected: "Ingen konversation vald"
+ no_messages: "Inga meddelanden"
new:
abandon_changes: "Ändringarna kommer inte sparas. Vill du fortsätta ändå?"
send: "Skicka"
sending: "Skickar..."
- subject: "ämne"
- to: "till"
+ subject: "Ämne"
+ to: "Till"
new_conversation:
fail: "Ogiltigt meddelande"
show:
- delete: "ta bort och blockera konversation"
- reply: "besvara"
+ delete: "Ta bort konversationen"
+ hide: "dölj och tysta konversation"
+ reply: "Besvara"
replying: "Svarar..."
date:
formats:
@@ -357,13 +338,13 @@ sv:
find_people: "Hitta personer eller #taggar"
help:
account_and_data_management:
- close_account_a: "Gå längst ner på Inställnings-sidan och tryck på knappen \"Stäng Kontot\"."
+ close_account_a: "Längst ner på sidan för inställningar finns knappen \"Stäng kontot\"."
close_account_q: "Hur tar jag bort mitt frö (konto)?"
data_other_podmins_a: "När du delar med dig med till någon på en annan pod, kommer alla inlägg du delar med till dem samt en kopia av din profil att sparas tillfälligt på deras pod. Då kan också dess podadministratör komma åt din data. När du tar bort ett inlägg eller tar bort hela din profil, försvinner den också från dem podar där den tidigare sparats."
data_other_podmins_q: "Kan adminstratörer av andra pods se min information?"
- data_visible_to_podmin_a: "Kommunikationen mellan podar är alltid krypterad (både med SSL och Disaporas egna krypteringsstystem). Den sparade datan på podarna är dock inte krypterad. Podarnas administratörer kan komma åt all din profildata och alla dina inlägg (precis som med de flesta andra webbplatser). Att administrera en egen pod ger därför mer skydd, eftersom du administrerar din egna databas."
+ data_visible_to_podmin_a: "Kommunikationen mellan podar är alltid krypterad, både med SSL och Diasporas egna krypteringssystem. Informationen i varje pod är dock inte krypterad. Podarnas administratörer kan komma åt all din profildata och alla dina inlägg. (Precis administratörer för andra webbplatser kommer åt datan de hanterar.) Om du vill vara mer säker kan du administrera din egen pod, eftersom du då kontrollerar åtkomsten till databasen."
data_visible_to_podmin_q: "Hur mycket av min personliga information kan min pod-administratör se?"
- download_data_a: "Ja. Längst ned på sidan Konto-fliken i Inställnings-menyn finns det två knappar för att ladda ner din data."
+ download_data_a: "Ja. Längst ned på kontofliken, i inställningsmenyn, finns två knappar för att ladda ner din data."
download_data_q: "Kan jag ladda ner en kopia av all data på mitt frö (konto)?"
move_pods_a: "I framtiden kommer du att kunna exportera ditt frö från en pod och importera det till en annan. Just nu är detta dock inte möjligt. Du kan däremot skapa ett nytt konto och lägga till dina kontakter på ett nytt frö och sedan be dem att lägga till dig på nytt."
move_pods_q: "Hur flyttar jag mitt frö (konto) från en pod till en annan?"
@@ -381,10 +362,10 @@ sv:
person_multiple_aspects_q: "Kan jag lägga till en person i flera olika aspekter?"
post_multiple_aspects_a: "Ja. När du gör ett inlägg, använd aspektväljarknappen för att välja eller ta bort aspekter. Ditt inlägg kommer att bli synligt för alla aspekter som du valt. I sidopanelen kan du också välja vilka aspekter du vill skicka inlägg till. När du gör inlägget kommer aspekterna du valt i panelen att automatiskt vara valda när du börjar göra ditt inlägg."
post_multiple_aspects_q: "Kan jag göra inlägg till flera aspekter på en gång?"
- remove_notification_a: "Nej."
+ remove_notification_a: "Nej. De får inte någon notifikation om att du lägger till dem i fler än en aspekt, även om du redan delar med dig åt dem."
remove_notification_q: "Kommer mina kontakter få en notifiering om jag tar bort dem från aspekter?"
- rename_aspect_a: "Ja. I din aspektlista till vänster på huvudsidan kan du döpa om en aspekt genom att föra muspekaren över aspektens namn, trycka på pennan som dyker upp och välj där att döpa om aspekten."
- rename_aspect_q: "Kan jag döpa om en aspekt?"
+ rename_aspect_a: "I din aspektlista, till vänster på huvudsidan, kan du döpa om en aspekt genom att föra muspekaren över aspektens namn, trycka på den penna som dyker upp och där välj att döpa om aspekten."
+ rename_aspect_q: "Hur döper jag om en aspekt?"
restrict_posts_i_see_a: "Ja. Välj \"Mina aspekter\" i sidolisten och markera eller avmarkera aspekter i listen genom att klicka på dem. Bara inlägg från personer i de valda aspekterna kommer synas i ditt flöde."
restrict_posts_i_see_q: "Kan jag begränsa dem inlägg jag ser till särskilda aspekter?"
title: "Aspekter"
@@ -392,15 +373,22 @@ sv:
what_is_an_aspect_q: "Vad är en Aspekt?"
who_sees_post_a: "Om du skulle göra ett inlägg med begränsad spridning, kommer det bara vara synligt för dem du har i just den aspekten (eller de aspekterna, om det skickas till flertalet aspekter). Kontakter som inte finns i aspekten kommer inte att kunna se inlägget. Bara offentliga inlägg kommer att bli synliga för dina kontakter som inte ligger i någon aspekt."
who_sees_post_q: "Vem ser det inlägg jag gjort i en aspekt?"
- foundation_website: "diaspora-föreningens hemsida"
+ chat:
+ add_contact_roster_a: "Först av allt måste du tillåta chatt i aspekter med dem du vill chatta med. Du gör genom att gå till %{contacts_page} och väljer aspekterna du vill tillåta chatt i. %{toggle_privilege} Om du hellre vill, kan du skapa en egen aspekt speciellt för dem du vill chatta med. När du har aspekt med chattar tillåtna, är det bara att öppna chatten och välj den du vill chatta med."
+ add_contact_roster_q: "Hur chattar jag med någon på Diaspora?"
+ contacts_page: "kontaktsida"
+ title: "Chatt"
+ faq: "Vanliga frågor"
+ foundation_website: "Diaspora*-föreningens hemsida"
getting_help:
- get_support_a_hashtag: "ställ en fråga i ett publikt inlägg på Diaspora* med taggen %{question}"
- get_support_a_irc: "hälsa på oss på %{irc} (direktchatt)"
- get_support_a_tutorials: "ta en titt på våra %{tutorials}"
- get_support_a_website: "besök vår %{link}"
- get_support_a_wiki: "sök i %{link}"
+ get_support_a_faq: "Läs vår %{faq}-sida på wikin."
+ get_support_a_hashtag: "Fråga med ett publikt inlägg på Diaspora* och använd taggen %{question}"
+ get_support_a_irc: "Ta kontakt med oss på %{irc} (chatt)"
+ get_support_a_tutorials: "Spana in våra %{tutorials}"
+ get_support_a_website: "Besök vår %{link}"
+ get_support_a_wiki: "sök vidare i vår %{link}"
get_support_q: "Vad gör jag om jag inte fått svar på min fråga i denna lista? Var kan jag få svar på min fråga?"
- getting_started_a: "Du har tur. Pröva projektets %{tutorial_series} på vår sida. Där får du en stegvis genomgång av hela registreringsprocessen och lära dig grunderna för att använda Diaspora*."
+ getting_started_a: "Inga problem! På vår sida finns %{tutorial_series}. De ger dig en genomgång av hela registreringsprocessen, steg för steg, och lär dig hur Diaspora* fungerar."
getting_started_q: "Jag behöver hjälp för att komma igång!"
title: "Få hjälp"
getting_started_tutorial: "Handledning för att komma igång"
@@ -412,6 +400,10 @@ sv:
keyboard_shortcuts_li2: "k - hoppa till föregående inlägg"
keyboard_shortcuts_li3: "c - kommentera inlägget"
keyboard_shortcuts_li4: "l - gilla inlägget"
+ keyboard_shortcuts_li5: "r - Dela vidare inlägget"
+ keyboard_shortcuts_li6: "m - Fäll ut inlägget"
+ keyboard_shortcuts_li7: "o - Öppna den först förekommande länken i inlägget"
+ keyboard_shortcuts_li8: "ctr + enter - Skicka meddelande"
keyboard_shortcuts_q: "Vilka tangentbordsgenvägar finns att tillgå?"
title: "Tangentbordsgenvägar"
markdown: "Markdown"
@@ -441,7 +433,7 @@ sv:
title: "Podar"
use_search_box_a: "Om du känner till deras Diaspora-id (alltså användarnamn@podnamnet.org) kan du söka på det. Om individerna använder samma pod, räcker det med att söka på användarnamnet. Alternativt kan du söka efter profilnamnet, vilket kan vara (men inte måste vara) personens egennamn. Om en sökning misslyckas första gången kan du pröva igen."
use_search_box_q: "Hur använder jag sökrutan för att hitta särskilda personer?"
- what_is_a_pod_a: "En pod är en server som använder Diasporas mjukvara och är ansluten till nätverket med andra sådana servrar. \"Pod\" är engelska för \"frökapsel\". En pod ses som en sådan kapsel som innehåller flera frön, som att en server har flera konton. Det finns många olika podar och du kan kommunicera med vänner från andra podar. (Du kan se Diaspora* som en e-post-leverantör. Det finns publika podar, privata podar och du kan till och med bli din egna.)"
+ what_is_a_pod_a: "En pod är en server som använder Diaspora*'s mjukvara och är ansluten till nätverket med andra sådana servrar. \"Pod\" är engelska för \"frökapsel\". En pod ses som en sådan kapsel som innehåller flera frön, som att en server har flera konton. Det finns många olika podar och du kan kommunicera med vänner från andra podar. (Du kan se Diaspora* som en e-post-leverantör. Det finns publika podar, privata podar och du kan till och med bli din egna.)"
what_is_a_pod_q: "Vad är en pod?"
posts_and_posting:
char_limit_services_a: "I dem fallen kommer dina inlägg vara begränsade till ett färre antal tecken (140 för Twitter och 1 000 för Tumblr). Hur många tecken du har kvar att använda , syns när tjänstens ikon är upplyst. Du kan fortfarande göra inlägg till dessa tjänster som är längre än deras begränsningar, men de kommer att bli avhuggna."
@@ -461,6 +453,14 @@ sv:
insert_images_comments_a2: "används för att lägga till bilder från en webbplats till både kommentarer och inlägg."
insert_images_comments_q: "Kan jag lägga till bilder i kommentarer?"
insert_images_q: "Hur lägger jag in bilder till mitt inlägg?"
+ post_location_a: "Tryck på knappnålsikonen bredvid kameran där du laddar upp bilder. Det här kommer att lägga till din plats från OpenStreetMap.org. Du själv kan ändra platsen, för att bara ange staden du befinner dig i och inte den exakta adressen."
+ post_location_q: "Hur anknyter jag min plats till ett inlägg?"
+ post_notification_a: "Du finner en bjällerikon bredvid X:et i inlägget övre, högra hörn. Tryck på den för att slå på eller av notifikationer om det inlägget."
+ post_notification_q: "Hur skulle jag göra för att ändra mina notifikationsinställningar för ett inlägg?"
+ post_poll_a: "Tryck på grafikonen för att skapa en omröstning. Skriv in din fråga och åtminstone två alternativ. Glöm inte att göra inlägget publikt om du vill att alla ska kunna delta."
+ post_poll_q: "Hur lägger jag till en omröstning till mitt inlägg?"
+ post_report_a: "Tryck på varningstriangeln i inläggets övre, högra hörn för att anmäla det till din podadminstratör. Ange sedan, noggrant, varför du valt att anmäla inlägget."
+ post_report_q: "Hur meddelar jag om kränkande inlägg?"
size_of_images_a: "Nej. Bildernas storlek justeras automatiskt för att passa strömmen."
size_of_images_q: "Kan jag själv anpassa bildstorleken i inlägg och kommentarer?"
stream_full_of_posts_a1: "Din ström består av tre typer av inlägg:"
@@ -525,6 +525,7 @@ sv:
add_to_aspect_li5: "Skulle Bengt besöka Annas profilsida skulle han se de privata inläggen hon har gjort till den aspekt hon har lagt honom i. Givetvis ser Bengt också Annas publika inlägg på hennes profilsida."
add_to_aspect_li6: "Bengt kommer att kunna se Annas publika profil med biografi, position, kön och födelsedag."
add_to_aspect_li7: "Anna kommer synas under \"Delar enbart med mig\" på Bengts kontaktsida."
+ add_to_aspect_li8: "Amalia kommer också kunna @nämna Benjamin i ett inlägg."
add_to_aspect_q: "Vad händer när jag lägger till en person i en aspekt och när någon lägger till mig till en av deras aspekter?"
list_not_sharing_a: "Nej. Du kan däremot besöka personers profilsidor för att se om de delar med sig till dig. Om de gör det, kommer listen under deras profilbild att vara grön; annars vore den grå. Du borde få en notifiering varje gång börjar dela med sig till dig."
list_not_sharing_q: "Finns det någon lista med personer vilka jag har lagt till aspekter, men som inte har mig i någon av deras?"
@@ -532,6 +533,8 @@ sv:
only_sharing_q: "Vilka personer syns i \"Delar enbart med mig\" på min kontaktsida?"
see_old_posts_a: "Nej. De kommer bara att kunna se de nya inläggen du gör. De kan givetvis se dina gamla offentliga inlägg, precis som alla andra."
see_old_posts_q: "Kan personer jag lägg till i mina aspekter se de äldre inläggen jag gjort till aspekten?"
+ sharing_notification_a: "Du borde få en notifikation varje gång någon delar med sig åt dig."
+ sharing_notification_q: "Hur kan jag se om någon delar med sig av innehåll åt mig?"
title: "Delning av inlägg"
tags:
filter_tags_a: "Det är inte ännu inte möjligt att utföra i Diaspora*. Men något %{third_party_tools} kan finnas som stödjer denna funktion."
@@ -545,7 +548,7 @@ sv:
title: "Taggar"
what_are_tags_for_a: "Taggarna är ett sätt att kategorisera inlägg efter ämne. Genom att söka på en särskild tag kommer alla inlägg med den taggen att visas, både de publika och de privata till dig. På så vis kan man hitta inlägg som intresserar en."
what_are_tags_for_q: "Vad är taggarna till för?"
- third_party_tools: "tredjepartsverktyg"
+ third_party_tools: "Tredjepartsverktyg"
title_header: "Hjälp"
tutorial: "Nybörjar-guide"
tutorials: "nybörjar-guider"
@@ -573,14 +576,14 @@ sv:
new:
already_invited: "Följande har inte accepterat din inbjudan:"
aspect: "Aspekt"
- check_out_diaspora: "Kolla in Diaspora!"
+ check_out_diaspora: "Kolla in Diaspora*!"
codes_left:
one: "%{count} inbjudning kvar för denna kod."
other: "%{count} inbjudningar kvar för denna kod."
zero: "Det finns inga inbjudningar kvar för denna kod."
comma_separated_plz: "Du kan ange flera e-postadresser åtskilda av kommatecken."
if_they_accept_info: "om de accepterar, kommer de läggas till i den aspekt du angav vid inbjudan."
- invite_someone_to_join: "Bjud in någon till Diaspora!"
+ invite_someone_to_join: "Bjud in någon till Diaspora*!"
language: "Språk"
paste_link: "Ge denna länk till dina vänner för att bjuda in dem till Diaspora*, eller skicka länken till dem med e-post."
personal_message: "Personligt meddelande"
@@ -592,18 +595,18 @@ sv:
layouts:
application:
back_to_top: "Åter till början"
- powered_by: "DRIVS AV DIASPORA*"
- public_feed: "Offentligt Diasporaflöde för %{name}"
- source_package: "ladda ned källkodspaketet"
- toggle: "byt mobilanpassning"
- whats_new: "vad är nytt?"
- your_aspects: "dina aspekter"
+ powered_by: "Drivs med Diaspora*"
+ public_feed: "Offentligt Diaspora*-flöde för %{name}"
+ source_package: "Ladda ned källkodspaketet"
+ toggle: "Slå om mobiltelefonanpassning"
+ whats_new: "Vad är nytt?"
+ your_aspects: "Dina aspekter"
header:
- admin: "administratör"
- blog: "blogg"
- code: "källkod"
+ admin: "Administratör"
+ blog: "Blogg"
+ code: "Källkod"
help: "Hjälp"
- login: "logga in"
+ login: "Logga in"
logout: "Logga ut"
profile: "Profil"
recent_notifications: "Tidigare"
@@ -612,20 +615,20 @@ sv:
likes:
likes:
people_dislike_this:
- one: "en person ogillar det här"
+ one: "En person ogillar det här"
other: "%{count} personer ogillar det här"
- zero: "inga ogillar det här"
+ zero: "Inga ogillar det här"
people_like_this:
- one: "en person gillar det här"
+ one: "En person gillar det här"
other: "%{count} personer gillar det här"
- zero: "inga personer gillar det här"
+ zero: "Inga personer gillar det här"
people_like_this_comment:
- one: "en gillar"
+ one: "En gillar"
other: "%{count} gillar"
- zero: "ingen gillar"
+ zero: "Ingen gillar"
limited: "Begränsad"
more: "Mer"
- next: "nästa"
+ next: "Nästa"
no_results: "Inga sökresultat"
notifications:
also_commented:
@@ -666,6 +669,7 @@ sv:
mark_read: "Lästmärk"
mark_unread: "Markera som oläst"
mentioned: "Omnämnd"
+ no_notifications: "Du har inga notifikationer ännu."
notifications: "Notiser"
reshared: "Återdelad"
show_all: "visa alla"
@@ -705,15 +709,59 @@ sv:
other: "%{actors} har börjat att dela med dig."
zero: "ingen delar ännu något med dig."
notifier:
+ a_limited_post_comment: "Du har en ny kommentar till ett begränsat inlägg på Diaspora* att spana in."
a_post_you_shared: "ett inlägg."
+ a_private_message: "Du har fått ett nytt privat meddelande på Diaspora*."
accept_invite: "Acceptera din Diaspora*-inbjudan!"
- click_here: "klicka här"
+ click_here: "Klicka här"
comment_on_post:
reply: "Svara eller se %{name}s inlägg >"
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}"
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: |-
+ Hej %{name},
+
+ Din data har behandlas och kan nu laddas ned [här](%{url}).
+
+ Tack och hej,
+
+ Diasporas e-postrobot!
+ subject: "Din personliga data finns nu tillgänglig för att laddas ned, %{name}"
+ export_failure_email:
+ body: |-
+ Hej %{name}
+
+ Vi har stött på ett problem medan vi behandlade din personliga data för nedladdning.
+ Var god försök igen!
+
+ Tack och hej,
+
+ Diasporas e-postbot!    
+ subject: "Förlåt oss, det dök upp ett problem med din data, %{name}"
+ export_photos_email:
+ body: |-
+ Tjena %{name},
+
+ Dina bilder har behandlats och kan nu laddas ned med [denna länk](%{url}).
+
+ Ha det bra,
+
+ Diasporas e-postbot.
+ subject: "Dina bilder kan nu laddas ned, %{name}"
+ export_photos_failure_email:
+ body: |-
+ Tjena %{name},
+
+ Vi har stött på ett bekymmer under behandlingen av bilderna du skulle ladda ned.
+ Försök gärna igen!
+
+ Förlåt oss,
+
+ Diasporas e-postbot.
+ subject: "Ett problem uppstod med dina bilder, %{name}"
hello: "Hej %{name}!"
invite:
message: |-
@@ -740,6 +788,22 @@ sv:
subject: "%{name} har nämnt dig på Diaspora*"
private_message:
reply_to_or_view: "Svara på eller läs denna konversation >"
+ remove_old_user:
+ body: |-
+ Hej,
+
+ På grund av inaktivitet i ditt Diaspora*-konto på %{pod_url} vill vi meddela att ditt konto automatiskt har blivit märkt för borttagning. Detta sker automatiskt när ett konto har varit inaktivt i %{after_days} dagar.
+
+ Vi ser gärna att du förblir en del av Diaspora*-gemenskapen och behåller ditt konto.
+
+ Du kan undvika dataförluster genom att logga in på kontot innan det automatiskt tas bort %{remove_after}. Ta gärna en ordentlig titt på Diaspora* nu, för mycket har ändrats sedan du senast loggade in. Vi hoppas att du kommer att gilla de ändringar vi har gjort. Följ några #taggar för att intressant material.
+
+ Om du vill behålla ditt konto, logga in här: %{login_url}. Har du glömt några inloggningsdetaljer, finner du påminnelsehjälp på samma sida.
+
+ Hoppas att vi kan ses igen,
+
+ Diaspora*'s mejlrobot!
+ subject: "Ditt Diaspora*-konto har blivit märkt för att tas bort på grund av passivitet."
report_email:
body: |-
Tjenare,
@@ -764,27 +828,26 @@ sv:
reshared: "%{name} delar ditt inlägg vidare."
view_post: "Se inlägg >"
single_admin:
- admin: "Din Diasporaadministratör"
- subject: "Ett meddelande gällande ditt Diasporakonto:"
+ admin: "Din Diaspora*-administratör"
+ subject: "Ett meddelande gällande ditt Diaspora*-konto:"
started_sharing:
sharing: "har börjat dela med dig!"
subject: "%{name} har börjat dela med dig på Diaspora*"
view_profile: "Se %{name}s profil"
thanks: "Tack,"
to_change_your_notification_settings: "för att ändra dina notisinställningar"
- nsfw: "Ej lämpligt för arbetsplats."
+ nsfw: "Vuxet material"
ok: "Ok"
or: "eller"
password: "Lösenord"
password_confirmation: "Bekräfta lösenord"
people:
add_contact:
- invited_by: "du blev inbjuden av"
+ invited_by: "Du blev inbjuden av"
add_contact_small:
- add_contact_from_tag: "lägg till kontakt från tagg"
+ add_contact_from_tag: "Lägg till kontakt från tagg"
aspect_list:
- edit_membership: "redigera medlemskap för aspekt"
- few: "%{count} personer"
+ edit_membership: "Redigera medlemskap för aspekt"
helper:
is_not_sharing: "%{name} delar inte sina uppdateringar med dig."
is_sharing: "%{name} delar med sig till dig"
@@ -795,14 +858,13 @@ sv:
no_one_found: "...och ingen hittades."
no_results: "Hördu! Du måste söka efter någonting."
results_for: "Sökresultat för %{search_term}"
- search_handle: "Använd deras Diaspora-id (användarnamn@pod.domän) för att vara säker på att hitta dina kamrater."
- searching: "söker, var god och vänta..."
+ search_handle: "Använd deras Diaspora*-id (användarnamn@pod.domän) för att vara säker på att hitta dina kamrater."
+ searching: "Söker, var god och vänta..."
send_invite: "Hittar du ingen? Sänd en inbjudan!"
- many: "%{count} personer"
one: "En person"
other: "%{count} personer"
person:
- add_contact: "lägg till kontakt"
+ add_contact: "Lägg till kontakt"
already_connected: "Redan ansluten"
pending_request: "Väntande förfrågningar"
thats_you: "Det är du!"
@@ -811,10 +873,10 @@ sv:
born: "Födelsedag"
edit_my_profile: "Ändra min profil"
gender: "Kön"
- in_aspects: "i aspekter"
+ in_aspects: "I aspekter"
location: "Plats"
photos: "Foton"
- remove_contact: "ta bort kontakt"
+ remove_contact: "Ta bort kontakt"
remove_from: "Ta bort %{name} från %{aspect}?"
show:
closed_account: "Detta konto har stängts."
@@ -825,20 +887,19 @@ sv:
mention: "Omnämn"
message: "Skicka meddelande"
not_connected: "Du delar inte med dig till den här personen"
- recent_posts: "Senaste inläggen"
+ recent_posts: "Senaste inlägg"
recent_public_posts: "Senaste publika inläggen"
return_to_aspects: "Återgå till översikten"
see_all: "Visa alla"
- start_sharing: "börja dela"
+ start_sharing: "Börja dela"
to_accept_or_ignore: "för att acceptera eller ignorera det."
sub_header:
- add_some: "lägg till"
- edit: "redigera"
- you_have_no_tags: "du har inga taggar!"
- two: "%{count} personer"
+ add_some: "Lägg till några"
+ edit: "Redigera"
+ you_have_no_tags: "Du har inga taggar!"
webfinger:
fail: "Förlåt, vi kunde inte hitta %{handle}."
- zero: "Inga personer"
+ zero: "Inga"
photos:
comment_email_subject: "Ett foto av %{name}"
create:
@@ -852,7 +913,7 @@ sv:
new:
back_to_list: "Tillbaka till listan"
new_photo: "Nytt foto"
- post_it: "skicka!"
+ post_it: "Skicka!"
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."
@@ -861,15 +922,15 @@ sv:
or_select_one_existing: "eller välj ett av dina tidigare %{photos}"
upload: "Ladda upp en ny profilbild!"
photo:
- view_all: "visa alla %{name}s foton"
+ view_all: "Visa alla %{name}s bilder"
show:
- collection_permalink: "permanent samlingslänk"
- delete_photo: "Ta bort foto"
- edit: "ändra"
+ collection_permalink: "Permanent samlingslänk"
+ delete_photo: "Ta bort bild"
+ edit: "Ändra"
edit_delete_photo: "Ändra beskrivning / ta bort bild"
- make_profile_photo: "använd som profilbild"
+ make_profile_photo: "Använd som profilbild"
show_original_post: "Visa det ursprungliga inlägget"
- update_photo: "Uppdatera foto"
+ update_photo: "Uppdatera bild"
update:
error: "Misslyckades med att ändra fotot."
notice: "Fotot är nu uppdaterat."
@@ -878,8 +939,8 @@ sv:
title: "Ett inlägg från %{name}"
show:
destroy: "Ta bort"
- not_found: "Tyvärr, men vi kan inte hitta det inlägget."
- permalink: "permanent länk"
+ not_found: "Tyvärr, men vi kan inte hitta inlägget."
+ permalink: "Permanent länk"
photos_by:
few: "%{count} foton av %{author}"
many: "%{count} foton av %{author}"
@@ -888,13 +949,13 @@ sv:
two: "Två foton av %{author}"
zero: "Inga foton av %{author}"
reshare_by: "Delades vidare av %{author}"
- previous: "föregående"
+ previous: "Förra"
privacy: "Sekretess"
privacy_policy: "Integritetspolicy"
profile: "Profil"
profiles:
edit:
- allow_search: "Tillåter andra att söka efter dig inom Diaspora"
+ allow_search: "Tillåt andra att söka efter dig inom Diaspora*"
edit_profile: "Redigera profil"
first_name: "Förnamn"
last_name: "Efternamn"
@@ -911,7 +972,7 @@ sv:
your_private_profile: "Din privata profil"
your_public_profile: "Din publika profil"
your_tags: "Beskriv dig själv med fem ord"
- your_tags_placeholder: "som #filmer #katter #resande #lärare #newyork"
+ your_tags_placeholder: "Som #filmer #kattungar #resande #lärare #newyork"
update:
failed: "Kunde inte uppdatera profilen"
updated: "Profilen har uppdaterats"
@@ -921,9 +982,9 @@ sv:
other: "%{count} reaktioner"
zero: "Inga reaktioner"
registrations:
- closed: "Registreringsformuläret är avstängt på den här Diasporaservern."
+ closed: "Registreringsformuläret är avstängt på den här Diaspora*-servern."
create:
- success: "Du har nu gått med i Diaspora!"
+ success: "Du har nu gått med i Diaspora*!"
edit:
cancel_my_account: "Avsluta mitt konto"
edit: "Ändra %{name}"
@@ -933,24 +994,21 @@ sv:
update: "Uppdatera"
invalid_invite: "Den angivna inbjudningslänken gäller inte längre."
new:
- continue: "Fortsätt"
create_my_account: "Skapa mitt konto!"
- diaspora: "<3 Diaspora*"
- email: "E-POST"
+ email: "E-post"
enter_email: "Ange en e-postadress"
enter_password: "Skriv in ett lösenord, åtminstone sex tecken långt"
enter_password_again: "Skriv in samma lösenord som tidigare"
enter_username: "Välj ett användarnamn (endast bokstäver, nummer och understreck)"
- hey_make: "HALLÅ,<br/>SKAPA<br/>NÅGONTING."
join_the_movement: "Gå med i rörelsen!"
- password: "LÖSENORD"
- password_confirmation: "LÖSENORDSBEKRÄFTELSE"
- sign_up: "REGISTRERA"
+ password: "Lösenord"
+ password_confirmation: "Lösenordsbekräftelse"
+ sign_up: "Registrera"
sign_up_message: "Socialt nätverkande med ♥"
submitting: "Sänder..."
terms: "Skapar du ett konto, accepterar du våra %{terms_link}."
terms_link: "användarvillkor"
- username: "ANVÄNDARNAMN"
+ username: "Användarnamn"
report:
comment_label: "<b>Kommentar</b>:<br>%{data}"
confirm_deletion: "Vill de radera objektet?"
@@ -976,16 +1034,16 @@ sv:
success: "Nu delar du."
helper:
new_requests:
- one: "en ny förfrågan!"
+ one: "En ny förfrågan!"
other: "%{count} nya förfrågningar!"
- zero: "inga nya förfrågningar"
+ zero: "Inga nya förfrågningar"
manage_aspect_contacts:
existing: "Befintliga kontakter"
manage_within: "Hantera kontakter inom"
new_request_to_person:
- sent: "skickat!"
+ sent: "Skickat!"
reshares:
- comment_email_subject: "Den delning av %{author}s inlägg som %{resharer} har gjort"
+ comment_email_subject: "%{resharer} har delat vidare ett inlägg av %{author}"
create:
failure: "Ett fel uppstod när inlägget skulle spridas vidare."
reshare:
@@ -994,9 +1052,9 @@ sv:
one: "En har delat vidare"
other: "%{count} har delat vidare"
zero: "Dela vidare"
- reshare_confirmation: "Vill du dela %{author}s inlägg vidare?"
+ reshare_confirmation: "Vill du dela vidare %{author}s inlägg?"
reshare_original: "Dela originalet vidare"
- reshared_via: "delades vidare via"
+ reshared_via: "Delades vidare via"
show_original: "Visa det ursprungliga inlägget"
search: "Sök"
services:
@@ -1008,7 +1066,7 @@ sv:
destroy:
success: "Du har nu kopplat bort tjänsten."
failure:
- error: "det blev något fel vid anslutning till tjänsten"
+ error: "Det blev något fel vid anslutning till tjänsten"
finder:
fetching_contacts: "Diaspora fyller listan med dina %{service}-vänner. Var god och kom tillbaka om en stund."
no_friends: "Hittade inga vänner från Facebook."
@@ -1018,34 +1076,36 @@ sv:
connect_to_tumblr: "Anslut till Tumblr"
connect_to_twitter: "Anslut till Twitter"
connect_to_wordpress: "Koppla ihop med Wordpress"
- disconnect: "koppla från"
+ disconnect: "Koppla från"
edit_services: "Ändra tjänster"
- logged_in_as: "inloggad som"
+ logged_in_as: "Inloggad som"
no_services: "Du har inte kopplat ihop några tjänster."
- really_disconnect: "vill du koppla från %{service}?"
- services_explanation: "Genom att ansluta till andra tjänster, möjliggör det dig att skicka dina inlägg till dem samtidigt som på Diaspora."
+ really_disconnect: "Vill du koppla från %{service}?"
+ services_explanation: "Genom att ansluta till andra tjänster, möjliggör det dig att skicka dina inlägg till dem samtidigt som på Diaspora*."
inviter:
click_link_to_accept_invitation: "Följ länken för att acceptera din inbjudan"
join_me_on_diaspora: "Gå med mig på Diaspora*"
remote_friend:
- invite: "bjud in"
- not_on_diaspora: "Ännu inte på Diaspora"
- resend: "skicka igen"
+ invite: "Bjud in"
+ not_on_diaspora: "Ännu inte på Diaspora*"
+ resend: "Skicka igen"
settings: "Inställningar"
share_visibilites:
update:
- post_hidden_and_muted: "%{name}s inlägg har dolts och notiser har tystats."
- see_it_on_their_profile: "Om du vill se uppdateringar för detta inlägg besöker du %{name}s profilsida."
+ post_hidden_and_muted: "%{name}s inlägg har dolts kommer inte längre ge notiser."
+ see_it_on_their_profile: "Om du vill se uppdateringar för detta inlägg, besök %{name}s profilsida."
shared:
add_contact:
add_new_contact: "Lägg till en ny kontakt"
- create_request: "Sök på Diaspora-id"
+ create_request: "Sök på Diaspora*-id"
diaspora_handle: "diaspora@pod.org"
- enter_a_diaspora_username: "Ange ett Diasporaanvändarnamn:"
+ enter_a_diaspora_username: "Ange ett användarnamn för Diaspora*:"
know_email: "Kan du deras e-postadress? Du borde bjuda in dem"
- your_diaspora_username_is: "Ditt Diasporaanvändarnamn är: %{diaspora_handle}"
+ your_diaspora_username_is: "Ditt användarnamn på Diaspora* är: %{diaspora_handle}"
aspect_dropdown:
add_to_aspect: "Lägg till kontakt"
+ mobile_row_checked: "%{name} (ta bort)"
+ mobile_row_unchecked: "%{name} (lägg till)"
toggle:
few: "I %{count} aspekter"
many: "I %{count} aspekter"
@@ -1056,24 +1116,24 @@ sv:
contact_list:
all_contacts: "Alla kontakter"
footer:
- logged_in_as: "inloggad som %{name}"
- your_aspects: "dina aspekter"
+ logged_in_as: "Inloggad som %{name}"
+ your_aspects: "Dina aspekter"
invitations:
by_email: "Via e-post"
- dont_have_now: "Du har inga inbjudningar just nu, men fler kommer delas ut inom kort!"
+ dont_have_now: "Du har inga inviter just nu, men fler kommer delas ut inom kort!"
from_facebook: "Från Facebook"
invitations_left: "%{count} kvar"
invite_someone: "Bjud in en kontakt"
invite_your_friends: "Bjud in dina vänner"
invites: "Inbjudningar"
- invites_closed: "För närvarande är inbjudningar avstängda på denna Diasporaserver"
+ invites_closed: "För närvarande är inbjudningar avstängda på denna Diaspora*-server"
share_this: "Dela med dig av länken via e-post, din blog eller de sociala nätverken!"
notification:
new: "Ny %{type} från %{from}"
public_explain:
atom_feed: "Atom-flöde"
- control_your_audience: "Kontrollera din publik"
- logged_in: "inloggad på %{service}"
+ control_your_audience: "Välj din publik"
+ logged_in: "Inloggad på %{service}"
manage: "hantera anslutna tjänster"
new_user_welcome_message: "Använd #hashtaggar för att klassificera dina inlägg och hitta folk som delar dina intressen. Ropa ut till häftiga personer med @Mentions"
outside: "Publika meddelanden kan läsas av användare utanför Diaspora."
@@ -1081,17 +1141,17 @@ sv:
title: "Hantera anslutna tjänster"
visibility_dropdown: "Använd den här rullisten för att bestämma vilka som kan se ditt inlägg (vi föreslår att du gör det här första inlägget publikt)."
publisher:
- all: "alla"
- all_contacts: "alla kontakter"
+ all: "Samtliga"
+ all_contacts: "Alla kontakter"
discard_post: "Släng inlägg"
formatWithMarkdown: "Använd %{markdown_link} för att formatera dina inlägg."
get_location: "Hämta din position"
- make_public: "gör publik"
+ make_public: "Gör publik"
new_user_prefill:
hello: "Hej allihop, jag är #%{new_user_tag}. "
i_like: "Jag är intresserad av %{tags}."
invited_by: "Tack för inbjudan, "
- newhere: "NyHär"
+ newhere: "nyhär"
poll:
add_a_poll: "Lägg till en undersökning"
add_poll_answer: "Lägg till alternativ"
@@ -1101,17 +1161,17 @@ sv:
post_a_message_to: "Skicka ett meddelande till %{aspect}"
posting: "Skickar..."
preview: "Förhandsgranska"
- publishing_to: "publicerar till: "
+ publishing_to: "Publiceras på: "
remove_location: "Borttag plats"
share: "Dela"
- share_with: "dela med"
+ share_with: "Dela med"
upload_photos: "Ladda upp foton"
whats_on_your_mind: "Vad har du på hjärtat?"
reshare:
reshare: "Dela vidare"
stream_element:
connect_to_comment: "Anslut till den här användaren för att kunna kommentera deras inlägg"
- currently_unavailable: "det går för närvarande inte att kommentera"
+ currently_unavailable: "Det går för närvarande inte att kommentera"
dislike: "Sluta gilla"
hide_and_mute: "Dölj och ignorera"
ignore_user: "Ignorera %{name}"
@@ -1119,10 +1179,10 @@ sv:
like: "Gilla"
nsfw: "Detta inlägg har blivit flaggat som olämpligt för arbetsplatser av dess författare. %{link}"
shared_with: "Delas med: %{aspect_names}"
- show: "visa"
+ show: "Visa"
unlike: "Sluta gilla"
- via: "via %{link}"
- via_mobile: "via mobiltelefon"
+ via: "Via %{link}"
+ via_mobile: "Via mobiltelefon"
viewable_to_anyone: "Detta inlägg är synligt för alla på nätet"
simple_captcha:
label: "Skriv in koden i rutan:"
@@ -1131,6 +1191,21 @@ sv:
failed: "Människoverifieringen misslyckades"
user: "Den hemliga bilden och koden stämde inte överens."
placeholder: "Fyll i bildvärdet."
+ statistics:
+ active_users_halfyear: "Aktiva användare per halvår"
+ active_users_monthly: "Aktiva användare per månad"
+ closed: "Stängd"
+ disabled: "Otillgänglig"
+ enabled: "Tillgänglig"
+ local_comments: "Lokala kommentarer"
+ local_posts: "Lokala inlägg"
+ name: "Namn"
+ network: "Nätverk"
+ open: "Öppna"
+ registrations: "Registreringar"
+ services: "Tjänster"
+ total_users: "Totala antalet användare"
+ version: "Version"
status_messages:
create:
success: "Lyckades nämna: %{names}"
@@ -1140,12 +1215,11 @@ sv:
no_message_to_display: "Inget meddelande att visa."
new:
mentioning: "Nämner: %{person}"
- too_long:
- one: "ditt statusmeddelande får inte vara längre än en bokstav"
- other: "ditt statusmeddelande får inte vara längre än %{count} bokstäver"
- zero: "ditt statusmeddelande får inte vara längre än %{count} bokstäver"
+ too_long: "Var god håll längden på meddelandet under %{count} tecken. Just nu är det %{current_length} tecken långt."
stream_helper:
hide_comments: "Dölj alla kommentarer"
+ no_more_posts: "Du har nått strömmens slut."
+ no_posts_yet: "Det finns inga inlägg ännu."
show_comments:
few: "Visa %{count} ytterligare kommentarer"
many: "Visa %{count} ytterligare kommentarer"
@@ -1171,7 +1245,7 @@ sv:
followed_tags_stream: "#Följda taggar"
like_stream:
contacts_title: "Personer vars inlägg du gillar"
- title: "Omtyckta strömmar"
+ title: "Gilla flöde"
mentioned_stream: "@Omnämnanden"
mentions:
contacts_title: "Personer som nämnt dig"
@@ -1180,33 +1254,30 @@ sv:
contacts_title: "Personer i din ström"
title: "Ström"
public:
- contacts_title: "Postade nyligen"
+ contacts_title: "Nyligen aktiva"
title: "Publik aktivitet"
tags:
contacts_title: "Användare som gillar den här taggen"
- tag_prefill_text: "Det intressanta med %{tag_name} är... "
title: "Inlägg taggade med: %{tags}"
tag_followings:
create:
failure: "Misslyckades med att följa #%{name}. Du kanske redan gör det."
none: "Du kan inte följa en tom tagg!"
- success: "Hurra! Du följer nu #%{name}."
+ success: "Hurra! Du följer nu #%{name}."
destroy:
failure: "Misslyckades att sluta följa #%{name}. Du kanske redan slutat följa det."
- success: "Ack. Du följer inte längre #%{name}."
+ success: "Sådär! Du följer inte längre #%{name}."
tags:
+ name_too_long: "Använd taggar med namn kortare än %{count} tecken. Just nu är den %{current_length} lång."
show:
follow: "Följ #%{tag}"
- followed_by_people:
- one: "följd av en person"
- other: "följd av %{count} personer"
- zero: "inte följd av någon"
following: "Följer #%{tag}"
- nobody_talking: "Ingen talar om %{tag} än."
none: "Den tomma taggen finns inte!"
- people_tagged_with: "Personer taggade med %{tag}"
- posts_tagged_with: "Poster taggade med #%{tag}"
stop_following: "Sluta följa #%{tag}"
+ tagged_people:
+ one: "En person är taggad med %{tag}"
+ other: "%{count} personer är taggade med %{tag}"
+ zero: "Ingen har taggats med %{tag}"
terms_and_conditions: "Villkor"
undo: "Ångra?"
username: "Användarnamn"
@@ -1216,11 +1287,11 @@ sv:
email_not_confirmed: "E-postadressen kunde inte aktiveras. Var det en felaktig länk?"
destroy:
no_password: "Vänligen ange ditt nuvarande lösenord för att avsluta ditt konto."
- success: "Ditt konto har låsts. Det kan ta upp till 20 minuter för oss att avsluta ditt konto. Tack för att du testade Diaspora."
+ success: "Ditt konto har låsts. Det kan ta upp emot 20 minuter för oss att avsluta ditt konto helt. Tack för att du testade Diaspora*!"
wrong_password: "Det angivna lösenordet stämde inte med ditt nuvarande lösenord."
edit:
- also_commented: "någon kommenterar ett inlägg som du också kommenterat"
- auto_follow_aspect: "Aspekten för dem användare som följts automatiskt:"
+ also_commented: "någon kommenterar ett inlägg som du redan kommenterat"
+ auto_follow_aspect: "Aspekt för de användare som följts automatiskt:"
auto_follow_back: "Följ automatiskt dem som börjar följa dig"
change: "Ändra"
change_email: "Ändra e-postadress"
@@ -1229,30 +1300,37 @@ sv:
character_minimum_expl: "måste vara åtminstone sex tecken"
close_account:
dont_go: "Snälla, lämna oss inte!"
- if_you_want_this: "Om du verkligen är säker, skriv in ditt lösenord nedan och klicka på 'Stäng kontot'"
- lock_username: "Ditt användarnamn kommer att låsas ifall du bestämmer dig för att komma tillbaka."
- locked_out: "Du kommer att loggas ut och stängas ute från ditt konto."
- make_diaspora_better: "Vi vill att du hjälper oss att göra Diaspora bättre. Istället för att lämna oss borde du hjälpa oss. Men om du verkligen vill lämna oss, vill vi att du ska veta vad som kommer att hända."
+ if_you_want_this: "Är du säker på din sak, skriv ditt lösenord nedan och tryck på \"Stäng kontot\""
+ lock_username: "Ditt användarnamn kommer att låsas för att inte kunna användas på denna pod igen."
+ locked_out: "Du kommer att loggas ut och låsas från ditt konto tills det har blivit borttaget."
+ make_diaspora_better: "Det vore fint om du istället för att lämna diaspora* ville hjälpa oss att utveckla och göra det bättre. Men om du nu verkligen bestämt dig kommer följande hända:"
mr_wiggles: "Herr Wiggles kommer att bli ledsen"
- no_turning_back: "Nu finns det ingen återvändo."
- what_we_delete: "Vi kommer att radera alla dina inlägg och din profil så fort som det bara går. Dina kommentarer kommer att finnas kvar men vara associerade med ditt Diaspora-id och inte ditt namn."
+ no_turning_back: "Nu finns ingen återvändo. Om du är säker på din sak, ange ditt lösenord nedanför."
+ what_we_delete: "Vi kommer att radera dina inlägg och profil så snart det bara går. Dina kommentarer kommer finnas kvar, men associerade med ditt Diaspora*-id istället för ditt namn."
close_account_text: "Stäng kontot"
comment_on_post: "någon kommenterar dina inlägg"
current_password: "Nuvarande lösenord"
current_password_expl: "den som du loggar in med..."
- download_photos: "ladda ner mina foton"
- download_xml: "ladda ner min xml"
+ download_export: "Ladda ned min profil"
+ download_export_photos: "Ladda ned mina bilder"
+ download_photos: "Ladda ned mina foton"
edit_account: "Ändra konto"
email_awaiting_confirmation: "Vi har skickat dig en länk till %{unconfirmed_email} för aktivering. Innan du har aktiverat din nya adress, kommer vi fortsätta att använda %{email}."
export_data: "Exportera data"
+ export_in_progress: "Just nu behandlar vi din data. Kom tillbaka om ett slag."
+ export_photos_in_progress: "Vi behandlar just nu dina bilder. Kom tillbaka om en stund."
following: "Delningsinställningar"
getting_started: "Inställningar för nya användare"
+ last_exported_at: "(Senast uppdaterad %{timestamp})"
liked: "någon gillar dina inlägg"
mentioned: "du nämns i ett inlägg."
new_password: "Nytt lösenord"
- photo_export_unavailable: "Det går för tillfället inte att exportera foton"
private_message: "du mottager ett privat meddelande."
receive_email_notifications: "Skicka notiser via e-post när:"
+ request_export: "Efterfråga min profildata"
+ request_export_photos: "Begär mina bilder"
+ request_export_photos_update: "Uppdatera mina bilder"
+ request_export_update: "Uppdatera min profildata"
reshared: "någon delar vidare dina inlägg"
show_community_spotlight: "Visa gemenskapens rampljus i ditt flöde"
show_getting_started: "Visa tips för att komma igång"
@@ -1260,13 +1338,13 @@ sv:
started_sharing: "någon börjar dela med sig till dig"
stream_preferences: "Ströminställningar"
your_email: "Din e-post"
- your_handle: "Ditt Diaspora-id"
+ your_handle: "Ditt Diaspora*-id"
getting_started:
awesome_take_me_to_diaspora: "Häftigt! Ta mig till Diaspora*"
- community_welcome: "Vi i Diasporagemenskapen är glada att ha dig här!"
+ community_welcome: "Vi i Diaspora*-gemenskapen är glada att ha dig här!"
connect_to_facebook: "Vi kan skynda på processen genom %{link} till Diaspora. Det kommer att hämta ditt namn, din bild och tillåta korsinlägg."
- connect_to_facebook_link: "länkar ihop ditt Facebook-konto"
- hashtag_explanation: "Hashtaggar gör det möjligt att diskutera och följa dina intressen. Det är också ett bra sätt att lära känna nya människor på Diaspora."
+ connect_to_facebook_link: "Länka ihop ditt Facebook-konto"
+ hashtag_explanation: "Taggar gör det möjligt att diskutera och följa dina intressen. Det är också ett bra sätt att lära känna nya människor på Diaspora*."
hashtag_suggestions: "Testa att följa taggar såsom #konst, #film, #gif, etc."
saved: "Sparat!"
well_hello_there: "Hej på dig!"
@@ -1274,7 +1352,9 @@ sv:
who_are_you: "Vem är du?"
privacy_settings:
ignored_users: "Ignorerade användare"
- stop_ignoring: "Sluta ignorera"
+ no_user_ignored_message: "Du har inga ignorerade kontakter."
+ stop_ignoring: "sluta ignorera"
+ strip_exif: "Rensa bort metadata, såsom plats, upphovsman och kameramodell från de uppladdade bilderna (rekommenderat)"
title: "Sekretessinställningar"
public:
does_not_exist: "Användaren %{username} finns inte!"
@@ -1292,10 +1372,10 @@ sv:
unconfirmed_email_not_changed: "Byte av e-postadress misslyckades"
webfinger:
fetch_failed: "Kunde inte hämta webfinger-profil för %{profile_url}"
- hcard_fetch_failed: "Kunde inte hämta hcard för #{@account}"
+ hcard_fetch_failed: "Kunde inte hämta hcard för %{account}"
no_person_constructed: "Kunde inte skapa en person från detta hcard."
- not_enabled: "webfinger verkar inte vara påslaget på %{account}s server"
- xrd_fetch_failed: "kunde inte hämta xrd-fil från kontot %{account}"
+ not_enabled: "Webfinger verkar inte vara aktiverat på %{account}s server"
+ xrd_fetch_failed: "Kunde inte hämta xrd-fil från kontot %{account}"
welcome: "Välkommen!"
will_paginate:
next_label: "nästa »"
diff --git a/config/locales/diaspora/ta.yml b/config/locales/diaspora/ta.yml
index da8b547fc..8d9489497 100644
--- a/config/locales/diaspora/ta.yml
+++ b/config/locales/diaspora/ta.yml
@@ -50,8 +50,6 @@ ta:
are_you_sure: "நீங்கள் உறுதியாக இருக்கிறீர்களா?"
are_you_sure_delete_account: "நீங்கள் உங்கள் கணக்கை மூட வேண்டுமா? இதை தவிர்க்க முடியாது!"
aspects:
- aspect_contacts:
- done_editing: "திருத்தம் முடிந்தது"
aspect_listings:
deselect_all: "அனைத்தையும் தேர்வுநீக்கம் செய்க"
edit_aspect: "மாற்று %{name}"
@@ -62,18 +60,14 @@ ta:
failure: "%{name} காலியாக இல்லை ஆகையால் நீக்க முடியவில்லை"
success: "%{name} வெற்றிகரமாக நீக்கப்பட்டது"
edit:
- add_existing: "ஏற்கனவே இருக்கும் தொடர்பை சேர்க்க."
aspect_list_is_not_visible: "அம்சம் பட்டியல் அம்சங்களிலுள்ள மற்றவர்களுக்கு மறைக்கப்பட்டது"
aspect_list_is_visible: "அம்சம் பட்டியல் அம்சங்களிலுள்ள மற்றவர்களால் பார்க்க இயலும்"
confirm_remove_aspect: "நீங்கள் இந்த அம்சத்தை நீக்க வேண்டுமா?"
- done: "முடிக்கப்பட்டது."
make_aspect_list_visible: "இந்த அம்சத்தில் உள்ள தொடர்புகளை ஒருவருகொற்ருவர் பார்க்க இயலுமா?"
remove_aspect: "இந்த அம்சத்தை நீக்கு"
rename: "மறுபெயர்"
update: "புதுப்பிக்க"
updating: "புதுப்பித்தல் நடக்கிறது"
- helper:
- remove: "அகற்று"
index:
donate: "நன்கொடை"
help:
@@ -92,14 +86,12 @@ ta:
no_posts_message:
start_talking: "யாரும் எதுவும் கூறவில்லை!"
one: "ஒரு அம்சம்"
+ other: "%{count} அம்சங்கள்"
seed:
acquaintances: "அறிமுகமானவர்கள்"
family: "குடும்பம்"
friends: "நண்பர்கள்"
work: "வேலை"
- show:
- edit_aspect: "அம்சத்தை திருத்த"
- two: "%{count} அம்சங்கள்"
zero: "இல்லாத அம்சங்கள்"
back: "பின்"
cancel: "ரத்துசெய்"
@@ -110,6 +102,7 @@ ta:
correct_the_following_errors_and_try_again: "கொடுக்கப்பட்டுள்ள பிழைகளை சரிசெய்து மீண்டும் முயற்சிக்கவும்."
invalid_fields: "தவறான புலங்கள்"
fill_me_out: "என்னை நிரப்பு"
+ find_people: "நபர்களை/குறிச்சொற்களை கண்டுபிடி"
hide: "மறை"
limited: "வரம்புக்குட்பட்ட"
more: "மேலும்"
diff --git a/config/locales/diaspora/te.yml b/config/locales/diaspora/te.yml
index 74fb0d6b4..18ec229e2 100644
--- a/config/locales/diaspora/te.yml
+++ b/config/locales/diaspora/te.yml
@@ -102,8 +102,6 @@ te:
add_to_aspect:
failure: "పరిచయాన్ని కోణానికి జతచేయుటలో విఫలమైంది."
success: "పరిచయం కోణానికి విజయవంతంగా జోడించబడింది."
- aspect_contacts:
- done_editing: "సవరణ పూర్తయింది"
aspect_listings:
add_an_aspect: "+ కొత్త కోణాన్ని చేర్చండి"
deselect_all: "ఎంపిక మొత్తం రద్దుచేయి"
@@ -122,21 +120,14 @@ te:
failure: "%{name} ఖాళీగా లేదు అందువల్ల తీయలేకపోయాము"
success: "%{name} విజయవంతంగా తొలగించబడినది"
edit:
- add_existing: "ఇప్పటికే ఉన్న పరిచయాన్ని జతచేయి"
aspect_list_is_not_visible: "ఈ కోణంలోని పరిచయాలు ఒకరికొకరు చూడలేరు."
aspect_list_is_visible: "ఈ కోణంలోని పరిచయాలు ఒకరికొకరు చూడగలరు."
confirm_remove_aspect: "మీరు నిజంగానే ఈ కోణాన్ని తొలగించాలని అనుకుంటున్నారా?"
- done: "పూర్తయ్యింది"
make_aspect_list_visible: "ఈ కోణంలో ఉన్న పరిచయాలు ఒకరికొకరు కనిపిచ్చేలా చెయ్యాలా?"
remove_aspect: "ఈ కోణాన్ని తొలగించు"
rename: "పేరుమార్చు"
update: "నవీకరించు"
updating: "నవీకరిస్తున్నాము"
- few: "%{count} కోణాలు"
- helper:
- are_you_sure: "ఈ కోణాన్ని ఖచ్ఛితంగా తొలగించాలా?"
- aspect_not_empty: "కోణం ఖాళీగాలేదు"
- remove: "తీసివేయి"
index:
diaspora_id:
content_1: "మీ డయాస్పోరా* గుర్తింపు:"
@@ -175,11 +166,6 @@ te:
heading: "సేవలకు అనుసంధానం కండి"
unfollow_tag: "%{tag}ని అనుసరించడం మానేయి"
welcome_to_diaspora: "%{name}, డయాస్పొరా*కు స్వాగతం!"
- many: "%{count} కోణాలు"
- move_contact:
- error: "కోణాన్ని తరలించేటప్పుడు పొరపాటు జరిగింది: %{inspect}"
- failure: "%{inspect} పని చేయలేదు"
- success: "వ్యక్తి కొత్త కోణానికి తరలివెళ్ళారు"
new:
create: "సృష్టించు"
name: "పేరు (మీకు మాత్రమే కనిపిస్తుంది)"
@@ -197,14 +183,6 @@ te:
family: "కుటుంబం"
friends: "స్నేహితులు"
work: "సహోద్యోగులు"
- selected_contacts:
- manage_your_aspects: "మీ కోణాల్ని నిర్వహించండి."
- no_contacts: "మీకు ఇక్కడ ఇంకా పరిచయాలు లేరు."
- view_all_community_spotlight: "మొత్తం సంఘపు స్పాట్​లైట్ చూడండి"
- view_all_contacts: "అన్ని పరిచయాలను వీక్షించండి"
- show:
- edit_aspect: "కోణాన్ని మార్చు"
- two: "%{count} కోణాలు"
update:
failure: "మీకోణం, %{name}, భద్రపరుచుటకు చాలా పెద్ద పేరు ఇచ్చారు."
success: "మీకోణం, %{name}, విజయవంతంగా సవరించబడింది."
@@ -224,36 +202,27 @@ te:
post_success: "టపా వేయబడింది! మూసివేస్తున్నాం!"
cancel: "రద్దుచేయి"
comments:
- few: "%{count} వ్యాఖ్యలు"
- many: "%{count} వ్యాఖ్యలు"
new_comment:
comment: "వ్యాఖ్య"
commenting: "వ్యాఖ్యానిస్తున్నాము..."
one: "1 వ్యాఖ్య"
other: "%{count} వ్యాఖ్యలు"
- two: "%{count} వ్యాఖ్యలు"
zero: "వ్యాక్యలేమీ లేవు"
contacts:
create:
failure: "పరిచయాన్ని సృష్టించుటలో విఫలమైంది"
- few: "%{count} పరిచయాలు"
index:
add_a_new_aspect: "ఒక కొత్త కోణాన్ని జతచేయి"
add_to_aspect: "%{name}కి పరిచయాలను జతచేయి"
- add_to_aspect_link: "%{name}కు పరిచయాలను జతచేయి"
all_contacts: "అన్ని పరిచయాలు"
community_spotlight: "సంఘపు స్పాట్​లైట్"
- many_people_are_you_sure: "మీరు ఖచ్ఛితంగా %{suggested_limit} పరిచయాలతో కంటే ఎక్కువ పరిచయాలతో రహస్య సంభాషణం ప్రారంభించాలనుకుంటున్నారా? వారిని సంప్రదించడానికి ఈ కోణానికి టపా వేయడం ఉత్తమ మార్గం."
my_contacts: "నా పరిచయాలు"
no_contacts: "మీరు ఇంకా ఎవర్నీ పరిచయాలలో చేర్చుకున్నట్లు లేరు!"
no_contacts_message: "%{community_spotlight}ని సందర్శించండి"
- no_contacts_message_with_aspect: "%{add_to_aspect_link} లేక %{community_spotlight}ని సందర్శించండి"
only_sharing_with_me: "నాతో మాత్రమే పంచుకునే వారు"
- remove_person_from_aspect: "\"%{aspect_name}\" నుంచి %{person_name}ని తొలగించు"
start_a_conversation: "సంభాషణను ప్రారంభించండి"
title: "పరిచయాలు"
your_contacts: "మీ పరిచయాలు"
- many: "%{count} పరిచయాలు"
one: "1 పరిచయం"
other: "%{count} పరిచయాలు"
sharing:
@@ -261,7 +230,6 @@ te:
spotlight:
community_spotlight: "సంఘపు స్పాట్​లైట్"
suggest_member: "ఒక సభ్యున్ని సూచించండి"
- two: "%{count} పరిచయాలు"
zero: "పరిచయాలు"
conversations:
conversation:
@@ -270,8 +238,6 @@ te:
fail: "చెల్లని సందేశం"
no_contact: "ఓయ్, ముందుగా మీరు పరిచయాన్ని జతచేసుకోవాలి!"
sent: "సందేశం పంపబడింది"
- destroy:
- success: "సంభాషణ విజయవంతంగా తీసివేయబడింది"
helper:
new_messages:
few: "%{count} కొత్త సందేశాలు"
@@ -545,7 +511,6 @@ te:
add_contact_from_tag: "కొస ద్వారా పరిచయాన్ని జతచేయి"
aspect_list:
edit_membership: "కోణం సభ్యత్వం సవరించు"
- few: "%{count} people"
helper:
is_not_sharing: "%{name} మీతో పంచుకోవడం లేదు"
is_sharing: "%{name} మీతో పంచుకుంటున్నారు"
@@ -556,7 +521,6 @@ te:
no_results: "ఓయ్! మీరు వేరే పేరుతో వెతకాల్సివుంది."
results_for: "%{search_term}తో సరిపోలిన వాడుకరులు"
searching: "వెతుకుతున్నాం, దయచేసి ఓపిక వహించండి…"
- many: "%{count} people"
one: "1 person"
other: "%{count} people"
person:
@@ -592,7 +556,6 @@ te:
add_some: "మరికొన్ని చేర్చండి"
edit: "సవరించు"
you_have_no_tags: "మీరు ఏ కొసలను వాడలేదు"
- two: "%{count} people"
webfinger:
fail: "క్షమించండి, మేము %{handle}ను కనుగొనలేకపోయాం"
zero: "ఎవరూ లేరు"
@@ -684,15 +647,12 @@ te:
update: "నవీకరించుకోండి"
invalid_invite: "మీరు ఇచ్చిన ఆహ్వానపు లంకె చెల్లుబాటులో లేదు!"
new:
- continue: "కొనసాగు"
create_my_account: "నా ఖాతాను సృష్టించు!"
- diaspora: "<3 డయాస్పోరా*"
email: "ఈమెయిల్"
enter_email: "ఒక ఈమెయిలును ప్రవేశపెట్టండి"
enter_password: "సంకేతపదాన్ని ఇవ్వండి (కనీసం ఆరు అక్షరాలు)"
enter_password_again: "అదే సంకేతపదాన్ని మళ్ళీ ఇవ్వండి"
enter_username: "ఒక వాడుకరిపేరును ఎంచుకోండి (అక్షరాలు, సంఖ్యలు, మరియు క్రిందిగీతలు మాత్రమే స్వీకరించబడును)"
- hey_make: "హేయ్, <br/>ఏమైనా<br/>చెయ్యండి."
join_the_movement: "ఈ ఉద్యమంలో చేరండి!"
password: "సంకేతపదం"
password_confirmation: "సంకేతపదం నిర్ధారణ"
@@ -849,10 +809,7 @@ te:
no_message_to_display: "చూపించడానికి ఏ సందేశాలు లేవు."
new:
mentioning: "పేర్కోలు: %{person}"
- too_long:
- one: "దయచేసి మీ స్థితి సందేశాలలో అక్షరాల సంఖ్య %{count} కంటే తక్కువ ఉండేటట్లు చూసుకోండి"
- other: "దయచేసి మీ స్థితి సందేశాలలో అక్షరాల సంఖ్య %{count} కంటే తక్కువ ఉండేటట్లు చూసుకోండి"
- zero: "దయచేసి మీ స్థితి సందేశాలలో అక్షరాల సంఖ్య %{count} కంటే తక్కువ ఉండేటట్లు చూసుకోండి"
+ too_long: "{\"one\"=>\"దయచేసి మీ స్థితి సందేశాలలో అక్షరాల సంఖ్య %{count} కంటే తక్కువ ఉండేటట్లు చూసుకోండి\", \"other\"=>\"దయచేసి మీ స్థితి సందేశాలలో అక్షరాల సంఖ్య %{count} కంటే తక్కువ ఉండేటట్లు చూసుకోండి\", \"zero\"=>\"దయచేసి మీ స్థితి సందేశాలలో అక్షరాల సంఖ్య %{count} కంటే తక్కువ ఉండేటట్లు చూసుకోండి\"}"
stream_helper:
hide_comments: "అన్ని వ్యాఖ్యలను దాచు"
show_comments:
@@ -899,15 +856,8 @@ te:
tags:
show:
follow: "#%{tag}ను అనుసరించు"
- followed_by_people:
- one: "ఒకరిచే అనుసరించబడుతున్నారు"
- other: "%{count} వ్యక్తులచే అనుసరించబడుతున్నారు"
- zero: "ఎవరిచేత అనుసరించబడుటలేదు"
following: "#%{tag}ను అనుసరిస్తున్నారు"
- nobody_talking: "%{tag} గురించి ఇంకా ఎవరూ మాట్లాడుకోవడం లేదు."
none: "ఖాళీ కొస చెల్లదు!"
- people_tagged_with: "%{tag} తో కొసవేయబడిన వ్యక్తులు"
- posts_tagged_with: "#%{tag} తో కొసవేయబడిన టపాలు"
stop_following: "#%{tag}ను అనుసరించడం మానివేయి"
terms_and_conditions: "నియమాలు మరియు నిబంధనలు"
undo: "రద్దుచేయాలా?"
@@ -938,7 +888,6 @@ te:
comment_on_post: "ఎవరో మీ టపాపై వ్యాఖ్యానించారు"
current_password: "ప్రస్తుత సంకేతపదం"
download_photos: "నా ఛాయాచిత్రాలను దింపుము"
- download_xml: "నా xml దింపు"
edit_account: "ఖాతాను సవరించు"
email_awaiting_confirmation: "మేము మీకొక క్రియాశీలించు లంకెను %{unconfirmed_email} కు పంపాము. మీరు ఈ లంకెను అనుసరించి కొత్త చిరునామాను క్రియాశీలించేంతవరకూ, మీ అసలు చిరునామా %{email} ను వాడతాము."
export_data: "దత్తాంశాన్ని ఎగుమతించు"
@@ -947,7 +896,6 @@ te:
liked: "ఎవరో మీ టపాను మెచ్చుకున్నారు"
mentioned: "మీరు టపాలో ప్రస్తావించబడ్డారు"
new_password: "కొత్త సంకేతపదం"
- photo_export_unavailable: "ఛాయాచిత్ర ఎగుమతి ప్రస్తుతం అందుబాటులో లేదు"
private_message: "మీకు రహస్య సందేశం వచ్చింది"
receive_email_notifications: "ఈమెయిలు గమనింపులను ఎప్పుడు అందుకుంటారు:"
reshared: "ఎవరో మీ టపాను మరలా పంచుకున్నారు"
diff --git a/config/locales/diaspora/tr.yml b/config/locales/diaspora/tr.yml
index 33dfd37d3..852ac2a77 100644
--- a/config/locales/diaspora/tr.yml
+++ b/config/locales/diaspora/tr.yml
@@ -12,6 +12,7 @@ tr:
_home: "Ev"
_photos: "fotoğraflar"
_services: "Servisler"
+ _terms: "Kurallar"
account: "Hesap"
activerecord:
errors:
@@ -74,6 +75,15 @@ tr:
other: "%{count} kişi"
zero: "%{count} kişi"
week: "Hafta"
+ user_entry:
+ diaspora_handle: "diaspora* kaydı"
+ guid: "GUID"
+ id: "kimlik"
+ ? "no"
+ : Hayır
+ unknown: "Bilinmiyor"
+ ? "yes"
+ : Evet
user_search:
add_invites: "davetiye ekle"
email_to: "E-posta ile Davet"
@@ -107,8 +117,6 @@ tr:
add_to_aspect:
failure: "Yöne kişi ekleme başarısız."
success: "Kişi başarıyla yöne eklendi."
- aspect_contacts:
- done_editing: "düzenleme sonlandırıldı"
aspect_listings:
add_an_aspect: "+ Yeni yön ekle"
deselect_all: "Tümünü kaldır"
@@ -127,21 +135,14 @@ tr:
failure: "%{name} boş değil, silinemedi."
success: "%{name} başarıyla silindi."
edit:
- add_existing: "Mevcut bir bağlantı ekle"
aspect_list_is_not_visible: "yön listesi yöndeki diğer kişilere gösterilmiyor"
aspect_list_is_visible: "yön listesi yöndeki diğer kişilere gösteriliyor"
confirm_remove_aspect: "Bu yönü silmek istediğinden emin misin?"
- done: "Bitti"
make_aspect_list_visible: "Bu yöndeki kişilerin birbirlerini görmesine izin verilsin mi?"
remove_aspect: "Yönü sil"
rename: "yeniden adlandır"
update: "güncelle"
updating: "güncelleniyor"
- few: "%{count} yön"
- helper:
- are_you_sure: "Bu yönü silmek istediğinden emin misin?"
- aspect_not_empty: "Yön boş değil"
- remove: "sil"
index:
diaspora_id:
content_1: "Diaspora ID'niz:"
@@ -182,11 +183,6 @@ tr:
heading: "Servisleri ilişkilendir"
unfollow_tag: "#%{tag}'i takip etmeyi bırak"
welcome_to_diaspora: "Diaspora'ya Hoş Geldin, %{name}!"
- many: "%{count} yön"
- move_contact:
- error: "Kişi taşıma problemi: %{inspect}"
- failure: "hata oluştu %{inspect}"
- success: "Kişi yeni yöne taşındı"
new:
create: "Oluştur:"
name: "İsim (sadece siz görebilirsiniz)"
@@ -204,14 +200,6 @@ tr:
family: "Aile"
friends: "Arkadaşlar"
work: "İş"
- selected_contacts:
- manage_your_aspects: "Yönleri düzenle."
- no_contacts: "Henüz biriyle iletişim yok."
- view_all_community_spotlight: "Tüm topluluk spotlight bakın"
- view_all_contacts: "Tüm kişileri görüntüle"
- show:
- edit_aspect: "yön düzenle"
- two: "%{count} yönleri"
update:
failure: "%{name} yönünün ismi çok uzundu ve kaydedilmedi."
success: "Yönünüz, %{name}, başarıyla düzeltildi."
@@ -231,36 +219,27 @@ tr:
post_success: "Gönderildi! Kapatılıyor!"
cancel: "İptal Et"
comments:
- few: "%{count} yorum"
- many: "%{count} yorum"
new_comment:
comment: "Yorum yaz"
commenting: "Yorumlanıyor..."
one: "1 yorum"
other: "%{count} yorum"
- two: "%{count} yorum"
zero: "yorum yok"
contacts:
create:
failure: "Kişi oluşturma başarısız"
- few: "%{count} kişi"
index:
add_a_new_aspect: "Yeni yön ekle"
add_to_aspect: "%{name} unsuruna kişi ekle"
- add_to_aspect_link: "kişileri %{name} yönüne ekle"
all_contacts: "Tüm Kişiler"
community_spotlight: "Topluluk Haberleri"
- many_people_are_you_sure: "%{suggested_limit} sayısından yüksek kişiyle özel görüşme başlatmak istediğinden emin misin? Bu yöne gönderi yapmak onlarla iletişime geçmek için daha iyi bir yol olabilir."
my_contacts: "Kişilerim"
no_contacts: "Birkaç kişi eklemen gerekir gibi görünüyor!"
no_contacts_message: "%{community_spotlight}'ni ziyaret et"
- no_contacts_message_with_aspect: "%{community_spotlight}'ni ziyaret et ya da %{add_to_aspect_link}"
only_sharing_with_me: "Benimle paylaşım yapan"
- remove_person_from_aspect: "%{person_name} kişisini \"%{aspect_name}\" yönünden kaldır"
start_a_conversation: "Bir iletişim başlatın"
title: "Kişiler"
your_contacts: "Kişiler"
- many: "%{count} kişi"
one: "1 kişi"
other: "%{count} kişi"
sharing:
@@ -268,7 +247,6 @@ tr:
spotlight:
community_spotlight: "Topluluk Gönderileri"
suggest_member: "Bir üye önerin."
- two: "%{count} kişi"
zero: "kişiler"
conversations:
conversation:
@@ -277,14 +255,15 @@ tr:
fail: "Geçersiz mesaj"
no_contact: "Hey, önce bir bağlantı ekleyin!"
sent: "Mesaj gönderildi"
- destroy:
- success: "Konuşma başarıyla kaldırıldı"
helper:
new_messages:
other: "%{count} yeni ileti"
zero: "Yeni ileti yok"
index:
+ conversations_inbox: "Yazışmalar — Gelen kutusu"
+ create_a_new_conversation: "Bir yazışma başlat"
inbox: "Gelen Kutusu"
+ new_conversation: "Yeni yazışma"
no_conversation_selected: "hiç ileti seçilmedi"
no_messages: "mesaj yok"
new:
@@ -293,6 +272,8 @@ tr:
sending: "Gönderiliyor..."
subject: "konu"
to: "kime"
+ new_conversation:
+ fail: "Geçersiz mesaj"
show:
delete: "iletişimi sil ya da engelle"
reply: "yanıtla"
@@ -408,6 +389,8 @@ tr:
title: "Özel gönderiler"
private_profiles:
title: "Özel profiller"
+ 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:
title: "Genel gönderiler"
public_profiles:
@@ -471,7 +454,7 @@ tr:
application:
back_to_top: "Sayfa başına dön"
powered_by: "GELİŞTİREN: DIASPORA*"
- public_feed: " %{name} için Genel Diaspora Beslemesi"
+ public_feed: "%{name} için Genel Diaspora* Beslemesi"
source_package: "kaynak kodu paketini indir"
toggle: "mobil site"
whats_new: "neler yeni?"
@@ -537,6 +520,8 @@ tr:
other: "ve %{count} diğer kişi"
zero: "ve başka hiç kimse"
mark_all_as_read: "Tümünü okundu olarak işaretle"
+ mark_all_shown_as_read: "Gösterilenlerin hepsini okudum"
+ mark_read: "Okundu"
mark_unread: "Okunmadı olarak işaretle"
notifications: "Bildirimler"
liked:
@@ -578,6 +563,8 @@ tr:
click_link: "Yeni e-mail adresini %{unconfirmed_email} etkinleştirmek için şu bağlantıya tıkla:"
subject: "Lütfen yeni e-mail adresini %{unconfirmed_email} etkinleştir"
email_sent_by_diaspora: "Bu e-posta %{pod_name} tarafından gönderildi. Bu gibi e-postalar almak istemiyorsanız,"
+ export_failure_email:
+ subject: "Sayın %{name}, verinizi kaybettiğimiz için özür dileriz."
hello: "Merhaba %{name}!"
invite:
message: |-
@@ -604,6 +591,21 @@ tr:
subject: "%{name} sana Diaspora*'da özel mesaj gönderdi "
private_message:
reply_to_or_view: "Yanıtla ya da konuşmayı görüntüle >"
+ report_email:
+ body: |-
+ İyi günler,
+
+ %{id} kimliğine sahip %{type} saldırgan olarak raporlanmıştır.
+
+ [%{url}][1]
+
+ Olabildiğince çabuk şekilde incelemeniz rica olunur.
+
+ Saygılar,
+
+ diaspora* elektronik mektup robotu
+
+ [1]: %{url}
reshared:
reshared: "%{name} gönderini tekrar paylaştı"
view_post: "Gönderiyi görüntüle>"
@@ -628,7 +630,6 @@ tr:
add_contact_from_tag: "kişi etiketle"
aspect_list:
edit_membership: "yön üyelik düzenle"
- few: "%{count} kişi"
helper:
is_not_sharing: "%{name} sizinle şunu paylaşmıyor"
is_sharing: "%{name} sizinle şunu paylaştı"
@@ -638,8 +639,9 @@ tr:
no_one_found: "...ve hiç kimse bulunamadı."
no_results: "Hey! Bir şeyi araman lazım."
results_for: "arama sonuçları"
+ search_handle: "Arkadaşlarınızı bulmak için kullaniciadi@pod biçimindeki diaspora* kimliklerini kullanın."
searching: "aranıyor, biraz sabırlı olun..."
- many: "%{count} kişi"
+ send_invite: "Hâlâ mı bir şey yok? Birilerini davet edin!"
one: "1 kişi"
other: "%{count} kişi"
person:
@@ -676,7 +678,6 @@ tr:
add_some: "biraz ekle"
edit: "düzenle"
you_have_no_tags: "etiket yok!"
- two: "%{count} kişi"
webfinger:
fail: "Üzgünüz, %{handle} bulunamadı."
zero: "kişi yok"
@@ -755,7 +756,7 @@ tr:
public: "Genel"
reactions:
other: "%{count} tepki"
- zero: "1 tepki"
+ zero: "tepki yok"
registrations:
closed: "Üyelik bu Diaspora'da kapandı."
create:
@@ -769,15 +770,12 @@ tr:
update: "Güncelle"
invalid_invite: "Gönderdiğiniz davetiye bağlantısı artık geçerli değil!"
new:
- continue: "Devam"
create_my_account: "Hesabımı oluştur!"
- diaspora: "<3 Diaspora*"
email: "E-POSTA"
enter_email: "Bir e-posta girin"
enter_password: "Bir parola girin"
enter_password_again: "Daha önce olduğu gibi aynı parolayı girin."
enter_username: "Bir kullanıcı adı seçin (sadece harfler, rakamlar ve alt çizgi)"
- hey_make: "HEY,<br/>BİR ŞEY<br/>YAP."
join_the_movement: "Harekete katılın!"
password: "PAROLA"
password_confirmation: "PAROLA ONAYI"
@@ -902,6 +900,7 @@ tr:
all: "hepsi"
all_contacts: "tüm bağlantılar"
discard_post: "Gönderiyi sil"
+ formatWithMarkdown: "Gönderilerinizi biçimlendirmek için Markdown( %{markdown_link} ) kullanabilirsiniz"
get_location: "Konumunu ayarla"
make_public: "herkese görünür yap"
new_user_prefill:
@@ -950,9 +949,7 @@ tr:
no_message_to_display: "Gösterilecek mesaj yok."
new:
mentioning: "Bahseden: %{person}"
- too_long:
- other: "durum mesajları %{count} karakterden az olmalıdır."
- zero: "durum mesajları %{count} karakterden az olmalıdır."
+ too_long: "{\"other\"=>\"durum mesajları %{count} karakterden az olmalıdır.\", \"zero\"=>\"durum mesajları %{count} karakterden az olmalıdır.\"}"
stream_helper:
hide_comments: "Yorumları gizle"
show_comments:
@@ -989,7 +986,6 @@ tr:
title: "Genel Aktiviteler"
tags:
contacts_title: "Kişileri etiketle"
- tag_prefill_text: "%{tag_name} hakkında olay şu ki... "
title: "Gönderi etiketlendi: %{tags}"
tag_followings:
create:
@@ -1002,16 +998,13 @@ tr:
tags:
show:
follow: "Takip et: #%{tag}"
- followed_by_people:
- other: "%{count} kişi tarafından izleniyor"
- zero: "hiç kimse tarafından izlenmiyor"
following: "#%{tag} takip ediliyor"
- nobody_talking: "%{tag} hakkında konuşan yok henüz."
none: "Boş etiketi yoktur!"
- people_tagged_with: "Kişi etiketlendi %{tag}"
- posts_tagged_with: "#%{tag} ile etiketlenmiş gönderiler"
stop_following: "Takibi Durdur #%{tag}"
- terms_and_conditions: "Şartlar ve Koşullar"
+ tagged_people:
+ other: "%{count} kişi %{tag} ile etiketlendi"
+ zero: "%{tag} ile hiç kimse etiketlenmedi"
+ terms_and_conditions: "Kurallar ve Koşullar"
undo: "Geri Al?"
username: "Kullanıcı Adı"
users:
@@ -1044,19 +1037,20 @@ tr:
comment_on_post: "...birisi gönderine yorum yazdığında?"
current_password: "Mevcut parola"
current_password_expl: "giriş yaptığınız..."
+ download_export: "Profilimi indir"
download_photos: "fotoğraflarımı indir"
- download_xml: "xml dosyamı indir"
edit_account: "Hesap düzenle"
email_awaiting_confirmation: "Etkinleştirme bağlantısını %{unconfirmed_email} adresine gönderdik. Bu bağlantıyı izleyip yeni adresi etkinleştirmediğin sürece önceki %{email} adresini kullanmaya devam edeceğiz."
export_data: "Bilgilerimi Dışarı taşı"
following: "İzleme ayarları"
getting_started: "Yeni Kullanıcı Tercihleri"
+ last_exported_at: "En son %{timestamp} anında güncellendi"
liked: "...birisi gönderimi iğnelediğinde?"
mentioned: "...benden bahsedildiğinde?"
new_password: "Yeni parola"
- photo_export_unavailable: "Fotoğraf aktarma şu anda kullanılamıyor"
private_message: "...özel mesaj aldığında?"
receive_email_notifications: "E-posta bildirimi gönder..."
+ request_export: "Profil verimi iste"
reshared: "...birisi benim gönderimi tekrar paylaştığında?"
show_community_spotlight: "Topluluk Spotlight akışınızda gösterilsin mi?"
show_getting_started: "Başlarken etkin"
diff --git a/config/locales/diaspora/uk.yml b/config/locales/diaspora/uk.yml
index 808956820..014282e2b 100644
--- a/config/locales/diaspora/uk.yml
+++ b/config/locales/diaspora/uk.yml
@@ -10,8 +10,10 @@ uk:
_contacts: "Контакти"
_help: "Довідка"
_home: "Головна"
- _photos: "фотографій"
+ _photos: "Світлини"
_services: "Сервіси"
+ _statistics: "Статистика"
+ _terms: "Умови"
account: "Обліковий запис"
activerecord:
errors:
@@ -39,7 +41,7 @@ uk:
reshare:
attributes:
root_guid:
- taken: "Ви вже поділилися цим записом!"
+ taken: "Це добре,так?Ви вже поділилися цим записом!"
user:
attributes:
email:
@@ -53,11 +55,11 @@ uk:
admin_bar:
correlations: "Кореляція"
pages: "Сторінки"
- pod_stats: "Активність поду"
+ pod_stats: "Статистика сервера"
report: "Доноси"
sidekiq_monitor: "Монітор Sidekiq"
user_search: "Пошук користувачів"
- weekly_user_stats: "Щотижнева активність користувачів"
+ weekly_user_stats: "Щотижнева статистика користувачів"
correlations:
correlations_count: "Зв'язок з числом входів:"
stats:
@@ -95,8 +97,26 @@ uk:
other: "користувачів: %{count}"
zero: "жодного користувача"
week: "Тиждень"
+ user_entry:
+ account_closed: "аккаунт закрито"
+ diaspora_handle: "Ваше особисте посилання в Діаспора"
+ email: "Пошта"
+ guid: "GUID"
+ id: "ID"
+ last_seen: "останній раз заходив"
+ ? "no"
+ : ні
+ nsfw: "#nsfw"
+ unknown: "невідомо"
+ ? "yes"
+ : так
user_search:
+ account_closing_scheduled: "Планується закриття аккаунту з ім'ям %{name}. Обробка займе кілька хвилин..."
add_invites: "додати запрошення"
+ are_you_sure: "Ви впевнені, що бажаєте закрити цей аккаунт?"
+ are_you_sure_lock_account: "Ви впевнені, що хочете заблокувати цей аккаунт?"
+ are_you_sure_unlock_account: "Ви впевнені, що хочете розблокувати цей аккаунт?"
+ close_account: "закрити аккаунт"
email_to: "Адреса для запрошення"
under_13: "Показати користувачів молодших 13 (COPPA)"
users:
@@ -105,6 +125,7 @@ uk:
one: "знайдено користувачів: %{count}"
other: "знайдено користувачів: %{count}"
zero: "не знайдено жодного користувача"
+ view_profile: "перегляд профілю"
you_currently:
few: "Запрошень в наявності: %{count}. %{link}"
many: "Запрошень в наявності: %{count}. %{link}"
@@ -127,7 +148,7 @@ uk:
video_title:
unknown: "Невідома назва відеозапису"
are_you_sure: "Ви впевнені?"
- are_you_sure_delete_account: "Ви впевнені, що хочете закрити свій обліковий запис? Цю процедуру неможливо буде скасувати!"
+ are_you_sure_delete_account: "Ви впевнені, що хочете закрити свій обліковий запис? Цю процедуру неможливо скасувати!"
aspect_memberships:
destroy:
failure: "Не вдалося видалити користувача з аспектів"
@@ -137,8 +158,6 @@ uk:
add_to_aspect:
failure: "Не вдалося додати друга в аспект."
success: "Друг доданий в аспект."
- aspect_contacts:
- done_editing: "редагування завершено"
aspect_listings:
add_an_aspect: "+ Додати аспект"
deselect_all: "Вимкнути всі"
@@ -157,23 +176,18 @@ uk:
failure: "%{name} не порожній і не може бути вилучений."
success: "%{name} успішно видалений."
edit:
- add_existing: "Додати наявний контакт"
+ aspect_chat_is_enabled: "Контакти з цього аспекту можуть спілкуватися з вами."
+ aspect_chat_is_not_enabled: "Контакти з цього аспекту не можуть спілкуватися з вами."
aspect_list_is_not_visible: "Контакти, з цього аспекту, не можуть бачити один одного."
aspect_list_is_visible: "Контакти, із цього аспекту, можуть бачити один одного."
confirm_remove_aspect: "Ви впевнені, що хочете вилучити цей аспект?"
- done: "Виконано"
+ grant_contacts_chat_privilege: "надати контактам в аспекті можливість спілкуватися?"
make_aspect_list_visible: "зробити контакти в цьому аспекті видимими один одному?"
- manage: "Управляти"
remove_aspect: "Видалити цей аспект"
rename: "перейменувати"
set_visibility: "Встановити видимість"
update: "Оновити"
updating: "оновлення"
- few: "%{count} аспект[-и, -ів]"
- helper:
- are_you_sure: "Ви впевнені в тому, що хочете вилучити цей аспект?"
- aspect_not_empty: "Аспект не порожній"
- remove: "вилучити"
index:
diaspora_id:
content_1: "Ваш ідентифікатор в Діаспорі*:"
@@ -214,11 +228,6 @@ uk:
heading: "Підключення служб"
unfollow_tag: "Не стежити за міткою #%{tag}"
welcome_to_diaspora: "Ласкаво просимо до Діаспори*, %{name}!"
- many: "%{count} аспект[-и, -ів]"
- move_contact:
- error: "Помилка при переміщенні контакту : %{inspect}"
- failure: "не працює %{inspect}"
- success: "Контакт переміщено в новий аспект"
new:
create: "Створити"
name: "Ім'я (видно тільки вам)"
@@ -236,14 +245,6 @@ uk:
family: "Сім'я"
friends: "Друзі"
work: "Робота"
- selected_contacts:
- manage_your_aspects: "Керування аспектами."
- no_contacts: "У вас тут поки що немає жодного контакту."
- view_all_community_spotlight: "Подивитися усіх рекомендованих"
- view_all_contacts: "Усі контакти"
- show:
- edit_aspect: "редагувати аспект"
- two: "%{count} аспектів"
update:
failure: "Ваш аспект %{name} має занадто довге ім'я для збереження."
success: "Ваш аспект %{name} успішно відредагований."
@@ -263,36 +264,30 @@ uk:
post_success: "Опубліковано! Закриття!"
cancel: "Скасувати"
comments:
- few: "%{count} коментарів"
- many: "%{count} коментарів"
new_comment:
comment: "Коментувати"
commenting: "Коментування..."
one: "1 коментар"
other: "%{count} коментарів"
- two: "%{count} коментарів"
zero: "немає коментарів"
contacts:
create:
failure: "Не вдалося створити контакт"
- few: "%{count} контакт[-у, -iв]"
index:
add_a_new_aspect: "Новий аспект"
+ add_contact: "Додати контакт"
add_to_aspect: "додати контакти до %{name}"
- add_to_aspect_link: "додати контакти до аспекту %{name}"
all_contacts: "Усі контакти"
community_spotlight: "У центрі уваги"
- many_people_are_you_sure: "Ви упевнені, що хочете почати приватну бесіду з кількістю контактів, більшою за %{suggested_limit}? Можливо, краще просто написати повідомлення в цей аспект."
my_contacts: "Мої контакти"
no_contacts: "Схоже, вам потрібно додати декілька контактів!"
no_contacts_message: "Зазирніть до %{community_spotlight}"
- no_contacts_message_with_aspect: "Зазирніть до %{community_spotlight}%{community_spotlight} або %{add_to_aspect_link}"
only_sharing_with_me: "Що тільки додали мене"
- remove_person_from_aspect: "Вилучити %{person_name} з \"%{aspect_name}\""
+ remove_contact: "Видалити контакт"
start_a_conversation: "Почати бесіду"
title: "Контакти"
+ user_search: "Пошук користувача"
your_contacts: "Ваші контакти"
- many: "%{count} контакт[-у, -iв]"
one: "1 контакт"
other: "%{count} контакт[-у, -iв]"
sharing:
@@ -300,8 +295,7 @@ uk:
spotlight:
community_spotlight: "У центрі уваги"
suggest_member: "Запропонуйте учасника"
- two: "%{count} контакту"
- zero: "контактів"
+ zero: "немає контактів"
conversations:
conversation:
participants: "Учасники"
@@ -310,7 +304,8 @@ uk:
no_contact: "Ей, вам потрібно спочатку додати контакт!"
sent: "Повідомлення відправлене"
destroy:
- success: "Розмова успішно вилучена"
+ delete_success: "Діалог успішно видалений"
+ hide_success: "Діалог успішно прихований"
helper:
new_messages:
few: "Нові повідомлення: %{count}"
@@ -336,6 +331,7 @@ uk:
fail: "Невірне повідомлення"
show:
delete: "вилучити й заблокувати розмову"
+ hide: "заховати і німа розмова"
reply: "відповісти"
replying: "Відповідь..."
date:
@@ -405,7 +401,18 @@ uk:
getting_started_tutorial: "\"Інструкції для початківців\""
here: "сюди"
irc: "IRC"
- markdown: "Верстка"
+ keyboard_shortcuts:
+ keyboard_shortcuts_a1: "у відображенні потоку Ви можете використовувати наступні поєднання клавіш:"
+ keyboard_shortcuts_li1: "j - перейти до наступного запису"
+ keyboard_shortcuts_li2: "k - перейти до попереднього запису"
+ keyboard_shortcuts_li3: "c - прокоментувати запис"
+ keyboard_shortcuts_li4: "l - лайкнути запис"
+ keyboard_shortcuts_li5: "Поділитися даним постом"
+ keyboard_shortcuts_li6: "Розвернути даний пост"
+ keyboard_shortcuts_li7: "Відкрити перше посилання в даному пості"
+ keyboard_shortcuts_q: "Які поєднання клавіш доступні?"
+ title: "Гарячі клавіші"
+ markdown: "Markdown"
mentions:
how_to_mention_a: "Напишіть знак \"@\" та почніть набирати ім'я. З'явиться меню з вибором відповідних користувачів. Зауважте, що згадувати користувача можна тільки, якщо ви додали його у свої аспекти."
how_to_mention_q: "Як мені згадати кого-небудь, коли я створюю запис?"
@@ -421,8 +428,8 @@ uk:
back_to_top_q: "Чи є швидкий спосіб повернутись до початку сторінки, яку я проскролив вниз?"
diaspora_app_a: "Є дещо декілька досить сирих додатків під андроїд. Деякі давно покинуті і досить погано працюють з новими версіями Діаспори. Не чекайте від них багато чого. Проте у Діаспори є версія сайту під мобільні браузери, так що ви можете скористатися вашим улюбленим мобильним пристрієм для доступу до Діаспори. Цей спосіб працює не лише під андроїдом і ios, але і під іншими телефонами."
diaspora_app_q: "Чи є додаток для Діаспори під андроїд або ios?"
- photo_albums_a: "Поки ні. Хоча у бічній панелі є посилання на потік завантажених фотографій, до якої ви можете отримати доступ, якщо користувач вас додав."
- photo_albums_q: "Чи є в діаспорі фото і відео альбоми?"
+ photo_albums_a: "Поки що ні. Хоча у бічній панелі є посилання на потік завантажених світлин."
+ photo_albums_q: "Чи є в діаспорі фото- і відео-альбоми?"
subscribe_feed_a: "Так, але це ще не закінчена функція і форматування у фіді буде досить грубою. Якщо ви все одно хочете спробувати, зайдіть в чий-небудь профіль і кликніть по кнопці фіду у вашому браузері або скопіюйте адресу профілю (наприклад https://joindiaspora.com/people/userID) і додайте в агрегатор. Кінцевий результат виглядатиме так: https://joindiaspora.com/public/username.atom Діаспора використовує atom протокол, а не rss."
subscribe_feed_q: "Чи можу я стежити за чиїми-небудь публічними записами, через агрегатор?"
title: "Інше"
@@ -441,14 +448,14 @@ uk:
character_limit_q: "Яка максимальна кількість символів для запису?"
embed_multimedia_a: "Для цього вам достатньо просто вставити посилання (наприклад http://www.youtube.com/watch?v=nnnnnnnnnnn ) у ваш пост і відео або аудіо буде додано автоматично. Сайти, які підтримуються: YouTube, Vimeo, SoundCloud, Flickr та деякі інші. Цей список постійно поповнюється. Пам'ятайте завжди використовувати прості, повні посилання; не укорочені; жодних операторів після основного посилання; і зачекайте трохи перед тим як перезавантажувати сторінку після викладення поста, задля того аби побачити попередній вигляд."
embed_multimedia_q: "Як я можу прикріплювати відео, аудіо, чи інший мультимедійний контент у мої пости?"
- format_text_a: "Діаспора підтримує синтаксис %{markdown}.Ви можете знайти опис синтаксису по посиланні %{here} або на російській http://rukeba.com/by-the-way/markdown-sintaksis-po-russki Якщо у Вас є сумніви ,у тому ,чи правильно Ви оформили запис ,Ви можете скористатися кнопкою \"Попередній огляд\"."
+ format_text_a: "Діаспора підтримує синтаксис %{markdown}. Його повний опис можна знайти %{here}. Якщо Ви сумніваєтесь, чи правильно оформили запис, Ви можете скористатися кнопкою \"Попередній огляд\"."
format_text_q: "Як мені оформити текст моїх записів (полужирний, курсив і т.д.)?"
hide_posts_a: "Якщо Ви наведете мишкою на запис, справа вверху з'явиться хрестик.Натисніть на нього.Ви все одно зможете бачити запис і коментарі, якщо зайдете на сторінку до автора цього запису."
hide_posts_q: "Як мені приховати запис і перестати отримувати повідомлення про коментарі до нього?"
image_text: "спливаючий текст"
image_url: "Адреса зображення"
- insert_images_a: "Натисність піктограму фотокамери та укажіть потрібне зображення для завантаження з вашого комп'ютера. Якщо ж ви бажаєте вставити зображення з Інтернету, ви можете скористатися синтаксисом Мarkdown."
- insert_images_comments_a1: "Наступний код Markdown"
+ insert_images_a: "Натисність піктограму фотокамери та вкажіть потрібне зображення для завантаження з вашого комп'ютера. Якщо ж Ви бажаєте вставити зображення з Інтернету, у Вас є можливість можете скористатися синтаксисом Мarkdown."
+ insert_images_comments_a1: "Такий код Markdown"
insert_images_comments_a2: "може бути використаний як для коментарів, так і для записів."
insert_images_comments_q: "Чи можу я додати зображення у коментарі?"
insert_images_q: "Як мені додати у запис зображення?"
@@ -668,9 +675,11 @@ uk:
comment_on_post: "Коментар до запису"
liked: "Сподобалася"
mark_all_as_read: "Позначити всі як прочитані"
+ mark_all_shown_as_read: "Відзначити все як прочитане"
mark_read: "Помітити як прочитане"
mark_unread: "позначити як непрочитане"
mentioned: "Згадав"
+ no_notifications: "Ви не маєте ніяких повідомлень."
notifications: "Повідомлення"
reshared: "Поділився"
show_all: "показати все"
@@ -730,7 +739,9 @@ uk:
two: "%{actors} почав(ла) ділитися з вами."
zero: "%{actors} почав(ла) ділитися з вами."
notifier:
+ a_limited_post_comment: "Вам надійшов новий коментар на обмежену поштову скриньку."
a_post_you_shared: "запис."
+ a_private_message: "Вам надійшло нове приватне повідомлення від diaspora*."
accept_invite: "Прийміть ваше запрошення до Діаспори*!"
click_here: "натисніть сюди"
comment_on_post:
@@ -739,6 +750,21 @@ uk:
click_link: "Щоб активувати вашу адресу %{unconfirmed_email}, будь ласка, перейдіть на цим посиланням:"
subject: "Будь ласка, активуйте вашу нову адресу %{unconfirmed_email}"
email_sent_by_diaspora: "Цей лист був надісланий %{pod_name}. Якщо ви не бажаєте отримувати подібні листи,"
+ export_email:
+ body: |-
+ Добрий день %{name},
+ Ваші данні були оброблені і наразі готові до завантаження наступної %{url}.
+ Щиро вітаємо,
+ Поштовий робот diaspora*!
+ subject: "Ваші персональні данні готові до скачування %{name}"
+ export_failure_email:
+ body: |-
+ Добрий день%{name},
+ Ми зіткнулися з проблемою в обробці ваших персональних даних на завантаження.
+ Будь ласка, спробуйте ще!
+ Щиро ваш,
+ Поштовий робот diaspora*!
+ subject: "Вибачаємось, виникла проблема з вашими даними, %{name}"
hello: "Привіт %{name}!"
invite:
message: |-
@@ -765,6 +791,14 @@ uk:
subject: "%{name} згадав вас у Діаспорі*"
private_message:
reply_to_or_view: "Відповісти або подивитися цю бесіду >"
+ remove_old_user:
+ body: |-
+ Привіт. В зв'язку з бездіяльністю вашого облікового запису на diaspora* %{pod_url}, ми змушені повідомити вас, що система позначила ваш обліковий запис до автоматичного видалення. Це відбуваеться автоматично по закінченню періоду бездіяльності більш ніж%{after_days}днів.
+ Ви можете уникнути втрати облікового запису, зайшовши в нього до%{remove_after}, в разі чого видалення буде автоматично відмінене.
+ Ця технічна операція виконується з метою впевнитися в тому, що активні користувачі отримують значну частину ресурсів даної інстанції diaspora*. Дякуємо за розуміння.
+ Якщо ви бажаєте зберегти ваш акаунт, будь ласка, увійдіть у нього тут%{login_url}
+ З надією зустріти вас знову, Поштовий робот diaspora*!
+ subject: "Ваш обліковий запис помічений на видалення з причини бездіяльності"
report_email:
body: |-
Здрастуйте,
@@ -808,7 +842,6 @@ uk:
add_contact_from_tag: "додати контакт з мітки"
aspect_list:
edit_membership: "редагувати учасників аспекту"
- few: "%{count} людина[и]"
helper:
is_not_sharing: "%{name} не додав вас"
is_sharing: "%{name} ділиться з вами"
@@ -822,7 +855,6 @@ uk:
search_handle: "Використайте ідентифікатори Діаспори (ім'я@домен.зона) щоб знайти ваших друзів."
searching: "Триває пошук. Будь ласка, зачекайте."
send_invite: "Все ще порожньо? Запросіть кого-небудь!"
- many: "%{count} людина[и]"
one: "1 людина"
other: "%{count} людина[-и]"
person:
@@ -837,7 +869,7 @@ uk:
gender: "стать"
in_aspects: "у аспектах"
location: "розташування"
- photos: "Фото"
+ photos: "Світлини"
remove_contact: "вилучити контакт"
remove_from: "Видалити %{name} з %{aspect}?"
show:
@@ -859,23 +891,22 @@ uk:
add_some: "додати"
edit: "редагувати"
you_have_no_tags: "у вас немає міток!"
- two: "%{count} людина[и]"
webfinger:
fail: "На жаль, ми не змогли знайти %{handle}."
zero: "немає нікого"
photos:
comment_email_subject: "Фотографія %{name}"
create:
- integrity_error: "Помилка при завантаженні фотографії. Ви впевнені, що це графічний файл?"
- runtime_error: "Збій при завантаженні фотографії."
- type_error: "Збій при завантаженні фототрафії. Ви впевнені, що додали графічний файл?"
+ integrity_error: "Помилка при завантаженні світлини. Ви впевнені, що це графічний файл?"
+ runtime_error: "Збій при завантаженні світлини."
+ type_error: "Збій при завантаженні світлини. Ви впевнені, що додали графічний файл?"
destroy:
notice: "Фотографію вилучено."
edit:
editing: "Редагування"
new:
back_to_list: "Повернутися до списку"
- new_photo: "Нова Фотографія"
+ new_photo: "Нова світлина"
post_it: "Опублікувати!"
new_photo:
empty: "{file} порожній, будь ласка, виберіть файли ще раз, але без нього."
@@ -885,18 +916,18 @@ uk:
or_select_one_existing: "чи виберіть одну із вже завантажених %{photos}"
upload: "Завантажити нове фото для профілю!"
photo:
- view_all: "Подивитися усі фотографії %{name}"
+ view_all: "Подивитися усі світлини %{name}"
show:
collection_permalink: "постійне посилання на колекцію"
- delete_photo: "Вилучити фотографію"
+ delete_photo: "Вилучити світлину"
edit: "редагувати"
- edit_delete_photo: "Змінити опис фотографії / вилучити фотографію"
- make_profile_photo: "зробити фотографією профілю"
+ edit_delete_photo: "Змінити опис світлини / вилучити світлину"
+ make_profile_photo: "зробити світлиною профілю"
show_original_post: "Показати початковий запис"
- update_photo: "Оновити фотографію"
+ update_photo: "Оновити світлину"
update:
- error: "Не вдалося змінити фотографію."
- notice: "Фотографія завантажена вдало."
+ error: "Не вдалося змінити світлину."
+ notice: "Світлина завантажена вдало."
posts:
presenter:
title: "Запис %{name}"
@@ -905,11 +936,11 @@ uk:
not_found: "Вибачте, ми не змогли знайти цей запис."
permalink: "постiйне посилання"
photos_by:
- few: "%{count} фото користувача %{author}"
- many: "%{count} фото користувача %{author}"
- one: "фото користувача %{author}"
- other: "%{count} фото користувача %{author}"
- zero: "Немає фото користувача %{author}"
+ few: "%{count} світлини користувача %{author}"
+ many: "%{count} світлин користувача %{author}"
+ one: "світлина користувача %{author}"
+ other: "%{count} світлин користувача %{author}"
+ zero: "Немає світлин користувача %{author}"
reshare_by: "Поширено %{author}"
previous: "попередня"
privacy: "Конфіденційність"
@@ -930,7 +961,7 @@ uk:
your_gender: "Ваша стать"
your_location: "Ваше місце розташування"
your_name: "Ваше ім'я"
- your_photo: "Ваша фотографія"
+ your_photo: "Ваша світлина"
your_private_profile: "Ваш особистий профіль"
your_public_profile: "Ваш публічний профіль"
your_tags: "Опишіть себе в п'яти словах"
@@ -958,21 +989,20 @@ uk:
update: "Відновити"
invalid_invite: "Це запрошення вже недійсне!"
new:
- continue: "Далі"
create_my_account: "Створити мій аккаунт!"
- diaspora: "<3 Діаспора*"
email: "Пошта"
enter_email: "Введіть email"
enter_password: "Введіть пароль (щонайменьше шість символів)"
enter_password_again: "Повторіть пароль"
enter_username: "Виберіть ім'я користувача (дозволені тільки латинські букви, цифри і підкреслення)"
- hey_make: "Привіт,<br/>створіть<br/>що-небуть"
join_the_movement: "Приєднуйтеся до руху!"
password: "Пароль"
password_confirmation: "ПІДТВЕРДЖЕННЯ ПАРОЛЯ"
sign_up: "Реєстрація"
sign_up_message: "Соціальна мережа з ♥"
submitting: "Відправка..."
+ terms: "Зареєструвавшись Ви приймаєте %{terms_link}."
+ terms_link: "умови надання послуг"
username: "Ім’я користувача"
report:
comment_label: "<b>Коментар</b>:<br>%{data}"
@@ -1074,6 +1104,8 @@ uk:
your_diaspora_username_is: "Ваше ім'я користувача Діаспори* : %{diaspora_handle}"
aspect_dropdown:
add_to_aspect: "Додати аспект"
+ mobile_row_checked: "%{name} (видалити)"
+ mobile_row_unchecked: "%{name} (додати)"
toggle:
few: "У %{count} аспектах"
many: "У %{count} аспектах"
@@ -1133,7 +1165,7 @@ uk:
remove_location: "Видалити місцезнаходження"
share: "Поділитися"
share_with: "поділитися з"
- upload_photos: "Завантажити фотографії"
+ upload_photos: "Завантажити світлини"
whats_on_your_mind: "Про що ви думаєте?"
reshare:
reshare: "Поділитися повторно"
@@ -1159,6 +1191,21 @@ uk:
failed: "Людяність не підтверджена"
user: "Секретне зображення і код не співпадають"
placeholder: "Введіть вміст зображення"
+ statistics:
+ active_users_halfyear: "Активні користувачі пів року"
+ active_users_monthly: "Активні користувачі місяця"
+ closed: "Закритий"
+ disabled: "Ненаявний"
+ enabled: "Наявний"
+ local_comments: "Місцеві коментарі"
+ local_posts: "Місцеві публікації"
+ name: "Ім'я"
+ network: "Мережа"
+ open: "Відкритий"
+ registrations: "Реєстрації"
+ services: "Сервісні служби"
+ total_users: "Всі користувачі"
+ version: "Версія"
status_messages:
create:
success: "Успішно згадано: %{names}"
@@ -1168,14 +1215,11 @@ uk:
no_message_to_display: "Нових повідомлень немає."
new:
mentioning: "Згадати: %{person}"
- too_long:
- few: "скоротіть, будь ласка, ваше повідомлення до %{count} символів"
- many: "скоротіть, будь ласка, ваше повідомлення до %{count} символів"
- one: "скоротіть, будь ласка, ваше повідомлення до %{count} символів"
- other: "скоротіть, будь ласка, ваше повідомлення до %{count} символів"
- zero: "скоротіть, будь ласка, ваше повідомлення до %{count} символів"
+ too_long: "{\"few\"=>\"скоротіть, будь ласка, ваше повідомлення до %{count} символів\", \"many\"=>\"скоротіть, будь ласка, ваше повідомлення до %{count} символів\", \"one\"=>\"скоротіть, будь ласка, ваше повідомлення до %{count} символів\", \"other\"=>\"скоротіть, будь ласка, ваше повідомлення до %{count} символів\", \"zero\"=>\"скоротіть, будь ласка, ваше повідомлення до %{count} символів\"}"
stream_helper:
hide_comments: "Приховати усі коментарі"
+ no_more_posts: "Ви досягли кінця потоку."
+ no_posts_yet: "Ще немає жодного запису."
show_comments:
few: "Показати ще %{count} коментарів"
many: "Показати ще %{count} коментарів"
@@ -1211,10 +1255,9 @@ uk:
title: "Потік"
public:
contacts_title: "Нещодавно написали"
- title: "Публічна Активність"
+ title: "Публічна діяльність"
tags:
contacts_title: "Люди, яким подобаються ця мітка"
- tag_prefill_text: "Щодо %{tag_name} я думаю, що..."
title: "Записи, позначені: %{tags}"
tag_followings:
create:
@@ -1227,17 +1270,8 @@ uk:
tags:
show:
follow: "Стежити за міткою #%{tag}"
- followed_by_people:
- few: "%{count} підписаних"
- many: "%{count} підписаних"
- one: "%{count} підписаний"
- other: "%{count} підписаних"
- zero: "Ніхто не підписаний"
following: "Ви стежите за міткою #%{tag}"
- nobody_talking: "Ніхто поки що не говорив про %{tag}."
none: "Порожньої мітки немає!"
- people_tagged_with: "Люди з міткою %{tag}"
- posts_tagged_with: "Записи з міткою #%{tag}"
stop_following: "Не стежити за міткою #%{tag}"
terms_and_conditions: "Умови надання послуг"
undo: "Повернути?"
@@ -1263,28 +1297,31 @@ uk:
dont_go: "Будь ласка, не йдіть!"
if_you_want_this: "Якщо ви дійсно хочете це зробити, введіть ваш пароль і натисніть 'Закрити аккаунт'."
lock_username: "Це зарезервує ваше ім'я користувача на випадок, якщо ви захочете знову зареєструватися."
- locked_out: "Буде зроблено вихід з облікового запису, і ви будете відключені від вашого облікового запису."
+ locked_out: "Буде зроблено вихід , і ви будете відключені від вашого облікового запису"
make_diaspora_better: "Ми хотіли б, щоб ви допомогли нам зробити Діаспору кращою замість того, щоб просто піти звідси. Якщо ви дійсно вирішили піти, ми хочемо, щоб ви знали, що станеться далі."
mr_wiggles: "Містер Віглз буде засмучений, що ви пішли"
- no_turning_back: "Зараз зворотного шляху немає."
+ no_turning_back: "На даний час зворотного шляху немає."
what_we_delete: "Ми вилучимо всі ваші записи і дані профілю так швидко, як тільки зможемо. Ваші коментарі будуть як і раніше доступні, але вони не будуть прив'язані до вашого ідентифікатора в Діаспорі*."
close_account_text: "Закрити аккаунт"
comment_on_post: "хтось прокоментував ваш запис"
current_password: "Поточний пароль"
current_password_expl: "який ви використовуєте для входу..."
- download_photos: "Звантажити мої фотографії"
- download_xml: "Звантажити мою інформацію в XML"
+ download_export: "Завантажити мій профіль"
+ download_photos: "Звантажити мої світлини"
edit_account: "Редагувати аккаунт"
email_awaiting_confirmation: "Ми надіслали посилання для активації на %{unconfirmed_email}. Поки ви не скористаєтесь ним і не активуєте нову адресу, ми використовуватимемо ваш колишній ящик %{email}."
export_data: "Експорт інформації"
+ export_in_progress: "На даний момент ми оброблюємо ваші дані. Будь ласка ,перевірте ще раз через декілька хвилин."
following: "Налаштування відслідковування"
getting_started: "Нові налаштування для користувача"
+ last_exported_at: "(Останнє оновлення в %{timestamp})"
liked: "комусь подобається ваш запис"
mentioned: "вас згадали у записі"
new_password: "Новий пароль"
- photo_export_unavailable: "Функція експорту фото зараз недоступна"
private_message: "ви отримали особисте повідомлення"
receive_email_notifications: "Отримувати повідомлення електронною поштою, коли:"
+ request_export: "Запитати дані мого профелю"
+ request_export_update: "Оновити дані мого профелю"
reshared: "хтось ділиться вашим записом"
show_community_spotlight: "Показувати рекомендованих користувачів у Потоці?"
show_getting_started: "Повернути інформацію для початківців"
@@ -1296,7 +1333,7 @@ uk:
getting_started:
awesome_take_me_to_diaspora: "Чудово! Пустіть мене до Діаспори*"
community_welcome: "Товариство Діаспори раде вітати вас!"
- connect_to_facebook: "Ми можемо трохи прискорити процес через %{link} на Діаспору. Ця дія довантажить ваше ім'я і фотографію, а також додасть кросспостінг."
+ connect_to_facebook: "Ми можемо трохи прискорити процес через %{link} на Діаспору. Ця дія довантажить ваше ім'я і світлину, а також додасть кросспостінг."
connect_to_facebook_link: "Підключаємо ваш Facebook аккаунт"
hashtag_explanation: "Мітки дозволяють вам обговорювати і стежити за темами, що цікавлять вас. Це також відмінний спосіб пошуку однодумців в Діаспорі."
hashtag_suggestions: "Спробуйте, наприклад, мітки #мистецтво, #кіно, #gif і т.п."
@@ -1306,7 +1343,9 @@ uk:
who_are_you: "Хто ви?"
privacy_settings:
ignored_users: "Заблоковані користувачі"
+ no_user_ignored_message: "На даний час ви нікого не ігноруєте"
stop_ignoring: "Припинити блокування"
+ strip_exif: "Вилучте метадані такі як: місце занходження,автор,і модель камери з заватнажених зображень(рекомендовано)"
title: "Налаштування конфіденційності"
public:
does_not_exist: "Користувача %{username} не існує!"
diff --git a/config/locales/diaspora/ur-PK.yml b/config/locales/diaspora/ur-PK.yml
index 66a7b8c9f..b5a0040de 100644
--- a/config/locales/diaspora/ur-PK.yml
+++ b/config/locales/diaspora/ur-PK.yml
@@ -57,8 +57,6 @@ ur-PK:
add_to_aspect:
failure: "رابطہ پہلو میں شامل کرنے میں ناکام رہے۔"
success: "رابطہ کامیابی سے پہلو میں شامل کر دیا گیا ہے۔"
- aspect_contacts:
- done_editing: "ترمیم کر دی گئ"
aspect_listings:
add_an_aspect: "ایک پہلو شامل کریں +"
contacts_not_visible: "اس پہلو میں رابطے ایک دوسرے کو دیکھ نہیں سکیں گے۔"
@@ -70,21 +68,14 @@ ur-PK:
failure: "%{name} .خالی نہیں ہے اور اسے ختم نہیں کیا جا سکتا"
success: "%{name} کامیابی سے ہٹا دیا گیا۔"
edit:
- add_existing: "پہلے سے موجود رابطہ شامل کریں"
aspect_list_is_not_visible: "پہلو کی فہرست' پہلو میں دوسروں سے چھپی ہوئ ہے'"
aspect_list_is_visible: "پہلو کی فہرست' پہلو میں دوسروں کو دکھائی دے رہی ہے'"
confirm_remove_aspect: "کیا آپکو یقین ہے کہ آپ اس پہلو کو خذف کرنا چاہتے ہیں؟"
- done: "ہو گیا"
make_aspect_list_visible: "کیا پہلو کی فہرست نظر آۓ؟"
remove_aspect: "پہلو حذف کریں"
rename: "نام تبدیل کریں"
update: "تازہ"
updating: "تازہ کیا جا رھا ہے"
- few: "%{count} پہلو"
- helper:
- are_you_sure: "کیا آپکو یقین ہے کہ آپ اس پہلو کو خذف کرنا چاہتے ہیں؟"
- aspect_not_empty: "پہلو خالی نہیں ہے"
- remove: "ہٹائیے"
index:
diaspora_id:
content_1: "آپکی ڈایسپورا شناخت"
@@ -105,11 +96,6 @@ ur-PK:
content: "آپ ڈایسپورا کے لئے مندرجہ ذیل خدمات شامل کر سکتے ہیں :"
heading: "خدمات کو جوڑیے"
unfollow_tag: "پیروی بند کیجیے #%{tag}"
- many: "%{count} پہلو"
- move_contact:
- error: "رابطہ منتقلی میں خرابی: %{inspect}"
- failure: "صحیح نہیں %{inspect}"
- success: "شخص نۓ رابطے میں منتقل ہو گیا"
new:
create: "بنایۓ"
name: "نام"
@@ -125,20 +111,12 @@ ur-PK:
family: "خاندان"
friends: "دوست"
work: "کام"
- selected_contacts:
- manage_your_aspects: "اپنے پہلوؤں کا انتظام کریں۔"
- no_contacts: "ابھی تک یہاں آپکا کوئی رابطہ نہیں ہے۔"
- view_all_contacts: "تمام رابطے"
- show:
- edit_aspect: "پہلو میں ترمیم"
- two: "%{count} پہلو"
update:
failure: "آپکے پہلو کا نام, %{name}, محفوظ کرنے کی حد سے لمبا ہے۔"
success: "آپکے پہلو, %{name}, میں ترمیم ہو گئ ہے۔"
zero: "کوئ پہلو نہیں"
back: "واپس"
contacts:
- few: "%{count} contacts"
index:
add_to_aspect: "Add contacts to %{name}"
no_contacts: "No contacts."
@@ -339,13 +317,7 @@ ur-PK:
stream_element:
hide_and_mute: "Hide and Mute"
status_messages:
- too_long:
- few: "please make your status messages less than %{count} characters"
- many: "please make your status messages less than %{count} characters"
- one: "please make your status messages less than %{count} character"
- other: "please make your status messages less than %{count} characters"
- two: "please make your status messages less than %{count} characters"
- zero: "please make your status messages less than %{count} characters"
+ too_long: "{\"few\"=>\"please make your status messages less than %{count} characters\", \"many\"=>\"please make your status messages less than %{count} characters\", \"one\"=>\"please make your status messages less than %{count} character\", \"other\"=>\"please make your status messages less than %{count} characters\", \"two\"=>\"please make your status messages less than %{count} characters\", \"zero\"=>\"please make your status messages less than %{count} characters\"}"
stream_helper:
show_comments:
few: "Show %{count} more comments"
diff --git a/config/locales/diaspora/vi.yml b/config/locales/diaspora/vi.yml
index cc7b07f53..e12efccdc 100644
--- a/config/locales/diaspora/vi.yml
+++ b/config/locales/diaspora/vi.yml
@@ -43,16 +43,21 @@ vi:
taken: "đã được thực hiện."
admins:
admin_bar:
+ correlations: "Tương quan"
pages: "Trang"
user_search: "Tìm người dùng"
weekly_user_stats: "Thống kê người dùng hàng tuần"
+ correlations:
+ correlations_count: "Tương quan với số lần đăng nhập"
stats:
2weeks: "2 tuần"
50_most: "50 thẻ phổ biến nhất"
comments:
other: "%{count} bình luận"
zero: "Không có bình luận"
+ current_segment: "Segment hiện tại có trung bình <b>%{post_yest}</b> bài đăng trên người dùng, từ ngày <b>%{post_day}</b>"
daily: "Hàng ngày"
+ display_results: "Hiển thị các kết quả từ segment <b>%{segment}</b>"
go: "đi"
month: "Tháng"
posts:
@@ -61,6 +66,7 @@ vi:
shares:
other: "%{count} lượt chia sẻ"
zero: "Không có ai chia sẻ"
+ tag_name: "Tên thẻ: <b>%{name_tag}</b> Số lượng: <b>%{count_tag}</b>"
usage_statistic: "Thống kê mức sử dụng"
users:
other: "%{count} người dùng"
@@ -72,7 +78,8 @@ vi:
users:
other: "Tìm thấy %{count} người dùng"
zero: "Không tìm thấy ai"
- you_currently: "hiện bạn còn lại %{user_invitation} thư mời %{link}"
+ you_currently:
+ other: "hiện bạn còn lại %{user_invitation} thư mời %{link}"
weekly_user_stats:
amount_of:
other: "số người dùng mới của tuần này: %{count}"
@@ -96,8 +103,6 @@ vi:
add_to_aspect:
failure: "Thất bại khi thêm liên lạc vào mối quan hệ."
success: "Đã thêm liên lạc vào mối quan hệ."
- aspect_contacts:
- done_editing: "đã cập nhật xong"
aspect_listings:
add_an_aspect: "+ Thêm mối quan hệ"
deselect_all: "Bỏ chọn tất cả"
@@ -115,21 +120,14 @@ vi:
failure: "%{name} không rỗng và không thể bị loại bỏ."
success: "%{name} đã bị loại bỏ."
edit:
- add_existing: "Thêm một liên lạc đang có"
aspect_list_is_not_visible: "danh sách mối quan hệ bị ẩn với người khác trong mối quan hệ"
aspect_list_is_visible: "những người trong mối quan hệ này nhìn thấy nhau"
confirm_remove_aspect: "Bạn có chắc là muốn xoá mối quan hệ này không?"
- done: "Xong"
make_aspect_list_visible: "các liên lạc trong mối quan hệ này có thể thấy nhau?"
remove_aspect: "Xoá mối quan hệ này"
rename: "đổi tên"
update: "cập nhật"
updating: "đang cập nhật"
- few: "%{count} mối quan hệ"
- helper:
- are_you_sure: "Bạn có chắc là muốn xoá mối quan hệ này không?"
- aspect_not_empty: "Mối quan hệ không rỗng"
- remove: "loại bỏ"
index:
diaspora_id:
content_1: "ID Diaspora:"
@@ -150,6 +148,7 @@ vi:
tag_bug: "#bug"
tag_feature: "#feature"
tag_question: "#question"
+ tutorial_link_text: "Hướng dẫn"
introduce_yourself: "Đây là luồng của bạn. Hãy tự giới thiệu mình ở đây."
keep_diaspora_running: "Đóng góp hàng tháng để giúp phát triển Diaspora nhanh hơn!"
keep_pod_running: "Đóng góp hàng tháng để giúp %{pod} chạy nhanh và duy trì các phí khác!"
@@ -166,11 +165,6 @@ vi:
heading: "Kết nối dịch vụ"
unfollow_tag: "Ngừng theo dõi #%{tag}"
welcome_to_diaspora: "Chào mừng đến với Diaspora, %{name}!"
- many: "%{count} mối quan hệ"
- move_contact:
- error: "Lỗi khi dời liên lạc: %{inspect}"
- failure: "%{inspect} không làm việc"
- success: "Đã chuyển người sang mối quan hệ mới"
new:
create: "Tạo"
name: "Tên (chỉ bạn nhìn thấy)"
@@ -188,14 +182,6 @@ vi:
family: "Gia đình"
friends: "Bạn bè"
work: "Đồng nghiệp"
- selected_contacts:
- manage_your_aspects: "Quản lí các mối quan hệ."
- no_contacts: "Bạn chưa có liên lạc nào ở đây."
- view_all_community_spotlight: "Xem tất cả những người nổi bật trong cộng đồng"
- view_all_contacts: "Xem tất cả liên lạc"
- show:
- edit_aspect: "cập nhật mối quan hệ"
- two: "%{count} mối quan hệ"
update:
failure: "Mối quan hệ %{name} có tên quá dài, không thể lưu."
success: "Mối quan hệ %{name} đã được chỉnh sửa."
@@ -215,43 +201,34 @@ vi:
post_success: "Đã đăng bài! Đang đóng!"
cancel: "Hủy bỏ"
comments:
- few: "%{count} bình luận"
- many: "%{count} bình luận"
new_comment:
comment: "Bình luận"
commenting: "Đang gửi bình luận..."
one: "1 bình luận"
other: "%{count} bình luận"
- two: "%{count} bình luận"
zero: "không có bình luận"
contacts:
create:
failure: "Tạo liên lạc mới thất bại"
- few: "%{count} liên lạc"
index:
add_a_new_aspect: "Thêm mối quan hệ mới"
add_to_aspect: "thêm liên lạc vào %{name}"
- add_to_aspect_link: "thêm liên lạc vào %{name}"
all_contacts: "Tất cả liên lạc"
community_spotlight: "Nổi bật từ cộng đồng"
- many_people_are_you_sure: "Bạn có chắc là muốn trò chuyện với hơn %{suggested_limit} người khác? Posting to this aspect may be a better way to contact them."
my_contacts: "Liên lạc của tôi"
no_contacts: "Có vẻ như bạn cần thêm vài liên lạc!"
no_contacts_message: "Kiểm tra %{community_spotlight}"
- no_contacts_message_with_aspect: "Kiểm tra %{community_spotlight} hoặc %{add_to_aspect_link}"
only_sharing_with_me: "Chỉ chia sẻ với tôi"
- remove_person_from_aspect: "Loại bỏ %{person_name} khỏi \"%{aspect_name}\""
start_a_conversation: "Bắt đầu một cuộc trò chuyện"
title: "Liên lạc"
your_contacts: "Liên lạc của bạn"
- many: "%{count} liên lạc"
one: "1 liên lạc"
other: "%{count} liên lạc"
sharing:
people_sharing: "Người đang chia sẻ với bạn:"
spotlight:
community_spotlight: "Nổi bật từ cộng đồng"
- two: "%{count} liên lạc"
+ suggest_member: "Gợi ý một thành viên"
zero: "contacts"
conversations:
conversation:
@@ -260,8 +237,6 @@ vi:
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"
- destroy:
- success: "Đã loại bỏ cuộc hội thoại"
helper:
new_messages:
few: "%{count} tin nhắn mới"
@@ -300,8 +275,12 @@ vi:
fill_me_out: "Điền đầy đủ"
find_people: "Tìm người hoặc #tags"
help:
+ getting_started_tutorial: "Loạt bài hướng dẫn cho người mới"
+ here: "tại đây"
irc: "IRC"
markdown: "Markdown"
+ tutorial: "hướng dẫn"
+ tutorials: "hướng dẫn"
wiki: "wiki"
hide: "Ẩn"
invitation_codes:
@@ -494,8 +473,8 @@ vi:
invited_by: "bạn được mời bởi"
add_contact_small:
add_contact_from_tag: "thêm liên lạc từ thẻ"
- few: "%{count} người"
helper:
+ is_not_sharing: "%{name} hiện không chia sẻ với bạn"
is_sharing: "%{name} đang chia sẻ với bạn"
results_for: " kết quả cho %{params}"
index:
@@ -504,7 +483,6 @@ vi:
no_results: "Bạn cần tìm gì đó."
results_for: "kết quả tìm kiếm cho"
searching: "đang tìm, vui lòng chờ..."
- many: "%{count} người"
one: "1 người"
other: "%{count} người"
person:
@@ -541,7 +519,6 @@ vi:
add_some: "thêm"
edit: "sửa"
you_have_no_tags: "bạn không có thẻ nào!"
- two: "%{count} người"
webfinger:
fail: "Xin lỗi, chúng tôi không thể tìm %{handle}."
zero: "không có ai"
@@ -631,9 +608,7 @@ vi:
update: "Cập nhật"
invalid_invite: "Liên kết mời bạn cung cấp không còn hợp lệ!"
new:
- continue: "Tiếp tục"
create_my_account: "Tạo tài khoản"
- diaspora: "<3 Diaspora*"
email: "THƯ ĐIỆN TỬ"
enter_email: "Nhập địa chỉ thư điện tử"
enter_password: "Nhập mật khẩu (ít nhất sáu kí tự)"
@@ -758,9 +733,8 @@ vi:
get_location: "Lấy thông tin vị trí"
make_public: "công khai hoá"
new_user_prefill:
- hello: |-
- Xin chào mọi người,
- %{new_user_tag}.
+ hello: "Xin chào mọi người,\n\
+ %{new_user_tag}. "
i_like: "I'm interested in %{tags}."
invited_by: "Cám ơn vì lời mời, "
newhere: "NewHere"
@@ -798,9 +772,7 @@ vi:
no_message_to_display: "Không có tin nhắn."
new:
mentioning: "Đang nhắc đến: %{person}"
- too_long:
- other: "trạng thái của bạn phải có ít hơn %{count} kí tự"
- zero: "trạng thái của bạn phải có ít hơn %{count} kí tự"
+ too_long: "{\"other\"=>\"trạng thái của bạn phải có ít hơn %{count} kí tự\", \"zero\"=>\"trạng thái của bạn phải có ít hơn %{count} kí tự\"}"
stream_helper:
hide_comments: "Ẩn tất cả bình luận"
show_comments:
@@ -837,7 +809,6 @@ vi:
title: "Hoạt động công khai"
tags:
contacts_title: "People who dig these tags"
- tag_prefill_text: "Chia sẻ gì đó trên thẻ %{tag_name}... "
title: "Những bài đăng được gán thẻ: #%{tags}"
tag_followings:
create:
@@ -851,10 +822,7 @@ vi:
show:
follow: "Theo dõi #%{tag}"
following: "Đang theo dõi #%{tag}"
- nobody_talking: "Không có ai đang nói về %{tag}."
none: "Thẻ rỗng không tồn tại!"
- people_tagged_with: "Những người được gán thẻ %{tag}"
- posts_tagged_with: "Những bài đăng được gán thẻ #%{tag}"
stop_following: "Dừng theo dõi #%{tag}"
terms_and_conditions: "Điều khoản và điều kiện"
undo: "Hoàn lại?"
@@ -882,6 +850,7 @@ vi:
lock_username: "Tên đăng nhập của bạn sẽ bị khoá nếu bạn quyết định đăng kí lại."
locked_out: "Bạn sẽ bị đăng xuất và khoá tài khoản."
make_diaspora_better: "Chúng tôi muốn bạn cùng phát triển Diaspora tốt hơn, vì vậy bạn nên giúp đỡ thay vì rời đi. Nếu bạn không muốn ở lại, chúng tôi muốn biết chuyện gì sẽ xảy ra tiếp theo."
+ mr_wiggles: "Ông Wiggles sẽ buồn khi thấy bạn bỏ đi"
no_turning_back: "Hiện tại chưa có ai quay lại."
what_we_delete: "We delete all of your posts, profile data, as soon as humanly possible. Your comments will hang around, but be associated with your Diaspora Handle."
close_account_text: "Đóng tài khoản"
@@ -889,7 +858,6 @@ vi:
current_password: "Mật khẩu hiện tại"
current_password_expl: "bạn dùng để đăng nhập..."
download_photos: "ảnh chụp của tôi"
- download_xml: "định dạng xml"
edit_account: "Chỉnh sửa tài khoản"
email_awaiting_confirmation: "Chúng tôi đã gửi đường dẫn kích hoạt đến %{unconfirmed_email}. Chúng tôi vẫn dùng địa chỉ gốc của bạn %{email} cho đến khi bạn xác nhận địa chỉ mới."
export_data: "Xuất dữ liệu"
@@ -898,7 +866,6 @@ vi:
liked: "...có người thích bài đăng của tôi?"
mentioned: "...tôi được nhắc đến trong một bài đăng?"
new_password: "Mật khẩu mới"
- photo_export_unavailable: "Chức năng xuất ảnh hiện chưa hoạt động"
private_message: "...nhận được tin nhắn?"
receive_email_notifications: "Nhận thư điện tử thông báo khi..."
reshared: "...có người chia sẻ lại bài đăng của tôi?"
@@ -911,6 +878,7 @@ vi:
getting_started:
awesome_take_me_to_diaspora: "Tuyệt vời! Đưa tối đến Diaspora*"
community_welcome: "Cộng đồng Diaspora hân hạnh được chào đón bạn!"
+ connect_to_facebook_link: "Liên kết với tài khoản Facebook của bạn"
hashtag_explanation: "Thẻ cho phép bạn trò chuyện và theo dõi những gì bạn quan tâm. Chúng cũng giúp bạn tìm bạn mới trên Diaspora."
hashtag_suggestions: "Thử theo dõi các thẻ như #art, #movies, #gif, v.v..."
saved: "Đã lưu!"
diff --git a/config/locales/diaspora/wo.yml b/config/locales/diaspora/wo.yml
index 3f4472164..63ca58b8d 100644
--- a/config/locales/diaspora/wo.yml
+++ b/config/locales/diaspora/wo.yml
@@ -18,8 +18,6 @@ wo:
aspects:
aspect_listings:
edit_aspect: "Soppil %{name}"
- edit:
- done: "Raaf na"
index:
diaspora_id:
content_1: "Sa Limu Diaspora mooy:"
@@ -51,7 +49,6 @@ wo:
contacts:
index:
no_contacts_message: "Xoolal %{community_spotlight}"
- no_contacts_message_with_aspect: "Xoolal %{community_spotlight} walla %{add_to_aspect_link}"
conversations:
new:
to: "ci"
@@ -85,8 +82,6 @@ wo:
or: "walla"
password: "Baatujàll"
people:
- few: "%{count}i nit"
- many: "%{count}i nit"
one: "1 nit"
other: "%{count}i nit"
person:
@@ -99,7 +94,6 @@ wo:
see_all: "Gisal ñëpp"
sub_header:
edit: "soppil"
- two: "%{count}i nit"
photos:
comment_email_subject: "Nataalu %{name}"
edit:
@@ -133,7 +127,6 @@ wo:
edit: "Soppi %{name}"
unhappy: "Kontaanul?"
new:
- diaspora: "<3 Diaspora*"
email: "EMAIL"
enter_email: "Duggal email"
password: "BAATUJÀLL"
diff --git a/config/locales/diaspora/zh-CN.yml b/config/locales/diaspora/zh-CN.yml
index 425c44689..c5d3c5e15 100644
--- a/config/locales/diaspora/zh-CN.yml
+++ b/config/locales/diaspora/zh-CN.yml
@@ -78,7 +78,8 @@ zh-CN:
users:
other: "找到 %{count} 个用户"
zero: "找到 %{count} 个用户"
- you_currently: "您目前还可以邀请 %{user_invitation} 次 %{link}"
+ you_currently:
+ other: "您目前还可以邀请 %{user_invitation} 次 %{link}"
weekly_user_stats:
amount_of:
other: "本周新用户数目:%{count}"
@@ -102,8 +103,6 @@ zh-CN:
add_to_aspect:
failure: "将好友添加到分组失败。"
success: "将好友添加到分组成功。"
- aspect_contacts:
- done_editing: "编辑完成"
aspect_listings:
add_an_aspect: "+ 新增分组"
deselect_all: "清空选择"
@@ -122,21 +121,14 @@ zh-CN:
failure: "无法删除 %{name} ,它不是空的。"
success: "删除 %{name} 成功。"
edit:
- add_existing: "添加好友"
aspect_list_is_not_visible: "分组中的好友不能看见此分组的好友列表"
aspect_list_is_visible: "分组中的好友能够看见此分组的好友列表"
confirm_remove_aspect: "您确定要删除这个分组?"
- done: "完成"
make_aspect_list_visible: "是否让其他人可以看见此分组的好友列表?"
remove_aspect: "删除这个分组"
rename: "重命名"
update: "更新"
updating: "更新中"
- few: "%{count} 个分组"
- helper:
- are_you_sure: "您确定要删除这个分组?"
- aspect_not_empty: "此分组不是空的"
- remove: "删除"
index:
diaspora_id:
content_1: "您的 Diaspora 通行证是:"
@@ -172,11 +164,6 @@ zh-CN:
heading: "连接服务"
unfollow_tag: "取消关注 #%{tag}"
welcome_to_diaspora: "%{name},欢迎加入 Diaspora!"
- many: "%{count} 个分组"
- move_contact:
- error: "好友移动错误:%{inspect}"
- failure: "%{inspect} 失败"
- success: "好友成功添加到新分组"
new:
create: "创建"
name: "名字"
@@ -194,14 +181,6 @@ zh-CN:
family: "家人"
friends: "朋友"
work: "同事"
- selected_contacts:
- manage_your_aspects: "管理您的分组"
- no_contacts: "您没有选择任何联系人。"
- view_all_community_spotlight: "查看所有热点"
- view_all_contacts: "查看所有好友"
- show:
- edit_aspect: "编辑分组"
- two: "%{count} 个分组"
update:
failure: "分组 %{name} 名称太长了,不能保存"
success: "分组 %{name} 编辑成功。"
@@ -221,50 +200,38 @@ zh-CN:
post_success: "发布完成!关闭中。"
cancel: "取消"
comments:
- few: "%{count} 条回复"
- many: "%{count} 条回复"
new_comment:
comment: "回复"
commenting: "回复中……"
one: "1条回复"
other: "%{count} 条回复"
- two: "%{count} 条回复"
zero: "暂无回复"
contacts:
create:
failure: "添加好友失败"
- few: "%{count} 个好友"
index:
add_a_new_aspect: "加入新分组"
add_to_aspect: "将好友添加到 %{name}"
- add_to_aspect_link: "添加好友至 %{name}"
all_contacts: "所有好友"
community_spotlight: "社区热点"
- many_people_are_you_sure: "您确定要和 %{suggested_limit} 个好友对话?发布内容可能是更好的方式。"
my_contacts: "我的好友"
no_contacts: "尚未添加好友"
no_contacts_message: "来看看 %{community_spotlight}"
- no_contacts_message_with_aspect: "来看看 %{community_spotlight} 或者 %{add_to_aspect_link}"
only_sharing_with_me: "和我分享内容的人"
- remove_person_from_aspect: "将 %{person_name} 从 %{aspect_name} 中移除"
start_a_conversation: "开始对话"
title: "好友"
your_contacts: "您的好友"
- many: "%{count} 个好友"
one: "1 个好友"
other: "%{count} 个好友"
sharing:
people_sharing: "与您分享的人:"
spotlight:
community_spotlight: "社区热点"
- two: "%{count} 个好友"
zero: "尚未添加好友"
conversations:
create:
fail: "无效的信息"
sent: "消息发送成功"
- destroy:
- success: "消息移除成功"
helper:
new_messages:
other: "%{count} 条新消息"
@@ -308,6 +275,7 @@ zh-CN:
create:
already_contacts: "您已经将其加为好友了"
already_sent: "您已经邀请过这个人了。"
+ empty: "请至少填写一个邮箱"
no_more: "您暂无邀请函。"
own_address: "您不能发送邀请给自己。"
rejected: "下列电子信箱有问题: "
@@ -472,7 +440,6 @@ zh-CN:
add_contact_from_tag: "通过标签添加好友"
aspect_list:
edit_membership: "编辑所属分组"
- few: "%{count} 个好友"
helper:
results_for: " %{params} 的搜索结果"
index:
@@ -481,7 +448,6 @@ zh-CN:
no_results: "嘿! 搜索必须要有目标呀。"
results_for: "搜索结果:"
searching: "搜索中,请稍候…"
- many: "%{count} 个好友"
one: "1 个好友"
other: "%{count} 个好友"
person:
@@ -517,7 +483,6 @@ zh-CN:
add_some: "加入一些"
edit: "编辑"
you_have_no_tags: "您没有任何标签!"
- two: "%{count} 个好友"
webfinger:
fail: "抱歉,找不到 %{handle}。"
zero: "暂无好友"
@@ -607,17 +572,15 @@ zh-CN:
update: "更新"
invalid_invite: "您提供的邀请链接已失效"
new:
- continue: "继续"
create_my_account: "创建我的帐号"
- diaspora: "爱你的 Diaspora*"
email: "电子邮箱"
enter_email: "输入电子邮箱"
enter_password: "输入密码(至少6个字符)"
enter_password_again: "再输入一遍密码"
enter_username: "输入用户名(名称只能包含字母,数字和下划线“_”)"
- hey_make: "嘿,<br/>做点<br/>什么吧!"
join_the_movement: "参加此行动"
password: "密码"
+ password_confirmation: "密保信息"
sign_up: "注册"
sign_up_message: "有 <3 的社交网络"
username: "用户名"
@@ -769,9 +732,7 @@ zh-CN:
no_message_to_display: "暂无信息可显示。"
new:
mentioning: "提及发布中: %{person}"
- too_long:
- other: "请确保您的状态信息不超过 %{count} 个字符"
- zero: "请确保您的状态信息不超过 %{count} 个字符"
+ too_long: "{\"other\"=>\"请确保您的状态信息不超过 %{count} 个字符\", \"zero\"=>\"请确保您的状态信息不超过 %{count} 个字符\"}"
stream_helper:
hide_comments: "隐藏评论"
show_comments:
@@ -808,7 +769,6 @@ zh-CN:
title: "公开活动"
tags:
contacts_title: "这个标签的粉丝"
- tag_prefill_text: "关于 %{tag_name} 的事情是… "
title: "有以下标签的内容:%{tags}"
tag_followings:
create:
@@ -822,10 +782,7 @@ zh-CN:
show:
follow: "关注 #%{tag}"
following: "正在关注 #%{tag}"
- nobody_talking: "还没有人在讨论 %{tag}。"
none: "不存在空白标签!"
- people_tagged_with: "标记为 %{tag} 的人"
- posts_tagged_with: "标记为 #%{tag} 的内容"
stop_following: "停止关注 #%{tag}"
terms_and_conditions: "服务条款与细则"
undo: "撤消?"
@@ -861,7 +818,6 @@ zh-CN:
current_password: "当前密码"
current_password_expl: "登入的那个…"
download_photos: "下载我的照片"
- download_xml: "下载我的 xml"
edit_account: "编辑帐号"
email_awaiting_confirmation: "我们将向 %{unconfirmed_email} 发送一个确认邮件。在确认之前,我们将沿用 %{email} 这个联系方式。"
export_data: "资料导出"
@@ -870,7 +826,6 @@ zh-CN:
liked: "…当有人赞您发布的内容?"
mentioned: "…当贴文中提到您时?"
new_password: "新密码"
- photo_export_unavailable: "相片目前无法导出"
private_message: "…当收到私人信息时?"
receive_email_notifications: "是否要在以下情况收到电子邮件通知……"
reshared: "…有人转发您的内容时?"
diff --git a/config/locales/diaspora/zh-TW.yml b/config/locales/diaspora/zh-TW.yml
index 6ccbaef84..3e4593ff2 100644
--- a/config/locales/diaspora/zh-TW.yml
+++ b/config/locales/diaspora/zh-TW.yml
@@ -12,6 +12,8 @@ zh-TW:
_home: "我家"
_photos: "相片"
_services: "服務"
+ _statistics: "統計"
+ _terms: "使用條款"
account: "帳號"
activerecord:
errors:
@@ -23,7 +25,15 @@ zh-TW:
person:
attributes:
diaspora_handle:
- taken: "已經被用了。"
+ taken: "已經有人使用此帳號"
+ poll:
+ attributes:
+ poll_answers:
+ not_enough_poll_answers: "提供的投票選項不足。"
+ poll_participation:
+ attributes:
+ poll:
+ already_participated: "你已經參加這次票選了!"
request:
attributes:
from_id:
@@ -35,17 +45,18 @@ zh-TW:
user:
attributes:
email:
- taken: "已經被用了。"
+ taken: "已經有人使用。"
person:
invalid: "不合格。"
username:
invalid: "不合格。只能夠使用字母,數字,以及底線符號。"
- taken: "已經被用了。"
+ taken: "已經有人使用。"
admins:
admin_bar:
correlations: "關聯性"
pages: "分頁"
pod_stats: "豆莢統計資料"
+ report: "回報"
sidekiq_monitor: "Sidekiq 監視器"
user_search: "使用者搜尋"
weekly_user_stats: "使用者統計週報"
@@ -74,28 +85,48 @@ zh-TW:
other: "%{count}個使用者"
zero: "%{count}個使用者"
week: "一個禮拜"
+ user_entry:
+ account_closed: "帳號關閉了"
+ diaspora_handle: "Disaspora 帳號"
+ email: "電子信箱"
+ id: "識別碼"
+ last_seen: "最後看見時間"
+ ? "no"
+ : 否
+ unknown: "不知道"
+ ? "yes"
+ : 是
user_search:
+ account_closing_scheduled: "%{name} 這個帳號已經排定要關閉了。過一段時間後就會被執行了..."
+ account_locking_scheduled: "%{name} 這個帳號已經排定要上鎖了。過一段時間後就會被執行了..."
+ account_unlocking_scheduled: "%{name} 這個帳號已經排定要解鎖了。過一段時間後就會被執行了..."
add_invites: "增加邀請次數"
+ are_you_sure: "確定要關閉這個帳號嗎?"
+ are_you_sure_lock_account: "你確定要把帳號上鎖嗎?"
+ are_you_sure_unlock_account: "你確定要把帳號解鎖嗎?"
+ close_account: "關閉帳號"
email_to: "寄電子郵件邀請"
under_13: "顯示低於 13 歲的使用者(基於美國兒童網路隱私保護法案, COPPA)"
users:
other: "找到%{count}個使用者"
zero: "找到%{count}個使用者"
- you_currently: "你目前還可以邀請%{user_invitation}次 %{link}"
+ view_profile: "看個人檔案"
+ you_currently:
+ other: "你目前還可以邀請%{user_invitation}次 %{link}"
weekly_user_stats:
amount_of:
other: "本週新使用者數目:%{count}"
- zero: "本週新使用者數目:沒有"
+ zero: "本週新使用者數目:0"
current_server: "伺服器現在的日期是%{date}"
ago: "%{time}前"
- all_aspects: "所有面向"
+ all_aspects: "所有話題"
application:
helper:
unknown_person: "不明聯絡人"
video_title:
unknown: "影片標題不明"
- are_you_sure: "你確定嗎?"
- are_you_sure_delete_account: "你確定要關帳號嗎?沒辦法復原喔!"
+ are_you_sure: "確定?"
+ are_you_sure_delete_account: "確定要關閉帳號嗎?帳號無法復原喔!"
aspect_memberships:
destroy:
failure: "從面向中移除聯絡人失敗"
@@ -105,8 +136,6 @@ zh-TW:
add_to_aspect:
failure: "將聯絡人加入至面向失敗。"
success: "將聯絡人加入至面向成功。"
- aspect_contacts:
- done_editing: "編輯完成"
aspect_listings:
add_an_aspect: "+ 新增面向"
deselect_all: "全不選"
@@ -116,8 +145,8 @@ zh-TW:
make_something: "做點什麼"
stay_updated: "隨時保持最新狀態"
stay_updated_explanation: "你的主流水帳會充滿了你的聯絡人,追蹤的標籤,以及其他有創意的社群成員的貼文。"
- contacts_not_visible: "此面向中的聯絡人無法看見彼此。"
- contacts_visible: "此面向中的聯絡人可以看見彼此。"
+ contacts_not_visible: "此話題中的聯絡人彼此不可見"
+ contacts_visible: "此話題中的聯絡人彼此可見"
create:
failure: "創造面向失敗。"
success: "新的面向%{name}已經造出來了"
@@ -125,30 +154,25 @@ zh-TW:
failure: "無法刪除%{name},因為它不是空的。"
success: "成功刪除%{name}了。"
edit:
- add_existing: "加入既有聯絡人"
+ aspect_chat_is_enabled: "面向中的聯絡人可以和你聊天。"
+ aspect_chat_is_not_enabled: "面向中的聯絡人不能和你聊天。"
aspect_list_is_not_visible: "在這個面向中的連絡人沒辦法看見哪些人在同一個面向中"
aspect_list_is_visible: "在這個面向中的連絡人可以互相看見他們在同一個面向中"
- confirm_remove_aspect: "你確定要刪除這個面向嗎?"
- done: "完成"
- make_aspect_list_visible: "讓面向中的聯絡人可以互相看得到嗎?"
- manage: "管理"
- remove_aspect: "刪除這個面向"
+ confirm_remove_aspect: "確定要刪除這個話題嗎?"
+ grant_contacts_chat_privilege: "要把聊天的權限給面向中的聯絡人嗎?"
+ make_aspect_list_visible: "讓此話題中的聯絡人彼此可見嗎?"
+ remove_aspect: "刪除這個話題"
rename: "改名"
set_visibility: "設定可見範圍"
update: "更新"
updating: "更新中"
- few: "%{count}個面向"
- helper:
- are_you_sure: "你確定要刪除這個面向嗎?"
- aspect_not_empty: "面向不是空的"
- remove: "刪除"
index:
diaspora_id:
- content_1: "你的 Diaspora 識別碼是:"
- content_2: "把它給任何人,讓他們可以在 Diaspora 找到你。"
- heading: "Diaspora 識別碼"
+ content_1: "你的 Diaspora 帳號是:"
+ content_2: "透過帳號名稱,其他人可以在 diaspora* 找到你。"
+ heading: "Diaspora 帳號"
donate: "捐助"
- handle_explanation: "這是你的 Diaspora 識別碼。就像電子信箱一樣,你可以把它給想聯絡你的人。"
+ handle_explanation: "這是你的 Diaspora 帳號。就像電子信箱一樣,其他人可以透過它來聯絡你。"
help:
any_problem: "有問題嗎?"
contact_podmin: "聯絡豆莢管理員!"
@@ -158,7 +182,7 @@ zh-TW:
feature_suggestion: "...想建議%{link}嗎?"
find_a_bug: "...找到一隻%{link}嗎?"
have_a_question: "...有個%{link}嗎?"
- here_to_help: "Diaspora 社群就在這裡!"
+ here_to_help: "diaspora* 社群來了!"
mail_podmin: "莢主的電郵信箱"
need_help: "要幫忙嗎?"
tag_bug: "臭蟲"
@@ -167,7 +191,7 @@ zh-TW:
tutorial_link_text: "個別指導"
tutorials_and_wiki: "%{faq},%{tutorial},還有%{wiki}:讓你順利上手的好幫手。"
introduce_yourself: "這是你的流水帳。跳進來介紹你自己吧。"
- keep_diaspora_running: "每月固定捐助讓 Diaspora 快速研發!"
+ keep_diaspora_running: "每個月固定捐款給 diaspora* 幫助研發繼續成長"
keep_pod_running: "讓 %{pod} 高速運轉,現在就開始固定每月捐助,來供應伺服器的咖啡耗材吧!"
new_here:
follow: "追蹤 %{link} 來歡迎 diaspora* 的新人!"
@@ -178,15 +202,10 @@ zh-TW:
people_sharing_with_you: "跟你分享的人"
post_a_message: "貼訊息 >>"
services:
- content: "你可以將以下服務跟 Diaspora 連結:"
+ content: "你可以將以下服務跟 diaspora* 連結:"
heading: "連結服務"
unfollow_tag: "停止追蹤 #%{tag}"
- welcome_to_diaspora: "歡迎來到 Diaspora,%{name}!"
- many: "%{count}個面向"
- move_contact:
- error: "聯絡人移動錯誤:%{inspect}"
- failure: "因%{inspect}而沒有作用"
- success: "聯絡人移至新的面向了"
+ welcome_to_diaspora: "%{name},歡迎來到 diaspora*!"
new:
create: "建立"
name: "名字(只有你自己看得到)"
@@ -197,26 +216,18 @@ zh-TW:
you_should_add_some_more_contacts: "新增更多聯絡人吧!"
no_posts_message:
start_talking: "都還沒有人出聲!"
- one: "1個面向"
- other: "%{count}個面向"
+ one: "1個話題"
+ other: "%{count}個話題"
seed:
acquaintances: "認識的人"
family: "家人"
friends: "朋友"
work: "工作"
- selected_contacts:
- manage_your_aspects: "管理你的面向。"
- no_contacts: "你在這裡還沒有任何聯絡人。"
- view_all_community_spotlight: "看所有的社群焦點"
- view_all_contacts: "檢視所有聯絡人"
- show:
- edit_aspect: "編輯面向"
- two: "%{count}個面向"
update:
failure: "你的面向%{name}名稱太長了無法儲存。"
success: "你的面向%{name}已經編輯完成了。"
- zero: "沒有面向"
- back: "後退"
+ zero: "不屬於任何話題"
+ back: "上一步"
blocks:
create:
failure: "我無法忽視這個使用者。 #藉口"
@@ -225,42 +236,37 @@ zh-TW:
failure: "我無法停止忽視這個使用者。 #藉口"
success: "看看他們要說什麼吧! #打招呼"
bookmarklet:
- explanation: "把這個可以貼任何網頁到 Diaspora 的連結加入書籤 => %{link}。"
+ explanation: "將此連結加入書籤 => %{link},可以隨時在diaspora*發文"
heading: "書籤小程式"
- post_something: "貼到 Diaspora"
+ post_something: "貼到 diaspora*"
post_success: "貼好了!關掉中!"
cancel: "取消"
comments:
- few: "%{count}則意見"
- many: "%{count}則意見"
new_comment:
comment: "發表意見"
commenting: "意見發表中..."
one: "1個意見"
other: "%{count}則意見"
- two: "%{count}個意見"
zero: "沒有意見"
contacts:
create:
failure: "建立聯繫失敗"
- few: "%{count}個聯絡人"
index:
add_a_new_aspect: "加入新面向"
+ add_contact: "加聯絡人"
add_to_aspect: "加聯絡人到%{name}"
- add_to_aspect_link: "加聯絡人到%{name}"
all_contacts: "所有聯絡人"
community_spotlight: "社群焦點"
- many_people_are_you_sure: "你確定要進行跟%{suggested_limit}個聯絡人的私人對話?貼文到該面向可能是跟他們聯絡比較好的方式。"
my_contacts: "我的聯絡人"
no_contacts: "你好像應該要多加點聯絡人!"
+ no_contacts_in_aspect: "你在這個面向中還沒有任何聯絡人。下面是你可以加入到這個面向的聯絡人列表。"
no_contacts_message: "來看看 %{community_spotlight}"
- no_contacts_message_with_aspect: "來看看 %{community_spotlight} 或是 %{add_to_aspect_link}"
only_sharing_with_me: "和我分享的人"
- remove_person_from_aspect: "將 %{person_name} 從\"%{aspect_name}\"中移除"
+ remove_contact: "刪聯絡人"
start_a_conversation: "開始對話"
title: "聯絡人"
+ user_search: "使用者搜尋"
your_contacts: "你的聯絡人"
- many: "%{count}個聯絡人"
one: "1個聯絡人"
other: "%{count}個聯絡人"
sharing:
@@ -268,7 +274,6 @@ zh-TW:
spotlight:
community_spotlight: "社群焦點"
suggest_member: "推薦會員"
- two: "%{count}個聯絡人"
zero: "聯絡人"
conversations:
conversation:
@@ -278,13 +283,17 @@ zh-TW:
no_contact: "喂,你要先新增聯絡人才行!"
sent: "訊息送出去了"
destroy:
- success: "對話移除成功"
+ delete_success: "對話成功刪掉了"
+ hide_success: "對話成功隱藏起來了"
helper:
new_messages:
other: "有%{count}則新訊息"
zero: "沒有新訊息"
index:
+ conversations_inbox: "交談 - 收件匣"
+ create_a_new_conversation: "開始新的交談"
inbox: "收件匣"
+ new_conversation: "開始交談"
no_conversation_selected: "沒有選取任何對話"
no_messages: "沒有訊息"
new:
@@ -293,8 +302,11 @@ zh-TW:
sending: "傳送中..."
subject: "主旨"
to: "收件人"
+ new_conversation:
+ fail: "訊息無效"
show:
- delete: "刪除並中止對話"
+ delete: "刪除對話"
+ hide: "把對話隱藏並且消音"
reply: "回覆"
replying: "回覆中..."
date:
@@ -311,7 +323,7 @@ zh-TW:
login_try_again: "請<a href='%{login_link}'>登入</a>後再試一次。"
post_not_public: "你要看的貼文沒有公開!"
post_not_public_or_not_exist: "你要看的貼文沒有公開,或是根本不存在!"
- fill_me_out: "填寫我"
+ fill_me_out: "填寫此欄"
find_people: "找人或 #標籤"
help:
account_and_data_management:
@@ -330,6 +342,7 @@ zh-TW:
contacts_know_aspect_a: "不知道。無論如何他們都看不到面向的名稱。"
contacts_know_aspect_q: "我的聯絡人知道我把他們放到哪些面向裡面嗎?"
contacts_visible_q: "\"讓面向中的聯絡人可以互相看得到\"是什麼意思?"
+ remove_notification_q: "如果某人從一個話題,或所有話題中遭到移除,他們會收到通知嗎?"
restrict_posts_i_see_a: "可以。請點一下側邊欄的你的面向,然後用點個別的面向來選擇,或是取消選擇他們。只有被選擇的貼文才會出現在流水帳裡。"
restrict_posts_i_see_q: "我可以過濾只看到來自特定面向的貼文嗎?"
title: "面向"
@@ -337,6 +350,7 @@ zh-TW:
what_is_an_aspect_q: "什麼是面向?"
who_sees_post_a: "當你發表了一篇有限的貼文,就只有你那一個面向(或是那些面向,你也可以選擇好幾個面向)中的人才看得到。不在那個(或那些)面向中的聯絡人,就看不到那篇貼文,除非你把它公開。只有公開的貼文可以讓不在你任何面向中的其它人看到。"
who_sees_post_q: "當我貼文到一個面向時,誰看得到?"
+ faq: "常見問答"
foundation_website: "Diaspora 基金會網站"
getting_help:
get_support_a_hashtag: "公開用 %{question} 標籤在 diaspora* 上發問"
@@ -350,6 +364,10 @@ zh-TW:
title: "求助"
getting_started_tutorial: "’出發囉‘個別指導系列"
irc: "IRC"
+ keyboard_shortcuts:
+ keyboard_shortcuts_li5: "r - 轉貼目前的貼文"
+ keyboard_shortcuts_li6: "m - 展開目前的貼文"
+ keyboard_shortcuts_li7: "o - 開啟目前貼文的第一條連結"
pods:
find_people_a: "你可以用網頁旁邊的電子郵件連結來邀請你的朋友。也可以追蹤 #標籤 來尋找跟你志同道合的人,當他們發表了你有興趣的貼文時,你就可以將他們加到你的面向裡。你也可以公開貼文大喊你是 #新來的"
find_people_q: "我剛剛加入一個豆莢,要怎麼找到其它可以分享的人?"
@@ -362,6 +380,7 @@ zh-TW:
add_to_aspect_li7: "Amy 會出現在 Ben 聯絡人頁面中的\"和我分享的人\"裡面。"
only_sharing_a: 這些人已經把你加到他們的面向中了,但是你的面向中沒有他們。也就是說他們有跟你分享,但是你卻沒有跟他們分享(非對稱的分享)。如果你把他們加到任何一個面向,他們就會出現在那個面向的列表中,而不會在"和我分享的人"裡面。請看上面。
only_sharing_q: 出現在聯絡人頁面中"和我分享的人"裡面的人是誰?
+ third_party_tools: "第三方工具"
tutorial: "個別指導"
tutorials: "個別指導"
wiki: "維基"
@@ -388,13 +407,13 @@ zh-TW:
new:
already_invited: "這些人還沒有接受你的邀請:"
aspect: "面向"
- check_out_diaspora: "來 Diaspora 看看吧!"
+ check_out_diaspora: "來 diaspora* 看看吧!"
codes_left:
other: "還可以邀請%{count}個人"
zero: "不能邀請更多人了"
comma_separated_plz: "可以用逗號分隔來輸入多個電子信箱。"
if_they_accept_info: "如果他們接受,就會被加入至你所邀請的面向中。"
- invite_someone_to_join: "邀請某人來加入 Diaspora!"
+ invite_someone_to_join: "邀請其他人加入 diaspora*!"
language: "語言"
paste_link: "將這個連結分享給你的朋友,來邀請他們加入 diaspora*,或者也可以直接寄電子郵件給他們。"
personal_message: "個人訊息"
@@ -407,7 +426,7 @@ zh-TW:
application:
back_to_top: "回最上面"
powered_by: "強力配置 diaspora*"
- public_feed: "%{name} 的 Diaspora 公開資訊源"
+ public_feed: "%{name} 在 diaspora* 的公開發文"
source_package: "下載原始碼套件"
toggle: "行動切換"
whats_new: "有什麼新消息嗎?"
@@ -434,25 +453,27 @@ zh-TW:
people_like_this_comment:
other: "有%{count}個人說讚"
zero: "沒人說讚"
- limited: "有限"
+ limited: "設限"
more: "更多"
next: "後面"
no_results: "搜尋沒有結果"
notifications:
also_commented:
- other: "%{actors} 也對 %{post_author} 的%{post_link}發表了意見。"
- zero: "%{actors} 也對 %{post_author} 的%{post_link}發表了意見。"
+ other: "%{actors} 也評論了 %{post_author} 的%{post_link}發文"
+ zero: "%{actors} 也評論了 %{post_author} 的%{post_link}發文"
also_commented_deleted:
other: "%{actors} 對已刪掉的貼文發表了意見。"
zero: "%{actors} 對已刪掉的貼文發表了意見。"
comment_on_post:
- other: "%{actors} 對你的%{post_link}發表了意見。"
- zero: "%{actors} 對你的%{post_link}發表了意見。"
+ other: "%{actors} 評論了你的發文%{post_link}"
+ zero: "%{actors} 評論了你的發文%{post_link}"
helper:
new_notifications:
other: "有%{count}個新消息"
zero: "沒有新消息"
index:
+ all_notifications: "全部的消息"
+ also_commented: "有其他意見"
and: "和"
and_others:
few: "和其他%{count}個人"
@@ -461,18 +482,28 @@ zh-TW:
other: "和其他%{count}個人"
two: "以及其他%{count}個"
zero: "以外沒有其他人"
- mark_all_as_read: "全部標示為看過了"
+ comment_on_post: "貼文有意見"
+ liked: "有讚"
+ mark_all_as_read: "全部標示為已讀"
+ mark_all_shown_as_read: "把目前顯示的都標示成讀過了"
+ mark_read: "標示為看過了"
mark_unread: "標示為沒看過"
+ mentioned: "有被提到"
+ no_notifications: "目前還沒有任何消息。"
notifications: "消息"
+ reshared: "有被轉貼"
+ show_all: "看全部"
+ show_unread: "看沒讀過的"
+ started_sharing: "開始分享"
liked:
- other: "%{actors} 說你的%{post_link}很讚。"
- zero: "%{actors} 說你的%{post_link}很讚。"
+ other: "%{actors} 說你的發文%{post_link}很讚。"
+ zero: "%{actors} 說你的發文%{post_link}很讚。"
liked_post_deleted:
other: "%{actors} 說你刪掉了的貼文很讚。"
zero: "%{actors} 說你刪掉了的貼文很讚。"
mentioned:
- other: "%{actors} 在%{post_link}中點到了你。"
- zero: "%{actors} 在%{post_link}中點到了你。"
+ other: "%{actors} 在%{post_link}中提到了你"
+ zero: "%{actors} 在%{post_link}中提到了你"
mentioned_deleted:
other: "%{actors} 在已刪掉的貼文中點到了你。"
zero: "%{actors} 在已刪掉的貼文中點到了你。"
@@ -481,8 +512,8 @@ zh-TW:
other: "%{actors} 寫了訊息給你。"
zero: "%{actors} 寫了訊息給你。"
reshared:
- other: "%{actors} 轉貼了你的%{post_link}。"
- zero: "%{actors} 轉貼了你的%{post_link}。"
+ other: "%{actors} 轉貼了你的發文%{post_link}。"
+ zero: "%{actors} 轉貼了你的發文%{post_link}。"
reshared_post_deleted:
other: "%{actors} 轉貼了你刪掉的貼文。"
zero: "%{actors} 轉貼了你刪掉的貼文。"
@@ -490,7 +521,9 @@ zh-TW:
other: "%{actors} 開始跟你分享了。"
zero: "%{actors} 開始跟你分享了。"
notifier:
+ a_limited_post_comment: "你在 diaspora* 有一則有限貼文上的新評論可看。"
a_post_you_shared: "一篇貼文."
+ a_private_message: "你在 diaspora* 有一則新的私人訊息。"
accept_invite: "接受來自 diaspora* 的邀請吧!"
click_here: "按這裡"
comment_on_post:
@@ -499,6 +532,39 @@ zh-TW:
click_link: "請點以下連結,來啟用你新的電子信箱 %{unconfirmed_email}:"
subject: "請啟用你新的電子信箱 %{unconfirmed_email}"
email_sent_by_diaspora: "這封電子郵件是從 %{pod_name} 寄出。如果你不想再收到這類的信件,"
+ export_email:
+ body: |-
+ 嗨, %{name},
+ 你的資料已經處理好了,你可以去以下連結下載: %{url}
+
+ 祝快樂!
+ Diaspora* 電郵機器人
+ subject: "%{name},你的個人資料已經可以下載了"
+ export_failure_email:
+ body: |-
+ 嗨,%{name},
+ 我們在處理你要下載的個人資料時,發生了問題。
+ 要麻煩你再重試一次!
+
+ 祝快樂!
+ Diaspora* 電郵機器人
+ subject: "很抱歉,%{name},你的資料有問題"
+ export_photos_email:
+ body: |-
+ 嗨,%{name}!
+ 你的相片已經處理好了,請用這個連結來下載: %{url}
+
+ 祝快樂,
+ Diaspora* 電郵機器人敬上。
+ subject: "可以下載相片了,%{name}"
+ export_photos_failure_email:
+ body: |-
+ 嗨,%{name}!
+ 我們在準備你的相片下載檔案時發生了錯誤,麻煩你重試一次!
+
+ 很抱歉,
+ Diaspora* 電郵機器人敬上。
+ subject: "你的相片有問題,%{name}"
hello: "%{name} 你好!"
invite:
message: |-
@@ -525,12 +591,43 @@ zh-TW:
subject: "%{name} 在 diaspora* 點到了你"
private_message:
reply_to_or_view: "回或看這次對話 >"
+ remove_old_user:
+ body: |-
+ 你好,
+
+ 因為你已經有 %{after_days} 天沒有使用在 %{pod_url} 的帳號,我們覺得似乎你已經不想要它了。我們為了提供給這個 diaspora* 豆莢的使用者最好的效率,因此會定時從資料庫移除掉那些已經沒人要的帳號。
+
+ 我們希望你可以繼續參與 diaspora* 社群,因此只要你還想要你的帳號,我們就會繼續保留它。
+
+ 如果你還想要自己的帳號,你唯一需要做的只有在%{remove_after}之前用這個帳號來登入。登入後,建議你花點時間看看 diaspora*, 相信你會發現從上次來到現在已經改變了很多,我們也希望你會希望這些改進。你也可以追蹤一些 #標籤 來找到喜歡的內容。
+
+ 登入網址是: %{login_url} 如果你忘記了要怎麽登入,也可以在那個頁面找到提示。
+
+ 希望可以再次見到你!
+
+ Diaspora* 電子郵件機器人。
+ subject: "你的 diaspora* 帳號因為太久沒有活動而被標上移除記號了"
+ report_email:
+ body: |-
+ 你好,
+ 識別碼%{id}的%{type}被標記為有攻擊性了。
+ [%{url}](註1)
+ 請盡快檢查看看!
+
+ 謝謝!
+ Disaspora* 電子郵件機器人
+
+ 註1: %{url}
+ subject: "有新的%{type}被標記為有攻擊性"
+ type:
+ comment: "意見"
+ post: "貼文"
reshared:
reshared: "%{name} 轉貼了你的貼文"
view_post: "看貼文 >"
single_admin:
- admin: "為您服務的 Diaspora 管理員"
- subject: "有關於你的 Diaspora 帳號的訊息:"
+ admin: "你的 diaspora* 管理員"
+ subject: "關於你的 diaspora* 帳號:"
started_sharing:
sharing: "開始跟你分享了!"
subject: "%{name} 開始在 diaspora* 跟你分享了"
@@ -538,10 +635,10 @@ zh-TW:
thanks: "謝謝,"
to_change_your_notification_settings: "來更改消息通知的設定"
nsfw: "NSFW(上班時不宜)"
- ok: "好了"
+ ok: "確定"
or: "或是"
password: "密碼"
- password_confirmation: "密碼確認"
+ password_confirmation: "確認密碼"
people:
add_contact:
invited_by: "邀請你的使用者"
@@ -549,18 +646,19 @@ zh-TW:
add_contact_from_tag: "從標籤新增聯絡人"
aspect_list:
edit_membership: "編輯所屬面向"
- few: "%{count}個聯絡人"
helper:
is_not_sharing: "%{name} 沒有跟你分享"
is_sharing: "%{name} 正在跟你分享中"
results_for: "%{params}的搜尋結果"
index:
+ couldnt_find_them: "找不到他們嗎?"
looking_for: "在找標記為 %{tag_link} 的貼文嗎?"
no_one_found: "...找不到任何東西。"
no_results: "喂!搜尋要有目標。"
- results_for: "搜尋結果:"
+ results_for: "符合搜尋結果的使用者:"
+ search_handle: "確定要用你朋友們的 diaspora* 識別碼來找到他們。"
searching: "搜尋中,請耐心等待..."
- many: "%{count}個聯絡人"
+ send_invite: "還是找不到人嗎?寄一封邀請卡吧!"
one: "1個聯絡人"
other: "%{count}個聯絡人"
person:
@@ -597,7 +695,6 @@ zh-TW:
add_some: "加入一些"
edit: "編輯"
you_have_no_tags: "你沒有任何標籤!"
- two: "%{count}個人"
webfinger:
fail: "抱歉,找不到 %{handle}。"
zero: "沒有聯絡人"
@@ -648,11 +745,11 @@ zh-TW:
reshare_by: "%{author} 轉貼"
previous: "前面"
privacy: "隱私"
- privacy_policy: "隱私方案"
+ privacy_policy: "隱私權政策"
profile: "個人檔案"
profiles:
edit:
- allow_search: "讓別人可以在 Diaspora 搜尋到你"
+ allow_search: "讓其他 diaspora* 使用者可以搜尋你"
edit_profile: "編輯個人檔案"
first_name: "名字(前)"
last_name: "名字(後)"
@@ -678,9 +775,9 @@ zh-TW:
other: "有%{count}次回應"
zero: "沒有回應"
registrations:
- closed: "本 Diaspora 豆莢不開放登記。"
+ closed: "此一 diaspora* 空間不開放註冊"
create:
- success: "你已經加入 Diaspora 了!"
+ success: "你已經成功加入 diaspora* 了!"
edit:
cancel_my_account: "取消我的帳號"
edit: "編輯 %{name}"
@@ -690,26 +787,40 @@ zh-TW:
update: "更新"
invalid_invite: "你提供的邀請連結已經失效了!"
new:
- continue: "繼續"
create_my_account: "開我的帳號!"
- diaspora: "<3 diaspora*"
email: "電子信箱"
enter_email: "輸入電子信箱"
enter_password: "輸入密碼(至少六個字)"
enter_password_again: "輸入與前面相同的密碼"
enter_username: "選個使用者名稱(名稱只能包含拉丁字母,數字,以及底線字元)"
- hey_make: "嗨,來<br/>做<br/>點什麼吧。"
join_the_movement: "參與這個運動!"
password: "密碼"
password_confirmation: "密碼確認"
sign_up: "註冊"
sign_up_message: "有♥的社交網路"
submitting: "提交中..."
+ terms: "一旦註冊帳號就表示你接受 %{terms_link} 。"
+ terms_link: "服務條款"
username: "使用者名稱"
+ report:
+ comment_label: "<b>意見</b>:<br>%{data}"
+ confirm_deletion: "確定要刪除這一項嗎?"
+ delete_link: "刪除項目"
+ not_found: "<u>目標貼文或意見找不到了。可能已經被主人給刪掉了!</u>"
+ post_label: "<b>貼文</b>: %{title}"
+ reason_label: "理由: %{text}"
+ reported_label: "<b>回報人<b> %{person}"
+ review_link: "標記為看過了"
+ status:
+ created: "一則回報產生了"
+ destroyed: "貼文已經被銷毀了"
+ failed: "發生問題了"
+ marked: "已經把這則回報標記為看過了"
+ title: "回報總覽"
requests:
create:
sending: "傳送中"
- sent: "你已經要求要和 %{name} 分享了。他們下次登入 Diaspora 時就會看見。"
+ sent: "已經和 %{name} 分享了你的貼文。他們下次登入diaspora* 時就會看見。"
destroy:
error: "請選一個面向!"
ignore: "不理會建立聯繫的請求。"
@@ -752,7 +863,7 @@ zh-TW:
failure:
error: "與該服務連結時有錯誤"
finder:
- fetching_contacts: "Diaspora 正在取得你在 %{service} 的朋友資料,請幾分鐘後再來看看。"
+ fetching_contacts: "diaspora* 正在取得你在 %{service} 的朋友資料,請幾分鐘後再來看看。"
no_friends: "沒有 Facebook 朋友。"
service_friends: "%{service} 朋友"
index:
@@ -765,13 +876,13 @@ zh-TW:
logged_in_as: "已經登入為"
no_services: "你還沒有任何連結了的服務。"
really_disconnect: "切斷與 %{service} 的連結?"
- services_explanation: "連結到其他服務可以讓你在貼文到 Diaspora 的同時,也發表到這些服務去。"
+ services_explanation: "和其他服務連結可以將你在 diaspora* 的貼文同時發表在其他服務上"
inviter:
click_link_to_accept_invitation: "請按這個連結來接受邀請"
join_me_on_diaspora: "跟我一起加入 diaspora*"
remote_friend:
invite: "邀請"
- not_on_diaspora: "還沒來 Diaspora"
+ not_on_diaspora: "尚未註冊 diaspora*"
resend: "重送"
settings: "設定"
share_visibilites:
@@ -781,13 +892,15 @@ zh-TW:
shared:
add_contact:
add_new_contact: "加入新聯絡人"
- create_request: "以 Diaspora 識別碼搜尋"
+ create_request: "以 diaspora* 帳號搜尋"
diaspora_handle: "diaspora@pod.org"
- enter_a_diaspora_username: "輸入 Diaspora 使用者名稱:"
+ enter_a_diaspora_username: "輸入 diaspora* 使用者名稱:"
know_email: "知道他們的電子信箱嗎?你應該邀請他們來"
- your_diaspora_username_is: "你的 Diaspora 使用者名稱是:%{diaspora_handle}"
+ your_diaspora_username_is: "你的 diaspora* 使用者名稱是:%{diaspora_handle}"
aspect_dropdown:
add_to_aspect: "加聯絡人"
+ mobile_row_checked: "%{name} (移除)"
+ mobile_row_unchecked: "%{name} (新增)"
toggle:
few: "在%{count}個面向中"
many: "在%{count}個面向中"
@@ -808,8 +921,8 @@ zh-TW:
invite_someone: "邀請某人來"
invite_your_friends: "邀請你的朋友"
invites: "邀請"
- invites_closed: "目前本 Diaspora 豆莢不開放邀請功能"
- share_this: "用這個連結來分享在電子郵件,部落格,或其他你喜愛的社交網站上!"
+ invites_closed: "本 diaspora* 空間目前不開放邀請"
+ share_this: "將這個連結透過電子郵件、部落格,或其他你喜愛的社交網站分享出去!"
notification:
new: "%{from} 有新的%{type}"
public_explain:
@@ -818,7 +931,7 @@ zh-TW:
logged_in: "已登入至 %{service}"
manage: "管理已連線的服務"
new_user_welcome_message: "用 #雜湊標籤 來區分你的貼文,並且找到跟你有共同興趣的人。用 @指指點點 來叫出帥氣的人。"
- outside: "不使用 Diaspora 的人也能看到公開訊息。"
+ outside: "不使用 diaspora* 的人也能夠看到公開訊息"
share: "分享"
title: "設定連線服務"
visibility_dropdown: "用這個下拉式選單來改變貼文的可見範圍。(建議你這篇首貼設為公開。)"
@@ -834,10 +947,17 @@ zh-TW:
i_like: "我對 %{tags} 有興趣。"
invited_by: "謝謝你的邀請,"
newhere: "新來的"
+ poll:
+ add_a_poll: "新增一輪投票"
+ add_poll_answer: "增加選項"
+ option: "選項 1"
+ question: "問題"
+ remove_poll_answer: "移除選項"
post_a_message_to: "在 %{aspect} 發表訊息"
posting: "發表中..."
preview: "預覽"
publishing_to: "發表至:"
+ remove_location: "移除位置資訊"
share: "分享"
share_with: "跟他/她分享:"
upload_photos: "上傳照片"
@@ -862,10 +982,25 @@ zh-TW:
simple_captcha:
label: "請輸入方塊中顯示的密碼:"
message:
- default: "密碼跟圖形內容不符"
+ default: "驗證碼與圖中不符"
failed: "人類確認檢查失敗"
- user: "圖形和密碼不一樣"
+ user: "驗證碼與圖中不符"
placeholder: "請輸入圖形中的內容"
+ statistics:
+ active_users_halfyear: "半年內活躍使用者數"
+ active_users_monthly: "當月活躍使用者數"
+ closed: "關閉"
+ disabled: "不適用"
+ enabled: "可用"
+ local_comments: "當地意見發表量"
+ local_posts: "當地貼文量"
+ name: "名字"
+ network: "網路"
+ open: "開放"
+ registrations: "註冊數"
+ services: "服務"
+ total_users: "使用者總數"
+ version: "版本"
status_messages:
create:
success: "成功推薦了:%{names}"
@@ -875,15 +1010,11 @@ zh-TW:
no_message_to_display: "沒有訊息可顯示。"
new:
mentioning: "指指點點中:%{person}"
- too_long:
- few: "請限制狀態訊息在%{count}個字內"
- many: "請限制狀態訊息在%{count}個字內"
- one: "請限制狀態訊息在%{count}個字內"
- other: "請限制狀態訊息在%{count}個字內"
- two: "請縮短你的狀態訊息在%{count}個字元以下"
- zero: "請限制狀態訊息在%{count}個字內"
+ too_long: "發文請在 %{count} 字內. 現在字數為 %{current_length}"
stream_helper:
hide_comments: "隱藏所有意見"
+ no_more_posts: "你已經抵達流水帳的最下游了。"
+ no_posts_yet: "目前還沒有任何貼文。"
show_comments:
other: "顯示另外%{count}個意見"
zero: "沒有其它意見"
@@ -918,7 +1049,6 @@ zh-TW:
title: "公開活動"
tags:
contacts_title: "這個標籤的粉絲"
- tag_prefill_text: "有關於 %{tag_name} 的事情是... "
title: "有以下標籤的貼文:%{tags}"
tag_followings:
create:
@@ -929,19 +1059,17 @@ zh-TW:
failure: "停止追蹤標籤 #%{name} 失敗。也許你已經沒在追蹤了吧?"
success: "唉!你從此不再追蹤標籤 #%{name} 了。"
tags:
+ name_too_long: "請讓標籤長度少於 %{count} 個字元。目前字元數是 %{current_length}"
show:
follow: "追蹤 #%{tag}"
- followed_by_people:
- other: "有%{count}個人追蹤"
- zero: "沒人追蹤"
following: "正在追蹤 #%{tag}"
- nobody_talking: "還沒有人在討論 %{tag}。"
none: "不存在空白標籤!"
- people_tagged_with: "標記為 %{tag} 的人"
- posts_tagged_with: "標記為 #%{tag} 的貼文"
stop_following: "停止追蹤 #%{tag}"
+ tagged_people:
+ other: "有 %{count} 個人貼了標籤 %{tag}"
+ zero: "沒有人貼了標籤 %{tag}"
terms_and_conditions: "服務條款與細則"
- undo: "要復原嗎?"
+ undo: "還原?"
username: "使用者名稱"
users:
confirm_email:
@@ -949,12 +1077,12 @@ zh-TW:
email_not_confirmed: "無法啟用電子信箱。連結不對嗎?"
destroy:
no_password: "請輸入你目前的密碼來關帳號。"
- success: "你的帳號已經鎖定了。完成關閉帳號大約還需要 20 分鐘的時間,感謝你試用 Diaspora。"
+ success: "你的帳號已經鎖定了。完成關閉帳號大約還需要 20 分鐘的時間,感謝你試用 diaspora*"
wrong_password: "輸入的密碼與你目前的密碼不符。"
edit:
- also_commented: "...當有人也對你的聯絡人的貼文發表意見時?"
- auto_follow_aspect: "給被自動追蹤的使用者的面向:"
- auto_follow_back: "當有人追蹤你時自動反追蹤回去"
+ also_commented: "當有人對你評論的貼文發表意見"
+ auto_follow_aspect: "自動加入的聯絡人歸類在以下哪個話題:"
+ auto_follow_back: "發文自動包括與你分享發文的使用者"
change: "更改"
change_email: "更改電子信箱"
change_language: "更改語言"
@@ -962,43 +1090,51 @@ zh-TW:
character_minimum_expl: "至少要六個字"
close_account:
dont_go: "啊,請不要走!"
- if_you_want_this: "如果你真的這麼希望,請在下面輸入你的密碼,然後按'關帳號'"
- lock_username: "你的使用者名稱會鎖定,不能重新註冊。"
- locked_out: "接下來你會被登出,而帳號會被關掉。"
- make_diaspora_better: "希望你能幫助我們讓 Diaspora 更好,而不是選擇離開。如果你還是想走,我們也想讓你知道日後的發展。"
+ if_you_want_this: "如果你確定要關閉帳號,請在下方輸入你的密碼,然後按'關閉帳號'"
+ lock_username: "你的使用者名稱會被鎖定,在同一空間裡不能用舊帳號重新註冊。"
+ locked_out: "系統會將你登出,直到帳號刪除為止,你無法重新登入"
+ make_diaspora_better: "希望你能幫助我們讓 Diaspora 更好,而不是選擇離開。如果你決定要關閉帳號,這是接下來的程序:"
mr_wiggles: "Mr Wiggles 看到你走會很難過"
- no_turning_back: "現在已經不能回頭了。"
- what_we_delete: "我們會儘快刪掉你的貼文和個人檔案。你發表的意見會繼續跟著原來的 Diaspora 識別碼而留著,但是不再會有你檔案裡的名字。"
- close_account_text: "關帳號"
- comment_on_post: "...當有人對你的貼文發表意見時?"
+ no_turning_back: "一旦確定刪除則無法復原。如果確定要刪除帳號,請在下方輸入你的密碼"
+ what_we_delete: "我們會儘快刪除你的貼文和個人檔案。你在其他使用者貼文下的評論仍然保留,但會以 diaspora* 帳號顯示,而非你的使用者名稱。"
+ close_account_text: "關閉帳號"
+ comment_on_post: "有人對你的貼文發表意見"
current_password: "目前密碼"
current_password_expl: "登入時那一個..."
+ download_export: "下載個人檔案"
+ download_export_photos: "下載相片"
download_photos: "下載我的相片"
- download_xml: "下載我的 xml"
edit_account: "編輯帳號"
email_awaiting_confirmation: "我們已經將啟用連結寄到 %{unconfirmed_email} 給你。在你點該連結啟用新的信箱之前,我們還是會繼續使用你原來的信箱,也就是 %{email}。"
export_data: "資料匯出"
- following: "追蹤設定"
+ export_in_progress: "我們正在處理你的資料,請稍等一下再來看看。"
+ export_photos_in_progress: "正在處理你的相片中。請等一下再回來看看。"
+ following: "發文設定"
getting_started: "新使用者偏好設定"
- liked: "...當有人對你的貼文說讚時?"
- mentioned: "...當貼文中點到你時?"
+ last_exported_at: "(最後一次是在 %{timestamp} 更新)"
+ liked: "有人對你的貼文說讚"
+ mentioned: "貼文中提到你"
new_password: "新的密碼"
- photo_export_unavailable: "相片目前無法匯出"
- private_message: "...當收到私人訊息時?"
- receive_email_notifications: "是否要在以下時機透過電子郵件接收消息..."
- reshared: "...有人轉貼你的貼文時?"
- show_community_spotlight: "要在流水帳中顯示社群焦點嗎?"
- show_getting_started: "重跑入門指南"
- started_sharing: "...當有人開始和你分享時?"
- stream_preferences: "流水帳偏好設定"
+ private_message: "收到私人訊息"
+ receive_email_notifications: "接收電子郵件通知:"
+ request_export: "申請下載個人檔案資料"
+ request_export_photos: "要求下載相片"
+ request_export_photos_update: "更新相片下載檔案"
+ request_export_update: "更新個人檔案資料"
+ reshared: "有人轉貼你的發文"
+ show_community_spotlight: "要在河道中顯示社群焦點嗎?"
+ show_getting_started: "使用入門指南"
+ someone_reported: "有人寄了一封回報"
+ started_sharing: "有人和你分享貼文"
+ stream_preferences: "河道偏好設定"
your_email: "你的電子郵件"
- your_handle: "你的 diaspora 識別碼"
+ your_handle: "你的 diaspora* 帳號"
getting_started:
awesome_take_me_to_diaspora: "帥!帶我去 diaspora* 吧"
- community_welcome: "Diaspora 的社群歡迎你的到來!"
- connect_to_facebook: "藉由%{link} Diaspora 讓你儘快上軌道 。這個步驟會取得你原有的名字和照片來用,並開啟跨站貼文。"
+ community_welcome: "diaspora* 歡迎你的加入!"
+ connect_to_facebook: "diaspora* 可以連結臉書帳號%{link} ,取用你的臉書姓名和頭圖來幫你快速完成設定 ,同時開啟跨站貼文。"
connect_to_facebook_link: "連結 Facebook 帳號"
- hashtag_explanation: "標籤讓你可以討論及追蹤你的興趣。並且也是在 Diaspora 找到新朋友的好方法。"
+ hashtag_explanation: "標籤讓你可以討論及追蹤你有興趣的話題。也是在 diaspora* 找到新朋友的好方法。"
hashtag_suggestions: "試試看追蹤像是 #藝術, #電影, #gif 等標籤。"
saved: "存好了!"
well_hello_there: "嗨,你好!"
@@ -1006,7 +1142,9 @@ zh-TW:
who_are_you: "你是誰?"
privacy_settings:
ignored_users: "忽視的使用者"
+ no_user_ignored_message: "目前沒有忽視任何的其他人"
stop_ignoring: "停止忽視"
+ strip_exif: "上傳照片時移除裡面的描述資料,像是拍攝地點,拍攝人,相機型號等等(建議開啟)"
title: "隱私設定"
public:
does_not_exist: "不存在 %{username} 這個使用者!"
@@ -1028,7 +1166,7 @@ zh-TW:
no_person_constructed: "從這份 hcard 資料無法組出聯絡人。"
not_enabled: "%{account} 的主機似乎沒有啟用 webfinger"
xrd_fetch_failed: "從 %{account} 這個帳號取得 xrd 時發生錯誤"
- welcome: "歡迎光臨!"
+ welcome: "歡迎!"
will_paginate:
next_label: "後面 &raquo;"
previous_label: "&laquo; 前面" \ No newline at end of file
diff --git a/config/locales/javascript/javascript.ar.yml b/config/locales/javascript/javascript.ar.yml
index e0a8ebf00..7dd2b1cc3 100644
--- a/config/locales/javascript/javascript.ar.yml
+++ b/config/locales/javascript/javascript.ar.yml
@@ -20,6 +20,7 @@ ar:
other: "في <%= count %> فئات"
two: "في <%= count %> فئات"
zero: "حدّد الفئات"
+ updating: "يحدّث..."
aspect_navigation:
deselect_all: "إلغاء اختيار الكل"
no_aspects: "لم يتم اختيار فئات"
@@ -27,10 +28,13 @@ ar:
comments:
hide: "أخفِ التعليقات"
show: "إعرض جميع التعليقات"
- confirm_dialog: "هل أنت متأكد؟"
- delete: "حذف"
+ confirm_dialog: "أمتأكّد؟"
+ contacts:
+ search_no_results: "لم يُعثر على متراسلين"
+ delete: "احذف"
failed_to_like: "فشل في [أعجبني]"
failed_to_post_message: "فشل في نشر رسالة!"
+ failed_to_reshare: "فشلت إعادة المشاركة!"
getting_started:
alright_ill_wait: "حسناً ، سأنتظر."
hey: "انتبه <%= name %>"
@@ -48,6 +52,8 @@ ar:
search: "ابحث"
settings: "إعدادات"
view_all: "عرض الكل"
+ hide_post: "أأخفِ هذه التدوينة؟"
+ hide_post_failed: "تعذّر إخفاء هذه التدوينة"
ignore: "تجاهل"
infinite_scroll:
no_more: "لا توجد مشاركات أخرى,"
@@ -59,6 +65,7 @@ ar:
at_least_one_aspect: "حدد فئة واحدة على الأقل"
limited: "محدودة - مشاركتك ستكون متاحة لجهات إتصالك فقط"
public: "عام - مشاركتك ستكون متاحة للجميع ومفهرسة في محركات البحث"
+ remove_post: "أأزيل هذه التدوينة؟"
reshares:
duplicate: "رائع، أليس كذلك؟ أعدت نشر هذه المشاركة مسبقا"
search_for: "إبحث عن <%= name %>"
diff --git a/config/locales/javascript/javascript.cs.yml b/config/locales/javascript/javascript.cs.yml
index 08b8c1875..7de3ee644 100644
--- a/config/locales/javascript/javascript.cs.yml
+++ b/config/locales/javascript/javascript.cs.yml
@@ -12,6 +12,8 @@ cs:
all_aspects: "Všechny aspekty"
error: "Nelze zahájit sdílení s <%= name %>. Neignorujete je?"
error_remove: "Nepodařilo se odstranit <%= name %> z aspektu :("
+ mobile_row_checked: "<%= name %> (odstranit)"
+ mobile_row_unchecked: "<%= name %> (přidat)"
select_aspects: "Vybrat aspekty"
started_sharing_with: "Začali jste sdílet s <%= name %>!"
stopped_sharing_with: "Přestali jste sdílet s <%= name %>."
@@ -20,23 +22,39 @@ cs:
one: "V <%= count %> aspektu"
other: "V <%= count %> aspektech"
zero: "V <%= count %> aspektech"
+ updating: "aktualizuji..."
aspect_navigation:
add_an_aspect: "+ Přidat aspekt"
deselect_all: "Odznačit vše"
no_aspects: "Nebyl vybrán žádný aspekt"
select_all: "Vybrat vše"
+ bookmarklet:
+ post_something: "Dát příspěvek na diaspora*"
+ post_submit: "Odesílám příspěvek ..."
+ post_success: "Odesláno. Uzavírám vyskakovací okno..."
comma: ","
comments:
hide: "skrýt komentáře"
no_comments: "Zatím nejsou žádné komentáře."
show: "zobrazit všechny komentáře"
confirm_dialog: "Jste si jisti?"
+ confirm_unload: "Prosím potvrďte, že chcete tuto stránku opustit - data, která jste vložil/a nebudou uložena."
+ contacts:
+ add_contact: "Přidej kontakt"
+ aspect_list_is_not_visible: "Kontakty v tomto aspektu se nemohou vzájemně vidět."
+ aspect_list_is_visible: "Kontakty v tomto aspektu se vzájemně vidí."
+ error_add: "Nelze přidat <%= name %> do tohoto aspektu :("
+ error_remove: "Nelze odebrat <%= name %> z tohoto aspektu :("
+ remove_contact: "Odstraň kontakt"
+ search_no_results: "Nenalezeny žádné kontakty"
conversation:
participants: "Účastníci"
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 %>!"
@@ -46,6 +64,7 @@ cs:
admin: "Administrace"
close: "zavřít"
contacts: "Kontakty"
+ conversations: "Konverzace"
help: "Nápověda"
home: "Domů"
log_out: "Odhlásit se"
@@ -56,7 +75,10 @@ cs:
search: "Hledat"
settings: "Nastavení"
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"
ignore: "Ignorovat"
+ ignore_failed: "Tohoto uživatele se nedaří ignorovat"
ignore_user: "Ignorovat tohoto uživatele?"
infinite_scroll:
no_more: "Žádné další příspěvky."
@@ -64,19 +86,65 @@ cs:
my_activity: "Moje aktivita"
my_aspects: "Moje aspekty"
my_stream: "Proud"
+ no_results: "Žádné výsledky nebyly nalezeny"
+ notifications:
+ mark_read: "Označit jako přečtené"
+ mark_unread: "Označit jako nepřečtené"
people:
+ edit_my_profile: "Upravte svůj profil"
+ helper:
+ is_not_sharing: "<%= name %> s Vámi nesdílí."
+ is_sharing: "<%= name %> s Vámi sdílí."
+ mention: "Zmínka"
+ message: "Zpráva"
not_found: "… a nikdo nebyl nalezen."
+ stop_ignoring: "Přestaň ignorovat"
photo_uploader:
completed: "<%= file %> dokončen"
empty: "{file} je prázdný, prosím vyberte soubory znovu bez něho."
+ error: "Při nahrávání souboru <%= file %> nastal problém"
invalid_ext: "{file} má chybnou příponu. Jsou povoleny pouze {extensions}."
looking_good: "Tedy, vypadáte úžasně!"
size_error: "{file} je přiliš veliký, maximální velikost je {sizeLimit}."
+ poll:
+ close_result: "Skrýt výsledky"
+ count:
+ few: "zatím <%=count%> hlasy"
+ one: "zatím 1 hlas"
+ other: "zatím <%=count%> hlasů"
+ go_to_original_post: "Tohoto výzkumu se můžete účastnit zde\" <%= original_post_link %>"
+ original_post: "původní příspěvek"
+ result: "Výsledek"
+ show_result: "Ukázat výsledky"
+ vote: "Hlasovat"
+ profile:
+ add_some: "přidat něco"
+ bio: "Něco o vás"
+ born: "Narozeniny"
+ contacts: "Kontakty"
+ edit: "upravit"
+ gender: "Pohlaví"
+ ignoring: "Ignorujete všechny příspěvky od <%= name %>."
+ location: "Pozice"
+ photos: "Fotky"
+ posts: "Příspěvky"
+ you_have_no_tags: "Nemáte žádné štítky"
publisher:
+ add_option: "Přidejte odpověď"
at_least_one_aspect: "Musíte publikovat alespoň do jednoho aspektu"
limited: "Omezený — váš příspěvek bude přístupný pouze lidem, se kterými sdílíte"
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"
+ question: "Otázka"
+ remove_post: "Odstranit tento příspěvek?"
+ report:
+ name: "Nahlášení"
+ prompt: "Prosím, zadejte důvod:"
+ prompt_default: "urážlivý obsah"
+ status:
+ 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 %>?"
@@ -85,6 +153,8 @@ cs:
show_more: "zobrazit více"
stream:
comment: "Okomentovat"
+ disable_post_notifications: "Zakázat upozornění pro tento příspěvek"
+ enable_post_notifications: "Povolit upozornění pro tento příspěvek"
follow: "Sledovat"
followed_tag:
add_a_tag: "Přidat štítek"
@@ -121,6 +191,7 @@ cs:
stop_following: "Přestat sledovat #<%= tag %>"
unfollow: "Přestat sledovat"
unlike: "To se mi nelíbí"
+ via: "skrze <%= provider %>"
tags:
wasnt_that_interesting: "Dobře, předpokládám, že #<%= tagName %> nebyl zase tak zajímavý…"
timeago:
@@ -137,14 +208,17 @@ cs:
seconds: "méně než minutou"
suffixAgo: ""
suffixFromNow: ""
+ wordSeparator: " "
year: "1 rokem"
years: "%d roky"
+ unblock_failed: "Odblokování tohoto uživatele selhalo"
videos:
unknown: "Neznámý typ videa"
watch: "Podívejte se na tohle video na <%= provider %>"
viewer:
comment: "Komentovat"
follow_post: "Sledovat příspěvek"
+ home: "Domů"
like: "To se mi líbí"
reshare: "Sdílet"
reshared: "Sdíleno"
diff --git a/config/locales/javascript/javascript.da.yml b/config/locales/javascript/javascript.da.yml
index e09225406..00a738761 100644
--- a/config/locales/javascript/javascript.da.yml
+++ b/config/locales/javascript/javascript.da.yml
@@ -12,6 +12,8 @@ da:
all_aspects: "Alle aspekter"
error: "Kunne ikke begynde at dele med <%= name %>. Ignorerer du vedkommende?"
error_remove: "Kunne ikke fjerne <%= name %> fra aspektet. :("
+ mobile_row_checked: "<%= name %> (fjern)"
+ mobile_row_unchecked: "<%= name %> (tilføj)"
select_aspects: "Vælg aspekter"
started_sharing_with: "Du er begyndt at dele med <%= name %>!"
stopped_sharing_with: "Du deler ikke længere med <%= name %>."
@@ -22,14 +24,15 @@ da:
other: "I <%= count %> aspekter"
two: "I <%= count %> aspekter"
zero: "Vælg aspekter"
+ updating: "opdaterer ..."
aspect_navigation:
add_an_aspect: "+ Tilføj et aspekt"
deselect_all: "Fravælg alle"
no_aspects: "Ingen valgte aspekter"
select_all: "Vælg alle"
bookmarklet:
- post_something: "Slå op på diaspora*"
- post_submit: "Indsender indlæg"
+ post_something: "Lav et indlæg på Diaspora"
+ post_submit: "Indsender indlæg ..."
post_success: "Det er indsendt! lukker popup vinduet ..."
comma: ","
comments:
@@ -37,6 +40,15 @@ da:
no_comments: "Der er endnu ingen kommentarer."
show: "Vis alle kommentarer"
confirm_dialog: "Er du sikker?"
+ confirm_unload: "Bekræft venligst at du ønsker at forlade denne side - data, du har indtastet, vil ikke blive gemt."
+ contacts:
+ add_contact: "Tilføj kontakt"
+ aspect_list_is_not_visible: "Kontakter i dette aspekt kan ikke se hinanden"
+ aspect_list_is_visible: "Kontakter i dette aspekt kan se hinanden"
+ error_add: "Kunne ikke tilføje <%= name %> til aspektet :("
+ error_remove: "Kunne ikke fjerne <%= name %> fra aspektet :("
+ remove_contact: "Fjern kontakt"
+ search_no_results: "Ingen kontakter fundet"
conversation:
participants: "Deltagere"
delete: "Slet"
@@ -44,14 +56,15 @@ da:
failed_to_like: "Kunne ikke synes om!"
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 %>!"
- no_tags: "Du har ikke fulgt nogen tags! Vil du fortsætte alligevel?"
+ no_tags: "Du har ikke fulgt nogen tags! Vil du fortsætte alligevel?"
preparing_your_stream: "Forbereder din personlige strøm..."
header:
admin: "Admin"
- close: "luk"
+ close: "Luk"
contacts: "Kontakter"
conversations: "Samtaler"
help: "Hjælp"
@@ -60,10 +73,12 @@ da:
mark_all_as_read: "Marker alle som læst"
notifications: "Meddelelser"
profile: "Profil"
- recent_notifications: "Seneste Meddelelser"
+ recent_notifications: "Seneste notifikationer"
search: "Søg"
settings: "Indstillinger"
view_all: "Se alle"
+ hide_post: "Skjul dette indlæg?"
+ hide_post_failed: "Kan ikke skjule indlæg"
ignore: "Ignorer"
ignore_failed: "Kan ikke ignorere denne bruger"
ignore_user: "Ignorer denne bruger?"
@@ -73,11 +88,19 @@ da:
my_activity: "Min aktivitet"
my_aspects: "Mine aspekter"
my_stream: "Strøm"
+ no_results: "Ingen resultater fundet"
notifications:
mark_read: "Marker som læst"
mark_unread: "Marker som ulæst"
people:
- not_found: "og ingen blev fundet ..."
+ edit_my_profile: "Rediger min profil"
+ helper:
+ is_not_sharing: "<%= name %> deler ikke med dig"
+ is_sharing: "<%= name %> deler med dig"
+ mention: "Nævn"
+ message: "Besked"
+ not_found: "Og ingen blev fundet ..."
+ stop_ignoring: "Hold op med at ignorere"
photo_uploader:
completed: "<%= file %> fuldført."
empty: "{file} er tom. Vælg venligst filer igen uden den."
@@ -90,9 +113,23 @@ da:
count:
one: "<%=count%> stemme, indtil nu"
other: "<%=count%> stemmer, indtil nu"
+ go_to_original_post: "Du kan deltage i denne afstemning på <%= original_post_link %>."
+ original_post: "det oprindelige indlæg"
result: "Resultat"
show_result: "Vis resultat"
vote: "Stem"
+ profile:
+ add_some: "Tilføj nogen"
+ bio: "Biografi"
+ born: "Fødselsdag"
+ contacts: "Kontakter"
+ edit: "Rediger"
+ gender: "Køn"
+ ignoring: "Du ignorerer alle indlæg fra <%= name %>"
+ location: "Sted"
+ photos: "Fotos"
+ posts: "Indlæg"
+ you_have_no_tags: "Du har ingen tags!"
publisher:
add_option: "Tilføj et svar"
at_least_one_aspect: "Du skal dele med mindst et aspekt"
@@ -101,10 +138,11 @@ da:
option: "Svar"
public: "Offentlig - dit indlæg vil være synligt for alle og kan findes af søgemaskiner"
question: "Spørgsmål"
+ remove_post: "Fjern dette indlæg?"
report:
name: "Anmeld"
prompt: "Vær venlig at give en grund:"
- prompt_default: "stødende indhold"
+ prompt_default: "f.eks. stødende indhold"
status:
created: "Der blev lavet en rapport"
exists: "Der eksisterer allerede en rapport"
@@ -116,6 +154,8 @@ da:
show_more: "Vis mere"
stream:
comment: "Kommentér"
+ disable_post_notifications: "Slå notifikationer fra for dette indlæg"
+ enable_post_notifications: "Slå notifikationer til for dette indlæg"
follow: "Følg"
followed_tag:
add_a_tag: "Tilføj et tag"
@@ -140,7 +180,7 @@ da:
other: "Vis <%= count %> ekstra kommentarer"
two: "Vis <%= count %> ekstra kommentarer"
zero: "Vis <%= count %> ekstra kommentarer"
- original_post_deleted: "Oprindeligt indlæg er slettet af forfatteren."
+ original_post_deleted: "Oprindeligt indlæg er slettet af forfatteren"
public: "Offentlig"
reshare: "Videredel"
reshares:
@@ -160,7 +200,7 @@ da:
unlike: "Synes ikke om"
via: "via <%= provider %>"
tags:
- wasnt_that_interesting: "OK, jeg formoder #<%= tagName %> ikke var så spændende igen..."
+ wasnt_that_interesting: "OK, #<%= tagName %> var ikke var så spændende alligevel ..."
timeago:
day: "en dag"
days: "%d dage"
@@ -178,13 +218,14 @@ da:
wordSeparator: " "
year: "ca. et år"
years: "%d år"
+ unblock_failed: "Det lykkedes ikke at afblokere denne bruger"
videos:
unknown: "Ukendt videotype"
watch: "Se denne video på <%= provider %>"
viewer:
comment: "Kommentér"
follow_post: "Følg indlæg"
- home: "HJEM"
+ home: "Hjem"
like: "Synes om"
reshare: "Videredel"
reshared: "Videredelt"
diff --git a/config/locales/javascript/javascript.de.yml b/config/locales/javascript/javascript.de.yml
index ba5874903..9b58edd7b 100644
--- a/config/locales/javascript/javascript.de.yml
+++ b/config/locales/javascript/javascript.de.yml
@@ -12,6 +12,8 @@ de:
all_aspects: "Alle Aspekte"
error: "Teilen mit <%= name %> nicht möglich. Ignorierst du sie/ihn?"
error_remove: "Konnte <%= name %> nicht aus dem Aspekt entfernen :("
+ mobile_row_checked: "<%= name %> (entfernen)"
+ mobile_row_unchecked: "<%= name %> (hinzufügen)"
select_aspects: "Wähle Aspekte aus"
started_sharing_with: "Du hast angefangen, mit <%= name %> zu teilen!"
stopped_sharing_with: "Du hast aufgehört, mit <%= name %> zu teilen!"
@@ -22,6 +24,7 @@ de:
other: "In <%= count %> Aspekten"
two: "In <%= count %> Aspekten"
zero: "Aspekt auswählen"
+ updating: "aktualisiere..."
aspect_navigation:
add_an_aspect: "+ Aspekt hinzufügen"
deselect_all: "Auswahl aufheben"
@@ -37,6 +40,15 @@ de:
no_comments: "Bisher sind keine Kommentare vorhanden."
show: "Alle Kommentare zeigen"
confirm_dialog: "Bist du dir sicher?"
+ confirm_unload: "Bitte bestätige dass du diese Seite verlassen willst - Daten welche du eingegeben hast würden nicht gespeichert werden."
+ contacts:
+ add_contact: "Kontakt hinzufügen"
+ aspect_list_is_not_visible: "Kontakte in diesem Aspekt können einander nicht sehen."
+ aspect_list_is_visible: "Kontakte in diesem Aspekt können einander sehen"
+ error_add: "Konnte <%= name %> nicht zum Aspekt hinzufügen :("
+ error_remove: "Konnte <%= name %> nicht aus dem Aspekt entfernen :("
+ remove_contact: "Kontakt entfernen"
+ search_no_results: "Keine Kontakte gefunden"
conversation:
participants: "Teilnehmer"
delete: "Löschen"
@@ -44,6 +56,7 @@ de:
failed_to_like: "Gefällt mir fehlgeschlagen!"
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 %>!"
@@ -64,6 +77,8 @@ de:
search: "Suchen"
settings: "Einstellungen"
view_all: "Alle anzeigen"
+ hide_post: "Diesen Beitrag ausblenden?"
+ hide_post_failed: "Ausblenden des Beitrags nicht möglich"
ignore: "Ignorieren"
ignore_failed: "Konnte Benutzer nicht ignorieren"
ignore_user: "Benutzer ignorieren?"
@@ -73,11 +88,19 @@ de:
my_activity: "Meine Aktivitäten"
my_aspects: "Meine Aspekte"
my_stream: "Stream"
+ no_results: "Keine Treffer"
notifications:
mark_read: "Als gelesen markieren"
mark_unread: "Als ungelesen markieren"
people:
+ edit_my_profile: "Mein Profil bearbeiten"
+ helper:
+ is_not_sharing: "<%= name %> teilt nicht mit dir"
+ is_sharing: "<%= name %> teilt mit dir"
+ mention: "Erwähnen"
+ message: "Nachricht"
not_found: "und niemand wurde gefunden..."
+ stop_ignoring: "Nicht mehr ignorieren"
photo_uploader:
completed: "<%= file %> hochgeladen"
empty: "Die Datei {file} ist leer. Bitte treffe eine erneute Auswahl ohne diese Datei."
@@ -89,21 +112,36 @@ de:
close_result: "Ergebnis ausblenden"
count:
one: "Bisher eine Stimme"
- other: "Bisher <%=count%> Stimmen."
+ other: "Bisher <%=count%> Stimmen"
+ go_to_original_post: "Du kannst an dieser Umfrage im <%= original_post_link %> teilnehmen."
+ original_post: "Originalbeitrag"
result: "Ergebnis"
show_result: "Ergebnis anzeigen"
vote: "Abstimmen"
+ profile:
+ add_some: "Füge neue hinzu"
+ bio: "Bio"
+ born: "Geburtstag"
+ contacts: "Kontakte"
+ edit: "bearbeite"
+ gender: "Geschlecht"
+ ignoring: "Du ignorierst sämtliche Beiträge von <%= name %>."
+ location: "Ort"
+ photos: "Fotos"
+ posts: "Beiträge"
+ you_have_no_tags: "Du hast keine Tags!"
publisher:
add_option: "Antwortmöglichkeit hinzufügen"
at_least_one_aspect: "Du musst zumindest zu einem Aspekt posten"
limited: "Eingeschränkt - dein Beitrag wird nur Leuten sichtbar sein, mit denen du teilst"
near_from: "Gesendet aus <%= location %>"
- option: "Antwort <%= nr %>"
+ option: "Antwort"
public: "Öffentlich - dein Beitrag ist für alle sichtbar und kann von Suchmaschinen gefunden werden"
question: "Frage"
+ remove_post: "Diesen Beitrag löschen?"
report:
name: "Meldung"
- prompt: "Bitte gebe einen Grund an:"
+ prompt: "Bitte gib einen Grund an:"
prompt_default: "anstößiger Inhalt"
status:
created: "Die Meldung wurde erfolgreich erstellt"
@@ -116,6 +154,8 @@ de:
show_more: "Mehr zeigen"
stream:
comment: "Kommentar"
+ disable_post_notifications: "Benachrichtigungen für diesen Beitrag deaktivieren"
+ enable_post_notifications: "Benachrichtigungen für diesen Beitrag aktivieren"
follow: "Folgen"
followed_tag:
add_a_tag: "Tag hinzufügen"
@@ -123,7 +163,7 @@ de:
follow: "Folgen"
title: "#Tags, denen du folgst"
hide: "Ausblenden"
- hide_nsfw_posts: "#nsfw-Posts verstecken"
+ hide_nsfw_posts: "#nsfw-Beiträge verstecken"
like: "Gefällt mir"
likes:
few: "<%= count %> Personen gefällt das"
@@ -175,6 +215,7 @@ de:
wordSeparator: " "
year: "etwa einem Jahr"
years: "%d Jahren"
+ unblock_failed: "Den Benutzer zu entblocken ist fehlgeschlagen."
videos:
unknown: "Unbekanntes Videoformat"
watch: "Dieses Video auf <%= provider %> ansehen"
diff --git a/config/locales/javascript/javascript.de_formal.yml b/config/locales/javascript/javascript.de_formal.yml
index 0ea1b21ea..add8c7d25 100644
--- a/config/locales/javascript/javascript.de_formal.yml
+++ b/config/locales/javascript/javascript.de_formal.yml
@@ -12,6 +12,8 @@ de_formal:
all_aspects: "Alle Aspekte"
error: "Couldn't start sharing with <%= name %>. Are you ignoring them?"
error_remove: "Konnte <%= name %> nicht vom Aspekt entfernen :("
+ mobile_row_checked: "<%= name %> (entfernen)"
+ mobile_row_unchecked: "<%= name %> (hinzufügen)"
select_aspects: "Wählen Sie Aspekte aus"
started_sharing_with: "Sie haben angefangen, mit <%= name %> zu teilen!"
stopped_sharing_with: "Sie haben aufgehört, mit <%= name %> zu teilen!"
@@ -19,6 +21,7 @@ de_formal:
one: "In einem Aspekt"
other: "In <%= count %> Aspekten"
zero: "Aspekt auswählen"
+ updating: "aktualisiere..."
aspect_navigation:
add_an_aspect: "+ Aspekt hinzufügen"
deselect_all: "Auswahl aufheben"
@@ -34,6 +37,15 @@ de_formal:
no_comments: "Bisher sind keine Kommentare vorhanden."
show: "Alle Kommentare zeigen"
confirm_dialog: "Sind Sie sich sicher?"
+ confirm_unload: "Bitte bestätigen Sie, dass Sie diese Seite verlassen möchten - die von Ihnen eingegebenen Daten werden nicht gespeichert werden."
+ contacts:
+ add_contact: "Kontakt hinzufügen"
+ aspect_list_is_not_visible: "Kontakte in diesem Aspekt können einander nicht sehen."
+ aspect_list_is_visible: "Kontakte in diesem Aspekt können einander sehen"
+ error_add: "Konnte <%= name %> nicht zum Aspekt hinzufügen :("
+ error_remove: "Konnte <%= name %> nicht aus dem Aspekt entfernen :("
+ remove_contact: "Kontakt entfernen"
+ search_no_results: "Keine Kontakte gefunden"
conversation:
participants: "Teilnehmer"
delete: "Löschen"
@@ -41,6 +53,7 @@ de_formal:
failed_to_like: "Gefällt mir fehlgeschlagen."
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 %>!"
@@ -61,7 +74,10 @@ de_formal:
search: "Find people or #tags"
settings: "Einstellungen"
view_all: "Alle ansehen"
+ hide_post: "Diesen Beitrag ausblenden?"
+ hide_post_failed: "Konnte den Beitrag nicht ausblenden"
ignore: "Ignorieren"
+ ignore_failed: "Konnte Benutzer nicht ignorieren"
ignore_user: "Benutzer ignorieren?"
infinite_scroll:
no_more: "Keine weiteren Beiträge."
@@ -69,16 +85,24 @@ de_formal:
my_activity: "Meine Aktivitäten"
my_aspects: "Ihre Aspekte"
my_stream: "Stream"
+ no_results: "Keine Treffer"
notifications:
mark_read: "Als gelesen markieren"
mark_unread: "Als ungelesen markieren"
people:
+ edit_my_profile: "Mein Profil bearbeiten"
+ helper:
+ is_not_sharing: "<%= name %> teilt nicht mit Ihnen"
+ is_sharing: "<%= name %> teilt mit Ihnen"
+ mention: "Erwähnen"
+ message: "Nachricht"
not_found: "niemand wurde gefunden..."
+ stop_ignoring: "Ignorieren beenden"
photo_uploader:
completed: "<%= file %> hochgeladen"
- empty: "{file} ist leer, bitte wählen Sie erneut Dateien aus."
+ empty: "{file} ist leer, bitte wählen Sie erneut Dateien ohne diese aus."
error: "Es ist ein Fehler aufgetreten, während <%= file %> hochgeladen wurde"
- invalid_ext: "{file} hat keine gültige Erweiterung. Nur {extensions} sind erlaubt."
+ invalid_ext: "{file} hat eine ungültige Erweiterung. Nur {extensions} sind erlaubt."
looking_good: "OMG, Sie sehen toll aus!"
size_error: "{file} ist zu groß. Die maximale Dateigröße beträgt {sizeLimit}."
poll:
@@ -86,17 +110,32 @@ de_formal:
count:
one: "Bisher eine Stimme"
other: "Bisher <%=count%> Stimmen."
+ go_to_original_post: "Sie können an dieser Umfrage im <%= original_post_link %> teilnehmen."
+ original_post: "Originalbeitrag"
result: "Ergebnis"
show_result: "Ergebnis anzeigen"
vote: "Abstimmen"
+ profile:
+ add_some: "Füge neue hinzu"
+ bio: "Beschreibung"
+ born: "Geburtstag"
+ contacts: "Kontakte"
+ edit: "bearbeiten"
+ gender: "Geschlecht"
+ ignoring: "Sie ignorieren sämtliche Beiträge von <%= name %>."
+ location: "Ort"
+ photos: "Fotos"
+ posts: "Beiträge"
+ you_have_no_tags: "Sie haben keine Tags!"
publisher:
- add_option: "Option hinzufügen"
+ add_option: "Antwortmöglichkeit hinzufügen"
at_least_one_aspect: "Sie müssen zumindest zu einem Aspekt posten"
limited: "Eingeschränkt - Ihr Beitrag wird nur Leuten sichtbar sein, mit denen Sie teilen"
near_from: "In der Nähe von <%= location %>"
- option: "Option <%= nr %>"
+ option: "Antwort"
public: "Öffentlich - Ihr Beitrag ist für alle sichtbar und kann von Suchmaschinen gefunden werden"
question: "Frage"
+ remove_post: "Diesen Beitrag löschen?"
report:
name: "Meldung"
prompt: "Bitte geben Sie einen Grund an:"
@@ -112,6 +151,8 @@ de_formal:
show_more: "Mehr zeigen"
stream:
comment: "Kommentieren"
+ disable_post_notifications: "Benachrichtigungen für diesen Beitrag deaktivieren"
+ enable_post_notifications: "Benachrichtigungen für diesen Beitrag aktivieren"
follow: "Folgen"
followed_tag:
add_a_tag: "Einen Tag hinzufügen"
@@ -165,6 +206,7 @@ de_formal:
wordSeparator: " "
year: "etwa einem Jahr"
years: "%d Jahren"
+ unblock_failed: "Den Benutzer zu entblocken ist fehlgeschlagen."
videos:
unknown: "Unbekanntes Videoformat"
watch: "Dieses Video auf <%= provider %> ansehen"
diff --git a/config/locales/javascript/javascript.el.yml b/config/locales/javascript/javascript.el.yml
index c5b6459d8..82af79bb1 100644
--- a/config/locales/javascript/javascript.el.yml
+++ b/config/locales/javascript/javascript.el.yml
@@ -27,8 +27,12 @@ el:
comma: ","
comments:
hide: "απόκρυψη σχολίων"
+ no_comments: "Δεν υπάρχουν ακόμη σχόλια."
show: "προβολή όλων των σχολίων"
confirm_dialog: "Είστε σίγουροι;"
+ contacts:
+ add_contact: "Προσθήκη επαφής"
+ remove_contact: "Διαγραφή επαφής"
conversation:
participants: "Συμμετέχοντες"
delete: "Διαγραφή"
@@ -44,6 +48,8 @@ el:
admin: "Διαχείριση"
close: "κλείσιμο"
contacts: "Επαφές"
+ conversations: "Συζητήσεις"
+ help: "Βοήθεια"
home: "Αρχική"
log_out: "Αποσύνδεση"
mark_all_as_read: "Σήμανση όλων ως διαβασμένα"
@@ -60,7 +66,9 @@ el:
my_activity: "Η δραστηριότητα μου"
my_aspects: "Οι Πτυχές μου"
my_stream: "Ροή"
+ no_results: "Δεν βρέθηκαν αποτελέσματα"
people:
+ edit_my_profile: "Επεξεργασία του προφίλ μου"
not_found: "και κανείς δεν βρέθηκε..."
photo_uploader:
completed: "<%= file %> ολοκληρώθηκε"
@@ -68,10 +76,26 @@ el:
invalid_ext: "{file} δεν έχει έγκυρo τύπο αρχείου. Μόνο {extensions} επιτρέπονται."
looking_good: "Ναι! Σκίζεις!"
size_error: "{file} είναι πολύ μεγάλο, το μέγιστο μέγεθος αρχείου είναι {sizeLimit}."
+ poll:
+ close_result: "Απόκρυψη αποτελεσμάτων"
+ result: "Αποτέλεσμα"
+ profile:
+ bio: "Βιογραφικό"
+ born: "Ημερομηνία Γέννησης"
+ contacts: "Επαφές"
+ edit: "επεξεργασία"
+ gender: "Φύλο"
+ location: "Τοποθεσία"
+ photos: "Φωτογραφίες"
publisher:
+ add_option: "Πρόσθεσε μια απάντηση"
at_least_one_aspect: "Πρέπει να κάνετε δημοσίευση σε τουλάχιστον μια πτυχή"
limited: "Περιορισμένο - οι δημοσιεύσεις σας θα είναι ορατές μόνο από τα άτομα με τα οποία διαμοιράζεστε"
+ near_from: "Αναρτήθηκε από: <%= location %>"
public: "Δημόσιο - οι δημοσιεύσεις σας θα είναι ορατές στον καθένα και θα μπορούν να βρεθούν από τις μηχανές αναζήτησης"
+ question: "Ερώτηση"
+ report:
+ name: "Αναφορά"
reshares:
duplicate: "Αυτό είναι τόσο καλό ε; Έχετε ήδη κοινοποιήσει αυτή τη δημοσίευση!"
post: "Κοινοποίηση της ανάρτησης του <%= name %>;"
@@ -87,7 +111,7 @@ el:
follow: "Ακολουθήστε"
title: "#Ετικέτες που ακολουθείτε"
hide: "Απόκρυψη"
- hide_nsfw_posts: "Απόκριψη των \"μη ασφαλών για εργασία\" δημοσιεύσεων"
+ hide_nsfw_posts: "Απόκριψη των \"μη ασφαλών για εργασία\" (NSFW) δημοσιεύσεων"
like: "Μου αρέσει"
likes:
one: "<%= count %> Μου αρέσει"
diff --git a/config/locales/javascript/javascript.en.yml b/config/locales/javascript/javascript.en.yml
index f99a08d90..cf869a965 100644
--- a/config/locales/javascript/javascript.en.yml
+++ b/config/locales/javascript/javascript.en.yml
@@ -6,20 +6,26 @@
en:
javascripts:
confirm_dialog: "Are you sure?"
+ confirm_unload: "Please confirm that you want to leave this page. Data you have entered won’t be saved."
delete: "Delete"
ignore: "Ignore"
report:
prompt: "Please enter a reason:"
- prompt_default: "offensive content"
+ prompt_default: "e.g. offensive content"
name: "Report"
status:
- created: "The report was successfully created"
+ created: "The report has successfully been created"
exists: "The report already exists"
ignore_user: "Ignore this user?"
ignore_failed: "Unable to ignore this user"
+ hide_post: "Hide this post?"
+ hide_post_failed: "Unable to hide this post"
+ remove_post: "Remove this post?"
+ unblock_failed: "Unblocking this user has failed"
and: "and"
comma: ","
edit: "Edit"
+ no_results: "No results found"
timeago:
prefixAgo: ""
prefixFromNow: ""
@@ -38,9 +44,18 @@ en:
years: "%d years"
wordSeparator: " "
- my_activity: "My Activity"
+ contacts:
+ add_contact: "Add contact"
+ aspect_list_is_visible: "Contacts in this aspect are able to see each other."
+ aspect_list_is_not_visible: "Contacts in this aspect are not able to see each other."
+ remove_contact: "Remove contact"
+ error_add: "Couldn’t add <%= name %> to the aspect :("
+ error_remove: "Couldn’t remove <%= name %> from the aspect :("
+ search_no_results: "No contacts found"
+
+ my_activity: "My activity"
my_stream: "Stream"
- my_aspects: "My Aspects"
+ my_aspects: "My aspects"
videos:
watch: "Watch this video on <%= provider %>"
@@ -48,8 +63,8 @@ en:
search_for: "Search for <%= name %>"
publisher:
at_least_one_aspect: "You must publish to at least one aspect"
- limited: "Limited - your post will only be seen by people you are sharing with"
- public: "Public - your post will be visible to everyone and found by search engines"
+ limited: "Limited: your post will only be seen by people you are sharing with"
+ public: "Public: your post will be visible to everyone and found by search engines"
near_from: "Posted from: <%= location %>"
option: "Answer"
add_option: "Add an answer"
@@ -65,26 +80,30 @@ en:
add_to_aspect: "Add contact"
select_aspects: "Select aspects"
all_aspects: "All aspects"
+ updating: "updating..."
+ mobile_row_checked: "<%= name %> (remove)"
+ mobile_row_unchecked: "<%= name %> (add)"
stopped_sharing_with: "You have stopped sharing with <%= name %>."
started_sharing_with: "You have started sharing with <%= name %>!"
- error: "Couldn't start sharing with <%= name %>. Are you ignoring them?"
- error_remove: "Couldn't remove <%= name %> from the aspect :("
+ error: "Couldn’t start sharing with <%= name %>. Are you ignoring them?"
+ error_remove: "Couldn’t remove <%= name %> from the aspect :("
toggle:
zero: "Select aspects"
one: "In <%= count %> aspect"
other: "In <%= count %> aspects"
- show_more: "show more"
+ show_more: "Show more"
failed_to_like: "Failed to like!"
+ failed_to_reshare: "Failed to reshare!"
failed_to_post_message: "Failed to post message!"
failed_to_remove: "Failed to remove the entry!"
comments:
- show: "show all comments"
- hide: "hide comments"
+ show: "Show all comments"
+ hide: "Hide comments"
no_comments: "There are no comments yet."
reshares:
- duplicate: "That good, huh? You've already reshared that post!"
+ duplicate: "That good, eh? You’ve already reshared that post!"
successful: "The post was successfully reshared!"
- post: "Reshare <%= name %>'s post?"
+ post: "Reshare <%= name %>’s post?"
aspect_navigation:
select_all: "Select all"
deselect_all: "Deselect all"
@@ -92,8 +111,8 @@ en:
add_an_aspect: "+ Add an aspect"
getting_started:
hey: "Hey, <%= name %>!"
- no_tags: "Hey, you haven't followed any tags! Continue anyway?"
- alright_ill_wait: "Alright, I'll wait."
+ no_tags: "Hey, you haven’t followed any tags! Continue anyway?"
+ alright_ill_wait: "All right, I’ll wait."
preparing_your_stream: "Preparing your personalized stream..."
photo_uploader:
looking_good: "OMG, you look awesome!"
@@ -103,9 +122,28 @@ en:
size_error: "{file} is too large, maximum file size is {sizeLimit}."
empty: "{file} is empty, please select files again without it."
tags:
- wasnt_that_interesting: "OK, I suppose #<%= tagName %> wasn't all that interesting..."
+ wasnt_that_interesting: "OK, I suppose #<%= tagName %> wasn’t all that interesting..."
people:
- not_found: "and no one was found..."
+ not_found: "... and no one was found"
+ mention: "Mention"
+ message: "Message"
+ edit_my_profile: "Edit my profile"
+ stop_ignoring: "Stop ignoring"
+ helper:
+ is_sharing: "<%= name %> is sharing with you"
+ is_not_sharing: "<%= name %> is not sharing with you"
+ profile:
+ edit: "Edit"
+ add_some: "Add some"
+ you_have_no_tags: "You have no tags!"
+ ignoring: "You are ignoring all posts from <%= name %>."
+ bio: "Bio"
+ location: "Location"
+ gender: "Gender"
+ born: "Birthday"
+ photos: "Photos"
+ contacts: "Contacts"
+ posts: "Posts"
conversation:
participants: "Participants"
@@ -122,12 +160,14 @@ en:
unlike: "Unlike"
reshare: "Reshare"
comment: "Comment"
- original_post_deleted: "Original post deleted by author."
+ original_post_deleted: "Original post deleted by author"
show_nsfw_post: "Show post"
show_nsfw_posts: "Show all"
hide_nsfw_posts: "Hide #nsfw posts"
follow: "Follow"
unfollow: "Unfollow"
+ enable_post_notifications: "Enable notifications for this post"
+ disable_post_notifications: "Disable notifications for this post"
via: "via <%= provider %>"
likes:
@@ -146,7 +186,7 @@ en:
other: "Show <%= count %> more comments"
followed_tag:
- title: "#Followed Tags"
+ title: "#Followed tags"
contacts_title: "People who dig these tags"
add_a_tag: "Add a tag"
follow: "Follow"
@@ -154,7 +194,7 @@ en:
tags:
follow: "Follow #<%= tag %>"
following: "Following #<%= tag %>"
- stop_following: "Stop Following #<%= tag %>"
+ stop_following: "Stop following #<%= tag %>"
header:
home: "Home"
@@ -170,10 +210,10 @@ en:
search: "Search"
- recent_notifications: "Recent Notifications"
+ recent_notifications: "Recent notifications"
mark_all_as_read: "Mark all as read"
view_all: "View all"
- close: "close"
+ close: "Close"
viewer:
stop_following_post: "Stop following post"
@@ -183,10 +223,12 @@ en:
reshare: "Reshare"
reshared: "Reshared"
comment: "Comment"
- home: "HOME"
+ home: "Home"
poll:
vote: "Vote"
+ go_to_original_post: "You can participate in this poll on the <%= original_post_link %>."
+ original_post: "original post"
result: "Result"
count:
one: "1 vote so far"
diff --git a/config/locales/javascript/javascript.en_valspeak.yml b/config/locales/javascript/javascript.en_valspeak.yml
new file mode 100644
index 000000000..4ada53a23
--- /dev/null
+++ b/config/locales/javascript/javascript.en_valspeak.yml
@@ -0,0 +1,207 @@
+# Copyright (c) 2010-2013, Diaspora Inc. This file is
+# licensed under the Affero General Public License version 3 or later. See
+# the COPYRIGHT file.
+
+
+
+en_valspeak:
+ javascripts:
+ and: "n"
+ aspect_dropdown:
+ add_to_aspect: "Add BFF"
+ all_aspects: "All aspectz"
+ error: "So like, couldnt start sharin wit <%= name %>. R u like, blockin them?"
+ error_remove: "so like, i couldnt remove <%= name %> from the aspect :( sry bout that :("
+ select_aspects: "Pick aspectz"
+ started_sharing_with: "U have started sharin wit <%= name %>! :DD"
+ stopped_sharing_with: "U stopped sharin wit <%= name %>."
+ toggle:
+ one: "In <%= count %> aspect <3"
+ other: "In like, <%= count %> aspectz"
+ zero: "Pick aspectz"
+ aspect_navigation:
+ add_an_aspect: "+ Add an aspect!!!"
+ deselect_all: "Unhighlight all"
+ no_aspects: "No aspectz picked"
+ select_all: "Highlight all"
+ bookmarklet:
+ post_something: "Make a postie to d*!!"
+ post_submit: "Submitting postie... hold up..."
+ post_success: "Posted!!! Closin popup windowww... <3"
+ comma: ","
+ comments:
+ hide: "hide commentz"
+ no_comments: "Theres no commentz yet. :("
+ show: "show all commentz"
+ confirm_dialog: "R u like... fer sure?"
+ contacts:
+ add_contact: "Add BFF"
+ aspect_list_is_not_visible: "So like, BFFs in this aspect r not able 2 like... c each other..."
+ aspect_list_is_visible: "BFFs in this aspect r like.. able 2 c each other. JustFYI, K?"
+ error_add: "Couldnt like... add <%= name %> 2 the aspect :(("
+ error_remove: "Couldnt like... trash <%= name %> from the aspect :(("
+ remove_contact: "Remove BFF"
+ conversation:
+ participants: "Ppl up in here"
+ 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:
+ alright_ill_wait: "Aight, ill hold up."
+ hey: "Ohai, <%= name %>!"
+ no_tags: "Ohai! u havent like, followed ne tags! Continue neway? :)"
+ preparing_your_stream: "Preparin ur Wall thingy..."
+ header:
+ admin: "The man"
+ close: "byez"
+ contacts: "Besties!"
+ conversations: "Convoz!"
+ help: "Halp"
+ home: "Homee"
+ log_out: "Bounce"
+ mark_all_as_read: "Read them all"
+ notifications: "Noties"
+ profile: "Profilee"
+ recent_notifications: "Recent Noties"
+ search: "Look for"
+ settings: "Settins"
+ view_all: "Look at all"
+ ignore: "Block"
+ ignore_failed: "Cant block this h8ter :\\"
+ ignore_user: "Ignore this h8ter?"
+ infinite_scroll:
+ no_more: "No moar posties :("
+ no_more_contacts: "No more besties :("
+ my_activity: "My Happenins"
+ my_aspects: "My Aspectz"
+ my_stream: "Wall"
+ no_results: "So like, no resultz were found... sry bout tht :\\"
+ notifications:
+ mark_read: "Seen it"
+ mark_unread: "Havent seen it"
+ people:
+ edit_my_profile: "Edit mah profile!!"
+ helper:
+ is_not_sharing: "<%= name %> is not like... sharin wit u :( lame.."
+ is_sharing: "Like, OMG! <%= name %> is sharin wit u!!! :DD"
+ mention: "Mentionnn <3"
+ message: "Txt"
+ not_found: "nothing was found... not even my shoes :("
+ stop_ignoring: "Stop ignorin"
+ photo_uploader:
+ completed: "<%= file %> completed!!! YAY!"
+ empty: "{file} is like, empty... plz pick the file again witout it. Kay?"
+ error: "So like, there was an issue when like, uploadin file <%= file %>... sry bout tht... :\\"
+ invalid_ext: "{file} like, has an extension that is like... not valid. Only like, {extensions} r allowed, kay?"
+ looking_good: "OMG, u look totally awesome! :D <3"
+ size_error: "{file} is like... 2 big, the biggest size i can take is {sizeLimit}. Kay?(;"
+ poll:
+ close_result: "Stop peekin at result...O_O"
+ count:
+ one: "1 vote so far!!(:"
+ other: "OMG! u have like... <%=count%> votes so far!!! :DDD"
+ result: "Like... the results"
+ show_result: "Peek at result...shh"
+ vote: "Make a differenceeee"
+ profile:
+ add_some: "add summ<3"
+ bio: "All about meeee <333"
+ born: "Bday"
+ contacts: "BFFs <33"
+ edit: "edit!"
+ gender: "So Im like..."
+ ignoring: "U r ignorin all posties from <%= name %>."
+ location: "My crib"
+ photos: "Pics and selfies <3"
+ you_have_no_tags: "u like... have no tagz!"
+ publisher:
+ add_option: "Like, add an ansah!"
+ at_least_one_aspect: "U like... must add to at least 1 group"
+ limited: "Limited - ur postie will only b seen by ppl u r sharin wit"
+ near_from: "Postie from: <%= location %>"
+ option: "Mah ansah<3"
+ public: "Internetz - ur postie will b seen by any1 on the internet"
+ question: "Question!!!"
+ report:
+ name: "Tattle on"
+ prompt: "Plz say y:"
+ prompt_default: "groody content"
+ status:
+ 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"
+ search_for: "Look for <%= name %>"
+ show_more: "show moar"
+ stream:
+ comment: "Comment!!"
+ follow: "Stalk"
+ followed_tag:
+ add_a_tag: "Add a tag!!"
+ contacts_title: "Ppl who <3 these tagz"
+ follow: "Folloe!!"
+ title: "#Followed Tagz"
+ hide: "Hyde"
+ hide_nsfw_posts: "Hide #groody posties. Gag me with a spoon!"
+ like: "<3"
+ likes:
+ one: "<%= count %> like!!(:"
+ other: "OMG! u got like... <%= count %> likez!!! :DDD"
+ zero: "<%= count %> likes :("
+ limited: "Limitedd"
+ more_comments:
+ one: "Show like, <%= count %> more comment"
+ other: "Show liek, <%= count %> more commentz"
+ zero: "Show <%= count %> more commentz"
+ original_post_deleted: "so like, the original postie was trashed by the maker of it :\\"
+ public: "Internetz"
+ reshare: "Reshar"
+ reshares:
+ one: "<%= count %> Reshare!!!(:"
+ other: "OMG!! <%= count %> reshares!!! :DDD"
+ zero: "<%= count%> Reshares :("
+ show_nsfw_post: "Show postie"
+ show_nsfw_posts: "Show allll"
+ tags:
+ follow: "Follow #<%= tag %>!!"
+ following: "Followin #<%= tag %>"
+ stop_following: "Stop followin #<%= tag %>"
+ unfollow: "Stop stalkin"
+ unlike: "</3"
+ via: "like, via <%= provider %>"
+ tags:
+ wasnt_that_interesting: "K, I guess #<%= tagName %> wasnt all that gr8. Whatev."
+ timeago:
+ day: "like... a day"
+ days: "like... %d dayz"
+ hour: "bout an hr"
+ hours: "bout %d hrs"
+ minute: "bout a min"
+ minutes: "%d mins"
+ month: "bout like... a month"
+ months: "like %d months"
+ prefixAgo: ""
+ prefixFromNow: ""
+ seconds: "less than a min"
+ suffixAgo: "like... ago"
+ suffixFromNow: "from nao"
+ wordSeparator: ""
+ year: "bout like... a yr"
+ years: "like %d yrs"
+ unblock_failed: "Unblockin this h8ter didnt work :("
+ videos:
+ unknown: "i dunno what kinda vid this is :("
+ watch: "Watch this vid on <%= provider %>"
+ viewer:
+ comment: "Comment!!"
+ follow_post: "Follow postie"
+ home: "HOOOMMMMEEEE"
+ like: "<3"
+ reshare: "Reshare!!"
+ reshared: "Reshared<33"
+ stop_following_post: "Stop followin postie"
+ unlike: "</3" \ No newline at end of file
diff --git a/config/locales/javascript/javascript.es-AR.yml b/config/locales/javascript/javascript.es-AR.yml
index 6eba17095..c774cfac0 100644
--- a/config/locales/javascript/javascript.es-AR.yml
+++ b/config/locales/javascript/javascript.es-AR.yml
@@ -11,7 +11,9 @@ es-AR:
add_to_aspect: "Agregar contacto"
all_aspects: "Todos los aspectos"
error: "No se pudo empezar a compartir con <%= name %>. ¿Será que la/lo estás ignorando?"
- error_remove: "No se pudo eliminar a <%= name %> del aspecto."
+ error_remove: "No se pudo eliminar a <%= name %> del aspecto. :("
+ mobile_row_checked: "<%= name %> (eliminar)"
+ mobile_row_unchecked: "<%= name %> (agregar)"
select_aspects: "Selecciona aspectos"
started_sharing_with: "¡Has empezado a compartir con <%= name%>!"
stopped_sharing_with: "Has dejado de compartir con <%= name =%>"
@@ -19,6 +21,7 @@ es-AR:
one: "En <%= count %> aspecto"
other: "En <%= count %> aspectos"
zero: "Seleccionar aspectos"
+ updating: "actualizando…"
aspect_navigation:
add_an_aspect: "+ Agregar un aspecto"
deselect_all: "Deseleccionar todo"
@@ -30,10 +33,19 @@ es-AR:
post_success: "¡Publicado! Cerrando ventana emergente..."
comma: ","
comments:
- hide: "ocultar los comentarios"
+ hide: "Ocultar comentarios"
no_comments: "Aún no hay comentarios."
- show: "mostrar todos los comentarios"
+ show: "Mostrar todos los comentarios"
confirm_dialog: "¿Estás seguro?"
+ confirm_unload: "Por favor, confirmá que deseás salir de esta página. Los datos que has ingresado no serán guardados."
+ contacts:
+ add_contact: "Agregar contacto"
+ aspect_list_is_not_visible: "La lista de contactos de este aspecto no es visible."
+ aspect_list_is_visible: "La lista de contactos de este aspecto es visible."
+ error_add: "No se puede agregar a <%= name %> a este aspecto :("
+ error_remove: "No se puede eliminar a <%= name %> de este aspecto :("
+ remove_contact: "Eliminar contacto"
+ search_no_results: "No se han encontrado contactos con ese nombre."
conversation:
participants: "Participantes"
delete: "Borrar"
@@ -41,6 +53,7 @@ es-AR:
failed_to_like: "¡No pudo marcarse como 'Me gusta'!"
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 %>!"
@@ -61,6 +74,8 @@ es-AR:
search: "Buscar"
settings: "Opciones"
view_all: "Ver todo"
+ hide_post: "¿Ocultar esta publicación?"
+ hide_post_failed: "No se puede ocultar esta publicación"
ignore: "Ignorar"
ignore_failed: "No es posible ignorar este usuario"
ignore_user: "¿Ignorar a este usuario?"
@@ -70,11 +85,19 @@ es-AR:
my_activity: "Mi actividad"
my_aspects: "Mis aspectos"
my_stream: "Entrada"
+ no_results: "No se encontraron resultados"
notifications:
mark_read: "Marcar como leído"
mark_unread: "Marcar como no leído"
people:
+ edit_my_profile: "Editar mi perfil"
+ helper:
+ is_not_sharing: "<%= name %> no está compartiendo con vos"
+ is_sharing: "<%= name %> está compartiendo con vos"
+ mention: "Mención"
+ message: "Mensaje"
not_found: "...y no se encontró a nadie."
+ stop_ignoring: "Dejar de ignorar"
photo_uploader:
completed: "<%= file %> completado"
empty: "El archivo {file} está vacío, por favor selecciona los archivos nuevamente sin incluir este."
@@ -87,17 +110,32 @@ es-AR:
count:
one: "<%=count%> voto hasta ahora"
other: "<%=count%> votos hasta ahora"
+ go_to_original_post: "Puedes participar de esta encuesta en <%= original_post_link %>"
+ original_post: "publicación original"
result: "Resultados"
show_result: "Mostrar resultados"
vote: "Votar"
+ profile:
+ add_some: "Agregar algo"
+ bio: "Biografía"
+ born: "Fecha de nacimiento"
+ contacts: "Contactos"
+ edit: "Editar"
+ gender: "Género"
+ ignoring: "Estás ignorando todas las publicaciones de <%= name %>."
+ location: "Ubicación"
+ photos: "Fotos"
+ posts: "Publicaciones"
+ you_have_no_tags: "¡No tenés etiquetas!"
publisher:
add_option: "Añadir respuesta"
at_least_one_aspect: "Tenés que publicarlo en, por lo menos, un aspecto"
- limited: "Limitada - tu publicación sera vista solo por la gente con quien la compartes "
+ limited: "Limitada: tu publicación será vista solo por la gente con quien la compartes"
near_from: "Cerca de: <%= location %>"
option: "Respuesta"
- public: "Publica - tu publicación sera visible para cualquiera y los buscadores podrán encontrarla"
+ public: "Publica: tu publicación será visible para cualquiera en Internet y los buscadores podrán encontrarla"
question: "Pregunta"
+ remove_post: "¿Eliminar esta publicación?"
report:
name: "Reporte"
prompt: "Por favor introduce el motivo:"
@@ -110,9 +148,11 @@ es-AR:
post: "¿Compartir la publicación de <%= name %>?"
successful: "¡La publicación se compartió correctamente!"
search_for: "Buscar a <%= name %>"
- show_more: "mostrar más"
+ show_more: "Mostrar más"
stream:
comment: "Comentar"
+ disable_post_notifications: "Desactivar las notificaciones para esta publicación"
+ enable_post_notifications: "Activar las notificaciones para esta publicación"
follow: "Seguir"
followed_tag:
add_a_tag: "Añadir una etiqueta"
@@ -166,13 +206,14 @@ es-AR:
wordSeparator: " "
year: "cerca de un año"
years: "%d años"
+ unblock_failed: "Falló el desbloqueo del usuario"
videos:
unknown: "Tipo de video desconocido"
watch: "Ver este video en <%= provider %>"
viewer:
comment: "Comentar"
follow_post: "Seguir esta publicación"
- home: "INICIO"
+ home: "Inicio"
like: "Me gusta"
reshare: "Compartir"
reshared: "Compartido"
diff --git a/config/locales/javascript/javascript.es.yml b/config/locales/javascript/javascript.es.yml
index 3b4dd84b5..519370f79 100644
--- a/config/locales/javascript/javascript.es.yml
+++ b/config/locales/javascript/javascript.es.yml
@@ -12,6 +12,8 @@ es:
all_aspects: "Todos los aspectos"
error: "No podrás compartir con <%= name %>. ¿Estás ignorándole?"
error_remove: "No se pudo eliminar a <%= name %> del aspecto :("
+ mobile_row_checked: "<%= name %> (eliminar)"
+ mobile_row_unchecked: "<%= name %> (añadir)"
select_aspects: "Elige los aspectos"
started_sharing_with: "¡Has empezado a compartir con <%= name %>!"
stopped_sharing_with: "Ya no compartes más con <%= name %>."
@@ -19,6 +21,7 @@ es:
one: "En <%= count %> aspecto"
other: "En <%= count %> aspectos"
zero: "Elige los aspectos"
+ updating: "actualizando..."
aspect_navigation:
add_an_aspect: "+ Añadir un aspecto"
deselect_all: "Desmarcar todos"
@@ -34,6 +37,15 @@ es:
no_comments: "Aún no hay comentarios."
show: "mostrar todos los comentarios"
confirm_dialog: "¿Estás seguro?"
+ confirm_unload: "Por favor, confirma que quieres abandonar esta página. Los datos que no hayas introducido, no serán guardados."
+ contacts:
+ add_contact: "Añadir contacto"
+ aspect_list_is_not_visible: "Los contactos de este aspecto no pueden verse entre ellos."
+ aspect_list_is_visible: "Los contactos de este aspecto pueden verse entre ellos."
+ error_add: "No se pudo añadir a <%= name %> al aspecto :("
+ error_remove: "No se pudo eliminar <%= name %> del aspecto :("
+ remove_contact: "Eliminar contacto"
+ search_no_results: "No se encontraron contactos"
conversation:
participants: "Participantes"
delete: "Eliminar"
@@ -41,6 +53,7 @@ es:
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 %>!"
@@ -54,13 +67,15 @@ es:
help: "Ayuda"
home: "Inicio"
log_out: "Salir"
- mark_all_as_read: "Marcar todo como leido"
+ mark_all_as_read: "Marcar todo como leído"
notifications: "Notificaciones"
profile: "Perfil"
recent_notifications: "Notificaciones recientes"
search: "Buscar"
settings: "Ajustes"
view_all: "Ver todo"
+ hide_post: "Ocultar esta publicación?"
+ hide_post_failed: "Imposible ocultar esta publicación"
ignore: "Ignorar"
ignore_failed: "Imposible ignorar a este usuario"
ignore_user: "¿Ignorar a este usuario?"
@@ -70,11 +85,19 @@ es:
my_activity: "Mi Actividad"
my_aspects: "Mis aspectos"
my_stream: "Portada"
+ no_results: "No se ha encontrado nada"
notifications:
mark_read: "Marcar como leído"
mark_unread: "Marcar como no leído"
people:
+ edit_my_profile: "Editar mi perfil"
+ helper:
+ is_not_sharing: "<%= name %> no está compartiendo contigo"
+ is_sharing: "<%= name %> está compartiendo contigo"
+ mention: "Mención"
+ message: "Mensaje"
not_found: "...y no se encontró a nadie."
+ stop_ignoring: "Dejar de ignorar"
photo_uploader:
completed: "<%= file %> completado"
empty: "{file} está vacío, por favor selecciona otros archivos."
@@ -87,9 +110,23 @@ es:
count:
one: "<%=count%> voto por ahora"
other: "<%=count%> votos por ahora"
+ go_to_original_post: "Puedes participar en esta encuesta en <%= original_post_link %>."
+ original_post: "publicación original"
result: "Resultados"
show_result: "Mostrar resultados"
vote: "Votar"
+ profile:
+ add_some: "añadir algo"
+ bio: "Biografía"
+ born: "Cumpleaños"
+ contacts: "Contactos"
+ edit: "editar"
+ gender: "Sexo"
+ ignoring: "Estás ignorando todas las publicaciones de <%= name %>."
+ location: "Ubicación"
+ photos: "Fotos"
+ posts: "Mensajes"
+ you_have_no_tags: "¡no tienes etiquetas!"
publisher:
add_option: "Añadir una respuesta"
at_least_one_aspect: "Debes publicarlo al menos en un aspecto"
@@ -98,6 +135,7 @@ es:
option: "Respuesta"
public: "Público - tu publicación es visible para todos, incluyendo buscadores"
question: "Pregunta"
+ remove_post: "Borrar esta publicación?"
report:
name: "Informar"
prompt: "Por favor introduce un motivo:"
@@ -113,6 +151,8 @@ es:
show_more: "mostrar más"
stream:
comment: "Comentar"
+ disable_post_notifications: "Desactiva los avisos para esta publicación"
+ enable_post_notifications: "Activa los avisos para esta publicación"
follow: "Seguir"
followed_tag:
add_a_tag: "Añadir una etiqueta"
@@ -166,6 +206,7 @@ es:
wordSeparator: " "
year: "un año aproximadamente"
years: "%d años"
+ unblock_failed: "Falló el desbloqueo del usuario"
videos:
unknown: "Tipo de vídeo desconocido"
watch: "Ver este video con <%= provider %>"
diff --git a/config/locales/javascript/javascript.fi.yml b/config/locales/javascript/javascript.fi.yml
index 840647961..552dc393f 100644
--- a/config/locales/javascript/javascript.fi.yml
+++ b/config/locales/javascript/javascript.fi.yml
@@ -12,6 +12,8 @@ fi:
all_aspects: "Kaikki näkymät"
error: "Ei voitu aloittaa jakamaan käyttäjän <%= name %> kanssa. Oletko sivuuttanut hänet?"
error_remove: "Käyttäjää <%= name %> ei voitu poistaa näkymästä :("
+ mobile_row_checked: "<%= name %> (poista)"
+ mobile_row_unchecked: "<%= name %> (lisää)"
select_aspects: "Valitse näkymät"
started_sharing_with: "Olet alkanut jakaa käyttäjän <%= name %> kanssa!"
stopped_sharing_with: "Olet lopettanut jakamisen käyttäjän <%= name %> kanssa."
@@ -22,6 +24,7 @@ fi:
other: "<%= count %> näkymässä"
two: "<%= count %> näkymässä"
zero: "Valitse näkymät"
+ updating: "päivittää..."
aspect_navigation:
add_an_aspect: "+ Lisää näkymä"
deselect_all: "Poista valinnat"
@@ -33,10 +36,19 @@ fi:
post_success: "Julkaistu! Suljetaan ponnahdusikkuna"
comma: ","
comments:
- hide: "piilota kommentit"
+ hide: "Piilota kommentit"
no_comments: "Kommentteja ei vielä ole."
- show: "näytä kaikki kommentit"
+ show: "Näytä kaikki kommentit"
confirm_dialog: "Oletko varma?"
+ confirm_unload: "Vahvista, että haluat poistua tältä sivulta. Syöttämiäsi tietoja ei tallenneta."
+ contacts:
+ add_contact: "Lisää kontakti"
+ aspect_list_is_not_visible: "Tämän näkymän kontaktit eivät voi nähdä toisiaan."
+ aspect_list_is_visible: "Tämän näkymän kontaktit voivat nähdä toisensa."
+ error_add: "Henkilön <%= name %> lisääminen näkymään ei onnistunut :("
+ error_remove: "Käyttäjää <%= name %> ei voitu poistaa näkymästä :("
+ remove_contact: "Poista kontakti"
+ search_no_results: "Kontakteja ei löytynyt"
conversation:
participants: "Osallistujat"
delete: "Poista"
@@ -44,6 +56,7 @@ fi:
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 %>!"
@@ -52,7 +65,7 @@ fi:
header:
admin: "Ylläpitäjä"
close: "sulje"
- contacts: "Henkilöt"
+ contacts: "Kontaktit"
conversations: "Keskustelut"
help: "Apua"
home: "Koti"
@@ -64,7 +77,10 @@ fi:
search: "Etsi"
settings: "Asetukset"
view_all: "Näytä kaikki"
+ hide_post: "Piilota tämä julkaisu?"
+ hide_post_failed: "Tätä julkaisua ei voitu piilottaa"
ignore: "Sivuuta"
+ ignore_failed: "Tämän käyttäjän sivuuttaminen ei onnistu"
ignore_user: "Sivuuta tämä käyttäjä?"
infinite_scroll:
no_more: "Ei enempää viestejä."
@@ -72,16 +88,24 @@ fi:
my_activity: "Oma toimintani"
my_aspects: "Omat näkymäni"
my_stream: "Virta"
+ no_results: "Ei tuloksia"
notifications:
mark_read: "Merkitse luetuksi"
mark_unread: "Merkitse lukemattomaksi"
people:
+ edit_my_profile: "Muokkaa profiiliani"
+ helper:
+ is_not_sharing: "<%= name %> ei jaa kanssasi"
+ is_sharing: "<%= name %> jakaa kanssasi"
+ mention: "Mainitse"
+ message: "Viesti"
not_found: "...ketään ei löytynyt."
+ stop_ignoring: "Lopeta sivuuttaminen"
photo_uploader:
completed: "<%= file %> suoritettu"
empty: "Tiedosto {file} on tyhjä, valitse tiedostot uudelleen ilman kyseistä tiedostoa."
error: "On tapahtunut virhe lähetettäessä tiedostoa <%= file %>"
- invalid_ext: "Tiedostolla {file} on epäkelpo tiedostopääte. Vain {extensions} päätteet ovat sallittuja."
+ invalid_ext: "Tiedostolla {file} on epäkelpo tiedostopääte. Vain päätteet {extensions} ovat sallittuja."
looking_good: "OMG, näytät upealta!"
size_error: "Tiedosto {file} on liian iso, suurin sallittu tiedostokoko on {sizeLimit}"
poll:
@@ -92,14 +116,27 @@ fi:
result: "Tulos"
show_result: "Näytä tulokset"
vote: "Äänestä"
+ profile:
+ add_some: "Lisää niitä"
+ bio: "Elämäkerta"
+ born: "Syntymäpäivä"
+ contacts: "Kontaktit"
+ edit: "Muokkaa"
+ gender: "Sukupuoli"
+ ignoring: "Sivuutat nyt kaikki julkaisut, jotka <%= name %> lähettää."
+ location: "Sijainti"
+ photos: "Kuvat"
+ posts: "Julkaisut"
+ you_have_no_tags: "Sinulla ei ole tageja!"
publisher:
- add_option: "Lisää vastausvaihtoehto"
+ add_option: "Lisää vastaus"
at_least_one_aspect: "Sinun täytyy julkaista vähintään yhdelle näkymälle."
limited: "Rajoitettu - julkaisusi näkyy vain ihmisille, joiden kanssa jaat"
near_from: "Lähetetty sijainnista: <%= location %>"
- option: "Vastaus <%= nr %>"
+ option: "Vastaus"
public: "Julkinen - julkaisusi näkyvät kaikille mukaan lukien hakukoneet ja niiden tulokset"
question: "Kysymys"
+ remove_post: "Poista tämä julkaisu?"
report:
name: "Tee ilmoitus"
prompt: "Ole hyvä, kirjoita syy:"
@@ -112,9 +149,11 @@ fi:
post: "Jaa käyttäjän <%= name %> julkaisu?"
successful: "Julkaisu jaettiin onnistuneesti!"
search_for: "Etsi nimellä <%= name %>"
- show_more: "näytä lisää"
+ show_more: "Näytä lisää"
stream:
comment: "Kommentoi"
+ disable_post_notifications: "Poista ilmoitukset käytöstä tästä julkaisusta"
+ enable_post_notifications: "Ota ilmoitukset käyttöön tälle julkaisulle"
follow: "Seuraa"
followed_tag:
add_a_tag: "Lisää tagi"
@@ -154,7 +193,7 @@ fi:
tags:
follow: "Seuraa #<%= tag %>"
following: "Seurataan tagia #<%= tag %>"
- stop_following: "Lopeta seuraamasta tagia #<%= tag %>"
+ stop_following: "Lopeta tagin #<%= tag %> seuraaminen"
unfollow: "Lopeta seuraaminen"
unlike: "Peru tykkäys"
via: "<%= provider %> kautta"
@@ -177,6 +216,7 @@ fi:
wordSeparator: " "
year: "noin vuosi"
years: "%d vuotta"
+ unblock_failed: "Tämän käyttäjän torjumisen peruminen on epäonnistunut"
videos:
unknown: "Tuntematon videomuoto"
watch: "Katso video palvelussa <%= provider %>"
diff --git a/config/locales/javascript/javascript.fr.yml b/config/locales/javascript/javascript.fr.yml
index a6111291a..51fad058c 100644
--- a/config/locales/javascript/javascript.fr.yml
+++ b/config/locales/javascript/javascript.fr.yml
@@ -12,20 +12,20 @@ fr:
all_aspects: "Tous les aspects"
error: "Impossible de partager avec <%= name %>. Ignorez-vous cette personne ?"
error_remove: "Ne peut pas supprimer <%= name %> de l'aspect :("
+ mobile_row_checked: "<%= name %> (retirer)"
+ mobile_row_unchecked: "<%= name %> (ajouter)"
select_aspects: "Choisir les aspects"
started_sharing_with: "Vous avez commencé à partager avec <%= name %> !"
stopped_sharing_with: "Vous avez arrêté de partager avec <%= name %>."
toggle:
- few: "Dans <%= count %> aspects"
- many: "Dans <%= count %> aspects"
one: "Dans <%= count %> aspect"
other: "Dans <%= count %> aspects"
- two: "Dans <%= count %> aspects"
zero: "Sélectionnez les aspects"
+ updating: "Mise à jour..."
aspect_navigation:
add_an_aspect: "+ Ajouter un aspect"
deselect_all: "Désélectionner tout"
- no_aspects: "Aucun aspect sélectionné"
+ no_aspects: "Aucun aspect sélectionnée"
select_all: "Sélectionner tout"
bookmarklet:
post_something: "Publier sur diaspora*"
@@ -37,6 +37,15 @@ fr:
no_comments: "Il n'y a pas encore de commentaires."
show: "Afficher tous les commentaires"
confirm_dialog: "Êtes-vous certain-e ?"
+ confirm_unload: "Merci de confirmer que vous voulez quitter cette page — les données saisies ne seront pas sauvegardées."
+ contacts:
+ add_contact: "Ajouter ce contact"
+ aspect_list_is_not_visible: "Les contacts de cette facette ne peuvent pas se voir entre eux."
+ aspect_list_is_visible: "Les contacts de cette facette peuvent se voir entre eux."
+ error_add: "Impossible d'ajouter <%= name %> à cette facette :("
+ error_remove: "Impossible de retirer <%= name %> de cette facette :("
+ remove_contact: "Retirer ce contact"
+ search_no_results: "Aucun contact trouvé"
conversation:
participants: "Participants"
delete: "Effacer"
@@ -44,6 +53,7 @@ fr:
failed_to_like: "Impossible d'aimer !"
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 %> !"
@@ -64,6 +74,8 @@ fr:
search: "Trouver des personnes ou #tags"
settings: "Paramètres"
view_all: "Tout afficher"
+ hide_post: "Masquer ce message ?"
+ hide_post_failed: "Impossible de masquer ce message"
ignore: "Ignorer"
ignore_failed: "Impossible d'ignorer cet utilisateur"
ignore_user: "Ignorer cet utilisateur ?"
@@ -71,13 +83,21 @@ fr:
no_more: "Pas d'autres messages."
no_more_contacts: "Pas d'autres contacts."
my_activity: "Mon activité"
- my_aspects: "Mes Aspects"
+ my_aspects: "Mes aspects"
my_stream: "Flux"
+ no_results: "Aucun résultat"
notifications:
mark_read: "Marquer comme lu"
mark_unread: "Marquer comme non lu"
people:
+ edit_my_profile: "Modifier mon profil"
+ helper:
+ is_not_sharing: "<%= name %> ne partage pas avec vous"
+ is_sharing: "<%= name %> partage avec vous"
+ mention: "Mentionner"
+ message: "Message"
not_found: "Et personne n'a été trouvé ..."
+ stop_ignoring: "Ne plus ignorer"
photo_uploader:
completed: "<%= file %> complété"
empty: "{file} est vide, merci de sélectionner d'autres fichiers."
@@ -90,9 +110,23 @@ fr:
count:
one: "<%=count%> vote pour le moment"
other: "<%=count%> votes pour le moment"
+ go_to_original_post: "Vous pouvez participer à ce sondage sur le <%= original_post_link %>."
+ original_post: "message initial"
result: "Résultat"
show_result: "Afficher les résultats"
vote: "Vote"
+ profile:
+ add_some: "ajouter"
+ bio: "Biographie"
+ born: "Anniversaire"
+ contacts: "Contacts"
+ edit: "modifier"
+ gender: "Genre"
+ ignoring: "Vous ignorez tous les messages de <%= name %>."
+ location: "Localisation"
+ photos: "Photos"
+ posts: "Messages"
+ you_have_no_tags: "vous n'avez pas de tag !"
publisher:
add_option: "Ajouter un choix"
at_least_one_aspect: "Vous devez créer au moins un aspect"
@@ -101,13 +135,14 @@ fr:
option: "Choix"
public: "Public - votre message sera visible de tous et trouvé par les moteurs de recherche"
question: "Question"
+ remove_post: "Supprimer ce message ?"
report:
- name: "Rapport"
+ name: "Signaler"
prompt: "Merci de saisir un motif :"
prompt_default: "Contenu offensant"
status:
- created: "Le rapport a été crée avec succès."
- exists: "Le rapport existe déjà"
+ 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 %> ?"
@@ -116,6 +151,8 @@ fr:
show_more: "Voir plus"
stream:
comment: "Commenter"
+ disable_post_notifications: "Désactiver les notifications pour ce message"
+ enable_post_notifications: "Activer les notifications pour ce message"
follow: "Suivre"
followed_tag:
add_a_tag: "Ajouter un tag"
@@ -153,7 +190,7 @@ fr:
follow: "Suivre #<%= tag %>"
following: "Suivant #<%= tag %>"
stop_following: "Arrêter de suivre #<%= tag %>"
- unfollow: "Ne pas suivre"
+ unfollow: "Ne plus suivre"
unlike: "Je n'aime plus"
via: "via <%= provider %>"
tags:
@@ -175,6 +212,7 @@ fr:
wordSeparator: " "
year: "un an"
years: "%d ans"
+ unblock_failed: "Impossible de débloquer cet utilisateur"
videos:
unknown: "Type de vidéo inconnu"
watch: "Voir cette vidéo sur <%= provider %>"
diff --git a/config/locales/javascript/javascript.gd.yml b/config/locales/javascript/javascript.gd.yml
new file mode 100644
index 000000000..42bbdcca5
--- /dev/null
+++ b/config/locales/javascript/javascript.gd.yml
@@ -0,0 +1,15 @@
+# Copyright (c) 2010-2013, Diaspora Inc. This file is
+# licensed under the Affero General Public License version 3 or later. See
+# the COPYRIGHT file.
+
+
+
+gd:
+ javascripts:
+ profile:
+ born: "Co-là-breith"
+ timeago:
+ prefixAgo: ""
+ prefixFromNow: ""
+ suffixAgo: ""
+ suffixFromNow: "" \ No newline at end of file
diff --git a/config/locales/javascript/javascript.gl.yml b/config/locales/javascript/javascript.gl.yml
index 972925341..c6920c3a3 100644
--- a/config/locales/javascript/javascript.gl.yml
+++ b/config/locales/javascript/javascript.gl.yml
@@ -7,6 +7,7 @@
gl:
javascripts:
confirm_dialog: "Está seguro?"
+ confirm_unload: "Confirme que quere abandonar esta páxina. Non se gardarán os datos que introduciu."
report:
prompt: "Explique o motivo:"
prompt_default: "Contido ofensivo"
@@ -20,9 +21,12 @@ gl:
ignore: "Ignorar"
report: "Denunciar"
ignore_user: "Ignorar este usuario?"
+ ignore_failed: "Non é posíbel ignorar a este usuario"
+ unblock_failed: "Non foi posíbel retirarlle o bloqueo a este usuario"
and: "e"
comma: ","
edit: "Editar"
+ no_results: "Non se atoparon resultados"
timeago:
prefixAgo: "Hai"
prefixFromNow: "Dentro de"
@@ -41,6 +45,14 @@ gl:
years: "%d anos."
wordSeparator: " "
+ contacts:
+ add_contact: "Engadir un contacto"
+ aspect_list_is_visible: "Os contactos deste aspecto poden verse os uns aos outros."
+ aspect_list_is_not_visible: "Os contactos deste aspecto non poden verse os uns aos outros."
+ remove_contact: "Retirar o contacto"
+ error_add: "Non foi posíbel engadir a <%= name %> ao aspecto :("
+ error_remove: "Non foi posíbel retirar a <%= name %> do aspecto :("
+
my_activity: "Actividade"
my_stream: "Onda"
my_aspects: "Aspectos"
@@ -54,8 +66,8 @@ gl:
limited: "Limitado. Só poderá velo a xente coa que comparte."
public: "Público. Poderá velo calquera, e aparecerá nos motores de busca."
near_from: "Publicado desde <%= location %>"
- option: "Opción <%= nr %>"
- add_option: "Engadir unha opción"
+ option: "Resposta"
+ add_option: "Engadir unha resposta"
question: "Cuestión"
bookmarklet:
post_something: "Publicar en diaspora*"
@@ -107,6 +119,25 @@ gl:
wasnt_that_interesting: "Vale, supoño que #<%= tagName %> non era tan interesante…"
people:
not_found: "Non se atopou a ninguén."
+ mention: "Mención"
+ message: "Mensaxe"
+ edit_my_profile: "Editar o perfil persoal"
+ stop_ignoring: "Deixar de ignorar"
+ helper:
+ is_sharing: "<%= name %> está a compartir con vostede"
+ is_not_sharing: "<%= name %> non está a compartir con vostede"
+ profile:
+ edit: "Editar"
+ add_some: "Engadir algunhas"
+ you_have_no_tags: "Non ten etiquetas!"
+ ignoring: "Está a ignorar todas as publicacións de <%= name %>."
+ bio: "Biografía"
+ location: "Lugar"
+ gender: "Sexo"
+ born: "Data de nacemento"
+ photos: "Fotos"
+ contacts: "Contactos"
+ posts: "Publicacións"
conversation:
participants: "Participantes"
diff --git a/config/locales/javascript/javascript.hu.yml b/config/locales/javascript/javascript.hu.yml
index 5bf33364a..42d8220c0 100644
--- a/config/locales/javascript/javascript.hu.yml
+++ b/config/locales/javascript/javascript.hu.yml
@@ -37,6 +37,11 @@ hu:
no_comments: "Még nincs hozzászólás."
show: "összes hozzászólás"
confirm_dialog: "Biztos vagy benne?"
+ contacts:
+ add_contact: "Ismerős hozzáadása"
+ 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"
conversation:
participants: "Résztvevők"
delete: "Töröl"
@@ -73,11 +78,16 @@ hu:
my_activity: "Tevékenységeim"
my_aspects: "Csoportjaim"
my_stream: "Hírfolyam"
+ no_results: "Nincs találat"
notifications:
mark_read: "Olvasottnak jelöl"
mark_unread: "Olvasatlannak jelöl"
people:
+ edit_my_profile: "Adatlapom szerkesztése"
+ mention: "Említés"
+ message: "Üzenet"
not_found: "és nem találni senkit..."
+ stop_ignoring: "Mellőzés megszüntetése"
photo_uploader:
completed: "<%= file %> feltöltve"
empty: "{file} üres, kérlek válassz képeket újra, mellőzve a jelenlegit."
@@ -92,6 +102,18 @@ hu:
result: "Eredmény"
show_result: "Eredmény mutatása"
vote: "Szavazás"
+ profile:
+ add_some: "adj meg néhányat"
+ bio: "személyes"
+ born: "születésnap"
+ contacts: "ismerősök"
+ edit: "szerkesztés"
+ gender: "nem"
+ ignoring: "<%= name %> minden hozzászólását mellőzöd"
+ location: "lakóhely"
+ photos: "képek"
+ posts: "bejegyzések"
+ you_have_no_tags: "nincsenek címkéid!"
publisher:
add_option: "Válasz hozzáadása"
at_least_one_aspect: "Legalább egy csoporttal meg kell osztanod!"
diff --git a/config/locales/javascript/javascript.hy.yml b/config/locales/javascript/javascript.hy.yml
index 65e496c3b..b02a67fbe 100644
--- a/config/locales/javascript/javascript.hy.yml
+++ b/config/locales/javascript/javascript.hy.yml
@@ -6,28 +6,54 @@
hy:
javascripts:
+ and: "և"
aspect_dropdown:
add_to_aspect: "Ավելացնել"
all_aspects: "Բոլոր խմբերը"
error: "Չի ստացվում կիսվել <%= name %>-ի հետ։ Արհամարհու՞մ ես նրանց։"
- select_aspects: "Ընտրիր խմբերը"
+ error_remove: "Չստացվեց ջնջել <%= name %>֊ին քո խմբերից ։Չ"
+ mobile_row_checked: "<%= name %> (ջնջել)"
+ mobile_row_unchecked: "<%= name %> (ավելացնել)"
+ select_aspects: "Ընտրել խմբերը"
started_sharing_with: "Սկսեցիր կիսվել <%= name %>-ի հետ։"
stopped_sharing_with: "Դու այլևս չես կիսվում <%= name %>-ի հետ։"
toggle:
one: "<%= count %> խմբում"
other: "<%= count %> խմբերում"
- zero: "Ընտրիր խմբերը"
+ zero: "Ընտրել խմբերը"
+ updating: "թարմացվում է․․․"
aspect_navigation:
+ add_an_aspect: "+ Խումբ ավելացնել"
deselect_all: "Ապանշել ամբողջը"
no_aspects: "Ոչ մի խումբ ընտրված չէ"
select_all: "Նշել ամբողջը"
+ bookmarklet:
+ post_something: "Գրառել Դիասպորայում"
+ post_submit: "Գրառվում է"
+ post_success: "Գրառվե՜ց։ փակում եմ պատուհանը։"
+ comma: ","
comments:
hide: "թաքցնել մեկնաբանությունները"
+ no_comments: "Մեկնաբանություններ դեռ չկան։"
show: "ցույց տալ բոլոր մեկնաբանությունները"
confirm_dialog: "Համոզվա՞ծ ես"
+ confirm_unload: "Հաստատիր, որ ուզում ես լքել այս էջը․ քո մուտքագրած տվյալները չեն պահպանվի։"
+ contacts:
+ add_contact: "Ընկեր ավելացնել"
+ aspect_list_is_not_visible: "Այս խմբի մարդիկ չեն կարող տեսնել միմյանց։"
+ aspect_list_is_visible: "Այս խմբի մարդիկ կարող են տեսնել իրար։"
+ error_add: "Չստացվեց <%= name %>ին ավելացնել խմբում։ Ափսո՜ս։"
+ error_remove: "Չստացվեց հեռացնել <%= name %>ին խմբից։ Ստիպված ես էլի դիմանալ։ ։Չ"
+ remove_contact: "Ջնջել ընկերոջը"
+ search_no_results: "Ոչ մեկ չգտնվեց"
+ conversation:
+ participants: "Մասնակիցներ"
delete: "Ջնջել"
+ edit: "Փոփոխել"
failed_to_like: "Չհաջողվեց հավանել"
failed_to_post_message: "Չհաջողվեց գրառում կատարել"
+ failed_to_remove: "Չստացվեց ջնջել մուտքագրածը։"
+ failed_to_reshare: "Չստացվեց տարածել"
getting_started:
alright_ill_wait: "Լավ, ես կսպասեմ։"
hey: "Հե՜յ, <%= name %>։"
@@ -37,38 +63,102 @@ hy:
admin: "Ադմին"
close: "թաքցնել"
contacts: "Կոնտակտներ"
+ conversations: "Զրույցներ"
+ help: "Օգնություն"
home: "Գլխավոր էջ"
log_out: "Ելք"
mark_all_as_read: "Նշել ամբողջը որպես ընթերցված"
notifications: "Ծանուցումներ"
profile: "Անձնական էջ"
- recent_notifications: "Վերջին ծանուցումներ"
+ recent_notifications: "Վերջին ծանուցումները"
search: "Որոնում"
settings: "Կարգավորումներ"
view_all: "Ցույցադրել ամբողջը"
+ hide_post: "Թաքցնե՞լ այս գրառումը։"
+ hide_post_failed: "Չստացվեց թաքցնել գրառումը"
ignore: "Արհամարհել"
+ ignore_failed: "Հնարավոր չեղավ արհամարհել այս մարդուն"
ignore_user: "Արհամարհե՞լ այս օգտատիրոջը։"
infinite_scroll:
no_more: "Գրառումներ էլ չկան։"
+ no_more_contacts: "Էլ ընկերներ չկան։"
my_activity: "Իմ գործունեությունը"
+ my_aspects: "Իմ խմբերը"
my_stream: "Լրահոս"
+ no_results: "Արդյունքներ չգտնվեցին։"
+ notifications:
+ mark_read: "Նշել որպես նայած"
+ mark_unread: "Նշել որպես չընթերցված"
people:
+ edit_my_profile: "Խմբագրել իմ էջը"
+ helper:
+ is_not_sharing: "<%= name %>ը քո հետ չի կիսվում"
+ is_sharing: "ո՜ւռա, <%= name %>ը կիսվում է քո հետ"
+ mention: "Նշել"
+ message: "Հաղորդագրություն"
not_found: "և ոչ ոք չգտնվեց..."
+ stop_ignoring: "Դադարել արհամարհել"
photo_uploader:
+ completed: "<%= file %> ավարտված է"
+ empty: "{file} նիշքը(file) դատարկ է։ Կրկին ընտրի՛ր նիշքերը առանց դրա։"
+ error: "Խնդիրներ առաջացան <%= file %> նիշքը վերբեռնելու ժամանակ"
+ invalid_ext: "{file}֊ը անհամապատասխան ընդլայնման է։ Միայն {extensions} են թույլատրվում։"
looking_good: "Օ՜, աստվածներ, հիանալի տեսք ունես։"
+ size_error: "{file}-ը չափից դուրս մեծ է, առավելագույն չափն է՝ {sizeLimit}։"
+ poll:
+ close_result: "Թաքցնել արդյունքը"
+ count:
+ one: "առայժմ 1 ձայն"
+ other: "առայժմ <%=count%> ձայն"
+ go_to_original_post: "Դու կարող ես մասնակցել հարցմանը <%= original_post_link %>֊ում։"
+ original_post: "բնօրինակ գրառում"
+ result: "Արդյունքները"
+ show_result: "Ցուցադրել արդյունքը"
+ vote: "Քվեարկել"
+ profile:
+ add_some: "Մի քանի հատ դնե՞լ"
+ bio: "Մասին"
+ born: "Ծննդյան ամսաթիվ"
+ contacts: "Ընկերներ"
+ edit: "Փոփոխել"
+ gender: "Սեռ"
+ ignoring: "Դու արհամարհում ես <%= name %>֊ի բոլոր գրառումները։"
+ location: "Տեղակայություն"
+ photos: "Նկարներ"
+ posts: "Գրառումներ"
+ you_have_no_tags: "Ոչ մի պիտակ չունես։"
publisher:
+ add_option: "Պատասխան ավելացնել"
at_least_one_aspect: "Գրառումդ պետք է տեսանելի լինի առնվազն մեկ խմբի։"
limited: "Սահմանափակ. սա նշանակում է, որ գրառումդ տեսանելի է լինելու միայն այն մարդկանց, ում հետ կիսվում ես։"
+ near_from: "Գրառված է <%= location %>֊ից։"
+ option: "Պատասխան"
public: "Հրապարակային. սա նշանակում է, որ գրառումդ տեսանելի է լինելու բոլորին և հասանելի կլինի փնտրող համակարգերի համար։"
+ question: "Հարց"
+ remove_post: "Ջնջե՞լ այս գրառումը։"
+ report:
+ name: "Բողոքել"
+ prompt: "Խնդրում ենք մուտքագրել պատճառը․"
+ prompt_default: "օրինակ՝ վիրավորական բովանդակություն"
+ status:
+ created: "Բողոքը հաջողությամբ ստեղծվեց"
+ exists: "Բողոքը արդեն ստեղծված է"
reshares:
duplicate: "Էդքան լա՞վն ա... Արդեն տարածել ես սա։"
- post: "Տարածե՞լ <%= name %>-ի գրառումը։"
+ post: "Տարածե՞լ <%= name %>ի գրառումը։"
successful: "Այս գրառումը հաջողությամբ տարածվեց։"
search_for: "Փնտրել <%= name %>"
show_more: "ցույց տալ ավելին"
stream:
comment: "Մեկնաբանել"
+ disable_post_notifications: "Չստանալ ծանուցումներ այս գրառումից"
+ enable_post_notifications: "Ծանուցումներ ստանալ այս գրառումից"
follow: "Հետևել"
+ followed_tag:
+ add_a_tag: "Պիտակ ավելացնել"
+ contacts_title: "Այս պիտակներով խորացած մարդիկ"
+ follow: "Հետևել"
+ title: "#Հետևվող պիտակներ"
hide: "Թաքցնել"
hide_nsfw_posts: "Թաքցնել #քըխ գրառումները"
like: "Հավանել"
@@ -90,8 +180,13 @@ hy:
zero: "Ոչ ոք չի տարածել"
show_nsfw_post: "Ցուցադրել գրառումը"
show_nsfw_posts: "Ցուցադրել ամբողջը"
+ tags:
+ follow: "Հետևել #<%= tag %>ին"
+ following: "Հետևում ես #<%= tag %>ին"
+ stop_following: "Դադարել հետևել #<%= tag %>ին"
unfollow: "Չհետևել"
unlike: "Ապահավանել"
+ via: "<%= provider %>֊ի միջոցով"
tags:
wasnt_that_interesting: "Լավ, ենթադրում եմ, որ #<%= tagName %>-ը էդքան էլ հետքրքիր չէր..."
timeago:
@@ -108,8 +203,10 @@ hy:
seconds: "վայրկյաններ"
suffixAgo: "առաջ"
suffixFromNow: "հիմիկվանից սկսած"
+ wordSeparator: " "
year: "մոտ մեկ տարի"
years: "%d տարի"
+ unblock_failed: "Չստացվեց ապարգելափակել այս օգտատիրոջը"
videos:
unknown: "Տեսահոլովակի անհայտ տեսակ։"
watch: "Դիտել այս տեսահոլովակը <%= provider %> կայքում"
diff --git a/config/locales/javascript/javascript.ia.yml b/config/locales/javascript/javascript.ia.yml
index 34a0b17d5..fb300c89e 100644
--- a/config/locales/javascript/javascript.ia.yml
+++ b/config/locales/javascript/javascript.ia.yml
@@ -20,17 +20,31 @@ ia:
deselect_all: "Deseliger totes"
no_aspects: "Nulle aspecto seligite"
select_all: "Seliger totes"
+ bookmarklet:
+ post_something: "Inviar a diaspora*"
+ post_submit: "Submitte entrata…"
+ post_success: "Inviate! Le fenestra se claude ora…"
comma: ","
comments:
hide: "celar commentos"
+ no_comments: "Il non ha ancora commentos."
show: "revelar tote le commentos"
confirm_dialog: "Es tu secur?"
+ contacts:
+ add_contact: "Adder contacto"
+ 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."
+ error_remove: "Non poteva remover <%= name %> del aspecto."
+ remove_contact: "Remover contacto"
+ search_no_results: "Nulle contacto trovate"
conversation:
participants: "Participantes"
delete: "Deler"
edit: "Modificar"
failed_to_like: "Appreciation fallite!"
failed_to_post_message: "Publication del entrata fallite!"
+ failed_to_remove: "Le remotion del entrata ha fallite."
getting_started:
alright_ill_wait: "Ben, io attendera."
hey: "Hallo, <%= name %>!"
@@ -40,6 +54,8 @@ ia:
admin: "Administration"
close: "clauder"
contacts: "Contactos"
+ conversations: "Conversationes"
+ help: "Adjuta"
home: "Initio"
log_out: "Clauder session"
mark_all_as_read: "Marcar totes como legite"
@@ -49,7 +65,10 @@ ia:
search: "Cercar"
settings: "Configuration"
view_all: "Vider totes"
+ hide_post: "Celar iste entrata?"
+ hide_post_failed: "Impossibile celar ite entrata"
ignore: "Ignorar"
+ ignore_failed: "Impossibile ignorar iste usator"
ignore_user: "Ignorar iste usator?"
infinite_scroll:
no_more: "Nulle messages restante."
@@ -57,19 +76,64 @@ ia:
my_activity: "Mi activitate"
my_aspects: "Mi aspectos"
my_stream: "Fluxo"
+ no_results: "Nulle resultato trovate"
+ notifications:
+ mark_read: "Marcar como legite"
+ mark_unread: "Marcar como non legite"
people:
+ edit_my_profile: "Modificar mi profilo"
+ helper:
+ is_not_sharing: "<%= name %> non divide cosas con te"
+ is_sharing: "<%= name %> divide cosas con te"
+ mention: "Mention"
+ message: "Message"
not_found: "e nemo ha essite trovate..."
+ stop_ignoring: "Cessar de ignorar"
photo_uploader:
completed: "<%= file %> complete"
empty: "{file} es vacue. Per favor re-selige le files sin iste."
+ error: "Un problema ha occurrite durante le incargamento del file <%= file %>"
invalid_ext: "{file} ha un extension inadmissibile. Solmente {extensions} es permittite."
looking_good: "Oh, tu pare splendide!"
size_error: "{file} es troppo grande. Le dimension maxime es {sizeLimit}."
+ poll:
+ close_result: "Celar resultato"
+ count:
+ one: "1 voto usque ora"
+ other: "<%=count%> votos usque ora"
+ go_to_original_post: "Tu pote participar a iste sondage in le <%= original_post_link %>."
+ original_post: "entrata original"
+ result: "Resultato"
+ show_result: "Monstrar resultato"
+ vote: "Votar"
+ profile:
+ add_some: "adder alcunes"
+ bio: "Bio"
+ born: "Data de nascentia"
+ contacts: "Contactos"
+ edit: "modificar"
+ gender: "Sexo"
+ ignoring: "Tu ignora tote le entratas de <%= name %>."
+ location: "Loco"
+ photos: "Photos"
+ posts: "Entratas"
+ you_have_no_tags: "tu non ha etiquettas!"
publisher:
+ add_option: "Adder un responsa"
at_least_one_aspect: "Le publication debe esser includite in al minus un aspecto"
limited: "Limitate: le message es visibile solmente pro le personas con qui tu lo divide"
- near_from: "Vicinitate de: <%= location %>"
+ 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"
+ 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 %>?"
@@ -78,6 +142,8 @@ ia:
show_more: "monstrar plus"
stream:
comment: "Commentar"
+ disable_post_notifications: "Disactivar le notificationes pro iste entrata"
+ enable_post_notifications: "Activar le notificationes pro iste entrata"
follow: "Sequer"
followed_tag:
add_a_tag: "Adder un etiquetta"
@@ -99,6 +165,7 @@ ia:
stop_following: "Cessar de sequer #<%= tag %>"
unfollow: "Non plus sequer"
unlike: "Non plus appreciar"
+ via: "via <%= provider %>"
tags:
wasnt_that_interesting: "OK, io suppone que #<%= tagName %> non es si interessante..."
timeago:
@@ -115,8 +182,10 @@ ia:
seconds: "minus de un minuta"
suffixAgo: "retro"
suffixFromNow: "ab ora"
+ wordSeparator: " "
year: "circa un anno"
years: "%d annos"
+ unblock_failed: "Le action de disblocar iste usator ha fallite"
videos:
unknown: "Typo de video incognite"
watch: "Spectar iste video sur <%= provider %>"
diff --git a/config/locales/javascript/javascript.is.yml b/config/locales/javascript/javascript.is.yml
index ee4925ee7..7513baf90 100644
--- a/config/locales/javascript/javascript.is.yml
+++ b/config/locales/javascript/javascript.is.yml
@@ -85,7 +85,7 @@ is:
post: "Deila áfram skeyti frá <%= name %>?"
successful: "Tókst að deila þessu skeyti áfram!"
search_for: "Search for <%= name %>"
- show_more: "birta fleirri"
+ show_more: "sýna meira"
stream:
comment: "Athugasemd"
follow: "Fyljgast með"
diff --git a/config/locales/javascript/javascript.kk.yml b/config/locales/javascript/javascript.kk.yml
new file mode 100644
index 000000000..d1704176c
--- /dev/null
+++ b/config/locales/javascript/javascript.kk.yml
@@ -0,0 +1,17 @@
+# Copyright (c) 2010-2013, Diaspora Inc. This file is
+# licensed under the Affero General Public License version 3 or later. See
+# the COPYRIGHT file.
+
+
+
+kk:
+ javascripts:
+ aspect_dropdown:
+ mobile_row_checked: "<%= name %> (жою)"
+ mobile_row_unchecked: "<%= name %>(үстеу)"
+ updating: "жаңала..."
+ timeago:
+ prefixAgo: ""
+ prefixFromNow: ""
+ suffixAgo: ""
+ suffixFromNow: "" \ No newline at end of file
diff --git a/config/locales/javascript/javascript.ms.yml b/config/locales/javascript/javascript.ms.yml
index babb93f1e..4296e2dbb 100644
--- a/config/locales/javascript/javascript.ms.yml
+++ b/config/locales/javascript/javascript.ms.yml
@@ -6,10 +6,12 @@
ms:
javascripts:
+ and: "dan"
aspect_dropdown:
add_to_aspect: "Tambah kenalan"
all_aspects: "Semua aspek"
error: "Tidak dapat berkongsi dengan <%= name %>. Adakah anda mengabaikan mereka?"
+ error_remove: "Tidak dapat mengeluarkan <%= name %> daripada aspek :("
select_aspects: "Pilih kenalan"
started_sharing_with: "Anda telah mula berkongsi dengan <%= name %>!"
stopped_sharing_with: "Anda telah berhenti berkongsi dengan <%= name %>."
@@ -17,35 +19,117 @@ ms:
other: "dalam <%= count %> aspek"
zero: "Pilih aspek"
aspect_navigation:
+ add_an_aspect: "+ Tambah sebuah aspek"
deselect_all: "menyahpilih semua"
no_aspects: "Tiada aspek yang dipilih"
select_all: "Pilih semua"
+ bookmarklet:
+ post_something: "Pos kepada diaspora*"
+ post_submit: "Menghantar pos..."
+ post_success: "Disiarkan! Menutup tetingkap popup..."
+ comma: ","
comments:
hide: "sembunyi komen"
+ no_comments: "Tiada komen lagi."
show: "tunjuk semua komen"
confirm_dialog: "Anda pasti?"
+ confirm_unload: "Sila sahkan bahawa anda mahu meninggalkan halaman ini - data yang telah anda masukkan tidak akan disimpan."
+ contacts:
+ add_contact: "Tambah kenalan"
+ aspect_list_is_not_visible: "Kenalan dalam aspek ini tidak dapat melihat satu sama lain."
+ aspect_list_is_visible: "Kenalan dalam aspek ini dapat melihat satu sama lain."
+ error_add: "Tidak dapat menambah <%= name %> kepada aspek :("
+ error_remove: "Tidak dapat membuang <%= name %> dari aspek :("
+ remove_contact: "Buang kenalan"
+ conversation:
+ participants: "Peserta"
+ edit: "Edit"
failed_to_like: "Gagal untuk suka!"
failed_to_post_message: "Gagal untuk pos mesej!"
+ failed_to_remove: "Gagal membuang catatan!"
getting_started:
alright_ill_wait: "Baiklah, saya akan tunggu."
hey: "Hei, <%= name %>!"
no_tags: "Hei, anda tidak mengikuti mana-mana tag! Teruskan juga?"
preparing_your_stream: "Menyediakan strim peribadi anda..."
header:
+ close: "tutup"
+ conversations: "Perbualan"
+ help: "Bantuan"
search: "Find people or #tags"
+ ignore_failed: "Tidak boleh mengabaikan pengguna ini"
+ ignore_user: "Abaikan pengguna ini?"
infinite_scroll:
no_more: "Tiada lagi pos."
+ no_more_contacts: "Tiada lagi kenalan."
+ my_aspects: "Aspek-aspek saya"
+ no_results: "Tiada Hasil Dijumpai"
+ notifications:
+ mark_read: "Tanda sudah dibaca"
+ mark_unread: "Tanda belum dibaca"
+ people:
+ edit_my_profile: "Edit profil saya"
+ helper:
+ is_not_sharing: "<%= name %> tidak berkongsi dengan anda"
+ is_sharing: "<%= name %> berkongsi dengan anda"
+ message: "Mesej"
+ not_found: "...dan tiada orang yang dijumpai."
+ stop_ignoring: "Berhenti mengabaikan"
photo_uploader:
+ completed: "<%= file %> siap"
+ empty: "{file} kosong, sila pilih fail sekali lagi tanpa ia."
+ error: "Berlaku masalah semasa memuat naik fail <%= file %>"
+ invalid_ext: "{file} mempunyai sambungan tidak sah. Hanya {extensions} dibenarkan."
looking_good: "Wah, anda nampak hebat! \n"
+ size_error: "{file} terlalu besar, saiz fail maksimum adalah {sizeLimit}"
+ poll:
+ close_result: "Sembunyikan keputusan"
+ count:
+ other: |-
+ 1 undi setakat ini
+
+ <%=count%> undian setakat ini
+ result: "Keputusan"
+ show_result: "Paparkan keputusan"
+ vote: "Undi"
+ profile:
+ add_some: "tambah beberapa"
+ born: "Hari Lahir"
+ contacts: "Kenalan-kenalan"
+ edit: "edit"
+ gender: "Jantina"
+ ignoring: "Anda mengabaikan semua siaran daripada <%= name %>."
+ location: "Lokasi"
+ photos: "Gambar"
+ posts: "Catatan"
+ you_have_no_tags: "anda tidak mempunyai tag!"
publisher:
+ add_option: "Tambah jawapan"
at_least_one_aspect: "Anda perlu menerbitkan sekurang-kurangnya satu aspek"
limited: "Terhad - catatan anda hanya akan dilihat oleh orang-orang yang berkongsi dengan anda"
+ near_from: "Dicatatkan dari: <%= location %>"
+ option: "Jawapan"
public: "Awam - Pos anda akan dilihat oleh semua orang dan dijumpai oleh enjin carian"
+ question: "Soalan"
+ report:
+ name: "Lapor"
+ prompt: "Sila sertakan sebab:"
+ prompt_default: "kandungan yang menyinggung"
+ status:
+ 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!"
search_for: "Mencari <%= name %>"
show_more: "tunjuk lagi"
stream:
+ followed_tag:
+ add_a_tag: "Tambah sebuah tag"
+ contacts_title: "Orang yang meminati tag ini"
+ follow: "Ikuti"
+ title: "Tag #Diikuti"
likes:
few: "<%= count %> Likes"
many: "<%= count %> Likes"
@@ -67,6 +151,11 @@ ms:
other: "<%= count %> Reshares"
two: "<%= count %> Reshares"
zero: "<%= count %> Reshares"
+ tags:
+ follow: "Ikuti #<%= tag %>"
+ following: "Mengikuti #<%= tag %>"
+ stop_following: "Berhenti Mengikuti #<%= tag %>"
+ via: "melalui <%= provider %>"
tags:
wasnt_that_interesting: "OK, saya mengandaikan #<%= tagName %> tidak semua yang menarik..."
timeago:
@@ -85,6 +174,7 @@ ms:
suffixFromNow: "dari sekarang"
year: "kira-kira setahun"
years: "%d tahun"
+ unblock_failed: "Membuang sekatan pada pengguna ini telah gagal"
videos:
unknown: "Jenis video tidak diketahui"
watch: "Tonton video ini di <%= provider %>" \ No newline at end of file
diff --git a/config/locales/javascript/javascript.nds.yml b/config/locales/javascript/javascript.nds.yml
new file mode 100644
index 000000000..08c869962
--- /dev/null
+++ b/config/locales/javascript/javascript.nds.yml
@@ -0,0 +1,141 @@
+# Copyright (c) 2010-2013, Diaspora Inc. This file is
+# licensed under the Affero General Public License version 3 or later. See
+# the COPYRIGHT file.
+
+
+
+nds:
+ javascripts:
+ and: "un"
+ aspect_dropdown:
+ add_to_aspect: "Kontakt sluten"
+ all_aspects: "Alle Aspekte"
+ toggle:
+ one: "In een Aspekt"
+ other: "In <%= count %> Aspekte"
+ zero: "Aspekte utwählen"
+ aspect_navigation:
+ add_an_aspect: "+ Do een nee’en Aspekt dorto"
+ deselect_all: "Alle afwählen"
+ no_aspects: "Keene Aspekte utwählt"
+ select_all: "Alle utwählen"
+ bookmarklet:
+ post_something: "Schriev wat in diaspora*"
+ post_submit: "Schick Bidrag af..."
+ post_success: "Verfat! Mok Pop-Up-Fenster to..."
+ comma: ","
+ comments:
+ hide: "Kommentore versteken"
+ no_comments: "Dat gift noch keene Kommentore."
+ show: "Alle Kommentore anzeigen"
+ confirm_dialog: "Bist du seker?"
+ contacts:
+ add_contact: "Kontakt sluten"
+ aspect_list_is_not_visible: "Kontakte in dissen Aspekt künnt sick nich gegensiedich seihn."
+ aspect_list_is_visible: "Kontakte in dissen Aspekt künnt sick gegensiedich seihn."
+ error_add: "Kunn <%= name %> nich ton Aspekt dortodoon :("
+ error_remove: "Kunn <%= name %> nich ut den Aspekt wegmoken :("
+ remove_contact: "Kontakt wegmoken"
+ conversation:
+ participants: "Bedeeligte"
+ delete: "Löschen"
+ edit: "Ännern"
+ failed_to_remove: "Kunn denn Indrag nich wegmoken!"
+ getting_started:
+ hey: "He, <%= name %>!"
+ header:
+ admin: "Admin"
+ close: "sluten"
+ contacts: "Kontakte"
+ conversations: "Snacks"
+ help: "Hülp"
+ home: "Startsiet"
+ log_out: "Afmellen"
+ notifications: "Benarichtigungen"
+ profile: "Profil"
+ search: "Söken"
+ settings: "Instellungen"
+ ignore: "Ignoreren"
+ ignore_failed: "Kunn dissen Benutter nich ignoreren"
+ ignore_user: "Dissen Benutter ignoreren?"
+ infinite_scroll:
+ no_more: "Keene Bidräg mehr."
+ no_more_contacts: "Keene annern Kontakte."
+ my_aspects: "Miene Aspekte"
+ my_stream: "Stream"
+ no_results: "Keene Resultate funnen"
+ notifications:
+ mark_read: "As lesen markeren"
+ mark_unread: "As unlesen markeren"
+ people:
+ edit_my_profile: "Mien Profil ännern"
+ message: "Naricht"
+ not_found: "un keener is funnen worrn..."
+ stop_ignoring: "Nich mehr ignoreren"
+ photo_uploader:
+ error: "Dat geev een Problem bin hoochladen von de Datei <%= file %>"
+ looking_good: "OMG, du sühst toll ut!"
+ poll:
+ close_result: "Resultat versteken"
+ count:
+ one: "Een Stimm bit nu"
+ other: "<%=count%> Stimmen bit nu"
+ result: "Resultat"
+ show_result: "Resultat zeigen"
+ vote: "Afstimmen"
+ profile:
+ born: "Geburtsdag"
+ contacts: "Kontakte"
+ edit: "ännern"
+ gender: "Geschlecht"
+ ignoring: "Du ignoreerst alle Bidräg von <%= name %>."
+ photos: "Biller"
+ posts: "Bidräg"
+ publisher:
+ add_option: "Do eene Antwort dorto"
+ near_from: "Verfat von: <%= location %>"
+ option: "Antwort"
+ question: "Froog"
+ report:
+ prompt: "Bidde geev een Grund an:"
+ reshares:
+ post: "<%= name %>s Bidrag wiederseggen?"
+ successful: "De Bidrag is erfolgriek wiederseggt worrn!"
+ show_more: "mehr anzeigen"
+ stream:
+ comment: "Kommentor"
+ follow: "Folgen"
+ hide: "Versteken"
+ hide_nsfw_posts: "#nsfw-Bidräg versteken"
+ likes:
+ one: "Eener mag dat"
+ other: "<%= count %> Lüü mögt dat"
+ zero: "Keener mag dat"
+ more_comments:
+ one: "Zeig een annern Kommentor"
+ other: "Zeig <%= count %> annere Kommentore"
+ zero: "Zeig keene annern Kommentore"
+ original_post_deleted: "Originalbidrag von den Autor löscht."
+ public: "Opentlich"
+ reshares:
+ one: "Een mol wiederseggt"
+ other: "<%= count %> mol wiederseggt"
+ zero: "Keen mol wiederseggt"
+ show_nsfw_post: "Bidrag anzeigen"
+ show_nsfw_posts: "Alle anzeigen"
+ unfollow: "Nich mehr folgen"
+ via: "öber <%= provider %>"
+ timeago:
+ day: "een Dag"
+ days: "%d Doog"
+ minutes: "%d Minuten"
+ months: "%d Monate"
+ prefixAgo: ""
+ prefixFromNow: ""
+ seconds: "weniger as eene Minute"
+ suffixAgo: ""
+ suffixFromNow: ""
+ wordSeparator: " "
+ years: "%d Johre"
+ viewer:
+ home: "STARTSIET" \ No newline at end of file
diff --git a/config/locales/javascript/javascript.nl.yml b/config/locales/javascript/javascript.nl.yml
index 2fc08d596..ccb3556c9 100644
--- a/config/locales/javascript/javascript.nl.yml
+++ b/config/locales/javascript/javascript.nl.yml
@@ -10,8 +10,10 @@ nl:
aspect_dropdown:
add_to_aspect: "Voeg contact toe"
all_aspects: "Alle aspecten"
- error: "Je kan niet delen met <%= name %>. Negeer je hem?"
+ error: "Je kan niet delen met <%= name %>. Negeer je hen?"
error_remove: "Kon <%= name %> niet uit het aspect verwijderen :("
+ mobile_row_checked: "<%= name %> (verwijderen)"
+ mobile_row_unchecked: "<%= name %> (toevoegen)"
select_aspects: "Selecteer aspecten"
started_sharing_with: "Je deelt nu met <%= name %>!"
stopped_sharing_with: "Je deelt niet meer met <%= name %>."
@@ -22,6 +24,7 @@ nl:
other: "In <%= count %> aspecten"
two: "In <%= count %> aspecten"
zero: "Aspecten selecteren"
+ updating: "bijwerken..."
aspect_navigation:
add_an_aspect: "+ Toevoegen aspect"
deselect_all: "Alles deselecteren"
@@ -33,10 +36,19 @@ nl:
post_success: "Geplaatst! Sluit nu pop-up venster..."
comma: ","
comments:
- hide: "verberg reacties"
+ hide: "Verberg reacties"
no_comments: "Er zijn nog geen reacties."
- show: "laat reacties zien"
+ show: "Laat reacties zien"
confirm_dialog: "Weet je het zeker?"
+ confirm_unload: "Bevestig dat je deze pagina wilt verlaten - gegevens die je hebt ingevoerd, worden niet bewaard."
+ contacts:
+ add_contact: "Toevoegen contact"
+ aspect_list_is_not_visible: "Contactpersonen in dit aspect kunnen elkaar niet zien."
+ aspect_list_is_visible: "Contactpersonen in dit aspect kunnen elkaar zien."
+ error_add: "Kon <%= name %> niet toevoegen aan het aspect :("
+ error_remove: "Kon <%= name %> niet verwijderen uit het aspect :("
+ remove_contact: "Verwijder contact"
+ search_no_results: "geen contactpersonen gevonden"
conversation:
participants: "Deelnemers"
delete: "Verwijder"
@@ -44,6 +56,7 @@ nl:
failed_to_like: "Leuk vinden mislukt!"
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 %>!"
@@ -51,7 +64,7 @@ nl:
preparing_your_stream: "Je gepersonaliseerde stream klaarmaken..."
header:
admin: "Beheer"
- close: "sluit"
+ close: "Sluiten"
contacts: "Contacten"
conversations: "Conversaties"
help: "Help"
@@ -60,10 +73,12 @@ nl:
mark_all_as_read: "Markeer alles gelezen"
notifications: "Notificaties"
profile: "Profiel"
- recent_notifications: "Recente Notificaties"
+ recent_notifications: "Recente meldingen"
search: "Zoek"
settings: "Instellingen"
view_all: "Bekijk alle"
+ hide_post: "Dit bericht verbergen?"
+ hide_post_failed: "Kon bericht niet verbergen"
ignore: "Negeer"
ignore_failed: "Kan deze gebruiker niet negeren"
ignore_user: "Wilt u deze gebruiker negeren?"
@@ -73,11 +88,19 @@ nl:
my_activity: "Mijn activiteit"
my_aspects: "Mijn aspecten"
my_stream: "Stream"
+ no_results: "Geen zoekresultaten"
notifications:
mark_read: "Markeren als gelezen"
mark_unread: "Markeren als ongelezen"
people:
- not_found: "en niemand is gevonden..."
+ edit_my_profile: "Bewerk mijn profiel"
+ helper:
+ is_not_sharing: "<%= name %> deelt niet met jou"
+ is_sharing: "<%= name %> deelt met jou"
+ mention: "Vermelden"
+ message: "Bericht"
+ not_found: "... en er niemand gevonden"
+ stop_ignoring: "Stop negeren"
photo_uploader:
completed: "<%= file %> gereed"
empty: "{file} is leeg. Selecteer de bestanden opnieuw, zonder deze."
@@ -90,32 +113,49 @@ nl:
count:
one: "1 stem tot dit moment"
other: "<%=count%> stemmen tot dit moment"
+ go_to_original_post: "Je kunt deelnemen aan deze peiling over <%= original_post_link %>"
+ original_post: "origineel bericht"
result: "Resultaat"
show_result: "Toon resultaat"
vote: "Stem"
+ profile:
+ add_some: "Voeg wat toe"
+ bio: "Bio"
+ born: "Verjaardag"
+ contacts: "Contacten"
+ edit: "Bewerken"
+ gender: "Geslacht"
+ ignoring: "Je negeert alle berichten van <%= name %>"
+ location: "Locatie"
+ photos: "Foto's"
+ posts: "Berichten"
+ you_have_no_tags: "Je hebt geen tags!"
publisher:
add_option: "Keuzemogelijkheid toevoegen"
at_least_one_aspect: "Je moet op zijn minst één aspect publiceren"
- limited: "Gelimiteerd - je post is alleen zichtbaar voor de mensen waarmee je hem deelt"
+ limited: "Gelimiteerd - je bericht is alleen zichtbaar voor de mensen waarmee je hem deelt"
near_from: "Geplaatst vanaf: <%= location %>"
option: "Keuze <%= nr %>"
- public: "Openbaar - je post is zichtbaar voor iedereen en kan gevonden worden door zoekmachines"
+ public: "Openbaar - je bericht is zichtbaar voor iedereen en kan gevonden worden door zoekmachines"
question: "Vraag"
+ remove_post: "Dit bericht verwijderen?"
report:
name: "Melding"
prompt: "Geef de reden op:"
- prompt_default: "aanstootgevende inhoud"
+ prompt_default: "b.v. aanstootgevende inhoud"
status:
created: "Het is succesvol gemeld"
exists: "De melding bestaat al"
reshares:
- duplicate: "Je hebt dit bericht al doorgegeven! Is hij echt zo goed?"
- post: "Deel <%= name %>'s bericht?"
+ duplicate: "Je hebt dit bericht al doorgegeven! Is het echt zo goed?"
+ post: "Doorgeven <%= name %>'s bericht?"
successful: "Het bericht is gedeeld!"
search_for: "Zoek naar <%= name %>"
- show_more: "laat meer zien"
+ show_more: "Laat meer zien"
stream:
comment: "Reageren"
+ disable_post_notifications: "Uitschakelen meldingen voor dit bericht"
+ enable_post_notifications: "Inschakelen meldingen voor dit bericht"
follow: "Volgen"
followed_tag:
add_a_tag: "Voeg een label toe"
@@ -169,13 +209,14 @@ nl:
wordSeparator: " "
year: "ongeveer een jaar"
years: "%d jaar"
+ unblock_failed: "Deblokkeren van deze gebruiker is mislukt"
videos:
unknown: "Onbekend video type"
watch: "Bekijk deze video op <%= provider %>"
viewer:
comment: "Reageren"
follow_post: "Volgen"
- home: "HOME"
+ home: "Home"
like: "Vind ik leuk"
reshare: "Doorgeven"
reshared: "Doorgegeven"
diff --git a/config/locales/javascript/javascript.pl.yml b/config/locales/javascript/javascript.pl.yml
index 316652ccd..32ae4e929 100644
--- a/config/locales/javascript/javascript.pl.yml
+++ b/config/locales/javascript/javascript.pl.yml
@@ -37,6 +37,14 @@ pl:
no_comments: "Póki co nie ma jeszcze żadnych komentarzy."
show: "wyświetl wszystkie komentarze"
confirm_dialog: "Czy @{m,f:jesteś|n:na}{ pew}{m:ien|f:na|n:no}?"
+ confirm_unload: "Potwierdź, że chcesz opuścić tą stronę. Dane, które wprowadziłeś, nie zostaną zapisane."
+ contacts:
+ add_contact: "Dodaj kontakt"
+ aspect_list_is_not_visible: "Kontakty z tego aspektu nie widzą się nawzajem."
+ aspect_list_is_visible: "Kontakty z tego aspektu mogą zobaczyć się nawzajem."
+ error_add: "Nie udało się dodać <%= name %> do aspektu :("
+ error_remove: "Nie udało się usunąć <%= name %> z aspektu :("
+ remove_contact: "Usuń kontakt"
conversation:
participants: "Uczestnicy"
delete: "Usuń"
@@ -65,6 +73,7 @@ pl:
settings: "Ustawienia"
view_all: "Wyświetl wszystko"
ignore: "Ignoruj"
+ ignore_failed: "Nie można zignorować tego użytkownika"
ignore_user: "Zignorować tego użytkownika?"
infinite_scroll:
no_more: "Nie ma więcej wpisów."
@@ -72,11 +81,19 @@ pl:
my_activity: "Moja aktywność"
my_aspects: "Moje aspekty"
my_stream: "Strumień"
+ no_results: "Brak rezultatów"
notifications:
mark_read: "Oznacz jako przeczytane"
mark_unread: "Oznacz jako nieprzeczytane"
people:
+ edit_my_profile: "Edytuj profil"
+ helper:
+ is_not_sharing: "<%= name %> Ci nie udostępnia."
+ is_sharing: "<%= name %> Ci udostępnia."
+ mention: "Wzmianka"
+ message: "Wiadomość"
not_found: "...i nikogo nie odnaleziono."
+ stop_ignoring: "Przestań ignorować"
photo_uploader:
completed: "<%= file %> ukończono"
empty: "{file} jest pusty. Proszę dokonać nowego wyboru bez tego pliku."
@@ -92,15 +109,29 @@ pl:
one: "<%=count%> głos jak do tej pory"
other: "<%=count%> głosów"
zero: "Żaden głos nie został na razie oddany"
+ go_to_original_post: "Możesz oddać głos w tej sondzie pod tym adresem: <%= original_post_link %>"
+ original_post: "oryginalny wpis"
result: "Wynik"
show_result: "Pokaż wynik"
vote: "Zagłosuj"
+ profile:
+ add_some: "dodaj"
+ bio: "Opis"
+ born: "Urodziny"
+ contacts: "Kontakty"
+ edit: "zmień"
+ gender: "Płeć"
+ ignoring: "Ignorujesz wszystkie wpisy od <%= name %>."
+ location: "Miejscowość"
+ photos: "Zdjęcia"
+ posts: "Wpisy"
+ you_have_no_tags: "nie masz tagów!"
publisher:
- add_option: "Dodaj opcję"
+ add_option: "Dodaj odpowiedź"
at_least_one_aspect: "Musisz udostępnić dla co najmniej jednego aspektu"
limited: "Ograniczony - wpis będzie widoczny tylko dla wybranej grupy osób"
near_from: "Blisko <%= location %>"
- option: "Opcja <%= nr %>"
+ option: "Odpowiedź"
public: "Publiczny - wpis będzie widoczny dla wszystkich i można go znaleźć przez wyszukiwarki"
question: "Pytanie"
report:
@@ -177,6 +208,7 @@ pl:
wordSeparator: " "
year: "około roku"
years: "%d lat"
+ unblock_failed: "Nie udało się odblokować tego użytkownika"
videos:
unknown: "Nieznany typ wideo"
watch: "Zobacz ten film na <%= provider %>"
diff --git a/config/locales/javascript/javascript.pt-BR.yml b/config/locales/javascript/javascript.pt-BR.yml
index 50291ca1e..ad8f4d8a0 100644
--- a/config/locales/javascript/javascript.pt-BR.yml
+++ b/config/locales/javascript/javascript.pt-BR.yml
@@ -12,6 +12,8 @@ pt-BR:
all_aspects: "Todos aspectos"
error: "Não foi possível compartilhar com<%= name %>. Deseja ignorar isto?"
error_remove: "Não foi possível remover <%= name %> do aspecto :("
+ mobile_row_checked: "<%= name %> (remover)"
+ mobile_row_unchecked: "<%= name %> (adicionar)"
select_aspects: "Selecione os aspectos"
started_sharing_with: "Você começou a compartilhar com <%= name %>!"
stopped_sharing_with: "Você parou de compartilhar com <%= name %>."
@@ -19,10 +21,11 @@ pt-BR:
one: "Em <%= count %> aspecto"
other: "Em <%= count %> aspectos"
zero: "Selecione aspectos"
+ updating: "atualizando..."
aspect_navigation:
add_an_aspect: "+ Adicionar um aspecto"
deselect_all: "Desmarcar tudo"
- no_aspects: "Sem aspecto selecionado"
+ no_aspects: "Nenhum aspecto selecionado"
select_all: "Marcar tudo"
bookmarklet:
post_something: "Publicar em diaspora*"
@@ -34,6 +37,15 @@ pt-BR:
no_comments: "Ainda não existem comentários."
show: "mostrar todos comentários"
confirm_dialog: "Tem certeza?"
+ confirm_unload: "Por favor, confirme se deseja sair desta página. Os dados que você informou não serão salvos."
+ contacts:
+ add_contact: "Adicionar contato"
+ aspect_list_is_not_visible: "Contatos neste aspecto não podem ver uns aos outros."
+ aspect_list_is_visible: "Contatos neste aspecto podem ver uns aos outros."
+ error_add: "Não foi possível adicionar <%= name %> ao aspecto :("
+ error_remove: "Não foi possível remover <%= name %> do aspecto :("
+ remove_contact: "Remover contato"
+ search_no_results: "Nenhum contato encontrado"
conversation:
participants: "Participantes"
delete: "Apagar"
@@ -41,39 +53,51 @@ pt-BR:
failed_to_like: "Falhou ao curtir!"
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, eu esperarei."
hey: "Ei, <%= name %>!"
no_tags: "Ei, você não está seguindo todas as tags! Continuar assim mesmo?"
preparing_your_stream: "Preparando seu fluxo personalizado..."
header:
- admin: "Administrador"
+ admin: "Administração"
close: "fechar"
contacts: "Contatos"
conversations: "Conversas"
help: "Ajuda"
home: "Páginal Inicial"
log_out: "Sair"
- mark_all_as_read: "Marcar Todas como Lidas"
+ mark_all_as_read: "Marcar todas como lidas"
notifications: "Notificações"
profile: "Perfil"
recent_notifications: "Notificações Recentes"
search: "Encontrar pessoas ou #tags"
settings: "Configurações"
view_all: "Ver todas"
+ hide_post: "esconder esta publicação?"
+ hide_post_failed: "Incapaz de esconder esta publicação"
ignore: "Ignorar"
+ ignore_failed: "Não foi possível ignorar este usuário"
ignore_user: "Ignorar este usuário?"
infinite_scroll:
no_more: "Não há mais publicações."
no_more_contacts: "Sem mais contatos."
- my_activity: "Minhas Atividades"
+ my_activity: "Minha Atividade"
my_aspects: "Meus Aspectos"
my_stream: "Fluxo"
+ no_results: "Nenhum Resultado Encontrado"
notifications:
mark_read: "Marcar como lida"
mark_unread: "Marcar como não lida"
people:
+ edit_my_profile: "Editar meu perfil"
+ helper:
+ is_not_sharing: "<%= name %> não está compartilhando com você"
+ is_sharing: "<%= name %> está compartilhando com você"
+ mention: "Menção"
+ message: "Mensagem"
not_found: "e ninguém foi encontrado..."
+ stop_ignoring: "Parar de ignorar"
photo_uploader:
completed: "<%= file %> completo"
empty: "{file} está vazio, por favor selecione arquivos novamente sem este."
@@ -86,24 +110,39 @@ pt-BR:
count:
one: "<%=count%> voto até agora"
other: "<%=count%> votos até agora"
+ go_to_original_post: "Você pode participar dessa enquete no <%= original_post_link %>."
+ original_post: "Publicação original"
result: "Resultado"
show_result: "Mostrar resultado"
vote: "Votar"
+ profile:
+ add_some: "adicionar alguns"
+ bio: "Apresentação Pessoal"
+ born: "Data de Aniversário"
+ contacts: "Contatos"
+ edit: "editar"
+ gender: "Sexo"
+ ignoring: "Você está ignorando todas as publicações de <%= name %>."
+ location: "Localização"
+ photos: "Fotos"
+ posts: "Publicações"
+ you_have_no_tags: "você não possui tags!"
publisher:
- add_option: "Adicionar opção"
+ add_option: "Adicionar uma resposta"
at_least_one_aspect: "Você deve publicar em pelo menos um aspecto"
limited: "Limitada - a sua publicação será visível apenas para as pessoas com quem você compartilha."
near_from: "Publicado de: <%= location %>"
- option: "Opção <%= nr %>"
+ option: "Resposta"
public: "Pública - a sua publicação será totalmente visível na web e poderá ser encontrada por mecanismos de buscas, como Google, Bing e etc..."
question: "Pergunta"
+ remove_post: "Remover esta publicação?"
report:
- name: "Relatório"
+ name: "Relatar"
prompt: "Por favor entre um motivo:"
prompt_default: "conteúdo ofensivo"
status:
- created: "O relatório foi criado com sucesso"
- exists: "O relatório já existe"
+ 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 %>?"
@@ -112,6 +151,8 @@ pt-BR:
show_more: "mostrar mais"
stream:
comment: "Comentar"
+ disable_post_notifications: "Desativar notificações para esta publicação"
+ enable_post_notifications: "Ativar notificações para esta publicação"
follow: "Seguir"
followed_tag:
add_a_tag: "Adicionar uma tag"
@@ -130,7 +171,7 @@ pt-BR:
one: "Mostre mais <%= count %> comentário"
other: "Mostre mais <%= count %> comentários"
zero: "Mostre mais <%= count %> comentário"
- original_post_deleted: "A publicação original foi deletada pelo autor."
+ original_post_deleted: "A publicação original foi apagada pelo autor."
public: "Público"
reshare: "Recompartilhar"
reshares:
@@ -165,6 +206,7 @@ pt-BR:
wordSeparator: " "
year: "cerca de um ano"
years: "%d anos"
+ unblock_failed: "O desbloqueio deste usuário falhou"
videos:
unknown: "Tipo de vídeo desconhecido"
watch: "Assista este vídeo no <%= provider %>"
diff --git a/config/locales/javascript/javascript.ro.yml b/config/locales/javascript/javascript.ro.yml
index 35003aaba..62e450416 100644
--- a/config/locales/javascript/javascript.ro.yml
+++ b/config/locales/javascript/javascript.ro.yml
@@ -62,6 +62,8 @@ ro:
invalid_ext: "{file} are o extensie invalidă. Doar extensiile {extensions} sunt permise."
looking_good: "WOW, arati super!"
size_error: "{file} este prea mare, mărimea maximă a unui fişier este {sizeLimit}."
+ profile:
+ posts: "Postări"
publisher:
at_least_one_aspect: "Trebuie sa publici pe cel puţin un aspect"
limited: "Limitat - publicatia va fi vazuta doar de catre persoanele cu care imparti publicatii"
diff --git a/config/locales/javascript/javascript.ru.yml b/config/locales/javascript/javascript.ru.yml
index cc6628d87..845e94e15 100644
--- a/config/locales/javascript/javascript.ru.yml
+++ b/config/locales/javascript/javascript.ru.yml
@@ -12,6 +12,8 @@ ru:
all_aspects: "Все аспекты"
error: "Невозможно добавить пользователя <%= name %>. Возможно, вы его заблокировали?"
error_remove: "Невозможно удалить <%= name %> из аспекта :("
+ mobile_row_checked: "<%= name %> (переместить)"
+ mobile_row_unchecked: "<%= name %> (добавить)"
select_aspects: "Выбрать аспекты"
started_sharing_with: "Вы добавили <%= name %>!"
stopped_sharing_with: "Вы удалили <%= name %>."
@@ -22,6 +24,7 @@ ru:
other: "В <%= count %> аспектах"
two: "В <%= count %> аспектах"
zero: "Выбрать аспекты"
+ updating: "обновление..."
aspect_navigation:
add_an_aspect: "+ Добавить аспект"
deselect_all: "Снять выделение"
@@ -37,6 +40,15 @@ ru:
no_comments: "Комментариев ещё нет."
show: "Показать все комментарии"
confirm_dialog: "Вы уверены?"
+ confirm_unload: "Пожалуйста, подтвердите, что хотите покинуть страницу — введённые вами данные не будут сохранены."
+ contacts:
+ add_contact: "Добавить контакт"
+ aspect_list_is_not_visible: "Контакты в этом аспекте не могут видеть друг друга."
+ aspect_list_is_visible: "Контакты в этом аспекте могут видеть друг друга."
+ error_add: "Невозможно добавить <%= name %> в аспект :("
+ error_remove: "Невозможно удалить <%= name %> из аспекта :("
+ remove_contact: "Удалить контакт"
+ search_no_results: "Контакты не найдены"
conversation:
participants: "Участники"
delete: "Удалить"
@@ -44,6 +56,7 @@ ru:
failed_to_like: "Не удалось!"
failed_to_post_message: "Не удалось отправить сообщение!"
failed_to_remove: "Удаление не завершено!"
+ failed_to_reshare: "Не удалось поделиться!"
getting_started:
alright_ill_wait: "Хорошо, я подожду."
hey: "Привет, <%= name %>!"
@@ -64,7 +77,10 @@ ru:
search: "Поиск"
settings: "Настройки"
view_all: "Посмотреть всё"
+ hide_post: "Скрыть эту запись?"
+ hide_post_failed: "Невозможно скрыть запись"
ignore: "Блокировать"
+ ignore_failed: "Невозможно игнорировать этого пользователя"
ignore_user: "Игнорировать этого пользователя?"
infinite_scroll:
no_more: "Больше записей нет."
@@ -72,11 +88,19 @@ ru:
my_activity: "Моя активность"
my_aspects: "Мои аспекты"
my_stream: "Поток"
+ no_results: "Ничего не найдено."
notifications:
mark_read: "Пометить как прочитанное"
mark_unread: "Пометить как непрочитанное"
people:
+ edit_my_profile: "Редактировать профиль"
+ helper:
+ is_not_sharing: "<%= name %> не делится с вами"
+ is_sharing: "<%= name %> делится с вами"
+ mention: "Упоминание"
+ message: "Сообщение"
not_found: "никого не найдено..."
+ stop_ignoring: "Отменить игнорирование"
photo_uploader:
completed: "<%= file %> готово"
empty: "{file} пуст, выберите пожалуйста файл повторно."
@@ -92,9 +116,23 @@ ru:
one: "<%=count%> человек проголосовал"
other: "<%=count%> людей проголосовало"
zero: "Никто ещё не проголосовал"
+ go_to_original_post: "Вы можете принять участие в этом опросе, перейдя к <%= original_post_link %>"
+ original_post: "оригиналу записи"
result: "Результаты"
show_result: "Показать результаты"
vote: "Голосовать"
+ profile:
+ add_some: "добавить"
+ bio: "О себе"
+ born: "Дата рождения"
+ contacts: "Контакты"
+ edit: "Редактировать"
+ gender: "Пол"
+ ignoring: "Вы игнорируете все записи пользователя <%= name %>."
+ location: "Местоположение"
+ photos: "Фотографии"
+ posts: "Записи"
+ you_have_no_tags: "у вас нет меток!"
publisher:
add_option: "Добавить вариант"
at_least_one_aspect: "Вам надо создать как минимум один аспект"
@@ -103,6 +141,7 @@ ru:
option: "Вариант <%= nr %>"
public: "Публичная - ваша запись будет видна всем, включая поисковые системы"
question: "Вопрос"
+ remove_post: "Переместить запись?"
report:
name: "Пожаловаться"
prompt: "Пожалуйста, укажите причину:"
@@ -111,13 +150,15 @@ ru:
created: "Донос успешно отправлен"
exists: "Донос уже отправлен"
reshares:
- duplicate: "Настолько здорово, да? Вы уже поделились этой записью!"
+ duplicate: "Здорово, да? Вы уже поделились этой записью!"
post: "Поделиться записью пользователя <%= name %>?"
successful: "Вы успешно поделились записью!"
search_for: "Искать <%= name %>"
show_more: "показать больше"
stream:
comment: "Комментировать"
+ disable_post_notifications: "Отключить уведомления на эту запись"
+ enable_post_notifications: "Включить уведомления на эту запись"
follow: "Следить"
followed_tag:
add_a_tag: "Добавить метку"
@@ -178,6 +219,7 @@ ru:
wordSeparator: " "
year: "около года"
years: "%d лет"
+ unblock_failed: "Разблокировка пользователя не удалась"
videos:
unknown: "Неизвестный тип видео"
watch: "Смотреть этот ролик на <%= provider %>"
diff --git a/config/locales/javascript/javascript.sk.yml b/config/locales/javascript/javascript.sk.yml
index 756964a8b..8f2547368 100644
--- a/config/locales/javascript/javascript.sk.yml
+++ b/config/locales/javascript/javascript.sk.yml
@@ -99,7 +99,7 @@ sk:
question: "Otázka"
report:
name: "Správa"
- prompt: "Prosím uveďte dôvod:"
+ prompt: "Prosím, uveďte dôvod:"
prompt_default: "urážajúci obsah"
status:
created: "Úspešne si vytvoril(a) správu"
diff --git a/config/locales/javascript/javascript.sv.yml b/config/locales/javascript/javascript.sv.yml
index 2c547d74b..51c6554b2 100644
--- a/config/locales/javascript/javascript.sv.yml
+++ b/config/locales/javascript/javascript.sv.yml
@@ -12,6 +12,8 @@ sv:
all_aspects: "Alla aspekter"
error: "Det går inte att börja dela med <%= name %>. Ignorerar du dem?"
error_remove: "Kunde ej ta bort <%= name %> från aspekten :("
+ mobile_row_checked: "<%= name %> (ta bort)"
+ mobile_row_unchecked: "<%= name %> (lägg till)"
select_aspects: "Välj aspekter"
started_sharing_with: "Du har börjat dela med <%= name %>!"
stopped_sharing_with: "Du har slutat dela med <%= name %>."
@@ -22,6 +24,7 @@ sv:
other: "I <%= count %> aspekter"
two: "I <%= count %> aspekter"
zero: "Välj aspekter"
+ updating: "uppdaterar..."
aspect_navigation:
add_an_aspect: "+ Lägg till en aspekt"
deselect_all: "Visa ingen"
@@ -37,6 +40,15 @@ sv:
no_comments: "Inga kommentarer finns ännu."
show: "visa alla kommentarer"
confirm_dialog: "Är du säker?"
+ confirm_unload: "Bekräfta att du vill gå från sidan. Du har osparad information här."
+ contacts:
+ add_contact: "Lägg till kontakt"
+ aspect_list_is_not_visible: "Aspektens kontakter kan inte se vilka andra som tillhör aspekten."
+ aspect_list_is_visible: "Aspektens kontakter kan se varandra."
+ error_add: "Kunde inte lägga till <%= name %> till aspekten. :-("
+ error_remove: "Kunde inte ta bort <%= name %> från aspekten. :-("
+ remove_contact: "Ta bort kontakt"
+ search_no_results: "Inga kontakter hittade"
conversation:
participants: "Deltagare"
delete: "Radera"
@@ -44,6 +56,7 @@ sv:
failed_to_like: "Misslyckades med att gilla!"
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 %>!"
@@ -64,6 +77,8 @@ sv:
search: "Sök"
settings: "Inställningar"
view_all: "Visa alla"
+ hide_post: "Vill du dölja inlägget?"
+ hide_post_failed: "Misslyckades med att dölja inlägget"
ignore: "Ignorera"
ignore_failed: "Lyckades inte ignorera denna användare"
ignore_user: "Vill du ignorera den här användaren?"
@@ -73,11 +88,19 @@ sv:
my_activity: "Min aktivitet"
my_aspects: "Mina aspekter"
my_stream: "Ström"
+ no_results: "Inga sökresultat"
notifications:
mark_read: "Lästmärk"
mark_unread: "Olästmarkera"
people:
+ edit_my_profile: "Ändra min profil"
+ helper:
+ is_not_sharing: "<%= name %> delar inte sina uppdateringar med dig."
+ is_sharing: "<%= name %> delar med sig till dig"
+ mention: "Nämn"
+ message: "Meddelande"
not_found: "och ingen hittades..."
+ stop_ignoring: "Sluta ignorera"
photo_uploader:
completed: "<%= file %> klar"
empty: "{file} är tom, var vänlig och välj filer igen utan den."
@@ -90,9 +113,23 @@ sv:
count:
one: "<%=count%> röst lagd"
other: "<%=count%> röster lagda"
+ go_to_original_post: "Du kan rösta på <%= original_post_link %>"
+ original_post: "ursprungligt inlägg"
result: "Resultat"
show_result: "Visa resultat"
vote: "Rösta"
+ profile:
+ add_some: "lägg till"
+ bio: "Biografi"
+ born: "Födelsedag"
+ contacts: "Kontakter"
+ edit: "ändra"
+ gender: "Kön"
+ ignoring: "Du ignorerar alla inlägg från <%= name %>."
+ location: "Plats"
+ photos: "Foton"
+ posts: "Inlägg"
+ you_have_no_tags: "du har inga taggar!"
publisher:
add_option: "Lägg till alternativ"
at_least_one_aspect: "Du måste publicera till minst en aspekt."
@@ -101,6 +138,7 @@ sv:
option: "Alternativ"
public: "Publikt - ditt inlägg visas för alla och i söktjänster"
question: "Fråga"
+ remove_post: "Vi du ta bort detta inlägg?"
report:
name: "Anmälan"
prompt: "Var god ange orsak:"
@@ -116,6 +154,8 @@ sv:
show_more: "visa mer"
stream:
comment: "Kommentera"
+ disable_post_notifications: "Inaktivera notifikationer för detta inlägg"
+ enable_post_notifications: "Tillåt notifikationer för detta inlägg"
follow: "Följ"
followed_tag:
add_a_tag: "Lägg till en tagg"
@@ -169,6 +209,7 @@ sv:
wordSeparator: " "
year: "ungefär ett år"
years: "%d år"
+ unblock_failed: "Misslyckades med att häva blockeringen"
videos:
unknown: "Okänd videotyp"
watch: "Se den här videon på <%= provider %>"
diff --git a/config/locales/javascript/javascript.uk.yml b/config/locales/javascript/javascript.uk.yml
index 3032e0858..88b5bd744 100644
--- a/config/locales/javascript/javascript.uk.yml
+++ b/config/locales/javascript/javascript.uk.yml
@@ -12,6 +12,8 @@ uk:
all_aspects: "Усі аспекти"
error: "Неможливо почати ділитися з користувачем <%= name %>. Можливо, ви його заблокували?"
error_remove: "Неможливо видалити <%= name %> з аспекту :("
+ mobile_row_checked: "<%= name %>(видалити)"
+ mobile_row_unchecked: "<%= name %>(додати)"
select_aspects: "Вибрати аспекти"
started_sharing_with: "Ви почали ділитися з <%= name %>!"
stopped_sharing_with: "Ви перестали ділитися з <%= name %>."
@@ -21,6 +23,7 @@ uk:
one: "У <%= count %> аспектах"
other: "У <%= count %> аспектах"
zero: "Вибрати аспекти"
+ updating: "обновлюється..."
aspect_navigation:
add_an_aspect: "+ Додати аспект"
deselect_all: "Зняти вибір з усіх"
@@ -36,6 +39,15 @@ uk:
no_comments: "Коментарів ще немає."
show: "Показати усі коментарі"
confirm_dialog: "Ви упевнені?"
+ confirm_unload: "Будь ласка, підтвердіть, що хочете залишити сторінку - введені вами дані не будуть збережені."
+ contacts:
+ add_contact: "Додати контакт"
+ aspect_list_is_not_visible: "Контакти, з цього аспекту, не можуть бачити один одного."
+ aspect_list_is_visible: "Контакти, із цього аспекту, можуть бачити один одного."
+ error_add: "Неможливо додати <%= name %> в аспект :("
+ error_remove: "Неможливо видалити <%= name %> з аспекту :("
+ remove_contact: "Видалити контакт"
+ search_no_results: "Контакти не знайдено"
conversation:
participants: "Учасники"
delete: "Вилучити"
@@ -43,6 +55,7 @@ uk:
failed_to_like: "Не вдалося!"
failed_to_post_message: "Не вдалося надіслати повідомлення!"
failed_to_remove: "Видалення не завершено!"
+ failed_to_reshare: "Не вдалося поділитись!"
getting_started:
alright_ill_wait: "Добре, я почекаю."
hey: "Привіт, <%= name %>!"
@@ -63,19 +76,30 @@ uk:
search: "Пошук людей чи #міток"
settings: "Налаштування"
view_all: "Показати все"
+ hide_post: "Заховати публікацію?"
+ hide_post_failed: "Неможливо заховати цю публікацію"
ignore: "Iгнорувати"
+ ignore_failed: "Неможливо ігнорувати цього користувача"
ignore_user: "Ігнорувати цього користувача?"
infinite_scroll:
no_more: "Повідомлень більше немає."
no_more_contacts: "Контактів більше немає."
- my_activity: "Моя активність"
+ my_activity: "Моя діяльність"
my_aspects: "Мої аспекти"
my_stream: "Мій потік"
+ no_results: "Нічого не знайдено"
notifications:
mark_read: "Помітити як прочитане"
mark_unread: "Помітити як непрочитане"
people:
+ edit_my_profile: "Редагувати мій профіль"
+ helper:
+ is_not_sharing: "<%= name %> не ділиться з вами"
+ is_sharing: "<%= name %> ділиться з вами"
+ mention: "Згадки"
+ message: "Повідомлення"
not_found: "нікого не знайдено..."
+ stop_ignoring: "Припинити блокування"
photo_uploader:
completed: "<%= file %> готово"
empty: "{file} порожній, виберіть будь ласка файл повторно."
@@ -94,14 +118,27 @@ uk:
result: "Результати"
show_result: "Показати результати"
vote: "Голосувати"
+ profile:
+ add_some: "додати"
+ bio: "Про себе"
+ born: "День народження"
+ contacts: "Контакти"
+ edit: "редагувати"
+ gender: "Стать"
+ ignoring: "Ви блокуєте усі записи користувача <%= name %>."
+ location: "Адреса"
+ photos: "Світлини"
+ posts: "Записи"
+ you_have_no_tags: "у вас немає міток!"
publisher:
- add_option: "Додати варіант"
+ add_option: "Додати відповідь"
at_least_one_aspect: "Вам потрібно створити мінімум один аспект"
limited: "Обмежена - ваш запис буде видимий тільки вказаним вами людям"
near_from: "Відправлено з: <%= location %>"
option: "Варіант <%= nr %>"
public: "Публічна - ваш запис буде видимий усім, зокрема пошуковим системам"
question: "Питання"
+ remove_post: "Видалити цю публікацію?"
report:
name: "Донести"
prompt: "Будь ласка, вкажіть причину:"
@@ -134,7 +171,7 @@ uk:
zero: "Сподобалося: <%= count %> "
limited: "Обмежений"
more_comments:
- few: "Ще <%= count %> коментаря"
+ few: "Ще <%= count %> коментарі"
many: "Ще <%= count %> коментарів"
one: "Ще <%= count %> коментар"
other: "Ще <%= count %> коментарів"
@@ -175,6 +212,7 @@ uk:
suffixFromNow: "з цієї миті"
year: "біля року"
years: "%d років"
+ unblock_failed: "Не вдалось розблокувати цього користувача"
videos:
unknown: "Невідомий відеоформат"
watch: "Дивитися це відео на <%= provider %>"
diff --git a/config/locales/javascript/javascript.zh-TW.yml b/config/locales/javascript/javascript.zh-TW.yml
index fece5b3be..549482278 100644
--- a/config/locales/javascript/javascript.zh-TW.yml
+++ b/config/locales/javascript/javascript.zh-TW.yml
@@ -12,23 +12,39 @@ zh-TW:
all_aspects: "所有面向"
error: "無法開始和 <%= name %> 分享。你還在忽視他們嗎?"
error_remove: "無法把 <%= name %> 從面向中移除 :("
+ mobile_row_checked: "<%= name %> (移除)"
+ mobile_row_unchecked: "<%= name %> (新增)"
select_aspects: "選面向"
started_sharing_with: "你開始和 <%= name %> 分享了!"
stopped_sharing_with: "停止和 <%= name %> 分享了。"
toggle:
other: "在<%= count %>個面向中"
zero: "選面向"
+ updating: "正在更新..."
aspect_navigation:
add_an_aspect: "+ 新增面向"
deselect_all: "全不選"
no_aspects: "沒選任何一個面向"
select_all: "全選"
+ bookmarklet:
+ post_something: "貼到 diaspora*"
+ post_submit: "傳送貼文中..."
+ post_success: "貼好了!彈出視窗關閉中..."
comma: ","
comments:
hide: "隱藏意見"
no_comments: "目前還沒有任何意見。"
show: "顯示所有意見"
confirm_dialog: "你確定嗎?"
+ confirm_unload: "請確定要離開這一頁 - 你目前所輸入的資料不會保留。"
+ contacts:
+ add_contact: "加聯絡人"
+ aspect_list_is_not_visible: "在這個面向中的連絡人沒辦法看見有哪些人在同一個面向中。"
+ aspect_list_is_visible: "在這個面向中的連絡人可以互相看見他們在同一個面向中。"
+ error_add: "沒辦法把 <%= name %> 加到這個面向 :("
+ error_remove: "沒辦法把 <%= name %> 從這個面向中移除 :("
+ remove_contact: "刪聯絡人"
+ search_no_results: "沒找到聯絡人"
conversation:
participants: "參加人員"
delete: "刪除"
@@ -36,6 +52,7 @@ zh-TW:
failed_to_like: "說讚失敗!"
failed_to_post_message: "貼文失敗!"
failed_to_remove: "刪掉這個項目的動作失敗了!"
+ failed_to_reshare: "轉貼失敗!"
getting_started:
alright_ill_wait: "好,再說吧。"
hey: "嗨,<%= name %>!"
@@ -45,6 +62,7 @@ zh-TW:
admin: "管理"
close: "關閉"
contacts: "連絡人"
+ conversations: "交談"
help: "說明"
home: "我家"
log_out: "登出"
@@ -55,7 +73,10 @@ zh-TW:
search: "搜尋"
settings: "設定"
view_all: "看全部"
+ hide_post: "要隱藏貼文嗎?"
+ hide_post_failed: "沒辦法隱藏貼文"
ignore: "忽視"
+ ignore_failed: "沒辦法忽視這個使用者"
ignore_user: "要忽視這個使用者嗎?"
infinite_scroll:
no_more: "沒有貼文了。"
@@ -63,8 +84,19 @@ zh-TW:
my_activity: "我的活動"
my_aspects: "我的面向"
my_stream: "流水帳"
+ no_results: "結果什麽都找不到"
+ notifications:
+ mark_read: "標示為看過了"
+ mark_unread: "標示為沒看過"
people:
+ edit_my_profile: "編輯自己的個人檔案"
+ helper:
+ is_not_sharing: "<%= name %> 沒有跟你分享"
+ is_sharing: "<%= name %> 正在跟你分享中"
+ mention: "指指點點"
+ message: "送訊息"
not_found: "找不到任何人..."
+ stop_ignoring: "停止忽視"
photo_uploader:
completed: "檔案 <%= file %> 完成了"
empty: "檔案 {file} 是空的,請不要選它再重選一次。"
@@ -72,11 +104,43 @@ zh-TW:
invalid_ext: "檔案 {file} 的副檔名不合格。僅接受 {extensions}。"
looking_good: "天啊,你看起來真帥!"
size_error: "檔案 {file} 太大了,上限是{sizeLimit}。"
+ poll:
+ close_result: "隱藏結果"
+ count:
+ other: "到目前有 <%=count%> 張票"
+ go_to_original_post: "你可以在 <%= original_post_link %> 參與這次票選。"
+ original_post: "原貼文"
+ result: "結果"
+ show_result: "顯示結果"
+ vote: "投票"
+ profile:
+ add_some: "加入一些"
+ bio: "自我介紹"
+ born: "生日"
+ contacts: "聯絡資訊"
+ edit: "編輯"
+ gender: "性別"
+ ignoring: "你目前會忽視 <%= name %> 的所有貼文。"
+ location: "地點"
+ photos: "相片"
+ posts: "貼文"
+ you_have_no_tags: "你沒有任何標籤!"
publisher:
+ add_option: "增加答案"
at_least_one_aspect: "發表時請至少選擇一個面向"
limited: "有限 - 只有你想分享的人才看得到你的貼文"
near_from: "貼文地點:<%= location %>"
+ option: "答案"
public: "公開 - 所有人都能看到你的貼文,包括搜尋引擎"
+ question: "問題"
+ remove_post: "要移除貼文嗎?"
+ report:
+ name: "回報"
+ prompt: "請輸入回報的理由:"
+ prompt_default: "內容有攻擊性"
+ status:
+ created: "成功產生回報了"
+ exists: "已經有這筆回報了"
reshares:
duplicate: "很棒對吧?你已經轉貼過該篇貼文了!"
post: "要轉貼 <%= name %> 的貼文嗎?"
@@ -85,6 +149,8 @@ zh-TW:
show_more: "顯示更多"
stream:
comment: "意見"
+ disable_post_notifications: "關閉貼文的最新通知"
+ enable_post_notifications: "開啟貼文的最新通知"
follow: "追蹤"
followed_tag:
add_a_tag: "新增標籤"
@@ -115,6 +181,7 @@ zh-TW:
stop_following: "停止追蹤 #<%= tag %>"
unfollow: "取消追蹤"
unlike: "收回讚"
+ via: "經由<%= provider %>"
tags:
wasnt_that_interesting: "OK,我想 #<%= tagName %> 大概沒那麼有趣..."
timeago:
@@ -133,6 +200,7 @@ zh-TW:
suffixFromNow: "前"
year: "約一年"
years: "%d年"
+ unblock_failed: "取消封鎖這個使用者失敗了"
videos:
unknown: "不明的影片類別"
watch: "從 <%= provider %> 看這部影片"
diff --git a/config/oembed_providers.yml b/config/oembed_providers.yml
index 1c3970820..7cde6334e 100644
--- a/config/oembed_providers.yml
+++ b/config/oembed_providers.yml
@@ -3,9 +3,10 @@
# note that 'endpoint' is the only information
# in OEmbed that we can trust. anything else may be spoofed!
daily_motion:
- endpoint: "http://www.dailymotion.com/services/oembed"
+ endpoint: "https://www.dailymotion.com/services/oembed"
urls:
- http://www.dailymotion.com/video/*
+ - https://www.dailymotion.com/video/*
twitter:
endpoint: "https://api.twitter.com/1/statuses/oembed.json"
@@ -16,4 +17,5 @@ twitter:
mixcloud:
endpoint: "http://www.mixcloud.com/oembed/"
urls:
- - http://www.mixcloud.com/*/* \ No newline at end of file
+ - http://www.mixcloud.com/*/*
+ - https://www.mixcloud.com/*/*
diff --git a/config/routes.rb b/config/routes.rb
index 519a731f4..c7f924bae 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -3,8 +3,10 @@
# the COPYRIGHT file.
require 'sidekiq/web'
+require 'sidetiq/web'
Diaspora::Application.routes.draw do
+
resources :report, :except => [:edit, :new]
if Rails.env.production?
@@ -34,7 +36,7 @@ Diaspora::Application.routes.draw do
resources :poll_participations, :only => [:create]
resources :likes, :only => [:create, :destroy, :index ]
- resources :participations, :only => [:create, :destroy, :index]
+ resource :participation, :only => [:create, :destroy]
resources :comments, :only => [:new, :create, :destroy, :index]
end
@@ -49,8 +51,8 @@ Diaspora::Application.routes.draw do
end
# Streams
- get "participate" => "streams#activity", :as => "activity_stream" # legacy
- get "explore" => "streams#multi", :as => "stream" # legacy
+ get "participate" => "streams#activity" # legacy
+ get "explore" => "streams#multi" # legacy
get "activity" => "streams#activity", :as => "activity_stream"
get "stream" => "streams#multi", :as => "stream"
@@ -63,6 +65,7 @@ Diaspora::Application.routes.draw do
resources :aspects do
put :toggle_contact_visibility
+ put :toggle_chat_privilege
end
get 'bookmarklet' => 'status_messages#bookmarklet'
@@ -84,7 +87,7 @@ Diaspora::Application.routes.draw do
get :read_all
end
end
-
+
resources :tags, :only => [:index]
@@ -98,38 +101,39 @@ Diaspora::Application.routes.draw do
resource :user, :only => [:edit, :update, :destroy], :shallow => true do
get :getting_started_completed
- get :export
- get :export_photos
+ post :export_profile
+ get :download_profile
+ post :export_photos
+ get :download_photos
end
controller :users do
get 'public/:username' => :public, :as => 'users_public'
- match 'getting_started' => :getting_started, :as => 'getting_started'
- match 'privacy' => :privacy_settings, :as => 'privacy_settings'
+ get 'getting_started' => :getting_started, :as => 'getting_started'
+ get 'privacy' => :privacy_settings, :as => 'privacy_settings'
get 'getting_started_completed' => :getting_started_completed
get 'confirm_email/:token' => :confirm_email, :as => 'confirm_email'
end
# This is a hack to overide a route created by devise.
# I couldn't find anything in devise to skip that route, see Bug #961
- match 'users/edit' => redirect('/user/edit')
+ get 'users/edit' => redirect('/user/edit')
devise_for :users, :controllers => {:registrations => "registrations",
- :passwords => "passwords",
:sessions => "sessions"}
#legacy routes to support old invite routes
get 'users/invitation/accept' => 'invitations#edit'
get 'invitations/email' => 'invitations#email', :as => 'invite_email'
get 'users/invitations' => 'invitations#new', :as => 'new_user_invitation'
- post 'users/invitations' => 'invitations#create', :as => 'new_user_invitation'
+ post 'users/invitations' => 'invitations#create', :as => 'user_invitation'
get 'login' => redirect('/users/sign_in')
# Admin backend routes
scope 'admins', :controller => :admins do
- match :user_search
+ match :user_search, via: [:get, :post]
get :admin_inviter
get :weekly_user_stats
get :correlations
@@ -139,6 +143,8 @@ Diaspora::Application.routes.draw do
namespace :admin do
post 'users/:id/close_account' => 'users#close_account', :as => 'close_account'
+ post 'users/:id/lock_account' => 'users#lock_account', :as => 'lock_account'
+ post 'users/:id/unlock_account' => 'users#unlock_account', :as => 'unlock_account'
end
resource :profile, :only => [:edit, :update]
@@ -146,7 +152,6 @@ Diaspora::Application.routes.draw do
resources :contacts, :except => [:update, :create] do
- get :sharing, :on => :collection
end
resources :aspect_memberships, :only => [:destroy, :create]
resources :share_visibilities, :only => [:update]
@@ -160,6 +165,7 @@ Diaspora::Application.routes.draw do
resources :photos
get :contacts
get "aspect_membership_button" => :aspect_membership_dropdown, :as => "aspect_membership_button"
+ get :stream
get :hovercard
member do
@@ -171,8 +177,8 @@ Diaspora::Application.routes.draw do
get :tag_index
end
end
- get '/u/:username' => 'people#show', :as => 'user_profile'
- get '/u/:username/profile_photo' => 'users#user_photo'
+ get '/u/:username' => 'people#show', :as => 'user_profile', :constraints => { :username => /[^\/]+/ }
+ get '/u/:username/profile_photo' => 'users#user_photo', :constraints => { :username => /[^\/]+/ }
# Federation
@@ -193,8 +199,8 @@ Diaspora::Application.routes.draw do
resources :services, :only => [:index, :destroy]
controller :services do
scope "/auth", :as => "auth" do
- match ':provider/callback' => :create
- match :failure
+ get ':provider/callback' => :create
+ get :failure
end
end
@@ -207,6 +213,9 @@ Diaspora::Application.routes.draw do
get "/users/:username" => 'users#show', :as => 'user'
get "/tags/:name" => 'tags#show', :as => 'tag'
end
+ namespace :v1 do
+ resources :tokens, :only => [:create, :destroy]
+ end
end
get 'community_spotlight' => "contacts#spotlight", :as => 'community_spotlight'
@@ -214,15 +223,16 @@ Diaspora::Application.routes.draw do
get 'mobile/toggle', :to => 'home#toggle_mobile', :as => 'toggle_mobile'
- # help
+ # Help
get 'help' => 'help#faq', :as => 'help'
+ get 'help/:topic' => 'help#faq'
#Protocol Url
get 'protocol' => redirect("http://wiki.diasporafoundation.org/Federation_Protocol_Overview")
#Statistics
get :statistics, controller: :statistics
-
+
# Terms
if AppConfig.settings.terms.enable?
get 'terms' => 'terms#index'
diff --git a/config/sidekiq.yml b/config/sidekiq.yml
new file mode 100644
index 000000000..5ea3d5fa1
--- /dev/null
+++ b/config/sidekiq.yml
@@ -0,0 +1,19 @@
+<% require_relative 'config/load_config' %>
+---
+:verbose: false
+:logfile: "<%= AppConfig.sidekiq_log unless AppConfig.heroku? %>"
+:concurrency: <%= AppConfig.environment.sidekiq.concurrency.to_i %>
+:queues:
+ - socket_webfinger
+ - photos
+ - http_service
+ - dispatch
+ - mail
+ - delete_account
+ - receive_local
+ - receive
+ - receive_salmon
+ - http
+ - export
+ - maintenance
+ - default
diff --git a/config/unicorn.rb b/config/unicorn.rb
index 52963a762..719c357c2 100644
--- a/config/unicorn.rb
+++ b/config/unicorn.rb
@@ -29,9 +29,9 @@ before_fork do |server, worker|
unless AppConfig.single_process_mode?
Sidekiq.redis {|redis| redis.client.disconnect }
end
-
+
if AppConfig.server.embed_sidekiq_worker?
- @sidekiq_pid ||= spawn('bundle exec sidekiq')
+ @sidekiq_pid ||= spawn('bin/bundle exec sidekiq')
end
old_pid = '/var/run/diaspora/diaspora.pid.oldbin'
diff --git a/config/vines/README b/config/vines/README
new file mode 100644
index 000000000..819906dc7
--- /dev/null
+++ b/config/vines/README
@@ -0,0 +1,7 @@
+If you want to encrypt your chat streams with vines.
+Add to `config/vines` your server certificate and key.
+
+The domain name should be included in the file name e.g.:
+
+* example.com.crt
+* example.com.key
diff --git a/db/migrate/0000_create_schema.rb b/db/migrate/0000_create_schema.rb
index c6057bcce..97fcc3da6 100644
--- a/db/migrate/0000_create_schema.rb
+++ b/db/migrate/0000_create_schema.rb
@@ -1,181 +1,488 @@
class CreateSchema < ActiveRecord::Migration
- def self.up
- create_table :aspects do |t|
- t.string :name
- t.integer :user_id
- t.timestamps
- end
- add_index :aspects, :user_id
-
- create_table :aspect_memberships do |t|
- t.integer :aspect_id
- t.integer :contact_id
- t.timestamps
- end
- add_index :aspect_memberships, :aspect_id
- add_index :aspect_memberships, [:aspect_id, :contact_id], :unique => true
- add_index :aspect_memberships, :contact_id
-
- create_table :comments do |t|
- t.text :text
- t.integer :post_id
- t.integer :person_id
- t.string :guid
- t.text :creator_signature
- t.text :post_creator_signature
- t.text :youtube_titles
- t.timestamps
- end
- add_index :comments, :guid, :unique => true
- add_index :comments, :post_id
-
- create_table :contacts do |t|
- t.integer :user_id
- t.integer :person_id
- t.boolean :pending, :default => true
- t.timestamps
- end
- add_index :contacts, [:user_id, :pending]
- add_index :contacts, [:person_id, :pending]
- add_index :contacts, [:user_id, :person_id], :unique => true
-
- create_table :invitations do |t|
- t.text :message
- t.integer :sender_id
- t.integer :recipient_id
- t.integer :aspect_id
- t.timestamps
- end
- add_index :invitations, :sender_id
-
- create_table :notifications do |t|
- t.string :target_type
- t.integer :target_id
- t.integer :recipient_id
- t.integer :actor_id
- t.string :action
- t.boolean :unread, :default => true
- t.timestamps
- end
- add_index :notifications, [:target_type, :target_id]
-
- create_table :people do |t|
- t.string :guid
- t.text :url
- t.string :diaspora_handle
- t.text :serialized_public_key
- t.integer :owner_id
- t.timestamps
- end
- add_index :people, :guid, :unique => true
- add_index :people, :owner_id, :unique => true
- add_index :people, :diaspora_handle, :unique => true
-
- create_table :posts do |t|
- t.integer :person_id
- t.boolean :public, :default => false
- t.string :diaspora_handle
- t.string :guid
- t.boolean :pending, :default => false
- t.string :type
-
- t.text :message
-
- t.integer :status_message_id
- t.text :caption
- t.text :remote_photo_path
- t.string :remote_photo_name
- t.string :random_string
- t.string :image #carrierwave's column
- t.text :youtube_titles
-
- t.timestamps
- end
- add_index :posts, :type
- add_index :posts, :person_id
- add_index :posts, :guid
-
- create_table :post_visibilities do |t|
- t.integer :aspect_id
- t.integer :post_id
- t.timestamps
- end
- add_index :post_visibilities, :aspect_id
- add_index :post_visibilities, :post_id
-
- create_table :profiles do |t|
- t.string :diaspora_handle
- t.string :first_name, :limit => 127
- t.string :last_name, :limit => 127
- t.string :image_url
- t.string :image_url_small
- t.string :image_url_medium
- t.date :birthday
- t.string :gender
- t.text :bio
- t.boolean :searchable, :default => true
- t.integer :person_id
- t.timestamps
- end
- add_index :profiles, [:first_name, :searchable]
- add_index :profiles, [:last_name, :searchable]
- add_index :profiles, [:first_name, :last_name, :searchable]
- add_index :profiles, :person_id
-
- create_table :requests do |t|
- t.integer :sender_id
- t.integer :recipient_id
- t.integer :aspect_id
- t.timestamps
- end
- add_index :requests, :sender_id
- add_index :requests, :recipient_id
- add_index :requests, [:sender_id, :recipient_id], :unique => true
-
- create_table :services do |t|
- t.string :type, :limit => 127
- t.integer :user_id
- t.string :provider
- t.string :uid, :limit => 127
- t.string :access_token
- t.string :access_secret
- t.string :nickname
- t.timestamps
- end
- add_index :services, :user_id
-
- create_table :users do |t|
- t.string :username
- t.text :serialized_private_key
- t.integer :invites, :default => 0
- t.boolean :getting_started, :default => true
- t.boolean :disable_mail, :default => false
- t.string :language
-
- t.string :email, :null => false, :default => ""
- t.string :encrypted_password, :null => false, :default => ""
-
- t.string :invitation_token, :limit => 60
- t.datetime :invitation_sent_at
-
- t.string :reset_password_token
- t.datetime :remember_created_at
- t.string :remember_token
- t.integer :sign_in_count, :default => 0
- t.datetime :current_sign_in_at
- t.datetime :last_sign_in_at
- t.string :current_sign_in_ip
- t.string :last_sign_in_ip
-
- t.timestamps
- end
- add_index :users, :username, :unique => true
- add_index :users, :email, :unique => true
- add_index :users, :invitation_token
-
- end
-
- def self.down
- raise "irreversable migration!"
+ create_table "account_deletions", :force => true do |t|
+ t.string "diaspora_handle"
+ t.integer "person_id"
end
+
+ create_table "aspect_memberships", :force => true do |t|
+ t.integer "aspect_id", :null => false
+ t.integer "contact_id", :null => false
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ add_index "aspect_memberships", ["aspect_id", "contact_id"], :name => "index_aspect_memberships_on_aspect_id_and_contact_id", :unique => true
+ add_index "aspect_memberships", ["aspect_id"], :name => "index_aspect_memberships_on_aspect_id"
+ add_index "aspect_memberships", ["contact_id"], :name => "index_aspect_memberships_on_contact_id"
+
+ create_table "aspect_visibilities", :force => true do |t|
+ t.integer "shareable_id", :null => false
+ t.integer "aspect_id", :null => false
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.string "shareable_type", :default => "Post", :null => false
+ end
+
+ add_index "aspect_visibilities", ["aspect_id"], :name => "index_aspect_visibilities_on_aspect_id"
+ add_index 'aspect_visibilities', ["shareable_id", "shareable_type", "aspect_id"], :name => 'shareable_and_aspect_id', length: {"shareable_type"=>189}, :using => :btree
+ add_index 'aspect_visibilities', ["shareable_id", "shareable_type"], :name => 'index_aspect_visibilities_on_shareable_id_and_shareable_type', length: {"shareable_type"=>190}, :using => :btree
+
+ create_table "aspects", :force => true do |t|
+ t.string "name", :null => false
+ t.integer "user_id", :null => false
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.boolean "contacts_visible", :default => true, :null => false
+ t.integer "order_id"
+ end
+
+ add_index "aspects", ["user_id", "contacts_visible"], :name => "index_aspects_on_user_id_and_contacts_visible"
+ add_index "aspects", ["user_id"], :name => "index_aspects_on_user_id"
+
+ create_table "blocks", :force => true do |t|
+ t.integer "user_id"
+ t.integer "person_id"
+ end
+
+ create_table "comments", :force => true do |t|
+ t.text "text", :null => false
+ t.integer "commentable_id", :null => false
+ t.integer "author_id", :null => false
+ t.string "guid", :null => false
+ t.text "author_signature"
+ t.text "parent_author_signature"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.integer "likes_count", :default => 0, :null => false
+ t.string "commentable_type", :limit => 60, :default => "Post", :null => false
+ end
+
+ add_index "comments", ["author_id"], :name => "index_comments_on_person_id"
+ add_index "comments", ["commentable_id", "commentable_type"], :name => "index_comments_on_commentable_id_and_commentable_type"
+ add_index 'comments', ["guid"], :name => 'index_comments_on_guid', length: {"guid"=>191}, :using => :btree, :unique => true
+
+ create_table "contacts", :force => true do |t|
+ t.integer "user_id", :null => false
+ t.integer "person_id", :null => false
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.boolean "sharing", :default => false, :null => false
+ t.boolean "receiving", :default => false, :null => false
+ end
+
+ add_index "contacts", ["person_id"], :name => "index_contacts_on_person_id"
+ add_index "contacts", ["user_id", "person_id"], :name => "index_contacts_on_user_id_and_person_id", :unique => true
+
+ create_table "conversation_visibilities", :force => true do |t|
+ t.integer "conversation_id", :null => false
+ t.integer "person_id", :null => false
+ t.integer "unread", :default => 0, :null => false
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ add_index "conversation_visibilities", ["conversation_id", "person_id"], :name => "index_conversation_visibilities_usefully", :unique => true
+ add_index "conversation_visibilities", ["conversation_id"], :name => "index_conversation_visibilities_on_conversation_id"
+ add_index "conversation_visibilities", ["person_id"], :name => "index_conversation_visibilities_on_person_id"
+
+ create_table "conversations", :force => true do |t|
+ t.string "subject"
+ t.string "guid", :null => false
+ t.integer "author_id", :null => false
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ add_index "conversations", ["author_id"], :name => "conversations_author_id_fk"
+
+ create_table "invitation_codes", :force => true do |t|
+ t.string "token"
+ t.integer "user_id"
+ t.integer "count"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "invitations", :force => true do |t|
+ t.text "message"
+ t.integer "sender_id"
+ t.integer "recipient_id"
+ t.integer "aspect_id"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.string "service"
+ t.string "identifier"
+ t.boolean "admin", :default => false
+ t.string "language", :default => "en"
+ end
+
+ add_index "invitations", ["aspect_id"], :name => "index_invitations_on_aspect_id"
+ add_index "invitations", ["recipient_id"], :name => "index_invitations_on_recipient_id"
+ add_index "invitations", ["sender_id"], :name => "index_invitations_on_sender_id"
+
+ create_table "likes", :force => true do |t|
+ t.boolean "positive", :default => true
+ t.integer "target_id"
+ t.integer "author_id"
+ t.string "guid"
+ t.text "author_signature"
+ t.text "parent_author_signature"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.string "target_type", :limit => 60, :null => false
+ end
+
+ add_index "likes", ["author_id"], :name => "likes_author_id_fk"
+ add_index 'likes', ["guid"], :name => 'index_likes_on_guid', length: {"guid"=>191}, :using => :btree, :unique => true
+ add_index "likes", ["target_id", "author_id", "target_type"], :name => "index_likes_on_target_id_and_author_id_and_target_type", :unique => true
+ add_index "likes", ["target_id"], :name => "index_likes_on_post_id"
+
+ create_table "locations", :force => true do |t|
+ t.string "address"
+ t.string "lat"
+ t.string "lng"
+ t.integer "status_message_id"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "mentions", :force => true do |t|
+ t.integer "post_id", :null => false
+ t.integer "person_id", :null => false
+ end
+
+ add_index "mentions", ["person_id", "post_id"], :name => "index_mentions_on_person_id_and_post_id", :unique => true
+ add_index "mentions", ["person_id"], :name => "index_mentions_on_person_id"
+ add_index "mentions", ["post_id"], :name => "index_mentions_on_post_id"
+
+ create_table "messages", :force => true do |t|
+ t.integer "conversation_id", :null => false
+ t.integer "author_id", :null => false
+ t.string "guid", :null => false
+ t.text "text", :null => false
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.text "author_signature"
+ t.text "parent_author_signature"
+ end
+
+ add_index "messages", ["author_id"], :name => "index_messages_on_author_id"
+ add_index "messages", ["conversation_id"], :name => "messages_conversation_id_fk"
+
+ create_table "notification_actors", :force => true do |t|
+ t.integer "notification_id"
+ t.integer "person_id"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ add_index "notification_actors", ["notification_id", "person_id"], :name => "index_notification_actors_on_notification_id_and_person_id", :unique => true
+ add_index "notification_actors", ["notification_id"], :name => "index_notification_actors_on_notification_id"
+ add_index "notification_actors", ["person_id"], :name => "index_notification_actors_on_person_id"
+
+ create_table "notifications", :force => true do |t|
+ t.string "target_type"
+ t.integer "target_id"
+ t.integer "recipient_id", :null => false
+ t.boolean "unread", :default => true, :null => false
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.string "type"
+ end
+
+ add_index "notifications", ["recipient_id"], :name => "index_notifications_on_recipient_id"
+ add_index "notifications", ["target_id"], :name => "index_notifications_on_target_id"
+ add_index 'notifications', ["target_type", "target_id"], name: 'index_notifications_on_target_type_and_target_id', length: {"target_type"=>190}, using: :btree
+
+ create_table "o_embed_caches", :force => true do |t|
+ t.string "url", :limit => 1024, :null => false
+ t.text "data", :null => false
+ end
+
+ add_index "o_embed_caches", ["url"], :name => "index_o_embed_caches_on_url", :length => {"url"=> 191}, using: :btree
+
+ create_table "participations", :force => true do |t|
+ t.string "guid"
+ t.integer "target_id"
+ t.string "target_type", :limit => 60, :null => false
+ t.integer "author_id"
+ t.text "author_signature"
+ t.text "parent_author_signature"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ add_index 'participations', ["guid"], :name => 'index_participations_on_guid', length: {"guid"=>191}, :using => :btree
+ add_index "participations", ["target_id", "target_type", "author_id"], :name => "index_participations_on_target_id_and_target_type_and_author_id"
+
+ create_table "people", :force => true do |t|
+ t.string "guid", :null => false
+ t.text "url", :null => false
+ t.string "diaspora_handle", :null => false
+ t.text "serialized_public_key", :null => false
+ t.integer "owner_id"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.boolean "closed_account", :default => false
+ t.integer "fetch_status", :default => 0
+ end
+
+ add_index "people", ["diaspora_handle"], :name => "index_people_on_diaspora_handle", :unique => true, :length => {"diaspora_handle" => 191}
+ add_index 'people', ["guid"], :name => 'index_people_on_guid', length: {"guid"=>191}, :using => :btree, :unique => true
+ add_index "people", ["owner_id"], :name => "index_people_on_owner_id", :unique => true
+
+ create_table "photos", :force => true do |t|
+ t.integer "tmp_old_id"
+ t.integer "author_id", :null => false
+ t.boolean "public", :default => false, :null => false
+ t.string "diaspora_handle"
+ t.string "guid", :null => false
+ t.boolean "pending", :default => false, :null => false
+ t.text "text"
+ t.text "remote_photo_path"
+ t.string "remote_photo_name"
+ t.string "random_string"
+ t.string "processed_image"
+ t.datetime "created_at"
+ t.datetime "updated_at"
+ t.string "unprocessed_image"
+ t.string "status_message_guid"
+ t.integer "comments_count"
+ t.integer "height"
+ t.integer "width"
+ end
+
+ add_index 'photos', ["status_message_guid"], :name => 'index_photos_on_status_message_guid', length: {"status_message_guid"=>191}, :using => :btree
+
+ create_table "pods", :force => true do |t|
+ t.string "host"
+ t.boolean "ssl"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "posts", :force => true do |t|
+ t.integer "author_id", :null => false
+ t.boolean "public", :default => false, :null => false
+ t.string "diaspora_handle"
+ t.string "guid", :null => false
+ t.boolean "pending", :default => false, :null => false
+ t.string "type", :limit => 40, :null => false
+ t.text "text"
+ t.text "remote_photo_path"
+ t.string "remote_photo_name"
+ t.string "random_string"
+ t.string "processed_image"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.string "unprocessed_image"
+ t.string "object_url"
+ t.string "image_url"
+ t.integer "image_height"
+ t.integer "image_width"
+ t.string "provider_display_name"
+ t.string "actor_url"
+ t.string "objectId"
+ t.string "root_guid", :limit => 30
+ t.string "status_message_guid"
+ t.integer "likes_count", :default => 0
+ t.integer "comments_count", :default => 0
+ t.integer "o_embed_cache_id"
+ t.integer "reshares_count", :default => 0
+ t.datetime "interacted_at"
+ t.string "frame_name"
+ t.boolean "favorite", :default => false
+ end
+
+ add_index 'posts', ["author_id", "root_guid"], :name => 'index_posts_on_author_id_and_root_guid', length: {"root_guid"=>30}, :using => :btree, :unique => true
+ add_index "posts", ["author_id"], :name => "index_posts_on_person_id"
+ add_index 'posts', ["guid"], :name => 'index_posts_on_guid', length: {"guid"=>191}, :using => :btree, :unique => true
+ add_index "posts", ["id", "type", "created_at"], :name => "index_posts_on_id_and_type_and_created_at"
+ add_index 'posts', ["root_guid"], :name => 'index_posts_on_root_guid', length: {"root_guid"=>30}
+ add_index 'posts', ["status_message_guid", "pending"], :name => 'index_posts_on_status_message_guid_and_pending', length: {"status_message_guid"=>190}, :using => :btree
+ add_index 'posts', ["status_message_guid"], :name => 'index_posts_on_status_message_guid', length: {"status_message_guid"=>191}, :using => :btree
+ add_index "posts", ["type", "pending", "id"], :name => "index_posts_on_type_and_pending_and_id"
+
+ create_table "profiles", :force => true do |t|
+ t.string "diaspora_handle"
+ t.string "first_name", :limit => 127
+ t.string "last_name", :limit => 127
+ t.string "image_url"
+ t.string "image_url_small"
+ t.string "image_url_medium"
+ t.date "birthday"
+ t.string "gender"
+ t.text "bio"
+ t.boolean "searchable", :default => true, :null => false
+ t.integer "person_id", :null => false
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.string "location"
+ t.string "full_name", :limit => 70
+ t.boolean "nsfw", :default => false
+ end
+
+ add_index "profiles", ["full_name", "searchable"], :name => "index_profiles_on_full_name_and_searchable"
+ add_index "profiles", ["full_name"], :name => "index_profiles_on_full_name"
+ add_index "profiles", ["person_id"], :name => "index_profiles_on_person_id"
+
+ create_table "rails_admin_histories", :force => true do |t|
+ t.text "message"
+ t.string "username"
+ t.integer "item"
+ t.string "table"
+ t.integer "month", :limit => 2
+ t.integer "year", :limit => 8
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ add_index "rails_admin_histories", ["item", "table", "month", "year"], :name => "index_rails_admin_histories", :length => {"table" => 188}
+
+ create_table "roles", :force => true do |t|
+ t.integer "person_id"
+ t.string "name"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "services", :force => true do |t|
+ t.string "type", :limit => 127, :null => false
+ t.integer "user_id", :null => false
+ t.string "uid", :limit => 127
+ t.string "access_token"
+ t.string "access_secret"
+ t.string "nickname"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ add_index 'services', ["type", "uid"], :name => 'index_services_on_type_and_uid', length: {"type"=>64, "uid"=>127}, :using => :btree
+ add_index "services", ["user_id"], :name => "index_services_on_user_id"
+
+ create_table "share_visibilities", :force => true do |t|
+ t.integer "shareable_id", :null => false
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.boolean "hidden", :default => false, :null => false
+ t.integer "contact_id", :null => false
+ t.string "shareable_type", :limit => 60, :default => "Post", :null => false
+ end
+
+ add_index "share_visibilities", ["contact_id"], :name => "index_post_visibilities_on_contact_id"
+ add_index "share_visibilities", ["shareable_id", "shareable_type", "contact_id"], :name => "shareable_and_contact_id"
+ add_index "share_visibilities", ["shareable_id", "shareable_type", "hidden", "contact_id"], :name => "shareable_and_hidden_and_contact_id"
+ add_index "share_visibilities", ["shareable_id"], :name => "index_post_visibilities_on_post_id"
+
+ create_table "tag_followings", :force => true do |t|
+ t.integer "tag_id", :null => false
+ t.integer "user_id", :null => false
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ add_index "tag_followings", ["tag_id", "user_id"], :name => "index_tag_followings_on_tag_id_and_user_id", :unique => true
+ add_index "tag_followings", ["tag_id"], :name => "index_tag_followings_on_tag_id"
+ add_index "tag_followings", ["user_id"], :name => "index_tag_followings_on_user_id"
+
+ create_table "taggings", :force => true do |t|
+ t.integer "tag_id"
+ t.integer "taggable_id"
+ t.string "taggable_type", :limit => 127
+ t.integer "tagger_id"
+ t.string "tagger_type", :limit => 127
+ t.string "context", :limit => 127
+ t.datetime "created_at"
+ end
+
+ add_index "taggings", ["created_at"], :name => "index_taggings_on_created_at"
+ add_index "taggings", ["tag_id"], :name => "index_taggings_on_tag_id"
+ add_index 'taggings', ["taggable_id", "taggable_type", "context"], :name => 'index_taggings_on_taggable_id_and_taggable_type_and_context', length: {"taggable_type"=>95, "context"=>95}, :using => :btree
+ add_index "taggings", ["taggable_id", "taggable_type", "tag_id"], :name => "index_taggings_uniquely", :unique => true
+
+ create_table "tags", :force => true do |t|
+ t.string "name"
+ end
+
+ add_index "tags", ["name"], :name => "index_tags_on_name", :unique => true, :length => {"name" => 191}
+
+ create_table "user_preferences", :force => true do |t|
+ t.string "email_type"
+ t.integer "user_id"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "users", :force => true do |t|
+ t.string "username"
+ t.text "serialized_private_key"
+ t.boolean "getting_started", :default => true, :null => false
+ t.boolean "disable_mail", :default => false, :null => false
+ t.string "language"
+ t.string "email", :default => "", :null => false
+ t.string "encrypted_password", :default => "", :null => false
+ t.string "invitation_token", :limit => 60
+ t.datetime "invitation_sent_at"
+ t.string "reset_password_token"
+ t.datetime "remember_created_at"
+ t.integer "sign_in_count", :default => 0
+ t.datetime "current_sign_in_at"
+ t.datetime "last_sign_in_at"
+ t.string "current_sign_in_ip"
+ t.string "last_sign_in_ip"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.string "invitation_service", :limit => 127
+ t.string "invitation_identifier", :limit => 127
+ t.integer "invitation_limit"
+ t.integer "invited_by_id"
+ t.string "invited_by_type"
+ t.string "authentication_token", :limit => 30
+ t.string "unconfirmed_email"
+ t.string "confirm_email_token", :limit => 30
+ t.datetime "locked_at"
+ t.boolean "show_community_spotlight_in_stream", :default => true, :null => false
+ t.boolean "auto_follow_back", :default => false
+ t.integer "auto_follow_back_aspect_id"
+ t.text "hidden_shareables"
+ t.datetime "reset_password_sent_at"
+ end
+
+ add_index "users", ["authentication_token"], :name => "index_users_on_authentication_token", :unique => true
+ add_index "users", ["email"], :name => "index_users_on_email", length: {"email" => "191"}
+ add_index 'users', ["invitation_service", "invitation_identifier"], :name => 'index_users_on_invitation_service_and_invitation_identifier', length: {"invitation_service"=>64, "invitation_identifier"=>127}, :using => :btree, :unique => true
+ add_index "users", ["invitation_token"], :name => "index_users_on_invitation_token"
+ add_index 'users', ["username"], :name => 'index_users_on_username', length: {"username"=>191}, :using => :btree, :unique => true
+
+ add_foreign_key "aspect_memberships", "aspects", name: "aspect_memberships_aspect_id_fk", on_delete: :cascade
+ add_foreign_key "aspect_memberships", "contacts", name: "aspect_memberships_contact_id_fk", on_delete: :cascade
+
+ add_foreign_key "aspect_visibilities", "aspects", name: "aspect_visibilities_aspect_id_fk", on_delete: :cascade
+
+ add_foreign_key "comments", "people", name: "comments_author_id_fk", column: "author_id", on_delete: :cascade
+
+ add_foreign_key "contacts", "people", name: "contacts_person_id_fk", on_delete: :cascade
+
+ add_foreign_key "conversation_visibilities", "conversations", name: "conversation_visibilities_conversation_id_fk", on_delete: :cascade
+ add_foreign_key "conversation_visibilities", "people", name: "conversation_visibilities_person_id_fk", on_delete: :cascade
+
+ add_foreign_key "conversations", "people", name: "conversations_author_id_fk", column: "author_id", on_delete: :cascade
+
+ add_foreign_key "invitations", "users", name: "invitations_recipient_id_fk", column: "recipient_id", on_delete: :cascade
+ add_foreign_key "invitations", "users", name: "invitations_sender_id_fk", column: "sender_id", on_delete: :cascade
+
+ add_foreign_key "likes", "people", name: "likes_author_id_fk", column: "author_id", on_delete: :cascade
+
+ add_foreign_key "messages", "conversations", name: "messages_conversation_id_fk", on_delete: :cascade
+ add_foreign_key "messages", "people", name: "messages_author_id_fk", column: "author_id", on_delete: :cascade
+
+ add_foreign_key "notification_actors", "notifications", name: "notification_actors_notification_id_fk", on_delete: :cascade
+
+ add_foreign_key "posts", "people", name: "posts_author_id_fk", column: "author_id", on_delete: :cascade
+
+ add_foreign_key "profiles", "people", name: "profiles_person_id_fk", on_delete: :cascade
+
+ add_foreign_key "services", "users", name: "services_user_id_fk", on_delete: :cascade
+
+ add_foreign_key "share_visibilities", "contacts", name: "post_visibilities_contact_id_fk", on_delete: :cascade
end
diff --git a/db/migrate/20110105051803_create_import_tables.rb b/db/migrate/20110105051803_create_import_tables.rb
deleted file mode 100644
index 6e676951d..000000000
--- a/db/migrate/20110105051803_create_import_tables.rb
+++ /dev/null
@@ -1,199 +0,0 @@
-class CreateImportTables < ActiveRecord::Migration
- def self.up
- [:aspects, :comments, :contacts, :invitations, :notifications, :people, :posts, :profiles, :requests, :services, :users].each do |table|
- add_column(table, :mongo_id, :string)
- add_index(table, :mongo_id)
- end
-
- add_column(:aspects, :user_mongo_id, :string)
- create_table :mongo_aspects do |t|
- t.string :mongo_id
- t.string :name
- t.string :user_mongo_id
- t.timestamps
- end
- add_index :mongo_aspects, :user_mongo_id
-
- create_table :mongo_aspect_memberships do |t|
- t.string :aspect_mongo_id
- t.string :contact_mongo_id
- t.timestamps
- end
- add_index :mongo_aspect_memberships, :aspect_mongo_id
- add_index :mongo_aspect_memberships, :contact_mongo_id
-
- create_table :mongo_comments do |t|
- t.text :text
- t.string :mongo_id
- t.string :post_mongo_id
- t.string :person_mongo_id
- t.string :guid
- t.text :creator_signature
- t.text :post_creator_signature
- t.text :youtube_titles
- t.timestamps
- end
- add_index :mongo_comments, :guid, :unique => true
- add_index :mongo_comments, :post_mongo_id
-
- create_table :mongo_contacts do |t|
- t.string :mongo_id
- t.string :user_mongo_id
- t.string :person_mongo_id
- t.boolean :pending, :default => true
- t.timestamps
- end
- add_index :mongo_contacts, [:user_mongo_id, :pending]
- add_index :mongo_contacts, [:person_mongo_id, :pending]
-
- create_table :mongo_people do |t|
- t.string :mongo_id
- t.string :guid
- t.text :url
- t.string :diaspora_handle
- t.text :serialized_public_key
- t.string :owner_mongo_id
- t.timestamps
- end
- add_index :mongo_people, :guid, :unique => true
- add_index :mongo_people, :owner_mongo_id, :unique => true
- add_index :mongo_people, :diaspora_handle, :unique => true
-
- create_table :mongo_posts do |t|
- t.string :person_mongo_id
- t.boolean :public, :default => false
- t.string :diaspora_handle
- t.string :guid
- t.string :mongo_id
- t.boolean :pending, :default => false
- t.string :type
-
- t.text :message
-
- t.string :status_message_mongo_id
- t.text :caption
- t.text :remote_photo_path
- t.string :remote_photo_name
- t.string :random_string
- t.string :image #carrierwave's column
- t.text :youtube_titles
-
- t.timestamps
- end
- add_index :mongo_posts, :type
- add_index :mongo_posts, :person_mongo_id
- add_index :mongo_posts, :guid
-
- create_table :mongo_invitations do |t|
- t.string :mongo_id
- t.text :message
- t.string :sender_mongo_id
- t.string :recipient_mongo_id
- t.string :aspect_mongo_id
- t.timestamps
- end
- add_index :mongo_invitations, :sender_mongo_id
- create_table :mongo_notifications do |t|
- t.string :mongo_id
- t.string :target_type, :limit => 127
- t.string :target_mongo_id, :limit => 127
- t.string :recipient_mongo_id
- t.string :actor_mongo_id
- t.string :action
- t.boolean :unread, :default => true
- t.timestamps
- end
- add_index :mongo_notifications, [:target_type, :target_mongo_id]
- create_table :mongo_post_visibilities do |t|
- t.string :aspect_mongo_id
- t.string :post_mongo_id
- t.timestamps
- end
- add_index :mongo_post_visibilities, :aspect_mongo_id
- add_index :mongo_post_visibilities, :post_mongo_id
-
- create_table :mongo_profiles do |t|
- t.string :diaspora_handle
- t.string :first_name, :limit => 127
- t.string :last_name, :limit => 127
- t.string :image_url
- t.string :image_url_small
- t.string :image_url_medium
- t.date :birthday
- t.string :gender
- t.text :bio
- t.boolean :searchable, :default => true
- t.string :person_mongo_id
- t.timestamps
- end
- add_index :mongo_profiles, [:first_name, :searchable]
- add_index :mongo_profiles, [:last_name, :searchable]
- add_index :mongo_profiles, [:first_name, :last_name, :searchable]
- add_index :mongo_profiles, :person_mongo_id, :unique => true
-
-
- create_table :mongo_requests do |t|
- t.string :mongo_id
- t.string :sender_mongo_id, :limit => 127
- t.string :recipient_mongo_id, :limit => 127
- t.string :aspect_mongo_id
- t.timestamps
- end
- add_index :mongo_requests, :sender_mongo_id
- add_index :mongo_requests, :recipient_mongo_id
- add_index :mongo_requests, [:sender_mongo_id, :recipient_mongo_id], :unique => true
-
- add_column(:services, :user_mongo_id, :string)
- create_table :mongo_services do |t|
- t.string :mongo_id
- t.string :type
- t.string :user_mongo_id
- t.string :provider
- t.string :uid
- t.string :access_token
- t.string :access_secret
- t.string :nickname
- t.timestamps
- end
- add_index :mongo_services, :user_mongo_id
-
- create_table :mongo_users do |t|
- t.string :username
- t.text :serialized_private_key
- t.integer :invites
- t.boolean :getting_started
- t.boolean :disable_mail
- t.string :language
- t.string :email, :null => false, :default => ""
- t.string :encrypted_password, :null => false, :default => ""
- t.string :reset_password_token
- t.datetime :reset_password_sent_at
- t.datetime :remember_created_at
- t.integer :sign_in_count, :default => 0
- t.datetime :current_sign_in_at
- t.datetime :last_sign_in_at
- t.string :current_sign_in_ip
- t.string :last_sign_in_ip
-
-
- t.timestamps
- t.string :mongo_id
- end
- add_index :mongo_users, :mongo_id, :unique => true
- end
-
- def self.down
- execute 'DROP TABLE mongo_users'
- execute 'DROP TABLE mongo_services'
- execute 'DROP TABLE mongo_requests'
- execute 'DROP TABLE mongo_post_visibilities'
- execute 'DROP TABLE mongo_invitations'
- execute 'DROP TABLE mongo_contacts'
- execute 'DROP TABLE mongo_comments'
- execute 'DROP TABLE mongo_profiles'
- execute 'DROP TABLE mongo_people'
- execute 'DROP TABLE mongo_posts'
- execute 'DROP TABLE mongo_aspect_memberships'
- execute 'DROP TABLE mongo_aspects'
- end
-end
diff --git a/db/migrate/20110119060243_add_index_to_post_visibilities.rb b/db/migrate/20110119060243_add_index_to_post_visibilities.rb
deleted file mode 100644
index a2e682941..000000000
--- a/db/migrate/20110119060243_add_index_to_post_visibilities.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-class AddIndexToPostVisibilities < ActiveRecord::Migration
- def self.up
- add_index :post_visibilities, [:aspect_id, :post_id]
- end
-
- def self.down
- remove_index :post_visibilities, [:aspect_id, :post_id]
- end
-end
diff --git a/db/migrate/20110119221746_add_indicies.rb b/db/migrate/20110119221746_add_indicies.rb
deleted file mode 100644
index 13fe89a22..000000000
--- a/db/migrate/20110119221746_add_indicies.rb
+++ /dev/null
@@ -1,29 +0,0 @@
-class AddIndicies < ActiveRecord::Migration
- def self.up
- add_index :comments, :person_id
-
- add_index :invitations, :recipient_id
- add_index :invitations, :aspect_id
-
- add_index :notifications, :target_id
- add_index :notifications, :recipient_id
-
- add_index :posts, :status_message_id
- add_index :posts, [:status_message_id, :pending]
- add_index :posts, [:type, :pending, :id]
- end
-
- def self.down
- remove_index :comments, :person_id
-
- remove_index :invitations, :recipient_id
- remove_index :invitations, :aspect_id
-
- remove_index :notifications, :target_id
- remove_index :notifications, :recipient_id
-
- remove_index :posts, :status_message_id
- remove_index :posts, [:status_message_id, :pending]
- remove_index :posts, [:type, :pending, :id]
- end
-end
diff --git a/db/migrate/20110120181553_create_statistics.rb b/db/migrate/20110120181553_create_statistics.rb
deleted file mode 100644
index bf0fe9910..000000000
--- a/db/migrate/20110120181553_create_statistics.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-class CreateStatistics < ActiveRecord::Migration
- def self.up
- create_table :statistics do |t|
- t.integer :average
- t.string :type
- t.datetime :time
-
- t.timestamps
- end
- end
-
- def self.down
- drop_table :statistcs
- end
-end
diff --git a/db/migrate/20110120182100_create_data_points.rb b/db/migrate/20110120182100_create_data_points.rb
deleted file mode 100644
index d12351bed..000000000
--- a/db/migrate/20110120182100_create_data_points.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-class CreateDataPoints < ActiveRecord::Migration
- def self.up
- create_table :data_points do |t|
- t.string :key
- t.integer :value
- t.integer :statistic_id
-
- t.timestamps
- end
- add_index :data_points, :statistic_id
- end
-
- def self.down
- remove_index :data_points, :statistic_id
- drop_table :data_points
- end
-end
diff --git a/db/migrate/20110123210746_alter_string_columns.rb b/db/migrate/20110123210746_alter_string_columns.rb
deleted file mode 100644
index 895c98438..000000000
--- a/db/migrate/20110123210746_alter_string_columns.rb
+++ /dev/null
@@ -1,37 +0,0 @@
-class AlterStringColumns < ActiveRecord::Migration
- # This alters the tables to avoid a mysql bug
- # See http://bugs.joindiaspora.com/issues/835
- def self.up
- remove_index :profiles, :column => [:first_name, :searchable]
- remove_index :profiles, :column => [:last_name, :searchable]
- remove_index :profiles, :column => [:first_name, :last_name, :searchable]
- change_column(:profiles, :first_name, :string, :limit => 127)
- change_column(:profiles, :last_name, :string, :limit => 127)
- add_index :profiles, [:first_name, :searchable]
- add_index :profiles, [:last_name, :searchable]
- add_index :profiles, [:first_name, :last_name, :searchable]
-
- remove_index :mongo_notifications, :column => [:target_type, :target_mongo_id]
- change_column(:mongo_notifications, :target_type, :string, :limit => 127)
- change_column(:mongo_notifications, :target_mongo_id, :string, :limit => 127)
- add_index :mongo_notifications, [:target_type, :target_mongo_id]
-
- remove_index :mongo_profiles, :column => [:first_name, :searchable]
- remove_index :mongo_profiles, :column => [:last_name, :searchable]
- remove_index :mongo_profiles, :column => [:first_name, :last_name, :searchable]
- change_column(:mongo_profiles, :first_name, :string, :limit => 127)
- change_column(:mongo_profiles, :last_name, :string, :limit => 127)
- add_index :mongo_profiles, [:first_name, :searchable]
- add_index :mongo_profiles, [:last_name, :searchable]
- add_index :mongo_profiles, [:first_name, :last_name, :searchable]
-
- remove_index :mongo_requests, :column => :sender_mongo_id
- remove_index :mongo_requests, :column => :recipient_mongo_id
- remove_index :mongo_requests, :column => [:sender_mongo_id, :recipient_mongo_id]
- change_column(:mongo_requests, :sender_mongo_id, :string, :limit => 127)
- change_column(:mongo_requests, :recipient_mongo_id, :string, :limit => 127)
- add_index :mongo_requests, :sender_mongo_id
- add_index :mongo_requests, :recipient_mongo_id
- add_index :mongo_requests, [:sender_mongo_id, :recipient_mongo_id], :unique => true
- end
-end
diff --git a/db/migrate/20110125190034_unique_index_on_profile.rb b/db/migrate/20110125190034_unique_index_on_profile.rb
deleted file mode 100644
index de27e44d3..000000000
--- a/db/migrate/20110125190034_unique_index_on_profile.rb
+++ /dev/null
@@ -1,37 +0,0 @@
-class UniqueIndexOnProfile < ActiveRecord::Migration
- class Profile < ActiveRecord::Base; end
- def self.up
- if Profile.count > 0
- conn = ActiveRecord::Base.connection
- columns = conn.columns("profiles").map{|c| c.name}
- ["id", "created_at", "updated_at"].each{|n| columns.delete(n)}
-
- sql = <<-SQL
- SELECT profiles.person_id FROM profiles
- GROUP BY #{columns.join(',')}
- HAVING COUNT(*)>1 AND profiles.person_id IS NOT NULL;
- SQL
- result = conn.execute(sql)
- duplicate_person_ids = result.to_a.flatten
-
- undesired_profile_ids = []
- duplicate_person_ids.each do |person_id|
- profile_ids = conn.execute("
- SELECT profiles.id FROM profiles
- WHERE profiles.person_id = #{person_id};").to_a.flatten
- profile_ids.pop
- undesired_profile_ids.concat(profile_ids)
- end
- conn.execute("DELETE FROM profiles
- WHERE profiles.id IN (#{undesired_profile_ids.join(",")});") unless undesired_profile_ids.empty?
- end
-
- remove_index :profiles, :person_id
- add_index :profiles, :person_id, :unique => true
- end
-
- def self.down
- remove_index :profiles, :person_id
- add_index :profiles, :person_id
- end
-end
diff --git a/db/migrate/20110126015407_add_invitation_service_and_invitation_identifier_to_user.rb b/db/migrate/20110126015407_add_invitation_service_and_invitation_identifier_to_user.rb
deleted file mode 100644
index f3017f3be..000000000
--- a/db/migrate/20110126015407_add_invitation_service_and_invitation_identifier_to_user.rb
+++ /dev/null
@@ -1,13 +0,0 @@
-class AddInvitationServiceAndInvitationIdentifierToUser < ActiveRecord::Migration
- def self.up
- add_column(:users, :invitation_service, :string)
- add_column(:users, :invitation_identifier, :string)
-
- execute("UPDATE users SET invitation_service='email', invitation_identifier= email WHERE invitation_token IS NOT NULL;")
- end
-
- def self.down
- remove_column(:users, :invitation_service, :string)
- remove_column(:users, :invitation_identifier, :string)
- end
-end
diff --git a/db/migrate/20110126200714_add_contacts_visible.rb b/db/migrate/20110126200714_add_contacts_visible.rb
deleted file mode 100644
index b75d52329..000000000
--- a/db/migrate/20110126200714_add_contacts_visible.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-class AddContactsVisible < ActiveRecord::Migration
- def self.up
- add_column :aspects, :contacts_visible, :boolean, :default => true, :null => false
- add_index :aspects, [:user_id, :contacts_visible]
-
- ActiveRecord::Base.connection.execute <<-SQL
- UPDATE aspects
- SET contacts_visible = false
- WHERE contacts_visible IS NULL
- SQL
- end
-
- def self.down
- remove_index :aspects, [:user_id, :contacts_visible]
- remove_column :aspects, :contacts_visible
- end
-end
diff --git a/db/migrate/20110126225202_remove_unique_index_on_email_on_users.rb b/db/migrate/20110126225202_remove_unique_index_on_email_on_users.rb
deleted file mode 100644
index 28f620683..000000000
--- a/db/migrate/20110126225202_remove_unique_index_on_email_on_users.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-class RemoveUniqueIndexOnEmailOnUsers < ActiveRecord::Migration
- def self.up
- remove_index :users, :email
- add_index :users, :email
- end
-
- def self.down
- remove_index :users, :email
- add_index :users, :email, :unique => true
- end
-end
diff --git a/db/migrate/20110126232040_add_unique_index_on_invitation_service_and_invitation_identifier_to_users.rb b/db/migrate/20110126232040_add_unique_index_on_invitation_service_and_invitation_identifier_to_users.rb
deleted file mode 100644
index 8445447b2..000000000
--- a/db/migrate/20110126232040_add_unique_index_on_invitation_service_and_invitation_identifier_to_users.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-class AddUniqueIndexOnInvitationServiceAndInvitationIdentifierToUsers < ActiveRecord::Migration
- def self.up
- change_column(:users, :invitation_service, :string, :limit => 127)
- change_column(:users, :invitation_identifier, :string, :limit => 127)
- add_index(:users, [:invitation_service, :invitation_identifier], :unique => true)
- end
-
- def self.down
- remove_index(:users, [:invitation_service, :invitation_identifier])
- end
-end
diff --git a/db/migrate/20110127000931_drop_extra_columns.rb b/db/migrate/20110127000931_drop_extra_columns.rb
deleted file mode 100644
index e228ca96b..000000000
--- a/db/migrate/20110127000931_drop_extra_columns.rb
+++ /dev/null
@@ -1,10 +0,0 @@
-class DropExtraColumns < ActiveRecord::Migration
- def self.up
- remove_column :services, :provider
- remove_column :statistics, :type
- end
-
- def self.down
- raise ActiveRecord::IrreversibleMigration
- end
-end
diff --git a/db/migrate/20110127000953_make_fields_not_null.rb b/db/migrate/20110127000953_make_fields_not_null.rb
deleted file mode 100644
index 6a4fe84e5..000000000
--- a/db/migrate/20110127000953_make_fields_not_null.rb
+++ /dev/null
@@ -1,39 +0,0 @@
-class MakeFieldsNotNull < ActiveRecord::Migration
- def self.non_nullable_fields
- fields = {
- :aspect_memberships => [:aspect_id, :contact_id],
- :aspects => [:user_id, :name],
- :comments => [:text, :post_id, :person_id, :guid],
- :contacts => [:user_id, :person_id, :pending],
- :data_points => [:key, :value, :statistic_id],
- :invitations => [:recipient_id, :sender_id],
- :notifications => [:recipient_id, :actor_id, :action, :unread],
- :people => [:guid, :url, :diaspora_handle, :serialized_public_key],
- :post_visibilities => [:aspect_id, :post_id],
- :posts => [:person_id, :public, :guid, :pending, :type],
- :profiles => [:person_id, :searchable],
- :requests => [:sender_id, :recipient_id],
- :services => [:type, :user_id],
- :statistics => [:time],
- :users => [:getting_started, :invites, :disable_mail]
- }
- end
-
- def self.up
- remove_index(:profiles, :person_id)
- non_nullable_fields.each_pair do |table, columns|
- columns.each do |column|
- change_column_null(table, column, false)
- end
- end
- add_index :profiles, :person_id
- end
-
- def self.down
- non_nullable_fields.each_pair do |table, columns|
- columns.each do |column|
- change_column_null(table, column, true)
- end
- end
- end
-end
diff --git a/db/migrate/20110130072907_notification_multiple_people.rb b/db/migrate/20110130072907_notification_multiple_people.rb
deleted file mode 100644
index 883eb310f..000000000
--- a/db/migrate/20110130072907_notification_multiple_people.rb
+++ /dev/null
@@ -1,70 +0,0 @@
-class NotificationMultiplePeople < ActiveRecord::Migration
- def self.up
- create_table :notification_actors do |t|
- t.integer :notification_id
- t.integer :person_id
- t.timestamps
- end
-
- add_index :notification_actors, :notification_id
- add_index :notification_actors, [:notification_id, :person_id] , :unique => true
- add_index :notification_actors, :person_id ## if i am not mistaken we don't need this one because we won't query person.notifications
-
- note_ids = execute('select id from notifications').to_a
- unless note_ids.empty?
- #make the notification actors table
- execute "INSERT INTO notification_actors (notification_id, person_id) " +
- " SELECT id , actor_id " +
- " FROM notifications"
-
- #update the notifications to reference the post
- execute "UPDATE notifications, comments " +
- "SET notifications.target_id = comments.post_id, " +
- "target_type = 'Post' " +
- "WHERE (notifications.target_id = comments.id " +
- "AND (notifications.action = 'comment_on_post' " +
- "OR notifications.action = 'also_commented'))"
-
- #select all the notifications to keep
- execute "CREATE TEMPORARY TABLE keep_table " +
- "(SELECT id as keep_id, actor_id , target_type , target_id , recipient_id , action " +
- "FROM notifications WHERE action = 'comment_on_post' OR action = 'also_commented' " +
- "GROUP BY target_type , target_id , recipient_id , action) "
-
- #get a table of with ids of the notifications that need to be deleted and with the ones that need
- #to replace them
- execute "CREATE TEMPORARY TABLE keep_delete " +
- "( SELECT n1.keep_id, n2.id as delete_id, " +
- "n2.actor_id, n1.target_type, n1.target_id, n1.recipient_id, n1.action " +
- "FROM keep_table n1, notifications n2 " +
- "WHERE n1.keep_id != n2.id " +
- "AND n1.actor_id != n2.actor_id "+
- "AND n1.target_type = n2.target_type AND n1.target_id = n2.target_id " +
- "AND n1.recipient_id = n2.recipient_id AND n1.action = n2.action " +
- "AND (n1.action = 'comment_on_post' OR n1.action = 'also_commented') "+
- "GROUP BY n2.actor_id , n2.target_type , n2.target_id , n2.recipient_id , n2.action)"
-
- #have the notifications actors reference the notifications that need to be kept
- execute "UPDATE notification_actors, keep_delete "+
- "SET notification_actors.notification_id = keep_delete.keep_id "+
- "WHERE notification_actors.notification_id = keep_delete.delete_id"
-
- #delete all the notifications that need to be deleted
- execute "DELETE notifications.* " +
- "FROM notifications, keep_delete " +
- "WHERE notifications.id != keep_delete.keep_id AND "+
- "notifications.target_type = keep_delete.target_type AND "+
- "notifications.target_id = keep_delete.target_id AND "+
- "notifications.recipient_id = keep_delete.recipient_id AND "+
- "notifications.action = keep_delete.action"
- end
-
-
- remove_column :notifications, :actor_id
- remove_column :notifications, :mongo_id
- end
-
- def self.down
- raise ActiveRecord::IrreversibleMigration.new
- end
-end
diff --git a/db/migrate/20110202015222_add_open_to_aspects.rb b/db/migrate/20110202015222_add_open_to_aspects.rb
deleted file mode 100644
index cf5905c3d..000000000
--- a/db/migrate/20110202015222_add_open_to_aspects.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-class AddOpenToAspects < ActiveRecord::Migration
- def self.up
- add_column(:aspects, :open, :boolean, :default => false)
- end
-
- def self.down
- remove_column(:aspects, :open)
- end
-end
diff --git a/db/migrate/20110209204702_create_mentions.rb b/db/migrate/20110209204702_create_mentions.rb
deleted file mode 100644
index d4bbbf39e..000000000
--- a/db/migrate/20110209204702_create_mentions.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-class CreateMentions < ActiveRecord::Migration
- def self.up
- create_table :mentions do |t|
- t.integer :post_id, :null => false
- t.integer :person_id, :null => false
- end
- add_index :mentions, :post_id
- add_index :mentions, :person_id
- add_index :mentions, [:person_id, :post_id], :unique => true
- end
-
- def self.down
- drop_table :mentions
- end
-end
diff --git a/db/migrate/20110211021926_fix_target_on_notification.rb b/db/migrate/20110211021926_fix_target_on_notification.rb
deleted file mode 100644
index e79ea402b..000000000
--- a/db/migrate/20110211021926_fix_target_on_notification.rb
+++ /dev/null
@@ -1,29 +0,0 @@
-class FixTargetOnNotification < ActiveRecord::Migration
- def self.up
- note_ids = execute('select id from notifications').to_a
- unless note_ids.empty?
- execute("UPDATE notifications " +
- "SET target_type='Post' " +
- "WHERE action = 'comment_on_post' OR action = 'also_commented'")
-
- execute("UPDATE notifications " +
- "SET target_type='Request' " +
- "WHERE action = 'new_request' OR action = 'request_accepted'")
-
- execute("UPDATE notifications " +
- "SET target_type='Mention' " +
- "WHERE action = 'mentioned'")
-
- execute("create temporary table t1 "+
- "(select notifications.id as n_id " +
- "from notifications LEFT JOIN mentions "+
- "ON notifications.target_id = mentions.id "+
- "WHERE notifications.action = 'mentioned' AND mentions.id IS NULL)")
-
- execute("DELETE notifications.* FROM notifications, t1 WHERE notifications.id = t1.n_id")
- end
- end
-
- def self.down
- end
-end
diff --git a/db/migrate/20110211204804_unique_index_post_visibilities.rb b/db/migrate/20110211204804_unique_index_post_visibilities.rb
deleted file mode 100644
index 9c61da28a..000000000
--- a/db/migrate/20110211204804_unique_index_post_visibilities.rb
+++ /dev/null
@@ -1,39 +0,0 @@
-class UniqueIndexPostVisibilities < ActiveRecord::Migration
- def self.up
- visibility_ids = execute('select id from post_visibilities').to_a
- unless visibility_ids.empty?
- sql = <<-SQL
- SELECT `post_visibilities`.post_id, `post_visibilities`.aspect_id FROM `post_visibilities`
- GROUP BY post_id, aspect_id
- HAVING COUNT(*)>1;
- SQL
-
- result = execute(sql)
- dup_pvs = result.to_a
- undesired_ids = []
-
- dup_pvs.each do |arr|
- post_id, aspect_id = arr
- pv_ids = execute("
- SELECT `post_visibilities`.id FROM `post_visibilities`
- WHERE `post_visibilities`.post_id = #{post_id}
- AND `post_visibilities`.aspect_id = #{aspect_id};"
- ).to_a.flatten!
- pv_ids.pop
- undesired_ids.concat(pv_ids)
- end
- execute("DELETE FROM `post_visibilities` WHERE `post_visibilities`.id IN (#{undesired_ids.join(",")});") unless undesired_ids.empty?
-
- new_result = execute(sql)
- raise "Not all violating visibilities deleted, try migrating again if this is the first occurence" unless new_result.to_a.empty?
- end
-
- remove_index :post_visibilities, [:aspect_id, :post_id]
- add_index :post_visibilities, [:aspect_id, :post_id], :unique => true
- end
-
- def self.down
- remove_index :post_visibilities, [:aspect_id, :post_id]
- add_index :post_visibilities, [:aspect_id, :post_id]
- end
-end
diff --git a/db/migrate/20110213052742_add_more_indicies.rb b/db/migrate/20110213052742_add_more_indicies.rb
deleted file mode 100644
index 5cd3666b1..000000000
--- a/db/migrate/20110213052742_add_more_indicies.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-class AddMoreIndicies < ActiveRecord::Migration
- def self.up
- #For making validates_uniqueness_of, :case_sensitive => false, fast
- add_index :users, [:id, :username], :unique => true
- add_index :users, [:id, :email]
- add_index :people, [:id, :diaspora_handle], :unique => true
-
- #For the includes of photos in the stream
- add_index :posts, [:id, :type]
- end
-
- def self.down
- remove_index :users, [:id, :username]
- remove_index :users, [:id, :email]
- remove_index :people, [:id, :diaspora_handle]
-
- remove_index :posts, [:id, :type]
- end
-end
diff --git a/db/migrate/20110217044519_undo_adding_indicies.rb b/db/migrate/20110217044519_undo_adding_indicies.rb
deleted file mode 100644
index a5a8c7ccf..000000000
--- a/db/migrate/20110217044519_undo_adding_indicies.rb
+++ /dev/null
@@ -1,10 +0,0 @@
-class UndoAddingIndicies < ActiveRecord::Migration
- require Rails.root.join('db', 'migrate', '20110213052742_add_more_indicies')
- def self.up
- AddMoreIndicies.down
- end
-
- def self.down
- AddMoreIndicies.up
- end
-end
diff --git a/db/migrate/20110225190919_create_conversations_and_messages_and_visibilities.rb b/db/migrate/20110225190919_create_conversations_and_messages_and_visibilities.rb
deleted file mode 100644
index b9c7b9bf9..000000000
--- a/db/migrate/20110225190919_create_conversations_and_messages_and_visibilities.rb
+++ /dev/null
@@ -1,39 +0,0 @@
-class CreateConversationsAndMessagesAndVisibilities < ActiveRecord::Migration
- def self.up
- create_table :messages do |t|
- t.integer :conversation_id, :null => false
- t.integer :author_id, :null => false
- t.string :guid, :null => false
- t.text :text, :null => false
-
- t.timestamps
- end
-
- create_table :conversation_visibilities do |t|
- t.integer :conversation_id, :null => false
- t.integer :person_id, :null => false
- t.integer :unread, :null => false, :default => 0
-
- t.timestamps
- end
-
- create_table :conversations do |t|
- t.string :subject
- t.string :guid, :null => false
- t.integer :author_id, :null => false
-
- t.timestamps
- end
-
- add_index :conversation_visibilities, :person_id
- add_index :conversation_visibilities, :conversation_id
- add_index :conversation_visibilities, [:conversation_id, :person_id], :unique => true, :name => 'index_conversation_visibilities_usefully'
- add_index :messages, :author_id
- end
-
- def self.down
- drop_table :messages
- drop_table :conversations
- drop_table :conversation_visibilities
- end
-end
diff --git a/db/migrate/20110228180709_notification_subclasses.rb b/db/migrate/20110228180709_notification_subclasses.rb
deleted file mode 100644
index 18d210ac1..000000000
--- a/db/migrate/20110228180709_notification_subclasses.rb
+++ /dev/null
@@ -1,31 +0,0 @@
-class NotificationSubclasses < ActiveRecord::Migration
- def self.up
- add_column :notifications, :type, :string, :null => :false
- {:new_request => 'Notifications::NewRequest',
- :request_accepted => 'Notifications::RequestAccepted',
- :comment_on_post => 'Notifications::CommentOnPost',
- :also_commented => 'Notifications::AlsoCommented',
- :mentioned => 'Notifications::Mentioned'
- }.each_pair do |key, value|
- execute("UPDATE notifications
- set type = '#{value}'
- where action = '#{key.to_s}'")
- end
- remove_column :notifications, :action
- end
-
- def self.down
- add_column :notifications, :action, :string
- {:new_request => 'Notifications::NewRequest',
- :request_accepted => 'Notifications::RequestAccepted',
- :comment_on_post => 'Notifications::CommentOnPost',
- :also_commented => 'Notifications::AlsoCommented',
- :mentioned => 'Notifications::Mentioned'
- }.each_pair do |key, value|
- execute("UPDATE notifications
- set action = '#{key.to_s}'
- where type = '#{value}'")
- end
- remove_column :notifications, :type
- end
-end
diff --git a/db/migrate/20110228201109_foreign_key_constraints.rb b/db/migrate/20110228201109_foreign_key_constraints.rb
deleted file mode 100644
index 9904e1daa..000000000
--- a/db/migrate/20110228201109_foreign_key_constraints.rb
+++ /dev/null
@@ -1,63 +0,0 @@
-class ForeignKeyConstraints < ActiveRecord::Migration
- def self.disconnected_records dependent_table, dep_column, parent_table
- result = execute <<SQL
-SELECT #{dependent_table}.id FROM #{dependent_table}
-LEFT OUTER JOIN #{parent_table} ON #{dependent_table}.#{dep_column} = #{parent_table}.id
-WHERE #{parent_table}.id IS NULL;
-SQL
- result.to_a.flatten!
- end
-
- def self.delete_disconnected_records dependent_table, dep_column, parent_table
- bad_ids = disconnected_records dependent_table, dep_column, parent_table
- return unless bad_ids
- execute <<SQL
-DELETE FROM #{dependent_table}
-WHERE #{dependent_table}.id IN (#{bad_ids.join(',')});
-SQL
- end
-
- def self.up
- [['aspect_memberships', 'contact_id', 'contacts'],
- ['aspect_memberships', 'aspect_id', 'aspects'],
- ['comments', 'post_id', 'posts'],
- ['comments', 'person_id', 'people'],
- ['posts', 'person_id', 'people'],
- ['contacts', 'person_id', 'people'],
- ['invitations', 'sender_id', 'users'],
- ['invitations', 'recipient_id', 'users'],
- ['notification_actors', 'notification_id', 'notifications'],
- ['profiles', 'person_id', 'people'],
- ['requests', 'sender_id', 'people'],
- ['requests', 'recipient_id', 'people'],
- ['services', 'user_id', 'users']
- ].each do |array|
- delete_disconnected_records array[0], array[1], array[2]
- end
-
- add_foreign_key(:aspect_memberships, :contacts, :dependent => :delete)
- add_foreign_key(:aspect_memberships, :aspects, :dependent => :restrict)
-
- add_foreign_key(:comments, :posts, :dependent => :delete)
- add_foreign_key(:comments, :people, :dependent => :delete)
-
- add_foreign_key(:posts, :people, :dependent => :delete)
-
- add_foreign_key(:contacts, :people, :dependent => :delete)
-
- add_foreign_key(:invitations, :users, :dependent => :delete, :column => :sender_id)
- add_foreign_key(:invitations, :users, :dependent => :delete, :column => :recipient_id)
-
- add_foreign_key(:notification_actors, :notifications, :dependent => :delete)
-
- add_foreign_key(:profiles, :people, :dependent => :delete)
-
- add_foreign_key(:requests, :people, :dependent => :delete, :column => :sender_id)
- add_foreign_key(:requests, :people, :dependent => :delete, :column => :recipient_id)
-
- add_foreign_key(:services, :users, :dependent => :delete)
- end
-
- def self.down
- end
-end
diff --git a/db/migrate/20110228220810_rename_post_to_parent_and_creator_to_author.rb b/db/migrate/20110228220810_rename_post_to_parent_and_creator_to_author.rb
deleted file mode 100644
index ef43ad57a..000000000
--- a/db/migrate/20110228220810_rename_post_to_parent_and_creator_to_author.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-class RenamePostToParentAndCreatorToAuthor < ActiveRecord::Migration
- def self.up
- rename_column :comments, :creator_signature, :author_signature
- rename_column :comments, :post_creator_signature, :parent_author_signature
- end
-
- def self.down
- rename_column :comments, :author_signature, :creator_signature
- rename_column :comments, :parent_author_signature, :post_creator_signature
- end
-end
diff --git a/db/migrate/20110228233419_add_signatures_to_message.rb b/db/migrate/20110228233419_add_signatures_to_message.rb
deleted file mode 100644
index e6c72e761..000000000
--- a/db/migrate/20110228233419_add_signatures_to_message.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-class AddSignaturesToMessage < ActiveRecord::Migration
- def self.up
- add_column(:messages, :author_signature, :text)
- add_column(:messages, :parent_author_signature, :text)
- end
-
- def self.down
- remove_column(:messages, :author_signature)
- remove_column(:messages, :parent_author_signature)
- end
-end
diff --git a/db/migrate/20110301014507_rename_person_to_author.rb b/db/migrate/20110301014507_rename_person_to_author.rb
deleted file mode 100644
index 123392445..000000000
--- a/db/migrate/20110301014507_rename_person_to_author.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-class RenamePersonToAuthor < ActiveRecord::Migration
- def self.up
- remove_foreign_key(:comments, :people)
- remove_foreign_key(:posts, :people)
- rename_column :comments, :person_id, :author_id
- rename_column :posts, :person_id, :author_id
- add_foreign_key(:comments, :people, :column => :author_id, :dependent => :delete)
- add_foreign_key(:posts, :people, :column => :author_id, :dependent => :delete)
- end
-
- def self.down
- remove_foreign_key(:comments, :people, :column => :author_id)
- remove_foreign_key(:posts, :people, :column => :author_id)
- rename_column :comments, :author_id, :person_id
- rename_column :posts, :author_id, :person_id
- add_foreign_key(:comments, :people, :dependent => :delete)
- add_foreign_key(:posts, :people, :dependent => :delete)
- end
-end
diff --git a/db/migrate/20110301202619_drop_statistics.rb b/db/migrate/20110301202619_drop_statistics.rb
deleted file mode 100644
index 15ec9e366..000000000
--- a/db/migrate/20110301202619_drop_statistics.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-class DropStatistics < ActiveRecord::Migration
- def self.up
- execute 'DROP TABLE statistics'
- execute 'DROP TABLE data_points'
- end
-
- def self.down
- end
-end
diff --git a/db/migrate/20110311000150_acts_as_taggable_on_migration.rb b/db/migrate/20110311000150_acts_as_taggable_on_migration.rb
deleted file mode 100644
index 7c07fef22..000000000
--- a/db/migrate/20110311000150_acts_as_taggable_on_migration.rb
+++ /dev/null
@@ -1,28 +0,0 @@
-class ActsAsTaggableOnMigration < ActiveRecord::Migration
- def self.up
- create_table :tags do |t|
- t.string :name
- end
-
- create_table :taggings do |t|
- t.references :tag
-
- # You should make sure that the column created is
- # long enough to store the required class names.
- t.references :taggable, :polymorphic => {:limit => 127}
- t.references :tagger, :polymorphic => {:limit => 127}
-
- t.string :context, :limit => 127
-
- t.datetime :created_at
- end
-
- add_index :taggings, :tag_id
- add_index :taggings, [:taggable_id, :taggable_type, :context]
- end
-
- def self.down
- drop_table :taggings
- drop_table :tags
- end
-end
diff --git a/db/migrate/20110311183826_create_user_preferences.rb b/db/migrate/20110311183826_create_user_preferences.rb
deleted file mode 100644
index a8c942693..000000000
--- a/db/migrate/20110311183826_create_user_preferences.rb
+++ /dev/null
@@ -1,14 +0,0 @@
-class CreateUserPreferences < ActiveRecord::Migration
- def self.up
- create_table :user_preferences do |t|
- t.string :email_type
- t.integer :user_id
-
- t.timestamps
- end
- end
-
- def self.down
- drop_table :user_preferences
- end
-end
diff --git a/db/migrate/20110311220249_downcase_tags.rb b/db/migrate/20110311220249_downcase_tags.rb
deleted file mode 100644
index 0a85f528d..000000000
--- a/db/migrate/20110311220249_downcase_tags.rb
+++ /dev/null
@@ -1,26 +0,0 @@
-class DowncaseTags < ActiveRecord::Migration
- def self.consolidate_tags_with_name(name)
- tags = execute("SELECT * FROM tags WHERE tags.name = '#{name}';").to_a
- keep_tag = tags.pop
- tags.each do |bad_tag|
- execute("UPDATE taggings
- SET taggings.tag_id = #{keep_tag.first}
- WHERE taggings.tag_id = #{bad_tag.first};")
- execute("DELETE FROM tags WHERE tags.id = #{bad_tag.first};")
- end
- end
- def self.up
- execute('UPDATE tags
- SET name = LOWER(tags.name);')
-
- names_with_duplicates = execute('SELECT name FROM tags
- GROUP BY name
- HAVING COUNT(*)>1;').to_a.flatten!
- names_with_duplicates.each do |name|
- consolidate_tags_with_name(name)
- end unless names_with_duplicates.blank?
- end
-
- def self.down
- end
-end
diff --git a/db/migrate/20110313015438_rename_text_fields.rb b/db/migrate/20110313015438_rename_text_fields.rb
deleted file mode 100644
index 07019a5da..000000000
--- a/db/migrate/20110313015438_rename_text_fields.rb
+++ /dev/null
@@ -1,12 +0,0 @@
-class RenameTextFields < ActiveRecord::Migration
- def self.up
- rename_column :posts, :message, :text
- execute("UPDATE posts
- SET text = posts.caption
- WHERE posts.caption IS NOT NULL;")
- remove_column :posts, :caption
- end
-
- def self.down
- end
-end
diff --git a/db/migrate/20110314043119_drop_import_tables.rb b/db/migrate/20110314043119_drop_import_tables.rb
deleted file mode 100644
index c5dea3567..000000000
--- a/db/migrate/20110314043119_drop_import_tables.rb
+++ /dev/null
@@ -1,10 +0,0 @@
-require Rails.root.join('db', 'migrate', '20110105051803_create_import_tables')
-class DropImportTables < ActiveRecord::Migration
- def self.up
- CreateImportTables.down
- end
-
- def self.down
- CreateImportTables.up
- end
-end
diff --git a/db/migrate/20110317222802_guid_is_unique.rb b/db/migrate/20110317222802_guid_is_unique.rb
deleted file mode 100644
index ccda882ff..000000000
--- a/db/migrate/20110317222802_guid_is_unique.rb
+++ /dev/null
@@ -1,36 +0,0 @@
-class GuidIsUnique < ActiveRecord::Migration
- def self.consolidate_post(guid)
- post_ids = execute("select posts.id from posts where posts.guid = '#{guid}'").to_a.flatten!
- keep_id = post_ids.pop
- execute("UPDATE comments
- SET comments.post_id = #{keep_id}
- WHERE comments.post_id IN (#{post_ids.join(',')})")
-
- execute("UPDATE posts
- SET posts.status_message_id = #{keep_id}
- WHERE posts.status_message_id IN (#{post_ids.join(',')})")
-
- execute("DELETE FROM post_visibilities WHERE post_visibilities.post_id IN (#{post_ids.join(',')})")
- execute("DELETE FROM mentions WHERE mentions.post_id IN (#{post_ids.join(',')})")
- execute("DELETE FROM posts WHERE posts.id IN (#{post_ids.join(',')})")
- end
- def self.up
- sql = <<-SQL
- SELECT posts.guid FROM posts
- GROUP BY posts.guid
- HAVING COUNT(*)>1;
- SQL
- duplicated_guids = execute(sql).to_a.flatten!
-
- duplicated_guids.each do |guid|
- consolidate_post(guid)
- end if duplicated_guids
- remove_index :posts, :guid
- add_index :posts, :guid, :unique => true
- end
-
- def self.down
- remove_index :posts, :column => :guid
- add_index :posts, :guid
- end
-end
diff --git a/db/migrate/20110318000734_create_service_users.rb b/db/migrate/20110318000734_create_service_users.rb
deleted file mode 100644
index 7ac30e697..000000000
--- a/db/migrate/20110318000734_create_service_users.rb
+++ /dev/null
@@ -1,23 +0,0 @@
-class CreateServiceUsers < ActiveRecord::Migration
- def self.up
- create_table :service_users do |t|
- t.string :uid, :null => false
- t.string :name, :null => false
- t.string :photo_url, :null => false
- t.integer :service_id, :null => false
- t.integer :person_id
- t.integer :contact_id
- t.integer :request_id
- t.integer :invitation_id
-
- t.timestamps
- end
-
- add_index :service_users, :service_id
- add_index :service_users, [:uid, :service_id], :unique => true
- end
-
- def self.down
- drop_table :service_users
- end
-end
diff --git a/db/migrate/20110318012008_delete_disconnected_notifications.rb b/db/migrate/20110318012008_delete_disconnected_notifications.rb
deleted file mode 100644
index 71579127e..000000000
--- a/db/migrate/20110318012008_delete_disconnected_notifications.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-class DeleteDisconnectedNotifications < ActiveRecord::Migration
- def self.up
- result = execute("SELECT notifications.id FROM notifications
- LEFT OUTER JOIN posts ON posts.id = notifications.target_id
- WHERE posts.id IS NULL AND notifications.target_id IS NOT NULL AND notifications.target_type = 'Post'").to_a.flatten!
- execute("DELETE FROM notifications WHERE notifications.id IN (#{result.join(',')})") if result
- end
-
- def self.down
- end
-end
diff --git a/db/migrate/20110319005509_add_processed_to_post.rb b/db/migrate/20110319005509_add_processed_to_post.rb
deleted file mode 100644
index 2d63adb38..000000000
--- a/db/migrate/20110319005509_add_processed_to_post.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-class AddProcessedToPost < ActiveRecord::Migration
- def self.up
- add_column(:posts, :processed, :boolean, :default => true)
- end
-
- def self.down
- remove_column(:posts, :processed)
- end
-end
diff --git a/db/migrate/20110319172136_add_likes.rb b/db/migrate/20110319172136_add_likes.rb
deleted file mode 100644
index 096636f5d..000000000
--- a/db/migrate/20110319172136_add_likes.rb
+++ /dev/null
@@ -1,26 +0,0 @@
-class AddLikes < ActiveRecord::Migration
- def self.up
- result = execute("SELECT version FROM schema_migrations WHERE version = '201110319172136'")
- if result.count > 0
- execute("DELETE FROM schema_migrations WHERE version = '201110319172136'")
- else
- create_table :likes do |t|
- t.boolean :positive, :default => true
- t.integer :post_id
- t.integer :author_id
- t.string :guid
- t.text :author_signature
- t.text :parent_author_signature
- t.timestamps
- end
- add_index :likes, :guid, :unique => true
- add_index :likes, :post_id
- add_foreign_key(:likes, :posts)
- add_foreign_key(:likes, :people, :column => :author_id)
- end
- end
-
- def self.down
- drop_table :likes
- end
-end
diff --git a/db/migrate/20110321205715_unprocessed_image_uploader.rb b/db/migrate/20110321205715_unprocessed_image_uploader.rb
deleted file mode 100644
index 8cf85d7db..000000000
--- a/db/migrate/20110321205715_unprocessed_image_uploader.rb
+++ /dev/null
@@ -1,14 +0,0 @@
-require Rails.root.join('db', 'migrate', '20110319005509_add_processed_to_post')
-class UnprocessedImageUploader < ActiveRecord::Migration
- def self.up
- AddProcessedToPost.down
- rename_column :posts, :image, :processed_image
- add_column :posts, :unprocessed_image, :string
- end
-
- def self.down
- remove_column :posts, :unprocessed_image
- rename_column :posts, :processed_image, :image
- AddProcessedToPost.up
- end
-end
diff --git a/db/migrate/20110323213655_add_location_to_profile.rb b/db/migrate/20110323213655_add_location_to_profile.rb
deleted file mode 100644
index 1c3776212..000000000
--- a/db/migrate/20110323213655_add_location_to_profile.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-class AddLocationToProfile < ActiveRecord::Migration
- def self.up
- add_column :profiles, :location, :string
- end
-
- def self.down
- remove_column :profiles, :location
- end
-end
diff --git a/db/migrate/20110328175936_add_hidden_to_post_visibilities.rb b/db/migrate/20110328175936_add_hidden_to_post_visibilities.rb
deleted file mode 100644
index d663001be..000000000
--- a/db/migrate/20110328175936_add_hidden_to_post_visibilities.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-class AddHiddenToPostVisibilities < ActiveRecord::Migration
- def self.up
- add_column :post_visibilities, :hidden, :boolean, :default => false, :null => false
- add_index :post_visibilities, :hidden
- end
-
- def self.down
- remove_index :post_visibilities, :hidden
- remove_column :post_visibilities, :hidden
- end
-end
diff --git a/db/migrate/20110328202414_post_visibilities_on_contacts.rb b/db/migrate/20110328202414_post_visibilities_on_contacts.rb
deleted file mode 100644
index 1445f3a9f..000000000
--- a/db/migrate/20110328202414_post_visibilities_on_contacts.rb
+++ /dev/null
@@ -1,97 +0,0 @@
-class PostVisibilitiesOnContacts < ActiveRecord::Migration
- class PostVisibility < ActiveRecord::Base; end
- def self.move_author_pvs_to_aspect_pvs
- where_clause = <<SQL
- FROM post_visibilities as pv
- INNER JOIN aspects ON aspects.id = pv.aspect_id
- INNER JOIN posts ON posts.id = pv.post_id
- INNER JOIN people ON posts.author_id = people.id
- WHERE people.owner_id = aspects.user_id
-SQL
-
- execute("INSERT into aspect_visibilities SELECT pv.id, pv.post_id, pv.aspect_id, pv.created_at, pv.updated_at #{where_clause}")
-
- execute("DELETE pv #{where_clause}")
- end
-
- def self.set_pv_contact_ids
- execute <<SQL
- UPDATE post_visibilities as pv
- INNER JOIN posts ON posts.id = pv.post_id
- INNER JOIN people ON posts.author_id = people.id
- INNER JOIN aspects ON aspects.id = pv.aspect_id
- INNER JOIN users ON users.id = aspects.user_id
- INNER JOIN contacts ON contacts.user_id = users.id
- SET pv.contact_id = contacts.id
- WHERE people.id = contacts.person_id
-SQL
- end
-
- def self.delete_duplicate_pvs
- execute('DELETE FROM post_visibilities WHERE post_visibilities.contact_id = 0')
-
- duplicate_rows = execute <<SQL
- SELECT COUNT(pv.contact_id), pv.contact_id, pv.post_id from post_visibilities AS pv
- GROUP BY pv.contact_id, pv.post_id
- HAVING COUNT(*)>1;
-SQL
- duplicate_rows.each do |row|
- count = row.first
- contact_id = row[1]
- post_id = row.last
-
- execute <<SQL
- DELETE FROM post_visibilities
- WHERE post_visibilities.contact_id = #{contact_id} AND post_visibilities.post_id = #{post_id}
- LIMIT #{count-1}
-SQL
- end
- end
-
- def self.delete_disconnected_pvs
- execute <<SQL
- DELETE post_visibilities FROM post_visibilities
- LEFT OUTER JOIN posts ON post_visibilities.post_id = posts.id
- LEFT OUTER JOIN aspects ON post_visibilities.aspect_id = aspects.id
- WHERE aspects.id IS NULL OR posts.id IS NULL
-SQL
- end
-
- def self.pv_count
- @pv_count ||= PostVisibility.count
- end
-
- def self.up
- create_table :aspect_visibilities do |t|
- t.integer :post_id, :null => false
- t.integer :aspect_id, :null => false
- t.timestamps
- end
- add_index :aspect_visibilities, [:post_id, :aspect_id], :unique => true
- add_index :aspect_visibilities, [:aspect_id]
- add_index :aspect_visibilities, [:post_id]
- add_foreign_key :aspect_visibilities, :aspects, :dependent => :delete
- add_foreign_key :aspect_visibilities, :posts, :dependent => :delete
-
- delete_disconnected_pvs if pv_count > 0
-
- add_column :post_visibilities, :contact_id, :integer, :null => false
-
- move_author_pvs_to_aspect_pvs if pv_count > 0
- set_pv_contact_ids if pv_count > 0
-
- delete_duplicate_pvs if pv_count > 0
-
- remove_index :post_visibilities, [:aspect_id, :post_id]
- remove_column :post_visibilities, :aspect_id
-
- add_index :post_visibilities, [:contact_id, :post_id], :unique => true
- add_index :post_visibilities, [:contact_id]
- add_foreign_key :post_visibilities, :contacts, :dependent => :delete
- add_foreign_key :post_visibilities, :posts, :dependent => :delete
- end
-
- def self.down
- raise ActiveRecord::IrreversibleMigration
- end
-end
diff --git a/db/migrate/20110330175950_tag_uniqueness.rb b/db/migrate/20110330175950_tag_uniqueness.rb
deleted file mode 100644
index bd4a4cd55..000000000
--- a/db/migrate/20110330175950_tag_uniqueness.rb
+++ /dev/null
@@ -1,24 +0,0 @@
-class TagUniqueness < ActiveRecord::Migration
- def self.delete_duplicate_taggings
- duplicate_rows = execute <<SQL
- SELECT COUNT(t.taggable_id), t.taggable_id, t.taggable_type, t.tag_id FROM taggings AS t
- GROUP BY t.taggable_id, t.taggable_type, t.tag_id
- HAVING COUNT(*)>1;
-SQL
- duplicate_rows.each do |row|
- execute <<SQL
- DELETE FROM taggings
- WHERE taggings.taggable_id = #{row[1]} AND taggings.taggable_type = '#{row[2]}' AND taggings.tag_id = #{row[3]}
- LIMIT #{row[0]-1}
-SQL
- end
- end
- def self.up
- delete_duplicate_taggings
- add_index :taggings, [:taggable_id, :taggable_type, :tag_id], :unique => true, :name => 'index_taggings_uniquely'
- end
-
- def self.down
- remove_index :taggings, :name => 'index_taggings_uniquely'
- end
-end
diff --git a/db/migrate/20110330230206_pm_foreign_keys.rb b/db/migrate/20110330230206_pm_foreign_keys.rb
deleted file mode 100644
index a9218eb83..000000000
--- a/db/migrate/20110330230206_pm_foreign_keys.rb
+++ /dev/null
@@ -1,53 +0,0 @@
-class PmForeignKeys < ActiveRecord::Migration
- class Message < ActiveRecord::Base
- end
-
- def self.delete_disconnected_cvs
- execute <<SQL
- DELETE conversation_visibilities FROM conversation_visibilities
- LEFT OUTER JOIN conversations ON conversation_visibilities.conversation_id = conversations.id
- LEFT OUTER JOIN people ON conversation_visibilities.person_id = people.id
- WHERE people.id IS NULL OR conversations.id IS NULL
-SQL
- end
- def self.delete_disconnected_messages
- execute <<SQL
- DELETE messages FROM messages
- LEFT OUTER JOIN conversations ON messages.conversation_id = conversations.id
- LEFT OUTER JOIN people ON messages.author_id = people.id
- WHERE people.id IS NULL OR conversations.id IS NULL
-SQL
- end
- def self.delete_disconnected_conversations
- execute <<SQL
- DELETE conversations FROM conversations
- LEFT OUTER JOIN people ON conversations.author_id = people.id
- WHERE people.id IS NULL
-SQL
- end
- def self.up
- if Message.count > 0
- delete_disconnected_conversations
- delete_disconnected_messages
- delete_disconnected_cvs
- end
-
- add_foreign_key :conversation_visibilities, :conversations, :dependent => :delete
- add_foreign_key :conversation_visibilities, :people, :dependent => :delete
-
- add_foreign_key :messages, :conversations, :dependent => :delete
- add_foreign_key :messages, :people, :column => :author_id, :dependent => :delete
-
- add_foreign_key :conversations, :people, :column => :author_id, :dependent => :delete
- end
-
- def self.down
- remove_foreign_key :conversation_visibilities, :conversations
- remove_foreign_key :conversation_visibilities, :people
-
- remove_foreign_key :messages, :conversations
- remove_foreign_key :messages, :column => :author_id
-
- remove_foreign_key :conversations, :column => :author_id
- end
-end
diff --git a/db/migrate/20110331004720_add_hidden_indicies.rb b/db/migrate/20110331004720_add_hidden_indicies.rb
deleted file mode 100644
index 3c9779646..000000000
--- a/db/migrate/20110331004720_add_hidden_indicies.rb
+++ /dev/null
@@ -1,12 +0,0 @@
-class AddHiddenIndicies < ActiveRecord::Migration
- def self.up
- remove_index :post_visibilities, :hidden
- add_index :post_visibilities, [:post_id, :hidden, :contact_id], :unique => true
- end
-
-
- def self.down
- remove_index :post_visibilities, :column => [:post_id, :hidden, :contact_id]
- add_index :post_visibilities, :hidden
- end
-end
diff --git a/db/migrate/20110405170101_fix_stream_queries.rb b/db/migrate/20110405170101_fix_stream_queries.rb
deleted file mode 100644
index 4d5d2463f..000000000
--- a/db/migrate/20110405170101_fix_stream_queries.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-class FixStreamQueries < ActiveRecord::Migration
- def self.up
- change_column :posts, :type, :string, :limit => 40
- remove_index :posts, :type
- end
-
- def self.down
- add_index :posts, :type
- change_column :posts, :type, :string, :limit => 127
- end
-end
diff --git a/db/migrate/20110405171412_contact_remove_pending_add_sharing_and_receiving.rb b/db/migrate/20110405171412_contact_remove_pending_add_sharing_and_receiving.rb
deleted file mode 100644
index 4a18d85ef..000000000
--- a/db/migrate/20110405171412_contact_remove_pending_add_sharing_and_receiving.rb
+++ /dev/null
@@ -1,61 +0,0 @@
-class ContactRemovePendingAddSharingAndReceiving < ActiveRecord::Migration
- class Contact < ActiveRecord::Base; end
-
- def self.up
- add_column :contacts, :sharing, :boolean, :default => false, :null => false
- add_column :contacts, :receiving, :boolean, :default => false, :null => false
-
- if Contact.count > 0
- execute( <<SQL
- UPDATE contacts
- SET contacts.sharing = true, contacts.receiving = true
- WHERE contacts.pending = false
-SQL
-)
-
- execute( <<SQL
- DELETE user_preferences.* FROM user_preferences
- WHERE user_preferences.email_type = 'request_acceptance'
- OR user_preferences.email_type = 'request_received'
-SQL
-)
- end
-
- remove_foreign_key "contacts", "people"
- remove_index :contacts, [:person_id, :pending]
- remove_index :contacts, [:user_id, :pending]
-
- add_index :contacts, :person_id
- add_foreign_key "contacts", "people", :name => "contacts_person_id_fk", :dependent => :delete
-
- remove_column :contacts, :pending
-
- remove_foreign_key :aspect_memberships, :aspects
- add_foreign_key :aspect_memberships, :aspects, :dependent => :delete
- end
-
- def self.down
-
- remove_foreign_key "contacts", "people"
- remove_index :contacts, :person_id
-
- add_column :contacts, :pending, :default => true, :null => false
- add_index :contacts, [:user_id, :pending]
-
- add_index :contacts, [:person_id, :pending]
- add_foreign_key "contacts", "people", :name => "contacts_person_id_fk", :dependent => :delete
-
- execute( <<SQL
- UPDATE contacts
- SET contacts.pending = false
- WHERE contacts.receiving = true AND contacts.sharing = true
-SQL
-)
-
- remove_column :contacts, :sharing
- remove_column :contacts, :receiving
-
- remove_foreign_key :aspect_memberships, :aspects
- add_foreign_key :aspect_memberships, :aspects
- end
-end
diff --git a/db/migrate/20110406202932_drop_requests_table.rb b/db/migrate/20110406202932_drop_requests_table.rb
deleted file mode 100644
index f90b17789..000000000
--- a/db/migrate/20110406202932_drop_requests_table.rb
+++ /dev/null
@@ -1,40 +0,0 @@
-class DropRequestsTable < ActiveRecord::Migration
- class Contact < ActiveRecord::Base; end
-
- def self.up
- remove_foreign_key :requests, :column => :recipient_id
- remove_foreign_key :requests, :column => :sender_id
-
- remove_index :requests, :mongo_id
- remove_index :requests, :recipient_id
- remove_index :requests, [:sender_id, :recipient_id]
- remove_index :requests, :sender_id
-
- execute 'DROP TABLE requests'
-
- execute( <<SQL
- DELETE contacts.* FROM contacts
- WHERE contacts.sharing = false
-SQL
- ) if Contact.count > 0
- end
-
- def self.down
- create_table :requests, :force => true do |t|
- t.integer :sender_id, :null => false
- t.integer :recipient_id, :null => false
- t.integer :aspect_id
- t.datetime :created_at
- t.datetime :updated_at
- t.string :mongo_id
- end
-
- add_index :requests, ["mongo_id"], :name => "index_requests_on_mongo_id"
- add_index :requests, ["recipient_id"], :name => "index_requests_on_recipient_id"
- add_index :requests, ["sender_id", "recipient_id"], :name => "index_requests_on_sender_id_and_recipient_id", :unique => true
- add_index :requests, ["sender_id"], :name => "index_requests_on_sender_id"
-
- add_foreign_key :requests, :people, :column => "recipient_id", :dependent => :delete
- add_foreign_key :requests, :people, :column => "sender_id", :dependent => :delete
- end
-end
diff --git a/db/migrate/20110406203720_tag_name_uniqueness.rb b/db/migrate/20110406203720_tag_name_uniqueness.rb
deleted file mode 100644
index 7b3ed72d5..000000000
--- a/db/migrate/20110406203720_tag_name_uniqueness.rb
+++ /dev/null
@@ -1,45 +0,0 @@
-class TagNameUniqueness < ActiveRecord::Migration
- class Tag < ActiveRecord::Base; end
-
- def self.downcase_tags
- execute <<SQL
- UPDATE tags
- SET tags.name = LOWER(tags.name)
- WHERE tags.name != LOWER(tags.name)
-SQL
- end
- def self.consolidate_duplicate_tags
- duplicate_rows = execute <<SQL
- SELECT count(tags.name), tags.name FROM tags
- GROUP BY tags.name
- HAVING COUNT(*) > 1
-SQL
- duplicate_rows.each do |row|
- name = row.last
- tag_ids = execute("SELECT tags.id FROM tags WHERE tags.name = '#{name}'").to_a.flatten!
- id_to_keep = tag_ids.pop
- execute <<SQL
- UPDATE IGNORE taggings
- SET taggings.tag_id = #{id_to_keep}
- WHERE taggings.tag_id IN (#{tag_ids.join(',')})
-SQL
- execute <<SQL
- DELETE FROM taggings WHERE taggings.tag_id IN (#{tag_ids.join(',')})
-SQL
-
- execute("DELETE FROM tags WHERE tags.id IN (#{tag_ids.join(',')})")
- end
- end
-
- def self.up
- if Tag.count > 0
- downcase_tags
- consolidate_duplicate_tags
- end
- add_index :tags, :name, :unique => true
- end
-
- def self.down
- raise ActiveRecord::IrreversibleMigration.new
- end
-end
diff --git a/db/migrate/20110421120744_downcase_usernames.rb b/db/migrate/20110421120744_downcase_usernames.rb
deleted file mode 100644
index 34582eb63..000000000
--- a/db/migrate/20110421120744_downcase_usernames.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-class DowncaseUsernames < ActiveRecord::Migration
- class User < ActiveRecord::Base; end
-
- def self.up
- execute <<SQL if User.count > 0
- UPDATE users
- SET users.username = LOWER(users.username)
- WHERE users.username != LOWER(users.username)
-SQL
- end
-
- def self.down
- raise ActiveRecord::IrreversibleMigration.new
- end
-end
diff --git a/db/migrate/20110507212759_remove_type_null_notifications.rb b/db/migrate/20110507212759_remove_type_null_notifications.rb
deleted file mode 100644
index e2e023f9f..000000000
--- a/db/migrate/20110507212759_remove_type_null_notifications.rb
+++ /dev/null
@@ -1,13 +0,0 @@
-class RemoveTypeNullNotifications < ActiveRecord::Migration
- def self.up
- execute <<SQL
- DELETE FROM notifications
- WHERE type IS NULL
-SQL
- end
-
- def self.down
- raise ActiveRecord::IrreversibleMigration.new
- end
-end
-
diff --git a/db/migrate/20110513175000_eliminate_stray_user_records.rb b/db/migrate/20110513175000_eliminate_stray_user_records.rb
deleted file mode 100644
index c06d325cb..000000000
--- a/db/migrate/20110513175000_eliminate_stray_user_records.rb
+++ /dev/null
@@ -1,32 +0,0 @@
-class EliminateStrayUserRecords < ActiveRecord::Migration
- class User < ActiveRecord::Base; end
-
- def self.up
- return unless User.count > 0
- duplicated_emails = execute("SELECT LOWER(email) from users WHERE users.email != '' GROUP BY LOWER(email) HAVING COUNT(*) > 1").to_a
- duplicated_emails.each do |email|
- records = execute("SELECT users.id, users.username, users.created_at from users WHERE LOWER(users.email) = '#{email}'").to_a
- with_username = records.select { |r| !r[1].blank? }
- if with_username.length == 1
- execute("DELETE FROM users WHERE LOWER(users.email) = '#{email}' AND users.username IS NULL")
- end
- if with_username.length == 0 && !email.blank?
- newest_record = records.sort_by{|r| r[2].to_i}.last
- execute("DELETE FROM users WHERE LOWER(users.email) = '#{email}' AND users.id != #{newest_record[0]}")
- end
- end
- execute <<SQL
- UPDATE users
- SET users.username = LOWER(users.username)
- WHERE users.username != LOWER(users.username)
-SQL
- execute <<SQL
- UPDATE users
- SET users.email = LOWER(users.email)
- WHERE users.email != LOWER(users.email)
-SQL
- end
-
- def self.down
- end
-end
diff --git a/db/migrate/20110514182918_update_devise_invitable.rb b/db/migrate/20110514182918_update_devise_invitable.rb
deleted file mode 100644
index 7efdb3992..000000000
--- a/db/migrate/20110514182918_update_devise_invitable.rb
+++ /dev/null
@@ -1,13 +0,0 @@
-class UpdateDeviseInvitable < ActiveRecord::Migration
- def self.up
- add_column(:users, :invitation_limit, :integer)
- add_column(:users, :invited_by_id, :integer)
- add_column(:users, :invited_by_type, :string)
- end
-
- def self.down
- remove_column(:users, :invited_by_type)
- remove_column(:users, :invited_by_id)
- remove_column(:users, :invitation_limit)
- end
-end
diff --git a/db/migrate/20110517180148_delete_all_new_request_notifications.rb b/db/migrate/20110517180148_delete_all_new_request_notifications.rb
deleted file mode 100644
index 857f23070..000000000
--- a/db/migrate/20110517180148_delete_all_new_request_notifications.rb
+++ /dev/null
@@ -1,14 +0,0 @@
-class DeleteAllNewRequestNotifications < ActiveRecord::Migration
- class Notification < ActiveRecord::Base; end
- def self.up
- execute <<SQL if Notification.count > 0
- DELETE notifications.* FROM notifications
- WHERE notifications.type = 'Notifications::NewRequest'
- OR notifications.type = 'Notifications::RequestAccepted'
-SQL
- end
-
- def self.down
- raise ActiveRecord::IrreversibleMigration.new
- end
-end
diff --git a/db/migrate/20110518010050_disable_password_reset_for_accounts_without_usernames.rb b/db/migrate/20110518010050_disable_password_reset_for_accounts_without_usernames.rb
deleted file mode 100644
index d8dce2ba3..000000000
--- a/db/migrate/20110518010050_disable_password_reset_for_accounts_without_usernames.rb
+++ /dev/null
@@ -1,16 +0,0 @@
-class DisablePasswordResetForAccountsWithoutUsernames < ActiveRecord::Migration
- class User < ActiveRecord::Base; end
- def self.up
- execute <<SQL if User.count > 0
- UPDATE users
- SET email = ""
- WHERE username IS NULL
- AND invitation_identifier IS NOT NULL
- AND invitation_service = 'email'
-SQL
- end
-
- def self.down
- raise ActiveRecord::IrreversibleMigration.new
- end
-end
diff --git a/db/migrate/20110518184453_add_token_auth_to_user.rb b/db/migrate/20110518184453_add_token_auth_to_user.rb
deleted file mode 100644
index 8e7831291..000000000
--- a/db/migrate/20110518184453_add_token_auth_to_user.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-class AddTokenAuthToUser < ActiveRecord::Migration
- def self.up
- add_column(:users, :authentication_token, :string, :limit => 30)
- add_index(:users, :authentication_token, :unique => true)
- end
-
- def self.down
- remove_index(:users, :column => :authentication_token)
- remove_column(:users, :authentication_token)
- end
-end
diff --git a/db/migrate/20110518222303_add_column_for_activity_streams_photo.rb b/db/migrate/20110518222303_add_column_for_activity_streams_photo.rb
deleted file mode 100644
index 0927da02e..000000000
--- a/db/migrate/20110518222303_add_column_for_activity_streams_photo.rb
+++ /dev/null
@@ -1,21 +0,0 @@
-class AddColumnForActivityStreamsPhoto < ActiveRecord::Migration
- def self.up
- add_column(:posts, :object_url, :string)
- add_column(:posts, :image_url, :string)
- add_column(:posts, :image_height, :integer)
- add_column(:posts, :image_width, :integer)
-
- add_column(:posts, :provider_display_name, :string)
- add_column(:posts, :actor_url, :string)
- end
-
- def self.down
- remove_column(:posts, :actor_url)
- remove_column(:posts, :provider_display_name)
-
- remove_column(:posts, :image_width)
- remove_column(:posts, :image_height)
- remove_column(:posts, :image_url)
- remove_column(:posts, :object_url)
- end
-end
diff --git a/db/migrate/20110524184202_add_object_id_to_post.rb b/db/migrate/20110524184202_add_object_id_to_post.rb
deleted file mode 100644
index 5245032da..000000000
--- a/db/migrate/20110524184202_add_object_id_to_post.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-class AddObjectIdToPost < ActiveRecord::Migration
- class Post < ActiveRecord::Base; end
- def self.up
- add_column(:posts, :objectId, :integer)
- execute("UPDATE posts SET objectId = object_url") if Post.count > 0
- end
-
- def self.down
- remove_column(:posts, :objectId, :integer)
- end
-end
diff --git a/db/migrate/20110525213325_add_root_id_to_posts.rb b/db/migrate/20110525213325_add_root_id_to_posts.rb
deleted file mode 100644
index 8deeed9d4..000000000
--- a/db/migrate/20110525213325_add_root_id_to_posts.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-class AddRootIdToPosts < ActiveRecord::Migration
- def self.up
- add_column :posts, :root_guid, :string, :limit => 30
- end
-
- def self.down
- remove_column :posts, :root_guid
- end
-end
diff --git a/db/migrate/20110527135552_photo_status_message_association_on_guid.rb b/db/migrate/20110527135552_photo_status_message_association_on_guid.rb
deleted file mode 100644
index a48759d71..000000000
--- a/db/migrate/20110527135552_photo_status_message_association_on_guid.rb
+++ /dev/null
@@ -1,46 +0,0 @@
-class PhotoStatusMessageAssociationOnGuid < ActiveRecord::Migration
- class Post < ActiveRecord::Base
- attr_accessible :id, :guid, :status_message_id, :status_message_guid
- self.inheritance_column = :_type_disabled
- end
-
- def self.up
- add_column :posts, :status_message_guid, :string
-
- Post.record_timestamps = false
- photos = Post.where(Post.arel_table[:status_message_id].not_eq(nil).and(Post.arel_table[:type].eq('Photo')))
- photos.each do |photo|
- if Post.where(:id => photo.status_message_id).exists?
- status_message = Post.find(photo.status_message_id)
- photo.update_attributes(:status_message_guid => status_message.guid)
- end
- end
-
- remove_index :posts, [:status_message_id]
- remove_index :posts, [:status_message_id, :pending]
- add_index :posts, :status_message_guid
- add_index :posts, [:status_message_guid, :pending]
-
- remove_column :posts, :status_message_id
- end
-
- def self.down
- add_column :posts, :status_message_id, :integer
-
- Post.record_timestamps = false
- photos = Post.where(Post.arel_table[:status_message_guid].not_eq(nil).and(Post.arel_table[:type].eq('Photo')))
- photos.each do |photo|
- if Post.where(:guid => photo.status_message_guid).exists?
- status_message = Post.where(:guid => photo.status_message_guid).first
- photo.update_attributes(:status_message_id => status_message.id)
- end
- end
-
- remove_index :posts, [:status_message_guid, :pending]
- remove_index :posts, :status_message_guid
- add_index :posts, :status_message_id
- add_index :posts, [:status_message_id, :pending]
-
- remove_column :posts, :status_message_guid
- end
-end
diff --git a/db/migrate/20110601083310_add_unconfirmed_email_to_users.rb b/db/migrate/20110601083310_add_unconfirmed_email_to_users.rb
deleted file mode 100644
index 9c295e557..000000000
--- a/db/migrate/20110601083310_add_unconfirmed_email_to_users.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-class AddUnconfirmedEmailToUsers < ActiveRecord::Migration
- def self.up
- add_column :users, :unconfirmed_email, :string, :default => nil, :null => true
- end
-
- def self.down
- remove_column :users, :unconfirmed_email
- end
-end
diff --git a/db/migrate/20110601091059_add_confirm_email_token_to_users.rb b/db/migrate/20110601091059_add_confirm_email_token_to_users.rb
deleted file mode 100644
index 4c71e97b2..000000000
--- a/db/migrate/20110601091059_add_confirm_email_token_to_users.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-class AddConfirmEmailTokenToUsers < ActiveRecord::Migration
- def self.up
- add_column :users, :confirm_email_token, :string, :limit => 30
- end
-
- def self.down
- remove_column :users, :confirm_email_token
- end
-end
diff --git a/db/migrate/20110603181015_lockable_users.rb b/db/migrate/20110603181015_lockable_users.rb
deleted file mode 100644
index 9aaba72e0..000000000
--- a/db/migrate/20110603181015_lockable_users.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-class LockableUsers < ActiveRecord::Migration
- def self.up
- add_column :users, :locked_at, :datetime
- end
-
- def self.down
- remove_column :users, :locked_at
- end
-end
diff --git a/db/migrate/20110603212633_likes_dependent_delete.rb b/db/migrate/20110603212633_likes_dependent_delete.rb
deleted file mode 100644
index 9ec425b20..000000000
--- a/db/migrate/20110603212633_likes_dependent_delete.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-class LikesDependentDelete < ActiveRecord::Migration
- def self.up
- remove_foreign_key :likes, :column => :author_id
- remove_foreign_key :likes, :post
- add_foreign_key(:likes, :posts, :dependent => :delete)
- add_foreign_key(:likes, :people, :column => :author_id, :dependent => :delete)
- end
-
- def self.down
- remove_foreign_key(:likes, :posts)
- remove_foreign_key(:likes, :people, :column => :author_id)
- add_foreign_key :likes, :people, :column => :author_id
- add_foreign_key :likes, :post
- end
-end
diff --git a/db/migrate/20110603233202_drop_aspects_open.rb b/db/migrate/20110603233202_drop_aspects_open.rb
deleted file mode 100644
index 19f2adde0..000000000
--- a/db/migrate/20110603233202_drop_aspects_open.rb
+++ /dev/null
@@ -1,10 +0,0 @@
-class DropAspectsOpen < ActiveRecord::Migration
- require Rails.root.join("db", "migrate", "20110202015222_add_open_to_aspects")
- def self.up
- AddOpenToAspects.down
- end
-
- def self.down
- AddOpenToAspects.up
- end
-end
diff --git a/db/migrate/20110604012703_drop_mongo_remains.rb b/db/migrate/20110604012703_drop_mongo_remains.rb
deleted file mode 100644
index 212702d29..000000000
--- a/db/migrate/20110604012703_drop_mongo_remains.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-class DropMongoRemains < ActiveRecord::Migration
- def self.up
- remove_index :aspects, :mongo_id
- remove_index :comments, :mongo_id
- remove_index :contacts, :mongo_id
- remove_index :invitations, :mongo_id
- remove_index :people, :mongo_id
- remove_index :posts, :mongo_id
- remove_index :profiles, :mongo_id
- remove_index :services, :mongo_id
- remove_index :users, :mongo_id
-
- execute 'DROP TABLE mongo_notifications'
- end
-
- def self.down
- end
-end
diff --git a/db/migrate/20110604204533_index_on_remember_token.rb b/db/migrate/20110604204533_index_on_remember_token.rb
deleted file mode 100644
index 6351a6a99..000000000
--- a/db/migrate/20110604204533_index_on_remember_token.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-class IndexOnRememberToken < ActiveRecord::Migration
- def self.up
- add_index :users, :remember_token, :unique => true
- end
-
- def self.down
- remove_index :users, :column => :remember_token
- end
-end
diff --git a/db/migrate/20110606192307_drop_mongo_ids.rb b/db/migrate/20110606192307_drop_mongo_ids.rb
deleted file mode 100644
index 159a1f07e..000000000
--- a/db/migrate/20110606192307_drop_mongo_ids.rb
+++ /dev/null
@@ -1,29 +0,0 @@
-class DropMongoIds < ActiveRecord::Migration
- def self.up
- remove_column :aspects, :mongo_id
- remove_column :aspects, :user_mongo_id
- remove_column :comments, :mongo_id
- remove_column :contacts, :mongo_id
- remove_column :invitations, :mongo_id
- remove_column :people, :mongo_id
- remove_column :posts, :mongo_id
- remove_column :profiles, :mongo_id
- remove_column :services, :mongo_id
- remove_column :services, :user_mongo_id
- remove_column :users, :mongo_id
- end
-
- def self.down
- add_column :users, :mongo_id
- add_column :services, :user_mongo_id
- add_column :services, :mongo_id
- add_column :profiles, :mongo_id
- add_column :posts, :mongo_id
- add_column :people, :mongo_id
- add_column :invitations, :mongo_id
- add_column :contacts, :mongo_id
- add_column :comments, :mongo_id
- add_column :aspects, :user_mongo_id
- add_column :aspects, :mongo_id
- end
-end
diff --git a/db/migrate/20110623210918_add_o_auth2_support.rb b/db/migrate/20110623210918_add_o_auth2_support.rb
deleted file mode 100644
index 3118a56b4..000000000
--- a/db/migrate/20110623210918_add_o_auth2_support.rb
+++ /dev/null
@@ -1,65 +0,0 @@
-class AddOAuth2Support < ActiveRecord::Migration
- def self.up
- create_table 'oauth_clients', :force => true do |t|
- t.string 'name', :limit => 127, :null => false
- t.text 'description', :null => false
- t.string 'application_base_url', :limit => 127, :null => false
- t.string 'icon_url', :limit => 127, :null => false
-
- t.string 'oauth_identifier', :limit => 32, :null => false
- t.string 'oauth_secret', :limit => 32, :null => false
- t.string 'nonce', :limit => 64
- t.text 'public_key', :null => false
- t.text 'permissions_overview', :null => false
- end
-
- add_index :oauth_clients, :name, :unique => true
- add_index :oauth_clients, :application_base_url, :unique => true
- add_index :oauth_clients, :nonce, :unique => true
-
- create_table 'oauth_authorization_codes', :force => true do |t|
- t.integer 'authorization_id', :null => false
- t.string 'code', :limit => 32, :null => false
- t.datetime 'expires_at'
- t.datetime 'created_at'
- t.datetime 'updated_at'
- t.string 'redirect_uri'
- end
-
- create_table 'oauth_authorizations', :force => true do |t|
- t.integer 'client_id', :null => false
- t.integer 'resource_owner_id'
- t.string 'resource_owner_type', :limit => 32
- t.string 'scope'
- t.datetime 'expires_at'
- end
-
- create_table 'oauth_access_tokens', :force => true do |t|
- t.integer 'authorization_id', :null => false
- t.string 'access_token', :limit => 32, :null => false
- t.string 'refresh_token', :limit => 32
- t.datetime 'expires_at'
- t.datetime 'created_at'
- t.datetime 'updated_at'
- end
-
- add_index "oauth_authorizations", ["resource_owner_id", "resource_owner_type", "client_id"], :unique => true, :name => "index_oauth_authorizations_on_resource_owner_and_client_id"
- end
-
- def self.down
- remove_index "oauth_authorizations", :name => "index_oauth_authorizations_on_resource_owner_and_client_id"
-
- drop_table 'oauth_access_tokens'
-
- drop_table 'oauth_authorizations'
-
- drop_table 'oauth_authorization_codes'
-
- remove_index :oauth_clients, :column => :nonce
- remove_index :oauth_clients, :column => :application_base_url
- remove_index :oauth_clients, :column => :name
-
- drop_table 'oauth_clients'
- end
-
-end
diff --git a/db/migrate/20110701215925_create_tag_followings.rb b/db/migrate/20110701215925_create_tag_followings.rb
deleted file mode 100644
index aa5443702..000000000
--- a/db/migrate/20110701215925_create_tag_followings.rb
+++ /dev/null
@@ -1,14 +0,0 @@
-class CreateTagFollowings < ActiveRecord::Migration
- def self.up
- create_table :tag_followings do |t|
- t.integer :tag_id, :null => false
- t.integer :user_id, :null => false
-
- t.timestamps
- end
- end
-
- def self.down
- drop_table :tag_followings
- end
-end
diff --git a/db/migrate/20110705003445_counter_cache_on_post_likes.rb b/db/migrate/20110705003445_counter_cache_on_post_likes.rb
deleted file mode 100644
index 6e08f5577..000000000
--- a/db/migrate/20110705003445_counter_cache_on_post_likes.rb
+++ /dev/null
@@ -1,14 +0,0 @@
-class CounterCacheOnPostLikes < ActiveRecord::Migration
- class Post < ActiveRecord::Base; end
- def self.up
- add_column :posts, :likes_count, :integer, :default => 0
- execute <<SQL if Post.count > 0
- UPDATE posts
- SET posts.likes_count = (SELECT COUNT(*) FROM likes WHERE likes.post_id = posts.id)
-SQL
- end
-
- def self.down
- remove_column :posts, :likes_count
- end
-end
diff --git a/db/migrate/20110707221112_index_taggings_created_at.rb b/db/migrate/20110707221112_index_taggings_created_at.rb
deleted file mode 100644
index 136d72d44..000000000
--- a/db/migrate/20110707221112_index_taggings_created_at.rb
+++ /dev/null
@@ -1,8 +0,0 @@
-class IndexTaggingsCreatedAt < ActiveRecord::Migration
- def self.up
- add_index :taggings, :created_at
- end
-
- def self.down
- end
-end
diff --git a/db/migrate/20110707234802_likes_on_comments.rb b/db/migrate/20110707234802_likes_on_comments.rb
deleted file mode 100644
index 67b039332..000000000
--- a/db/migrate/20110707234802_likes_on_comments.rb
+++ /dev/null
@@ -1,39 +0,0 @@
-class LikesOnComments < ActiveRecord::Migration
- class Like < ActiveRecord::Base; end
- def self.up
- remove_foreign_key :likes, :posts
-
- add_column :likes, :target_type, :string, :limit => 60, :null => false
- rename_column :likes, :post_id, :target_id
-
- add_column :comments, :likes_count, :integer, :default => 0, :null => false
-
- execute <<SQL
- UPDATE likes
- SET target_type = 'Post'
-SQL
- execute <<SQL
- UPDATE posts
- SET likes_count = (SELECT COUNT(*) FROM likes WHERE likes.target_id = posts.id AND likes.target_type = 'Post')
-SQL
-
- #There are some duplicate likes.
- if Like.count > 0
- keeper_likes = Like.group(:target_id, :author_id, :target_type).having('COUNT(*) > 1')
- keeper_likes.each do |like|
- l = Like.arel_table
- Like.where(:target_id => like.target_id, :author_id => like.author_id, :target_type => like.target_type).where(l[:id].not_eq(like.id)).delete_all
- end
- end
- add_index :likes, [:target_id, :author_id, :target_type], :unique => true
- end
-
- def self.down
- remove_column :comments, :likes_count
-
- remove_column :likes, :target_type
- rename_column :likes, :target_id, :post_id
- add_index :likes, :post_id
- remove_index :likes, :target_id
- end
-end
diff --git a/db/migrate/20110710102747_add_order_id_to_aspects.rb b/db/migrate/20110710102747_add_order_id_to_aspects.rb
deleted file mode 100644
index ab70b1d32..000000000
--- a/db/migrate/20110710102747_add_order_id_to_aspects.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-class AddOrderIdToAspects < ActiveRecord::Migration
- def self.up
- add_column :aspects, :order_id, :integer
- end
-
- def self.down
- remove_column :aspects, :order_id
- end
-end
diff --git a/db/migrate/20110729045734_add_full_name_to_profile.rb b/db/migrate/20110729045734_add_full_name_to_profile.rb
deleted file mode 100644
index aa79ae78f..000000000
--- a/db/migrate/20110729045734_add_full_name_to_profile.rb
+++ /dev/null
@@ -1,29 +0,0 @@
-class AddFullNameToProfile < ActiveRecord::Migration
- class Profile < ActiveRecord::Base; end
- def self.up
- add_column :profiles, :full_name, :string, :limit => 70
-
- add_index :profiles, :full_name
- add_index :profiles, [:full_name, :searchable]
- remove_index :profiles, [:first_name, :last_name, :searchable]
- remove_index :profiles, [:first_name, :searchable]
- remove_index :profiles, [:last_name, :searchable]
-
- if Profile.count > 0
- if AppConfig.postgres?
- execute("UPDATE profiles SET full_name=LOWER(first_name || ' ' || last_name)")
- else
- execute("UPDATE profiles SET full_name=LOWER(CONCAT(first_name, ' ', last_name))")
- end
- end
- end
-
- def self.down
- remove_index :profiles, :column => :full_name
- remove_column :profiles, :full_name
-
- add_index :profiles, [:first_name, :searchable]
- add_index :profiles, [:last_name, :searchable]
- add_index :profiles, [:first_name, :last_name, :searchable]
- end
-end
diff --git a/db/migrate/20110730173137_create_pods.rb b/db/migrate/20110730173137_create_pods.rb
deleted file mode 100644
index 8fdb6c010..000000000
--- a/db/migrate/20110730173137_create_pods.rb
+++ /dev/null
@@ -1,14 +0,0 @@
-class CreatePods < ActiveRecord::Migration
- def self.up
- create_table :pods do |t|
- t.string :host
- t.boolean :ssl
-
- t.timestamps
- end
- end
-
- def self.down
- drop_table :pods
- end
-end
diff --git a/db/migrate/20110730173443_create_pod_stats.rb b/db/migrate/20110730173443_create_pod_stats.rb
deleted file mode 100644
index 506b60727..000000000
--- a/db/migrate/20110730173443_create_pod_stats.rb
+++ /dev/null
@@ -1,16 +0,0 @@
-class CreatePodStats < ActiveRecord::Migration
- def self.up
- create_table :pod_stats do |t|
- t.integer :error_code
- t.integer :person_id
- t.text :error_message
- t.integer :pod_id
-
- t.timestamps
- end
- end
-
- def self.down
- drop_table :pod_stats
- end
-end
diff --git a/db/migrate/20110812175614_add_username_to_service_users.rb b/db/migrate/20110812175614_add_username_to_service_users.rb
deleted file mode 100644
index c2a9fc715..000000000
--- a/db/migrate/20110812175614_add_username_to_service_users.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-class AddUsernameToServiceUsers < ActiveRecord::Migration
- def self.up
- add_column :service_users, :username, :string, :limit => 127
- end
-
- def self.down
- remove_column :service_users, :username
- end
-end
diff --git a/db/migrate/20110815210933_remove_invite_counter_from_user.rb b/db/migrate/20110815210933_remove_invite_counter_from_user.rb
deleted file mode 100644
index 819216353..000000000
--- a/db/migrate/20110815210933_remove_invite_counter_from_user.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-class RemoveInviteCounterFromUser < ActiveRecord::Migration
- def self.up
- remove_column :users, :invites
- end
-
- def self.down
- add_column :users, :invites, :integer, :default => 0
- end
-end
diff --git a/db/migrate/20110816061820_add_fields_to_invitations.rb b/db/migrate/20110816061820_add_fields_to_invitations.rb
deleted file mode 100644
index f8005ef0c..000000000
--- a/db/migrate/20110816061820_add_fields_to_invitations.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-class AddFieldsToInvitations < ActiveRecord::Migration
- def self.up
- add_column :invitations, :service, :string
- add_column :invitations, :identifier, :string
- add_column :invitations, :admin, :boolean, :default => false
- change_column :invitations, :recipient_id, :integer, :null => true
- change_column :invitations, :sender_id, :integer, :null => true
- end
-
- def self.down
- remove_column :invitations, :service
- remove_column :invitations, :identifier
- remove_column :invitations, :admin
- change_column :invitations, :recipient_id, :integer, :null => false
- change_column :invitations, :sender_id, :integer, :null => false
- end
-end
diff --git a/db/migrate/20110818212541_add_identifier_to_existing_invitations.rb b/db/migrate/20110818212541_add_identifier_to_existing_invitations.rb
deleted file mode 100644
index 02c2524f0..000000000
--- a/db/migrate/20110818212541_add_identifier_to_existing_invitations.rb
+++ /dev/null
@@ -1,20 +0,0 @@
-class AddIdentifierToExistingInvitations < ActiveRecord::Migration
- class Invitation < ActiveRecord::Base; end
- def self.up
- execute <<SQL unless Invitation.count == 0
- UPDATE invitations
- SET invitations.identifier = (SELECT users.invitation_identifier FROM users WHERE users.id = invitations.recipient_id),
- invitations.service = (SELECT users.invitation_service FROM users WHERE users.id = invitations.recipient_id)
- WHERE invitations.identifier IS NULL
-SQL
- end
-
- def self.down
- execute <<SQL unless Invitation.count == 0
- UPDATE invitations
- SET invitations.identifier = NULL,
- invitations.service = NULL
- WHERE (SELECT users.invitation_identifier FROM users WHERE users.id = invitations.recipient_id) IS NOT NULL
-SQL
- end
-end
diff --git a/db/migrate/20110830170929_remove_pod_stats_table.rb b/db/migrate/20110830170929_remove_pod_stats_table.rb
deleted file mode 100644
index 2d148650d..000000000
--- a/db/migrate/20110830170929_remove_pod_stats_table.rb
+++ /dev/null
@@ -1,16 +0,0 @@
-class RemovePodStatsTable < ActiveRecord::Migration
- def self.up
- execute 'DROP TABLE pod_stats'
- end
-
- def self.down
- create_table :pod_stats do |t|
- t.integer :error_code
- t.integer :person_id
- t.text :error_message
- t.integer :pod_id
-
- t.timestamps
- end
- end
-end
diff --git a/db/migrate/20110907205720_add_indexes_to_serivces.rb b/db/migrate/20110907205720_add_indexes_to_serivces.rb
deleted file mode 100644
index 699238631..000000000
--- a/db/migrate/20110907205720_add_indexes_to_serivces.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-class AddIndexesToSerivces < ActiveRecord::Migration
- def self.up
- change_column(:services, :type, :string, :limit => 127)
- change_column(:services, :uid, :string, :limit => 127)
- add_index :services, [:type, :uid]
- end
-
- def self.down
- remove_index :services, :column => [:type, :uid]
- end
-end
diff --git a/db/migrate/20110911213207_counter_cache_on_post_comments.rb b/db/migrate/20110911213207_counter_cache_on_post_comments.rb
deleted file mode 100644
index 4eee63e35..000000000
--- a/db/migrate/20110911213207_counter_cache_on_post_comments.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-class CounterCacheOnPostComments < ActiveRecord::Migration
- class Post < ActiveRecord::Base; end
-
- def self.up
- add_column :posts, :comments_count, :integer, :default => 0
- execute <<SQL if Post.count > 0
- UPDATE posts
- SET comments_count = (SELECT COUNT(*) FROM comments WHERE comments.post_id = posts.id)
-SQL
- end
-
- def self.down
- remove_column :posts, :comments_count
- end
-end
diff --git a/db/migrate/20110924112840_create_o_embed_caches.rb b/db/migrate/20110924112840_create_o_embed_caches.rb
deleted file mode 100644
index 294a8656f..000000000
--- a/db/migrate/20110924112840_create_o_embed_caches.rb
+++ /dev/null
@@ -1,14 +0,0 @@
-class CreateOEmbedCaches < ActiveRecord::Migration
- def self.up
- create_table :o_embed_caches do |t|
- t.string :url, :limit => 1024, :null => false, :unique => true
- t.text :data, :null => false
- end
- add_index :o_embed_caches, :url, :length => { :url => 255 }
- end
-
- def self.down
- remove_index :o_embed_caches, :column => :url
- drop_table :o_embed_caches
- end
-end
diff --git a/db/migrate/20110926120220_fix_indexes_to_serivces.rb b/db/migrate/20110926120220_fix_indexes_to_serivces.rb
deleted file mode 100644
index 1d2fa1d16..000000000
--- a/db/migrate/20110926120220_fix_indexes_to_serivces.rb
+++ /dev/null
@@ -1,14 +0,0 @@
-class FixIndexesToSerivces < ActiveRecord::Migration
- # This alters the tables to avoid a mysql bug
- # See http://bugs.joindiaspora.com/issues/835
- def self.up
- remove_index :services, :column => [:type, :uid]
- change_column(:services, :type, :string, :limit => 127)
- change_column(:services, :uid, :string, :limit => 127)
- add_index :services, [:type, :uid]
- end
-
- def self.down
- remove_index :services, :column => [:type, :uid]
- end
-end
diff --git a/db/migrate/20110930182048_add_root_guid_index_to_posts.rb b/db/migrate/20110930182048_add_root_guid_index_to_posts.rb
deleted file mode 100644
index ce3e9bdf5..000000000
--- a/db/migrate/20110930182048_add_root_guid_index_to_posts.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-class AddRootGuidIndexToPosts < ActiveRecord::Migration
- def self.up
- add_index :posts, :root_guid
- end
-
- def self.down
- remove_index :posts, :column => :root_guid
- end
-end
diff --git a/db/migrate/20111002013921_fix_data_type_for_activity_streams_object_id.rb b/db/migrate/20111002013921_fix_data_type_for_activity_streams_object_id.rb
deleted file mode 100644
index 99181ae35..000000000
--- a/db/migrate/20111002013921_fix_data_type_for_activity_streams_object_id.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-class FixDataTypeForActivityStreamsObjectId < ActiveRecord::Migration
- def self.up
- change_table :posts do |t|
- t.change :objectId, :string
- end
- end
-
- def self.down
- raise ActiveRecord::IrreversibleMigration
- end
-end
diff --git a/db/migrate/20111003232053_add_index_for_reshares.rb b/db/migrate/20111003232053_add_index_for_reshares.rb
deleted file mode 100644
index d99694fd9..000000000
--- a/db/migrate/20111003232053_add_index_for_reshares.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-class AddIndexForReshares < ActiveRecord::Migration
- def self.up
- add_index :posts, [:author_id, :root_guid], :unique => true
- end
-
- def self.down
- remove_index :posts, :column => [:author_id, :root_guid]
- end
-end
diff --git a/db/migrate/20111011193702_add_oembed_cache_to_posts.rb b/db/migrate/20111011193702_add_oembed_cache_to_posts.rb
deleted file mode 100644
index 371faef7c..000000000
--- a/db/migrate/20111011193702_add_oembed_cache_to_posts.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-class AddOembedCacheToPosts < ActiveRecord::Migration
- def self.up
- add_column :posts, :o_embed_cache_id, :integer
- end
-
- def self.down
- remove_column :posts, :o_embed_cache_id
- end
-end
diff --git a/db/migrate/20111011194702_comment_anything.rb b/db/migrate/20111011194702_comment_anything.rb
deleted file mode 100644
index d79da4afd..000000000
--- a/db/migrate/20111011194702_comment_anything.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-class CommentAnything < ActiveRecord::Migration
- def self.up
- remove_foreign_key :comments, :posts
- remove_index :comments, :post_id
- change_table :comments do |t|
- t.rename :post_id, :commentable_id
- t.string :commentable_type, :default => 'Post', :null => false, :limit => 60
- end
- end
-
- def self.down
- rename_column :comments, :commentable_id, :post_id
- add_foreign_key :comments, :posts, :dependent => :delete
- add_index :comments, :post_id
-
- remove_column :comments, :commentable_type
- end
-end
diff --git a/db/migrate/20111011195702_share_anything.rb b/db/migrate/20111011195702_share_anything.rb
deleted file mode 100644
index 810e73825..000000000
--- a/db/migrate/20111011195702_share_anything.rb
+++ /dev/null
@@ -1,114 +0,0 @@
-class ShareAnything < ActiveRecord::Migration
- def self.up
- remove_foreign_key :aspect_visibilities, :posts
-
- if AppConfig.postgres?
- execute "DROP INDEX index_aspect_visibilities_on_post_id_and_aspect_id"
- execute "DROP INDEX index_aspect_visibilities_on_post_id"
- execute "ALTER TABLE aspect_visibilities RENAME COLUMN post_id TO shareable_id"
- execute "ALTER TABLE aspect_visibilities ADD COLUMN shareable_type VARCHAR(255) NOT NULL DEFAULT 'Post'"
- execute "CREATE INDEX shareable_and_aspect_id ON aspect_visibilities ( shareable_id, shareable_type, aspect_id )"
- execute "CREATE INDEX index_aspect_visibilities_on_shareable_id_and_shareable_type ON aspect_visibilities ( shareable_id, shareable_type )"
- else
- start_sql = "ALTER TABLE aspect_visibilities "
- sql = []
-
- #remove_index :aspect_visibilities, :post_id_and_aspect_id
- sql << "DROP INDEX `index_aspect_visibilities_on_post_id_and_aspect_id`"
-
- #remove_index :aspect_visibilities, :post_id
- sql << "DROP INDEX `index_aspect_visibilities_on_post_id`"
-
-
-
- # change_table :aspect_visibilities do |t|
-
- # t.rename :post_id, :shareable_id
- # t.string :shareable_type, :default => 'Post', :null => false
- # end
-
- sql << "CHANGE COLUMN post_id shareable_id int NOT NULL"
- sql << "ADD shareable_type varchar(255) NOT NULL DEFAULT 'Post'"
-
-
- # add_index :aspect_visibilities, [:shareable_id, :shareable_type, :aspect_id], :name => 'shareable_and_aspect_id'
- # add_index :aspect_visibilities, [:shareable_id, :shareable_type]
-
- sql << "add index `shareable_and_aspect_id` (`shareable_id`, `shareable_type`, `aspect_id`)"
- sql << "add index `index_aspect_visibilities_on_shareable_id_and_shareable_type` (`shareable_id`, `shareable_type`)"
-
-
- execute(start_sql + sql.join(', ') + ';')
- end
-
-
-
- remove_foreign_key :post_visibilities, :posts
- rename_table :post_visibilities, :share_visibilities
-
- if AppConfig.postgres?
- execute "DROP INDEX index_post_visibilities_on_contact_id_and_post_id"
- execute "DROP INDEX index_post_visibilities_on_post_id_and_hidden_and_contact_id"
- execute "ALTER TABLE share_visibilities RENAME COLUMN post_id TO shareable_id"
- execute "ALTER TABLE share_visibilities ADD COLUMN shareable_type VARCHAR(60) NOT NULL DEFAULT 'Post'"
- execute "CREATE INDEX shareable_and_contact_id ON share_visibilities ( shareable_id, shareable_type, contact_id )"
- execute "CREATE INDEX shareable_and_hidden_and_contact_id ON share_visibilities ( shareable_id, shareable_type, hidden, contact_id )"
- else
- start_sql = "ALTER TABLE share_visibilities "
- sql = []
-
- #remove_index :post_visibilities, :contact_id_and_post_id
- #remove_index :post_visibilities, :post_id_and_hidden_and_contact_id
-
- sql << "DROP INDEX `index_post_visibilities_on_contact_id_and_post_id`"
- sql << "DROP INDEX `index_post_visibilities_on_post_id_and_hidden_and_contact_id`"
-
- #change_table :post_visibilities do |t|
- # t.rename :post_id, :shareable_id
- # t.string :shareable_type, :default => 'Post', :null => false
- #end
-
- sql << "CHANGE COLUMN post_id shareable_id int NOT NULL"
- sql << "ADD shareable_type varchar(60) NOT NULL DEFAULT 'Post'"
-
- #add_index :share_visibilities, [:shareable_id, :shareable_type, :contact_id], :name => 'shareable_and_contact_id'
- #add_index :share_visibilities, [:shareable_id, :shareable_type, :hidden, :contact_id], :name => 'shareable_and_hidden_and_contact_id'
-
- sql << "add index `shareable_and_contact_id` (`shareable_id`, `shareable_type`, `contact_id`)"
- sql << "add index `shareable_and_hidden_and_contact_id` (`shareable_id`, `shareable_type`, `hidden`, `contact_id`)"
-
- execute(start_sql + sql.join(', ') + ';')
- end
-
- end
-
-
- def self.down
- remove_index :share_visibilities, :name => 'shareable_and_hidden_and_contact_id'
- remove_index :share_visibilities, :name => 'shareable_and_contact_id'
- rename_table :share_visibilities, :post_visibilities
-
- change_table :post_visibilities do |t|
- t.remove :shareable_type
- t.rename :shareable_id, :post_id
- end
-
- add_index :post_visibilities, [:post_id, :hidden, :contact_id], :unique => true
- add_index :post_visibilities, [:contact_id, :post_id], :unique => true
- add_foreign_key :post_visibilities, :posts, :dependent => :delete
-
-
- remove_index :aspect_visibilities, [:shareable_id, :shareable_type]
- remove_index :aspect_visibilities, :name => 'shareable_and_aspect_id'
-
- change_table :aspect_visibilities do |t|
- t.remove :shareable_type
- t.rename :shareable_id, :post_id
- end
-
- add_index :aspect_visibilities, :post_id
- add_index :aspect_visibilities, [:post_id, :aspect_id], :unique => true
- add_foreign_key :aspect_visibilities, :posts, :dependent => :delete
-
- end
-end
diff --git a/db/migrate/20111012215141_move_photos_to_their_own_table.rb b/db/migrate/20111012215141_move_photos_to_their_own_table.rb
deleted file mode 100644
index ffbc16999..000000000
--- a/db/migrate/20111012215141_move_photos_to_their_own_table.rb
+++ /dev/null
@@ -1,161 +0,0 @@
-class MovePhotosToTheirOwnTable < ActiveRecord::Migration
- def self.up
- create_table "photos", :force => true do |t|
- t.integer "tmp_old_id", :null => true
- t.integer "author_id", :null => false
- t.boolean "public", :default => false, :null => false
- t.string "diaspora_handle"
- t.string "guid", :null => false
- t.boolean "pending", :default => false, :null => false
- t.text "text"
- t.text "remote_photo_path"
- t.string "remote_photo_name"
- t.string "random_string"
- t.string "processed_image"
- t.datetime "created_at"
- t.datetime "updated_at"
- t.string "unprocessed_image"
- t.string "status_message_guid"
- t.integer "comments_count"
- end
-
- if AppConfig.postgres?
- execute %{
- INSERT INTO photos (
- tmp_old_id
- , author_id
- , public
- , diaspora_handle
- , guid
- , pending
- , text
- , remote_photo_path
- , remote_photo_name
- , random_string
- , processed_image
- , created_at
- , updated_at
- , unprocessed_image
- , status_message_guid
- , comments_count
- ) SELECT
- id
- , author_id
- , public
- , diaspora_handle
- , guid
- , pending
- , text
- , remote_photo_path
- , remote_photo_name
- , random_string
- , processed_image
- , created_at
- , updated_at
- , unprocessed_image
- , status_message_guid
- , comments_count
- FROM
- posts
- WHERE
- type = 'Photo'
- }
-
- execute "UPDATE aspect_visibilities SET shareable_type='Photo' FROM photos WHERE shareable_id=photos.id"
- execute "UPDATE share_visibilities SET shareable_type='Photo' FROM photos WHERE shareable_id=photos.id"
- else
- execute <<SQL
-INSERT INTO photos
-SELECT NULL as id, id AS tmp_old_id, author_id, public, diaspora_handle, guid, pending, text, remote_photo_path, remote_photo_name, random_string, processed_image,
-created_at, updated_at, unprocessed_image, status_message_guid, comments_count
-FROM posts
-WHERE type = 'Photo'
-SQL
-
- execute "UPDATE aspect_visibilities AS av, photos SET av.shareable_type='Photo' WHERE av.shareable_id=photos.id"
- execute "UPDATE share_visibilities AS sv, photos SET sv.shareable_type='Photo' WHERE sv.shareable_id=photos.id"
- end
-
- # all your base are belong to us!
- execute "DELETE FROM posts WHERE type='Photo'"
- end
-
-
- def self.down
- if AppConfig.postgres?
- execute %{
- INSERT INTO posts (
- id, author_id, public, diaspora_handle, guid, pending, type, text,
- remote_photo_path, remote_photo_name, random_string, processed_image,
- youtube_titles, created_at, updated_at, unprocessed_image,
- object_url, image_url, image_height, image_width,
- provider_display_name, actor_url, "objectId", root_guid,
- status_message_guid, likes_count, comments_count, o_embed_cache_id
- ) SELECT
- tmp_old_id, author_id, public, diaspora_handle, guid, pending, 'Photo', text,
- remote_photo_path, remote_photo_name, random_string, processed_image,
- NULL, created_at, updated_at, unprocessed_image, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, status_message_guid, 0, comments_count, NULL
- FROM photos
- }
-
- execute %{
- UPDATE
- aspect_visibilities
- SET
- shareable_id=posts.id
- , shareable_type='Post'
- FROM
- posts
- , photos
- WHERE
- posts.id=photos.tmp_old_id
- AND photos.id=aspect_visibilities.shareable_id
- }
-
- execute %{
- UPDATE
- share_visibilities
- SET
- shareable_id=posts.id
- , shareable_type='Post'
- FROM
- posts
- , photos
- WHERE
- posts.id=photos.tmp_old_id
- AND photos.id=share_visibilities.shareable_id
- }
- else
- execute <<SQL
-INSERT INTO posts
- SELECT tmp_old_id AS id, author_id, public, diaspora_handle, guid, pending, 'Photo' AS type, text, remote_photo_path, remote_photo_name, random_string,
- processed_image, NULL AS youtube_titles, created_at, updated_at, unprocessed_image, NULL AS object_url, NULL AS image_url, NULL AS image_height, NULL AS image_width, NULL AS provider_display_name,
- NULL AS actor_url, NULL AS objectId, NULL AS root_guid, status_message_guid, 0 AS likes_count, comments_count, NULL AS o_embed_cache_id
- FROM photos
-SQL
-
- execute <<SQL
-UPDATE aspect_visibilities, posts, photos
-SET
-aspect_visibilities.shareable_id=posts.id,
-aspect_visibilities.shareable_type='Post'
-WHERE
-posts.id=photos.tmp_old_id AND
-photos.id=aspect_visibilities.shareable_id
-SQL
-
- execute <<SQL
-UPDATE share_visibilities, posts, photos
-SET
-share_visibilities.shareable_id=posts.id,
-share_visibilities.shareable_type='Post'
-WHERE
-posts.id=photos.tmp_old_id AND
-photos.id=share_visibilities.shareable_id
-SQL
- end
-
- execute "DROP TABLE photos"
- end
-end
diff --git a/db/migrate/20111016145626_add_language_to_invitations.rb b/db/migrate/20111016145626_add_language_to_invitations.rb
deleted file mode 100644
index 4f9129f40..000000000
--- a/db/migrate/20111016145626_add_language_to_invitations.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-class AddLanguageToInvitations < ActiveRecord::Migration
- def self.up
- add_column :invitations, :language, :string, :default => "en"
- end
-
- def self.down
- remove_column :invitations, :language
- end
-end
diff --git a/db/migrate/20111018010003_add_back_indexes.rb b/db/migrate/20111018010003_add_back_indexes.rb
deleted file mode 100644
index 878cc526a..000000000
--- a/db/migrate/20111018010003_add_back_indexes.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-class AddBackIndexes < ActiveRecord::Migration
- def self.up
- # reduce index size
-
- add_index :photos, :status_message_guid
- add_index :comments, [:commentable_id, :commentable_type]
- end
-
- def self.down
- remove_index :comments, :column => [:commentable_id, :commentable_type]
- remove_index :photos, :column => :status_message_guid
-
- # reduce index size
- end
-end
diff --git a/db/migrate/20111019013244_postgresql_photos_id_seq_init.rb b/db/migrate/20111019013244_postgresql_photos_id_seq_init.rb
deleted file mode 100644
index 8250b4eb7..000000000
--- a/db/migrate/20111019013244_postgresql_photos_id_seq_init.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-class PostgresqlPhotosIdSeqInit < ActiveRecord::Migration
- def self.up
- if AppConfig.postgres?
- execute "SELECT setval('photos_id_seq', COALESCE( ( SELECT MAX(id)+1 FROM photos ), 1 ) )"
- end
- end
-
- def self.down
- # No reason or need to migrate this down.
- end
-end
diff --git a/db/migrate/20111021184041_add_community_spotlight_in_stream.rb b/db/migrate/20111021184041_add_community_spotlight_in_stream.rb
deleted file mode 100644
index 25143ff1f..000000000
--- a/db/migrate/20111021184041_add_community_spotlight_in_stream.rb
+++ /dev/null
@@ -1,14 +0,0 @@
-class AddCommunitySpotlightInStream < ActiveRecord::Migration
- def self.up
- add_column :users, :show_community_spotlight_in_stream, :boolean, :null => false, :default => true
-
- ActiveRecord::Base.connection.execute <<SQL
- UPDATE users
- SET show_community_spotlight_in_stream = false
-SQL
- end
-
- def self.down
- remove_column :users , :show_community_spotlight_in_stream
- end
-end
diff --git a/db/migrate/20111023230730_fix_photo_share_visibilities.rb b/db/migrate/20111023230730_fix_photo_share_visibilities.rb
deleted file mode 100644
index ab19419e0..000000000
--- a/db/migrate/20111023230730_fix_photo_share_visibilities.rb
+++ /dev/null
@@ -1,40 +0,0 @@
-class FixPhotoShareVisibilities < ActiveRecord::Migration
- class Photo < ActiveRecord::Base; end
-
- def self.up
- return if ! Photo.first.respond_to?(:tmp_old_id)
-
- if AppConfig.postgres?
- ['aspect_visibilities', 'share_visibilities'].each do |vis_table|
- execute "UPDATE #{vis_table} SET shareable_type = 'Post'"
-
- execute %{
- UPDATE
- #{vis_table}
- SET
- shareable_type = 'Photo'
- , shareable_id = photos.id
- FROM
- photos
- WHERE
- #{vis_table}.shareable_id = photos.tmp_old_id
- }
- end
- else
- ['aspect_visibilities', 'share_visibilities'].each do |vis_table|
- ActiveRecord::Base.connection.execute <<SQL
- UPDATE #{vis_table}
- SET shareable_type='Post'
-SQL
- ActiveRecord::Base.connection.execute <<SQL
- UPDATE #{vis_table}, photos
- SET #{vis_table}.shareable_type='Photo', #{vis_table}.shareable_id=photos.id
- WHERE #{vis_table}.shareable_id=photos.tmp_old_id
-SQL
- end
- end
- end
-
- def self.down
- end
-end
diff --git a/db/migrate/20111026173547_add_missing_tag_followings_indices.rb b/db/migrate/20111026173547_add_missing_tag_followings_indices.rb
deleted file mode 100644
index c15d0198b..000000000
--- a/db/migrate/20111026173547_add_missing_tag_followings_indices.rb
+++ /dev/null
@@ -1,34 +0,0 @@
-class AddMissingTagFollowingsIndices < ActiveRecord::Migration
- def self.delete_duplicate_tag_followings
- duplicate_rows = execute <<SQL
- SELECT COUNT(tf.user_id), tf.user_id, tf.tag_id from tag_followings AS tf
- GROUP BY tf.user_id, tf.tag_id
- HAVING COUNT(*)>1;
-SQL
- duplicate_rows.each do |row|
- count = row.first
- user_id = row[1]
- tag_id = row.last
-
- execute <<SQL
- DELETE FROM tag_followings
- WHERE tag_followings.user_id = #{user_id} AND tag_followings.tag_id = #{tag_id}
- LIMIT #{count-1}
-SQL
- end
- end
-
- def self.up
- delete_duplicate_tag_followings
-
- add_index :tag_followings, :tag_id
- add_index :tag_followings, :user_id
- add_index :tag_followings, [:tag_id, :user_id], :unique => true
- end
-
- def self.down
- remove_index :tag_followings, :column => [:tag_id, :user_id]
- remove_index :tag_followings, :column => :user_id
- remove_index :tag_followings, :column => :tag_id
- end
-end
diff --git a/db/migrate/20111101202137_create_blocks.rb b/db/migrate/20111101202137_create_blocks.rb
deleted file mode 100644
index 31e451740..000000000
--- a/db/migrate/20111101202137_create_blocks.rb
+++ /dev/null
@@ -1,12 +0,0 @@
-class CreateBlocks < ActiveRecord::Migration
- def self.up
- create_table :blocks do |t|
- t.integer :user_id
- t.integer :person_id
- end
- end
-
- def self.down
- drop_table :blocks
- end
-end
diff --git a/db/migrate/20111103184050_add_closed_account_flag_to_person.rb b/db/migrate/20111103184050_add_closed_account_flag_to_person.rb
deleted file mode 100644
index 0a845f835..000000000
--- a/db/migrate/20111103184050_add_closed_account_flag_to_person.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-class AddClosedAccountFlagToPerson < ActiveRecord::Migration
- def self.up
- add_column :people, :closed_account, :boolean, :default => false
- end
-
- def self.down
- remove_column :people, :closed_account
- end
-end
diff --git a/db/migrate/20111109023618_create_account_deletions.rb b/db/migrate/20111109023618_create_account_deletions.rb
deleted file mode 100644
index 6e2d1f9da..000000000
--- a/db/migrate/20111109023618_create_account_deletions.rb
+++ /dev/null
@@ -1,12 +0,0 @@
-class CreateAccountDeletions < ActiveRecord::Migration
- def self.up
- create_table :account_deletions do |t|
- t.string :diaspora_handle
- t.integer :person_id
- end
- end
-
- def self.down
- drop_table :account_deletions
- end
-end
diff --git a/db/migrate/20111111025358_counter_cache_on_post_reshares.rb b/db/migrate/20111111025358_counter_cache_on_post_reshares.rb
deleted file mode 100644
index a6c0e73c0..000000000
--- a/db/migrate/20111111025358_counter_cache_on_post_reshares.rb
+++ /dev/null
@@ -1,35 +0,0 @@
-class CounterCacheOnPostReshares < ActiveRecord::Migration
- class Post < ActiveRecord::Base; end
-
- def self.up
- add_column :posts, :reshares_count, :integer, :default => 0
-
- if AppConfig.postgres?
- execute %{
- UPDATE posts
- SET reshares_count = (
- SELECT COUNT(*)
- FROM posts p2
- WHERE
- p2.type = 'Reshare'
- AND p2.root_guid = posts.guid
- )
- }
- else # mysql
- execute "CREATE TEMPORARY TABLE posts_reshared SELECT * FROM posts WHERE type = 'Reshare'"
- execute %{
- UPDATE posts p1
- SET reshares_count = (
- SELECT COUNT(*)
- FROM posts_reshared p2
- WHERE p2.root_guid = p1.guid
- )
- }
- end
-
- end
-
- def self.down
- remove_column :posts, :reshares_count
- end
-end
diff --git a/db/migrate/20111114173111_add_auto_follow_back_to_users.rb b/db/migrate/20111114173111_add_auto_follow_back_to_users.rb
deleted file mode 100644
index 165691b23..000000000
--- a/db/migrate/20111114173111_add_auto_follow_back_to_users.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-class AddAutoFollowBackToUsers < ActiveRecord::Migration
- def self.up
- add_column :users, :auto_follow_back, :boolean, :default => false
- add_column :users, :auto_follow_back_aspect_id, :integer
- end
-
- def self.down
- remove_column :users, :auto_follow_back
- remove_column :users, :auto_follow_back_aspect
- end
-end
diff --git a/db/migrate/20111207230506_add_oauth_redirect_uri_to_oauth_clients.rb b/db/migrate/20111207230506_add_oauth_redirect_uri_to_oauth_clients.rb
deleted file mode 100644
index e89ed5f8c..000000000
--- a/db/migrate/20111207230506_add_oauth_redirect_uri_to_oauth_clients.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-class AddOauthRedirectUriToOauthClients < ActiveRecord::Migration
- def self.up
- add_column :oauth_clients, :oauth_redirect_uri, :string
- end
-
- def self.down
- remove_column :oauth_clients, :oauth_redirect_uri
- end
-end
diff --git a/db/migrate/20111207233503_remove_low_length_limits_from_oauth_tables.rb b/db/migrate/20111207233503_remove_low_length_limits_from_oauth_tables.rb
deleted file mode 100644
index 1d3d81e81..000000000
--- a/db/migrate/20111207233503_remove_low_length_limits_from_oauth_tables.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-class RemoveLowLengthLimitsFromOauthTables < ActiveRecord::Migration
- def self.up
- change_column :oauth_clients, :oauth_identifier, :string, :limit => 127
- change_column :oauth_clients, :oauth_secret, :string, :limit => 127
- change_column :oauth_clients, :nonce, :string, :limit => 127
- change_column :oauth_authorization_codes, :code, :string, :limit => 127
- change_column :oauth_access_tokens, :access_token, :string, :limit => 127
- change_column :oauth_access_tokens, :refresh_token, :string, :limit => 127
- end
-
- def self.down
- change_column :oauth_clients, :oauth_identifier, :string, :limit => 32
- change_column :oauth_clients, :oauth_secret, :string, :limit => 32
- change_column :oauth_clients, :nonce, :string, :limit => 64
- change_column :oauth_authorization_codes, :code, :string, :limit => 32
- change_column :oauth_access_tokens, :access_token, :string, :limit => 32
- change_column :oauth_access_tokens, :refresh_token, :string, :limit => 32
- end
-end
diff --git a/db/migrate/20111211213438_create_invitation_codes.rb b/db/migrate/20111211213438_create_invitation_codes.rb
deleted file mode 100644
index f2bdde858..000000000
--- a/db/migrate/20111211213438_create_invitation_codes.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-class CreateInvitationCodes < ActiveRecord::Migration
- def self.up
- create_table :invitation_codes do |t|
- t.string :token
- t.integer :user_id
- t.integer :count
-
- t.timestamps
- end
- end
-
- def self.down
- drop_table :invitation_codes
- end
-end
diff --git a/db/migrate/20111217042006_add_photo_counter_cache_to_post.rb b/db/migrate/20111217042006_add_photo_counter_cache_to_post.rb
deleted file mode 100644
index a614f26d8..000000000
--- a/db/migrate/20111217042006_add_photo_counter_cache_to_post.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-class AddPhotoCounterCacheToPost < ActiveRecord::Migration
- class Post < ActiveRecord::Base; end
-
- def self.up
- add_column :posts, :photos_count, :integer, :default => 0
- execute <<SQL if Post.count > 0
- UPDATE posts
- SET photos_count = (SELECT COUNT(*) FROM photos WHERE photos.status_message_guid = posts.guid)
-SQL
- end
-
- def self.down
- remove_column :posts, :photos_count
- end
-end
diff --git a/db/migrate/20120107220942_move_recently_hidden_posts_to_user.rb b/db/migrate/20120107220942_move_recently_hidden_posts_to_user.rb
deleted file mode 100644
index a1b24243c..000000000
--- a/db/migrate/20120107220942_move_recently_hidden_posts_to_user.rb
+++ /dev/null
@@ -1,28 +0,0 @@
-class Person < ActiveRecord::Base
- belongs_to :owner, :class_name => 'User'
-end
-
-class User < ActiveRecord::Base
- serialize :hidden_shareables, Hash
-end
-
-class Contact < ActiveRecord::Base
- belongs_to :user
-end
-
-class ShareVisibility < ActiveRecord::Base
- belongs_to :contact
-end
-
-require Rails.root.join('lib', 'share_visibility_converter')
-
-class MoveRecentlyHiddenPostsToUser < ActiveRecord::Migration
- def self.up
- add_column :users, :hidden_shareables, :text
- ShareVisibilityConverter.copy_hidden_share_visibilities_to_users(true)
- end
-
- def self.down
- remove_column :users, :hidden_shareables
- end
-end \ No newline at end of file
diff --git a/db/migrate/20120114191018_remove_photos_count_from_post.rb b/db/migrate/20120114191018_remove_photos_count_from_post.rb
deleted file mode 100644
index 968e51401..000000000
--- a/db/migrate/20120114191018_remove_photos_count_from_post.rb
+++ /dev/null
@@ -1,13 +0,0 @@
-class RemovePhotosCountFromPost < ActiveRecord::Migration
- def self.up
- remove_column :posts, :photos_count
- end
-
- def self.down
- add_column :posts, :photos_count, :integer, :default => 0
- execute <<SQL if Post.count > 0
- UPDATE posts
- SET photos_count = (SELECT COUNT(*) FROM photos WHERE photos.status_message_guid = posts.guid)
-SQL
- end
-end
diff --git a/db/migrate/20120127235102_add_nsfw_to_profiles.rb b/db/migrate/20120127235102_add_nsfw_to_profiles.rb
deleted file mode 100644
index 582a0ecd4..000000000
--- a/db/migrate/20120127235102_add_nsfw_to_profiles.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-class AddNsfwToProfiles < ActiveRecord::Migration
- def self.up
- add_column :profiles, :nsfw, :boolean, :default => false
- end
-
- def self.down
- remove_column :profiles, :nsfw
- end
-end
diff --git a/db/migrate/20120202190701_remove_public_share_visibilities.rb b/db/migrate/20120202190701_remove_public_share_visibilities.rb
deleted file mode 100644
index caa42d8c9..000000000
--- a/db/migrate/20120202190701_remove_public_share_visibilities.rb
+++ /dev/null
@@ -1,59 +0,0 @@
-# NOTE: this migration will remove a lot of unused rows. It is highly suggested
-# that you run `OPTIMIZE TABLE share_visibilities` after this
-# `OPTIMIZE NO_WRITE_TO_BINLOG TABLE share_visibilities;` will run faster but has a greater chance of corrupting data
-# and will only work on an unsharded database (which should be the case for everyone right now)
-# you probably want to backup your db before you do any of this.
-
-
-# migration is complete.
-#
-# caution: you may want to take your pod offline during the OPTIMIZE command.
-
-class RemovePublicShareVisibilities < ActiveRecord::Migration
- def self.up
- %w{Post Photo}.each do |type|
-
- index = 0
-
- table_name = type.tableize
- if AppConfig.postgres?
- shareable_size = ActiveRecord::Base.connection.execute("SELECT COUNT(*) FROM #{table_name}").first['count'].to_i
- else
- shareable_size = ActiveRecord::Base.connection.execute("SELECT COUNT(*) FROM #{table_name}").first.first
- end
-
- while index < shareable_size + 100 do
- if AppConfig.postgres?
- sql = <<-SQL
- DELETE
- FROM share_visibilities AS sv
- USING #{table_name} as p
- WHERE sv.shareable_id = p.id
- AND sv.shareable_type = '#{type}'
- AND p.public IS TRUE
- AND p.id < #{index};
- SQL
- else
- sql = <<-SQL
- DELETE sv
- FROM share_visibilities AS sv
- INNER JOIN #{table_name}
- ON sv.shareable_id = #{table_name}.id
- WHERE sv.shareable_type = "#{type}"
- AND #{table_name}.public IS TRUE
- AND #{table_name}.id < #{index};
- SQL
- end
-
- puts "deleted public share vis up to #{index} of #{type}"
- ActiveRecord::Base.connection.execute(sql)
-
- index += 100
- end
- end
- end
-
- def self.down
- raise ActiveRecord::IrreversibleMigration
- end
-end
diff --git a/db/migrate/20120203220932_add_interacted_at_to_posts.rb b/db/migrate/20120203220932_add_interacted_at_to_posts.rb
deleted file mode 100644
index e8df0e579..000000000
--- a/db/migrate/20120203220932_add_interacted_at_to_posts.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-class AddInteractedAtToPosts < ActiveRecord::Migration
- def self.up
- add_column :posts, :interacted_at, :datetime
- end
-
- def self.down
- remove_column :posts, :interacted_at
- end
-end
diff --git a/db/migrate/20120208231253_create_participations.rb b/db/migrate/20120208231253_create_participations.rb
deleted file mode 100644
index 62f840bc6..000000000
--- a/db/migrate/20120208231253_create_participations.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-class CreateParticipations < ActiveRecord::Migration
- def self.up
- create_table "participations", :force => true do |t|
- t.string "guid"
- t.integer "target_id"
- t.string "target_type", :limit => 60, :null => false
- t.integer "author_id"
- t.text "author_signature"
- t.text "parent_author_signature"
- t.timestamps
- end
- end
-
- def self.down
- drop_table :participations
- end
-end
diff --git a/db/migrate/20120301143226_remove_youtube_titles.rb b/db/migrate/20120301143226_remove_youtube_titles.rb
deleted file mode 100644
index fbe3a213e..000000000
--- a/db/migrate/20120301143226_remove_youtube_titles.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-class RemoveYoutubeTitles < ActiveRecord::Migration
- def self.up
- remove_column :comments, :youtube_titles
- remove_column :posts, :youtube_titles
- end
-
- def self.down
- add_column :comments, :youtube_titles, :text
- add_column :posts, :youtube_titles, :text
- end
-end \ No newline at end of file
diff --git a/db/migrate/20120322223517_add_template_name_to_posts.rb b/db/migrate/20120322223517_add_template_name_to_posts.rb
deleted file mode 100644
index cedd5951c..000000000
--- a/db/migrate/20120322223517_add_template_name_to_posts.rb
+++ /dev/null
@@ -1,5 +0,0 @@
-class AddTemplateNameToPosts < ActiveRecord::Migration
- def change # thanks josh susser
- add_column :posts, :frame_name, :string
- end
-end
diff --git a/db/migrate/20120328025842_remove_invitation_email_from_users.rb b/db/migrate/20120328025842_remove_invitation_email_from_users.rb
deleted file mode 100644
index 17e516361..000000000
--- a/db/migrate/20120328025842_remove_invitation_email_from_users.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-class RemoveInvitationEmailFromUsers < ActiveRecord::Migration
- def self.up
- execute <<-SQL
- UPDATE users
- SET email = 'invitemail_' || id || '@example.org'
- WHERE invitation_token IS NOT NULL
- SQL
- end
-
- def self.down
- execute <<-SQL
- UPDATE users
- SET email = (SELECT identifier FROM invitations WHERE invitations.recipient_id = users.id)
- WHERE invitation_token IS NOT NULL
- SQL
- end
-end
diff --git a/db/migrate/20120330103021_indexes_on_participation.rb b/db/migrate/20120330103021_indexes_on_participation.rb
deleted file mode 100644
index 4535aa2d3..000000000
--- a/db/migrate/20120330103021_indexes_on_participation.rb
+++ /dev/null
@@ -1,6 +0,0 @@
-class IndexesOnParticipation < ActiveRecord::Migration
- def change
- add_index(:participations, [:target_id, :target_type, :author_id])
- add_index(:participations, :guid)
- end
-end
diff --git a/db/migrate/20120330144057_indexes_on_posts.rb b/db/migrate/20120330144057_indexes_on_posts.rb
deleted file mode 100644
index 523ba6c7a..000000000
--- a/db/migrate/20120330144057_indexes_on_posts.rb
+++ /dev/null
@@ -1,5 +0,0 @@
-class IndexesOnPosts < ActiveRecord::Migration
- def change
- add_index(:posts, [:id, :type, :created_at])
- end
-end
diff --git a/db/migrate/20120405170105_create_locations.rb b/db/migrate/20120405170105_create_locations.rb
deleted file mode 100644
index f46d76860..000000000
--- a/db/migrate/20120405170105_create_locations.rb
+++ /dev/null
@@ -1,12 +0,0 @@
-class CreateLocations < ActiveRecord::Migration
- def change
- create_table :locations do |t|
- t.string :address
- t.string :lat
- t.string :lng
- t.integer :status_message_id
-
- t.timestamps
- end
- end
-end
diff --git a/db/migrate/20120414005431_create_rails_admin_histories_table.rb b/db/migrate/20120414005431_create_rails_admin_histories_table.rb
deleted file mode 100644
index 3c743aa28..000000000
--- a/db/migrate/20120414005431_create_rails_admin_histories_table.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-class CreateRailsAdminHistoriesTable < ActiveRecord::Migration
- def self.up
- create_table :rails_admin_histories do |t|
- t.text :message # title, name, or object_id
- t.string :username
- t.integer :item
- t.string :table
- t.integer :month, :limit => 2
- t.integer :year, :limit => 5
- t.timestamps
- end
- add_index(:rails_admin_histories, [:item, :table, :month, :year], :name => 'index_rails_admin_histories' )
- end
-
- def self.down
- drop_table :rails_admin_histories
- end
-end
diff --git a/db/migrate/20120420185823_add_width_and_height_to_photos.rb b/db/migrate/20120420185823_add_width_and_height_to_photos.rb
deleted file mode 100644
index ebe77913e..000000000
--- a/db/migrate/20120420185823_add_width_and_height_to_photos.rb
+++ /dev/null
@@ -1,6 +0,0 @@
-class AddWidthAndHeightToPhotos < ActiveRecord::Migration
- def change
- add_column :photos, :height, :integer
- add_column :photos, :width, :integer
- end
-end
diff --git a/db/migrate/20120422072257_add_favorite_to_post.rb b/db/migrate/20120422072257_add_favorite_to_post.rb
deleted file mode 100644
index bc929124c..000000000
--- a/db/migrate/20120422072257_add_favorite_to_post.rb
+++ /dev/null
@@ -1,5 +0,0 @@
-class AddFavoriteToPost < ActiveRecord::Migration
- def change
- add_column :posts, :favorite, :boolean, :default => false
- end
-end
diff --git a/db/migrate/20120427152648_create_roles.rb b/db/migrate/20120427152648_create_roles.rb
deleted file mode 100644
index 8f7dcdd56..000000000
--- a/db/migrate/20120427152648_create_roles.rb
+++ /dev/null
@@ -1,10 +0,0 @@
-class CreateRoles < ActiveRecord::Migration
- def change
- create_table :roles do |t|
- t.integer :person_id
- t.string :name
-
- t.timestamps
- end
- end
-end
diff --git a/db/migrate/20120506053156_add_wallpaper_to_profile.rb b/db/migrate/20120506053156_add_wallpaper_to_profile.rb
deleted file mode 100644
index b190cb8b6..000000000
--- a/db/migrate/20120506053156_add_wallpaper_to_profile.rb
+++ /dev/null
@@ -1,5 +0,0 @@
-class AddWallpaperToProfile < ActiveRecord::Migration
- def change
- add_column :profiles, :wallpaper, :string
- end
-end
diff --git a/db/migrate/20120510184853_drop_service_users.rb b/db/migrate/20120510184853_drop_service_users.rb
deleted file mode 100644
index 717981605..000000000
--- a/db/migrate/20120510184853_drop_service_users.rb
+++ /dev/null
@@ -1,24 +0,0 @@
-class DropServiceUsers < ActiveRecord::Migration
- def up
- drop_table :service_users
-
- end
-
- def down
- create_table :service_users do |t|
- t.string :uid, :null => false
- t.string :name, :null => false
- t.string :photo_url, :null => false
- t.integer :service_id, :null => false
- t.integer :person_id
- t.integer :contact_id
- t.integer :request_id
- t.integer :invitation_id
-
- t.timestamps
- end
-
- add_index :service_users, :service_id
- add_index :service_users, [:uid, :service_id], :unique => true
- end
-end
diff --git a/db/migrate/20120517014034_remove_oauth.rb b/db/migrate/20120517014034_remove_oauth.rb
deleted file mode 100644
index 876d92fb5..000000000
--- a/db/migrate/20120517014034_remove_oauth.rb
+++ /dev/null
@@ -1,57 +0,0 @@
-class RemoveOauth < ActiveRecord::Migration
- def up
- drop_table 'oauth_access_tokens'
- drop_table "oauth_authorization_codes"
- drop_table "oauth_authorizations"
- drop_table "oauth_clients"
-
- end
-
- def down
- create_table "oauth_access_tokens", :force => true do |t|
- t.integer "authorization_id", :null => false
- t.string "access_token", :limit => 127, :null => false
- t.string "refresh_token", :limit => 127
- t.datetime "expires_at"
- t.datetime "created_at"
- t.datetime "updated_at"
- end
-
- create_table "oauth_authorization_codes", :force => true do |t|
- t.integer "authorization_id", :null => false
- t.string "code", :limit => 127, :null => false
- t.datetime "expires_at"
- t.datetime "created_at"
- t.datetime "updated_at"
- t.string "redirect_uri"
- end
-
- create_table "oauth_authorizations", :force => true do |t|
- t.integer "client_id", :null => false
- t.integer "resource_owner_id"
- t.string "resource_owner_type", :limit => 32
- t.string "scope"
- t.datetime "expires_at"
- end
-
- add_index "oauth_authorizations", ["resource_owner_id", "resource_owner_type", "client_id"], :name => "index_oauth_authorizations_on_resource_owner_and_client_id", :unique => true
-
- create_table "oauth_clients", :force => true do |t|
- t.string "name", :limit => 127, :null => false
- t.text "description", :null => false
- t.string "application_base_url", :limit => 127, :null => false
- t.string "icon_url", :limit => 127, :null => false
- t.string "oauth_identifier", :limit => 127, :null => false
- t.string "oauth_secret", :limit => 127, :null => false
- t.string "nonce", :limit => 127
- t.text "public_key", :null => false
- t.text "permissions_overview", :null => false
- t.string "oauth_redirect_uri"
- end
-
- add_index "oauth_clients", ["application_base_url"], :name => "index_oauth_clients_on_application_base_url", :unique => true
- add_index "oauth_clients", ["name"], :name => "index_oauth_clients_on_name", :unique => true
- add_index "oauth_clients", ["nonce"], :name => "index_oauth_clients_on_nonce", :unique => true
-
- end
-end
diff --git a/db/migrate/20120519015723_remove_multi_photo_frame_reference.rb b/db/migrate/20120519015723_remove_multi_photo_frame_reference.rb
deleted file mode 100644
index f509d9096..000000000
--- a/db/migrate/20120519015723_remove_multi_photo_frame_reference.rb
+++ /dev/null
@@ -1,8 +0,0 @@
-class RemoveMultiPhotoFrameReference < ActiveRecord::Migration
- def up
- execute("UPDATE posts SET frame_name='Day' WHERE frame_name='multi-photo'")
- end
-
- def down
- end
-end
diff --git a/db/migrate/20120521191429_remove_rich_media_type.rb b/db/migrate/20120521191429_remove_rich_media_type.rb
deleted file mode 100644
index c2dc44236..000000000
--- a/db/migrate/20120521191429_remove_rich_media_type.rb
+++ /dev/null
@@ -1,8 +0,0 @@
-class RemoveRichMediaType < ActiveRecord::Migration
- def up
- execute("UPDATE posts SET frame_name='Night' WHERE frame_name='rich-media'")
- end
-
- def down
- end
-end
diff --git a/db/migrate/20120803143552_add_fetch_status_to_people.rb b/db/migrate/20120803143552_add_fetch_status_to_people.rb
deleted file mode 100644
index 20eca8f27..000000000
--- a/db/migrate/20120803143552_add_fetch_status_to_people.rb
+++ /dev/null
@@ -1,5 +0,0 @@
-class AddFetchStatusToPeople < ActiveRecord::Migration
- def change
- add_column :people, :fetch_status, :integer, :default => 0
- end
-end
diff --git a/db/migrate/20120906162503_update_devise.rb b/db/migrate/20120906162503_update_devise.rb
deleted file mode 100644
index 3e5196895..000000000
--- a/db/migrate/20120906162503_update_devise.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-class UpdateDevise < ActiveRecord::Migration
- def up
- remove_column :users, :remember_token
- add_column :users, :reset_password_sent_at, :datetime
- end
-
- def down
- add_column :users, :remember_token, :string
- remove_column :users, :reset_password_sent_at
- end
-end
diff --git a/db/migrate/20120909053122_remove_wallpaper_from_profile.rb b/db/migrate/20120909053122_remove_wallpaper_from_profile.rb
deleted file mode 100644
index de903ae8a..000000000
--- a/db/migrate/20120909053122_remove_wallpaper_from_profile.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-class RemoveWallpaperFromProfile < ActiveRecord::Migration
- def up
- remove_column :profiles, :wallpaper
- end
-
- def down
- add_column :profiles, :wallpaper, :string
- end
-end
diff --git a/db/migrate/20130429073928_add_tweet_id_to_post.rb b/db/migrate/20130429073928_add_tweet_id_to_post.rb
index 3d42da98c..f62c2b964 100644
--- a/db/migrate/20130429073928_add_tweet_id_to_post.rb
+++ b/db/migrate/20130429073928_add_tweet_id_to_post.rb
@@ -1,6 +1,6 @@
class AddTweetIdToPost < ActiveRecord::Migration
def change
add_column :posts, :tweet_id, :string
- add_index :posts, :tweet_id
+ add_index :posts, ['tweet_id'], :length => { "tweet_id" => 191 }
end
end
diff --git a/db/migrate/20130613203350_remove_limit_from_root_guid_in_posts.rb b/db/migrate/20130613203350_remove_limit_from_root_guid_in_posts.rb
index 8b2fe2b37..97b653a10 100644
--- a/db/migrate/20130613203350_remove_limit_from_root_guid_in_posts.rb
+++ b/db/migrate/20130613203350_remove_limit_from_root_guid_in_posts.rb
@@ -1,6 +1,10 @@
class RemoveLimitFromRootGuidInPosts < ActiveRecord::Migration
def up
+ remove_index 'posts', :name => 'index_posts_on_root_guid'
+ remove_index 'posts', :name => 'index_posts_on_author_id_and_root_guid'
change_column :posts, :root_guid, :string
+ add_index 'posts', ["root_guid"], :name => 'index_posts_on_root_guid', length: {"root_guid"=>191}
+ add_index 'posts', ["author_id", "root_guid"], :name => 'index_posts_on_author_id_and_root_guid', length: {"root_guid"=>190}, :using => :btree, :unique => true
end
def down
diff --git a/db/migrate/20140801101230_create_chat_contacts.rb b/db/migrate/20140801101230_create_chat_contacts.rb
new file mode 100644
index 000000000..718b5ae8d
--- /dev/null
+++ b/db/migrate/20140801101230_create_chat_contacts.rb
@@ -0,0 +1,17 @@
+class CreateChatContacts < ActiveRecord::Migration
+ def up
+ create_table :chat_contacts do |t|
+ t.integer :user_id, null: false
+ ## JID <= 3071 bytes http://tools.ietf.org/html/rfc6122
+ t.string :jid, null: false
+ t.string :name, limit: 255, null: true
+ t.string :ask, limit: 128, null: true
+ t.string :subscription, limit: 128, null: false
+ end
+ add_index :chat_contacts, [:user_id, :jid], unique: true, :length => {:jid => 190}
+ end
+
+ def down
+ drop_table :chat_contacts
+ end
+end
diff --git a/db/migrate/20140801101352_create_chat_fragments.rb b/db/migrate/20140801101352_create_chat_fragments.rb
new file mode 100644
index 000000000..0fbdc40ee
--- /dev/null
+++ b/db/migrate/20140801101352_create_chat_fragments.rb
@@ -0,0 +1,17 @@
+class CreateChatFragments < ActiveRecord::Migration
+ def up
+ create_table :chat_fragments do |t|
+ t.integer :user_id, null: false
+ t.string :root, limit: 256, null: false
+ t.string :namespace, limit: 256, null: false
+ t.text :xml, null: false
+ end
+ # That won't work due UTF-8 and the limit of 767 bytes
+ #add_index :chat_fragments, [:user_id, :root, :namespace], unique: true
+ add_index :chat_fragments, [:user_id], unique: true
+ end
+
+ def down
+ drop_table :chat_fragments
+ end
+end
diff --git a/db/migrate/20140824230505_add_completed_at_to_account_deletions.rb b/db/migrate/20140824230505_add_completed_at_to_account_deletions.rb
new file mode 100644
index 000000000..9b2af8c6a
--- /dev/null
+++ b/db/migrate/20140824230505_add_completed_at_to_account_deletions.rb
@@ -0,0 +1,5 @@
+class AddCompletedAtToAccountDeletions < ActiveRecord::Migration
+ def change
+ add_column :account_deletions, :completed_at, :datetime
+ end
+end
diff --git a/db/migrate/20140826165533_increase_simple_captcha_limit.rb b/db/migrate/20140826165533_increase_simple_captcha_limit.rb
new file mode 100644
index 000000000..b4d43dd64
--- /dev/null
+++ b/db/migrate/20140826165533_increase_simple_captcha_limit.rb
@@ -0,0 +1,8 @@
+class IncreaseSimpleCaptchaLimit < ActiveRecord::Migration
+ def self.up
+ change_column :simple_captcha_data, :value, :string, :limit => 12
+ end
+ def self.down
+ change_column :simple_captcha_data, :value, :string, :limit => 6
+ end
+end
diff --git a/db/migrate/20140906192846_fix_open_graph_data.rb b/db/migrate/20140906192846_fix_open_graph_data.rb
new file mode 100644
index 000000000..54959931d
--- /dev/null
+++ b/db/migrate/20140906192846_fix_open_graph_data.rb
@@ -0,0 +1,10 @@
+class FixOpenGraphData < ActiveRecord::Migration
+ def self.up
+ change_column :open_graph_caches, :url, :text
+ change_column :open_graph_caches, :image, :text
+ end
+ def self.down
+ change_column :open_graph_caches, :url, :string
+ change_column :open_graph_caches, :image, :string
+ end
+end
diff --git a/db/migrate/20141001162851_add_remove_after_to_users.rb b/db/migrate/20141001162851_add_remove_after_to_users.rb
new file mode 100644
index 000000000..c63b916b6
--- /dev/null
+++ b/db/migrate/20141001162851_add_remove_after_to_users.rb
@@ -0,0 +1,5 @@
+class AddRemoveAfterToUsers < ActiveRecord::Migration
+ def change
+ add_column :users, :remove_after, :datetime
+ end
+end
diff --git a/db/migrate/20141007003922_add_chat_enabled_to_aspects.rb b/db/migrate/20141007003922_add_chat_enabled_to_aspects.rb
new file mode 100644
index 000000000..ba4fd31fc
--- /dev/null
+++ b/db/migrate/20141007003922_add_chat_enabled_to_aspects.rb
@@ -0,0 +1,9 @@
+class AddChatEnabledToAspects < ActiveRecord::Migration
+ def self.up
+ add_column :aspects, :chat_enabled, :boolean, default: false
+ end
+
+ def self.down
+ remove_column :aspects, :chat_enabled
+ end
+end
diff --git a/db/migrate/20141024170120_create_chat_offline_messages.rb b/db/migrate/20141024170120_create_chat_offline_messages.rb
new file mode 100644
index 000000000..8c30101b0
--- /dev/null
+++ b/db/migrate/20141024170120_create_chat_offline_messages.rb
@@ -0,0 +1,14 @@
+class CreateChatOfflineMessages < ActiveRecord::Migration
+ def self.up
+ create_table :chat_offline_messages do |t|
+ t.string :from, :null => false
+ t.string :to, :null => false
+ t.text :message, :null => false
+ t.datetime "created_at", :null => false
+ end
+ end
+
+ def self.down
+ drop_table :chat_offline_messages
+ end
+end
diff --git a/db/migrate/20141209041241_drop_open_graph_caches_with_invalid_urls.rb b/db/migrate/20141209041241_drop_open_graph_caches_with_invalid_urls.rb
new file mode 100644
index 000000000..bfbfab884
--- /dev/null
+++ b/db/migrate/20141209041241_drop_open_graph_caches_with_invalid_urls.rb
@@ -0,0 +1,9 @@
+class DropOpenGraphCachesWithInvalidUrls < ActiveRecord::Migration
+ def up
+ OpenGraphCache.where(url: 'http://').delete_all
+ end
+
+ def down
+ raise ActiveRecord::IrreversibleMigration
+ end
+end
diff --git a/db/migrate/20141216213423_purge_orphan_conversations.rb b/db/migrate/20141216213423_purge_orphan_conversations.rb
new file mode 100644
index 000000000..c5eb90bff
--- /dev/null
+++ b/db/migrate/20141216213423_purge_orphan_conversations.rb
@@ -0,0 +1,13 @@
+class PurgeOrphanConversations < ActiveRecord::Migration
+ def up
+ Conversation.where(id: Conversation.joins("LEFT JOIN conversation_visibilities ON conversation_visibilities.conversation_id = conversations.id")
+ .group('conversations.id')
+ .having("COUNT(conversation_visibilities.id) = 0")
+ .pluck('conversations.id')
+ ).delete_all
+ end
+
+ def down
+ raise ActiveRecord::IrreversibleMigration
+ end
+end
diff --git a/db/migrate/20141227120907_add_export_to_user.rb b/db/migrate/20141227120907_add_export_to_user.rb
new file mode 100644
index 000000000..376d5fe36
--- /dev/null
+++ b/db/migrate/20141227120907_add_export_to_user.rb
@@ -0,0 +1,7 @@
+class AddExportToUser < ActiveRecord::Migration
+ def change
+ add_column :users, :export, :string
+ add_column :users, :exported_at, :datetime
+ add_column :users, :exporting, :boolean, default: false
+ end
+end
diff --git a/db/migrate/20141230214830_user_pref_strip_exif.rb b/db/migrate/20141230214830_user_pref_strip_exif.rb
new file mode 100644
index 000000000..79983181d
--- /dev/null
+++ b/db/migrate/20141230214830_user_pref_strip_exif.rb
@@ -0,0 +1,9 @@
+class UserPrefStripExif < ActiveRecord::Migration
+ def up
+ add_column :users, :strip_exif, :boolean, default: true
+ end
+
+ def down
+ remove_column :users, :strip_exif
+ end
+end
diff --git a/db/migrate/20150106050733_set_mysql_to_unicode_mb4.rb b/db/migrate/20150106050733_set_mysql_to_unicode_mb4.rb
new file mode 100644
index 000000000..37dd9373e
--- /dev/null
+++ b/db/migrate/20150106050733_set_mysql_to_unicode_mb4.rb
@@ -0,0 +1,113 @@
+class SetMysqlToUnicodeMb4 < ActiveRecord::Migration
+ # Converts the tables and strings columns to utf8mb4, which is the true, full
+ # unicode support in MySQl
+
+ def self.up
+ # shorten indexes regardless of the RDBMS provider - for consitency
+ shorten_indexes
+ change_encoding('utf8mb4', 'utf8mb4_bin') if AppConfig.mysql?
+ end
+
+ def self.down
+ change_encoding('utf8', 'utf8_bin') if AppConfig.mysql?
+ end
+
+ def check_config(encoding, collation)
+ connection_config = ActiveRecord::Base.connection_config
+ raise "Database encoding is not #{encoding}!" if connection_config[:encoding] != encoding
+ raise "Database collation is not #{collation}!" if connection_config[:collation] != collation
+ end
+
+ def change_encoding(encoding, collation)
+ # Make sure the podmin changed the database.yml file
+ check_config(encoding, collation)
+
+ execute "ALTER DATABASE `#{ActiveRecord::Base.connection.current_database}` CHARACTER SET #{encoding} COLLATE #{collation};"
+
+ tables.each do |table|
+
+ modify_text_columns = columns(table).select {|column| column.type == :text }.map {|column|
+ "MODIFY `#{column.name}` TEXT #{'NOT' unless column.null } NULL#{" DEFAULT '#{column.default}'" if column.has_default?}"
+ }.join(", ")
+
+ execute "ALTER TABLE `#{table}` CONVERT TO CHARACTER SET #{encoding} COLLATE #{collation}#{", #{modify_text_columns}" unless modify_text_columns.empty?};"
+ end
+ end
+
+ def shorten_indexes
+ remove_index 'aspect_visibilities', :name => 'shareable_and_aspect_id'
+ add_index 'aspect_visibilities', ["shareable_id", "shareable_type", "aspect_id"], :name => 'shareable_and_aspect_id', length: {"shareable_type"=>189}, :using => :btree
+
+ remove_index 'aspect_visibilities', :name => 'index_aspect_visibilities_on_shareable_id_and_shareable_type'
+ add_index 'aspect_visibilities', ["shareable_id", "shareable_type"], :name => 'index_aspect_visibilities_on_shareable_id_and_shareable_type', length: {"shareable_type"=>190}, :using => :btree
+
+ remove_index 'chat_contacts', :name => 'index_chat_contacts_on_user_id_and_jid'
+ add_index 'chat_contacts', ["user_id", "jid"], :name => 'index_chat_contacts_on_user_id_and_jid', length: {"jid"=>190}, :using => :btree, :unique => true
+
+ remove_index 'comments', :name => 'index_comments_on_guid'
+ add_index 'comments', ["guid"], :name => 'index_comments_on_guid', length: {"guid"=>191}, :using => :btree, :unique => true
+
+ remove_index 'likes', :name => 'index_likes_on_guid'
+ add_index 'likes', ["guid"], :name => 'index_likes_on_guid', length: {"guid"=>191}, :using => :btree, :unique => true
+
+ remove_index 'o_embed_caches', :name => 'index_o_embed_caches_on_url'
+ add_index 'o_embed_caches', ["url"], :name => 'index_o_embed_caches_on_url', length: {"url"=>191}, :using => :btree
+
+ remove_index 'participations', :name => 'index_participations_on_guid'
+ add_index 'participations', ["guid"], :name => 'index_participations_on_guid', length: {"guid"=>191}, :using => :btree
+
+ remove_index 'people', :name => 'index_people_on_diaspora_handle'
+ add_index "people", ["diaspora_handle"], :name => "index_people_on_diaspora_handle", :unique => true, :length => {"diaspora_handle" => 191}
+
+ remove_index 'people', :name => 'index_people_on_guid'
+ add_index 'people', ["guid"], :name => 'index_people_on_guid', length: {"guid"=>191}, :using => :btree, :unique => true
+
+ remove_index 'photos', :name => 'index_photos_on_status_message_guid'
+ add_index 'photos', ["status_message_guid"], :name => 'index_photos_on_status_message_guid', length: {"status_message_guid"=>191}, :using => :btree
+
+ remove_index 'posts', :name => 'index_posts_on_guid'
+ add_index 'posts', ["guid"], :name => 'index_posts_on_guid', length: {"guid"=>191}, :using => :btree, :unique => true
+
+ remove_index 'posts', :name => 'index_posts_on_status_message_guid_and_pending'
+ add_index 'posts', ["status_message_guid", "pending"], :name => 'index_posts_on_status_message_guid_and_pending', length: {"status_message_guid"=>190}, :using => :btree
+
+ remove_index 'posts', :name => 'index_posts_on_status_message_guid'
+ add_index 'posts', ["status_message_guid"], :name => 'index_posts_on_status_message_guid', length: {"status_message_guid"=>191}, :using => :btree
+
+ remove_index 'posts', :name => 'index_posts_on_author_id_and_root_guid'
+ add_index 'posts', ["author_id", "root_guid"], :name => 'index_posts_on_author_id_and_root_guid', length: {"root_guid"=>190}, :using => :btree, :unique => true
+
+ remove_index 'posts', :name => 'index_posts_on_root_guid'
+ add_index 'posts', ["root_guid"], :name => 'index_posts_on_root_guid', length: {"root_guid"=>191}
+
+ remove_index 'posts', :name => 'index_posts_on_tweet_id'
+ add_index 'posts', ['tweet_id'], :name => 'index_posts_on_tweet_id', length: {"tweet_id"=>191}, :using => :btree
+
+ remove_index 'rails_admin_histories', :name => 'index_rails_admin_histories'
+ add_index 'rails_admin_histories', ["item", "table", "month", "year"], :name => 'index_rails_admin_histories', length: {"table"=>188}, :using => :btree
+
+ remove_index 'schema_migrations', :name => 'unique_schema_migrations'
+ add_index 'schema_migrations', ["version"], :name => 'unique_schema_migrations', length: {"version"=>191}, :using => :btree
+
+ remove_index 'services', :name => 'index_services_on_type_and_uid'
+ add_index 'services', ["type", "uid"], :name => 'index_services_on_type_and_uid', length: {"type"=>64, "uid"=>127}, :using => :btree
+
+ remove_index 'taggings', :name => 'index_taggings_on_taggable_id_and_taggable_type_and_context'
+ add_index 'taggings', ["taggable_id", "taggable_type", "context"], :name => 'index_taggings_on_taggable_id_and_taggable_type_and_context', length: {"taggable_type"=>95, "context"=>95}, :using => :btree
+
+ remove_index 'tags', :name => 'index_tags_on_name'
+ add_index 'tags', ["name"], :name => 'index_tags_on_name', length: {"name"=>191}, :using => :btree, :unique => true
+
+ remove_index 'users', :name => 'index_users_on_invitation_service_and_invitation_identifier'
+ add_index 'users', ["invitation_service", "invitation_identifier"], :name => 'index_users_on_invitation_service_and_invitation_identifier', length: {"invitation_service"=>64, "invitation_identifier"=>127}, :using => :btree, :unique => true
+
+ remove_index 'users', :name => 'index_users_on_username'
+ add_index 'users', ["username"], :name => 'index_users_on_username', length: {"username"=>191}, :using => :btree, :unique => true
+
+ remove_index 'users', :name => 'index_users_on_email'
+ add_index 'users', ["email"], :name => 'index_users_on_email', length: {"email"=>191}, :using => :btree
+
+ remove_index 'notifications', :name => 'index_notifications_on_target_type_and_target_id'
+ add_index 'notifications', ["target_type", "target_id"], name: 'index_notifications_on_target_type_and_target_id', length: {"target_type"=>190}, using: :btree
+ end
+end
diff --git a/db/migrate/20150209230946_disable_mail_for_closed_account.rb b/db/migrate/20150209230946_disable_mail_for_closed_account.rb
new file mode 100644
index 000000000..575b16cfc
--- /dev/null
+++ b/db/migrate/20150209230946_disable_mail_for_closed_account.rb
@@ -0,0 +1,9 @@
+class DisableMailForClosedAccount < ActiveRecord::Migration
+ def up
+ User.joins(:person).where(people: {closed_account: true}).update_all(disable_mail: true)
+ end
+
+ def down
+ User.joins(:person).where(people: {closed_account: true}).update_all(disable_mail: false)
+ end
+end
diff --git a/db/migrate/20150220001357_add_photos_export_to_user.rb b/db/migrate/20150220001357_add_photos_export_to_user.rb
new file mode 100644
index 000000000..f19349723
--- /dev/null
+++ b/db/migrate/20150220001357_add_photos_export_to_user.rb
@@ -0,0 +1,13 @@
+class AddPhotosExportToUser < ActiveRecord::Migration
+ def up
+ add_column :users, :exported_photos_file, :string
+ add_column :users, :exported_photos_at, :datetime
+ add_column :users, :exporting_photos, :boolean, default: false
+ end
+
+ def down
+ remove_column :users, :exported_photos_file
+ remove_column :users, :exported_photos_at
+ remove_column :users, :exporting_photos
+ end
+end
diff --git a/db/schema.rb b/db/schema.rb
index e835151fb..6bdcab9ca 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -9,564 +9,586 @@
# from scratch. The latter is a flawed and unsustainable approach (the more migrations
# you'll amass, the slower it'll run and the greater likelihood for issues).
#
-# It's strongly recommended to check this file into your version control system.
+# It's strongly recommended that you check this file into your version control system.
-ActiveRecord::Schema.define(:version => 20140601102543) do
+ActiveRecord::Schema.define(version: 20150220001357) do
- create_table "account_deletions", :force => true do |t|
- t.string "diaspora_handle"
- t.integer "person_id"
+ create_table "account_deletions", force: :cascade do |t|
+ t.string "diaspora_handle", limit: 255
+ t.integer "person_id", limit: 4
+ t.datetime "completed_at"
end
- create_table "aspect_memberships", :force => true do |t|
- t.integer "aspect_id", :null => false
- t.integer "contact_id", :null => false
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
+ create_table "aspect_memberships", force: :cascade do |t|
+ t.integer "aspect_id", limit: 4, null: false
+ t.integer "contact_id", limit: 4, null: false
+ t.datetime "created_at", null: false
+ t.datetime "updated_at", null: false
end
- add_index "aspect_memberships", ["aspect_id", "contact_id"], :name => "index_aspect_memberships_on_aspect_id_and_contact_id", :unique => true
- add_index "aspect_memberships", ["aspect_id"], :name => "index_aspect_memberships_on_aspect_id"
- add_index "aspect_memberships", ["contact_id"], :name => "index_aspect_memberships_on_contact_id"
+ add_index "aspect_memberships", ["aspect_id", "contact_id"], name: "index_aspect_memberships_on_aspect_id_and_contact_id", unique: true, using: :btree
+ add_index "aspect_memberships", ["aspect_id"], name: "index_aspect_memberships_on_aspect_id", using: :btree
+ add_index "aspect_memberships", ["contact_id"], name: "index_aspect_memberships_on_contact_id", using: :btree
- create_table "aspect_visibilities", :force => true do |t|
- t.integer "shareable_id", :null => false
- t.integer "aspect_id", :null => false
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- t.string "shareable_type", :default => "Post", :null => false
+ create_table "aspect_visibilities", force: :cascade do |t|
+ t.integer "shareable_id", limit: 4, null: false
+ t.integer "aspect_id", limit: 4, null: false
+ t.datetime "created_at", null: false
+ t.datetime "updated_at", null: false
+ t.string "shareable_type", limit: 255, default: "Post", null: false
end
- add_index "aspect_visibilities", ["aspect_id"], :name => "index_aspect_visibilities_on_aspect_id"
- add_index "aspect_visibilities", ["shareable_id", "shareable_type", "aspect_id"], :name => "shareable_and_aspect_id"
- add_index "aspect_visibilities", ["shareable_id", "shareable_type"], :name => "index_aspect_visibilities_on_shareable_id_and_shareable_type"
-
- create_table "aspects", :force => true do |t|
- t.string "name", :null => false
- t.integer "user_id", :null => false
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- t.boolean "contacts_visible", :default => true, :null => false
- t.integer "order_id"
- end
-
- add_index "aspects", ["user_id", "contacts_visible"], :name => "index_aspects_on_user_id_and_contacts_visible"
- add_index "aspects", ["user_id"], :name => "index_aspects_on_user_id"
-
- create_table "blocks", :force => true do |t|
- t.integer "user_id"
- t.integer "person_id"
- end
-
- create_table "comments", :force => true do |t|
- t.text "text", :null => false
- t.integer "commentable_id", :null => false
- t.integer "author_id", :null => false
- t.string "guid", :null => false
- t.text "author_signature"
- t.text "parent_author_signature"
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- t.integer "likes_count", :default => 0, :null => false
- t.string "commentable_type", :limit => 60, :default => "Post", :null => false
+ add_index "aspect_visibilities", ["aspect_id"], name: "index_aspect_visibilities_on_aspect_id", using: :btree
+ add_index "aspect_visibilities", ["shareable_id", "shareable_type", "aspect_id"], name: "shareable_and_aspect_id", length: {"shareable_id"=>nil, "shareable_type"=>189, "aspect_id"=>nil}, using: :btree
+ add_index "aspect_visibilities", ["shareable_id", "shareable_type"], name: "index_aspect_visibilities_on_shareable_id_and_shareable_type", length: {"shareable_id"=>nil, "shareable_type"=>190}, using: :btree
+
+ create_table "aspects", force: :cascade do |t|
+ t.string "name", limit: 255, null: false
+ t.integer "user_id", limit: 4, null: false
+ t.datetime "created_at", null: false
+ t.datetime "updated_at", null: false
+ t.boolean "contacts_visible", default: true, null: false
+ t.integer "order_id", limit: 4
+ t.boolean "chat_enabled", default: false
end
- add_index "comments", ["author_id"], :name => "index_comments_on_person_id"
- add_index "comments", ["commentable_id", "commentable_type"], :name => "index_comments_on_commentable_id_and_commentable_type"
- add_index "comments", ["guid"], :name => "index_comments_on_guid", :unique => true
-
- create_table "contacts", :force => true do |t|
- t.integer "user_id", :null => false
- t.integer "person_id", :null => false
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- t.boolean "sharing", :default => false, :null => false
- t.boolean "receiving", :default => false, :null => false
+ add_index "aspects", ["user_id", "contacts_visible"], name: "index_aspects_on_user_id_and_contacts_visible", using: :btree
+ add_index "aspects", ["user_id"], name: "index_aspects_on_user_id", using: :btree
+
+ create_table "blocks", force: :cascade do |t|
+ t.integer "user_id", limit: 4
+ t.integer "person_id", limit: 4
end
- add_index "contacts", ["person_id"], :name => "index_contacts_on_person_id"
- add_index "contacts", ["user_id", "person_id"], :name => "index_contacts_on_user_id_and_person_id", :unique => true
-
- create_table "conversation_visibilities", :force => true do |t|
- t.integer "conversation_id", :null => false
- t.integer "person_id", :null => false
- t.integer "unread", :default => 0, :null => false
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
+ create_table "chat_contacts", force: :cascade do |t|
+ t.integer "user_id", limit: 4, null: false
+ t.string "jid", limit: 255, null: false
+ t.string "name", limit: 255
+ t.string "ask", limit: 128
+ t.string "subscription", limit: 128, null: false
end
- add_index "conversation_visibilities", ["conversation_id", "person_id"], :name => "index_conversation_visibilities_usefully", :unique => true
- add_index "conversation_visibilities", ["conversation_id"], :name => "index_conversation_visibilities_on_conversation_id"
- add_index "conversation_visibilities", ["person_id"], :name => "index_conversation_visibilities_on_person_id"
-
- create_table "conversations", :force => true do |t|
- t.string "subject"
- t.string "guid", :null => false
- t.integer "author_id", :null => false
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- end
-
- add_index "conversations", ["author_id"], :name => "conversations_author_id_fk"
-
- create_table "invitation_codes", :force => true do |t|
- t.string "token"
- t.integer "user_id"
- t.integer "count"
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
+ add_index "chat_contacts", ["user_id", "jid"], name: "index_chat_contacts_on_user_id_and_jid", unique: true, length: {"user_id"=>nil, "jid"=>190}, using: :btree
+
+ create_table "chat_fragments", force: :cascade do |t|
+ t.integer "user_id", limit: 4, null: false
+ t.string "root", limit: 256, null: false
+ t.string "namespace", limit: 256, null: false
+ t.text "xml", limit: 65535, null: false
end
- create_table "invitations", :force => true do |t|
- t.text "message"
- t.integer "sender_id"
- t.integer "recipient_id"
- t.integer "aspect_id"
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- t.string "service"
- t.string "identifier"
- t.boolean "admin", :default => false
- t.string "language", :default => "en"
- end
-
- add_index "invitations", ["aspect_id"], :name => "index_invitations_on_aspect_id"
- add_index "invitations", ["recipient_id"], :name => "index_invitations_on_recipient_id"
- add_index "invitations", ["sender_id"], :name => "index_invitations_on_sender_id"
-
- create_table "likes", :force => true do |t|
- t.boolean "positive", :default => true
- t.integer "target_id"
- t.integer "author_id"
- t.string "guid"
- t.text "author_signature"
- t.text "parent_author_signature"
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- t.string "target_type", :limit => 60, :null => false
- end
-
- add_index "likes", ["author_id"], :name => "likes_author_id_fk"
- add_index "likes", ["guid"], :name => "index_likes_on_guid", :unique => true
- add_index "likes", ["target_id", "author_id", "target_type"], :name => "index_likes_on_target_id_and_author_id_and_target_type", :unique => true
- add_index "likes", ["target_id"], :name => "index_likes_on_post_id"
-
- create_table "locations", :force => true do |t|
- t.string "address"
- t.string "lat"
- t.string "lng"
- t.integer "status_message_id"
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- end
-
- create_table "mentions", :force => true do |t|
- t.integer "post_id", :null => false
- t.integer "person_id", :null => false
- end
-
- add_index "mentions", ["person_id", "post_id"], :name => "index_mentions_on_person_id_and_post_id", :unique => true
- add_index "mentions", ["person_id"], :name => "index_mentions_on_person_id"
- add_index "mentions", ["post_id"], :name => "index_mentions_on_post_id"
-
- create_table "messages", :force => true do |t|
- t.integer "conversation_id", :null => false
- t.integer "author_id", :null => false
- t.string "guid", :null => false
- t.text "text", :null => false
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- t.text "author_signature"
- t.text "parent_author_signature"
- end
-
- add_index "messages", ["author_id"], :name => "index_messages_on_author_id"
- add_index "messages", ["conversation_id"], :name => "messages_conversation_id_fk"
-
- create_table "notification_actors", :force => true do |t|
- t.integer "notification_id"
- t.integer "person_id"
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- end
-
- add_index "notification_actors", ["notification_id", "person_id"], :name => "index_notification_actors_on_notification_id_and_person_id", :unique => true
- add_index "notification_actors", ["notification_id"], :name => "index_notification_actors_on_notification_id"
- add_index "notification_actors", ["person_id"], :name => "index_notification_actors_on_person_id"
-
- create_table "notifications", :force => true do |t|
- t.string "target_type"
- t.integer "target_id"
- t.integer "recipient_id", :null => false
- t.boolean "unread", :default => true, :null => false
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- t.string "type"
- end
-
- add_index "notifications", ["recipient_id"], :name => "index_notifications_on_recipient_id"
- add_index "notifications", ["target_id"], :name => "index_notifications_on_target_id"
- add_index "notifications", ["target_type", "target_id"], :name => "index_notifications_on_target_type_and_target_id"
-
- create_table "o_embed_caches", :force => true do |t|
- t.string "url", :limit => 1024, :null => false
- t.text "data", :null => false
- end
-
- add_index "o_embed_caches", ["url"], :name => "index_o_embed_caches_on_url", :length => {"url"=>255}
-
- create_table "open_graph_caches", :force => true do |t|
- t.string "title"
- t.string "ob_type"
- t.string "image"
- t.string "url"
- t.text "description"
- end
-
- create_table "participations", :force => true do |t|
- t.string "guid"
- t.integer "target_id"
- t.string "target_type", :limit => 60, :null => false
- t.integer "author_id"
- t.text "author_signature"
- t.text "parent_author_signature"
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- end
-
- add_index "participations", ["guid"], :name => "index_participations_on_guid"
- add_index "participations", ["target_id", "target_type", "author_id"], :name => "index_participations_on_target_id_and_target_type_and_author_id"
-
- create_table "people", :force => true do |t|
- t.string "guid", :null => false
- t.text "url", :null => false
- t.string "diaspora_handle", :null => false
- t.text "serialized_public_key", :null => false
- t.integer "owner_id"
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- t.boolean "closed_account", :default => false
- t.integer "fetch_status", :default => 0
- end
-
- add_index "people", ["diaspora_handle"], :name => "index_people_on_diaspora_handle", :unique => true
- add_index "people", ["guid"], :name => "index_people_on_guid", :unique => true
- add_index "people", ["owner_id"], :name => "index_people_on_owner_id", :unique => true
-
- create_table "photos", :force => true do |t|
- t.integer "tmp_old_id"
- t.integer "author_id", :null => false
- t.boolean "public", :default => false, :null => false
- t.string "diaspora_handle"
- t.string "guid", :null => false
- t.boolean "pending", :default => false, :null => false
- t.text "text"
- t.text "remote_photo_path"
- t.string "remote_photo_name"
- t.string "random_string"
- t.string "processed_image"
+ add_index "chat_fragments", ["user_id"], name: "index_chat_fragments_on_user_id", unique: true, using: :btree
+
+ create_table "chat_offline_messages", force: :cascade do |t|
+ t.string "from", limit: 255, null: false
+ t.string "to", limit: 255, null: false
+ t.text "message", limit: 65535, null: false
+ t.datetime "created_at", null: false
+ end
+
+ create_table "comments", force: :cascade do |t|
+ t.text "text", limit: 65535, null: false
+ t.integer "commentable_id", limit: 4, null: false
+ t.integer "author_id", limit: 4, null: false
+ t.string "guid", limit: 255, null: false
+ t.text "author_signature", limit: 65535
+ t.text "parent_author_signature", limit: 65535
+ t.datetime "created_at", null: false
+ t.datetime "updated_at", null: false
+ t.integer "likes_count", limit: 4, default: 0, null: false
+ t.string "commentable_type", limit: 60, default: "Post", null: false
+ end
+
+ add_index "comments", ["author_id"], name: "index_comments_on_person_id", using: :btree
+ add_index "comments", ["commentable_id", "commentable_type"], name: "index_comments_on_commentable_id_and_commentable_type", using: :btree
+ add_index "comments", ["guid"], name: "index_comments_on_guid", unique: true, length: {"guid"=>191}, using: :btree
+
+ create_table "contacts", force: :cascade do |t|
+ t.integer "user_id", limit: 4, null: false
+ t.integer "person_id", limit: 4, null: false
+ t.datetime "created_at", null: false
+ t.datetime "updated_at", null: false
+ t.boolean "sharing", default: false, null: false
+ t.boolean "receiving", default: false, null: false
+ end
+
+ add_index "contacts", ["person_id"], name: "index_contacts_on_person_id", using: :btree
+ add_index "contacts", ["user_id", "person_id"], name: "index_contacts_on_user_id_and_person_id", unique: true, using: :btree
+
+ create_table "conversation_visibilities", force: :cascade do |t|
+ t.integer "conversation_id", limit: 4, null: false
+ t.integer "person_id", limit: 4, null: false
+ t.integer "unread", limit: 4, default: 0, null: false
+ t.datetime "created_at", null: false
+ t.datetime "updated_at", null: false
+ end
+
+ add_index "conversation_visibilities", ["conversation_id", "person_id"], name: "index_conversation_visibilities_usefully", unique: true, using: :btree
+ add_index "conversation_visibilities", ["conversation_id"], name: "index_conversation_visibilities_on_conversation_id", using: :btree
+ add_index "conversation_visibilities", ["person_id"], name: "index_conversation_visibilities_on_person_id", using: :btree
+
+ create_table "conversations", force: :cascade do |t|
+ t.string "subject", limit: 255
+ t.string "guid", limit: 255, null: false
+ t.integer "author_id", limit: 4, null: false
+ t.datetime "created_at", null: false
+ t.datetime "updated_at", null: false
+ end
+
+ add_index "conversations", ["author_id"], name: "conversations_author_id_fk", using: :btree
+
+ create_table "invitation_codes", force: :cascade do |t|
+ t.string "token", limit: 255
+ t.integer "user_id", limit: 4
+ t.integer "count", limit: 4
+ t.datetime "created_at", null: false
+ t.datetime "updated_at", null: false
+ end
+
+ create_table "invitations", force: :cascade do |t|
+ t.text "message", limit: 65535
+ t.integer "sender_id", limit: 4
+ t.integer "recipient_id", limit: 4
+ t.integer "aspect_id", limit: 4
+ t.datetime "created_at", null: false
+ t.datetime "updated_at", null: false
+ t.string "service", limit: 255
+ t.string "identifier", limit: 255
+ t.boolean "admin", default: false
+ t.string "language", limit: 255, default: "en"
+ end
+
+ add_index "invitations", ["aspect_id"], name: "index_invitations_on_aspect_id", using: :btree
+ add_index "invitations", ["recipient_id"], name: "index_invitations_on_recipient_id", using: :btree
+ add_index "invitations", ["sender_id"], name: "index_invitations_on_sender_id", using: :btree
+
+ create_table "likes", force: :cascade do |t|
+ t.boolean "positive", default: true
+ t.integer "target_id", limit: 4
+ t.integer "author_id", limit: 4
+ t.string "guid", limit: 255
+ t.text "author_signature", limit: 65535
+ t.text "parent_author_signature", limit: 65535
+ t.datetime "created_at", null: false
+ t.datetime "updated_at", null: false
+ t.string "target_type", limit: 60, null: false
+ end
+
+ add_index "likes", ["author_id"], name: "likes_author_id_fk", using: :btree
+ add_index "likes", ["guid"], name: "index_likes_on_guid", unique: true, length: {"guid"=>191}, using: :btree
+ add_index "likes", ["target_id", "author_id", "target_type"], name: "index_likes_on_target_id_and_author_id_and_target_type", unique: true, using: :btree
+ add_index "likes", ["target_id"], name: "index_likes_on_post_id", using: :btree
+
+ create_table "locations", force: :cascade do |t|
+ t.string "address", limit: 255
+ t.string "lat", limit: 255
+ t.string "lng", limit: 255
+ t.integer "status_message_id", limit: 4
+ t.datetime "created_at", null: false
+ t.datetime "updated_at", null: false
+ end
+
+ create_table "mentions", force: :cascade do |t|
+ t.integer "post_id", limit: 4, null: false
+ t.integer "person_id", limit: 4, null: false
+ end
+
+ add_index "mentions", ["person_id", "post_id"], name: "index_mentions_on_person_id_and_post_id", unique: true, using: :btree
+ add_index "mentions", ["person_id"], name: "index_mentions_on_person_id", using: :btree
+ add_index "mentions", ["post_id"], name: "index_mentions_on_post_id", using: :btree
+
+ create_table "messages", force: :cascade do |t|
+ t.integer "conversation_id", limit: 4, null: false
+ t.integer "author_id", limit: 4, null: false
+ t.string "guid", limit: 255, null: false
+ t.text "text", limit: 65535, null: false
+ t.datetime "created_at", null: false
+ t.datetime "updated_at", null: false
+ t.text "author_signature", limit: 65535
+ t.text "parent_author_signature", limit: 65535
+ end
+
+ add_index "messages", ["author_id"], name: "index_messages_on_author_id", using: :btree
+ add_index "messages", ["conversation_id"], name: "messages_conversation_id_fk", using: :btree
+
+ create_table "notification_actors", force: :cascade do |t|
+ t.integer "notification_id", limit: 4
+ t.integer "person_id", limit: 4
+ t.datetime "created_at", null: false
+ t.datetime "updated_at", null: false
+ end
+
+ add_index "notification_actors", ["notification_id", "person_id"], name: "index_notification_actors_on_notification_id_and_person_id", unique: true, using: :btree
+ add_index "notification_actors", ["notification_id"], name: "index_notification_actors_on_notification_id", using: :btree
+ add_index "notification_actors", ["person_id"], name: "index_notification_actors_on_person_id", using: :btree
+
+ create_table "notifications", force: :cascade do |t|
+ t.string "target_type", limit: 255
+ t.integer "target_id", limit: 4
+ t.integer "recipient_id", limit: 4, null: false
+ t.boolean "unread", default: true, null: false
+ t.datetime "created_at", null: false
+ t.datetime "updated_at", null: false
+ t.string "type", limit: 255
+ end
+
+ add_index "notifications", ["recipient_id"], name: "index_notifications_on_recipient_id", using: :btree
+ add_index "notifications", ["target_id"], name: "index_notifications_on_target_id", using: :btree
+ add_index "notifications", ["target_type", "target_id"], name: "index_notifications_on_target_type_and_target_id", length: {"target_type"=>190, "target_id"=>nil}, using: :btree
+
+ create_table "o_embed_caches", force: :cascade do |t|
+ t.string "url", limit: 1024, null: false
+ t.text "data", limit: 65535, null: false
+ end
+
+ add_index "o_embed_caches", ["url"], name: "index_o_embed_caches_on_url", length: {"url"=>191}, using: :btree
+
+ create_table "open_graph_caches", force: :cascade do |t|
+ t.string "title", limit: 255
+ t.string "ob_type", limit: 255
+ t.text "image", limit: 65535
+ t.text "url", limit: 65535
+ t.text "description", limit: 65535
+ end
+
+ create_table "participations", force: :cascade do |t|
+ t.string "guid", limit: 255
+ t.integer "target_id", limit: 4
+ t.string "target_type", limit: 60, null: false
+ t.integer "author_id", limit: 4
+ t.text "author_signature", limit: 65535
+ t.text "parent_author_signature", limit: 65535
+ t.datetime "created_at", null: false
+ t.datetime "updated_at", null: false
+ end
+
+ add_index "participations", ["guid"], name: "index_participations_on_guid", length: {"guid"=>191}, using: :btree
+ add_index "participations", ["target_id", "target_type", "author_id"], name: "index_participations_on_target_id_and_target_type_and_author_id", using: :btree
+
+ create_table "people", force: :cascade do |t|
+ t.string "guid", limit: 255, null: false
+ t.text "url", limit: 65535, null: false
+ t.string "diaspora_handle", limit: 255, null: false
+ t.text "serialized_public_key", limit: 65535, null: false
+ t.integer "owner_id", limit: 4
+ t.datetime "created_at", null: false
+ t.datetime "updated_at", null: false
+ t.boolean "closed_account", default: false
+ t.integer "fetch_status", limit: 4, default: 0
+ end
+
+ add_index "people", ["diaspora_handle"], name: "index_people_on_diaspora_handle", unique: true, length: {"diaspora_handle"=>191}, using: :btree
+ add_index "people", ["guid"], name: "index_people_on_guid", unique: true, length: {"guid"=>191}, using: :btree
+ add_index "people", ["owner_id"], name: "index_people_on_owner_id", unique: true, using: :btree
+
+ create_table "photos", force: :cascade do |t|
+ t.integer "tmp_old_id", limit: 4
+ t.integer "author_id", limit: 4, null: false
+ t.boolean "public", default: false, null: false
+ t.string "diaspora_handle", limit: 255
+ t.string "guid", limit: 255, null: false
+ t.boolean "pending", default: false, null: false
+ t.text "text", limit: 65535
+ t.text "remote_photo_path", limit: 65535
+ t.string "remote_photo_name", limit: 255
+ t.string "random_string", limit: 255
+ t.string "processed_image", limit: 255
t.datetime "created_at"
t.datetime "updated_at"
- t.string "unprocessed_image"
- t.string "status_message_guid"
- t.integer "comments_count"
- t.integer "height"
- t.integer "width"
+ t.string "unprocessed_image", limit: 255
+ t.string "status_message_guid", limit: 255
+ t.integer "comments_count", limit: 4
+ t.integer "height", limit: 4
+ t.integer "width", limit: 4
end
- add_index "photos", ["status_message_guid"], :name => "index_photos_on_status_message_guid"
+ add_index "photos", ["status_message_guid"], name: "index_photos_on_status_message_guid", length: {"status_message_guid"=>191}, using: :btree
- create_table "pods", :force => true do |t|
- t.string "host"
+ create_table "pods", force: :cascade do |t|
+ t.string "host", limit: 255
t.boolean "ssl"
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
+ t.datetime "created_at", null: false
+ t.datetime "updated_at", null: false
end
- create_table "poll_answers", :force => true do |t|
- t.string "answer", :null => false
- t.integer "poll_id", :null => false
- t.string "guid"
- t.integer "vote_count", :default => 0
+ create_table "poll_answers", force: :cascade do |t|
+ t.string "answer", limit: 255, null: false
+ t.integer "poll_id", limit: 4, null: false
+ t.string "guid", limit: 255
+ t.integer "vote_count", limit: 4, default: 0
end
- add_index "poll_answers", ["poll_id"], :name => "index_poll_answers_on_poll_id"
+ add_index "poll_answers", ["poll_id"], name: "index_poll_answers_on_poll_id", using: :btree
- create_table "poll_participations", :force => true do |t|
- t.integer "poll_answer_id", :null => false
- t.integer "author_id", :null => false
- t.integer "poll_id", :null => false
- t.string "guid"
- t.text "author_signature"
- t.text "parent_author_signature"
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
+ create_table "poll_participations", force: :cascade do |t|
+ t.integer "poll_answer_id", limit: 4, null: false
+ t.integer "author_id", limit: 4, null: false
+ t.integer "poll_id", limit: 4, null: false
+ t.string "guid", limit: 255
+ t.text "author_signature", limit: 65535
+ t.text "parent_author_signature", limit: 65535
+ t.datetime "created_at"
+ t.datetime "updated_at"
end
- add_index "poll_participations", ["poll_id"], :name => "index_poll_participations_on_poll_id"
+ add_index "poll_participations", ["poll_id"], name: "index_poll_participations_on_poll_id", using: :btree
- create_table "polls", :force => true do |t|
- t.string "question", :null => false
- t.integer "status_message_id", :null => false
+ create_table "polls", force: :cascade do |t|
+ t.string "question", limit: 255, null: false
+ t.integer "status_message_id", limit: 4, null: false
t.boolean "status"
- t.string "guid"
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- end
-
- add_index "polls", ["status_message_id"], :name => "index_polls_on_status_message_id"
-
- create_table "posts", :force => true do |t|
- t.integer "author_id", :null => false
- t.boolean "public", :default => false, :null => false
- t.string "diaspora_handle"
- t.string "guid", :null => false
- t.boolean "pending", :default => false, :null => false
- t.string "type", :limit => 40, :null => false
- t.text "text"
- t.text "remote_photo_path"
- t.string "remote_photo_name"
- t.string "random_string"
- t.string "processed_image"
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- t.string "unprocessed_image"
- t.string "object_url"
- t.string "image_url"
- t.integer "image_height"
- t.integer "image_width"
- t.string "provider_display_name"
- t.string "actor_url"
- t.string "objectId"
- t.string "root_guid"
- t.string "status_message_guid"
- t.integer "likes_count", :default => 0
- t.integer "comments_count", :default => 0
- t.integer "o_embed_cache_id"
- t.integer "reshares_count", :default => 0
- t.datetime "interacted_at"
- t.string "frame_name"
- t.boolean "favorite", :default => false
- t.string "facebook_id"
- t.string "tweet_id"
- t.integer "open_graph_cache_id"
- t.text "tumblr_ids"
- end
-
- add_index "posts", ["author_id", "root_guid"], :name => "index_posts_on_author_id_and_root_guid", :unique => true
- add_index "posts", ["author_id"], :name => "index_posts_on_person_id"
- add_index "posts", ["guid"], :name => "index_posts_on_guid", :unique => true
- add_index "posts", ["id", "type", "created_at"], :name => "index_posts_on_id_and_type_and_created_at"
- add_index "posts", ["root_guid"], :name => "index_posts_on_root_guid"
- add_index "posts", ["status_message_guid", "pending"], :name => "index_posts_on_status_message_guid_and_pending"
- add_index "posts", ["status_message_guid"], :name => "index_posts_on_status_message_guid"
- add_index "posts", ["tweet_id"], :name => "index_posts_on_tweet_id"
- add_index "posts", ["type", "pending", "id"], :name => "index_posts_on_type_and_pending_and_id"
-
- create_table "profiles", :force => true do |t|
- t.string "diaspora_handle"
- t.string "first_name", :limit => 127
- t.string "last_name", :limit => 127
- t.string "image_url"
- t.string "image_url_small"
- t.string "image_url_medium"
- t.date "birthday"
- t.string "gender"
- t.text "bio"
- t.boolean "searchable", :default => true, :null => false
- t.integer "person_id", :null => false
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- t.string "location"
- t.string "full_name", :limit => 70
- t.boolean "nsfw", :default => false
- end
-
- add_index "profiles", ["full_name", "searchable"], :name => "index_profiles_on_full_name_and_searchable"
- add_index "profiles", ["full_name"], :name => "index_profiles_on_full_name"
- add_index "profiles", ["person_id"], :name => "index_profiles_on_person_id"
-
- create_table "rails_admin_histories", :force => true do |t|
- t.text "message"
- t.string "username"
- t.integer "item"
- t.string "table"
- t.integer "month", :limit => 2
- t.integer "year", :limit => 8
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- end
-
- add_index "rails_admin_histories", ["item", "table", "month", "year"], :name => "index_rails_admin_histories"
-
- create_table "reports", :force => true do |t|
- t.integer "item_id", :null => false
- t.string "item_type", :null => false
- t.boolean "reviewed", :default => false
- t.text "text"
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- t.integer "user_id", :null => false
- end
-
- add_index "reports", ["item_id"], :name => "index_post_reports_on_post_id"
-
- create_table "roles", :force => true do |t|
- t.integer "person_id"
- t.string "name"
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- end
-
- create_table "services", :force => true do |t|
- t.string "type", :limit => 127, :null => false
- t.integer "user_id", :null => false
- t.string "uid", :limit => 127
- t.string "access_token"
- t.string "access_secret"
- t.string "nickname"
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- end
-
- add_index "services", ["type", "uid"], :name => "index_services_on_type_and_uid"
- add_index "services", ["user_id"], :name => "index_services_on_user_id"
-
- create_table "share_visibilities", :force => true do |t|
- t.integer "shareable_id", :null => false
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- t.boolean "hidden", :default => false, :null => false
- t.integer "contact_id", :null => false
- t.string "shareable_type", :limit => 60, :default => "Post", :null => false
- end
-
- add_index "share_visibilities", ["contact_id"], :name => "index_post_visibilities_on_contact_id"
- add_index "share_visibilities", ["shareable_id", "shareable_type", "contact_id"], :name => "shareable_and_contact_id"
- add_index "share_visibilities", ["shareable_id", "shareable_type", "hidden", "contact_id"], :name => "shareable_and_hidden_and_contact_id"
- add_index "share_visibilities", ["shareable_id"], :name => "index_post_visibilities_on_post_id"
-
- create_table "simple_captcha_data", :force => true do |t|
- t.string "key", :limit => 40
- t.string "value", :limit => 6
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- end
-
- add_index "simple_captcha_data", ["key"], :name => "idx_key"
-
- create_table "tag_followings", :force => true do |t|
- t.integer "tag_id", :null => false
- t.integer "user_id", :null => false
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- end
-
- add_index "tag_followings", ["tag_id", "user_id"], :name => "index_tag_followings_on_tag_id_and_user_id", :unique => true
- add_index "tag_followings", ["tag_id"], :name => "index_tag_followings_on_tag_id"
- add_index "tag_followings", ["user_id"], :name => "index_tag_followings_on_user_id"
-
- create_table "taggings", :force => true do |t|
- t.integer "tag_id"
- t.integer "taggable_id"
- t.string "taggable_type", :limit => 127
- t.integer "tagger_id"
- t.string "tagger_type", :limit => 127
- t.string "context", :limit => 127
+ t.string "guid", limit: 255
t.datetime "created_at"
+ t.datetime "updated_at"
end
- add_index "taggings", ["created_at"], :name => "index_taggings_on_created_at"
- add_index "taggings", ["tag_id"], :name => "index_taggings_on_tag_id"
- add_index "taggings", ["taggable_id", "taggable_type", "context"], :name => "index_taggings_on_taggable_id_and_taggable_type_and_context"
- add_index "taggings", ["taggable_id", "taggable_type", "tag_id"], :name => "index_taggings_uniquely", :unique => true
-
- create_table "tags", :force => true do |t|
- t.string "name"
- t.integer "taggings_count", :default => 0
+ add_index "polls", ["status_message_id"], name: "index_polls_on_status_message_id", using: :btree
+
+ create_table "posts", force: :cascade do |t|
+ t.integer "author_id", limit: 4, null: false
+ t.boolean "public", default: false, null: false
+ t.string "diaspora_handle", limit: 255
+ t.string "guid", limit: 255, null: false
+ t.boolean "pending", default: false, null: false
+ t.string "type", limit: 40, null: false
+ t.text "text", limit: 65535
+ t.text "remote_photo_path", limit: 65535
+ t.string "remote_photo_name", limit: 255
+ t.string "random_string", limit: 255
+ t.string "processed_image", limit: 255
+ t.datetime "created_at", null: false
+ t.datetime "updated_at", null: false
+ t.string "unprocessed_image", limit: 255
+ t.string "object_url", limit: 255
+ t.string "image_url", limit: 255
+ t.integer "image_height", limit: 4
+ t.integer "image_width", limit: 4
+ t.string "provider_display_name", limit: 255
+ t.string "actor_url", limit: 255
+ t.string "objectId", limit: 255
+ t.string "root_guid", limit: 255
+ t.string "status_message_guid", limit: 255
+ t.integer "likes_count", limit: 4, default: 0
+ t.integer "comments_count", limit: 4, default: 0
+ t.integer "o_embed_cache_id", limit: 4
+ t.integer "reshares_count", limit: 4, default: 0
+ t.datetime "interacted_at"
+ t.string "frame_name", limit: 255
+ t.boolean "favorite", default: false
+ t.string "facebook_id", limit: 255
+ t.string "tweet_id", limit: 255
+ t.integer "open_graph_cache_id", limit: 4
+ t.text "tumblr_ids", limit: 65535
+ end
+
+ add_index "posts", ["author_id", "root_guid"], name: "index_posts_on_author_id_and_root_guid", unique: true, length: {"author_id"=>nil, "root_guid"=>190}, using: :btree
+ add_index "posts", ["author_id"], name: "index_posts_on_person_id", using: :btree
+ add_index "posts", ["guid"], name: "index_posts_on_guid", unique: true, length: {"guid"=>191}, using: :btree
+ add_index "posts", ["id", "type", "created_at"], name: "index_posts_on_id_and_type_and_created_at", using: :btree
+ add_index "posts", ["root_guid"], name: "index_posts_on_root_guid", length: {"root_guid"=>191}, using: :btree
+ add_index "posts", ["status_message_guid", "pending"], name: "index_posts_on_status_message_guid_and_pending", length: {"status_message_guid"=>190, "pending"=>nil}, using: :btree
+ add_index "posts", ["status_message_guid"], name: "index_posts_on_status_message_guid", length: {"status_message_guid"=>191}, using: :btree
+ add_index "posts", ["tweet_id"], name: "index_posts_on_tweet_id", length: {"tweet_id"=>191}, using: :btree
+ add_index "posts", ["type", "pending", "id"], name: "index_posts_on_type_and_pending_and_id", using: :btree
+
+ create_table "profiles", force: :cascade do |t|
+ t.string "diaspora_handle", limit: 255
+ t.string "first_name", limit: 127
+ t.string "last_name", limit: 127
+ t.string "image_url", limit: 255
+ t.string "image_url_small", limit: 255
+ t.string "image_url_medium", limit: 255
+ t.date "birthday"
+ t.string "gender", limit: 255
+ t.text "bio", limit: 65535
+ t.boolean "searchable", default: true, null: false
+ t.integer "person_id", limit: 4, null: false
+ t.datetime "created_at", null: false
+ t.datetime "updated_at", null: false
+ t.string "location", limit: 255
+ t.string "full_name", limit: 70
+ t.boolean "nsfw", default: false
+ end
+
+ add_index "profiles", ["full_name", "searchable"], name: "index_profiles_on_full_name_and_searchable", using: :btree
+ add_index "profiles", ["full_name"], name: "index_profiles_on_full_name", using: :btree
+ add_index "profiles", ["person_id"], name: "index_profiles_on_person_id", using: :btree
+
+ create_table "rails_admin_histories", force: :cascade do |t|
+ t.text "message", limit: 65535
+ t.string "username", limit: 255
+ t.integer "item", limit: 4
+ t.string "table", limit: 255
+ t.integer "month", limit: 2
+ t.integer "year", limit: 8
+ t.datetime "created_at", null: false
+ t.datetime "updated_at", null: false
+ end
+
+ add_index "rails_admin_histories", ["item", "table", "month", "year"], name: "index_rails_admin_histories", length: {"item"=>nil, "table"=>188, "month"=>nil, "year"=>nil}, using: :btree
+
+ create_table "reports", force: :cascade do |t|
+ t.integer "item_id", limit: 4, null: false
+ t.string "item_type", limit: 255, null: false
+ t.boolean "reviewed", default: false
+ t.text "text", limit: 65535
+ t.datetime "created_at"
+ t.datetime "updated_at"
+ t.integer "user_id", limit: 4, null: false
end
- add_index "tags", ["name"], :name => "index_tags_on_name", :unique => true
+ add_index "reports", ["item_id"], name: "index_reports_on_item_id", using: :btree
- create_table "user_preferences", :force => true do |t|
- t.string "email_type"
- t.integer "user_id"
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
+ create_table "roles", force: :cascade do |t|
+ t.integer "person_id", limit: 4
+ t.string "name", limit: 255
+ t.datetime "created_at", null: false
+ t.datetime "updated_at", null: false
end
- create_table "users", :force => true do |t|
- t.string "username"
- t.text "serialized_private_key"
- t.boolean "getting_started", :default => true, :null => false
- t.boolean "disable_mail", :default => false, :null => false
- t.string "language"
- t.string "email", :default => "", :null => false
- t.string "encrypted_password", :default => "", :null => false
- t.string "invitation_token", :limit => 60
- t.datetime "invitation_sent_at"
- t.string "reset_password_token"
- t.datetime "remember_created_at"
- t.integer "sign_in_count", :default => 0
- t.datetime "current_sign_in_at"
- t.datetime "last_sign_in_at"
- t.string "current_sign_in_ip"
- t.string "last_sign_in_ip"
- t.datetime "created_at", :null => false
- t.datetime "updated_at", :null => false
- t.string "invitation_service", :limit => 127
- t.string "invitation_identifier", :limit => 127
- t.integer "invitation_limit"
- t.integer "invited_by_id"
- t.string "invited_by_type"
- t.string "authentication_token", :limit => 30
- t.string "unconfirmed_email"
- t.string "confirm_email_token", :limit => 30
- t.datetime "locked_at"
- t.boolean "show_community_spotlight_in_stream", :default => true, :null => false
- t.boolean "auto_follow_back", :default => false
- t.integer "auto_follow_back_aspect_id"
- t.text "hidden_shareables"
- t.datetime "reset_password_sent_at"
- t.datetime "last_seen"
+ create_table "services", force: :cascade do |t|
+ t.string "type", limit: 127, null: false
+ t.integer "user_id", limit: 4, null: false
+ t.string "uid", limit: 127
+ t.string "access_token", limit: 255
+ t.string "access_secret", limit: 255
+ t.string "nickname", limit: 255
+ t.datetime "created_at", null: false
+ t.datetime "updated_at", null: false
end
- add_index "users", ["authentication_token"], :name => "index_users_on_authentication_token", :unique => true
- add_index "users", ["email"], :name => "index_users_on_email"
- add_index "users", ["invitation_service", "invitation_identifier"], :name => "index_users_on_invitation_service_and_invitation_identifier", :unique => true
- add_index "users", ["invitation_token"], :name => "index_users_on_invitation_token"
- add_index "users", ["username"], :name => "index_users_on_username", :unique => true
-
- add_foreign_key "aspect_memberships", "aspects", name: "aspect_memberships_aspect_id_fk", dependent: :delete
- add_foreign_key "aspect_memberships", "contacts", name: "aspect_memberships_contact_id_fk", dependent: :delete
+ add_index "services", ["type", "uid"], name: "index_services_on_type_and_uid", length: {"type"=>64, "uid"=>nil}, using: :btree
+ add_index "services", ["user_id"], name: "index_services_on_user_id", using: :btree
- add_foreign_key "aspect_visibilities", "aspects", name: "aspect_visibilities_aspect_id_fk", dependent: :delete
-
- add_foreign_key "comments", "people", name: "comments_author_id_fk", column: "author_id", dependent: :delete
-
- add_foreign_key "contacts", "people", name: "contacts_person_id_fk", dependent: :delete
+ create_table "share_visibilities", force: :cascade do |t|
+ t.integer "shareable_id", limit: 4, null: false
+ t.datetime "created_at", null: false
+ t.datetime "updated_at", null: false
+ t.boolean "hidden", default: false, null: false
+ t.integer "contact_id", limit: 4, null: false
+ t.string "shareable_type", limit: 60, default: "Post", null: false
+ end
- add_foreign_key "conversation_visibilities", "conversations", name: "conversation_visibilities_conversation_id_fk", dependent: :delete
- add_foreign_key "conversation_visibilities", "people", name: "conversation_visibilities_person_id_fk", dependent: :delete
+ add_index "share_visibilities", ["contact_id"], name: "index_post_visibilities_on_contact_id", using: :btree
+ add_index "share_visibilities", ["shareable_id", "shareable_type", "contact_id"], name: "shareable_and_contact_id", using: :btree
+ add_index "share_visibilities", ["shareable_id", "shareable_type", "hidden", "contact_id"], name: "shareable_and_hidden_and_contact_id", using: :btree
+ add_index "share_visibilities", ["shareable_id"], name: "index_post_visibilities_on_post_id", using: :btree
- add_foreign_key "conversations", "people", name: "conversations_author_id_fk", column: "author_id", dependent: :delete
+ create_table "simple_captcha_data", force: :cascade do |t|
+ t.string "key", limit: 40
+ t.string "value", limit: 12
+ t.datetime "created_at"
+ t.datetime "updated_at"
+ end
- add_foreign_key "invitations", "users", name: "invitations_recipient_id_fk", column: "recipient_id", dependent: :delete
- add_foreign_key "invitations", "users", name: "invitations_sender_id_fk", column: "sender_id", dependent: :delete
+ add_index "simple_captcha_data", ["key"], name: "idx_key", using: :btree
- add_foreign_key "likes", "people", name: "likes_author_id_fk", column: "author_id", dependent: :delete
+ create_table "tag_followings", force: :cascade do |t|
+ t.integer "tag_id", limit: 4, null: false
+ t.integer "user_id", limit: 4, null: false
+ t.datetime "created_at", null: false
+ t.datetime "updated_at", null: false
+ end
- add_foreign_key "messages", "conversations", name: "messages_conversation_id_fk", dependent: :delete
- add_foreign_key "messages", "people", name: "messages_author_id_fk", column: "author_id", dependent: :delete
+ add_index "tag_followings", ["tag_id", "user_id"], name: "index_tag_followings_on_tag_id_and_user_id", unique: true, using: :btree
+ add_index "tag_followings", ["tag_id"], name: "index_tag_followings_on_tag_id", using: :btree
+ add_index "tag_followings", ["user_id"], name: "index_tag_followings_on_user_id", using: :btree
- add_foreign_key "notification_actors", "notifications", name: "notification_actors_notification_id_fk", dependent: :delete
+ create_table "taggings", force: :cascade do |t|
+ t.integer "tag_id", limit: 4
+ t.integer "taggable_id", limit: 4
+ t.string "taggable_type", limit: 127
+ t.integer "tagger_id", limit: 4
+ t.string "tagger_type", limit: 127
+ t.string "context", limit: 127
+ t.datetime "created_at"
+ end
- add_foreign_key "posts", "people", name: "posts_author_id_fk", column: "author_id", dependent: :delete
+ add_index "taggings", ["created_at"], name: "index_taggings_on_created_at", using: :btree
+ add_index "taggings", ["tag_id"], name: "index_taggings_on_tag_id", using: :btree
+ add_index "taggings", ["taggable_id", "taggable_type", "context"], name: "index_taggings_on_taggable_id_and_taggable_type_and_context", length: {"taggable_id"=>nil, "taggable_type"=>95, "context"=>95}, using: :btree
+ add_index "taggings", ["taggable_id", "taggable_type", "tag_id"], name: "index_taggings_uniquely", unique: true, using: :btree
- add_foreign_key "profiles", "people", name: "profiles_person_id_fk", dependent: :delete
+ create_table "tags", force: :cascade do |t|
+ t.string "name", limit: 255
+ t.integer "taggings_count", limit: 4, default: 0
+ end
- add_foreign_key "services", "users", name: "services_user_id_fk", dependent: :delete
+ add_index "tags", ["name"], name: "index_tags_on_name", unique: true, length: {"name"=>191}, using: :btree
- add_foreign_key "share_visibilities", "contacts", name: "post_visibilities_contact_id_fk", dependent: :delete
+ create_table "user_preferences", force: :cascade do |t|
+ t.string "email_type", limit: 255
+ t.integer "user_id", limit: 4
+ t.datetime "created_at", null: false
+ t.datetime "updated_at", null: false
+ end
+ create_table "users", force: :cascade do |t|
+ t.string "username", limit: 255
+ t.text "serialized_private_key", limit: 65535
+ t.boolean "getting_started", default: true, null: false
+ t.boolean "disable_mail", default: false, null: false
+ t.string "language", limit: 255
+ t.string "email", limit: 255, default: "", null: false
+ t.string "encrypted_password", limit: 255, default: "", null: false
+ t.string "invitation_token", limit: 60
+ t.datetime "invitation_sent_at"
+ t.string "reset_password_token", limit: 255
+ t.datetime "remember_created_at"
+ t.integer "sign_in_count", limit: 4, default: 0
+ t.datetime "current_sign_in_at"
+ t.datetime "last_sign_in_at"
+ t.string "current_sign_in_ip", limit: 255
+ t.string "last_sign_in_ip", limit: 255
+ t.datetime "created_at", null: false
+ t.datetime "updated_at", null: false
+ t.string "invitation_service", limit: 127
+ t.string "invitation_identifier", limit: 127
+ t.integer "invitation_limit", limit: 4
+ t.integer "invited_by_id", limit: 4
+ t.string "invited_by_type", limit: 255
+ t.string "authentication_token", limit: 30
+ t.string "unconfirmed_email", limit: 255
+ t.string "confirm_email_token", limit: 30
+ t.datetime "locked_at"
+ t.boolean "show_community_spotlight_in_stream", default: true, null: false
+ t.boolean "auto_follow_back", default: false
+ t.integer "auto_follow_back_aspect_id", limit: 4
+ t.text "hidden_shareables", limit: 65535
+ t.datetime "reset_password_sent_at"
+ t.datetime "last_seen"
+ t.datetime "remove_after"
+ t.string "export", limit: 255
+ t.datetime "exported_at"
+ t.boolean "exporting", default: false
+ t.boolean "strip_exif", default: true
+ t.string "exported_photos_file", limit: 255
+ t.datetime "exported_photos_at"
+ t.boolean "exporting_photos", default: false
+ end
+
+ add_index "users", ["authentication_token"], name: "index_users_on_authentication_token", unique: true, using: :btree
+ add_index "users", ["email"], name: "index_users_on_email", length: {"email"=>191}, using: :btree
+ add_index "users", ["invitation_service", "invitation_identifier"], name: "index_users_on_invitation_service_and_invitation_identifier", unique: true, length: {"invitation_service"=>64, "invitation_identifier"=>nil}, using: :btree
+ add_index "users", ["invitation_token"], name: "index_users_on_invitation_token", using: :btree
+ add_index "users", ["username"], name: "index_users_on_username", unique: true, length: {"username"=>191}, using: :btree
+
+ add_foreign_key "aspect_memberships", "aspects", name: "aspect_memberships_aspect_id_fk", on_delete: :cascade
+ add_foreign_key "aspect_memberships", "contacts", name: "aspect_memberships_contact_id_fk", on_delete: :cascade
+ add_foreign_key "aspect_visibilities", "aspects", name: "aspect_visibilities_aspect_id_fk", on_delete: :cascade
+ add_foreign_key "comments", "people", column: "author_id", name: "comments_author_id_fk", on_delete: :cascade
+ add_foreign_key "contacts", "people", name: "contacts_person_id_fk", on_delete: :cascade
+ add_foreign_key "conversation_visibilities", "conversations", name: "conversation_visibilities_conversation_id_fk", on_delete: :cascade
+ add_foreign_key "conversation_visibilities", "people", name: "conversation_visibilities_person_id_fk", on_delete: :cascade
+ add_foreign_key "conversations", "people", column: "author_id", name: "conversations_author_id_fk", on_delete: :cascade
+ add_foreign_key "invitations", "users", column: "recipient_id", name: "invitations_recipient_id_fk", on_delete: :cascade
+ add_foreign_key "invitations", "users", column: "sender_id", name: "invitations_sender_id_fk", on_delete: :cascade
+ add_foreign_key "likes", "people", column: "author_id", name: "likes_author_id_fk", on_delete: :cascade
+ add_foreign_key "messages", "conversations", name: "messages_conversation_id_fk", on_delete: :cascade
+ add_foreign_key "messages", "people", column: "author_id", name: "messages_author_id_fk", on_delete: :cascade
+ add_foreign_key "notification_actors", "notifications", name: "notification_actors_notification_id_fk", on_delete: :cascade
+ add_foreign_key "posts", "people", column: "author_id", name: "posts_author_id_fk", on_delete: :cascade
+ add_foreign_key "profiles", "people", name: "profiles_person_id_fk", on_delete: :cascade
+ add_foreign_key "services", "users", name: "services_user_id_fk", on_delete: :cascade
+ add_foreign_key "share_visibilities", "contacts", name: "post_visibilities_contact_id_fk", on_delete: :cascade
end
diff --git a/features/desktop/accepts_invitation.feature b/features/desktop/accepts_invitation.feature
index 330b58d76..02a02a7ef 100644
--- a/features/desktop/accepts_invitation.feature
+++ b/features/desktop/accepts_invitation.feature
@@ -4,7 +4,7 @@ Feature: invitation acceptance
Given I have been invited by an admin
And I am on my acceptance form page
And I fill in the new user form
- And I press "Continue"
+ And I press "Sign up"
Then I should be on the getting started page
And I should see "Well, hello there!"
And I fill in the following:
@@ -13,12 +13,13 @@ Feature: invitation acceptance
And I follow "awesome_button"
And I confirm the alert
Then I should be on the stream page
+ And I close the publisher
Scenario: accept invitation from user
Given I have been invited by bob
And I am on my acceptance form page
And I fill in the new user form
- And I press "Continue"
+ And I press "Sign up"
Then I should be on the getting started page
And I should see "Well, hello there!"
And I fill in the following:
@@ -27,15 +28,16 @@ Feature: invitation acceptance
And I follow "awesome_button"
And I confirm the alert
Then I should be on the stream page
+ And I close the publisher
And I log out
And I sign in as "bob@bob.bob"
- And I follow "By email"
+ And I click on selector ".btn-link[data-target='#invitationsModal']"
Then I should see one less invite
Scenario: sends an invitation
Given a user with email "bob@bob.bob"
When I sign in as "bob@bob.bob"
- And I follow "By email"
+ And I click on selector ".btn-link[data-target='#invitationsModal']"
And I fill in the following:
| email_inviter_emails | alex@example.com |
And I press "Send an invitation"
diff --git a/features/desktop/activity_stream.feature b/features/desktop/activity_stream.feature
deleted file mode 100644
index d7ba1a2ae..000000000
--- a/features/desktop/activity_stream.feature
+++ /dev/null
@@ -1,23 +0,0 @@
-@javascript
-Feature: The activity stream
- Scenario: Sorting
- Given a user with username "bob"
- When I sign in as "bob@bob.bob"
-
- And I click the publisher and post "A- I like turtles"
- And I click the publisher and post "B- barack obama is your new bicycle"
- And I click the publisher and post "C- barack obama is a square"
-
- When I go to the activity stream page
- Then "C- barack obama is a square" should be post 1
- And "B- barack obama is your new bicycle" should be post 2
- And "A- I like turtles" should be post 3
-
- When I like the post "A- I like turtles"
- And I comment "Sassy sawfish" on "C- barack obama is a square"
- And I like the post "B- barack obama is your new bicycle"
-
- When I go to the activity stream page
- Then "B- barack obama is your new bicycle" should be post 1
- And "C- barack obama is a square" should be post 2
- And "A- I like turtles" should be post 3
diff --git a/features/desktop/aspect_navigation.feature b/features/desktop/aspect_navigation.feature
index 0e3016e9e..84d601857 100644
--- a/features/desktop/aspect_navigation.feature
+++ b/features/desktop/aspect_navigation.feature
@@ -17,11 +17,10 @@ Feature: Aspect navigation on the left menu
Scenario: Aspects selection is remembered through site navigation
When I select only "Besties" aspect
- And I click the publisher and post "Hey besties!"
-
- When I go to the aspects page
- And I select only "Besties" aspect
- Then I should see "Hey besties!"
+ And I go to the aspects page
+ Then I should see "Besties" aspect selected
+ And I should see "Unicorns" aspect unselected
+ And I should see "Others" aspect unselected
When I go to the contacts page
And I go to the aspects page
diff --git a/features/desktop/blocks_user.feature b/features/desktop/blocks_user.feature
index 6057252a7..b93bf28c8 100644
--- a/features/desktop/blocks_user.feature
+++ b/features/desktop/blocks_user.feature
@@ -9,18 +9,14 @@ Feature: Blocking a user from the stream
And Alice has a post mentioning Bob
And I sign in as "bob@bob.bob"
-
Scenario: Blocking a user
- When I am on the home page
When I click on the first block button
And I confirm the alert
- And I am on the home page
+ And I go to the home page
Then I should not see any posts in my stream
Scenario: Blocking a user from the profile page
- When I am on the home page
- And I follow "Alice Smith"
+ When I am on "alice@alice.alice"'s page
When I click on the profile block button
And I confirm the alert
- And I am on the home page
Then I should not see any posts in my stream
diff --git a/features/desktop/change_email.feature b/features/desktop/change_email.feature
index 950571a3f..87eed0b01 100644
--- a/features/desktop/change_email.feature
+++ b/features/desktop/change_email.feature
@@ -11,3 +11,11 @@ Feature: Change email
And I follow the "confirm_email" link from the last sent email
Then I should see "activated"
And my "email" should be "new_email@newplac.es"
+
+ Scenario: Change my email preferences
+ Given I am signed in
+ When I go to the users edit page
+ And I uncheck "user_email_preferences_mentioned"
+ And I press "change_email_preferences"
+ Then I should see "Email notifications changed"
+ And the "user_email_preferences_mentioned" checkbox should not be checked
diff --git a/features/desktop/change_password.feature b/features/desktop/change_password.feature
index 889d97e08..4b20caa56 100644
--- a/features/desktop/change_password.feature
+++ b/features/desktop/change_password.feature
@@ -11,14 +11,43 @@ Feature: Change password
When I sign in with password "newsecret"
Then I should be on the stream page
+ Scenario: Attempt to change my password with invalid input
+ Given I am signed in
+ When I go to the edit user page
+ And I fill out change password section with my password and "too" and "short"
+ And I press "Change password"
+ Then I should see "Password change failed"
+ And I should see "Password is too short"
+ And I should see "Password confirmation doesn't match"
+
Scenario: Reset my password
- Given a user with email "forgetful@users.net"
+ Given a user named "Georges Abitbol" with email "forgetful@users.net"
Given I am on forgot password page
When I fill out forgot password form with "forgetful@users.net"
And I submit forgot password form
Then I should see "You will receive an email with instructions"
When I follow the "Change my password" link from the last sent email
- Then I should see "NEW PASSWORD"
When I fill out reset password form with "supersecret" and "supersecret"
And I submit reset password form
Then I should be on the stream page
+ And I sign out manually
+ And I sign in manually as "georges_abitbol" with password "supersecret"
+ Then I should be on the stream page
+
+ Scenario: Attempt to reset password with invalid password
+ Given a user named "Georges Abitbol" with email "forgetful@users.net"
+ Given I am on forgot password page
+ When I fill out forgot password form with "forgetful@users.net"
+ And I submit forgot password form
+ When I follow the "Change my password" link from the last sent email
+ When I fill out reset password form with "too" and "short"
+ And I press "Change my password"
+ Then I should be on the user password page
+ And I should see "Password is too short"
+ And I should see "Password confirmation doesn't match"
+
+ Scenario: Attempt to reset password with invalid email
+ Given I am on forgot password page
+ When I fill out forgot password form with "notanemail"
+ And I submit forgot password form
+ Then I should see "No account with this email exists"
diff --git a/features/desktop/closes_account.feature b/features/desktop/closes_account.feature
index a06e00c9d..0388943dd 100644
--- a/features/desktop/closes_account.feature
+++ b/features/desktop/closes_account.feature
@@ -16,21 +16,3 @@ Feature: Close account
When I try to sign in manually
Then I should be on the new user session page
And I should see a flash message with a warning
-
- Scenario: post display should not throw error when mention is removed for the user whose account is closed
- Given following users exist:
- | username | email |
- | Bob Jones | bob@bob.bob |
- | Alice Smith | alice@alice.alice |
- And a user with email "bob@bob.bob" is connected with "alice@alice.alice"
- And Alice has a post mentioning Bob
-
- Then I sign in as "bob@bob.bob"
- When I go to the users edit page
- And I follow "close_account"
- And I put in my password in "close_account_password" in the modal window
- And I press "close_account_confirm" in the modal window
- And I confirm the alert
- Then I sign in as "alice@alice.alice"
- And I am on the home page
- Then I should see "Bob Jones"
diff --git a/features/desktop/connects_users.feature b/features/desktop/connects_users.feature
index efa6f4a05..f73906ac9 100644
--- a/features/desktop/connects_users.feature
+++ b/features/desktop/connects_users.feature
@@ -10,38 +10,25 @@ Feature: following and being followed
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
-
- When I am on the home page
- And I expand the publisher
- And I fill in the following:
- | status_message_fake_text | I am following you |
- And I press "Share"
- Then I sign out
+ And I sign out
Scenario: seeing a follower's posts on their profile page, but not in your stream
+ Given "bob@bob.bob" has a non public post with text "I am following you"
When I sign in as "alice@alice.alice"
And I am on "bob@bob.bob"'s page
Then I should see "I am following you"
- And I am on the home page
+ When I go to the home page
Then I should not see "I am following you"
Scenario: seeing public posts of someone you follow
- Given I sign in as "alice@alice.alice"
- And I am on the home page
- And I expand the publisher
- And I fill in the following:
- | status_message_fake_text | I am ALICE |
- And I press the first ".toggle" within "#publisher"
- And I press the first ".public" within "#publisher"
- And I press "Share"
- And I sign out
+ Given "alice@alice.alice" has a public post with text "I am ALICE"
When I sign in as "bob@bob.bob"
And I am on "alice@alice.alice"'s page
Then I should see "I am ALICE"
- When I am on the home page
+ When I go to the home page
Then I should see "I am ALICE"
Scenario: I follow a malicious user
@@ -60,30 +47,23 @@ Feature: following and being followed
Scenario: seeing non-public posts of someone you follow who also follows you
When I sign in as "alice@alice.alice"
And I am on "bob@bob.bob"'s page
-
And I add the person to my "Besties" aspect
And I add the person to my "Unicorns" aspect
-
- When I go to the home page
-
+ And I go to the home page
Then I should have 1 contact in "Unicorns"
- Then I should have 1 contact in "Besties"
+ And I should have 1 contact in "Besties"
- When I am on the home page
- And I click the publisher and post "I am following you back"
- Then I sign out
-
- When I sign in as "bob@bob.bob"
+ When I click the publisher and post "I am following you back"
+ And I sign out
+ And I sign in as "bob@bob.bob"
Then I should have 1 contacts in "Besties"
-
- When I am on the home page
- Then I should see "I am following you back"
+ And I should see "I am following you back"
Scenario: adding someone who follows you while creating a new aspect
When I sign in as "alice@alice.alice"
And I am on "bob@bob.bob"'s page
- And I press the first ".toggle.button"
+ And I press the first ".aspect_membership_dropdown .dropdown-toggle"
And I press the first "a" within ".add_aspect"
And I fill in "Name" with "Super People" in the modal window
@@ -101,16 +81,16 @@ Feature: following and being followed
And I am on "alice@alice.alice"'s page
Then I should see "Besties"
- Then I should see a "#mention_button" within "#profile"
- Then I should not see a "#message_button" within "#profile"
+ Then I should see a "#mention_button" within "#profile_buttons"
+ Then I should not see a "#message_button" within "#profile_buttons"
Scenario: interacting with the profile page of someone who follows you but who you do not follow
Given I sign in as "alice@alice.alice"
And I am on "bob@bob.bob"'s page
Then I should see "Add contact"
- Then I should not see a "#mention_button" within "#profile"
- Then I should not see a "#message_button" within "#profile"
+ Then I should not see a "#mention_button" within "#profile_buttons"
+ Then I should not see a "#message_button" within "#profile_buttons"
Scenario: interacting with the profile page of someone you follow who also follows you
Given I sign in as "alice@alice.alice"
@@ -120,6 +100,6 @@ Feature: following and being followed
And I add the person to my "Unicorns" aspect
When I go to "bob@bob.bob"'s page
- Then I should see "All Aspects"
- Then I should see a "#mention_button" within "#profile"
- Then I should see a "#message_button" within "#profile"
+ Then I should see "All aspects"
+ Then I should see a "#mention_button" within "#profile_buttons"
+ Then I should see a "#message_button" within "#profile_buttons"
diff --git a/features/desktop/contacts.feature b/features/desktop/contacts.feature
index 9e59a9c93..97bc87a1b 100644
--- a/features/desktop/contacts.feature
+++ b/features/desktop/contacts.feature
@@ -13,28 +13,29 @@ Feature: show contacts
Scenario: see own contacts on profile
When I am on "robert@grimm.grimm"'s page
- And I press the first "a" within ".section.contact_pictures"
- Then I should see "Alice Smith"
+ And I press the first "#contacts_link"
+ Then I should be on the contacts page
- Scenario: see contacts of a visible aspect list
+ Scenario: see contacts of a visible aspect list
When I am on "bob@bob.bob"'s page
And I add the person to my "Unicorns" aspect
And I sign out
And I sign in as "alice@alice.alice"
And I am on "robert@grimm.grimm"'s page
- And I press the first "a" within ".section.contact_pictures"
+ Then I should see "Contacts" within "#profile_horizontal_bar"
+
+ When I press the first "#contacts_link"
+ And I press the first "a" within "#people_stream .media-body"
Then I should see "Bob Jones"
- Scenario: don't see contacts of an invisible aspect list
+ Scenario: don't see contacts of an invisible aspect list
When I am on "bob@bob.bob"'s page
And I add the person to my "Unicorns" aspect
And I am on the contacts page
And I follow "Unicorns"
- And I follow "Manage"
- And I press the first "a.contact_visibility_link" in the modal window
- And I press "Done" in the modal window
+ And I press the first "a#contacts_visibility_toggle"
And I sign out
And I sign in as "alice@alice.alice"
And I am on "robert@grimm.grimm"'s page
- Then I should not see "Contacts" within "#profile_information"
+ Then I should not see "Contacts" within "#profile_horizontal_bar"
diff --git a/features/desktop/conversations.feature b/features/desktop/conversations.feature
index e3c169468..2737aef71 100644
--- a/features/desktop/conversations.feature
+++ b/features/desktop/conversations.feature
@@ -7,8 +7,8 @@ Feature: private conversations
Background:
Given a user named "Robert Grimm" with email "bob@bob.bob"
And a user named "Alice Awesome" with email "alice@alice.alice"
- When I sign in as "bob@bob.bob"
And a user with username "robert_grimm" is connected with "alice_awesome"
+ When I sign in as "bob@bob.bob"
Scenario: send a message
Given I send a message with subject "Greetings" and text "hello, alice!" to "Alice Awesome"
@@ -20,5 +20,7 @@ Feature: private conversations
And "Alice Awesome" should be part of active conversation
And I should see "hello, alice!" within ".stream_container"
When I sign in as "alice@alice.alice"
- And I reply with "hey, how you doing?"
+ Then I should have 1 unread private message
+ And I should have 1 email delivery
+ When I reply with "hey, how you doing?"
Then I should see "hey, how you doing?" within ".stream_container"
diff --git a/features/desktop/donations.feature b/features/desktop/donations.feature
index fbaa253d8..9bf0b2818 100644
--- a/features/desktop/donations.feature
+++ b/features/desktop/donations.feature
@@ -1,6 +1,6 @@
@javascript
Feature: donations
- In order to accept donation
+ In order to accept donation
As a podmin
I want a donation box shown on the stream page
@@ -12,5 +12,5 @@ Feature: donations
Scenario: Bitcoin donations
Given I have configured a Bitcoin address
- And I am on the home page
+ And I go to the home page
Then I should see the Bitcoin address
diff --git a/features/desktop/edits_profile.feature b/features/desktop/edits_profile.feature
index 627a37f3f..3db0978e9 100644
--- a/features/desktop/edits_profile.feature
+++ b/features/desktop/edits_profile.feature
@@ -43,10 +43,3 @@ Feature: editing your profile
And I confirm the alert
And I attach the file "spec/fixtures/button.png" to hidden "file" within "#file-upload"
Then I should see a "img" within "#profile_photo_upload"
-
- When I go to my new profile page
-# #commented out until we bring back the profile info on new profile
-# Then I should see "Gender: Fearless"
- And I should see "Boba Fett"
-# And I should see "Bio: This is a bio"
-# And I should see "Birthday: 1986-11-30"
diff --git a/features/desktop/follows_tags.feature b/features/desktop/follows_tags.feature
index f8cbb228d..2965df10c 100644
--- a/features/desktop/follows_tags.feature
+++ b/features/desktop/follows_tags.feature
@@ -35,7 +35,7 @@ Feature: posting
Then I should see "#boss from the #boss tag page" within "body"
Scenario: can stop following a tag from the tag page
- When I press "Following #boss"
+ When I press "Stop following #boss"
And I go to the followed tags stream page
Then I should not see "#boss" within "#tags_list"
diff --git a/features/desktop/invitations.feature b/features/desktop/invitations.feature
index 291869a44..e1d857d79 100644
--- a/features/desktop/invitations.feature
+++ b/features/desktop/invitations.feature
@@ -3,8 +3,7 @@ Feature: Invitations
Scenario: Accepting an invitation
When I visit alice's invitation code url
- # Then I should see the "alice is excited" message
When I fill in the new user form
- And I press "Continue"
+ And I press "Sign up"
Then I should see the "welcome to diaspora" message
And I should be able to friend Alice
diff --git a/features/desktop/keyboard_navigation.feature b/features/desktop/keyboard_navigation.feature
index e92047fd2..228b4ca05 100644
--- a/features/desktop/keyboard_navigation.feature
+++ b/features/desktop/keyboard_navigation.feature
@@ -9,8 +9,7 @@ Feature: Keyboard navigation
And I sign in as "bob@bob.bob"
Scenario: navigate downwards
- When I am on the home page
- And I press the "J" key somewhere
+ When I press the "J" key somewhere
Then post 1 should be highlighted
And I should have navigated to the highlighted post
@@ -21,17 +20,16 @@ Feature: Keyboard navigation
Given I expand the publisher
When I press the "J" key in the publisher
Then post 2 should be highlighted
+ And I close the publisher
Scenario: navigate upwards
- When I am on the home page
- And I scroll to post 3
- When I press the "K" key somewhere
+ When I scroll to post 3
+ And I press the "K" key somewhere
Then post 2 should be highlighted
And I should have navigated to the highlighted post
Scenario: expand the comment form in the main stream
- When I am on the home page
- Then the first comment field should be closed
+ Given the first comment field should be closed
When I press the "J" key somewhere
And I press the "C" key somewhere
Then the first comment field should be open
diff --git a/features/desktop/likes.feature b/features/desktop/likes.feature
new file mode 100644
index 000000000..a961ff41b
--- /dev/null
+++ b/features/desktop/likes.feature
@@ -0,0 +1,35 @@
+@javascript
+Feature: Liking posts
+ In order to show my appreciation
+ As a friendly person
+ I want to like their posts
+
+ Background:
+ Given following users exist:
+ | username | email |
+ | Bob Jones | bob@bob.bob |
+ | Alice Smith | alice@alice.alice |
+ And a user with email "bob@bob.bob" is connected with "alice@alice.alice"
+ And "bob@bob.bob" has a public post with text "I like unicorns"
+ And I sign in as "alice@alice.alice"
+
+ Scenario: Liking and unliking a post from the stream
+ When I like the post "I like unicorns" in the stream
+ Then I should see a ".likes" within "#main_stream .stream_element"
+
+ When I unlike the post "I like unicorns" in the stream
+ Then I should not see a ".likes" within "#main_stream .stream_element"
+
+ Scenario: Liking and unliking a post from a single post page
+ When I open the show page of the "I like unicorns" post
+ And I click to like the post
+ Then I should see a ".count" within "#single-post-interactions"
+
+ When I click to unlike the post
+ Then I should not see a ".count" within "#single-post-interactions"
+
+ Scenario: Someone likes my post
+ When I like the post "I like unicorns" in the stream
+ And I sign out
+ And I sign in as "bob@bob.bob"
+ Then I should see a ".likes" within "#main_stream .stream_element"
diff --git a/features/desktop/logged_out_browsing.feature b/features/desktop/logged_out_browsing.feature
index d3ad0c432..dbcd5caf3 100644
--- a/features/desktop/logged_out_browsing.feature
+++ b/features/desktop/logged_out_browsing.feature
@@ -12,7 +12,7 @@ Feature: Browsing Diaspora as a logged out user
Scenario: Visiting a profile page
When I am on "bob@bob.bob"'s page
Then I should see "public stuff" within "body"
- And page should not have ".media .controls"
+ And page should not have ".media .control-icons"
Scenario: Visiting a post show page
When I view "bob@bob.bob"'s first post
diff --git a/features/desktop/manages_aspects.feature b/features/desktop/manages_aspects.feature
index 9c285844e..4eb10aadb 100644
--- a/features/desktop/manages_aspects.feature
+++ b/features/desktop/manages_aspects.feature
@@ -25,70 +25,53 @@ Feature: User manages contacts
And I have an aspect called "People"
When I am on the contacts page
And I follow "People"
- And I follow "add contacts to People"
- And I press "Delete" in the modal window
+ And I click on selector "#delete_aspect"
And I confirm the alert
Then I should be on the contacts page
- And I should not see "People" within "#aspects_list"
+ And I should not see "People" within "#aspect_nav"
Scenario: deleting an aspect from homepage
Given I am signed in
And I have an aspect called "People"
When I am on the aspects page
And I click on "People" aspect edit icon
- And I follow "Delete" within "#aspect_controls"
+ And I click on selector "#delete_aspect"
And I confirm the alert
Then I should be on the contacts page
- And I should not see "People" within "#aspects_list"
+ And I should not see "People" within "#aspect_nav"
- Scenario: Editing the aspect memberships of a contact from the aspect edit facebox
+ Scenario: Editing the aspect memberships of a contact from the contacts page
Given I am signed in
And I have 2 contacts
And I have an aspect called "Cat People"
When I am on the contacts page
And I follow "Cat People"
- And I follow "add contacts to Cat People"
- And I check the first contact list button
+ And I add the first person to the aspect
Then I should have 1 contact in "Cat People"
- When I uncheck the first contact list button
+ When I remove the first person from the aspect
Then I should have 0 contacts in "Cat People"
-
+
Scenario: Renaming an aspect
Given I am signed in
And I have an aspect called "Cat People"
When I am on the contacts page
And I follow "Cat People"
- And I follow "Manage" within "#aspect_controls"
- And I follow "rename"
+ And I click on selector "#change_aspect_name"
And I fill in "aspect_name" with "Unicorn People"
- And I press "update"
- Then I should see "Unicorn People" within "#aspect_name_title"
-
- Scenario: infinite scroll on contacts index
- Given I am signed in
- And I resize my window to 800x600
- And I have 30 contacts
- And I am on the contacts page
- Then I should see 25 contacts
-
- When I scroll down
- Then I should see 30 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 am on the home page
-
And I click on my name in the header
When I follow "Contacts"
- Then I should see "Community Spotlight" within ".span9"
+ Then I should see "Community spotlight" within ".span9"
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 am on the home page
-
And I click on my name in the header
When I follow "Contacts"
- Then I should not see "Community Spotlight" within ".span9"
+ Then I should not see "Community spotlight" within ".span9"
diff --git a/features/desktop/mentions.feature b/features/desktop/mentions.feature
index 5ed5ce6a6..08e792ac7 100644
--- a/features/desktop/mentions.feature
+++ b/features/desktop/mentions.feature
@@ -12,7 +12,6 @@ Feature: Mentions
And a user with email "bob@bob.bob" is connected with "alice@alice.alice"
And Alice has a post mentioning Bob
When I sign in as "alice@alice.alice"
- And I am on the home page
And I follow "Bob Jones"
Then I should see "Bob Jones"
@@ -23,13 +22,11 @@ Feature: Mentions
| Alice Smith | alice@alice.alice |
And a user with email "bob@bob.bob" is connected with "alice@alice.alice"
When I sign in as "alice@alice.alice"
- And I am on the home page
And I expand the publisher
When I fill in the following:
| status_message_fake_text | @Bo |
And I click on the first user in the mentions dropdown list
And I press "Share"
- And I follow "Bob Jones"
+ Then I should see "Bob Jones" within ".stream_element"
+ When I follow "Bob Jones"
Then I should see "Bob Jones"
-
-
diff --git a/features/desktop/mentions_from_profile_page.feature b/features/desktop/mentions_from_profile_page.feature
index b999523f0..f18812d05 100644
--- a/features/desktop/mentions_from_profile_page.feature
+++ b/features/desktop/mentions_from_profile_page.feature
@@ -5,28 +5,26 @@ Feature: mentioning a contact from their profile page
I want to mention someone more cool than the average bear
Background:
- Given I am on the home page
- And following users exist:
+ Given following users exist:
| username |
| bob |
| alice |
- When I sign in as "bob@bob.bob"
And a user with username "bob" is connected with "alice"
+ And I sign in as "bob@bob.bob"
And I have following aspects:
| PostingTo |
| NotPostingThingsHere |
And I have user with username "alice" in an aspect called "PostingTo"
And I have user with username "alice" in an aspect called "NotPostingThingsHere"
-
- And I am on the home page
+ And I go to the home page
Scenario: mentioning while posting to all aspects
Given I am on "alice@alice.alice"'s page
- And I have turned off jQuery effects
And I want to mention her from the profile
And I append "I am eating a yogurt" to the publisher
- And I press "Share" in the modal window
+ And I press "Share" in the mention modal
+ Then I should see a flash message indicating success
When I am on the aspects page
And I follow "PostingTo" within "#aspects_list"
Then I should see "I am eating a yogurt"
@@ -37,18 +35,19 @@ Feature: mentioning a contact from their profile page
Scenario: mentioning while posting to just one aspect
Given I am on "alice@alice.alice"'s page
- And I have turned off jQuery effects
And I want to mention her from the profile
- And I press the aspect dropdown in the modal window
- And I toggle the aspect "NotPostingThingsHere" in the modal window
- And I press the aspect dropdown in the modal window
+ And I press the aspect dropdown in the mention modal
+ And I toggle the aspect "NotPostingThingsHere" in the mention modal
+ And I press the aspect dropdown in the mention modal
And I append "I am eating a yogurt" to the publisher
- And I press "Share" in the modal window
+ And I press "Share" in the mention modal
+ Then I should see a flash message indicating success
When I am on the aspects page
And I select only "PostingTo" aspect
Then I should see "I am eating a yogurt"
When I am on the aspects page
+ And I select all aspects
And I select only "NotPostingThingsHere" aspect
Then I should not see "I am eating a yogurt"
diff --git a/features/desktop/not_safe_for_work.feature b/features/desktop/not_safe_for_work.feature
index 781632287..6d7f7fd7d 100644
--- a/features/desktop/not_safe_for_work.feature
+++ b/features/desktop/not_safe_for_work.feature
@@ -22,14 +22,11 @@ Scenario: Toggling nsfw state
Given a nsfw user with email "tommy@pr0nking.com"
And a user with email "laura@officeworkers.com"
And a user with email "laura@officeworkers.com" is connected with "tommy@pr0nking.com"
- When I sign in as "tommy@pr0nking.com"
- And I click the publisher and post "I love 0bj3ction4bl3 c0nt3nt!"
- And I click the publisher and post "Sexy Senators Gone Wild!"
- Then I should have 2 nsfw posts
+ And "tommy@pr0nking.com" has a public post with text "I love 0bj3ction4bl3 c0nt3nt!"
+ And "tommy@pr0nking.com" has a public post with text "Sexy Senators Gone Wild!"
#toggling global nsfw state
- When I log out
- And I sign in as "laura@officeworkers.com"
+ When I sign in as "laura@officeworkers.com"
Then I should not see "I love 0bj3ction4bl3 c0nt3nt!"
When I toggle nsfw posts
Then I should see "I love 0bj3ction4bl3 c0nt3nt!" and "Sexy Senators Gone Wild!"
diff --git a/features/desktop/notifications.feature b/features/desktop/notifications.feature
index eeafce68c..8707dbf9b 100644
--- a/features/desktop/notifications.feature
+++ b/features/desktop/notifications.feature
@@ -94,6 +94,27 @@ Feature: Notifications
And I sign out
When I sign in as "alice@alice.alice"
And I follow "Notifications" in the header
- And I active the first hovercard after loading the notifications page
+ And I active the first hovercard after loading the notifications page
When I press the aspect dropdown
Then the aspect dropdown should be visible
+
+ Scenario: scrollbar shows up when >5 notifications
+ Given a user with email "bob@bob.bob" is connected with "alice@alice.alice"
+ And Alice has 6 posts mentioning Bob
+ When I sign in as "bob@bob.bob"
+ And I follow "Notifications" in the header
+ Then the notification dropdown should be visible
+ Then the notification dropdown scrollbar should be visible
+
+ Scenario: dropdown will load more elements when bottom is reached
+ Given a user with email "bob@bob.bob" is connected with "alice@alice.alice"
+ And Alice has 20 posts mentioning Bob
+ When I sign in as "bob@bob.bob"
+ And I follow "Notifications" in the header
+ Then the notification dropdown should be visible
+ Then the notification dropdown scrollbar should be visible
+ 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 there should be 15 notifications loaded
diff --git a/features/desktop/oembed.feature b/features/desktop/oembed.feature
index 92ad8d1c5..02625de32 100644
--- a/features/desktop/oembed.feature
+++ b/features/desktop/oembed.feature
@@ -9,48 +9,35 @@ Feature: oembed
| username | email |
| Alice Smith | alice@alice.alice |
And I have several oEmbed data in cache
- When I sign in as "alice@alice.alice"
- And I am on the home page
+ And I sign in as "alice@alice.alice"
Scenario: Post a secure video link
Given I expand the publisher
- When I fill in the following:
- | status_message_fake_text | http://youtube.com/watch?v=M3r2XDceM6A&format=json |
- And I press "Share"
+ When I click the publisher and post "http://youtube.com/watch?v=M3r2XDceM6A&format=json"
Then I should see a video player
Scenario: Post an unsecure video link
Given I expand the publisher
- When I fill in the following:
- | status_message_fake_text | http://mytube.com/watch?v=M3r2XDceM6A&format=json |
- And I press "Share"
- And I follow "My Aspects"
+ When I click the publisher and post "http://mytube.com/watch?v=M3r2XDceM6A&format=json"
+ And I follow "My aspects"
Then I should not see a video player
And I should see "http://mytube.com/watch?v=M3r2XDceM6A&format=json" within ".stream_element"
Scenario: Post an unsecure rich-typed link
Given I expand the publisher
- When I fill in the following:
- | status_message_fake_text | http://myrichtube.com/watch?v=M3r2XDceM6A&format=json |
- And I press "Share"
- And I follow "My Aspects"
+ When I click the publisher and post "http://myrichtube.com/watch?v=M3r2XDceM6A&format=json"
+ And I follow "My aspects"
Then I should not see a video player
And I should see "http://myrichtube.com/watch?v=M3r2XDceM6A&format=json" within ".stream_element"
Scenario: Post a photo link
Given I expand the publisher
- When I fill in the following:
- | status_message_fake_text | http://farm4.static.flickr.com/3123/2341623661_7c99f48bbf_m.jpg |
- And I press "Share"
- And I follow "My Aspects"
+ When I click the publisher and post "http://farm4.static.flickr.com/3123/2341623661_7c99f48bbf_m.jpg"
+ And I follow "My aspects"
Then I should see a "img" within ".stream_element"
Scenario: Post an unsupported text link
Given I expand the publisher
- When I fill in the following:
- | status_message_fake_text | http://www.we-do-not-support-oembed.com/index.html |
- And I press "Share"
- And I follow "My Aspects"
+ When I click the publisher and post "http://www.we-do-not-support-oembed.com/index.html"
+ And I follow "My aspects"
Then I should see "http://www.we-do-not-support-oembed.com/index.html" within ".stream_element"
-
-
diff --git a/features/desktop/photo_lightbox.feature b/features/desktop/photo_lightbox.feature
index ba27fcd7c..264280829 100644
--- a/features/desktop/photo_lightbox.feature
+++ b/features/desktop/photo_lightbox.feature
@@ -1,13 +1,9 @@
@javascript
Feature: viewing the photo lightbox
Background:
- Given I am on the home page
- And a user with username "bob"
-
- When I sign in as "bob@bob.bob"
- And I am on the home page
-
- Given I expand the publisher
+ Given a user with username "bob"
+ And I sign in as "bob@bob.bob"
+ And I expand the publisher
And I attach the file "spec/fixtures/button.png" to hidden "file" within "#file-upload"
And I fill in the following:
| status_message_fake_text | Look at this dog |
diff --git a/features/desktop/post_preview.feature b/features/desktop/post_preview.feature
index e587a2e51..beb86a974 100644
--- a/features/desktop/post_preview.feature
+++ b/features/desktop/post_preview.feature
@@ -11,7 +11,6 @@ Feature: preview posts in the stream
| Alice Smith | alice@alice.alice |
And a user with email "bob@bob.bob" is connected with "alice@alice.alice"
When I sign in as "bob@bob.bob"
- And I am on the home page
Then I should not see any posts in my stream
Scenario: preview and post a text-only message
@@ -42,18 +41,20 @@ Feature: preview posts in the stream
Scenario: preview a photo with text
Given I expand the publisher
- When I attach the file "spec/fixtures/button.png" to hidden "file" within "#file-upload"
+ And I attach "spec/fixtures/button.png" to the publisher
When I fill in the following:
| status_message_fake_text | Look at this dog |
And I press "Preview"
Then I should see a "img" within ".stream_element div.photo_attachments"
And I should see "Look at this dog" within ".stream_element"
+ And I close the publisher
Scenario: preview a post with mentions
Given I expand the publisher
And I mention Alice in the publisher
And I press "Preview"
And I follow "Alice Smith"
+ And I confirm the alert
Then I should see "Alice Smith"
Scenario: preview a post on tag page
@@ -67,12 +68,13 @@ Feature: preview posts in the stream
And I press "Preview"
Then "This preview rocks" should be post 1
And the first post should be a preview
+ And I close the publisher
Scenario: preview a post with the poll
Given I expand the publisher
When I fill in the following:
| status_message_fake_text | I am eating yogurt |
- And I press the element "#poll_creator"
+ And I click on selector "#poll_creator"
When I fill in the following:
| status_message_fake_text | I am eating yogurt |
| poll_question | What kind of yogurt do you like? |
@@ -82,3 +84,4 @@ Feature: preview posts in the stream
And I press "Preview"
Then I should see a ".poll_form" within ".stream_element"
And I should see a "form" within ".stream_element"
+ And I close the publisher
diff --git a/features/desktop/post_with_a_poll.feature b/features/desktop/post_with_a_poll.feature
index 807ec908f..954211df7 100644
--- a/features/desktop/post_with_a_poll.feature
+++ b/features/desktop/post_with_a_poll.feature
@@ -6,40 +6,39 @@ Feature: posting with a poll
| username |
| bob |
And I sign in as "bob@bob.bob"
- And I am on the home page
-
+
Scenario: expanding the publisher
- Given "#publisher-poll-creator" is hidden
+ Given "#poll_creator_container" is hidden
When I expand the publisher
Then I should see an element "#poll_creator"
Scenario: expanding the poll creator
- Given "#publisher-poll-creator" is hidden
+ Given "#poll_creator_container" is hidden
When I expand the publisher
- And I press the element "#poll_creator"
- Then I should see an element "#publisher-poll-creator"
+ And I click on selector "#poll_creator"
+ Then I should see an element "#poll_creator_container"
Scenario: adding option to poll
- Given "#publisher-poll-creator" is hidden
+ Given "#poll_creator_container" is hidden
When I expand the publisher
- And I press the element "#poll_creator"
+ And I click on selector "#poll_creator"
And I fill in values for the first two options
- And I lose focus
+ And I lose focus
Then I should see 3 options
Scenario: delete an option
- Given "#publisher-poll-creator" is hidden
+ Given "#poll_creator_container" is hidden
When I expand the publisher
- And I press the element "#poll_creator"
+ And I click on selector "#poll_creator"
And I fill in values for the first two options
- And I lose focus
+ And I lose focus
And I delete the last option
Then I should see 2 option
And I should not see a remove icon
Scenario: post with an attached poll
Given I expand the publisher
- And I press the element "#poll_creator"
+ And I click on selector "#poll_creator"
When I fill in the following:
| status_message_fake_text | I am eating yogurt |
| poll_question | What kind of yogurt do you like? |
@@ -52,7 +51,7 @@ Feature: posting with a poll
Scenario: vote for an option
Given I expand the publisher
- And I press the element "#poll_creator"
+ And I click on selector "#poll_creator"
When I fill in the following:
| status_message_fake_text | I am eating yogurt |
| poll_question | What kind of yogurt do you like? |
@@ -69,7 +68,7 @@ Feature: posting with a poll
Scenario: click to show result
Given I expand the publisher
- And I press the element "#poll_creator"
+ And I click on selector "#poll_creator"
When I fill in the following:
| status_message_fake_text | I am eating yogurt |
| poll_question | What kind of yogurt do you like? |
@@ -77,18 +76,18 @@ Feature: posting with a poll
| normal |
| not normal |
And I press "Share"
- And I press the element ".toggle_result"
+ And I click on selector ".toggle_result"
Then I should see an element ".percentage"
Scenario: validate answer input
Given I expand the publisher
- And I press the element "#poll_creator"
+ And I click on selector "#poll_creator"
When I fill in the following:
| status_message_fake_text | I am eating yogurt |
| poll_question | What kind of yogurt do you like? |
And I fill in the following for the options:
| normal |
| |
- And I press the element "#publisher-poll-creator"
- And I press the element "input[type=submit]"
- Then I should see an element ".poll-answer.error"
+ And I click on selector "#poll_creator_container"
+ And I click on selector "#publisher button#submit"
+ Then I should see an element ".poll-answer input.error"
diff --git a/features/desktop/posts_from_main_page.feature b/features/desktop/posts_from_main_page.feature
index 0da96f25f..ce425b22d 100644
--- a/features/desktop/posts_from_main_page.feature
+++ b/features/desktop/posts_from_main_page.feature
@@ -9,21 +9,21 @@ Feature: posting from the main page
| username |
| bob |
| alice |
- And I sign in as "bob@bob.bob"
And a user with username "bob" is connected with "alice"
- Given I have following aspects:
+ And I sign in as "bob@bob.bob"
+ And I have following aspects:
| PostingTo |
| NotPostingThingsHere |
And I have user with username "alice" in an aspect called "PostingTo"
And I have user with username "alice" in an aspect called "NotPostingThingsHere"
- And I am on the home page
+ And I go to the home page
Scenario: expanding the publisher
Given ".markdownIndications" is hidden
And ".options_and_submit" is hidden
When I expand the publisher
- Then I should see "You can use Markdown to format your post" within "#publisher-images"
- Then I should see "All Aspects" within ".options_and_submit"
+ Then I should see "You can use Markdown to format your post" within ".markdownIndications"
+ Then I should see "All aspects" within ".options_and_submit"
Then I should see "Preview" within ".options_and_submit"
Scenario: post a text-only message to all aspects
@@ -42,10 +42,12 @@ Feature: posting from the main page
Given I expand the publisher
When I write the status message "The World needs more Cats."
And I submit the publisher
+ Then "The World needs more Cats." should be post 1
+ And "The World needs more Cats." should be post 2
- And I go to the aspects page
+ When I go to the aspects page
Then "The World needs more Cats." should be post 1
- Then "The World needs more Cats." should be post 2
+ And "The World needs more Cats." should be post 2
Scenario: posting a message appends it to the top of the stream
When I click the publisher and post "sup dog"
@@ -60,16 +62,18 @@ Feature: posting from the main page
And I submit the publisher
When I am on the aspects page
+ And I select all aspects
And I select only "PostingTo" aspect
Then I should see "I am eating a yogurt"
When I am on the aspects page
+ And I select all aspects
And I select only "NotPostingThingsHere" aspect
Then I should not see "I am eating a yogurt"
Scenario: post a photo with text
Given I expand the publisher
- When I attach the file "spec/fixtures/button.png" to hidden "file" within "#file-upload"
+ And I attach "spec/fixtures/button.png" to the publisher
When I write the status message "Look at this dog"
And I submit the publisher
And I go to the aspects page
@@ -83,10 +87,11 @@ Feature: posting from the main page
Scenario: post a photo without text
Given I expand the publisher
- When I attach the file "spec/fixtures/button.png" to hidden "file" within "#file-upload"
+ And I attach "spec/fixtures/button.png" to the publisher
Then I should see an uploaded image within the photo drop zone
When I press "Share"
- And I go to the aspects page
+ Then I should see a "img" within ".stream_element div.photo_attachments"
+ When I go to the aspects page
Then I should see a "img" within ".stream_element div.photo_attachments"
When I log out
And I sign in as "alice@alice.alice"
@@ -95,12 +100,8 @@ Feature: posting from the main page
Scenario: back out of posting a photo-only post
Given I expand the publisher
- And I have turned off jQuery effects
- When I attach the file "spec/fixtures/bad_urls.txt" to "file" within "#file-upload"
- And I confirm the alert
- Then I should not see an uploaded image within the photo drop zone
- When I attach the file "spec/fixtures/button.png" to hidden "file" within "#file-upload"
- And I click to delete the first uploaded photo
+ And I attach "spec/fixtures/button.png" to the publisher
+ When I click to delete the first uploaded photo
Then I should not see an uploaded image within the photo drop zone
And I should not be able to submit the publisher
@@ -108,20 +109,22 @@ Feature: posting from the main page
Given I expand the publisher
And I have turned off jQuery effects
When I write the status message "I am eating a yogurt"
- And I attach the file "spec/fixtures/button.png" to hidden "file" within "#file-upload"
+ And I attach "spec/fixtures/button.png" to the publisher
And I click to delete the first uploaded photo
Then I should not see an uploaded image within the photo drop zone
And the publisher should be expanded
+ And I close the publisher
Scenario: back out of uploading a picture when another has been attached
Given I expand the publisher
And I have turned off jQuery effects
When I write the status message "I am eating a yogurt"
- And I attach the file "spec/fixtures/button.png" to hidden "file" within "#file-upload"
- And I attach the file "spec/fixtures/button.png" to hidden "file" within "#file-upload"
+ And I attach "spec/fixtures/button.png" to the publisher
+ And I attach "spec/fixtures/button.png" to the publisher
And I click to delete the first uploaded photo
Then I should see an uploaded image within the photo drop zone
And the publisher should be expanded
+ And I close the publisher
@wip
Scenario: hide a contact's post
@@ -162,6 +165,7 @@ Feature: posting from the main page
And I select only "PostingTo" aspect
Then I should see "I am eating a yogurt"
When I am on the aspects page
+ And I select all aspects
And I select only "NotPostingThingsHere" aspect
Then I should not see "I am eating a yogurt"
@@ -182,10 +186,12 @@ Feature: posting from the main page
And I select only "PostingTo" aspect
Then I should see "I am eating a yogurt" and "And cornflakes also"
When I am on the aspects page
+ And I select all aspects
And I select only "Besties" aspect
Then I should not see "I am eating a yogurt"
Then I should see "And cornflakes also"
When I am on the aspects page
+ And I select all aspects
And I select only "NotPostingThingsHere" aspect
Then I should not see "I am eating a yogurt" and "And cornflakes also"
diff --git a/features/desktop/posts_from_profile_page.feature b/features/desktop/posts_from_profile_page.feature
index cd968d5b2..1f26e5fc1 100644
--- a/features/desktop/posts_from_profile_page.feature
+++ b/features/desktop/posts_from_profile_page.feature
@@ -4,13 +4,12 @@ Feature: posting from own profile page
I want to post from my profile page
Background:
- Given I am on the home page
- And a user with username "alice"
- When I sign in as "alice@alice.alice"
- Given I have following aspects:
+ Given a user with username "alice"
+ And I sign in as "alice@alice.alice"
+ And I have following aspects:
| Family |
| Work |
- Given I am on "alice@alice.alice"'s page
+ And I am on "alice@alice.alice"'s page
Scenario: posting some text
Given I expand the publisher
@@ -22,31 +21,31 @@ Feature: posting from own profile page
Then I should see "I want to understand people"
- When I am on the home page
+ When I go to the home page
Then I should see "I want to understand people"
When I am on the aspects page
And I select only "Family" aspect
Then I should see "I want to understand people"
- When I select only "Work" aspect
+ When I select all aspects
+ And I select only "Work" aspect
Then I should not see "I want to understand people"
Scenario: post a photo with text
Given I expand the publisher
- When I attach the file "spec/fixtures/button.png" to hidden "file" within "#file-upload"
- When I fill in the following:
- | status_message_fake_text | who am I? |
+ When I write the status message "who am I?"
+ And I attach "spec/fixtures/button.png" to the publisher
+ And I submit the publisher
- And I press "Share"
-
- When I am on the home page
+ When I go to the home page
Then I should see a "img" within ".stream_element div.photo_attachments"
And I should see "who am I?" within ".stream_element"
Scenario: back out of posting a photo-only post
Given I expand the publisher
And I have turned off jQuery effects
- When I attach the file "spec/fixtures/button.png" to hidden "file" within "#file-upload"
+ And I attach "spec/fixtures/button.png" to the publisher
And I click to delete the first uploaded photo
Then I should not see an uploaded image within the photo drop zone
+ And I close the publisher
diff --git a/features/desktop/posts_from_tag_page.feature b/features/desktop/posts_from_tag_page.feature
new file mode 100644
index 000000000..79ac32026
--- /dev/null
+++ b/features/desktop/posts_from_tag_page.feature
@@ -0,0 +1,22 @@
+@javascript
+Feature: Posting from the tag page
+ In order to share my opinion on cats
+ I want to post from the tag page
+
+ Background:
+ Given a user with username "alice"
+ And I sign in as "alice@alice.alice"
+ And I am on the tag page for "cats"
+
+ Scenario: posting some text
+ When I expand the publisher
+ And I have turned off jQuery effects
+ And I append "I like cats." to the publisher
+ And I press "Share"
+ Then "#cats I like cats." should be post 1
+
+ When I go to the home page
+ Then "#cats I like cats." should be post 1
+
+ When I am on the tag page for "cats"
+ Then "#cats I like cats." should be post 1
diff --git a/features/desktop/profile_photos.feature b/features/desktop/profile_photos.feature
index 8042dfa0c..7af405fb2 100644
--- a/features/desktop/profile_photos.feature
+++ b/features/desktop/profile_photos.feature
@@ -10,25 +10,27 @@ Feature: show photos
And I sign in as "robert@grimm.grimm"
Given I expand the publisher
- And I have turned off jQuery effects
- And I attach the file "spec/fixtures/button.png" to hidden "file" within "#file-upload"
- And I press "Share"
+ And I have turned off jQuery effects
+ And I attach the file "spec/fixtures/button.png" to hidden "file" within "#file-upload"
+ And I press "Share"
+ Then I should see a "img" within ".stream_element div.photo_attachments"
Scenario: see my own photos
When I am on "robert@grimm.grimm"'s page
- And I follow "View all" within ".image_list"
+ #TODO: find out why images don't show on first load
+ And I am on "robert@grimm.grimm"'s page
+ And I press the first "#photos_link"
Then I should be on person_photos page
Scenario: I cannot see photos of people who don't share with me
When I sign in as "alice@alice.alice"
And I am on "robert@grimm.grimm"'s page
- Then I should not see "photos" within "div#profile"
+ Then I should not see "Photos" within "#profile_horizontal_bar"
-
Scenario: I delete a photo
- Given I am on "robert@grimm.grimm"'s photos page
- When I delete a photo
- And I confirm the alert
- Then I should not see "photos" within "div#profile"
-
-
+ When I am on "robert@grimm.grimm"'s photos page
+ And I delete a photo
+ And I confirm the alert
+ Then I should not see a ".stream"
+ When I am on "robert@grimm.grimm"'s page
+ Then I should not see "Photos" within "#profile_horizontal_bar"
diff --git a/features/desktop/reshare.feature b/features/desktop/reshare.feature
index 928813e49..26c760be5 100644
--- a/features/desktop/reshare.feature
+++ b/features/desktop/reshare.feature
@@ -11,10 +11,11 @@ Feature: public repost
| Alice Smith | alice@alice.alice |
| Eve Doe | eve@eve.eve |
And a user with email "bob@bob.bob" is connected with "alice@alice.alice"
+ And a user with email "eve@eve.eve" is connected with "bob@bob.bob"
+ And "bob@bob.bob" has a public post with text "reshare this!"
Scenario: Resharing a post from a single post page
- Given "bob@bob.bob" has a public post with text "reshare this!"
- And I sign in as "alice@alice.alice"
+ Given I sign in as "alice@alice.alice"
And I am on "bob@bob.bob"'s page
And I open the show page of the "reshare this!" post
And I click on selector "a.reshare"
@@ -23,8 +24,7 @@ Feature: public repost
And I should see a flash message containing "successfully"
Scenario: Resharing a post from a single post page that is reshared
- Given "bob@bob.bob" has a public post with text "reshare this!"
- And the post with text "reshare this!" is reshared by "eve@eve.eve"
+ Given the post with text "reshare this!" is reshared by "eve@eve.eve"
And I sign in as "alice@alice.alice"
And I am on "bob@bob.bob"'s page
And I open the show page of the "reshare this!" post
@@ -33,12 +33,21 @@ Feature: public repost
Then I should see a flash message indicating success
And I should see a flash message containing "successfully"
+ Scenario: Delete original reshared post
+ Given "alice@alice.alice" has a public post with text "Don't reshare this!"
+ And the post with text "Don't reshare this!" is reshared by "bob@bob.bob"
+ And I sign in as "alice@alice.alice"
+ And I am on "alice@alice.alice"'s page
+
+ When I click to delete the first post
+ And I log out
+ 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 "bob@bob.bob" has a public post with text "reshare this!"
- And I sign in as "alice@alice.alice"
-
+ Given I sign in as "alice@alice.alice"
And I follow "Reshare"
And I confirm the alert
Then I should see a flash message indicating success
diff --git a/features/desktop/search.feature b/features/desktop/search.feature
new file mode 100644
index 000000000..da49164df
--- /dev/null
+++ b/features/desktop/search.feature
@@ -0,0 +1,33 @@
+@javascript
+Feature: search for users and hashtags
+ In order to find my friends on diaspora
+ As a user
+ I want search for them
+
+Background:
+ Given following users exist:
+ | username | email |
+ | Bob Jones | bob@bob.bob |
+ | Alice Smith | alice@alice.alice |
+ And I sign in as "bob@bob.bob"
+
+Scenario: search for a user and go to its profile
+ When I enter "Alice Sm" in the search input
+ Then I should see "Alice Smith" within ".ac_results"
+
+ When I click on the first search result
+ Then I should see "Alice Smith" within ".profile_header #name"
+
+Scenario: search for a inexistent user and go to the search page
+ When I enter "Trinity" in the search input
+ Then I should see "Search for Trinity" within ".ac_even"
+
+ When I click on the first search result
+ Then I should see "Users matching Trinity" within "#search_title"
+
+Scenario: search for a tag
+ When I enter "#Matrix" in the search input
+ Then I should see "#matrix" within ".ac_even"
+
+ When I click on the first search result
+ Then I should be on the tag page for "matrix"
diff --git a/features/desktop/show_more.feature b/features/desktop/show_more.feature
index b8f9a6e2e..b11b22786 100644
--- a/features/desktop/show_more.feature
+++ b/features/desktop/show_more.feature
@@ -1,6 +1,6 @@
@javascript
Feature: collapsing and expanding long posts
- In order to tame the lengths of posts in my stream
+ In order to tame the lengths of posts in my stream
As a rocket scientist
I want long posts to be collapsed and expand on click
@@ -9,18 +9,14 @@ Feature: collapsing and expanding long posts
| username |
| bob |
And I sign in as "bob@bob.bob"
- And I am on the home page
Scenario: post a very long message
Given I post an extremely long status message
And I go to the home page
-
Then the post should be collapsed
Scenario: expand a very long message
Given I post an extremely long status message
And I go to the home page
And I expand the post
-
Then the post should be expanded
-
diff --git a/features/desktop/signs_up.feature b/features/desktop/signs_up.feature
index ce8fb7d08..46ee98c3f 100644
--- a/features/desktop/signs_up.feature
+++ b/features/desktop/signs_up.feature
@@ -4,7 +4,7 @@ Feature: new user registration
Background:
When I go to the new user registration page
And I fill in the new user form
- And I press "Continue"
+ And I submit the form
Then I should be on the getting started page
Then I should see the 'getting started' contents
@@ -14,6 +14,7 @@ Feature: new user registration
And I follow "awesome_button"
And I confirm the alert
Then I should be on the stream page
+ And I close the publisher
And I should not see "awesome_button"
Scenario: new user tries to XSS itself
@@ -22,7 +23,6 @@ Feature: new user registration
And I focus the "follow_tags" field
Then I should see a flash message containing "Hey, <script>alert(0)//!"
-
Scenario: new user does not add any tags in setup wizard and cancel the alert
When I fill in the following:
| profile_first_name | some name |
@@ -31,12 +31,30 @@ Feature: new user registration
When I follow "awesome_button"
And I reject the alert
Then I should be on the getting started page
- And I should see a flash message containing "Alright, I'll wait."
+ And I should see a flash message containing "All right, I’ll wait."
Scenario: new user skips the setup wizard
When I follow "awesome_button"
And I confirm the alert
Then I should be on the stream page
+ And I close the publisher
+
+ Scenario: new user without any tags posts first status message
+ When I follow "awesome_button"
+ And I confirm the alert
+ Then I should be on the stream page
+ When I submit the publisher
+ Then "Hey everyone, I’m #newhere." should be post 1
+
+ Scenario: new user with some tags posts first status message
+ When I fill in the following:
+ | profile_first_name | some name |
+ And I fill in "tags" with "#rockstar"
+ And I press the first ".as-result-item" within "#as-results-tags"
+ And I follow "awesome_button"
+ Then I should be on the stream page
+ When I submit the publisher
+ Then "Hey everyone, I’m #newhere. I’m interested in #rockstar." should be post 1
Scenario: closing a popover clears getting started
When I follow "awesome_button"
@@ -45,28 +63,28 @@ Feature: new user registration
And I have turned off jQuery effects
And I wait for the popovers to appear
And I click close on all the popovers
- And I go to the home page
- Then I should not see "Welcome to Diaspora"
+ And I close the publisher
+ Then I should not see "Welcome to diaspora*"
Scenario: user fills in bogus data - client side validation
When I log out manually
And I go to the new user registration page
And I fill in the following:
| user_username | $%&(/&%$&/=)(/ |
- And I press "Continue"
+ And I press "Sign up"
Then I should not be able to sign up
And I should have a validation error on "user_username, user_password, user_email"
When I fill in the following:
| user_username | valid_user |
| user_email | this is not a valid email $%&/()( |
- And I press "Continue"
+ And I press "Sign up"
Then I should not be able to sign up
And I should have a validation error on "user_password, user_email"
When I fill in the following:
| user_email | valid@email.com |
| user_password | 1 |
- And I press "Continue"
+ And I press "Sign up"
Then I should not be able to sign up
And I should have a validation error on "user_password, user_password_confirmation"
diff --git a/features/desktop/single_post_view_moderation.feature b/features/desktop/single_post_view_moderation.feature
new file mode 100644
index 000000000..c47db4a48
--- /dev/null
+++ b/features/desktop/single_post_view_moderation.feature
@@ -0,0 +1,62 @@
+@javascript
+ Feature: using SPV moderation buttons
+
+ Background:
+ Given following users exist:
+ | username |
+ | bob |
+ | alice |
+ And a user with username "bob" is connected with "alice"
+ And I sign in as "bob@bob.bob"
+
+ Scenario: hide a contact's post
+ Given I expand the publisher
+ When I write the status message "Here is a post to test with"
+ And I submit the publisher
+
+ And I log out
+ And I sign in as "alice@alice.alice"
+
+ And I open the show page of the "Here is a post to test with" post
+ And I click to hide the post
+ And I confirm the alert
+
+ Then I should be on the stream page
+
+ Scenario: block a contact
+ Given I expand the publisher
+ When I write the status message "Here is a post to test with"
+ And I submit the publisher
+
+ And I log out
+ And I sign in as "alice@alice.alice"
+
+ And I open the show page of the "Here is a post to test with" post
+ And I click to block the user
+ And I confirm the alert
+
+ Then I should be on the stream page
+
+ Scenario: report a contact
+ Given I expand the publisher
+ When I write the status message "Here is a post to test with"
+ And I submit the publisher
+
+ And I log out
+ And I sign in as "alice@alice.alice"
+
+ And I open the show page of the "Here is a post to test with" post
+ And I click to report the post
+ And I confirm the alert
+
+ And I should see a flash message containing "The report has successfully been created"
+
+ Scenario: delete own post
+ Given I expand the publisher
+ When I write the status message "Here is a post to test with"
+ And I submit the publisher
+
+ And I open the show page of the "Here is a post to test with" post
+ And I click to delete the post
+ And I confirm the alert
+ Then I should be on the stream page
diff --git a/features/desktop/stops_following_users.feature b/features/desktop/stops_following_users.feature
index 30a5b97af..9859b3b4b 100644
--- a/features/desktop/stops_following_users.feature
+++ b/features/desktop/stops_following_users.feature
@@ -15,28 +15,20 @@ Feature: Unfollowing
Scenario: stop following someone while on their profile page
When I am on "alice@alice.alice"'s page
-
And I remove the person from my "Besties" aspect
- And I am on the home page
-
+ And I go to the home page
Then I should have 0 contacts in "Besties"
- Then I sign out
- When I sign in as "alice@alice.alice"
+ When I sign out
+ And I sign in as "alice@alice.alice"
And I am on "bob@bob.bob"'s page
-
Then I should not see "is sharing with you."
- Scenario: stop following someone while on the aspect edit page
- When I go to the home page
- And I go to the contacts page
-
+ Scenario: stop following someone while on the contacts page
+ When I go to the contacts page
And I follow "Besties"
- And I follow "Manage"
-
- And I press the first ".added" within "#facebox .contact_list ul > li:first-child"
-
- When I follow "My Contacts"
+ And I remove the first person from the aspect
+ And I follow "My contacts"
Then I should have 0 contacts in "Besties"
When I sign out
diff --git a/features/desktop/tags.feature b/features/desktop/tags.feature
deleted file mode 100644
index cf438d97b..000000000
--- a/features/desktop/tags.feature
+++ /dev/null
@@ -1,13 +0,0 @@
-@javascript
-Feature: Interacting with tags
-
- Background:
- Given there is a user "Samuel Beckett" who's tagged "#rockstar"
- And I am signed in
- And I am on the homepage
-
- Scenario: Searching for a tag
- When I search for "#rockstar"
- Then I should be on the tag page for "rockstar"
- And I should see "Samuel Beckett"
-
diff --git a/features/desktop/tags_and_comments.feature b/features/desktop/tags_and_comments.feature
deleted file mode 100644
index 35111cc22..000000000
--- a/features/desktop/tags_and_comments.feature
+++ /dev/null
@@ -1,21 +0,0 @@
-@javascript
-Feature: Issue #3382 The comments under postings are missing when using the #tags -view
-
- Background:
- Given a user named "Bob Jones" with email "bob@bob.bob"
- And I sign in as "bob@bob.bob"
- When I post a status with the text "This is a post with a #tag"
- And I am on the homepage
-
- Scenario:
- When I search for "#tag"
- Then I should be on the tag page for "tag"
- And I should see "This is a post with a #tag"
-
- Scenario:
- When I comment "this is a comment on my post" on "This is a post with a #tag"
- And I search for "#tag"
- Then I should be on the tag page for "tag"
- And I should see "this is a comment on my post"
-
-
diff --git a/features/mobile/activity_stream.feature b/features/mobile/activity_stream.feature
index f8771d906..947627fab 100644
--- a/features/mobile/activity_stream.feature
+++ b/features/mobile/activity_stream.feature
@@ -6,19 +6,19 @@ Feature: Viewing my activity on the steam mobile page
Background:
Given a user with username "alice"
- And "alice@alice.alice" has a public post with text "Hello! i am #newhere"
- When I sign in as "alice@alice.alice"
- And I toggle the mobile view
+ And "alice@alice.alice" has a public post with text "Hello! I am #newhere"
+ When I toggle the mobile view
+ And I sign in as "alice@alice.alice" on the mobile website
Scenario: Show my activity empty
When I open the drawer
- And I follow "My Activity"
- Then I should see "My Activity"
- And I should not see "Hello! i am #newhere"
+ And I follow "My activity"
+ Then I should see "My activity"
+ And I should not see "Hello! I am #newhere"
Scenario: Show post on my activity
When I click on selector "a.image_link.like_action.inactive"
And I open the drawer
- And I follow "My Activity"
- Then I should see "My Activity"
- And I should see "Hello! i am #newhere" within ".ltr"
+ And I follow "My activity"
+ Then I should see "My activity"
+ And I should see "Hello! I am #newhere" within ".ltr"
diff --git a/features/mobile/conversations.feature b/features/mobile/conversations.feature
index 9d7ae823e..c0814f40a 100644
--- a/features/mobile/conversations.feature
+++ b/features/mobile/conversations.feature
@@ -7,9 +7,9 @@ Feature: private conversations mobile
Background:
Given a user with username "bob"
And a user named "Alice Awesome" with email "alice@alice.alice"
- When I sign in as "bob@bob.bob"
And a user with username "bob" is connected with "alice_awesome"
- And I toggle the mobile view
+ When I toggle the mobile view
+ And I sign in as "bob@bob.bob" on the mobile website
Scenario: send and delete a mobile message
Given I send a mobile message with subject "Greetings" and text "hello, alice!" to "Alice Awesome"
@@ -18,7 +18,7 @@ Feature: private conversations mobile
And I press the first ".ltr" within ".conversation"
And "Alice Awesome" should be part of active conversation
And I should see "hello, alice!" within ".stream_element"
- When I sign in as "alice@alice.alice"
+ When I sign in as "alice@alice.alice" on the mobile website
And I reply with "hey, how you doing?"
And I press the first ".ltr" within ".conversation"
Then I should see "hey, how you doing?"
diff --git a/features/mobile/drawer.feature b/features/mobile/drawer.feature
new file mode 100644
index 000000000..d0d2e69bf
--- /dev/null
+++ b/features/mobile/drawer.feature
@@ -0,0 +1,87 @@
+@javascript
+Feature: Naviguate between pages using the header menu and the drawer
+ As a user
+ I want to be able naviguate between the pages of the mobile version
+
+ Background:
+ Given following users exist:
+ | username | email |
+ | Bob Jones | bob@bob.bob |
+ | Alice Smith | alice@alice.alice |
+
+ And I sign in as "alice@alice.alice"
+ And a user with email "bob@bob.bob" is connected with "alice@alice.alice"
+ And I search for "#boss"
+ And I press "Follow #boss"
+ And I toggle the mobile view
+
+ Scenario: naviguate to the stream page
+ When I open the drawer
+ And I follow "My activity"
+ And I click on selector "#header_title"
+ Then I should see "There are no posts yet." within "#main_stream"
+
+ Scenario: naviguate to the notification page
+ When I click on selector "#notification_badge"
+ Then I should see "Notifications" within "#main"
+
+ Scenario: naviguate to the conversation page
+ When I click on selector "#conversations_badge"
+ Then I should see "Inbox" within "#main"
+
+ Scenario: naviguate to the publisher page
+ When I click on selector "#compose_badge"
+ Then I should see "All aspects" within "#new_status_message"
+
+ Scenario: search a user
+ When I open the drawer
+ And I search for "Bob"
+ Then I should see "Users matching Bob" within "#search_title"
+
+ Scenario: search for a tag
+ When I open the drawer
+ And I search for "#bob"
+ Then I should see "#bob" within "#main > h1"
+
+ Scenario: naviguate to my activity page
+ When I open the drawer
+ And I follow "My activity"
+ Then I should see "My activity" within "#main"
+
+ Scenario: naviguate to my mentions page
+ Given Alice has a post mentioning Bob
+ And I sign in as "bob@bob.bob"
+ When I open the drawer
+ And I follow "@Mentions"
+ Then I should see "Bob Jones" within ".stream_element"
+
+ Scenario: naviguate to my aspects page
+ Given "bob@bob.bob" has a public post with text "bob's text"
+ When I open the drawer
+ And I follow "My aspects"
+ Then I should see "Besties" within "#all_aspects + li > ul"
+ And I follow "Besties"
+ Then I should see "bob's text" within "#main_stream"
+
+ Scenario: naviguate to the followed tags page
+ Given "bob@bob.bob" has a public post with text "bob is da #boss"
+ When I open the drawer
+ And I follow "#Followed tags"
+ Then I should see "#boss" within "#followed_tags + li > ul"
+ And I follow "#boss"
+ Then I should see "bob is da #boss" within "#main_stream"
+
+ Scenario: naviguate to my profile page
+ When I open the drawer
+ And I follow "Profile"
+ Then I should see "Alice" within "#author_info"
+
+ Scenario: naviguate to my mentions page
+ When I open the drawer
+ And I follow "Contacts"
+ Then I should see "Contacts" within "#main"
+
+ Scenario: naviguate to my mentions page
+ When I open the drawer
+ And I follow "Settings"
+ Then I should see "Settings" within "#main"
diff --git a/features/mobile/edits_profile.feature b/features/mobile/edits_profile.feature
index a89d5e2e4..9c7f88bd2 100644
--- a/features/mobile/edits_profile.feature
+++ b/features/mobile/edits_profile.feature
@@ -44,6 +44,3 @@ Feature: editing the profile in the mobile view
And I confirm the alert
And I attach the file "spec/fixtures/button.png" to hidden "file" within "#file-upload"
Then I should see a "img" within "#profile_photo_upload"
-
- When I go to my new profile page
- And I should see "Boba Fett"
diff --git a/features/mobile/getting_started.feature b/features/mobile/getting_started.feature
index 334e53720..733e54b52 100644
--- a/features/mobile/getting_started.feature
+++ b/features/mobile/getting_started.feature
@@ -1,13 +1,23 @@
@javascript
Feature: editing the getting started in the mobile view
- Scenario: editing getting started fields
- When I go to the new user registration page
+ Background:
+ Given I toggle the mobile view
+ And I am on the login page
+ When I follow "Sign up"
And I fill in the new user form
- And I press "Continue"
- And I visit the mobile getting started page
+ And I submit the form
+ Then I should be on the getting started page
Then I should see the 'getting started' contents
+ Scenario: new user does not add any tags in setup wizard
+ When I fill in the following:
+ | profile_first_name | some name |
+ And I follow "awesome_button"
+ Then I should be on the stream page
+ And I should not see "awesome_button"
+
+ Scenario: new user adds a profile photo and tags
When I attach the file "spec/fixtures/bad_urls.txt" to "file" within "#file-upload"
And I confirm the alert
And I attach the file "spec/fixtures/button.png" to hidden "file" within "#file-upload"
@@ -17,6 +27,7 @@ Feature: editing the getting started in the mobile view
And I press the first ".as-result-item" within ".as-results"
Then I should see "#men" within "ul#as-selections-tags"
+ Scenario: new user skips the setup wizard
When I follow "awesome_button"
Then I should be on the stream page
And I should not see "awesome_button"
diff --git a/features/mobile/invitations.feature b/features/mobile/invitations.feature
new file mode 100644
index 000000000..b2fcf96dc
--- /dev/null
+++ b/features/mobile/invitations.feature
@@ -0,0 +1,12 @@
+@javascript
+Feature: Invitations
+
+ Background:
+ Given I toggle the mobile view
+
+ Scenario: Accepting an invitation
+ When I visit alice's invitation code url
+ When I fill in the new user form
+ And I press "Create my account!"
+ Then I should see the "welcome to diaspora" message
+ And I should be able to friend Alice
diff --git a/features/mobile/multiphoto.feature b/features/mobile/multiphoto.feature
index 324f88737..ab0d19b14 100644
--- a/features/mobile/multiphoto.feature
+++ b/features/mobile/multiphoto.feature
@@ -7,8 +7,8 @@ Feature: viewing photos on the mobile main page
Background:
Given a user with username "bob"
- When I sign in as "bob@bob.bob"
- And I toggle the mobile view
+ When I toggle the mobile view
+ And I sign in as "bob@bob.bob" on the mobile website
And I click on selector "#compose_badge"
Scenario: view full size image
diff --git a/features/mobile/people_aspects.feature b/features/mobile/people_aspects.feature
new file mode 100644
index 000000000..4ee9172c2
--- /dev/null
+++ b/features/mobile/people_aspects.feature
@@ -0,0 +1,43 @@
+@javascript
+Feature: adding and removing people from aspects
+ In order to add people to my contacts
+ As a mobile user
+ I want to add and remove people from my contacts
+
+ Background:
+ Given following users exist:
+ | username |
+ | bob |
+ | alice |
+ And I toggle the mobile view
+ And I sign in as "bob@bob.bob" on the mobile website
+
+ Scenario: verify different states of the cover button
+ When I am on "alice@alice.alice"'s page
+ Then the aspect dropdown within "#author_info" should be labeled "Add contact"
+
+ When I select "Unicorns" from "user_aspects" within "#author_info"
+ Then the aspect dropdown within "#author_info" should be labeled "Unicorns"
+
+ When I select "Besties" from "user_aspects" within "#author_info"
+ Then the aspect dropdown within "#author_info" should be labeled "In 2 aspects"
+
+ Scenario: add contact to aspect
+ When I am on "alice@alice.alice"'s page
+ And I select "Unicorns" from "user_aspects" within "#author_info"
+ Then the aspect dropdown within "#author_info" should be labeled "Unicorns"
+ Then I should have 1 contacts in "Unicorns"
+
+ Scenario: remove contact to aspect
+ When I am on "alice@alice.alice"'s page
+ And I select "Unicorns" from "user_aspects" within "#author_info"
+ Then the aspect dropdown within "#author_info" should be labeled "Unicorns"
+
+ And I select "Besties" from "user_aspects" within "#author_info"
+ Then the aspect dropdown within "#author_info" should be labeled "In 2 aspects"
+ Then I should have 1 contacts in "Unicorns"
+
+ When I am on "alice@alice.alice"'s page
+ And I select "Unicorns" from "user_aspects" within "#author_info"
+ Then the aspect dropdown within "#author_info" should be labeled "Besties"
+ Then I should have 0 contacts in "Unicorns"
diff --git a/features/mobile/posts_from_main_page.feature b/features/mobile/posts_from_main_page.feature
index 9a62b544e..ce50391f3 100644
--- a/features/mobile/posts_from_main_page.feature
+++ b/features/mobile/posts_from_main_page.feature
@@ -9,8 +9,9 @@ Feature: posting from the mobile main page
| username |
| bob |
| alice |
- And I visit the mobile home page
- And I sign in as "bob@bob.bob"
+ And I toggle the mobile view
+ And I am on the home page
+ And I sign in as "bob@bob.bob" on the mobile website
And a user with username "bob" is connected with "alice"
Given I have following aspects:
| PostingTo |
@@ -19,8 +20,8 @@ Feature: posting from the mobile main page
And I have user with username "alice" in an aspect called "NotPostingThingsHere"
Scenario: post and delete some text
- Given I publisher mobile page
- And I append "I am eating yogurt" to the publisher mobile
+ Given I visit the mobile publisher page
+ And I append "I am eating yogurt" to the mobile publisher
And I select "Unicorns" from "aspect_ids_"
And I press "Share"
When I visit the mobile stream page
@@ -30,7 +31,7 @@ Feature: posting from the mobile main page
Then I should not see "I am eating yogurt"
Scenario: post a photo without text
- Given I publisher mobile page
+ Given I visit the mobile publisher page
When I attach the file "spec/fixtures/button.png" to hidden "file" within "#file-upload-publisher"
Then I should see an uploaded image within the photo drop zone
And I should see "button.png completed"
@@ -38,12 +39,12 @@ Feature: posting from the mobile main page
When I visit the mobile stream page
Then I should see a "img" within ".stream_element div.photo_attachments"
When I log out
- And I sign in as "alice@alice.alice"
+ And I sign in as "alice@alice.alice" on the mobile website
When I visit the mobile stream page
Then I should see a "img" within ".stream_element div.photo_attachments"
Scenario: back out of posting a photo-only post
- Given I publisher mobile page
+ Given I visit the mobile publisher page
When I attach the file "spec/fixtures/bad_urls.txt" to "file" within "#file-upload-publisher"
And I confirm the alert
Then I should not see an uploaded image within the photo drop zone
@@ -53,8 +54,8 @@ Feature: posting from the mobile main page
Then I should not see an uploaded image within the photo drop zone
Scenario: back out of uploading a picture when another has been attached
- Given I publisher mobile page
- And I append "I am eating yogurt" to the publisher mobile
+ Given I visit the mobile publisher page
+ And I append "I am eating yogurt" to the mobile publisher
And I attach the file "spec/fixtures/button.gif" to hidden "file" within "#file-upload-publisher"
And I attach the file "spec/fixtures/button.png" to hidden "file" within "#file-upload-publisher"
And I click to delete the first uploaded photo
diff --git a/features/mobile/reactions.feature b/features/mobile/reactions.feature
index 29c46097b..552c2d29c 100644
--- a/features/mobile/reactions.feature
+++ b/features/mobile/reactions.feature
@@ -11,24 +11,26 @@ Feature: reactions mobile post
| Alice Smith | alice@alice.alice |
And a user with email "bob@bob.bob" is connected with "alice@alice.alice"
When "alice@alice.alice" has posted a status message with a photo
- And I sign in as "bob@bob.bob"
And I toggle the mobile view
+ And I sign in as "bob@bob.bob" on the mobile website
Scenario: like on a mobile post
- When I should see "0 reactions" within ".show_comments"
+ When I should see "No reactions" within ".show_comments"
And I click on selector "span.show_comments"
And I click on selector "a.image_link.like_action.inactive"
- Then I go to the stream page
+ Then I should see a "a.image_link.like_action.active"
+ When I go to the stream page
And I should see "1 reaction" within ".show_comments"
And I click on selector "a.show_comments"
- And I should see "1" within ".like_count"
+ Then I should see "1" within ".like_count"
Scenario: comment and delete a mobile post
When I click on selector "a.image_link.comment_action.inactive"
And I fill in the following:
| text | is that a poodle? |
And I press "Comment"
- Then I go to the stream page
+ Then I should see "is that a poodle?"
+ When I go to the stream page
And I should see "1 reaction" within ".show_comments"
And I click on selector "a.show_comments"
And I should see "1" within ".comment_count"
diff --git a/features/mobile/reshare.feature b/features/mobile/reshare.feature
index 1ea29c28a..1da3516e2 100644
--- a/features/mobile/reshare.feature
+++ b/features/mobile/reshare.feature
@@ -21,7 +21,7 @@ Feature: resharing from the mobile
And I confirm the alert
Then I should see a "a.image_link.reshare_action.active"
When I go to the stream page
- Then I should see "reshared via" within ".reshare_via"
+ Then I should see "Reshared via" within ".reshare_via"
Scenario: Resharing a post from a single post page that is reshared
Given the post with text "reshare this!" is reshared by "eve@eve.eve"
@@ -31,7 +31,7 @@ Feature: resharing from the mobile
And I confirm the alert
Then I should see a "a.image_link.reshare_action.active"
When I go to the stream page
- Then I should see "reshared via" within ".reshare_via"
+ Then I should see "Reshared via" within ".reshare_via"
Scenario: Delete original reshared post
Given "alice@alice.alice" has a public post with text "Don't reshare this!"
@@ -41,8 +41,8 @@ Feature: resharing from the mobile
And I log out
And I sign in as "bob@bob.bob"
And I toggle the mobile view
- Then I should see "Original post deleted by author." within ".reshare"
+ Then I should see "Original post deleted by author" within ".reshare"
And I log out
- And I sign in as "eve@eve.eve"
+ And I sign in as "eve@eve.eve" on the mobile website
And I toggle the mobile view
- Then I should see "Original post deleted by author." within ".reshare"
+ Then I should see "Original post deleted by author" within ".reshare"
diff --git a/features/mobile/signs_up.feature b/features/mobile/signs_up.feature
new file mode 100644
index 000000000..fd09d8c1c
--- /dev/null
+++ b/features/mobile/signs_up.feature
@@ -0,0 +1,34 @@
+@javascript
+Feature: New user registration
+ In order to use Diaspora*
+ As a mobile user
+ I want to register an account
+
+ Background:
+ Given I toggle the mobile view
+ And I am on the login page
+ And I follow "Sign up"
+
+ Scenario: user signs up and goes to getting started
+ When I fill in the new user form
+ And I submit the form
+ Then I should be on the getting started page
+ Then I should see the 'getting started' contents
+
+ Scenario: user fills in bogus data - client side validation
+ When I fill in the following:
+ | user_username | $%&(/&%$&/=)(/ |
+ And I submit the form
+ Then I should not be able to sign up
+
+ When I fill in the following:
+ | user_username | valid_user |
+ | user_email | this is not a valid email $%&/()( |
+ And I submit the form
+ Then I should not be able to sign up
+
+ When I fill in the following:
+ | user_email | valid@email.com |
+ | user_password | 1 |
+ And I submit the form
+ Then I should not be able to sign up
diff --git a/features/step_definitions/aspects_steps.rb b/features/step_definitions/aspects_steps.rb
index 83539e80f..10357c4d4 100644
--- a/features/step_definitions/aspects_steps.rb
+++ b/features/step_definitions/aspects_steps.rb
@@ -1,17 +1,34 @@
module AspectCukeHelpers
def click_aspect_dropdown
- find('.dropdown .button').click
+ find('.aspect_dropdown .dropdown-toggle').click
end
def toggle_aspect(a_name)
a_id = @me.aspects.where(name: a_name).pluck(:id).first
- aspect_css = ".dropdown li[data-aspect_id='#{a_id}']"
- page.should have_selector(aspect_css)
+ aspect_css = ".aspect_dropdown li[data-aspect_id='#{a_id}']"
+ expect(page).to have_selector(aspect_css)
find(aspect_css).click
end
+ def toggle_aspect_via_ui(aspect_name)
+ aspects_dropdown = find(".aspect_membership_dropdown .dropdown-toggle", match: :first)
+ aspects_dropdown.click
+ selected_aspect_count = all(".aspect_membership_dropdown.open .dropdown-menu li.selected").length
+ aspect = find(".aspect_membership_dropdown.open .dropdown-menu li", text: aspect_name)
+ aspect_selected = aspect["class"].include? "selected"
+ aspect.click
+ aspect.parent.should have_no_css(".loading")
+
+ # close dropdown
+ page.should have_no_css('#profile.loading')
+ unless selected_aspect_count == 0 or (selected_aspect_count == 1 and aspect_selected )
+ aspects_dropdown.click
+ end
+ aspects_dropdown.should have_no_xpath("..[contains(@class, 'active')]")
+ end
+
def aspect_dropdown_visible?
- find('.aspect_membership.dropdown.active').should be_visible
+ expect(find('.aspect_membership_dropdown.open')).to be_visible
end
end
World(AspectCukeHelpers)
@@ -25,9 +42,8 @@ When /^I click on "([^"]*)" aspect edit icon$/ do |aspect_name|
end
When /^I select only "([^"]*)" aspect$/ do |aspect_name|
- click_link 'My Aspects'
+ click_link 'My aspects'
within('#aspects_list') do
- click_link 'Select all' if has_link? 'Select all'
click_link 'Deselect all'
current_scope.should have_no_css '.selected'
end
@@ -41,17 +57,23 @@ When /^I select "([^"]*)" aspect as well$/ do |aspect_name|
step %Q(I should see "#{aspect_name}" aspect selected)
end
-When /^I check the first contact list button$/ do
- find(".contact_list .btn", match: :first).tap do |button|
+When /^I select all aspects$/ do
+ within('#aspects_list') do
+ click_link "Select all"
+ end
+end
+
+When /^I add the first person to the aspect$/ do
+ find(".contact_add-to-aspect", match: :first).tap do |button|
button.click
- button.parent.should have_css ".added"
+ button.parent.should have_css ".contact_remove-from-aspect"
end
end
-When /^I uncheck the first contact list button$/ do
- find(".contact_list .btn", match: :first).tap do |button|
+When /^I remove the first person from the aspect$/ do
+ find(".contact_remove-from-aspect", match: :first).tap do |button|
button.click
- button.parent.should have_css ".add"
+ button.parent.should have_css ".contact_add-to-aspect"
sleep 1 # The expectation above should wait for the request to finsh, but that doesn't work for some reason
end
end
@@ -67,14 +89,14 @@ end
Then /^I should see "([^"]*)" aspect selected$/ do |aspect_name|
aspect = @me.aspects.where(:name => aspect_name).first
within("#aspects_list") do
- page.should have_css "li[data-aspect_id='#{aspect.id}'] .selected"
+ current_scope.should have_css "li[data-aspect_id='#{aspect.id}'] .selected"
end
end
Then /^I should see "([^"]*)" aspect unselected$/ do |aspect_name|
aspect = @me.aspects.where(:name => aspect_name).first
within("#aspects_list") do
- page.should have_no_css "li[data-aspect_id='#{aspect.id}'] .selected"
+ current_scope.should have_no_css "li[data-aspect_id='#{aspect.id}'] .selected"
end
end
diff --git a/features/step_definitions/conversations_steps.rb b/features/step_definitions/conversations_steps.rb
index e22bb1b1f..586f799d5 100644
--- a/features/step_definitions/conversations_steps.rb
+++ b/features/step_definitions/conversations_steps.rb
@@ -4,14 +4,19 @@ Then /^"([^"]*)" should be part of active conversation$/ do |name|
end
end
+Then /^I should have (\d+) unread private messages?$/ do |n_unread|
+ find("header #conversations_badge .badge_count").should have_content(n_unread)
+end
+
Then /^I send a message with subject "([^"]*)" and text "([^"]*)" to "([^"]*)"$/ do |subject, text, person|
step %(I am on the conversations page)
- step %(I follow "New conversation")
- step %(I fill in "contact_autocomplete" with "#{person}" in the modal window)
- step %(I press the first ".as-result-item" within ".as-results" in the modal window)
- step %(I fill in "conversation_subject" with "#{subject}" in the modal window)
- step %(I fill in "conversation_text" with "#{text}" in the modal window)
- step %(I press "Send" in the modal window)
+ within("#conversation_new", match: :first) do
+ step %(I fill in "contact_autocomplete" with "#{person}")
+ step %(I press the first ".as-result-item" within ".as-results")
+ step %(I fill in "conversation_subject" with "#{subject}")
+ step %(I fill in "conversation_text" with "#{text}")
+ step %(I press "Send")
+ end
end
When /^I reply with "([^"]*)"$/ do |text|
diff --git a/features/step_definitions/custom_web_steps.rb b/features/step_definitions/custom_web_steps.rb
index ac06e50cb..23692bd75 100644
--- a/features/step_definitions/custom_web_steps.rb
+++ b/features/step_definitions/custom_web_steps.rb
@@ -64,6 +64,10 @@ And /^I expand the publisher$/ do
click_publisher
end
+And /^I close the publisher$/ do
+ find("#publisher #hide_publisher").click
+end
+
Then /^the publisher should be expanded$/ do
find("#publisher")["class"].should_not include("closed")
end
@@ -74,7 +78,7 @@ end
And /^I want to mention (?:him|her) from the profile$/ do
find('#mention_button').click
- within('#facebox') do
+ within('#mentionModal') do
click_publisher
end
end
@@ -85,7 +89,7 @@ end
When /^I prepare the deletion of the first post$/ do
within(find('.stream .stream_element')) do
- ctrl = find('.controls')
+ ctrl = find('.control-icons')
ctrl.hover
ctrl.find('.remove_post').click
end
@@ -98,7 +102,7 @@ end
When /^I click to delete the first comment$/ do
within("div.comment", match: :first) do
- find(".controls").hover
+ find(".control-icons").hover
find(".comment_delete", visible: false).click # TODO: hax to check what's failing on Travis
end
end
@@ -130,6 +134,12 @@ When /^(.*) in the modal window$/ do |action|
end
end
+When /^(.*) in the mention modal$/ do |action|
+ within('#mentionModal') do
+ step action
+ end
+end
+
When /^I press the first "([^"]*)"(?: within "([^"]*)")?$/ do |link_selector, within_selector|
with_scope(within_selector) do
current_scope.find(link_selector, match: :first).click
@@ -150,12 +160,12 @@ end
Then /^(?:|I )should not see a "([^\"]*)"(?: within "([^\"]*)")?$/ do |selector, scope_selector|
with_scope(scope_selector) do
- current_scope.has_css?(selector, :visible => true).should be_false
+ current_scope.should have_no_css(selector, :visible => true)
end
end
Then /^page should (not )?have "([^\"]*)"$/ do |negate, selector|
- page.has_css?(selector).should ( negate ? be_false : be_true )
+ page.should ( negate ? (have_no_css(selector)) : (have_css(selector)) )
end
When /^I have turned off jQuery effects$/ do
@@ -165,7 +175,7 @@ end
When /^I search for "([^\"]*)"$/ do |search_term|
fill_in "q", :with => search_term
find_field("q").native.send_key(:enter)
- find("#leftNavBar")
+ have_content(search_term)
end
Then /^the "([^"]*)" field(?: within "([^"]*)")? should be filled with "([^"]*)"$/ do |field, selector, value|
@@ -178,21 +188,42 @@ Then /^the "([^"]*)" field(?: within "([^"]*)")? should be filled with "([^"]*)"
end
Then /^I should see (\d+) contacts$/ do |n_posts|
- has_css?("#people_stream .stream_element", :count => n_posts.to_i).should be_true
+ has_css?("#people_stream .stream_element", :count => n_posts.to_i).should be true
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
page.evaluate_script("window.pageYOffset").should > 0
end
+Then /^I should have scrolled down on the notification dropdown$/ do
+ page.evaluate_script("$('.notifications').scrollTop()").should > 0
+end
+
+
Then /^the notification dropdown should be visible$/ do
find(:css, "#notification_dropdown").should 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.execute_script <<-JS
window.resizeTo(800,600);
@@ -217,15 +248,15 @@ And /^I click close on all the popovers$/ do
end
Then /^I should see a flash message indicating success$/ do
- flash_message_success?.should be_true
+ flash_message_success?.should be true
end
Then /^I should see a flash message indicating failure$/ do
- flash_message_failure?.should be_true
+ flash_message_failure?.should be true
end
Then /^I should see a flash message with a warning$/ do
- flash_message_alert?.should be_true
+ flash_message_alert?.should be true
end
Then /^I should see a flash message containing "(.+)"$/ do |text|
diff --git a/features/step_definitions/hovercard_steps.rb b/features/step_definitions/hovercard_steps.rb
index 0b2a9628e..c76e481e7 100644
--- a/features/step_definitions/hovercard_steps.rb
+++ b/features/step_definitions/hovercard_steps.rb
@@ -1,5 +1,5 @@
When(/^I activate the first hovercard$/) do
- first('.hovercardable').hover
+ page.execute_script("$('.hovercardable').first().trigger('mouseenter');")
end
Then(/^I should see a hovercard$/) do
@@ -16,6 +16,6 @@ end
When (/^I hover "([^"]*)" within "([^"]*)"$/) do |name, selector|
with_scope(selector) do
- find(".author", text: name).hover
+ find(".author-name", text: name).hover
end
end
diff --git a/features/step_definitions/mention_steps.rb b/features/step_definitions/mention_steps.rb
index e270ea875..f7939afbe 100644
--- a/features/step_definitions/mention_steps.rb
+++ b/features/step_definitions/mention_steps.rb
@@ -5,6 +5,15 @@ And /^Alice has a post mentioning Bob$/ do
alice.post(:status_message, :text => "@{Bob Jones; #{bob.person.diaspora_handle}}", :to => aspect)
end
+And /^Alice has (\d+) posts mentioning Bob$/ do |n|
+ n.to_i.times do
+ alice = User.find_by_email 'alice@alice.alice'
+ bob = User.find_by_email 'bob@bob.bob'
+ aspect = alice.aspects.where(:name => "Besties").first
+ alice.post(:status_message, :text => "@{Bob Jones; #{bob.person.diaspora_handle}}", :to => aspect)
+ end
+end
+
And /^I mention Alice in the publisher$/ do
alice = User.find_by_email 'alice@alice.alice'
write_in_publisher("@{Alice Smith ; #{alice.person.diaspora_handle}}")
diff --git a/features/step_definitions/mobile_steps.rb b/features/step_definitions/mobile_steps.rb
index e6ba3938c..80662b200 100644
--- a/features/step_definitions/mobile_steps.rb
+++ b/features/step_definitions/mobile_steps.rb
@@ -1,12 +1,20 @@
-When /^I visit the mobile aspects page$/ do
- visit('/aspects.mobile')
+When /^I toggle the mobile view$/ do
+ visit('/mobile/toggle')
end
When /^I visit the mobile home page$/ do
visit('/users/sign_in.mobile')
end
-Given /^I publisher mobile page$/ do
+When /^I visit the mobile registration page$/ do
+ visit('/users/sign_up.mobile')
+end
+
+When /^I visit the mobile getting started page$/ do
+ visit('/getting_started.mobile')
+end
+
+Given /^I visit the mobile publisher page$/ do
visit('/status_messages/new.mobile')
end
@@ -14,12 +22,8 @@ When /^I visit the mobile stream page$/ do
visit('/stream.mobile')
end
-When /^I toggle the mobile view$/ do
- visit('/mobile/toggle')
-end
-
-When /^I visit the mobile getting started page$/ do
- visit('/getting_started.mobile')
+When /^I visit the mobile aspects page$/ do
+ visit('/aspects.mobile')
end
When /^I visit the mobile search page$/ do
@@ -29,3 +33,9 @@ end
When /^I open the drawer$/ do
find('#menu_badge').click
end
+
+Then /^the aspect dropdown within "([^"]*)" should be labeled "([^"]*)"/ do |selector, label|
+ within(selector) do
+ current_scope.should have_css("option.list_cover", :text => label)
+ end
+end
diff --git a/features/step_definitions/modal_steps.rb b/features/step_definitions/modal_steps.rb
new file mode 100644
index 000000000..f672d9f03
--- /dev/null
+++ b/features/step_definitions/modal_steps.rb
@@ -0,0 +1,3 @@
+Then /I should see the mention modal/ do
+ step %{I should see a "#mentionModal.in"}
+end
diff --git a/features/step_definitions/post_with_poll_steps.rb b/features/step_definitions/post_with_poll_steps.rb
index 2b3725c3c..523e60dc7 100644
--- a/features/step_definitions/post_with_poll_steps.rb
+++ b/features/step_definitions/post_with_poll_steps.rb
@@ -1,9 +1,9 @@
Then /^I should see ([1-9]+) options?$/ do |number|
- find("#publisher-poll-creator").all(".poll-answer").count.should eql(number.to_i)
+ find("#poll_creator_container").all(".poll-answer").count.should eql(number.to_i)
end
And /^I delete the last option$/ do
- find("#publisher-poll-creator").all(".poll-answer .remove-answer").first.click
+ find("#poll_creator_container").all(".poll-answer .remove-answer").first.click
end
And /^I should not see a remove icon$/ do
@@ -23,12 +23,6 @@ When /^I check the first option$/ do
first(".poll_form input").click
end
-When(/^I press the element "(.*?)"$/) do |selector|
- page.should have_css(selector)
- find(selector).click
-end
-
-
When(/^I fill in values for the first two options$/) do
all(".poll-answer input").each_with_index do |answer, i|
answer.set "answer option #{i}"
@@ -36,7 +30,7 @@ When(/^I fill in values for the first two options$/) do
end
When(/^I lose focus$/) do
- find("#publisher-poll-creator").click
+ find("#poll_creator_container").click
end
Then /^I should see an element "([^"]*)"$/ do |selector|
diff --git a/features/step_definitions/posts_steps.rb b/features/step_definitions/posts_steps.rb
index 8b8c1933b..69c86f80b 100644
--- a/features/step_definitions/posts_steps.rb
+++ b/features/step_definitions/posts_steps.rb
@@ -15,27 +15,27 @@ Then /^I should not see an uploaded image within the photo drop zone$/ do
end
Then /^I should not see any posts in my stream$/ do
- all(".stream_element").should be_empty
+ page.assert_selector(".stream_element", count: 0)
end
Then /^I should not be able to submit the publisher$/ do
- expect(publisher_submittable?).to be_false
+ expect(publisher_submittable?).to be false
end
Given /^"([^"]*)" has a public post with text "([^"]*)"$/ do |email, text|
user = User.find_by_email(email)
- user.post(:status_message, :text => text, :public => true, :to => user.aspects)
+ user.post(:status_message, :text => text, :public => true, :to => user.aspect_ids)
end
Given /^"([^"]*)" has a non public post with text "([^"]*)"$/ do |email, text|
user = User.find_by_email(email)
- user.post(:status_message, :text => text, :public => false, :to => user.aspects)
+ user.post(:status_message, :text => text, :public => false, :to => user.aspect_ids)
end
And /^the post with text "([^"]*)" is reshared by "([^"]*)"$/ do |text, email|
user = User.find_by_email(email)
root = Post.find_by_text(text)
- user.post(:reshare, :root_guid => root.guid, :public => true, :to => user.aspects)
+ user.post(:reshare, :root_guid => root.guid, :public => true, :to => user.aspect_ids)
end
And /^I submit the publisher$/ do
@@ -79,17 +79,21 @@ When /^I append "([^"]*)" to the publisher$/ do |text|
append_to_publisher(text)
end
-When /^I append "([^"]*)" to the publisher mobile$/ do |text|
+When /^I append "([^"]*)" to the mobile publisher$/ do |text|
append_to_publisher(text, '#status_message_text')
end
+When /^I attach "([^"]*)" to the publisher$/ do |path|
+ upload_file_with_publisher(path)
+end
+
When /^I open the show page of the "([^"]*)" post$/ do |post_text|
visit post_path_by_content(post_text)
end
When /^I select "([^"]*)" on the aspect dropdown$/ do |text|
page.execute_script(
- "$('#publisher .dropdown .dropdown_list')
+ "$('#publisher .dropdown .dropdown_list, #publisher .aspect_dropdown .dropdown-menu')
.find('li').each(function(i,el){
var elem = $(el);
if ('" + text + "' == $.trim(elem.text()) ) {
diff --git a/features/step_definitions/profile_steps.rb b/features/step_definitions/profile_steps.rb
index 7fdc31ba1..28a5a3489 100644
--- a/features/step_definitions/profile_steps.rb
+++ b/features/step_definitions/profile_steps.rb
@@ -7,7 +7,6 @@ And /^I mark myself as safe for work$/ do
end
When(/^I delete a photo$/) do
- find('.photo.loaded').hover
+ find('.photo.loaded .thumbnail', :match => :first).hover
find('.delete', :match => :first).click
end
-
diff --git a/features/step_definitions/search_steps.rb b/features/step_definitions/search_steps.rb
new file mode 100644
index 000000000..c623c202d
--- /dev/null
+++ b/features/step_definitions/search_steps.rb
@@ -0,0 +1,9 @@
+When /^I enter "([^"]*)" in the search input$/ do |search_term|
+ fill_in "q", :with => search_term
+end
+
+When /^I click on the first search result$/ do
+ within(".ac_results") do
+ find("li", match: :first).click
+ end
+end
diff --git a/features/step_definitions/session_steps.rb b/features/step_definitions/session_steps.rb
index 1679e4506..4179799fd 100644
--- a/features/step_definitions/session_steps.rb
+++ b/features/step_definitions/session_steps.rb
@@ -21,6 +21,13 @@ When /^I (?:sign|log) in as "([^"]*)"$/ do |email|
confirm_login
end
+When /^I (?:sign|log) in as "([^"]*)" on the mobile website$/ do |email|
+ @me = User.find_by_email(email)
+ @me.password ||= 'password'
+ automatic_login
+ confirm_login_mobile
+end
+
When /^I (?:sign|log) in with password "([^"]*)"$/ do |password|
@me.password = password
automatic_login
diff --git a/features/step_definitions/single_post_view_steps.rb b/features/step_definitions/single_post_view_steps.rb
new file mode 100644
index 000000000..07eba83bd
--- /dev/null
+++ b/features/step_definitions/single_post_view_steps.rb
@@ -0,0 +1,20 @@
+And /^I click to hide the post/ do
+ find('.hide_post').click
+end
+
+And /^I click to block the user/ do
+ find('.block_user').click
+end
+
+And /^I click to report the post/ do
+ find('.post_report').click
+end
+
+And /^I click to delete the post/ do
+ find('.remove_post').click
+end
+
+And /^I click to (?:like|unlike) the post/ do
+ like_show_page_post
+end
+
diff --git a/features/step_definitions/stream_steps.rb b/features/step_definitions/stream_steps.rb
index 557e224ab..901f4da3d 100644
--- a/features/step_definitions/stream_steps.rb
+++ b/features/step_definitions/stream_steps.rb
@@ -1,5 +1,5 @@
-Then /^I like the post "([^"]*)"$/ do |post_text|
- like_post(post_text)
+When /^I (?:like|unlike) the post "([^"]*)" in the stream$/ do |post_text|
+ like_stream_post(post_text)
end
Then /^"([^"]*)" should be post (\d+)$/ do |post_text, position|
diff --git a/features/step_definitions/tag_steps.rb b/features/step_definitions/tag_steps.rb
index c3cbef484..c1a6bc46c 100644
--- a/features/step_definitions/tag_steps.rb
+++ b/features/step_definitions/tag_steps.rb
@@ -1,5 +1,8 @@
When(/^I unfollow the "(.*?)" tag$/) do |tag|
- page.execute_script("$('#unfollow_#{tag}').css('display', 'block')")
- find("#unfollow_#{tag}").click
+ within("#tags_list") do
+ li = find('li', text: tag)
+ li.hover
+ li.find('.delete_tag_following').click
+ end
step 'I confirm the alert'
end
diff --git a/features/step_definitions/user_steps.rb b/features/step_definitions/user_steps.rb
index 89f49be03..5c9c55164 100644
--- a/features/step_definitions/user_steps.rb
+++ b/features/step_definitions/user_steps.rb
@@ -119,16 +119,17 @@ Then /^I should have (\d) contacts? in "([^"]*)"$/ do |n_contacts, aspect_name|
end
When /^I (?:add|remove) the person (?:to|from) my "([^\"]*)" aspect$/ do |aspect_name|
- aspects_dropdown = find(".aspect_membership .toggle.button", match: :first)
- aspects_dropdown.click
- find(".dropdown.active .dropdown_list li", text: aspect_name).click
- aspects_dropdown.click
+ toggle_aspect_via_ui(aspect_name)
end
When /^I post a status with the text "([^\"]*)"$/ do |text|
@me.post(:status_message, :text => text, :public => true, :to => 'all')
end
+When /^I post a limited status with the text "([^\"]*)"$/ do |text|
+ @me.post(:status_message, :text => text, :public => false, :to => @me.aspect_ids)
+end
+
And /^I follow the "([^\"]*)" link from the last sent email$/ do |link_text|
email_text = Devise.mailer.deliveries.first.body.to_s
email_text = Devise.mailer.deliveries.first.html_part.body.raw_source if email_text.blank?
@@ -201,7 +202,7 @@ end
Given /^I visit alice's invitation code url$/ do
@alice ||= FactoryGirl.create(:user, :username => 'alice', :getting_started => false)
- invite_code = InvitationCode.find_or_create_by_user_id(@alice.id)
+ invite_code = InvitationCode.find_or_create_by(user_id: @alice.id)
visit invite_code_path(invite_code)
end
diff --git a/features/step_definitions/web_steps.rb b/features/step_definitions/web_steps.rb
index 49f20ddc2..a9ed77abf 100644
--- a/features/step_definitions/web_steps.rb
+++ b/features/step_definitions/web_steps.rb
@@ -157,14 +157,14 @@ end
Then /^the "([^"]*)" checkbox(?: within "([^"]*)")? should be checked$/ do |label, selector|
with_scope(selector) do
field_checked = find_field(label)['checked']
- field_checked.should be_true
+ field_checked.should eq('true')
end
end
Then /^the "([^"]*)" checkbox(?: within "([^"]*)")? should not be checked$/ do |label, selector|
with_scope(selector) do
field_checked = find_field(label)['checked']
- field_checked.should be_false
+ field_checked.should be_falsey
end
end
diff --git a/features/support/application_cuke_helpers.rb b/features/support/application_cuke_helpers.rb
index 9cc3736d6..f45054494 100644
--- a/features/support/application_cuke_helpers.rb
+++ b/features/support/application_cuke_helpers.rb
@@ -12,7 +12,7 @@ module ApplicationCukeHelpers
end
def flash_message_containing?(text)
- flash_message(text: text).should be_visible
+ expect(flash_message(text: text)).to be_visible
end
def flash_message(opts={})
@@ -23,7 +23,7 @@ module ApplicationCukeHelpers
def confirm_form_validation_error(element)
is_invalid = page.evaluate_script("$('#{element}').is(':invalid')")
- is_invalid.should be_true
+ expect(is_invalid).to be true
end
def check_fields_validation_error(field_list)
diff --git a/features/support/database_cleaner_patches.rb b/features/support/database_cleaner_patches.rb
deleted file mode 100644
index 4988e393a..000000000
--- a/features/support/database_cleaner_patches.rb
+++ /dev/null
@@ -1,24 +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.
-
-# disable_referential_integrity doesn't work when using PostgreSQL
-# with a non-root user.
-# See http://kopongo.com/2008/7/25/postgres-ri_constrainttrigger-error
-module ActiveRecord
- module ConnectionAdapters
- class PostgreSQLAdapter < AbstractAdapter
- def disable_referential_integrity(&block)
- transaction {
- begin
- execute "SET CONSTRAINTS ALL DEFERRED"
- yield
- ensure
- execute "SET CONSTRAINTS ALL IMMEDIATE"
- end
- }
- end
- end
- end
-end
-
diff --git a/features/support/env.rb b/features/support/env.rb
index dca7bceed..dbb816735 100644
--- a/features/support/env.rb
+++ b/features/support/env.rb
@@ -1,121 +1,68 @@
require 'rubygems'
-prefork = proc do
- ENV["RAILS_ENV"] ||= "test"
- require 'cucumber/rails'
-
- require 'capybara/rails'
- require 'capybara/cucumber'
- require 'capybara/session'
- #require 'cucumber/rails/capybara_javascript_emulation' # Lets you click links with onclick javascript handlers without using @culerity or @javascript
-
- # Ensure we know the appservers port
- Capybara.server_port = 9887
-
-
- # Capybara defaults to XPath selectors rather than Webrat's default of CSS3. In
- # order to ease the transition to Capybara we set the default here. If you'd
- # prefer to use XPath just remove this line and adjust any selectors in your
- # steps to use the XPath syntax.
- Capybara.default_selector = :css
-
- # We have a ridiculously high wait time to account for build machines of various beefiness.
- # Capybara.default_wait_time = 30
-
- # While there are a lot of failures, wait less, avoiding travis timeout
- Capybara.default_wait_time = 15
-
- # If you set this to false, any error raised from within your app will bubble
- # up to your step definition and out to cucumber unless you catch it somewhere
- # on the way. You can make Rails rescue errors and render error pages on a
- # per-scenario basis by tagging a scenario or feature with the @allow-rescue tag.
- #
- # If you set this to true, Rails will rescue all errors and render error
- # pages, more or less in the same way your application would behave in the
- # default production environment. It's not recommended to do this for all
- # of your scenarios, as this makes it hard to discover errors in your application.
- ActionController::Base.allow_rescue = false
-
- require 'database_cleaner'
- require 'database_cleaner/cucumber'
- DatabaseCleaner.strategy = :truncation
- DatabaseCleaner.orm = "active_record"
- Cucumber::Rails::World.use_transactional_fixtures = false
-
- require File.join(File.dirname(__FILE__), "database_cleaner_patches")
- require File.join(File.dirname(__FILE__), "integration_sessions_controller")
- require File.join(File.dirname(__FILE__), "poor_mans_webmock")
-
- require 'sidekiq/testing/inline'
-
- require Rails.root.join('spec', 'helper_methods')
- require Rails.root.join('spec', 'support', 'inlined_jobs')
- require Rails.root.join('spec', 'support', 'user_methods')
- include HelperMethods
-
- # require 'webmock/cucumber'
- # WebMock.disable_net_connect!(:allow_localhost => true)
-
-
- #hax to get rubymine to run spork, set RUBYMINE_HOME in your .bash_profile
- if ENV["RUBYMINE_HOME"]
- puts "Loading rubymine spork extensions"
- $:.unshift(File.expand_path("rb/testing/patch/common", ENV["RUBYMINE_HOME"]))
- $:.unshift(File.expand_path("rb/testing/patch/bdd", ENV["RUBYMINE_HOME"]))
- end
-end
+ENV["RAILS_ENV"] ||= "test"
-each_run = proc do
- Before do
- DatabaseCleaner.clean
- Devise.mailer.deliveries = []
- end
-
- After do
- if Capybara.current_session.driver.respond_to?(:browser)
- Capybara.reset_sessions!
- # Capybara.current_session.driver.browser.manage.delete_all_cookies
- end
- end
-
- Before('@localserver') do
- TestServerFixture.start_if_needed
- CapybaraSettings.instance.save
- Capybara.current_driver = :selenium
- Capybara.run_server = false
- end
-
- After('@localserver') do
- CapybaraSettings.instance.restore
- end
-end
+ # Have all rests run with english browser locale
+ENV['LANG'] = 'C'
-begin
- require 'spork'
- #uncomment the following line to use spork with the debugger
- #require 'spork/ext/ruby-debug'
+require 'cucumber/rails'
- Spork.prefork(&prefork)
- Spork.each_run(&each_run)
-rescue LoadError
- prefork.call
- each_run.call
-end
+require 'capybara/rails'
+require 'capybara/cucumber'
+require 'capybara/session'
+#require 'cucumber/rails/capybara_javascript_emulation' # Lets you click links with onclick javascript handlers without using @culerity or @javascript
+
+# Ensure we know the appservers port
+Capybara.server_port = AppConfig.pod_uri.port
+Rails.application.routes.default_url_options[:host] = AppConfig.pod_uri.host
+Rails.application.routes.default_url_options[:port] = AppConfig.pod_uri.port
-# give firefox more time to complete requests
-# http://ihswebdesign.com/knowledge-base/fixing-selenium-timeouterror/
-After do |scenario|
- if scenario.exception.is_a? Timeout::Error
- # restart Selenium driver
- Capybara.send(:session_pool).delete_if { |key, value| key =~ /selenium/i }
- end
+# Use a version of Firefox defined by environment variable, if set
+Capybara.register_driver :selenium do |app|
+ require 'selenium/webdriver'
+ Selenium::WebDriver::Firefox::Binary.path = ENV['FIREFOX_BINARY_PATH'] || Selenium::WebDriver::Firefox::Binary.path
+ Capybara::Selenium::Driver.new(app, :browser => :firefox)
end
-# # https://makandracards.com/makandra/950-speed-up-rspec-by-deferring-garbage-collection
-# require File.join(File.dirname(__FILE__), "..", "..", "spec", "support", "deferred_garbage_collection")
-# Before do
-# DeferredGarbageCollection.start
-# end
-# After do
-# DeferredGarbageCollection.reconsider
-# end
+# Capybara defaults to XPath selectors rather than Webrat's default of CSS3. In
+# order to ease the transition to Capybara we set the default here. If you'd
+# prefer to use XPath just remove this line and adjust any selectors in your
+# steps to use the XPath syntax.
+Capybara.default_selector = :css
+
+# We have a ridiculously high wait time to account for build machines of various beefiness.
+# Capybara.default_wait_time = 30
+
+# While there are a lot of failures, wait less, avoiding travis timeout
+Capybara.default_wait_time = 15
+
+# If you set this to false, any error raised from within your app will bubble
+# up to your step definition and out to cucumber unless you catch it somewhere
+# on the way. You can make Rails rescue errors and render error pages on a
+# per-scenario basis by tagging a scenario or feature with the @allow-rescue tag.
+#
+# If you set this to true, Rails will rescue all errors and render error
+# pages, more or less in the same way your application would behave in the
+# default production environment. It's not recommended to do this for all
+# of your scenarios, as this makes it hard to discover errors in your application.
+ActionController::Base.allow_rescue = false
+
+Cucumber::Rails::Database.autorun_database_cleaner = true
+Cucumber::Rails::World.use_transactional_fixtures = false
+
+require File.join(File.dirname(__FILE__), "integration_sessions_controller")
+require File.join(File.dirname(__FILE__), "poor_mans_webmock")
+
+require 'sidekiq/testing/inline'
+
+require Rails.root.join('spec', 'helper_methods')
+require Rails.root.join('spec', 'support', 'inlined_jobs')
+require Rails.root.join('spec', 'support', 'user_methods')
+include HelperMethods
+
+# require 'webmock/cucumber'
+# WebMock.disable_net_connect!(:allow_localhost => true)
+
+Before do
+ Devise.mailer.deliveries = []
+end
diff --git a/features/support/integration_sessions_controller.rb b/features/support/integration_sessions_controller.rb
index acd050240..c34f87237 100644
--- a/features/support/integration_sessions_controller.rb
+++ b/features/support/integration_sessions_controller.rb
@@ -1,7 +1,7 @@
class IntegrationSessionsController < ActionController::Base
def new
@user_id = params[:user_id]
- render 'features/support/integration_sessions_form', :layout => false
+ render file: 'features/support/integration_sessions_form', layout: false
end
def create
sign_in_and_redirect User.find(params[:user_id])
diff --git a/features/support/matchers.rb b/features/support/matchers.rb
new file mode 100644
index 000000000..71a4bb600
--- /dev/null
+++ b/features/support/matchers.rb
@@ -0,0 +1,36 @@
+RSpec::Matchers.define :have_path do |expected|
+ match do |actual|
+ await_condition { actual.current_path == expected }
+ end
+
+ failure_message_for_should do |actual|
+ "expected #{actual.inspect} to have path #{expected.inspect} but was #{actual.current_path.inspect}"
+ end
+ failure_message_for_should_not do |actual|
+ "expected #{actual.inspect} to not have path #{expected.inspect} but it had"
+ end
+end
+
+
+RSpec::Matchers.define :have_value do |expected|
+ match do |actual|
+ await_condition { actual.value && actual.value.include?(expected) }
+ end
+
+ failure_message_for_should do |actual|
+ "expected #{actual.inspect} to have value #{expected.inspect} but was #{actual.value.inspect}"
+ end
+ failure_message_for_should_not do |actual|
+ "expected #{actual.inspect} to not have value #{expected.inspect} but it had"
+ end
+end
+
+
+def await_condition &condition
+ start_time = Time.now
+ until condition.call
+ return false if (Time.now-start_time) > Capybara.default_wait_time
+ sleep 0.05
+ end
+ true
+end
diff --git a/features/support/paths.rb b/features/support/paths.rb
index df6774164..d1b923091 100644
--- a/features/support/paths.rb
+++ b/features/support/paths.rb
@@ -28,18 +28,14 @@ module NavigationHelpers
when /^"([^\"]*)"'s page$/
p = User.find_by_email($1).person
{ path: person_path(p),
- # '.diaspora_handle' on desktop, '.description' on mobile
- special_elem: { selector: '.diaspora_handle, .description', text: p.diaspora_handle }
+ # '#diaspora_handle' on desktop, '.description' on mobile
+ special_elem: { selector: '#diaspora_handle, .description', text: p.diaspora_handle }
}
when /^"([^\"]*)"'s photos page$/
p = User.find_by_email($1).person
person_photos_path p
when /^my account settings page$/
edit_user_path
- when /^my new profile page$/
- person_path(@me.person, :ex => true)
- when /^the new stream$/
- stream_path(:ex => true)
when /^forgot password page$/
new_user_password_path
when /^"(\/.*)"/
@@ -70,8 +66,7 @@ module NavigationHelpers
end
def confirm_on_page(page_name)
- current_path = URI.parse(current_url).path
- current_path.should == path_to(page_name)
+ expect(page).to have_path(path_to(page_name))
end
end
diff --git a/features/support/publishing_cuke_helpers.rb b/features/support/publishing_cuke_helpers.rb
index eef1eeaea..c76c46f68 100644
--- a/features/support/publishing_cuke_helpers.rb
+++ b/features/support/publishing_cuke_helpers.rb
@@ -8,7 +8,16 @@ module PublishingCukeHelpers
elem.native.send_keys(' ' + txt)
# make sure the other text field got the new contents
- find('#status_message_text', visible: false).value.should include(txt)
+ expect(find("#status_message_text", visible: false)).to have_value txt
+ end
+
+ def upload_file_with_publisher(path)
+ page.execute_script(%q{$("input[name='file']").css("opacity", '1');})
+ with_scope("#publisher_textarea_wrapper") do
+ attach_file("file", Rails.root.join(path).to_s)
+ # wait for the image to be ready
+ page.assert_selector(".publisher_photo.loading", count: 0)
+ end
end
def make_post(text)
@@ -19,7 +28,8 @@ module PublishingCukeHelpers
def submit_publisher
txt = find('#publisher #status_message_fake_text').value
find('#publisher .creation').click
- page.should have_content(txt) unless page.has_css?('.nsfw-shield')
+ # wait for the content to appear
+ expect(find('#main_stream')).to have_content(txt)
end
def click_and_post(text)
@@ -35,26 +45,26 @@ module PublishingCukeHelpers
end
def publisher_submittable?
- submit_btn = find("#publisher input[type=submit]")
+ submit_btn = find("#publisher button#submit")
!submit_btn[:disabled]
end
def expand_first_post
within(".stream_element", match: :first) do
find(".expander").click
- has_css?(".expander").should be_false
+ expect(page).to have_no_css(".expander")
end
end
def first_post_collapsed?
- find(".stream_element .collapsible", match: :first).should have_css(".expander")
- page.should have_css(".stream_element .collapsible.collapsed", match: :first)
+ expect(find(".stream_element .collapsible", match: :first)).to have_css(".expander")
+ expect(page).to have_css(".stream_element .collapsible.collapsed", match: :first)
end
def first_post_expanded?
- page.should have_no_css(".stream_element .expander", match: :first)
- page.should have_no_css(".stream_element .collapsible.collapsed", match: :first)
- page.should have_css(".stream_element .collapsible.opened", match: :first)
+ expect(page).to have_no_css(".stream_element .expander", match: :first)
+ expect(page).to have_no_css(".stream_element .collapsible.collapsed", match: :first)
+ expect(page).to have_css(".stream_element .collapsible.opened", match: :first)
end
def first_post_text
@@ -74,18 +84,25 @@ module PublishingCukeHelpers
end
def find_post_by_text(text)
+ expect(page).to have_text(text)
find(".stream_element", text: text)
end
- def like_post(post_text)
+ def within_post(post_text)
+ within find_post_by_text(post_text) do
+ yield
+ end
+ end
+
+ def like_stream_post(post_text)
within_post(post_text) do
- click_link 'Like'
+ find(:css, 'a.like').click
end
end
- def within_post(post_text)
- within find_post_by_text(post_text) do
- yield
+ def like_show_page_post
+ within("#single-post-actions") do
+ find(:css, 'a.like').click
end
end
@@ -118,7 +135,7 @@ module PublishingCukeHelpers
def assert_nsfw(text)
post = find_post_by_text(text)
- post.find(".nsfw-shield").should be_present
+ expect(post.find(".nsfw-shield")).to be_present
end
end
diff --git a/features/support/server.rb b/features/support/server.rb
deleted file mode 100644
index 90b90c728..000000000
--- a/features/support/server.rb
+++ /dev/null
@@ -1,73 +0,0 @@
-
-ENV["RAILS_ENV"] ||= "test"
-require File.expand_path(File.dirname(__FILE__) + '/../../config/environment') unless defined?(Rails)
-
-require 'timeout'
-require 'socket'
-require 'singleton'
-
-require 'capybara/rails'
-require 'capybara/cucumber'
-require 'capybara/session'
-
-class TestServerFixture
-# simple interface to script/server
-
- def self.is_port_open(host, port, tries)
- for i in (1..tries)
- begin
- Timeout::timeout(2) do
- begin
- s = TCPSocket.new(host, port)
- s.close
- return true
- rescue Errno::ECONNREFUSED, Errno::EHOSTUNREACH
- sleep( 2)
- end
- end
- rescue Timeout::Error
- return false
- end
- end
- return false
- end
-
- def self.start_if_needed
- unless TestServerFixture.is_port_open( "localhost", 3000, 2)
- system( "script/server -d")
- if TestServerFixture.is_port_open( "localhost", 3000, 30)
- puts "script/server started"
- else
- puts "Error: can't start script/server"
- end
- end
- end
-
-end
-
-class CapybaraSettings
-# simple save/restore for Capybara
-
- include Singleton
-
- def save
- begin
- @run_server = Capybara.run_server
- @driver = Capybara.current_driver
- @host = Capybara.app_host
- rescue => e
- puts "Saving exception: " + e.inspect
- end
- end
-
- def restore
- begin
- Capybara.current_driver = @driver
- Capybara.app_host = @host
- Capybara.run_server = @run_server
- rescue => e
- puts "Restore exception: " + e.inspect
- end
- end
-
-end
diff --git a/features/support/user_cuke_helpers.rb b/features/support/user_cuke_helpers.rb
index 0113dd076..20603dde8 100644
--- a/features/support/user_cuke_helpers.rb
+++ b/features/support/user_cuke_helpers.rb
@@ -47,6 +47,11 @@ module UserCukeHelpers
page.has_content?("#{@me.first_name} #{@me.last_name}")
end
+ # checks the mobile page content to see, if the login was successful
+ def confirm_login_mobile
+ page.has_css?("#notification_badge")
+ end
+
# delete all cookies, destroying the current session
def logout
$browser.delete_cookie('_session', 'path=/') if $browser
@@ -105,12 +110,12 @@ module UserCukeHelpers
end
def confirm_getting_started_contents
- page.should have_content("Well, hello there!")
- page.should have_content("Who are you?")
- page.should have_content("What are you into?")
+ expect(page).to have_content("Well, hello there!")
+ expect(page).to have_content("Who are you?")
+ expect(page).to have_content("What are you into?")
# the username that was just entered for registration
- page.should have_field("profile_first_name", with: @username)
+ expect(page).to have_field("profile_first_name", with: @username)
end
end
diff --git a/graphics/ball.svg b/graphics/ball.svg
new file mode 100644
index 000000000..cd9fbd83e
--- /dev/null
+++ b/graphics/ball.svg
@@ -0,0 +1,217 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" width="700" height="762.8667" id="svg2" style="display:inline">
+ <title id="title5724">Diaspora* Official Promo Artwork Toolkit</title>
+ <defs id="defs4">
+ <inkscape:path-effect effect="spiro" id="path-effect6401"/>
+ <inkscape:path-effect effect="spiro" id="path-effect6397"/>
+ <inkscape:path-effect effect="spiro" id="path-effect6366"/>
+ <inkscape:path-effect effect="spiro" id="path-effect6362"/>
+ <inkscape:path-effect effect="spiro" id="path-effect6358"/>
+ <inkscape:path-effect effect="spiro" id="path-effect6354"/>
+ <inkscape:path-effect effect="spiro" id="path-effect6350"/>
+ <inkscape:path-effect effect="spiro" id="path-effect6346"/>
+ <inkscape:path-effect effect="spiro" id="path-effect6342"/>
+ <inkscape:path-effect effect="spiro" id="path-effect5500"/>
+ <inkscape:path-effect effect="spiro" id="path-effect5496"/>
+ <inkscape:path-effect effect="spiro" id="path-effect3805"/>
+ <inkscape:path-effect effect="spiro" id="path-effect3801"/>
+ <inkscape:path-effect effect="spiro" id="path-effect3029"/>
+ <inkscape:path-effect effect="spiro" id="path-effect3024"/>
+ <inkscape:path-effect effect="spiro" id="path-effect3024-5"/>
+ <inkscape:path-effect effect="spiro" id="path-effect3024-5-5"/>
+ <inkscape:path-effect effect="spiro" id="path-effect3024-5-5-8"/>
+ <inkscape:path-effect effect="spiro" id="path-effect3024-5-5-8-2"/>
+ <inkscape:path-effect effect="spiro" id="path-effect3024-4"/>
+ <filter x="0" y="0" width="1" height="1" color-interpolation-filters="sRGB" id="filter4012">
+ <feTurbulence result="result0" baseFrequency="0.037" numOctaves="3" id="feTurbulence4014"/>
+ <feSpecularLighting result="result1" specularConstant="1" surfaceScale="2" specularExponent="24.29999924" id="feSpecularLighting4016">
+ <feDistantLight azimuth="225" elevation="45" id="feDistantLight4018"/>
+ </feSpecularLighting>
+ <feDiffuseLighting result="result2" diffuseConstant="1.21000004" surfaceScale="3" in="result0" id="feDiffuseLighting4020">
+ <feDistantLight elevation="42" azimuth="225" id="feDistantLight4022"/>
+ </feDiffuseLighting>
+ <feBlend in2="SourceGraphic" mode="multiply" result="result91" id="feBlend4024"/>
+ <feComposite in2="result91" operator="arithmetic" k1="0" k2="1" k3="1" k4="0" in="result1" result="result92" id="feComposite4026"/>
+ <feComposite in2="SourceAlpha" operator="in" result="result2" id="feComposite4028"/>
+ </filter>
+ <inkscape:path-effect effect="spiro" id="path-effect5500-0"/>
+ <inkscape:path-effect effect="spiro" id="path-effect5500-7"/>
+ <inkscape:path-effect effect="spiro" id="path-effect5500-0-5"/>
+ <inkscape:path-effect effect="spiro" id="path-effect5500-8"/>
+ <inkscape:path-effect effect="spiro" id="path-effect5500-0-1"/>
+ <inkscape:path-effect effect="spiro" id="path-effect5500-3"/>
+ <inkscape:path-effect effect="spiro" id="path-effect5500-0-50"/>
+ <inkscape:path-effect effect="spiro" id="path-effect5500-3-9"/>
+ <inkscape:path-effect effect="spiro" id="path-effect5500-0-50-7"/>
+ <inkscape:path-effect effect="spiro" id="path-effect5500-8-4"/>
+ <inkscape:path-effect effect="spiro" id="path-effect5500-0-1-5"/>
+ <inkscape:path-effect effect="spiro" id="path-effect5500-8-4-8"/>
+ <inkscape:path-effect effect="spiro" id="path-effect5500-0-1-5-8"/>
+ <inkscape:path-effect effect="spiro" id="path-effect5500-3-9-6"/>
+ <inkscape:path-effect effect="spiro" id="path-effect5500-0-50-7-8"/>
+ <inkscape:path-effect effect="spiro" id="path-effect5500-3-0"/>
+ <inkscape:path-effect effect="spiro" id="path-effect5500-0-50-8"/>
+ <inkscape:path-effect effect="spiro" id="path-effect5500-8-48"/>
+ <inkscape:path-effect effect="spiro" id="path-effect5500-0-1-6"/>
+ <inkscape:path-effect effect="spiro" id="path-effect5500-7-3"/>
+ <inkscape:path-effect effect="spiro" id="path-effect5500-0-5-5"/>
+ <inkscape:path-effect effect="spiro" id="path-effect5500-31"/>
+ <inkscape:path-effect effect="spiro" id="path-effect5500-0-6"/>
+ <inkscape:path-effect effect="spiro" id="path-effect5500-8-4-8-8"/>
+ <inkscape:path-effect effect="spiro" id="path-effect5500-0-1-5-8-4"/>
+ <inkscape:path-effect effect="spiro" id="path-effect5500-3-9-6-6"/>
+ <inkscape:path-effect effect="spiro" id="path-effect5500-0-50-7-8-4"/>
+ <inkscape:path-effect effect="spiro" id="path-effect5500-3-0-3"/>
+ <inkscape:path-effect effect="spiro" id="path-effect5500-0-50-8-7"/>
+ <inkscape:path-effect effect="spiro" id="path-effect5500-7-3-5"/>
+ <inkscape:path-effect effect="spiro" id="path-effect5500-0-5-5-3"/>
+ <inkscape:path-effect effect="spiro" id="path-effect5500-31-6"/>
+ <inkscape:path-effect effect="spiro" id="path-effect5500-0-6-3"/>
+ <inkscape:path-effect effect="spiro" id="path-effect5500-8-4-8-4"/>
+ <inkscape:path-effect effect="spiro" id="path-effect5500-0-1-5-8-0"/>
+ <inkscape:path-effect effect="spiro" id="path-effect5500-3-9-6-2"/>
+ <inkscape:path-effect effect="spiro" id="path-effect5500-0-50-7-8-9"/>
+ <inkscape:path-effect effect="spiro" id="path-effect5500-3-0-1"/>
+ <inkscape:path-effect effect="spiro" id="path-effect5500-0-50-8-4"/>
+ <inkscape:path-effect effect="spiro" id="path-effect5500-7-3-9"/>
+ <inkscape:path-effect effect="spiro" id="path-effect5500-0-5-5-9"/>
+ <inkscape:path-effect effect="spiro" id="path-effect5500-31-3"/>
+ <inkscape:path-effect effect="spiro" id="path-effect5500-0-6-5"/>
+ <inkscape:path-effect effect="spiro" id="path-effect6346-0"/>
+ <inkscape:path-effect effect="spiro" id="path-effect6342-6"/>
+ <inkscape:path-effect effect="spiro" id="path-effect3029-0"/>
+ <inkscape:path-effect effect="spiro" id="path-effect3801-6"/>
+ <inkscape:path-effect effect="spiro" id="path-effect3805-7"/>
+ <inkscape:path-effect effect="spiro" id="path-effect6342-2"/>
+ <inkscape:path-effect effect="spiro" id="path-effect6346-4"/>
+ <inkscape:path-effect effect="spiro" id="path-effect6350-6"/>
+ <inkscape:path-effect effect="spiro" id="path-effect6354-6"/>
+ <inkscape:path-effect effect="spiro" id="path-effect6358-9"/>
+ <inkscape:path-effect effect="spiro" id="path-effect6362-8"/>
+ <inkscape:path-effect effect="spiro" id="path-effect6366-6"/>
+ <inkscape:path-effect effect="spiro" id="path-effect6342-6-9"/>
+ <inkscape:path-effect effect="spiro" id="path-effect6346-0-4"/>
+ <inkscape:path-effect effect="spiro" id="path-effect6397-2"/>
+ <inkscape:path-effect effect="spiro" id="path-effect6401-6"/>
+ <inkscape:path-effect effect="spiro" id="path-effect3029-5"/>
+ <inkscape:path-effect effect="spiro" id="path-effect3801-5"/>
+ <inkscape:path-effect effect="spiro" id="path-effect3805-9"/>
+ <inkscape:path-effect effect="spiro" id="path-effect6342-1"/>
+ <inkscape:path-effect effect="spiro" id="path-effect6346-8"/>
+ <inkscape:path-effect effect="spiro" id="path-effect6350-69"/>
+ <inkscape:path-effect effect="spiro" id="path-effect6354-0"/>
+ <inkscape:path-effect effect="spiro" id="path-effect6358-1"/>
+ <inkscape:path-effect effect="spiro" id="path-effect6362-0"/>
+ <inkscape:path-effect effect="spiro" id="path-effect6366-4"/>
+ <inkscape:path-effect effect="spiro" id="path-effect6342-6-1"/>
+ <inkscape:path-effect effect="spiro" id="path-effect6346-0-9"/>
+ <inkscape:path-effect effect="spiro" id="path-effect6397-1"/>
+ <inkscape:path-effect effect="spiro" id="path-effect6401-1"/>
+ <inkscape:path-effect effect="spiro" id="path-effect3029-5-6"/>
+ <inkscape:path-effect effect="spiro" id="path-effect3801-5-2"/>
+ <inkscape:path-effect effect="spiro" id="path-effect3805-9-2"/>
+ <inkscape:path-effect effect="spiro" id="path-effect6342-1-3"/>
+ <inkscape:path-effect effect="spiro" id="path-effect6346-8-3"/>
+ <inkscape:path-effect effect="spiro" id="path-effect6350-69-2"/>
+ <inkscape:path-effect effect="spiro" id="path-effect6354-0-6"/>
+ <inkscape:path-effect effect="spiro" id="path-effect6358-1-5"/>
+ <inkscape:path-effect effect="spiro" id="path-effect6362-0-8"/>
+ <inkscape:path-effect effect="spiro" id="path-effect6366-4-8"/>
+ <inkscape:path-effect effect="spiro" id="path-effect6342-6-1-1"/>
+ <inkscape:path-effect effect="spiro" id="path-effect6346-0-9-9"/>
+ <inkscape:path-effect effect="spiro" id="path-effect6397-1-9"/>
+ <inkscape:path-effect effect="spiro" id="path-effect6401-1-8"/>
+ <inkscape:path-effect effect="spiro" id="path-effect3029-2"/>
+ <inkscape:path-effect effect="spiro" id="path-effect3801-0"/>
+ <inkscape:path-effect effect="spiro" id="path-effect3805-4"/>
+ <inkscape:path-effect effect="spiro" id="path-effect6342-5"/>
+ <inkscape:path-effect effect="spiro" id="path-effect6346-2"/>
+ <inkscape:path-effect effect="spiro" id="path-effect6350-3"/>
+ <inkscape:path-effect effect="spiro" id="path-effect6354-4"/>
+ <inkscape:path-effect effect="spiro" id="path-effect6358-6"/>
+ <inkscape:path-effect effect="spiro" id="path-effect6362-2"/>
+ <inkscape:path-effect effect="spiro" id="path-effect6366-0"/>
+ <inkscape:path-effect effect="spiro" id="path-effect6342-6-6"/>
+ <inkscape:path-effect effect="spiro" id="path-effect6346-0-7"/>
+ <inkscape:path-effect effect="spiro" id="path-effect6397-0"/>
+ <inkscape:path-effect effect="spiro" id="path-effect6401-60"/>
+ <inkscape:path-effect effect="spiro" id="path-effect3029-6"/>
+ <inkscape:path-effect effect="spiro" id="path-effect3801-1"/>
+ <inkscape:path-effect effect="spiro" id="path-effect3805-41"/>
+ <inkscape:path-effect effect="spiro" id="path-effect6342-7"/>
+ <inkscape:path-effect effect="spiro" id="path-effect6346-40"/>
+ <inkscape:path-effect effect="spiro" id="path-effect6350-2"/>
+ <inkscape:path-effect effect="spiro" id="path-effect6354-43"/>
+ <inkscape:path-effect effect="spiro" id="path-effect6358-4"/>
+ <inkscape:path-effect effect="spiro" id="path-effect6362-4"/>
+ <inkscape:path-effect effect="spiro" id="path-effect6366-64"/>
+ <inkscape:path-effect effect="spiro" id="path-effect6342-6-8"/>
+ <inkscape:path-effect effect="spiro" id="path-effect6346-0-1"/>
+ <inkscape:path-effect effect="spiro" id="path-effect6397-3"/>
+ <inkscape:path-effect effect="spiro" id="path-effect6401-4"/>
+ <inkscape:path-effect effect="spiro" id="path-effect5500-8-4-3"/>
+ <inkscape:path-effect effect="spiro" id="path-effect5500-0-1-5-3"/>
+ <inkscape:path-effect effect="spiro" id="path-effect5500-3-9-9"/>
+ <inkscape:path-effect effect="spiro" id="path-effect5500-0-50-7-3"/>
+ <inkscape:path-effect effect="spiro" id="path-effect5500-3-4"/>
+ <inkscape:path-effect effect="spiro" id="path-effect5500-0-50-4"/>
+ <inkscape:path-effect effect="spiro" id="path-effect5500-8-5"/>
+ <inkscape:path-effect effect="spiro" id="path-effect5500-0-1-8"/>
+ <inkscape:path-effect effect="spiro" id="path-effect5500-7-4"/>
+ <inkscape:path-effect effect="spiro" id="path-effect5500-0-5-4"/>
+ <inkscape:path-effect effect="spiro" id="path-effect5500-5"/>
+ <inkscape:path-effect effect="spiro" id="path-effect5500-0-19"/>
+ </defs>
+ <metadata id="metadata7">
+ <rdf:RDF>
+ <cc:Work rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+ <dc:title>Diaspora* Official Promo Artwork Toolkit</dc:title>
+ <dc:date>2011-08-21</dc:date>
+ <dc:rights>
+ <cc:Agent>
+ <dc:title>Diaspora*</dc:title>
+ </cc:Agent>
+ </dc:rights>
+ <dc:subject>
+ <rdf:Bag>
+ <rdf:li>diaspora</rdf:li>
+ <rdf:li>distributed social network</rdf:li>
+ </rdf:Bag>
+ </dc:subject>
+ <cc:license rdf:resource="http://creativecommons.org/licenses/by-sa/3.0/"/>
+ </cc:Work>
+ <cc:License rdf:about="http://creativecommons.org/licenses/by-sa/3.0/">
+ <cc:permits rdf:resource="http://creativecommons.org/ns#Reproduction"/>
+ <cc:permits rdf:resource="http://creativecommons.org/ns#Distribution"/>
+ <cc:requires rdf:resource="http://creativecommons.org/ns#Notice"/>
+ <cc:requires rdf:resource="http://creativecommons.org/ns#Attribution"/>
+ <cc:permits rdf:resource="http://creativecommons.org/ns#DerivativeWorks"/>
+ <cc:requires rdf:resource="http://creativecommons.org/ns#ShareAlike"/>
+ </cc:License>
+ </rdf:RDF>
+ </metadata>
+ <g transform="translate(-738.72689,-241.26153)" id="layer3" style="display:inline">
+ <g transform="matrix(1.1666667,0,0,1.1666667,-239.69838,-167.06018)" id="g3375-8" style="display:inline">
+ <path d="m 1111.461,1002.209 c -0.3647,-0.9505 0.111,-2.33193 1.0572,-3.06994 0.9462,-0.73801 1.9557,-2.34659 2.2433,-3.57444 0.3992,-1.70508 0.5534,-1.52266 0.6523,0.77125 0.071,1.65229 0.6563,3.32963 1.3001,3.72763 0.8001,0.4945 0.757,1.2218 -0.1367,2.2985 -1.7269,2.0806 -4.2884,2.004 -5.1162,-0.153 z m 37.1072,-1.4711 c -0.4809,-0.77815 -0.5729,-1.71618 -0.2043,-2.0847 0.999,-0.99901 2.0883,0.47042 1.5487,2.0893 -0.3781,1.1343 -0.641,1.1335 -1.3444,-0.011 z m 10.5912,-0.3536 c 0.1082,-2.02729 1.9787,-6.23634 2.0758,-4.67083 0.043,0.69591 1.2001,1.55849 2.571,1.91708 2.793,0.73023 1.8254,2.24522 -2.2134,3.46545 -1.7314,0.5232 -2.4875,0.302 -2.4334,-0.7117 z m -29.7077,-2.10318 c -0.4046,-0.65478 -0.4677,-1.45864 -0.1401,-1.78625 0.7997,-0.79975 2.977,0.60924 2.977,1.92647 0,1.42658 -1.9273,1.33148 -2.8369,-0.14022 z m 9.9477,-1.32123 c 0.3702,-1.38135 0.7153,-3.26518 0.7668,-4.18626 0.063,-1.12682 0.4075,-0.94418 1.0531,0.55828 1.5446,3.5942 1.2591,6.13983 -0.6884,6.13983 -1.3267,0 -1.6263,-0.66526 -1.1315,-2.51185 z m -46.5552,0.65133 c -0.4093,-0.40943 -0.7443,-1.47558 -0.7443,-2.36946 0,-1.31799 0.3165,-1.36247 1.6746,-0.23543 0.9209,0.76435 1.6745,1.83062 1.6745,2.36936 0,1.15608 -1.5447,1.29565 -2.6048,0.23553 z m 27.1645,-2.47665 c 0,-1.15759 0.716,-3.79497 1.5911,-5.8609 1.417,-3.3455 1.6798,-3.51205 2.4024,-1.52352 0.4461,1.22786 1.5577,3.1023 2.4702,4.16522 1.3459,1.5682 1.3934,2.25256 0.2518,3.6282 -2.0686,2.49263 -6.7155,2.20949 -6.7155,-0.409 z m 4.4654,-1.24459 c 0,-0.61398 -0.5023,-1.11635 -1.1163,-1.11635 -0.614,0 -1.1164,0.50237 -1.1164,1.11635 0,0.61398 0.5024,1.11635 1.1164,1.11635 0.614,0 1.1163,-0.50237 1.1163,-1.11635 z m -48.0031,1.05051 c 0,-0.65026 0.4616,-0.89712 1.0256,-0.54846 0.564,0.34865 1.3575,-0.87769 1.7631,-2.72493 1.0202,-4.64459 2.4466,-4.23031 1.8886,0.54846 -0.3416,2.92667 -0.9857,3.90712 -2.5667,3.90712 -1.1608,0 -2.1106,-0.53205 -2.1106,-1.18219 z m 106.6176,0.0756 c -0.4161,-0.67325 -0.2022,-1.89204 0.4752,-2.70831 0.6775,-0.81626 0.9101,-2.427 0.517,-3.57919 -0.554,-1.62368 -0.2896,-1.52513 1.1749,0.43739 2.0333,2.72514 1.9765,5.94672 -0.1173,6.64382 -0.7113,0.23672 -1.6336,-0.12036 -2.0498,-0.79371 z m -35.7262,-1.40554 c -0.2669,-0.76737 -0.051,-3.15357 0.4789,-5.30261 0.6665,-2.70129 0.9992,-3.13198 1.0783,-1.39539 0.079,1.72936 0.8096,2.51174 2.3469,2.51174 2.3346,0 2.6873,0.86538 1.5551,3.81591 -0.8045,2.09659 -4.7658,2.36537 -5.4592,0.37035 z m -53.5557,-1.52254 c -2.2135,-2.2136 -2.1516,-3.42051 0.3377,-6.5852 l 2.0444,-2.59896 1.8665,3.15951 c 2.9297,4.95957 -0.4793,9.79382 -4.2486,6.02465 z m 11.6357,0.0626 c -1.3199,-1.59033 -1.267,-2.04834 0.375,-3.2491 1.0513,-0.76867 1.9546,-2.09583 2.0074,-2.94923 0.053,-0.85319 0.5436,-0.0507 1.0907,1.78344 1.2969,4.34829 -1.0513,7.33314 -3.4731,4.41489 z m 59.2101,-1.06389 c -1.1217,-1.35146 -1.0533,-1.66223 0.3658,-1.66223 2.0841,0 3.4468,1.8208 2.0218,2.7014 -0.5545,0.34272 -1.6288,-0.12489 -2.3876,-1.03917 z m 11.8397,0.74481 c -0.3863,-0.625 -0.1584,-1.47257 0.5064,-1.88351 1.7164,-1.06076 2.8238,0.39227 1.3909,1.825 -0.8017,0.8017 -1.4261,0.82102 -1.8973,0.0583 z m 36.034,0.38384 c -0.3472,-1.38869 -0.3791,-7.25628 -0.04,-7.25628 0.2085,0 1.2953,1.13027 2.4149,2.51184 1.4521,1.79143 1.7042,2.91189 0.8795,3.90713 -1.1632,1.40391 -2.9955,1.87519 -3.255,0.83731 z m -140.959,-1.48076 c -0.8055,-1.30342 0.4992,-5.77552 1.685,-5.77552 0.5423,0 0.9861,0.71243 0.9861,1.58321 0,0.87078 0.3049,2.37777 0.6777,3.34916 0.7095,1.84885 -2.2645,2.59755 -3.3488,0.84315 z m -15.7153,-2.3726 c -1.1042,-1.78647 0.4494,-5.63563 2.2746,-5.63563 0.8796,0 1.5993,-0.50226 1.5993,-1.11635 0,-0.61387 0.5326,-1.11635 1.1837,-1.11635 0.6853,0 1.0378,1.76293 0.8373,4.18637 -0.2734,3.30275 -0.8544,4.2587 -2.7529,4.5291 -1.3235,0.18868 -2.7375,-0.19257 -3.142,-0.84714 z m 3.8739,-2.35242 c 0,-0.65025 -0.5023,-0.87175 -1.1163,-0.49233 -0.614,0.37953 -1.1164,0.91137 -1.1164,1.1822 0,0.27083 0.5024,0.49233 1.1164,0.49233 0.614,0 1.1163,-0.53205 1.1163,-1.1822 z m 142.0929,2.01941 c -1.1787,-1.53226 -1.1467,-7.0771 0.048,-8.27149 0.4137,-0.41375 0.7522,0.0237 0.7522,0.97224 0,0.9484 1.0927,2.44978 2.4283,3.33665 1.5926,1.05741 2.1809,2.25688 1.7096,3.48517 -0.8468,2.20658 -3.4167,2.45506 -4.9378,0.47743 z m -158.3129,-2.00699 c -0.3976,-0.64335 0.5201,-2.41276 2.0395,-3.93206 l 2.7625,-2.76249 0.7195,2.86719 c 0.3959,1.57695 0.4235,3.34636 0.062,3.93217 -0.8829,1.42863 -4.6794,1.35739 -5.583,-0.1047 z m 147.3912,0.0529 c -0.3796,-0.61398 0.093,-1.11635 1.0503,-1.11635 0.9573,0 1.7405,0.50237 1.7405,1.11635 0,0.61398 -0.4728,1.11635 -1.0505,1.11635 -0.5777,0 -1.3609,-0.50237 -1.7403,-1.11635 z m -105.8839,-2.04542 c -2.0378,-2.25192 -2.5033,-6.88539 -0.6917,-6.88539 0.6339,0 1.6068,-1.13028 2.162,-2.51174 0.9781,-2.43337 1.0119,-2.41804 1.0804,0.49233 0.039,1.65207 0.5731,3.31451 1.1871,3.69393 1.6044,0.99168 1.3749,4.53568 -0.3887,5.99929 -1.1438,0.94925 -1.9478,0.75992 -3.3491,-0.78842 z m 2.6214,-2.35414 c 0,-0.57761 -0.5023,-1.36085 -1.1163,-1.74037 -0.614,-0.37943 -1.1164,0.0928 -1.1164,1.05039 0,0.95725 0.5024,1.74048 1.1164,1.74048 0.614,0 1.1163,-0.47268 1.1163,-1.0505 z m 43.2168,1.47386 c -1.5414,-1.54143 -0.7667,-4.5265 1.8006,-6.93839 l 2.5961,-2.43877 1.4213,2.65552 c 2.0487,3.82843 1.1406,6.79601 -2.1994,7.18688 -1.5526,0.18156 -3.1811,-0.0281 -3.6186,-0.46524 z m 42.6419,-1.10221 c -1.2598,-1.51812 -1.1946,-2.01131 0.4215,-3.19319 1.0513,-0.76866 1.914,-2.34701 1.917,-3.50719 0,-1.73854 0.4676,-1.53237 2.6311,1.17162 1.4473,1.80892 2.3884,4.18842 2.0969,5.30272 -0.6622,2.53225 -5.0363,2.67225 -7.0665,0.22604 z m 4.5657,-1.61969 c 0,-0.65026 -0.5024,-0.87176 -1.1163,-0.49233 -0.614,0.37952 -1.1164,0.91158 -1.1164,1.18219 0,0.27083 0.5024,0.49233 1.1164,0.49233 0.6139,0 1.1163,-0.53205 1.1163,-1.18219 z m -141.7764,1.18219 c 0,-0.61398 0.5023,-1.11635 1.1163,-1.11635 0.614,0 1.1164,0.50237 1.1164,1.11635 0,0.61399 -0.5024,1.11635 -1.1164,1.11635 -0.614,0 -1.1163,-0.50236 -1.1163,-1.11635 z m 32.8665,-0.10686 c -0.799,-1.29284 1.5517,-6.59168 2.9243,-6.59168 1.6111,0 2.33,5.9057 0.8344,6.8542 -1.9721,1.25074 -2.8618,1.18856 -3.7587,-0.26252 z m 50.3158,0.12942 c -0.3717,-0.60124 -0.1519,-2.07186 0.4882,-3.2682 0.6402,-1.19612 0.8609,-2.96478 0.4904,-3.93033 -0.3704,-0.96534 -0.1174,-1.75527 0.5622,-1.75527 0.6797,0 1.2358,0.90435 1.2358,2.00937 0,1.10523 0.5691,2.57855 1.2646,3.27414 0.6955,0.69548 0.9624,2.0519 0.5932,3.014 -0.7471,1.94708 -3.5881,2.34939 -4.6344,0.6564 z m 96.7303,-0.36387 c -0.9765,-1.1767 -1.5382,-7.47358 -0.6665,-7.47358 0.079,0 1.7557,0.8045 3.7265,1.78754 2.6263,1.31022 3.4921,2.42841 3.2416,4.18648 -0.4055,2.84421 -4.3972,3.79422 -6.3016,1.49956 z m 25.4957,-1.11031 c 0,-1.41223 -0.5944,-3.1621 -1.321,-3.88867 -0.7265,-0.72656 -1.0676,-1.57435 -0.7579,-1.88404 0.9184,-0.91849 5.591,6.05692 4.855,7.24786 -1.2183,1.97127 -2.7761,1.14367 -2.7761,-1.47515 z m -84.8426,-0.22334 c 0,-0.92108 0.5024,-1.67463 1.1164,-1.67463 0.614,0 1.1163,0.75355 1.1163,1.67463 0,0.92098 -0.5023,1.67442 -1.1163,1.67442 -0.614,0 -1.1164,-0.75344 -1.1164,-1.67442 z m 71.4464,-2.79088 c 0,-2.45603 0.5024,-4.4654 1.1164,-4.4654 0.614,0 1.1163,0.50237 1.1163,1.11635 0,0.61409 0.7693,1.11635 1.7096,1.11635 2.3373,0 3.3101,3.01055 1.6277,5.03783 -0.7579,0.9132 -2.3212,1.66017 -3.4739,1.66017 -1.7012,0 -2.0961,-0.8412 -2.0961,-4.4653 z m -41.9079,2.16028 c -0.4041,-0.65392 -0.3742,-3.04002 0.066,-5.30262 0.7544,-3.87442 0.8683,-3.96768 1.9558,-1.6021 0.6351,1.38146 1.8018,2.51174 2.5927,2.51174 2.2057,0 3.0341,2.1429 1.5293,3.95613 -1.5762,1.89927 -5.0861,2.14883 -6.1442,0.43685 z m -148.2436,-0.67188 c -1.5419,-1.54187 -0.6601,-4.59915 1.4884,-5.161 1.228,-0.32113 2.2327,-1.38448 2.2327,-2.36299 0,-0.9784 0.5561,-1.77902 1.2359,-1.77902 0.7475,0 0.9092,0.77191 0.4092,1.95378 -0.4546,1.07447 -0.7515,3.33502 -0.6599,5.02348 0.125,2.30232 -0.3495,3.06991 -1.8977,3.06991 -1.1355,0 -2.3993,-0.33473 -2.8086,-0.74416 z m 60.2829,0 c -1.4285,-1.42842 -0.7458,-7.13971 0.9302,-7.78295 0.921,-0.35329 1.6822,-1.46781 1.6916,-2.47665 0.011,-1.00884 0.5525,-2.58773 1.2067,-3.50869 0.9078,-1.27806 1.0222,-0.91307 0.4833,1.54099 -0.5338,2.43045 -0.1026,3.85865 1.7678,5.84913 2.4002,2.55481 2.4134,2.70064 0.443,4.87797 -2.0136,2.22504 -5.0902,2.93261 -6.5226,1.5002 z m 3.8369,-4.05177 c -1.4327,-1.43295 -2.8857,-0.32545 -1.825,1.39085 0.411,0.66483 1.2585,0.8928 1.8836,0.50647 0.7624,-0.47128 0.7432,-1.09562 -0.058,-1.89732 z m 10.5185,0.0518 c 1.162,-5.51505 2.4574,-5.99378 2.4574,-0.90834 0,3.20862 -0.4715,4.53632 -1.6109,4.53632 -1.2302,0 -1.4303,-0.85761 -0.8465,-3.62798 z m 34.7134,1.92949 c -2.0763,-2.07618 -2.2914,-3.45387 -0.6937,-4.44133 0.6139,-0.37953 1.1163,-1.73358 1.1163,-3.00904 0,-2.20334 0.1435,-2.17549 2.8772,0.55818 1.8167,1.81658 2.7425,3.82304 2.5118,5.44348 -0.4488,3.15282 -3.3775,3.88295 -5.8116,1.44871 z m -117.9105,-0.53421 c 0,-0.61398 0.5024,-1.11635 1.1164,-1.11635 0.614,0 1.1163,0.50237 1.1163,1.11635 0,0.61409 -0.5023,1.11635 -1.1163,1.11635 -0.614,0 -1.1164,-0.50226 -1.1164,-1.11635 z m 18.5396,-2.03884 c -1.0863,-1.75764 0.7073,-5.77551 2.5781,-5.77551 1.0335,0 2.4312,-0.55203 3.1058,-1.22667 0.8914,-0.8914 1.4328,-0.28843 1.9806,2.20539 0.4146,1.88772 0.4358,3.94685 0.047,4.57573 -0.8433,1.3644 -6.8977,1.53787 -7.7116,0.22106 z m 156.7273,-0.75193 c 0,-1.02331 0.6281,-1.65121 1.3955,-1.39539 1.5804,0.52666 1.4066,2.32198 -0.2791,2.88382 -0.614,0.20466 -1.1164,-0.46502 -1.1164,-1.48843 z m -42.7933,-0.18599 c -1.1687,-1.16881 -0.8696,-5.95395 0.3721,-5.95395 0.614,0 1.1317,-1.13027 1.1503,-2.51172 0.03,-2.24327 0.1556,-2.30292 1.1718,-0.5583 0.6258,1.07459 1.8368,1.95367 2.6911,1.95367 2.5844,0 3.0972,2.17291 1.1972,5.0727 -1.7094,2.60889 -4.979,3.6011 -6.5825,1.9976 z m 4.5819,-3.5127 c 0.2719,-0.81572 -0.2385,-1.06529 -1.3257,-0.64798 -0.9722,0.37305 -1.7678,1.16881 -1.7678,1.76822 0,1.46739 2.5372,0.54846 3.0935,-1.12024 z m 80.9852,2.86148 c -0.4926,-0.76748 -0.954,-2.40023 -1.0252,-3.6282 -0.071,-1.22796 -0.5284,-3.23744 -1.0159,-4.4654 -0.856,-2.15569 -0.8132,-2.16358 1.2384,-0.22778 1.1687,1.10274 3.0656,2.64808 4.2153,3.43413 1.4828,1.0138 1.8665,2.13447 1.3201,3.85596 -0.8479,2.67149 -3.3323,3.21283 -4.7327,1.03129 z m -244.0888,-1.58148 c -1.1957,-1.1958 -0.8557,-5.95391 0.4254,-5.95391 0.6433,0 2.4659,-1.3815 4.0502,-3.0699 2.5893,-2.75981 2.8042,-2.82322 2.1263,-0.62812 -0.4176,1.35217 -0.1377,3.4292 0.6272,4.65382 1.1066,1.77211 1.09,2.5629 -0.084,3.97718 -1.4789,1.78182 -5.7712,2.39516 -7.1455,1.02093 z m 4.5817,-2.8142 c -0.69,-2.06992 -3.0932,-2.41329 -3.0932,-0.44192 0,0.97214 0.7954,1.76758 1.7675,1.76758 0.9722,0 1.5687,-0.5965 1.3257,-1.32566 z m 7.6678,2.78376 c -1.2572,-1.25722 -0.7657,-2.57445 0.9606,-2.57445 0.921,0 1.6746,0.47268 1.6746,1.0505 0,1.40769 -1.7433,2.41589 -2.6352,1.52395 z m 48.4055,-2.10933 c 0,-0.97213 0.5965,-1.56863 1.3257,-1.32554 2.0699,0.68997 2.4133,3.09312 0.4418,3.09312 -0.9721,0 -1.7675,-0.79544 -1.7675,-1.76758 z m 128.3803,0.65123 c 0,-0.61398 0.5023,-1.11635 1.1163,-1.11635 0.614,0 1.1164,0.50237 1.1164,1.11635 0,0.61398 -0.5024,1.11635 -1.1164,1.11635 -0.614,0 -1.1163,-0.50237 -1.1163,-1.11635 z m -162.7857,-2.51174 c 0.2292,-1.6142 1.2544,-2.63938 2.8686,-2.86855 1.3814,-0.19619 2.5549,-0.94973 2.6077,-1.6745 0.053,-0.72483 0.5337,0.14614 1.0688,1.93558 1.248,4.17298 0.5934,5.11921 -3.541,5.11921 -2.8468,0 -3.3063,-0.38406 -3.0041,-2.51174 z m 56.144,1.34649 c -0.3961,-0.64086 -0.049,-1.97386 0.7713,-2.96233 0.8203,-0.98851 1.325,-2.77958 1.1216,-3.98037 -0.2278,-1.34476 0.094,-1.89672 0.8374,-1.43718 0.664,0.41035 1.2071,1.40855 1.2071,2.21801 0,0.8096 0.7237,2.07256 1.6082,2.80663 0.8846,0.73415 1.3331,2.0515 0.9969,2.92757 -0.7065,1.84108 -5.4763,2.15282 -6.5425,0.42767 z m 5.0538,-1.06746 c 0,-0.61398 -0.7536,-1.11635 -1.6745,-1.11635 -0.921,0 -1.6746,0.50237 -1.6746,1.11635 0,0.61399 0.7536,1.11636 1.6746,1.11636 0.9209,0 1.6745,-0.50237 1.6745,-1.11636 z m 38.1598,1.24276 c -1.0709,-0.66202 -1.2112,-1.90985 -0.5164,-4.5913 l 0.9542,-3.68215 2.0221,3.08616 c 1.6966,2.58941 1.7797,3.32839 0.5164,4.59133 -0.8901,0.88989 -2.1068,1.13341 -2.9763,0.59596 z m 51.2548,-0.0615 c -1.1102,-0.6862 -1.1411,-1.10102 -0.1285,-1.72677 0.733,-0.45304 1.8351,-0.32135 2.4491,0.29253 1.4549,1.45486 -0.4162,2.61126 -2.3206,1.43424 z m 27.0479,-0.34499 c -0.7561,-1.19072 -1.3443,-7.53538 -0.6987,-7.53538 0.1218,0 1.5622,1.24255 3.2008,2.76112 1.785,1.65423 2.7171,3.44429 2.3252,4.46544 -0.7899,2.05859 -3.6021,2.23842 -4.8273,0.30882 z m 61.751,0.62089 c -1.2572,-1.25732 -0.7656,-2.57445 0.9606,-2.57445 0.9211,0 1.6745,0.47269 1.6745,1.05051 0,1.40769 -1.7431,2.41577 -2.6351,1.52394 z m -190.4934,-1.4581 c 0,-0.61409 0.7536,-1.11635 1.6745,-1.11635 0.921,0 1.6746,0.50226 1.6746,1.11635 0,0.61399 -0.7536,1.11625 -1.6746,1.11625 -0.9209,0 -1.6745,-0.50226 -1.6745,-1.11625 z m -82.59804,-1.66028 c -1.82005,-2.19318 -0.63829,-5.03789 2.09284,-5.03789 1.19609,0 2.4478,-0.62789 2.7816,-1.39543 0.6135,-1.41059 -0.2429,4.11973 -1.03721,6.69811 -0.57625,1.87055 -2.15547,1.76153 -3.83723,-0.26479 z m 262.66164,-0.60198 c 0.3617,-1.38337 -0.1209,-3.78692 -1.0873,-5.4152 -1.2645,-2.1305 -0.7988,-1.86387 1.7098,0.97929 3.7236,4.21995 3.9179,5.91709 0.7477,6.53162 -1.6019,0.31055 -1.8859,-0.12381 -1.3702,-2.09571 z m -243.0179,-1.73632 c -1.2607,-3.28534 -0.6893,-4.9323 1.7111,-4.9323 1.3138,0 2.9884,-0.82 3.7212,-1.82219 1.1302,-1.54563 1.3376,-1.24897 1.3663,1.95363 0.019,2.07664 -0.4615,4.40372 -1.0669,5.17125 -1.544,1.95712 -4.9223,1.73877 -5.7317,-0.37039 z m 3.7878,-1.64916 c 0,-0.65017 -0.5023,-0.87169 -1.1163,-0.4923 -0.614,0.37955 -1.1164,0.91156 -1.1164,1.18235 0,0.2707 0.5024,0.4923 1.1164,0.4923 0.614,0 1.1163,-0.53202 1.1163,-1.18235 z m 52.4685,2.31333 c -1.3714,-0.87421 -1.4215,-1.42694 -0.2764,-3.05286 0.7688,-1.09197 1.959,-3.24123 2.6448,-4.77631 0.9282,-2.07781 1.3972,-2.36297 1.8356,-1.11636 0.3238,0.92104 1.2686,2.07632 2.0996,2.56722 2.0122,1.189 1.9108,3.57135 -0.2434,5.72571 -2.0032,2.00313 -3.6616,2.18172 -6.0602,0.6526 z m 115.2072,-1.3543 c -1.6221,-1.62226 -1.7778,-5.35852 -0.2232,-5.35852 0.614,0 1.1747,-1.13027 1.2458,-2.51178 0.097,-1.89013 0.2559,-2.0283 0.6401,-0.55812 0.2808,1.07444 1.4784,1.95355 2.6613,1.95355 2.6552,0 2.8887,3.56807 0.3966,6.06022 -2.1054,2.10548 -2.955,2.18016 -4.7206,0.41465 z m 42.3087,-1.17218 c 0.048,-1.3815 -0.2887,-3.7207 -0.7465,-5.19815 -0.5915,-1.90945 -0.4585,-2.4554 0.46,-1.88772 0.7107,0.43921 1.2922,1.35734 1.2922,2.04027 0,0.68294 0.8028,2.12871 1.7839,3.21285 1.932,2.13481 1.2814,4.3446 -1.279,4.3446 -0.9364,0 -1.5608,-1.03832 -1.5106,-2.51185 z m -240.63633,0.35616 c -0.82559,-1.33575 1.27446,-2.65931 2.76141,-1.7404 1.24848,0.77167 0.42887,2.77974 -1.13455,2.77974 -0.54153,0 -1.27361,-0.46767 -1.62686,-1.03934 z m 36.91323,0.11925 c -0.3938,-0.63711 -0.172,-1.49458 0.4929,-1.90555 1.659,-1.02526 2.2463,-0.20979 1.1391,1.58167 -0.5932,0.95974 -1.1685,1.0739 -1.632,0.32388 z m 84.5332,-0.84206 c -0.4288,-1.11728 0.557,-2.88826 2.6947,-4.84072 l 3.3709,-3.07882 1.1151,3.63359 c 0.7728,2.51794 0.7445,4.00423 -0.092,4.84081 -1.8074,1.80733 -6.3176,1.45446 -7.0887,-0.55486 z m 5.2116,-1.58699 c 0,-0.61397 -0.5024,-1.11635 -1.1163,-1.11635 -0.614,0 -1.1164,0.50238 -1.1164,1.11635 0,0.61404 0.5024,1.11636 1.1164,1.11636 0.6139,0 1.1163,-0.50232 1.1163,-1.11636 z m 37.9559,1.67449 c -1.1063,-1.33294 -1.1073,-2.01478 0,-3.34303 0.7616,-0.91767 1.1212,-2.67669 0.799,-3.90875 -0.3222,-1.23216 -0.1303,-1.95864 0.4263,-1.61468 0.5568,0.3442 1.0123,1.18438 1.0123,1.86731 0,0.68293 0.8145,2.14169 1.8099,3.24163 2.006,2.21667 1.3668,5.43217 -1.0799,5.43217 -0.8651,0 -2.1983,-0.75362 -2.9627,-1.67465 z m 2.7908,-1.67449 c -0.3794,-0.61397 -0.9114,-1.11635 -1.1821,-1.11635 -0.2709,0 -0.4924,0.50238 -0.4924,1.11635 0,0.61404 0.5321,1.11636 1.1823,1.11636 0.6502,0 0.8718,-0.50232 0.4922,-1.11636 z m 84.8427,2.23279 c 0.3794,-0.61405 1.1626,-1.11643 1.7403,-1.11643 0.5779,0 1.0506,0.50238 1.0506,1.11643 0,0.61396 -0.7833,1.11635 -1.7404,1.11635 -0.9573,0 -1.4299,-0.50239 -1.0505,-1.11635 z m -102.8065,-1.53844 c -0.3246,-0.84611 -0.1036,-3.23231 0.4925,-5.3026 0.6938,-2.41154 1.1191,-2.94192 1.1836,-1.47581 0.055,1.25866 0.6697,2.85754 1.3653,3.55306 1.429,1.42904 0.5437,4.76379 -1.2645,4.76379 -0.6527,0 -1.4522,-0.69232 -1.7769,-1.53844 z m 77.816,0.52444 c -1.2196,-0.77246 -2.8774,-10.1496 -1.7944,-10.1496 0.1485,0 2.1567,1.72821 4.4627,3.84034 2.7106,2.48284 3.9564,4.45594 3.5244,5.58184 -0.7326,1.90874 -3.7648,2.265 -6.1927,0.72742 z m 3.2216,-2.33514 c 0,-0.61396 -0.5024,-1.11635 -1.1163,-1.11635 -0.614,0 -1.1164,0.50239 -1.1164,1.11635 0,0.61405 0.5024,1.11635 1.1164,1.11635 0.6139,0 1.1163,-0.5023 1.1163,-1.11635 z m 33.4906,2.23271 c 0,-0.61397 0.5023,-1.11636 1.1163,-1.11636 0.614,0 1.1164,0.50239 1.1164,1.11636 0,0.61403 -0.5024,1.11643 -1.1164,1.11643 -0.614,0 -1.1163,-0.5024 -1.1163,-1.11643 z m -156.2891,-1.67328 c 0,-0.92094 0.7536,-1.67448 1.6746,-1.67448 0.9209,0 1.6745,0.75354 1.6745,1.67448 0,0.92103 -0.7536,1.67457 -1.6745,1.67457 -0.921,0 -1.6746,-0.75354 -1.6746,-1.67457 z m 189.7914,0.0149 c -0.7579,-0.91313 -1.1099,-2.35906 -0.7822,-3.213 0.3277,-0.85401 0.032,-2.11628 -0.6565,-2.80508 -0.9256,-0.92564 -0.7572,-1.25233 0.6454,-1.25233 1.0438,0 1.8978,0.50239 1.8978,1.11637 0,0.61396 0.7693,1.11635 1.7096,1.11635 2.3374,0 3.3101,3.01055 1.6277,5.03776 -0.7579,0.91314 -1.7574,1.66034 -2.221,1.66034 -0.4636,0 -1.4629,-0.7472 -2.2208,-1.66034 z m -233.9919,-0.74165 c -0.437,-0.70718 0.036,-1.89281 1.0506,-2.63493 1.0147,-0.74196 1.845,-1.92166 1.845,-2.6214 0,-0.69989 0.5024,-1.27243 1.1164,-1.27243 0.614,0 1.1163,0.71164 1.1163,1.58153 0,0.86981 0.5928,1.77902 1.3172,2.02048 0.7354,0.24514 0.9974,1.27243 0.5932,2.32576 -0.8224,2.14326 -5.8217,2.5701 -7.0387,0.60099 z m 126.8105,-0.45469 c 0,-0.95723 0.5023,-1.42992 1.1163,-1.05044 0.614,0.37939 1.1164,1.16265 1.1164,1.7404 0,0.57777 -0.5024,1.05044 -1.1164,1.05044 -0.614,0 -1.1163,-0.78318 -1.1163,-1.7404 z m -201.98792,-0.96434 c -1.61948,-1.95138 -0.68625,-3.99336 1.82497,-3.99336 0.97056,0 2.44084,-0.87912 3.26727,-1.95365 1.26219,-1.64101 1.26738,-1.24911 0.0325,2.44899 -1.65352,4.95176 -3.09923,5.93855 -5.12474,3.49802 z m 63.18842,0.84416 c -1.4159,-1.41592 -0.7341,-3.9753 1.7453,-6.55127 l 2.4896,-2.58677 1.2622,2.98759 c 0.7869,1.86222 0.8856,3.72328 0.2621,4.94112 -0.9922,1.93784 -4.3298,2.63876 -5.7592,1.20933 z m 160.8474,-0.49082 c -2.2505,-1.27704 -2.4288,-2.95169 -0.7768,-7.29683 l 1.1769,-3.0954 1.5703,2.7437 c 2.9629,5.17742 3.0759,5.71101 1.5312,7.23239 -1.1026,1.08609 -2.11,1.20581 -3.5016,0.41614 z m -192.8495,-0.99766 c 0,-0.61396 0.5024,-1.11635 1.1164,-1.11635 0.614,0 1.1163,0.50239 1.1163,1.11635 0,0.61397 -0.5023,1.11636 -1.1163,1.11636 -0.614,0 -1.1164,-0.50239 -1.1164,-1.11636 z m 163.2661,-0.0952 c -1.3814,-0.52209 -2.5117,-1.71897 -2.5117,-2.65979 0,-2.05396 1.8425,-2.28212 2.545,-0.31503 0.2899,0.81171 0.9125,0.98123 1.4885,0.40534 0.5759,-0.57588 0.4063,-1.19861 -0.4054,-1.48846 -0.7675,-0.27407 -1.3954,-1.95873 -1.3954,-3.74347 0,-3.13809 0.073,-3.18203 2.2327,-1.3334 1.3743,1.17671 2.2327,3.29322 2.2327,5.50497 0,4.22958 -0.7892,4.91384 -4.1864,3.62984 z m 103.2625,0.01 c -1.1103,-0.64657 -1.9537,-2.46158 -1.9537,-4.20424 0,-2.58559 0.4636,-3.05818 2.9576,-3.01448 3.3644,0.0587 5.1794,3.35719 3.561,6.47089 -1.159,2.23012 -1.8312,2.34022 -4.5649,0.74783 z m -176.3833,-2.20604 c -2.3962,-1.42818 -2.5095,-3.66777 -0.2791,-5.51881 0.9209,-0.76434 1.6745,-2.83525 1.6745,-4.60209 0,-1.76676 0.5568,-3.21229 1.2373,-3.21229 0.7473,0 0.9722,1.05684 0.5676,2.66862 -0.515,2.05192 -0.011,3.10009 2.1802,4.53593 5.7488,3.76683 0.5645,9.67208 -5.3805,6.12864 z m 4.7444,-2.72782 c -0.7643,-0.92102 -1.8306,-1.67456 -2.3693,-1.67456 -0.5389,0 -0.9797,0.75354 -0.9797,1.67456 0,0.96248 1.0075,1.67449 2.3694,1.67449 1.9795,0 2.1407,-0.27547 0.9796,-1.67449 z m 144.0685,2.3041 c -0.9877,-1.19002 -1.0128,-2.19698 -0.097,-3.90728 0.8816,-1.64736 0.8925,-2.94041 0.038,-4.53671 -0.6573,-1.22801 -0.7866,-2.23271 -0.2875,-2.23271 0.4992,0 1.7678,1.0047 2.8193,2.23271 1.0515,1.22801 2.6163,2.23263 3.4777,2.23263 2.8361,0 3.2408,3.73954 0.6331,5.85112 -2.9422,2.38245 -4.8198,2.48519 -6.5834,0.36024 z m 5.3625,-1.62343 c 1.0559,-0.66902 1.1404,-1.19111 0.2791,-1.72336 -1.416,-0.87513 -3.4682,0.1111 -3.4682,1.66674 0,1.29799 1.1963,1.31927 3.1891,0.0562 z m -280.04388,0.99382 c 0,-0.61397 0.50236,-1.11635 1.11636,-1.11635 0.61399,0 1.11635,0.50238 1.11635,1.11635 0,0.61404 -0.50236,1.11636 -1.11635,1.11636 -0.614,0 -1.11636,-0.50232 -1.11636,-1.11636 z m 24.04921,0.0774 c -0.82559,-1.33584 1.27444,-2.65932 2.76139,-1.74041 1.24848,0.77161 0.42887,2.77959 -1.13455,2.77959 -0.54152,0 -1.27359,-0.4676 -1.62684,-1.03918 z m 34.00097,-0.5694 c 0,-0.9573 0.5024,-1.7404 1.1163,-1.7404 0.614,0 1.1164,0.47275 1.1164,1.05043 0,0.57777 -0.5024,1.36094 -1.1164,1.74041 -0.6139,0.37955 -1.1163,-0.0932 -1.1163,-1.05044 z m -70.05094,-0.30955 c -2.37962,-0.85364 -1.66683,-4.6616 0.83727,-4.47292 1.30653,0.0983 2.23269,0.9684 2.23269,2.09735 0,2.23934 -1.09261,3.08484 -3.06996,2.37557 z m 25.39697,-0.3145 c 0,-0.61397 0.50235,-1.11635 1.11634,-1.11635 0.61399,0 1.11635,0.50238 1.11635,1.11635 0,0.61405 -0.50236,1.11627 -1.11635,1.11627 -0.61399,0 -1.11634,-0.50222 -1.11634,-1.11627 z m 276.36117,0.25068 c -0.3425,-0.34256 -0.6227,-1.69458 -0.6227,-3.00445 0,-1.30973 -0.6029,-2.98429 -1.3397,-3.7211 -0.9649,-0.96489 -0.9834,-1.33959 -0.066,-1.33959 0.7006,0 1.5843,0.50238 1.9638,1.11635 0.3794,0.61397 1.6353,1.11636 2.7908,1.11636 2.5298,0 3.5849,1.43536 2.7173,3.69646 -0.6711,1.74877 -4.3767,3.20276 -5.4435,2.13597 z m 3.8427,-3.73149 c 0,-0.61397 -0.5024,-0.80592 -1.1164,-0.42646 -0.6141,0.37948 -1.1163,1.19236 -1.1163,1.80633 0,0.61396 0.5022,0.80584 1.1163,0.42637 0.614,-0.37946 1.1164,-1.19228 1.1164,-1.80624 z m -183.732,1.96818 c -0.6802,-1.77269 1.2669,-6.30183 2.7091,-6.30183 2.1006,0 4.8461,3.12918 4.4723,5.09735 -0.5148,2.71023 -6.2353,3.66973 -7.1814,1.20448 z m 41.4968,-0.30541 c -0.4339,-1.13051 -0.014,-2.65322 1.0163,-3.68286 1.5529,-1.55259 1.88,-1.56189 2.8305,-0.0807 0.5909,0.92097 0.9438,2.42225 0.7839,3.33625 -0.4183,2.39346 -3.758,2.70177 -4.6307,0.42755 z m -117.2262,-1.04232 c -2.437,-2.43701 -2.2648,-3.17148 1.7345,-7.39699 2.0499,-2.16592 3.211,-2.86379 2.8035,-1.68496 -0.3826,1.10666 0.064,3.17071 0.9915,4.58684 1.3519,2.06334 1.4048,2.7935 0.2665,3.67497 -3.064,2.37274 -4.0971,2.51888 -5.796,0.82014 z m 3.8172,-3.34552 c 0,-0.27071 -0.5023,-0.49223 -1.1163,-0.49223 -0.614,0 -1.1164,0.53195 -1.1164,1.18219 0,0.65025 0.5024,0.87176 1.1164,0.4923 0.614,-0.37947 1.1163,-0.91149 1.1163,-1.18226 z m 10.6053,3.97311 c -0.3794,-0.61398 0.093,-1.11637 1.0505,-1.11637 0.9572,0 1.7404,0.50239 1.7404,1.11637 0,0.61396 -0.4727,1.11635 -1.0504,1.11635 -0.5778,0 -1.361,-0.50239 -1.7405,-1.11635 z m 39.682,-0.49606 c -2.0266,-2.44179 -0.5818,-5.31614 2.4553,-4.88491 1.8407,0.26147 2.5167,1.10291 2.5167,3.13301 0,3.25718 -2.8804,4.27211 -4.972,1.7519 z m -87.16688,-2.92783 c -1.55788,-2.91087 1.41645,-8.08712 4.29685,-7.47777 1.03571,0.21909 2.40191,-0.50137 3.036,-1.60115 0.93283,-1.61779 1.19419,-1.05028 1.36934,2.97405 0.17425,4.00368 -0.26221,5.30864 -2.23855,6.69295 -3.30844,2.31731 -4.99067,2.1642 -6.46364,-0.58808 z m 5.41249,-3.20441 c 0.27909,-0.83727 -0.13955,-1.25592 -0.9768,-0.97684 -0.80588,0.26857 -1.68501,1.14778 -1.95363,1.95362 -0.27909,0.83721 0.13955,1.25593 0.97681,0.97678 0.80587,-0.26859 1.68499,-1.1477 1.95362,-1.95356 z m 11.0007,4.76771 c -1.56146,-1.5615 -0.63161,-4.55088 2.2254,-7.15468 2.01084,-1.83251 2.75988,-2.11956 2.31993,-0.88881 -0.35733,0.99969 -0.14006,2.32723 0.48283,2.95011 0.76582,0.76582 0.72484,1.89429 -0.12651,3.48511 -1.24454,2.32544 -3.45818,3.0517 -4.90165,1.60827 z m 81.86569,-0.37213 c 0,-0.61396 0.7831,-1.11626 1.7404,-1.11626 0.9572,0 1.4299,0.5023 1.0504,1.11626 -0.3794,0.61397 -1.1627,1.11635 -1.7404,1.11635 -0.5777,0 -1.0504,-0.50238 -1.0504,-1.11635 z m 70.8423,-0.0743 c -0.4047,-0.65478 -0.456,-1.4704 -0.114,-1.81242 0.9182,-0.91828 4.0671,0.51522 4.0671,1.85168 0,1.51512 -3.0109,1.48533 -3.9531,-0.0391 z m 17.3493,0.0743 c 0,-0.61396 0.7535,-1.11626 1.6745,-1.11626 0.921,0 1.6745,0.5023 1.6745,1.11626 0,0.61397 -0.7535,1.11635 -1.6745,1.11635 -0.921,0 -1.6745,-0.50238 -1.6745,-1.11635 z m -127.5429,-1.54993 c -2.4346,-1.85307 -2.6437,-7.38081 -0.2792,-7.38081 0.921,0 1.6745,-0.50237 1.6745,-1.11634 0,-0.61405 0.4867,-1.11635 1.0814,-1.11635 0.5947,0 0.823,0.67301 0.5074,1.49567 -0.3157,0.82258 0.2024,2.14004 1.1513,2.92759 1.5189,1.26054 2.4953,5.62391 1.2585,5.62391 -0.2568,0 -1.1359,0.23692 -1.9537,0.5267 -0.8176,0.28969 -2.3658,-0.14239 -3.4402,-0.96037 z m 4.7444,-2.318 c 0,-1.42874 -3.158,-3.94644 -4.9502,-3.94644 -0.8834,0 -0.7919,3.93298 0.1127,4.83744 1.3884,1.38838 4.8375,0.75307 4.8375,-0.891 z m 259.2165,2.52835 c -2.4182,-2.41818 -1.5619,-4.416 1.7303,-4.03715 3.7205,0.4281 5.2818,5.37673 1.6964,5.37673 -1.1479,0 -2.69,-0.60278 -3.4267,-1.33958 z m -60.8877,-1.43405 c -2.2368,-2.23685 -0.033,-7.65549 2.3213,-5.71031 4.5641,3.76918 4.8498,4.23771 3.5438,5.81134 -1.6704,2.01274 -3.7878,1.97615 -5.8651,-0.10115 z m 3.1724,-1.6917 c -0.3796,-0.61396 -0.9115,-1.11634 -1.1822,-1.11634 -0.2709,0 -0.4924,0.50238 -0.4924,1.11634 0,0.61397 0.5321,1.11636 1.1822,1.11636 0.6503,0 0.8718,-0.50239 0.4924,-1.11636 z m 70.0268,-0.34553 c -0.5637,-0.73094 -1.3296,-2.18609 -1.7023,-3.23348 -0.5496,-1.545 -0.056,-1.86106 2.6154,-1.67448 2.5496,0.17795 3.2934,0.76995 3.2951,2.62225 0,2.76769 -2.7035,4.23755 -4.2082,2.28571 z m -120.8207,-1.32903 c 0,-1.0233 0.6279,-1.65127 1.3954,-1.39542 1.5804,0.52679 1.4067,2.32201 -0.2791,2.88389 -0.614,0.20471 -1.1163,-0.46517 -1.1163,-1.48847 z m 31.0697,-1.08327 c -0.9539,-2.09368 -0.9251,-3.15725 0.12,-4.41655 0.7571,-0.91226 1.0526,-2.18305 0.6564,-2.82391 -1.3738,-2.22285 0.6486,-1.15013 3.3722,1.78865 3.0514,3.29252 3.3768,4.89125 1.3979,6.87006 -2.1085,2.10845 -4.1811,1.57855 -5.5465,-1.41825 z m -171.7298,0.0328 c 0,-0.95716 0.5023,-1.74042 1.1163,-1.74042 0.614,0 1.1164,0.47276 1.1164,1.05044 0,0.57785 -0.5024,1.36094 -1.1164,1.7404 -0.614,0.37955 -1.1163,-0.0932 -1.1163,-1.05042 z m 104.4107,0.0956 c -3.0204,-2.20863 -1.4367,-5.18509 2.7588,-5.18509 3.8473,0 5.4769,2.45977 3.3373,5.03778 -1.7101,2.06051 -3.423,2.10196 -6.0961,0.14731 z m 126.0557,-0.53116 c 0.3853,-1.21426 -0.264,-3.09643 -1.5993,-4.6361 -4.2952,-4.95247 -2.2753,-4.04959 4.2029,1.87856 2.9386,2.68919 2.4941,4.80178 -1.0104,4.80178 -1.665,0 -2.0751,-0.52607 -1.5932,-2.04424 z m -278.46949,-0.18857 c 0,-0.61397 0.50237,-1.11636 1.11639,-1.11636 0.614,0 1.1163,0.50239 1.1163,1.11636 0,0.61404 -0.5023,1.11635 -1.1163,1.11635 -0.61402,0 -1.11639,-0.50231 -1.11639,-1.11635 z m 57.20019,0.37274 c -0.7746,-0.31206 -1.9398,-1.56033 -2.5893,-2.7741 -1.4137,-2.64158 0.3787,-5.4131 3.5008,-5.4131 1.1113,0 2.3396,-1.0047 2.7294,-2.2327 0.3897,-1.22801 1.1771,-2.23271 1.7498,-2.23271 1.3005,0 1.3049,1.20377 0.012,3.24623 -0.6001,0.94785 -0.5282,2.59653 0.1811,4.15334 1.8443,4.04779 -1.2799,6.98703 -5.5838,5.25304 z m 3.6458,-2.61334 c 0.3821,-0.61835 -0.1123,-1.43389 -1.0987,-1.81234 -2.1374,-0.82024 -3.3286,0.0834 -2.3012,1.74603 0.927,1.49988 2.495,1.53045 3.3999,0.0665 z m -114.12028,0.9842 c -1.70686,-1.70686 -0.5265,-4.32943 1.94861,-4.32943 1.11113,0 2.2445,-0.62796 2.5186,-1.3955 0.27411,-0.76738 0.8205,-1.10016 1.21422,-0.73938 0.83703,0.76714 -2.42105,7.71664 -3.61772,7.71664 -0.44623,0 -1.37489,-0.56353 -2.06371,-1.25233 z m 125.43498,-0.16999 c -1.9934,-1.45759 -1.984,-1.64868 0.2873,-5.88632 1.2911,-2.40902 2.3474,-3.6199 2.3474,-2.69097 0,0.92899 1.0372,2.57697 2.3048,3.66243 4.5265,3.87568 -0.085,8.46449 -4.9395,4.91486 z m 3.7511,-1.92674 c 0,-0.61396 -0.532,-1.11634 -1.1822,-1.11634 -0.6503,0 -0.8718,0.50238 -0.4923,1.11634 0.3795,0.61397 0.9114,1.11636 1.1822,1.11636 0.2708,0 0.4923,-0.50239 0.4923,-1.11636 z m 129.5586,1.74924 c -1.0418,-1.25521 -0.9304,-2.20627 0.5169,-4.4152 1.5676,-2.39221 2.1628,-2.61686 3.9605,-1.49418 2.5537,1.59482 3.4267,3.58245 2.5624,5.83463 -0.8166,2.12801 -5.2963,2.17547 -7.0398,0.0743 z m -251.70631,-0.48331 c -0.48089,-0.77809 -0.57286,-1.71618 -0.20439,-2.08461 0.99911,-0.99915 2.08844,0.47025 1.54882,2.08915 -0.37813,1.1344 -0.64109,1.13347 -1.34443,-0.01 z m 307.46181,-0.21574 c 0,-0.65017 0.5892,-0.81813 1.3094,-0.37297 0.7201,0.44506 0.4689,-0.39066 -0.5583,-1.85699 -2.0084,-2.86755 -2.3695,-4.40747 -1.0302,-4.39355 0.8546,0.01 3.6282,5.29284 3.6282,6.91196 0,0.4916 -0.7536,0.89382 -1.6745,0.89382 -0.9211,0 -1.6746,-0.53202 -1.6746,-1.18227 z m 32.3462,-1.68215 c -1.452,-3.81899 -0.9932,-4.25108 2.7181,-2.5601 3.2723,1.49097 3.4939,4.61226 0.3702,5.21379 -1.2679,0.24419 -2.3353,-0.673 -3.0883,-2.65369 z m -330.69071,0.54234 c -1.07448,-0.62593 -1.9536,-1.78864 -1.9536,-2.58394 0,-2.20698 3.68823,-5.06092 6.28734,-4.86512 3.10411,0.23387 3.41358,5.93135 0.4095,7.53906 -2.48707,1.33108 -2.29712,1.33467 -4.74324,-0.0897 z m 3.62813,-2.76738 c 0,-0.27077 -0.50234,-0.4923 -1.11634,-0.4923 -0.61399,0 -1.11636,0.53202 -1.11636,1.18228 0,0.65016 0.50237,0.87167 1.11636,0.49222 0.614,-0.3794 1.11634,-0.91141 1.11634,-1.1822 z m 5.58176,1.74041 c 0,-0.61396 0.22151,-1.11635 0.49229,-1.11635 0.27075,0 0.80275,0.50239 1.18223,1.11635 0.37946,0.61397 0.15794,1.11634 -0.49228,1.11634 -0.65024,0 -1.18224,-0.50237 -1.18224,-1.11634 z m 48.02012,-0.75964 c 0.027,-3.19142 1.7942,-5.22278 3.8558,-4.43155 2.7787,1.06615 1.7539,5.6637 -1.3611,6.10603 -1.8197,0.25843 -2.5071,-0.2029 -2.4947,-1.67448 z m 98.4775,0.56892 c -2.4344,-2.43444 -1.55,-4.27469 2.0545,-4.27469 2.9109,0 3.3731,0.37634 3.0699,2.50035 -0.4084,2.86325 -3.1026,3.79616 -5.1244,1.77434 z m 55.0833,-0.44718 c -2.2232,-2.22324 -2.22,-3.40996 0.012,-4.26625 4.1706,-1.60043 6.0485,-0.77105 6.0485,2.67144 0,2.56354 -0.505,3.34905 -2.153,3.34905 -1.1841,0 -2.9423,-0.78941 -3.9072,-1.75424 z m -195.81776,-1.45907 c -2.2181,-1.40597 -1.14788,-6.17859 1.49311,-6.65862 1.22798,-0.22316 3.06117,-1.13941 4.07373,-2.03621 1.67953,-1.48729 1.82035,-1.22495 1.60515,2.98985 -0.29287,5.73634 -3.32157,8.14561 -7.17199,5.70498 z m 4.284,-3.48479 c 0,-0.61396 -0.47273,-1.11635 -1.05048,-1.11635 -0.57775,0 -1.36095,0.50239 -1.74041,1.11635 -0.37947,0.61396 0.0933,1.11635 1.05046,1.11635 0.95723,0 1.74043,-0.50239 1.74043,-1.11635 z m 263.01976,2.69959 c -0.9518,-2.48057 -0.8785,-2.69959 0.9039,-2.69959 0.8698,0 1.7786,0.59128 2.0195,1.31403 0.5438,1.63116 3.0972,0.19031 3.0972,-1.74769 0,-0.77989 -1.1147,-1.37822 -2.477,-1.3295 -1.4812,0.0532 -2.6314,-0.67206 -2.8608,-1.80344 -0.3679,-1.8128 0.5942,-1.95941 6.7331,-1.02603 1.0058,0.15287 1.108,4.82111 0.1597,7.29222 -0.3935,1.02548 -1.9815,1.76582 -3.7877,1.76582 -1.8063,0 -3.3943,-0.74034 -3.7879,-1.76582 z m -235.2845,-0.0997 c -2.8023,-0.7433 -3.7725,-6.10049 -1.4169,-7.82307 1.0556,-0.77183 2.4166,-1.09602 3.0244,-0.72038 0.6078,0.37563 2.0876,-0.51967 3.2885,-1.98936 1.8238,-2.23217 2.0498,-2.30464 1.3725,-0.43968 -0.4461,1.22793 -0.7315,3.67324 -0.6344,5.43397 0.097,1.76065 -0.3998,3.89562 -1.1042,4.74448 -1.3228,1.59387 -1.4383,1.61412 -4.5299,0.79404 z m 3.5225,-3.65034 c 0,-1.31714 -2.1772,-2.72616 -2.9769,-1.9265 -0.7997,0.79976 0.6093,2.97695 1.9265,2.97695 0.5777,0 1.0504,-0.47275 1.0504,-1.05045 z m 120.1937,2.53891 c -3,-3.00001 3.5936,-9.08618 8.2446,-7.61 1.7154,0.54447 2.027,1.32865 1.4643,3.68568 -0.3931,1.64673 -0.9261,3.37087 -1.1844,3.83136 -0.5815,1.03652 -7.5053,1.11212 -8.5245,0.0928 z m 178.4776,-0.2951 c -1.2015,-1.94401 1.8328,-2.58237 3.6477,-0.76745 1.6646,1.66463 1.6175,1.80663 -0.5994,1.80663 -1.3233,0 -2.6951,-0.46767 -3.0483,-1.03918 z m -315.98087,-1.20349 c -1.0064,-1.62844 0.47336,-5.57174 2.09084,-5.57174 2.54683,0 4.03333,2.42051 2.84743,4.6364 -1.19851,2.23935 -3.82492,2.73682 -4.93827,0.93534 z m 105.27717,-1.71054 c -1.1848,-2.60027 -1.08,-3.19571 0.8048,-4.57402 3.4826,-2.54641 5.5592,-1.44045 5.5592,2.96084 0,3.1811 -0.4568,3.95677 -2.5011,4.24725 -1.8154,0.25788 -2.8742,-0.46415 -3.8629,-2.63407 z m 219.1041,0.74542 c -0.6554,-1.22497 -1.1918,-3.27446 -1.1918,-4.55447 0,-1.96881 0.473,-2.21675 3.0699,-1.60936 4.5743,1.06998 6.6569,3.39199 5.1698,5.76441 -1.7725,2.82776 -5.6312,3.0463 -7.0479,0.39942 z m 3.948,-3.1879 c -1.1348,-1.13481 -2.0711,0.57369 -1.1399,2.08022 0.7032,1.13802 0.9662,1.13879 1.3443,0.01 0.2586,-0.77567 0.1665,-1.71374 -0.2044,-2.08477 z m -378.86119,2.83736 c 0.68997,-2.06991 3.09321,-2.41325 3.09321,-0.44187 0,0.97217 -0.7954,1.76755 -1.76756,1.76755 -0.97215,0 -1.5687,-0.59654 -1.32565,-1.32568 z m -8.07028,-0.90704 c 0,-0.61396 0.50236,-1.11635 1.11634,-1.11635 0.614,0 1.11634,0.50239 1.11634,1.11635 0,0.61397 -0.50234,1.11635 -1.11634,1.11635 -0.61398,0 -1.11634,-0.50238 -1.11634,-1.11635 z m 347.73677,-0.01 c -1.054,-1.70546 0.5078,-5.57167 2.2509,-5.57167 1.8298,0 5.1657,4.4292 4.3409,5.76362 -0.8105,1.3116 -5.7514,1.16781 -6.5918,-0.19187 z m -234.1482,-1.23125 c -1.0745,-0.60631 -1.9536,-1.83096 -1.9536,-2.72141 0,-2.18102 4.3618,-2.07163 5.2069,0.13051 0.9405,2.45109 -0.9014,3.91789 -3.2533,2.5909 z m -15.9018,-1.407 c -2.3125,-1.69098 -1.6157,-5.16608 1.0359,-5.16608 2.5035,0 4.2897,3.93619 2.4711,5.44554 -1.0681,0.88638 -2.0159,0.81086 -3.507,-0.27946 z m 41.4718,-0.50949 c -2.514,-2.7781 -2.3272,-4.08556 0.8848,-6.19018 3.5579,-2.33117 6.1984,-1.24654 6.1984,2.54609 0,5.3522 -3.7782,7.29597 -7.0832,3.64409 z m 4.8505,-3.54024 c 0,-2.44719 -0.1459,-2.53508 -2.6291,-1.58215 -2.0146,0.7731 -1.1583,3.81477 1.0741,3.81477 0.8552,0 1.555,-1.00461 1.555,-2.23262 z m 114.9841,4.46533 c 0,-0.61397 0.7535,-1.11636 1.6746,-1.11636 0.9209,0 1.6745,0.50239 1.6745,1.11636 0,0.61397 -0.7536,1.11635 -1.6745,1.11635 -0.9211,0 -1.6746,-0.50238 -1.6746,-1.11635 z m 36.2575,-1.14262 c -1.5673,-1.73189 -1.738,-2.56566 -0.7312,-3.57247 0.7222,-0.72225 1.3132,-2.14769 1.3132,-3.16779 0,-1.41313 0.7309,-1.723 3.0699,-1.30147 5.9772,1.07705 7.7164,4.92646 3.8194,8.45317 -2.7136,2.45579 -4.9899,2.33037 -7.4713,-0.41144 z m 5.8845,-3.97405 c -1.0637,-1.06389 -3.1966,0.65923 -2.4038,1.94206 0.4712,0.76244 1.0957,0.74321 1.8974,-0.0579 0.6572,-0.65729 0.8852,-1.50489 0.5064,-1.88357 z m -312.70425,3.69184 c -2.32501,-1.70021 -1.31081,-5.74237 1.19911,-4.77919 0.89196,0.34225 2.45981,0.62992 3.48408,0.63939 1.60752,0.014 1.63321,0.16192 0.18779,1.0756 -0.92099,0.58222 -1.54894,1.32803 -1.39545,1.65745 1.31092,2.81304 -0.53204,3.55899 -3.47553,1.40675 z m 2.0801,-1.92416 c -0.37947,-0.61396 -1.1923,-1.11634 -1.80629,-1.11634 -0.614,0 -0.80589,0.50238 -0.42641,1.11634 0.37946,0.61398 1.1923,1.11628 1.80628,1.11628 0.61399,0 0.80589,-0.5023 0.42642,-1.11628 z m 294.29775,2.37221 c 0.2302,-0.69076 0.7954,-1.25593 1.2559,-1.25593 1.3073,0 0.9821,1.62625 -0.4187,2.09322 -0.6907,0.23026 -1.0675,-0.14654 -0.8372,-0.83729 z m 41.7121,-0.15826 c -0.3859,-0.62422 -0.5473,-2.31269 -0.3586,-3.75207 0.1885,-1.43927 -0.3405,-3.44029 -1.1756,-4.44666 -0.9004,-1.08492 -1.0353,-1.8297 -0.3314,-1.8297 0.6529,0 1.4988,0.50418 1.8796,1.12041 0.3808,0.61624 1.9241,0.81133 3.4295,0.4335 5.9401,-1.49089 8.1479,4.54402 2.8147,7.6944 -3.7178,2.19617 -5.264,2.38884 -6.2582,0.78012 z m 7.2678,-2.68083 c 0,-1.96958 -1.58,-3.75065 -2.8833,-3.25045 -2.3875,0.91618 -1.8973,3.71733 0.6506,3.71733 1.228,0 2.2327,-0.2101 2.2327,-0.46688 z m -320.39248,1.58316 c 0,-0.61396 0.50236,-1.11628 1.11635,-1.11628 0.614,0 1.11635,0.50232 1.11635,1.11628 0,0.61397 -0.50235,1.11635 -1.11635,1.11635 -0.61399,0 -1.11635,-0.50238 -1.11635,-1.11635 z m 211.82738,-0.0897 c -1.0744,-0.62577 -1.9536,-2.3991 -1.9536,-3.94066 0,-2.55518 0.369,-2.77215 4.1771,-2.45633 4.7918,0.39752 6.3779,3.65416 2.9872,6.13355 -2.3725,1.73479 -2.6596,1.74933 -5.2107,0.26344 z m 3.6281,-3.2596 c 0,-0.61397 -0.7831,-1.11637 -1.7403,-1.11637 -0.9573,0 -1.43,0.5024 -1.0505,1.11637 0.3795,0.61403 1.1626,1.11635 1.7403,1.11635 0.5779,0 1.0505,-0.50232 1.0505,-1.11635 z m 141.3377,2.69951 c -0.3726,-0.97115 -0.6776,-2.22708 -0.6776,-2.79084 0,-1.27657 3.403,-1.31059 5.3852,-0.0532 1.1938,0.75682 1.1248,1.29017 -0.3589,2.77379 -2.3039,2.30402 -3.4843,2.32326 -4.3487,0.0712 z m -342.28062,-0.46685 c 0,-0.61396 0.50235,-1.11635 1.11634,-1.11635 0.614,0 1.11635,0.50239 1.11635,1.11635 0,0.61404 -0.50235,1.11635 -1.11635,1.11635 -0.61399,0 -1.11634,-0.50231 -1.11634,-1.11635 z m 241.52982,-0.57245 c -0.7667,-1.99789 1.4459,-5.00931 3.6807,-5.00931 2.2225,0 3.1292,3.06381 1.491,5.03778 -1.7771,2.14129 -4.3445,2.12729 -5.1717,-0.0282 z m -89.6146,-1.48901 c -0.8851,-1.65393 -0.5067,-2.49191 1.9143,-4.23814 5.4551,-3.93479 9.7868,0.0148 4.8833,4.45199 -2.6846,2.4296 -5.4291,2.34327 -6.7976,-0.21385 z m 5.4901,-2.40395 c 0,-0.61396 -0.7535,-1.11635 -1.6745,-1.11635 -0.921,0 -1.6745,0.50239 -1.6745,1.11635 0,0.61397 0.7535,1.11635 1.6745,1.11635 0.921,0 1.6745,-0.50238 1.6745,-1.11635 z m -184.19773,2.23287 c 0,-0.61397 0.50236,-1.11636 1.11634,-1.11636 0.61402,0 1.11637,0.50239 1.11637,1.11636 0,0.61404 -0.50235,1.11635 -1.11637,1.11635 -0.61398,0 -1.11634,-0.50231 -1.11634,-1.11635 z m 245.15823,-0.64955 c -1.0244,-2.66956 -0.8642,-3.16228 1.511,-4.64559 2.6825,-1.67535 5.6259,-0.71147 5.6259,1.84224 0,4.07249 -5.7789,6.34249 -7.1369,2.80335 z m 2.8761,-2.94146 c -0.801,-0.80101 -1.321,-0.86693 -1.321,-0.16743 0,1.49008 1.3202,2.81027 2.0652,2.06526 0.3172,-0.31715 -0.017,-1.17117 -0.7442,-1.89783 z m -235.81862,1.23843 c -1.49029,-2.78462 -0.54327,-4.00708 4.14621,-5.35198 3.21206,-0.92126 3.34804,-0.82689 2.84485,1.97303 -1.04831,5.83356 -4.72611,7.61103 -6.99106,3.37895 z m 34.67099,1.23622 c 0,-0.61397 0.50236,-1.11635 1.11636,-1.11635 0.61398,0 1.11634,0.50238 1.11634,1.11635 0,0.61404 -0.50236,1.11636 -1.11634,1.11636 -0.614,0 -1.11636,-0.50232 -1.11636,-1.11636 z m -17.63831,-1.33959 c -1.59877,-1.59882 -1.78713,-5.35855 -0.26847,-5.35855 0.58915,0 2.22181,-1.24131 3.62813,-2.75839 l 2.55698,-2.75847 -0.0871,4.78725 c -0.12771,7.01107 -2.46525,9.45239 -5.82946,6.08816 z m 50.06394,-0.2729 c -2.0265,-2.44182 -0.5818,-5.31616 2.4553,-4.88485 1.8408,0.26139 2.5168,1.1029 2.5168,3.13293 0,3.2572 -2.8804,4.27222 -4.9721,1.75192 z m 268.3848,0.42186 c -0.4047,-0.65487 -0.4679,-1.45871 -0.1402,-1.78634 0.7997,-0.79968 2.9769,0.60935 2.9769,1.92646 0,1.4267 -1.9272,1.33145 -2.8367,-0.14012 z m 44.6999,-1.04207 c -0.9104,-1.4731 0.4244,-3.56357 1.7516,-2.74325 1.356,0.83806 1.3471,3.8596 -0.011,3.8596 -0.5777,0 -1.3609,-0.50239 -1.7404,-1.11635 z m -405.79324,-1.05047 c 0,-0.65024 0.50237,-1.18227 1.11636,-1.18227 0.614,0 1.11636,0.22153 1.11636,0.4923 0,0.27079 -0.50236,0.8028 -1.11636,1.18219 -0.61399,0.37947 -1.11636,0.15795 -1.11636,-0.49222 z m 371.60054,-2.01946 c -0.667,-1.68858 -1.6609,-3.94232 -2.2089,-5.00846 -1.5482,-3.01276 -1.2024,-3.3561 1.4849,-1.47393 1.3646,0.95582 3.3126,1.73783 4.3288,1.73783 1.0161,0 2.5208,0.81108 3.3435,1.80248 1.2825,1.54532 1.125,2.10283 -1.1034,3.90719 -3.4779,2.81636 -4.4123,2.66202 -5.8449,-0.96511 z m 4.6094,-1.39551 c 0,-0.61396 -0.7831,-1.11635 -1.7404,-1.11635 -0.9572,0 -1.4299,0.50239 -1.0505,1.11635 0.3794,0.61397 1.1627,1.11635 1.7404,1.11635 0.5778,0 1.0505,-0.50238 1.0505,-1.11635 z m -358.34833,2.85676 c 0,-1.17828 2.14241,-1.67332 2.77963,-0.64228 0.38565,0.62406 -0.082,1.13458 -1.03922,1.13458 -0.95722,0 -1.74041,-0.22153 -1.74041,-0.4923 z m 58.09473,-1.12863 c -2.33924,-2.81852 -0.92792,-5.60217 3.0346,-5.98515 3.1589,-0.30534 3.619,-0.0149 3.619,2.28846 0,4.67597 -3.9976,6.89706 -6.6536,3.69669 z m 4.4209,-2.84448 c 0,-0.61397 -0.4727,-1.11635 -1.0505,-1.11635 -0.5777,0 -1.3609,0.50238 -1.7404,1.11635 -0.3795,0.61396 0.093,1.11635 1.0505,1.11635 0.9572,0 1.7404,-0.50239 1.7404,-1.11635 z m 43.2585,3.25968 c -2.784,-1.62155 -2.5298,-6.19768 0.3867,-6.96029 3.4152,-0.89311 5.4742,0.24983 5.4742,3.03864 0,2.27187 -1.875,5.17178 -3.2933,5.09344 -0.3376,-0.0187 -1.493,-0.54595 -2.5676,-1.17179 z m 2.7909,-3.72478 c 0.1535,-0.56281 -0.3488,-1.2327 -1.1164,-1.48854 -0.7675,-0.25576 -1.3954,0.37219 -1.3954,1.3955 0,1.8903 2.0014,1.9645 2.5118,0.0929 z m -121.73795,2.47457 c -0.7368,-0.73681 -1.33963,-2.39457 -1.33963,-3.68397 0,-3.0735 2.05035,-5.02361 5.28188,-5.02361 1.43147,0 2.8918,-0.75346 3.24521,-1.67449 0.70168,-1.8286 3.75277,-2.32747 3.75277,-0.61365 0,0.58347 -0.85539,1.53952 -1.90089,2.12464 -1.61823,0.90562 -1.67684,1.3338 -0.39405,2.87943 2.38241,2.8706 -0.14625,7.33123 -4.15597,7.33123 -1.73233,0 -3.75253,-0.60286 -4.48932,-1.33958 z m 6.52132,-1.50732 c 1.18382,-1.42646 1.12496,-2.04184 -0.33493,-3.50177 -0.97412,-0.97403 -2.56363,-1.46696 -3.53223,-1.09531 -2.09413,0.80366 -2.35468,4.78576 -0.36564,5.58833 2.28754,0.92306 2.73011,0.81938 4.2328,-0.99125 z m -20.1408,0.14904 c 0,-0.97208 0.7954,-1.76754 1.76754,-1.76754 1.97141,0 1.62809,2.40324 -0.44187,3.09329 -0.72913,0.24294 -1.32567,-0.35359 -1.32567,-1.32575 z m 331.22243,-0.24052 c -1.7579,-1.75792 -0.7145,-3.90524 1.7289,-3.55822 1.3816,0.19609 2.5118,1.10336 2.5118,2.01595 0,1.77364 -2.9401,2.84291 -4.2407,1.54227 z m 61.9146,-2.74244 c -0.5064,-1.36884 -0.7067,-3.60858 -0.445,-4.9771 0.3957,-2.06999 0.9596,-2.35891 3.3539,-1.71851 3.8477,1.029 5.6577,3.94409 4.0458,6.51561 -1.8965,3.02549 -5.8641,3.12823 -6.9547,0.18 z m 17.2013,0.57745 c -3.7581,-3.75809 -0.6113,-6.82939 4.6647,-4.55283 2.789,1.20338 3.1989,2.94081 1.1722,4.96756 -1.8194,1.81938 -3.7393,1.68301 -5.8369,-0.41473 z m 3.8275,-1.59474 c 0,-0.61396 -0.5023,-1.11635 -1.1163,-1.11635 -0.614,0 -1.1164,0.50239 -1.1164,1.11635 0,0.61398 0.5024,1.11636 1.1164,1.11636 0.614,0 1.1163,-0.50238 1.1163,-1.11636 z m 14.6521,2.37228 c 0.2302,-0.69075 0.7954,-1.25592 1.2559,-1.25592 1.3073,0 0.9821,1.62624 -0.4186,2.09313 -0.6908,0.23026 -1.0676,-0.14653 -0.8373,-0.83721 z m -194.9423,-1.25546 c -1.4662,-2.37235 0.5142,-6.64501 3.4177,-7.37376 3.7501,-0.94121 4.3776,-0.0826 3.1307,4.28431 -1.0714,3.75166 -4.9951,5.60287 -6.5484,3.08945 z m 3.9069,-3.34952 c 0,-0.61405 -0.5024,-1.11635 -1.1164,-1.11635 -0.614,0 -1.1163,0.5023 -1.1163,1.11635 0,0.61396 0.5023,1.11635 1.1163,1.11635 0.614,0 1.1164,-0.50239 1.1164,-1.11635 z m 122.7344,1.39542 c -0.8464,-1.6884 -1.7137,-3.42053 -1.9273,-3.84893 -0.5052,-1.01291 7.8382,0.24614 9.0795,1.37016 0.5214,0.47227 0.6132,1.91384 0.2039,3.2037 -1.1068,3.48698 -5.4599,3.05809 -7.3561,-0.72493 z m 5.6458,-0.27907 c 0,-0.61404 -0.5024,-1.11635 -1.1163,-1.11635 -0.614,0 -1.1164,0.50231 -1.1164,1.11635 0,0.61396 0.5024,1.11635 1.1164,1.11635 0.6139,0 1.1163,-0.50239 1.1163,-1.11635 z m -304.01925,1.48848 c -1.61687,-1.61687 -0.59234,-4.52984 2.36116,-6.71353 l 3.10539,-2.29595 -0.12804,3.85847 c -0.14526,4.37792 -3.18175,7.3077 -5.33851,5.15101 z m 93.02925,-1.47379 c -2.1582,-1.3757 -0.1294,-5.03824 2.7908,-5.03824 2.92,0 4.9489,3.66254 2.7908,5.03824 -0.921,0.58716 -2.1768,1.06749 -2.7908,1.06749 -0.6141,0 -1.8699,-0.48033 -2.7908,-1.06749 z m 102.5139,-1.06058 c -3.2389,-2.62265 -2.0322,-5.65213 2.2512,-5.65213 3.69,0 6.107,2.24513 5.1373,4.77199 -1.0037,2.61569 -4.7012,3.05614 -7.3885,0.88014 z m 4.0974,-2.30309 c -0.3795,-0.61411 -1.1626,-1.11635 -1.7405,-1.11635 -0.5777,0 -1.0503,0.50224 -1.0503,1.11635 0,0.61397 0.7831,1.11628 1.7403,1.11628 0.9573,0 1.43,-0.50231 1.0505,-1.11628 z m 49.9567,3.72603 c -1.9313,-0.77934 -1.749,-4.27563 0.3121,-5.98626 2.1127,-1.75338 7.2232,0.19596 7.2232,2.75512 0,2.68261 -4.3122,4.53163 -7.5353,3.23114 z m -311.18255,-2.60975 c -0.37947,-0.61405 0.0932,-1.11628 1.05047,-1.11628 0.95721,0 1.74041,0.50223 1.74041,1.11628 0,0.61397 -0.47271,1.11635 -1.05047,1.11635 -0.57775,0 -1.36094,-0.50238 -1.74041,-1.11635 z m 181.75235,-0.70984 c -0.9351,-2.43678 1.0108,-5.34843 3.8589,-5.77418 2.8088,-0.41997 4.445,3.57464 2.4492,5.97944 -1.8054,2.17547 -5.4399,2.05716 -6.3081,-0.20526 z m 4.9804,-2.4299 c 0.243,-0.72914 -0.3535,-1.32558 -1.3256,-1.32558 -0.9722,0 -1.7676,0.79528 -1.7676,1.76753 0,1.9713 2.4032,1.62804 3.0932,-0.44195 z m 98.4947,1.12136 c 0,-4.05881 2.9685,-7.05818 4.5605,-4.60795 1.8641,2.86903 0.7009,7.15069 -2.0488,7.54125 -2.1173,0.30073 -2.5117,-0.15997 -2.5117,-2.9333 z m -78.9896,0.72672 c -1.7134,-1.71327 -1.8273,-5.40638 -0.1668,-5.40638 0.6715,0 1.4836,1.0047 1.8047,2.23272 0.3212,1.22793 1.0276,2.23269 1.5701,2.23269 1.391,0 1.2242,-1.54812 -0.3349,-3.10721 -1.9476,-1.94761 -0.3573,-2.85385 2.4095,-1.37321 3.3524,1.79429 2.6333,6.04607 -1.0963,6.482 -1.5393,0.17992 -3.4231,-0.29737 -4.1863,-1.06061 z m -171.81072,-1.56495 c -0.4127,-1.07545 0.60226,-2.98201 2.65697,-4.99085 l 3.32476,-3.25053 0.10125,3.56252 c 0.15694,5.51975 -4.41182,9.03395 -6.08301,4.67886 z m 390.30252,-1.15967 c -1.3148,-3.4582 0.1097,-5.13269 3.9487,-4.64179 3.408,0.43576 3.1656,6.85104 -0.2772,7.34006 -1.8744,0.26616 -2.8042,-0.41716 -3.6715,-2.69827 z m -372.81938,0.20213 c 0,-0.97224 0.7954,-1.76753 1.76756,-1.76753 1.97139,0 1.62807,2.40316 -0.44189,3.09313 -0.72911,0.24302 -1.32567,-0.35342 -1.32567,-1.3256 z m 71.40708,-0.14043 c -1.9103,-2.30166 -0.077,-3.88537 3.0907,-2.6698 1.6213,0.62234 2.2628,1.55751 1.8341,2.67434 -0.8443,2.20049 -3.0965,2.19845 -4.9248,-0.01 z m -16.3022,-1.06896 c -0.9021,-2.35077 0.3284,-5.02355 2.3128,-5.02355 1.953,0 4.3933,4.01228 3.4091,5.60475 -1.0458,1.69232 -5.0038,1.29017 -5.7219,-0.5812 z m 89.0829,-0.10341 c 0.5029,-2.6114 4.2868,-3.57778 4.2868,-1.09477 0,0.96591 -0.2102,1.75636 -0.4669,1.75636 -0.2568,0 -1.3125,0.32441 -2.3459,0.72092 -1.4142,0.54273 -1.7788,0.20072 -1.474,-1.38251 z m 181.1412,-0.0987 c -0.3488,-1.11682 -1.0998,-2.90297 -1.669,-3.96904 -1.4903,-2.7917 -1.2901,-3.24052 0.9188,-2.05974 1.0745,0.5744 2.8441,1.32075 3.9325,1.65862 1.8455,0.57291 3.8384,3.64915 2.9034,4.48168 -0.2293,0.20431 -1.5497,0.71967 -2.9342,1.1452 -1.8823,0.57861 -2.6773,0.26162 -3.1515,-1.25672 z m -381.14647,-2.50715 c 0,-1.29769 1.3965,-2.84762 3.52055,-3.9072 4.40537,-2.19766 4.54428,-2.18922 3.26849,0.19736 -0.57436,1.07444 -1.31641,2.83276 -1.64895,3.90719 -0.84566,2.73251 -5.14009,2.56769 -5.14009,-0.19735 z m 12.4491,1.16287 c -2.17518,-1.37844 -1.14398,-4.74603 1.78436,-5.82712 2.30019,-0.84908 2.51178,-0.60115 2.51178,2.94402 0,3.90617 -1.30252,4.7802 -4.29614,2.8831 z m 333.14087,-0.76655 c -2.1054,-2.10549 -2.18,-2.95512 -0.4146,-4.72055 1.6552,-1.65532 6.0861,-1.75541 7.0722,-0.15982 0.4011,0.64884 0.4211,2.40708 0.044,3.90719 -0.7934,3.16093 -4.0426,3.63274 -6.7022,0.97318 z m 4.9439,-2.71108 c 0,-1.22801 -0.7239,-2.23278 -1.6087,-2.23278 -2.3306,0 -3.4055,2.31598 -1.6043,3.4568 2.3894,1.51334 3.213,1.19963 3.213,-1.22402 z m 89.3481,2.30761 c -0.9504,-1.7759 -0.7255,-2.29393 1.2712,-2.92767 2.5121,-0.79741 5.9282,2.18985 4.727,4.13348 -1.0745,1.73851 -4.8261,0.98428 -5.9982,-1.20581 z m -35.3633,0.1262 c -0.6347,-0.41762 -1.4292,-1.84963 -1.7656,-3.18211 -0.4816,-1.90821 -0.011,-2.57425 2.2258,-3.13497 3.1203,-0.78325 6.6336,1.69272 5.3496,3.77005 -1.1811,1.91118 -4.5388,3.3833 -5.8098,2.54703 z m -413.44949,-1.31745 c 0,-0.61406 0.50236,-1.11636 1.11636,-1.11636 0.614,0 1.11636,0.5023 1.11636,1.11636 0,0.61396 -0.50236,1.11634 -1.11636,1.11634 -0.614,0 -1.11636,-0.50238 -1.11636,-1.11634 z m 344.60329,-0.72102 c -1.5802,-1.58018 -0.686,-3.74447 1.547,-3.74447 1.5607,0 2.197,0.60622 1.9537,1.86113 -0.3985,2.05458 -2.3042,3.07983 -3.5007,1.88334 z m 82.743,-1.19134 c -0.964,-1.09727 -2.0661,-3.0269 -2.4489,-4.28807 -0.6151,-2.02627 -0.1673,-2.32449 3.8455,-2.56127 l 4.5416,-0.26796 -0.3494,4.22645 c -0.3974,4.80523 -2.81,6.05326 -5.5888,2.89085 z m 3.5648,-3.17718 c 0,-1.64392 -1.33,-2.1392 -2.5279,-0.94129 -1.0064,1.00634 0.3793,3.8778 1.5285,3.16757 0.5496,-0.33966 0.9994,-1.34146 0.9994,-2.22628 z m -145.8382,2.2983 c -0.9455,-2.46384 0.9938,-4.17774 4.212,-3.72234 1.7718,0.25069 2.6407,1.10814 2.6407,2.60622 0,2.91689 -5.7993,3.86145 -6.8527,1.11612 z m -249.33788,-1.10189 c -1.8311,-2.20627 -0.69713,-4.83244 2.63339,-6.09868 1.48632,-0.5651 2.94774,-1.68786 3.2476,-2.49504 0.29987,-0.80718 0.35881,0.70529 0.13097,3.36103 -0.22782,2.65571 -0.7013,5.29313 -1.05218,5.86089 -0.95938,1.55219 -3.4075,1.24233 -4.95978,-0.6282 z m 46.91418,-0.49894 c -1.7107,-3.1965 -1.42121,-5.06875 1.14242,-7.38879 4.39221,-3.9749 8.47036,1.55369 5.02491,6.81212 -2.15512,3.28916 -4.59363,3.51708 -6.16733,0.57667 z m 4.42613,-4.67059 c 0,-1.22793 -0.50237,-1.9222 -1.11635,-1.54272 -0.614,0.37954 -1.11636,1.69465 -1.11636,2.92259 0,1.22801 0.50236,1.92228 1.11636,1.54281 0.61398,-0.37947 1.11635,-1.69466 1.11635,-2.92268 z m 58.76407,6.0553 c -1.2573,-1.25725 -0.7657,-2.57449 0.9606,-2.57449 0.921,0 1.6746,0.47275 1.6746,1.05044 0,1.4077 -1.7433,2.41599 -2.6352,1.52405 z m 228.1378,-3.24983 0,-4.02433 2.7717,2.62899 c 3.5503,3.36758 3.5576,5.41974 0.019,5.41974 -2.4609,0 -2.7909,-0.47596 -2.7909,-4.0244 z m -271.6451,2.16389 c -1.6027,-1.60278 -0.6988,-4.8376 1.3518,-4.8376 2.5141,0 5.0828,2.78451 4.0741,4.41654 -0.804,1.30088 -4.2765,1.57042 -5.4259,0.42106 z m 161.3497,-0.59543 c -1.9543,-1.95434 -1.6414,-4.00204 0.8123,-5.31513 2.7257,-1.45882 5.6626,-0.37703 5.6626,2.08547 0,2.14466 -2.0734,4.56925 -3.9072,4.56925 -0.6754,0 -1.8309,-0.60278 -2.5677,-1.33959 z m -207.18666,-1.5425 c -1.19905,-3.12464 -0.74025,-4.14137 1.15794,-2.56596 1.62686,1.35023 1.74857,1.24927 1.07049,-0.88718 -0.64384,-2.02854 -0.40404,-2.31613 1.51349,-1.81468 2.72183,0.71178 2.93592,2.8677 0.52431,5.27931 -2.22316,2.22316 -3.40992,2.21988 -4.26623,-0.0118 z m 158.92226,-0.53827 c -0.9217,-1.72211 -0.8858,-2.72259 0.1421,-3.96108 2.8235,-3.40222 8.9557,0.29362 7.365,4.43882 -1.0084,2.62782 -6.0156,2.30918 -7.5071,-0.47774 z m 4.6194,-2.49199 c -1.4328,-1.43281 -2.8858,-0.32544 -1.825,1.39096 0.4108,0.66478 1.2585,0.89273 1.8835,0.50645 0.7625,-0.47127 0.7433,-1.09571 -0.058,-1.89741 z m 20.2575,4.05668 c -1.7729,-0.71545 -1.8048,-3.98647 -0.056,-5.73555 3.3707,-3.37056 8.7168,0.0524 6.513,4.17086 -1.1824,2.20939 -3.4798,2.76612 -6.4572,1.56469 z m 4.1863,-3.72609 c 0,-0.61397 -0.5024,-1.11635 -1.1163,-1.11635 -0.614,0 -1.1164,0.50238 -1.1164,1.11635 0,0.61405 0.5024,1.11635 1.1164,1.11635 0.6139,0 1.1163,-0.5023 1.1163,-1.11635 z m 84.5176,3.76832 c -0.4352,-0.43529 -0.7913,-1.74572 -0.7913,-2.91211 0,-1.65502 0.6743,-2.04324 3.0699,-1.76762 2.2081,0.25413 3.07,0.98015 3.07,2.58598 0,2.24286 -3.7367,3.7056 -5.3486,2.09375 z m 62.066,-2.25522 c -0.8097,-2.10994 2.583,-5.10432 5.2184,-4.60568 0.9329,0.17648 1.8552,1.69801 2.0493,3.38126 0.3179,2.7537 0.011,3.06037 -3.1049,3.06037 -2.1793,0 -3.7188,-0.67894 -4.1628,-1.83595 z m 55.4758,0.16147 c 0,-1.12011 0.7321,-1.69725 1.8742,-1.47729 1.0308,0.19845 1.8742,0.86332 1.8742,1.47729 0,0.61404 -0.8434,1.27875 -1.8742,1.47728 -1.1421,0.21988 -1.8742,-0.35717 -1.8742,-1.47728 z m -457.0169,-2.19345 c -1.89378,-2.89022 -2.3858,-6.09806 -0.96567,-6.29566 5.20431,-0.72398 9.00806,-0.46157 8.3609,0.57691 -0.41616,0.66776 -0.61511,2.30987 -0.44216,3.64923 0.19579,1.51599 -0.52693,2.88545 -1.91465,3.62812 -2.9779,1.59372 -2.97171,1.59559 -5.03842,-1.5586 z m 4.18253,-2.27196 c -0.67144,-1.74971 -3.75275,-2.36079 -3.75275,-0.74416 0,1.36376 1.28307,2.41865 2.9419,2.41865 0.83328,0 1.17926,-0.71445 0.81085,-1.67449 z m 195.63517,3.2578 c -0.9802,-2.55431 -0.8352,-3.81602 0.4387,-3.81602 0.614,0 1.1163,0.75355 1.1163,1.67458 0,0.92094 0.7536,1.67448 1.6746,1.67448 0.9209,0 1.6745,-0.5023 1.6745,-1.11635 0,-0.61396 -0.5024,-1.11635 -1.1164,-1.11635 -0.6139,0 -1.1163,-0.50239 -1.1163,-1.11636 0,-1.45469 3.0129,-1.44694 3.9134,0.01 0.3828,0.61952 0.3786,2.12659 -0.011,3.34905 -0.8557,2.69615 -5.59,3.02511 -6.5755,0.45696 z m 270.7815,0.64939 c 0.5618,-1.68567 2.357,-1.85941 2.8839,-0.27899 0.2558,0.76738 -0.3722,1.39534 -1.3955,1.39534 -1.0233,0 -1.6931,-0.50231 -1.4884,-1.11635 z M 904.1108,883.8285 c -0.90143,-2.34914 0.10222,-3.80647 2.62152,-3.80647 2.49767,0 3.69076,2.61427 1.97575,4.32934 -1.77983,1.77982 -3.80188,1.54985 -4.59727,-0.52287 z m 21.65302,-0.98061 c 0,-0.99867 0.65451,-1.3883 1.67453,-0.99695 1.07552,0.41277 1.67452,-0.0227 1.67452,-1.21714 0,-1.02299 -0.50235,-1.54947 -1.11635,-1.16999 -0.614,0.37946 -1.11634,0.21174 -1.11634,-0.3729 0,-0.90531 2.50132,-2.41795 3.99853,-2.41795 1.06821,0 0.36189,5.24022 -0.87275,6.4748 -1.8493,1.84932 -4.24214,1.68019 -4.24214,-0.29987 z m 144.46498,0.10093 c -0.9035,-2.35461 0.3647,-4.04317 3.0367,-4.04317 1.6865,0 2.1558,0.62156 1.8877,2.50036 -0.4163,2.91814 -3.9695,4.03129 -4.9244,1.54281 z m 4.0095,-1.31824 c 0,-0.2707 -0.5023,-0.49222 -1.1163,-0.49222 -0.614,0 -1.1163,0.53194 -1.1163,1.18218 0,0.65026 0.5023,0.87185 1.1163,0.49231 0.614,-0.37947 1.1163,-0.91148 1.1163,-1.18227 z m 249.2019,1.54977 c -0.7547,-0.75471 -1.3721,-2.02103 -1.3721,-2.81398 0,-0.79302 -1.0048,-2.06928 -2.2327,-2.83611 -2.8655,-1.7896 -2.9294,-3.54141 -0.073,-2.01291 1.1876,0.63555 3.7311,1.1556 5.6524,1.1556 3.2669,0 3.4705,0.23443 3.1433,3.6189 -0.374,3.86942 -2.7791,5.22693 -5.1175,2.8885 z m 3.6037,-3.23551 c -0.957,-1.54845 -1.6268,-1.25969 -1.6268,0.70123 0,0.95722 0.5105,1.42489 1.1345,1.03917 0.624,-0.38565 0.8456,-1.16882 0.4923,-1.7404 z m -410.21088,1.88193 c 0,-0.84941 0.94103,-1.79045 2.09118,-2.09118 1.60833,-0.42067 1.96492,-0.0634 1.54433,1.54423 -0.62971,2.408 -3.63551,2.86011 -3.63551,0.54695 z m 370.25998,-0.0383 c -0.334,-0.87012 0.034,-1.82845 0.819,-2.1294 1.9872,-0.76254 4.4622,0.96786 3.5336,2.47039 -1.0783,1.74464 -3.629,1.54493 -4.3526,-0.34099 z m 54.2089,-0.85988 c 0.6899,-2.0699 3.0931,-2.41325 3.0931,-0.44179 0,0.97208 -0.7953,1.76754 -1.7675,1.76754 -0.9722,0 -1.5687,-0.59661 -1.3256,-1.32568 z m 28.3668,0.55118 c -1.2573,-1.25733 -0.7658,-2.57447 0.9606,-2.57447 0.9209,0 1.6745,0.47266 1.6745,1.05042 0,1.4077 -1.7433,2.41591 -2.6351,1.52405 z m -262.0401,-2.13715 c -1.266,-1.52546 -1.1705,-2.02894 0.6349,-3.34906 2.7675,-2.02369 4.9565,-1.97247 5.7652,0.13504 0.7399,1.92799 -1.4185,5.00939 -3.509,5.00939 -0.7706,0 -2.0716,-0.80796 -2.8911,-1.79537 z m 77.1435,0.68833 c -2.0262,-1.25225 -0.4614,-4.72447 1.9223,-4.2654 1.0693,0.20596 2.1002,1.18454 2.2909,2.17469 0.4081,2.11924 -2.1294,3.37846 -4.2132,2.09071 z m 123.1801,-0.58575 c -0.4291,-1.1183 0.2076,-2.75675 1.62,-4.1692 1.9756,-1.97562 2.5971,-2.10275 4.1162,-0.84206 0.9841,0.8168 1.6395,2.53366 1.4563,3.81531 -0.4295,3.00681 -6.1337,3.9552 -7.1925,1.19595 z m 5.1851,-2.28032 c 0,-0.88482 -0.4487,-1.60865 -0.997,-1.60865 -1.2322,0 -2.4325,2.89657 -1.5613,3.7677 0.9772,0.97717 2.5583,-0.35727 2.5583,-2.15905 z m -99.0097,1.03042 c -1.4171,-3.69271 3.9062,-7.76465 6.6127,-5.05826 0.6266,0.62663 0.8149,2.43201 0.4183,4.01197 -0.5352,2.13231 -1.4438,2.87263 -3.5256,2.87263 -1.5668,0 -3.1139,-0.80616 -3.5054,-1.82634 z m 4.1199,-2.14677 c 0,-0.95722 -0.5024,-1.42998 -1.1164,-1.05059 -0.614,0.37955 -1.1163,1.16272 -1.1163,1.74048 0,0.57776 0.5023,1.05051 1.1163,1.05051 0.614,0 1.1164,-0.78325 1.1164,-1.7404 z m 139.767,2.63337 c -2.0868,-2.08681 -1.5924,-2.86442 1.4512,-2.2826 1.535,0.29346 2.7909,1.22847 2.7909,2.07788 0,1.89953 -2.4301,2.01682 -4.2421,0.20472 z m -100.595,-2.28846 c -1.012,-2.69091 0.018,-3.69209 2.728,-2.65213 2.1844,0.8383 2.1234,5.16399 -0.072,5.16399 -0.9408,0 -2.1355,-1.13037 -2.655,-2.51186 z m -303.74694,-1.3955 c 0,-1.12003 0.73216,-1.69724 1.87424,-1.47721 1.03083,0.19845 1.87422,0.86323 1.87422,1.47721 0,0.61404 -0.84339,1.27891 -1.87422,1.47736 -1.14208,0.21996 -1.87424,-0.35718 -1.87424,-1.47736 z m -45.77034,-1.67441 c 0,-0.61404 0.75354,-1.11643 1.67453,-1.11643 0.92099,0 1.67452,0.50239 1.67452,1.11643 0,0.61397 -0.75353,1.11636 -1.67452,1.11636 -0.92099,0 -1.67453,-0.50239 -1.67453,-1.11636 z m 247.82968,-0.99695 c 0,-2.73924 2.6003,-3.7039 5.0856,-1.8867 2.4808,1.81406 1.1907,4.00001 -2.3606,4.00001 -1.9295,0 -2.725,-0.61703 -2.725,-2.11331 z m 4.4654,-0.11948 c 0,-0.61397 -0.7536,-1.11635 -1.6745,-1.11635 -0.921,0 -1.6746,0.50238 -1.6746,1.11635 0,0.61405 0.7536,1.11643 1.6746,1.11643 0.9209,0 1.6745,-0.50238 1.6745,-1.11643 z m 207.4766,1.48526 c -1.0115,-0.26867 -2.0848,-1.34068 -2.3851,-2.38228 -0.3005,-1.0416 -0.8987,-2.74855 -1.3296,-3.79327 -0.6813,-1.65181 -0.2248,-1.81548 3.5015,-1.25545 2.3567,0.35421 5.0049,1.31886 5.8848,2.14379 1.384,1.29729 1.3229,1.80586 -0.4521,3.76723 -1.1286,1.24716 -2.3509,2.20917 -2.7162,2.13793 -0.3654,-0.0719 -1.4919,-0.34928 -2.5033,-0.61795 z m 3.2343,-4.36931 c -1.0638,-1.0638 -3.1967,0.65932 -2.4038,1.94215 0.4712,0.76244 1.0956,0.74313 1.8973,-0.0579 0.6573,-0.65722 0.8853,-1.50481 0.5065,-1.88357 z m -436.34822,1.8566 c -2.35082,-1.92713 -2.46369,-2.36203 -0.9817,-3.78184 2.14612,-2.05631 10.09107,-3.71891 8.05865,-1.68638 -0.74831,0.74829 -1.36055,2.20322 -1.36055,3.23325 0,3.53804 -2.79422,4.63047 -5.7164,2.23497 z m 2.92552,-2.32161 c -0.37948,-0.61396 -1.16265,-1.11635 -1.74041,-1.11635 -0.57777,0 -1.05046,0.50239 -1.05046,1.11635 0,0.61405 0.78318,1.11636 1.74041,1.11636 0.95721,0 1.42993,-0.50231 1.05046,-1.11636 z m 392.975,0.48488 c -1.6699,-2.18924 -2.7343,-4.28245 -2.3653,-4.65151 0.3691,-0.36891 0.671,-0.27445 0.671,0.21002 0,0.48456 0.6923,0.30636 1.5387,-0.39603 2.032,-1.68646 7.392,0.28867 7.392,2.72391 0,2.28727 -2.0338,6.09422 -3.2558,6.09422 -0.5195,0 -2.3109,-1.7913 -3.9806,-3.98061 z m 4.5572,-2.27094 c -0.5403,-1.40825 -1.0779,-1.60139 -1.971,-0.70835 -0.6754,0.67543 -0.8936,2.09938 -0.485,3.16429 0.5403,1.40817 1.0779,1.6013 1.971,0.70818 0.6754,-0.67534 0.8936,-2.0993 0.485,-3.16412 z m -441.62802,2.97662 c 0,-1.41137 0.72423,-2.30691 1.8657,-2.30691 1.02615,0 2.78441,-0.83134 3.90724,-1.84744 1.12284,-1.0162 2.04151,-1.29706 2.04151,-0.62405 0,0.67291 -0.51568,1.54217 -1.14596,1.93157 -0.63027,0.38964 -1.00704,1.54954 -0.83725,2.57778 0.2158,1.3069 -0.61514,1.97575 -2.76128,2.22269 -2.47259,0.28447 -3.06996,-0.0957 -3.06996,-1.95364 z m 455.69402,0.81891 c -0.7368,-0.73673 -1.3397,-1.78654 -1.3397,-2.33286 0,-0.54626 -1.1302,-1.99485 -2.5117,-3.21926 -2.263,-2.00556 -2.2907,-2.14357 -0.2791,-1.39363 1.228,0.45774 4.1165,1.05489 6.419,1.327 4.1539,0.49097 4.8931,1.58488 3.5087,5.1926 -0.8016,2.08914 -3.906,2.31738 -5.7972,0.42615 z m 4.2421,-2.00947 c 0,-0.61396 -0.5024,-1.11635 -1.1163,-1.11635 -0.614,0 -1.1164,0.50239 -1.1164,1.11635 0,0.61405 0.5024,1.11636 1.1164,1.11636 0.6139,0 1.1163,-0.50231 1.1163,-1.11636 z m -467.03669,1.45814 c -1.25721,-1.25719 -0.7657,-2.57449 0.96064,-2.57449 0.92099,0 1.67452,0.47275 1.67452,1.05052 0,1.40762 -1.74328,2.4159 -2.63516,1.52397 z m 347.00979,-1.51912 c -0.9578,-3.01745 2.1136,-6.66386 4.0131,-4.76443 1.7512,1.75128 0.8048,6.41366 -1.3866,6.83121 -1.117,0.21267 -2.1647,-0.61163 -2.6265,-2.06678 z m 49.9202,0.9541 c -1.908,-1.90805 -1.6571,-7.05436 0.4284,-8.78522 4.0354,-3.34898 8.1521,4.51059 4.3527,8.30996 -2.1668,2.16687 -3.0061,2.2503 -4.7811,0.47526 z m 3.6839,-4.24217 c 0,-0.81868 -0.6279,-1.69779 -1.3954,-1.95356 -0.8301,-0.27672 -1.3955,0.51474 -1.3955,1.95356 0,1.4389 0.5654,2.23035 1.3955,1.95364 0.7675,-0.25585 1.3954,-1.13497 1.3954,-1.95364 z m -367.79281,2.84447 c -0.73991,-0.89146 -1.01843,-2.65079 -0.61894,-3.90937 0.56291,-1.77364 1.34042,-2.13442 3.45577,-1.60349 1.54492,0.38776 3.46156,0.0774 4.41645,-0.71499 2.75995,-2.29057 3.33148,-0.17093 0.70716,2.6225 -1.33274,1.41863 -2.42317,3.17491 -2.42317,3.90289 0,1.86128 -3.92044,1.65071 -5.53727,-0.29754 z m 138.38291,0.15983 c 0,-0.80366 0.6809,-2.39237 1.5131,-3.53046 2.0332,-2.78052 5.185,-1.46415 5.185,2.16569 0,2.39567 -0.5099,2.82588 -3.349,2.82588 -2.0154,0 -3.3491,-0.58184 -3.3491,-1.46111 z m -88.19162,-3.4966 c 0,-3.9007 2.23712,-4.76934 4.6402,-1.80171 2.44027,3.01353 1.80006,4.52671 -1.91521,4.52671 -2.14486,0 -2.72499,-0.58003 -2.72499,-2.725 z m 328.64172,0.0156 c -0.3363,-0.87629 -0.4461,-2.76003 -0.244,-4.18626 0.3045,-2.14919 1.036,-2.59301 4.2745,-2.59301 3.2299,0 3.9705,0.44616 4.272,2.57323 0.2007,1.41536 -0.2376,3.29918 -0.9739,4.18642 -1.7227,2.07569 -6.5346,2.08867 -7.3286,0.0204 z m 5.5087,-2.20462 c 0.7006,-1.82579 -0.1227,-2.90008 -2.2224,-2.90008 -0.8187,0 -1.4885,1.00477 -1.4885,2.2327 0,2.53844 2.7998,3.04192 3.7109,0.66738 z m -274.9839,0.97217 c 0,-1.6892 2.9433,-3.53383 3.9817,-2.49544 0.2949,0.29502 0.2196,1.36173 -0.1676,2.37063 -0.8882,2.31457 -3.8141,2.41028 -3.8141,0.12481 z m 292.4837,0.0352 c 0,-1.12019 0.7322,-1.69724 1.8742,-1.47729 1.0308,0.19853 1.8743,0.86333 1.8743,1.47729 0,0.61396 -0.8435,1.27876 -1.8743,1.47728 -1.142,0.21996 -1.8742,-0.3571 -1.8742,-1.47728 z m 58.8456,0.98155 c -2.9519,-2.952 1.9453,-8.07062 5.3439,-5.58552 2.7455,2.00767 1.7072,5.64909 -1.7253,6.05069 -1.5526,0.18164 -3.1811,-0.0273 -3.6186,-0.46517 z m -391.14297,-2.17298 c -0.36926,-0.96231 -0.0885,-2.33248 0.62394,-3.04489 1.59801,-1.59801 4.961,0.21151 5.50202,2.96045 0.48207,2.44936 -5.18848,2.52748 -6.12596,0.0844 z m 267.66177,-0.90554 c -1.5922,-1.91829 0.047,-6.78623 2.618,-7.77271 1.9526,-0.74924 6.2001,2.80007 6.2001,5.18102 0,3.76426 -6.3066,5.61796 -8.8181,2.59169 z m 5.1674,-3.27352 c -0.7477,-2.24304 -3.0474,-2.07797 -3.0474,0.21877 0,1.60552 0.515,2.09306 1.7217,1.63008 0.9469,-0.36343 1.5435,-1.19532 1.3257,-1.84885 z m -173.4118,2.10868 c -0.8272,-2.1556 1.4855,-6.22715 3.537,-6.22715 1.8094,0 4.2477,5.13582 3.2243,6.7917 -0.9984,1.61538 -6.0878,1.19032 -6.7613,-0.56455 z m -204.72917,-0.64548 c 0,-0.61397 0.50235,-1.11636 1.11635,-1.11636 0.61398,0 1.11635,0.50239 1.11635,1.11636 0,0.61396 -0.50237,1.11635 -1.11635,1.11635 -0.614,0 -1.11635,-0.50239 -1.11635,-1.11635 z m 285.41347,0.37212 c -0.4093,-0.40935 -0.7443,-1.91642 -0.7443,-3.34906 0,-3.03965 3.3656,-3.6006 5.5818,-0.93026 2.2696,2.73478 -2.3211,6.79578 -4.8375,4.27932 z m 3.7211,-1.98077 c 0,-0.88467 -0.4676,-1.89766 -1.0391,-2.25085 -1.3273,-0.82031 -2.6621,1.27016 -1.7517,2.74314 1.0265,1.66097 2.7908,1.34977 2.7908,-0.49229 z m 17.5425,2.03363 c -1.7975,-1.79734 -0.6932,-4.87389 1.9911,-5.54766 4.0463,-1.01549 6.3603,0.21674 5.9417,3.16412 -0.268,1.88702 -1.2055,2.59981 -3.7465,2.84878 -1.8641,0.18258 -3.748,-0.0266 -4.1863,-0.46524 z m 4.7846,-2.65768 c 0,-0.61405 -0.7536,-1.11635 -1.6745,-1.11635 -0.9211,0 -1.6746,0.5023 -1.6746,1.11635 0,0.61397 0.7535,1.11634 1.6746,1.11634 0.9209,0 1.6745,-0.50237 1.6745,-1.11634 z m 172.4301,2.15841 c -0.4048,-0.65478 -0.456,-1.47048 -0.1141,-1.81242 0.9184,-0.91836 4.0672,0.51529 4.0672,1.85167 0,1.51522 -3.0108,1.48527 -3.9531,-0.0391 z m -9.3069,-1.43615 c -1.357,-1.63509 -0.5867,-2.95489 1.7244,-2.95489 1.663,0 2.0378,2.87772 0.4986,3.829 -0.5444,0.33646 -1.5448,-0.0571 -2.223,-0.87411 z m -454.2429,-0.9211 c -2.39336,-2.39332 -1.58013,-5.28877 1.70594,-6.07376 1.68848,-0.40331 3.69791,-1.22801 4.46539,-1.83243 0.93057,-0.73298 1.39544,-0.70365 1.39544,0.088 0,0.6529 -0.50235,1.49754 -1.11635,1.87701 -0.61399,0.37955 -1.11635,1.91626 -1.11635,3.41505 0,1.49863 -0.21009,2.72492 -0.46687,2.72492 -0.25678,0 -1.15004,0.2621 -1.98503,0.58262 -0.83499,0.32035 -2.13196,-0.0304 -2.88217,-0.78153 z m 24.68694,-0.43436 c -0.80569,-2.09955 1.16987,-4.38909 2.87686,-3.33413 1.84007,1.13723 1.45508,5.08367 -0.49594,5.08367 -0.94025,0 -2.01168,-0.78731 -2.38092,-1.74954 z m 193.49776,1.00532 c -1.5615,-1.56159 -0.7047,-4.83745 1.2652,-4.83745 2.3508,0 4.6888,2.05958 4.6888,4.13043 0,1.49066 -4.6215,2.03949 -5.954,0.70702 z m 3.7213,-1.48847 c 0,-0.61405 -0.7833,-1.11628 -1.7405,-1.11628 -0.9571,0 -1.4299,0.50223 -1.0504,1.11628 0.3794,0.61396 1.1627,1.11635 1.7404,1.11635 0.5777,0 1.0505,-0.50239 1.0505,-1.11635 z m -177.48787,-0.54391 c -1.80793,-2.17844 -0.64485,-5.03778 2.04915,-5.03778 3.42339,0 5.06698,2.75972 2.92142,4.90532 -2.22324,2.22316 -3.21351,2.24951 -4.97057,0.13246 z m -60.2829,-1.11636 c -1.76531,-2.12706 -0.66865,-5.03339 1.90678,-5.05301 1.09376,-0.01 3.16776,-0.33099 4.60892,-0.71687 2.30381,-0.61671 2.48219,-0.44632 1.47693,1.41074 -0.62884,1.1617 -1.41543,2.99133 -1.74798,4.06577 -0.73884,2.38736 -4.36546,2.55759 -6.24465,0.29337 z m 3.89542,-1.68871 c -0.37947,-0.61404 -1.16266,-1.11635 -1.74042,-1.11635 -0.57775,0 -1.05046,0.50231 -1.05046,1.11635 0,0.61397 0.7832,1.11635 1.74041,1.11635 0.95724,0 1.42994,-0.50238 1.05047,-1.11635 z m 254.80685,2.14317 c -2.5696,-1.49653 -2.471,-2.31011 0.7312,-6.03684 3.2827,-3.82025 6.246,-3.15474 6.246,1.40261 0,5.07086 -2.9096,7.00345 -6.9772,4.63423 z m 4.3592,-3.86591 c 1.0385,-2.7063 -0.4105,-3.19493 -1.7963,-0.60567 -0.864,1.61443 -0.881,2.32841 -0.055,2.32841 0.6549,0 1.4882,-0.7752 1.8517,-1.72274 z m 163.1255,1.66316 c -0.3623,-2.46916 0.044,-3.69983 1.4744,-4.4654 2.9269,-1.56644 4.1428,-1.30504 5.4706,1.17592 1.6474,3.07819 -0.417,6.69804 -3.8198,6.69804 -2.0733,0 -2.7301,-0.71632 -3.1252,-3.40856 z m 4.7123,-1.12269 c 0,-0.57776 -0.5024,-1.05044 -1.1163,-1.05044 -0.614,0 -1.1164,0.78318 -1.1164,1.74041 0,0.95722 0.5024,1.4299 1.1164,1.05044 0.6139,-0.37955 1.1163,-1.16272 1.1163,-1.74041 z m -444.88237,1.86606 c -2.70812,-1.98022 -1.38572,-5.1492 2.1487,-5.1492 1.51801,0 3.0705,0.5023 3.44996,1.11635 0.37948,0.61396 0.15795,1.11635 -0.49228,1.11635 -0.65023,0 -1.18224,0.7239 -1.18224,1.60865 0,2.41388 -1.65653,2.966 -3.92414,1.30785 z m 135.16137,0.061 c -2.8573,-2.08921 -1.8217,-5.76809 1.6237,-5.76809 1.9638,0 2.873,0.68154 3.1086,2.33037 0.4789,3.35242 -2.1937,5.29394 -4.7323,3.43772 z m 324.8394,0.449 c -0.8256,-1.33592 1.2744,-2.65948 2.7614,-1.74041 1.2484,0.7716 0.4288,2.77958 -1.1346,2.77958 -0.5415,0 -1.2735,-0.46767 -1.6268,-1.03917 z m 37.5556,0.0501 c -0.6967,-0.4306 -1.4047,-2.01509 -1.5733,-3.52131 -0.2398,-2.13957 0.2707,-2.82094 2.3337,-3.11565 3.3521,-0.47885 5.0398,1.18259 4.1261,4.0617 -0.8121,2.55853 -3.0259,3.72516 -4.8865,2.57526 z m -149.4547,-1.96309 c -0.8328,-2.1703 2.4665,-4.99946 4.7903,-4.10775 1.9198,0.73656 2.0215,2.80897 0.2264,4.60419 -1.89,1.89 -4.1883,1.66261 -5.0167,-0.49644 z m 124.6428,-1.60029 c -1.7068,-3.18907 -0.5624,-5.49448 2.7273,-5.49448 3.222,0 4.9277,3.69794 2.8566,6.19345 -1.901,2.29056 -4.1335,2.01111 -5.5839,-0.69897 z m -292.158,0.46424 c -0.7675,-0.30973 -1.3954,-2.31285 -1.3954,-4.45142 0,-3.58324 0.2409,-3.86066 3.0699,-3.53515 3.446,0.39659 4.7962,4.29894 2.4608,7.11284 -1.4053,1.69333 -1.8639,1.79029 -4.1353,0.87373 z m 3.07,-4.84238 c 0,-0.61405 -0.5023,-1.11634 -1.1163,-1.11634 -0.614,0 -1.1164,0.50229 -1.1164,1.11634 0,0.61397 0.5024,1.11635 1.1164,1.11635 0.614,0 1.1163,-0.50238 1.1163,-1.11635 z m 213.2856,4.52781 c -2.5432,-1.60912 -0.2469,-9.44564 2.8994,-9.89407 2.4015,-0.34224 5.9686,3.29925 5.9686,6.09306 0,3.6354 -5.4426,5.96819 -8.868,3.80101 z m 5.3089,-4.81978 c 0.2056,-1.0674 -0.1951,-1.94081 -0.8903,-1.94081 -0.6952,0 -0.9536,0.50239 -0.5742,1.11644 0.3795,0.61396 -0.093,1.11634 -1.0504,1.11634 -0.9572,0 -1.7405,0.53914 -1.7405,1.19823 0,1.96364 3.8499,0.6156 4.2554,-1.4902 z m 109.7985,4.75738 c 0.5618,-1.68575 2.3571,-1.85949 2.8838,-0.27915 0.2558,0.76754 -0.3721,1.3955 -1.3954,1.3955 -1.0233,0 -1.6932,-0.50238 -1.4884,-1.11635 z m -426.20344,-2.91071 c -0.48358,-1.92681 -0.20778,-3.24186 0.816,-3.89015 3.89167,-2.46462 6.61278,0.31653 4.3841,4.48089 -1.71379,3.20229 -4.32248,2.90595 -5.2001,-0.59074 z m 4.03706,-1.5547 c 0,-0.61405 -0.50235,-1.11634 -1.11634,-1.11634 -0.614,0 -1.11635,0.50229 -1.11635,1.11634 0,0.61397 0.50235,1.11635 1.11635,1.11635 0.61399,0 1.11634,-0.50238 1.11634,-1.11635 z m -43.31438,2.00939 c -2.12058,-2.12058 -1.56458,-3.33952 1.17217,-2.56964 1.9073,0.53648 2.11657,0.43483 0.8696,-0.42232 -1.85956,-1.2782 -1.75523,-1.41418 2.47945,-3.23285 2.86791,-1.23177 4.42011,-0.0999 1.95362,1.42458 -0.61401,0.37948 -1.11636,1.61123 -1.11636,2.73728 0,1.12604 -0.79462,2.35226 -1.76583,2.72492 -2.24828,0.86286 -2.02715,0.90351 -3.59265,-0.66197 z m 18.19651,0.22331 c -0.37948,-0.61403 -0.15794,-1.11635 0.4923,-1.11635 0.65022,0 1.18223,0.50232 1.18223,1.11635 0,0.61397 -0.22154,1.11636 -0.49229,1.11636 -0.27077,0 -0.80278,-0.50239 -1.18224,-1.11636 z m 351.53185,-2.69653 c -0.3334,-0.86919 -0.4433,-3.00423 -0.2439,-4.74455 0.5002,-4.36885 4.5497,-4.92002 7.137,-0.97139 1.7863,2.72641 1.7805,3.01118 -0.1026,5.09204 -2.3241,2.56807 -5.9177,2.89819 -6.7905,0.6239 z m 4.5056,-4.12809 c -1.1262,-1.82227 -2.7127,-1.01548 -2.7127,1.37955 0,1.97177 0.2789,2.13786 1.6622,0.98991 0.9143,-0.75885 1.387,-1.82508 1.0505,-2.36946 z m -219.9944,1.80851 c -0.3866,-1.00766 -0.1677,-2.36743 0.4865,-3.02166 1.7009,-1.70084 4.9235,-0.14637 4.4793,2.16069 -0.4949,2.5697 -4.0721,3.18993 -4.9658,0.86097 z m 4.0588,-1.18978 c 0,-0.2707 -0.7831,-0.49229 -1.7404,-0.49229 -0.9572,0 -1.4248,0.51067 -1.0391,1.13464 0.6372,1.03097 2.7795,0.53593 2.7795,-0.64235 z m -210.7668,0.40082 c -3.01776,-3.01767 -0.81185,-7.46284 2.90016,-5.84401 1.04508,0.45577 2.86381,0.70561 4.04161,0.55516 1.74597,-0.22308 1.50408,0.36383 -1.30955,3.17751 -3.93904,3.93901 -3.84126,3.90234 -5.63222,2.11134 z m 333.7683,-0.0906 c -1.5647,-1.88553 0.3168,-4.15179 3.447,-4.15179 1.5235,0 1.9908,0.67512 1.7303,2.50028 -0.416,2.91642 -3.3505,3.85246 -5.1773,1.65151 z m 188.0702,-0.20886 c -0.7158,-1.86528 0.9473,-3.30385 2.6227,-2.26844 1.669,1.03152 1.3462,3.90719 -0.4388,3.90719 -0.8552,0 -1.838,-0.73743 -2.1839,-1.63875 z m -155.2611,-1.23184 c -2.5345,-2.53453 -2.2562,-6.06014 0.4784,-6.06014 1.2927,0 2.2327,0.74416 2.2327,1.76755 0,0.97216 0.6279,1.5582 1.3954,1.30236 2.3259,-0.77528 1.7059,-4.79765 -0.6765,-4.38933 -1.3131,0.22519 -1.8949,-0.18367 -1.5885,-1.11627 0.266,-0.80937 1.765,-1.6246 3.3312,-1.81164 5.3011,-0.63312 5.1569,8.06304 -0.181,10.9198 -2.7646,1.47947 -2.9187,1.46055 -4.9917,-0.61233 z m -101.6165,-1.30601 c -1.0789,-2.81164 3.6407,-6.5644 5.685,-4.52022 0.8179,0.81788 1.1672,2.5493 0.7985,3.95895 -0.7982,3.05247 -5.3754,3.44874 -6.4835,0.56127 z m 4.6934,-1.68427 c -0.5268,-1.58034 -2.322,-1.40667 -2.8839,0.27914 -0.2047,0.61398 0.4651,1.11629 1.4884,1.11629 1.0234,0 1.6513,-0.6279 1.3955,-1.39543 z m 226.9231,0.0516 c -1.1963,-1.96701 -2.068,-3.6658 -1.9372,-3.77489 0.1307,-0.10916 1.8703,0.0501 3.8659,0.35405 3.1277,0.47643 3.6281,0.99704 3.6281,3.77497 0,4.37892 -2.7865,4.20136 -5.5568,-0.35413 z m 14.5999,1.55352 c -0.9777,-1.82671 -0.7718,-2.30151 1.2245,-2.82352 1.3198,-0.34522 2.8149,-0.37102 3.3224,-0.057 0.9324,0.57627 1.3188,3.78746 0.4557,3.78746 -0.2568,0 -1.223,0.2901 -2.1471,0.64478 -1.0013,0.38416 -2.1551,-0.24263 -2.8555,-1.55133 z M 879.99348,839.3684 c 0,-0.97225 0.7954,-1.76754 1.76755,-1.76754 0.97216,0 1.5687,0.59645 1.32567,1.3256 -0.69,2.06998 -3.09322,2.41325 -3.09322,0.44194 z m 451.61122,0.54225 c -0.3532,-0.57158 -0.1317,-1.35475 0.4923,-1.74047 1.3322,-0.82337 3.3672,0.22175 3.3672,1.72923 0,1.35835 -3.0215,1.36718 -3.8595,0.011 z m -441.47277,-1.64178 c -2.27035,-2.73548 -0.43324,-6.24984 3.26709,-6.24984 1.76436,0 3.51841,-0.50238 3.89789,-1.11634 0.37946,-0.61406 1.22415,-1.11644 1.87709,-1.11644 0.70008,0 0.55855,0.76027 -0.34496,1.85292 -0.84267,1.01909 -1.53213,3.15406 -1.53213,4.74448 0,2.27916 -0.61135,2.96271 -2.88644,3.22715 -1.58754,0.18454 -3.51288,-0.41934 -4.27854,-1.34193 z m 4.3741,-2.34265 c 0,-0.92094 -0.75354,-1.67448 -1.67454,-1.67448 -1.74325,0 -2.21479,1.32028 -0.93028,2.60474 1.28451,1.28455 2.60482,0.81304 2.60482,-0.93026 z m 40.97143,3.2016 c -0.43057,-0.43054 -0.78283,-1.99 -0.78283,-3.46534 0,-2.14325 0.50488,-2.61076 2.51178,-2.32575 1.83566,0.2607 2.51179,1.10384 2.51179,3.13238 0,2.69443 -2.58462,4.31482 -4.24074,2.65871 z m 412.36074,-0.76317 c -0.6657,-0.66573 -1.2105,-2.28908 -1.2105,-3.60748 0,-1.35335 -1.0936,-2.9674 -2.5117,-3.70717 -2.3745,-1.2385 -2.3381,-1.27571 0.6649,-0.68067 1.7472,0.34617 3.8581,0.0641 4.6909,-0.62717 1.8535,-1.53829 5.6463,-0.48128 6.5292,1.81961 1.4792,3.85496 -5.3877,9.57793 -8.1628,6.80288 z m 4.7676,-2.53085 c 2.0148,-0.77316 1.1585,-3.81477 -1.0739,-3.81477 -0.8554,0 -1.5551,1.0047 -1.5551,2.23271 0,2.4471 0.1459,2.53491 2.629,1.58206 z m -445.0686,2.0491 c -1.07986,-1.81288 -0.0516,-6.41098 1.36502,-6.10384 0.80724,0.175 2.26244,-0.32739 3.23375,-1.11635 1.51235,-1.22856 1.65583,-1.14083 0.99885,0.61037 -0.42197,1.12472 -0.76719,2.73963 -0.76719,3.5888 0,1.75713 -4.06789,4.30112 -4.83043,3.02102 z m 487.1328,-1.32511 c -1.6299,-3.04575 -1.4454,-4.03089 0.798,-4.25905 1.0745,-0.10924 3.1939,-0.34249 4.7097,-0.51835 1.9177,-0.22237 2.8795,0.29096 3.1621,1.68771 0.9574,4.73165 -6.3897,7.34999 -8.6698,3.08969 z m -410.46531,0.1886 c -0.70613,-0.4511 -1.45966,-1.82494 -1.67452,-3.05286 -0.57615,-3.29269 5.13328,-3.79507 6.84215,-0.60209 0.68366,1.27751 0.939,2.81469 0.56737,3.41599 -0.79217,1.28181 -3.89991,1.41129 -5.735,0.23896 z m -32.63302,-1.2969 c -2.23161,-1.37924 -0.99686,-5.05803 1.83323,-5.46181 1.85563,-0.26468 2.50038,0.20376 2.50038,1.81695 0,2.78099 -2.42765,4.82283 -4.33361,3.64486 z m 357.92533,-0.36054 c -0.2915,-0.76754 -0.2882,-3.02815 0.011,-5.02354 0.4285,-2.89375 1.0604,-3.62821 3.1218,-3.62821 5.3161,0 8.2321,6.59106 3.9336,8.89164 -2.9392,1.57299 -6.419,1.45484 -7.0627,-0.23989 z m 5.3697,-5.21378 c -1.1231,-1.8172 -2.8458,-0.33483 -2.8458,2.44889 0,2.21691 0.1421,2.26406 1.8066,0.59951 0.9937,-0.99368 1.4613,-2.3654 1.0392,-3.0484 z m -314.92572,3.16289 c -0.41254,-0.66746 -0.24436,-1.71929 0.37372,-2.33733 1.6485,-1.64853 5.1839,-0.63491 5.6163,1.61021 0.275,1.42803 -0.3679,1.94082 -2.4331,1.94082 -1.5438,0 -3.1444,-0.54618 -3.55692,-1.2137 z m 181.91402,-1.62289 c -0.8662,-3.4507 1.3658,-5.59981 3.7557,-3.61631 2.0054,1.66433 1.2836,5.78365 -1.0929,6.23654 -1.2946,0.24661 -2.1562,-0.60114 -2.6628,-2.62023 z m 2.902,-0.57845 c 0,-0.65018 -0.5024,-0.8717 -1.1163,-0.4923 -0.614,0.37954 -1.1164,0.91156 -1.1164,1.18234 0,0.2707 0.5024,0.49229 1.1164,0.49229 0.6139,0 1.1163,-0.53201 1.1163,-1.18233 z m -70.051,1.55922 c -0.7675,-0.30964 -1.3954,-1.777 -1.3954,-3.26077 0,-2.12331 0.586,-2.69795 2.7516,-2.69795 2.8434,0 5.7287,3.60138 4.4905,5.60483 -0.7077,1.14504 -3.4716,1.3123 -5.8467,0.35389 z m 161.7818,-1.21417 c -1.1143,-2.16663 -0.509,-4.86615 1.3728,-6.12285 2.044,-1.36515 2.8925,-0.98115 4.2069,1.90344 2.1357,4.68747 -3.2459,8.75715 -5.5797,4.21941 z m -411.60455,-2.63656 c -0.47078,-1.48324 -0.112,-2.99328 0.96773,-4.07304 1.44573,-1.4457 2.2485,-1.4952 5.09894,-0.31457 2.97094,1.23059 3.18386,1.60051 1.7479,3.03652 -0.89933,0.89921 -1.63513,2.10157 -1.63513,2.67168 0,0.57017 -1.22205,1.03666 -2.71565,1.03666 -1.78301,0 -2.97259,-0.80959 -3.46379,-2.35725 z m 521.40725,0.55547 c -0.9388,-0.9387 -1.7068,-2.36289 -1.7068,-3.16483 0,-0.80202 -0.7481,-2.07898 -1.6623,-2.83768 -2.3314,-1.93494 -1.3512,-2.88123 2.94,-2.83806 2.7165,0.0273 4.0177,0.71828 4.9781,2.64305 2.4747,4.9599 -1.0224,9.72416 -4.549,6.19752 z m 2.7586,-3.22183 c 0,-0.92103 -0.5024,-1.67457 -1.1164,-1.67457 -0.614,0 -1.1163,0.75354 -1.1163,1.67457 0,0.92095 0.5023,1.67448 1.1163,1.67448 0.614,0 1.1164,-0.75353 1.1164,-1.67448 z m -92.2284,2.29791 c -1.21,-3.15318 0.08,-5.64697 2.9203,-5.64697 3.339,0 4.213,2.8839 1.6506,5.44625 -2.2379,2.23787 -3.7635,2.3048 -4.5709,0.20072 z m 70.734,0.21386 c -1.0047,-0.76753 -2.1599,-2.77692 -2.5671,-4.46541 -0.6778,-2.81093 -0.4684,-3.06998 2.4814,-3.06998 3.7643,0 8.1838,2.76199 8.1838,5.11448 0,0.90147 -1.2886,2.12886 -2.8635,2.72765 -3.5115,1.33498 -3.0499,1.36212 -5.2346,-0.30674 z m 4.251,-2.05091 c 1.1505,-1.86136 -1.4369,-3.99593 -2.9769,-2.45594 -1.2882,1.28814 -0.482,3.66956 1.2423,3.66956 0.5415,0 1.3221,-0.54608 1.7346,-1.21362 z m -517.44768,0.70443 c -0.74203,-0.89413 -1.04184,-2.12291 -0.66625,-2.73062 0.79723,-1.28995 9.55645,-1.17257 9.55645,0.128 0,0.48354 -0.69202,0.87912 -1.53782,0.87912 -0.84581,0 -2.16321,0.75353 -2.92757,1.67456 -1.7407,2.09735 -2.71576,2.10814 -4.42481,0.0493 z m 24.92282,-0.0493 c -1.12781,-2.93902 0.42911,-4.7462 4.49807,-5.22121 3.75109,-0.43796 3.92174,-0.31418 3.28044,2.37962 -0.37206,1.56283 -0.88783,3.21839 -1.14617,3.67887 -0.85173,1.5181 -5.97676,0.87113 -6.63234,-0.83728 z m 4.61985,-1.67457 c -0.37945,-0.61396 -1.16265,-1.11635 -1.74041,-1.11635 -0.57774,0 -1.05046,0.50239 -1.05046,1.11635 0,0.61396 0.78318,1.11635 1.74042,1.11635 0.95723,0 1.42993,-0.50239 1.05045,-1.11635 z m 261.50501,2.51384 c -2.8101,-0.63984 -2.558,-5.52052 0.3327,-6.43795 2.5053,-0.79514 5.5281,1.0986 5.5281,3.46345 0,1.88913 -3.2914,3.55962 -5.8608,2.9745 z m 3.6281,-3.15379 c 0,-1.03957 -0.7595,-1.60913 -1.8611,-1.39534 -2.8007,0.54304 -3.1852,3.15169 -0.4646,3.15169 1.3712,0 2.3257,-0.72079 2.3257,-1.75635 z m 179.3602,3.2449 c -1.4164,-1.41646 -0.7367,-4.91048 1.0917,-5.61218 2.1703,-0.83283 4.9996,2.4665 4.1079,4.7903 -0.6208,1.61756 -3.8876,2.13387 -5.1996,0.82188 z m -295.2446,-2.83541 c -2.0512,-2.05122 -1.5832,-5.13841 0.9876,-6.5142 3.15,-1.68583 5.7319,-0.50286 5.2937,2.42544 -0.491,3.28251 -4.4866,5.88343 -6.2813,4.08876 z m 4.2494,-3.7426 c 0,-0.95723 -0.5024,-1.4299 -1.1163,-1.05043 -0.614,0.37946 -1.1164,1.16263 -1.1164,1.7404 0,0.57776 0.5024,1.05044 1.1164,1.05044 0.6139,0 1.1163,-0.78318 1.1163,-1.74041 z m 361.6974,3.9731 c 0,-0.61396 0.7535,-1.11634 1.6746,-1.11634 0.9209,0 1.6745,0.50238 1.6745,1.11634 0,0.61397 -0.7536,1.11636 -1.6745,1.11636 -0.9211,0 -1.6746,-0.50239 -1.6746,-1.11636 z m -50.3054,-2.36289 c -1.0138,-1.8942 -0.8974,-2.72469 0.5871,-4.18633 1.714,-1.68778 1.9679,-1.66668 3.4148,0.28446 1.1197,1.50989 1.2475,2.69739 0.4506,4.18633 -1.4562,2.72102 -2.8932,2.62923 -4.4525,-0.28446 z m -420.86073,-1.62437 c -1.33536,-1.60903 -1.1883,-2.13167 1.12745,-4.0068 2.41641,-1.95669 2.82494,-1.99461 4.41027,-0.40926 1.33482,1.33482 1.45992,2.20322 0.5301,3.67989 -1.66652,2.64626 -4.22496,2.95668 -6.06782,0.73617 z m 291.79423,-0.0329 c -0.3772,-0.98303 0.015,-2.23121 0.8723,-2.77379 2.5117,-1.59044 3.2326,-1.19564 3.2326,1.77005 0,3.16208 -2.9955,3.8946 -4.1049,1.00374 z m 187.9609,1.07327 c -1.0334,-1.03331 0.2111,-2.63516 2.0471,-2.63516 0.9402,0 1.315,0.6741 0.931,1.67449 -0.6813,1.77567 -1.8016,2.13707 -2.9781,0.96067 z m -505.36472,-2.51573 c 0,-2.70163 2.79295,-3.80914 4.47988,-1.77646 1.63969,1.97569 0.50147,3.88977 -2.31307,3.88977 -1.38177,0 -2.16681,-0.76567 -2.16681,-2.11331 z m 193.12852,1.62101 c 0,-0.27079 0.5024,-0.80281 1.1163,-1.18227 0.614,-0.37939 1.1164,-0.15787 1.1164,0.4923 0,0.65024 -0.5024,1.18227 -1.1164,1.18227 -0.6139,0 -1.1163,-0.22152 -1.1163,-0.4923 z m -236.66617,-1.74033 c 0,-0.61396 0.75354,-1.11634 1.67453,-1.11634 0.92099,0 1.67451,0.50238 1.67451,1.11634 0,0.61397 -0.75352,1.11636 -1.67451,1.11636 -0.92099,0 -1.67453,-0.50239 -1.67453,-1.11636 z m 114.14677,0.37705 c -0.76747,-0.3098 -1.39542,-1.56275 -1.39542,-2.78466 0,-3.12004 3.80302,-2.20714 4.26394,1.02361 0.35501,2.48824 -0.20865,2.83432 -2.86852,1.76105 z m 157.3175,-2.23997 c 0.2165,-1.13575 1.5452,-2.2087 2.9895,-2.41404 2.0127,-0.28625 2.5116,0.0919 2.2098,1.6745 -0.2166,1.13574 -1.5452,2.20862 -2.9895,2.41402 -2.0126,0.28627 -2.5117,-0.092 -2.2098,-1.67448 z m 139.5235,0.4711 c -0.7081,-0.7081 -1.2873,-2.47618 -1.2873,-3.92917 0,-2.22339 0.4862,-2.58581 3.0699,-2.28852 2.1658,0.24911 3.1721,1.07068 3.4167,2.78943 0.4263,2.99398 -3.2256,5.40192 -5.1993,3.42826 z m 2.4109,-4.28713 c -1.4822,-1.48237 -3.1249,0.54814 -1.9637,2.42717 0.5402,0.87388 1.0898,0.87388 1.9637,0 0.874,-0.87395 0.874,-1.55328 0,-2.42717 z m -398.14188,3.81837 c -1.08931,-1.0893 -0.90912,-4.83752 0.23256,-4.83752 0.53724,0 2.49435,0.30346 4.34911,0.67449 3.31055,0.66212 3.33354,0.71319 1.25589,2.79083 -2.15772,2.1578 -4.50117,2.70859 -5.83756,1.3722 z m 430.78828,-2.85324 c -2.3691,-3.38229 -2.1827,-4.95661 0.6754,-5.70397 2.9067,-0.76018 6.5176,0.96896 6.5176,3.12113 0,1.72225 -2.9575,5.06397 -4.4818,5.06397 -0.5354,0 -1.7554,-1.11652 -2.7112,-2.48113 z m 3.8439,-2.54242 c 0,-0.92103 -0.4726,-1.67457 -1.0505,-1.67457 -1.4077,0 -2.4158,1.7433 -1.5239,2.63524 1.2572,1.25718 2.5744,0.76567 2.5744,-0.96067 z m 86.4602,1.15217 c -2.2042,-5.27525 -2.2319,-5.23224 3.1269,-4.84456 3.9807,0.28798 4.8032,0.75752 5.1093,2.91649 0.9037,6.37455 -5.7295,7.92728 -8.2362,1.92807 z m 5.0806,-0.65987 c 0,-0.65024 -0.5024,-0.87185 -1.1164,-0.4923 -0.6141,0.37939 -1.1163,0.91141 -1.1163,1.1822 0,0.27077 0.5022,0.49229 1.1163,0.49229 0.614,0 1.1164,-0.53202 1.1164,-1.18219 z m -546.63662,1.66534 c -1.04015,-2.71061 0.94914,-3.8946 4.67543,-2.78271 1.82726,0.54516 2.44317,1.03449 1.36868,1.08727 -1.07449,0.0524 -1.9536,0.84947 -1.9536,1.7705 0,2.21636 -3.23395,2.15709 -4.09051,-0.0751 z m 100.93385,0.54766 c -2.24574,-1.31245 -2.63397,-6.11487 -0.55817,-6.90462 2.83136,-1.07725 6.41903,1.24968 6.41903,4.16328 0,1.55485 -0.21011,2.82687 -0.46688,2.82687 -0.25678,0 -1.13591,0.23763 -1.95362,0.52812 -0.81771,0.29057 -2.36587,0.014 -3.44036,-0.61365 z m 3.62813,-3.88756 c 0,-0.27078 -0.50235,-0.49231 -1.11634,-0.49231 -0.61399,0 -1.11634,0.53203 -1.11634,1.18227 0,0.65017 0.50235,0.87169 1.11634,0.4923 0.61399,-0.37955 1.11634,-0.91149 1.11634,-1.18226 z m 147.83914,3.84831 c -0.9623,-1.55705 1.9436,-3.47902 3.2638,-2.15874 1.0739,1.07381 0.039,3.39989 -1.512,3.39989 -0.5416,0 -1.3298,-0.55854 -1.7518,-1.24115 z m 213.6305,-0.64721 c -0.846,-4.09908 0.4023,-7.17687 2.7669,-6.82251 3.2144,0.48175 5.0339,3.72203 3.4811,6.19902 -1.7265,2.754 -5.726,3.1531 -6.248,0.62349 z m -255.8341,-0.93892 c -1.3741,-3.58097 -0.7783,-5.15374 1.8131,-4.78576 1.8357,0.26077 2.5119,1.10399 2.5119,3.13238 0,3.21057 -3.2506,4.45313 -4.325,1.65338 z m 3.2086,-1.63805 c -0.3795,-0.61398 -1.1626,-1.11636 -1.7405,-1.11636 -0.5777,0 -1.0504,0.50238 -1.0504,1.11636 0,0.61396 0.7832,1.11635 1.7404,1.11635 0.9573,0 1.4299,-0.50239 1.0505,-1.11635 z m 310.0306,2.06021 c 0.5816,-1.74479 3.0114,-2.02831 3.3052,-0.38572 0.1099,0.61396 -0.7015,1.28994 -1.803,1.50207 -1.284,0.24732 -1.8232,-0.15342 -1.5022,-1.11635 z m -487.30753,-1.32364 c -0.89466,-2.33155 0.55166,-3.67153 4.80086,-4.44797 3.22053,-0.58856 3.60077,-0.47229 2.16351,0.66166 -0.95903,0.75659 -2.07357,2.25483 -2.47676,3.32927 -0.86576,2.30746 -3.66805,2.5927 -4.48761,0.45704 z m 24.05788,0.69457 c -1.95766,-0.70193 -1.74349,-4.71624 0.2933,-5.49777 1.71996,-0.66003 5.00938,1.34162 5.00938,3.04817 0,1.35108 -3.65615,3.03996 -5.30268,2.4496 z m 292.69695,-1.5371 c -1.0793,-1.74634 1.7839,-6.5949 3.8827,-6.57448 0.9707,0.01 2.4787,0.46876 3.3512,1.02103 1.3503,0.85465 1.305,1.43319 -0.3049,3.89015 -1.9412,2.96271 -5.5853,3.83744 -6.929,1.6633 z m 159.1457,-1.56806 c -1.8233,-1.94074 -2.1376,-2.79546 -1.0319,-2.80609 0.8745,-0.01 2.7203,-0.31824 4.1018,-0.68833 2.2115,-0.59269 2.5118,-0.25725 2.5118,2.80601 0,4.26547 -1.9906,4.511 -5.5817,0.68841 z m -363.1858,0.93025 c -1.3631,-1.36313 -0.7674,-5.6612 0.9863,-7.11668 1.4281,-1.18523 2.048,-1.11877 3.547,0.38025 1.4878,1.48785 1.583,2.32896 0.5261,4.64861 -1.2398,2.72111 -3.4954,3.65198 -5.0594,2.08782 z m 245.9691,-1.48839 c 0,-1.43999 0.7441,-2.2327 2.0959,-2.2327 2.3294,0 4.9949,2.58418 3.8482,3.73079 -1.1217,1.12174 -2.8133,0.87442 -2.0846,-0.30464 0.3533,-0.57159 0.1317,-1.35477 -0.4924,-1.74048 -0.6239,-0.38558 -1.1344,0.0816 -1.1344,1.03933 0,0.95723 -0.5024,1.74041 -1.1164,1.74041 -0.614,0 -1.1163,-1.00479 -1.1163,-2.23271 z m -392.69938,-1.32567 c 0.68998,-2.06998 3.09321,-2.41333 3.09321,-0.44187 0,0.9721 -0.79539,1.76754 -1.76755,1.76754 -0.97217,0 -1.5687,-0.59661 -1.32566,-1.32567 z m 8.68677,-0.33467 c -2.27703,-2.7436 -0.53264,-4.98937 3.75042,-4.82837 l 3.85702,0.14505 -2.34503,3.17179 c -2.68142,3.62679 -3.34799,3.81828 -5.26241,1.51153 z m 68.07713,-0.0243 c -1.05392,-1.26992 -1.12139,-2.0975 -0.2426,-2.97631 1.69356,-1.69356 4.9588,-0.21018 4.51982,2.05325 -0.5013,2.58488 -2.53394,3.02354 -4.27722,0.92306 z m 450.76678,-2.12659 -1.9216,-2.66354 3.9382,0 c 3.3863,0 3.8902,0.33474 3.5961,2.38869 -0.4754,3.31941 -3.3161,3.45852 -5.6127,0.27485 z m 27.3185,0.94855 c -2.1753,-2.35148 -1.6707,-3.25765 1.9558,-3.51138 2.2615,-0.15827 3.3468,0.28156 3.3468,1.35608 0,2.46987 -3.6422,3.9502 -5.3026,2.1553 z m -526.2866,-1.32359 c -1.06929,-4.47229 2.05655,-8.07337 4.11576,-4.74143 0.45364,0.73392 1.53327,0.67809 3.13585,-0.1624 2.31657,-1.21503 2.351,-1.17156 0.66012,0.83423 -0.98117,1.16374 -2.09571,2.99516 -2.47677,4.0696 -0.38104,1.07443 -1.65472,1.95356 -2.83034,1.95356 -1.17566,0 -2.34774,-0.87913 -2.60462,-1.95356 z m 3.55572,-1.32959 c 0,-0.57768 -0.50236,-1.36086 -1.11634,-1.74039 -0.61399,-0.37948 -1.11635,0.0932 -1.11635,1.05042 0,0.95732 0.50236,1.74042 1.11635,1.74042 0.61398,0 1.11634,-0.4726 1.11634,-1.05045 z m 201.02158,0.0806 c -1.2806,-2.39268 -0.563,-3.49583 2.2743,-3.49583 2.4574,0 3.4487,1.47706 2.5548,3.80658 -0.9227,2.40456 -3.4634,2.24114 -4.8291,-0.31075 z m 30.5777,-1.46055 c -0.596,-2.71351 -0.3185,-3.88335 1.1818,-4.98038 4.1538,-3.0373 8.4861,3.4794 4.7781,7.18728 -2.5012,2.50129 -5.1405,1.52405 -5.9599,-2.2069 z m 4.8925,-0.29267 c 0.4909,-2.53234 -1.6586,-4.82158 -3.1381,-3.34202 -1.4058,1.4059 -0.1304,6.28213 1.501,5.73892 0.6894,-0.22949 1.4261,-1.30816 1.6371,-2.3969 z m 211.2627,2.2829 c -1.6259,-1.95911 1.3448,-5.37487 3.8414,-4.41677 1.9882,0.76292 2.1222,2.81383 0.3026,4.63344 -1.7323,1.73219 -2.5626,1.68879 -4.144,-0.21667 z m -48.6388,-2.88632 c -2.4873,-2.74861 -1.4879,-4.13887 3.7248,-5.1814 3.625,-0.72501 3.6706,-0.68303 3.3142,3.04902 -0.4399,4.60467 -3.8631,5.64165 -7.039,2.13238 z m 5.003,-2.25553 c 0,-0.61404 -0.5024,-1.11635 -1.1164,-1.11635 -0.614,0 -1.1163,0.50231 -1.1163,1.11635 0,0.61397 0.5023,1.11634 1.1163,1.11634 0.614,0 1.1164,-0.50237 1.1164,-1.11634 z m -102.7042,1.63946 c 0,-1.80554 1.7444,-2.21629 2.7186,-0.64009 0.3397,0.5497 -0.133,1.28744 -1.0505,1.63946 -1.0133,0.38885 -1.6681,0 -1.6681,-0.99937 z m 174.339,-0.70288 c 0.2034,-1.43615 1.1233,-2.61107 2.0443,-2.61107 2.421,0 2.0875,4.35524 -0.3697,4.82845 -1.5854,0.30534 -1.9613,-0.19258 -1.6746,-2.21738 z m -489.625,-0.56469 c -0.97226,-2.53366 0.17269,-3.31528 6.05708,-4.13466 4.6195,-0.6432 4.84925,-0.56493 2.85658,0.97366 -1.19183,0.92017 -2.57332,1.67308 -3.06996,1.67308 -0.49664,0 -0.90297,0.75354 -0.90297,1.67457 0,2.28196 -4.05218,2.12894 -4.94073,-0.18665 z m 30.0586,0.74479 c -0.37947,-0.61396 0.0636,-1.11636 0.98458,-1.11636 0.921,0 1.985,0.5024 2.36446,1.11636 0.37948,0.61404 -0.0636,1.11634 -0.98459,1.11634 -0.92098,0 -1.985,-0.5023 -2.36445,-1.11634 z m 258.8331,-0.57276 c -0.4227,-1.10143 0.1605,-2.71468 1.4461,-4.00025 1.9211,-1.92103 2.3913,-1.9785 4.3414,-0.53061 1.7488,1.29847 1.9405,2.02847 0.9567,3.64282 -1.6451,2.69959 -5.8373,3.25147 -6.7442,0.88804 z m 187.7594,0.19109 c -2.8307,-2.06982 -1.4948,-5.20009 2.2193,-5.20009 2.4872,0 2.8497,0.42473 2.5468,2.9839 -0.4234,3.57667 -1.9407,4.2822 -4.7661,2.21619 z m -498.17444,-0.55883 c -0.62907,-0.4037 -1.49727,-1.86668 -1.92937,-3.25132 -1.00219,-3.2112 1.80161,-4.48996 5.50238,-2.50934 2.2111,1.18335 2.42706,1.74172 1.34413,3.47579 -1.53282,2.45447 -3.34252,3.29535 -4.91714,2.28487 z m 63.30361,-1.29221 c 0,-0.61397 0.75353,-1.11636 1.67453,-1.11636 0.92098,0 1.67453,0.50239 1.67453,1.11636 0,0.61404 -0.75355,1.11635 -1.67453,1.11635 -0.921,0 -1.67453,-0.50231 -1.67453,-1.11635 z m 24.55971,0 c 0,-0.61397 0.50235,-1.11636 1.11635,-1.11636 0.61398,0 1.11634,0.50239 1.11634,1.11636 0,0.61404 -0.50236,1.11635 -1.11634,1.11635 -0.614,0 -1.11635,-0.50231 -1.11635,-1.11635 z m 38.62987,-0.65885 c -0.90733,-2.36445 0.10611,-3.80655 2.67509,-3.80655 1.1555,0 2.38337,0.45703 2.7286,1.01571 1.06714,1.72664 -0.62965,4.56604 -2.7286,4.56604 -1.09661,0 -2.3004,-0.79889 -2.67509,-1.7752 z m 3.79142,-1.08155 c 0,-0.27079 -0.50236,-0.4923 -1.11633,-0.4923 -0.614,0 -1.11638,0.53201 -1.11638,1.18226 0,0.65034 0.50238,0.87185 1.11638,0.4923 0.61397,-0.37947 1.11633,-0.91149 1.11633,-1.18226 z m 321.10633,0.96583 c -1.2572,-1.25718 -0.7657,-2.57448 0.9606,-2.57448 0.921,0 1.6745,0.47275 1.6745,1.05051 0,1.4077 -1.7432,2.41591 -2.6351,1.52397 z m 100.0367,0.0352 c -2.1876,-0.88279 -1.6335,-2.60981 0.8372,-2.60981 1.2405,0 2.2327,0.74431 2.2327,1.67464 0,1.72015 -0.6407,1.9154 -3.0699,0.93517 z M 861.40076,795.6893 c -0.91346,-2.38049 -0.17997,-2.8448 5.08607,-3.21998 4.78761,-0.34091 6.17702,0.93488 2.34315,2.1517 -1.22798,0.3898 -2.2327,1.17719 -2.2327,1.74979 0,1.74698 -4.49063,1.15795 -5.19652,-0.68151 z m 369.16584,-1.55299 c -1.5573,-2.90984 -1.4977,-3.16085 1.0771,-4.53883 3.139,-1.67988 6.6981,0.41716 6.6981,3.94652 0,2.30589 -0.5362,2.75152 -3.3098,2.75152 -2.1297,0 -3.7218,-0.76974 -4.4654,-2.15921 z m 5.8377,0.37556 c 1.2496,-1.24944 -0.5269,-3.79804 -2.6474,-3.79804 -2.3526,0 -2.9008,2.84518 -0.7177,3.72602 2.0083,0.81046 2.6138,0.82337 3.3651,0.072 z m 89.6806,0.96302 c -1.397,-1.39699 -0.6093,-6.7774 1.0876,-7.42844 3.0331,-1.16396 6.1017,1.241 5.0863,3.98617 -0.8966,2.42366 -4.9389,4.6773 -6.1739,3.44227 z m -433.02024,-2.1091 c -0.43524,-0.4353 -0.79134,-1.93995 -0.79134,-3.34373 0,-1.99852 0.90848,-2.8046 4.18632,-3.715 5.67167,-1.57511 6.83759,-1.42045 4.21857,0.55954 -1.21027,0.91485 -2.21498,2.78279 -2.23271,4.15076 -0.0321,2.47886 -3.66487,4.06436 -5.38084,2.34843 z m 27.49232,-1.05246 c -0.9915,-2.58379 1.2025,-4.29237 2.89428,-2.2539 1.43019,1.72328 0.78237,4.00336 -1.13741,4.00336 -0.59702,0 -1.38762,-0.78724 -1.75687,-1.74946 z m 145.30772,0.63147 c -0.4221,-0.68278 -0.4593,-2.46892 -0.083,-3.96904 0.7933,-3.16053 4.7769,-3.77121 5.8783,-0.90109 1.353,3.52608 -3.8986,7.93925 -5.7955,4.87013 z m 4.2701,-2.68003 c 0.6303,-1.64251 -0.092,-2.9 -1.6642,-2.9 -0.5117,0 -0.9303,1.00477 -0.9303,2.23269 0,2.55971 1.7004,2.99704 2.5945,0.66731 z m 241.8861,2.68176 c 0,-0.61396 0.7536,-1.11636 1.6745,-1.11636 0.921,0 1.6746,0.5024 1.6746,1.11636 0,0.61404 -0.7536,1.11626 -1.6746,1.11626 -0.9209,0 -1.6745,-0.50222 -1.6745,-1.11626 z m 67.7253,0.37211 c -0.4095,-0.40933 -0.7443,-1.66527 -0.7443,-2.79085 0,-1.51301 0.8421,-2.04667 3.2296,-2.04667 3.4918,0 5.177,2.31035 3.158,4.32934 -1.3857,1.38566 -4.4866,1.66496 -5.6433,0.50818 z m -111.2629,-1.92721 c 0,-1.56853 3.2103,-3.42107 4.2048,-2.42662 0.295,0.29495 0.2389,1.3116 -0.1247,2.25898 -0.8236,2.14638 -4.0801,2.28017 -4.0801,0.16764 z m 141.4973,-0.87989 c -2.3024,-1.12645 -4.1863,-2.21784 -4.1863,-2.4253 0,-0.2076 2.2605,-0.32918 5.0233,-0.2703 3.9308,0.0834 5.0234,0.51755 5.0236,1.99475 4e-4,2.81712 -1.2332,2.96467 -5.8606,0.70085 z m -371.2538,-2.86764 c 0.3165,-3.824 0.6613,-4.21667 3.9824,-4.53671 4.4812,-0.43194 5.7596,1.972 3.1593,5.94066 -1.1503,1.75549 -2.8684,2.78231 -4.6556,2.78231 -2.5904,0 -2.8029,-0.35773 -2.4861,-4.18626 z m 4.9849,0.23083 c 0.3635,-0.94738 0.36,-2.0237 -0.011,-2.39175 -0.9653,-0.96529 -4.165,1.94472 -3.4358,3.12465 0.9529,1.54163 2.7149,1.1667 3.4439,-0.7329 z m 323.3434,1.82947 -2.4577,-2.0517 2.5296,-2.37657 c 3.1608,-2.96936 5.9306,-3.04474 6.8379,-0.18602 0.8111,2.55563 -1.1293,6.75699 -3.0958,6.70311 -0.7459,-0.0212 -2.4622,-0.96044 -3.814,-2.08882 z m 4.1323,-2.9635 c 0,-0.95723 -0.5105,-1.42482 -1.1346,-1.03917 -0.624,0.38564 -0.8455,1.16874 -0.4922,1.74041 0.9569,1.54836 1.6268,1.25959 1.6268,-0.70124 z m -412.64572,2.29854 c -1.06874,-2.78505 0.47684,-5.02354 3.46849,-5.02354 2.39566,0 2.82591,0.5099 2.82591,3.34906 0,2.83916 -0.43025,3.34905 -2.82591,3.34905 -1.55426,0 -3.11508,-0.75354 -3.46849,-1.67457 z m 4.0617,-1.67448 c 0,-0.61397 -0.50235,-1.11635 -1.11635,-1.11635 -0.614,0 -1.11634,0.50238 -1.11634,1.11635 0,0.61396 0.50234,1.11635 1.11634,1.11635 0.614,0 1.11635,-0.50239 1.11635,-1.11635 z m -104.93689,0.4923 c 0,-0.95724 0.50236,-1.42991 1.11634,-1.05052 0.61399,0.37947 1.11636,1.16272 1.11636,1.7404 0,0.57785 -0.50237,1.05051 -1.11636,1.05051 -0.61398,0 -1.11634,-0.78317 -1.11634,-1.74039 z m 534.73161,-4.77161 -3.9072,-4.09329 5.5817,0 c 4.9783,0 5.6212,0.27821 5.9465,2.57324 0.3449,2.43247 -1.4907,5.90851 -3.0132,5.70631 -0.3854,-0.0508 -2.4588,-1.93503 -4.6078,-4.18626 z m 5.5818,-0.1861 c 0,-0.61396 -0.5024,-1.11635 -1.1164,-1.11635 -0.614,0 -1.1163,0.50239 -1.1163,1.11635 0,0.61396 0.5023,1.11635 1.1163,1.11635 0.614,0 1.1164,-0.50239 1.1164,-1.11635 z m -547.01151,2.23269 c 0,-0.61396 0.75353,-1.11634 1.67453,-1.11634 0.92097,0 1.67451,0.50238 1.67451,1.11634 0,0.61398 -0.75354,1.11637 -1.67451,1.11637 -0.921,0 -1.67453,-0.50239 -1.67453,-1.11637 z m 23.81824,-0.63319 c -0.93735,-2.44273 0.86534,-3.88272 3.87529,-3.09564 2.40444,0.62875 2.4382,0.77285 0.645,2.75441 -2.30763,2.54977 -3.63432,2.65002 -4.52029,0.34123 z m 31.99925,-0.4055 c 0,-1.73775 0.71205,-2.31035 2.87272,-2.31035 3.66423,0 3.33812,3.73462 -0.37235,4.2639 -1.89907,0.27094 -2.50037,-0.19885 -2.50037,-1.95355 z m 243.08522,1.3198 c -2.4823,-0.56517 -2.6009,-5.5583 -0.2131,-8.96748 2.5497,-3.64025 6.0739,-1.51498 6.0739,3.66284 0,4.0681 -2.2695,6.12239 -5.8608,5.30464 z m 4.4718,-4.18829 c 0.157,-1.22801 -0.1815,-2.95394 -0.7522,-3.83549 -1.4835,-2.29127 -4.5569,0.44014 -4.5569,4.04973 0,2.19455 0.494,2.66176 2.5118,2.37518 1.5203,-0.21596 2.6244,-1.2381 2.7973,-2.58942 z m 54.9737,3.9731 c 0,-0.57776 0.5024,-1.36101 1.1164,-1.74039 0.6141,-0.37948 1.1164,0.0932 1.1164,1.05043 0,0.95723 -0.5023,1.74041 -1.1164,1.74041 -0.614,0 -1.1164,-0.47269 -1.1164,-1.05045 z m 101.8252,-0.27523 c -1.7711,-1.77114 -1.743,-5.37713 0.042,-5.35531 2.5165,0.0304 4.4133,1.88717 4.017,3.93143 -0.4921,2.5389 -2.3072,3.17571 -4.0589,1.42388 z M 864.36458,784.0157 c 0,-0.61396 0.47271,-1.11635 1.05047,-1.11635 0.57776,0 1.36094,0.50239 1.74041,1.11635 0.37946,0.61397 -0.0932,1.11634 -1.05046,1.11634 -0.95723,0 -1.74042,-0.50237 -1.74042,-1.11634 z m 224.81052,-0.50473 c -0.9223,-2.40332 0.4731,-3.96067 3.549,-3.96067 2.9122,0 3.5807,2.04683 1.3853,4.24216 -1.8211,1.8211 -4.179,1.68661 -4.9343,-0.28149 z m 4.0412,-1.72797 c 0,-0.61397 -0.7536,-1.11636 -1.6745,-1.11636 -0.921,0 -1.6746,0.50239 -1.6746,1.11636 0,0.61396 0.7536,1.11635 1.6746,1.11635 0.9209,0 1.6745,-0.50239 1.6745,-1.11635 z m -249.31813,1.48846 c -2.06474,-2.06474 -0.47253,-3.57745 3.70469,-3.51974 l 4.44896,0.0617 -2.67142,2.10135 c -2.82327,2.22073 -4.26231,2.57698 -5.48223,1.3571 z m 139.91585,-0.93025 c 0,-0.93026 0.99231,-1.67457 2.23271,-1.67457 1.24038,0 2.23269,0.74431 2.23269,1.67457 0,0.93025 -0.99231,1.67449 -2.23269,1.67449 -1.2404,0 -2.23271,-0.74424 -2.23271,-1.67449 z m 273.19778,0.40809 c -2.508,-1.40363 -2.4541,-4.60662 0.1168,-6.93316 2.47,-2.23536 3.6089,-2.30158 6.259,-0.36375 1.6733,1.22355 1.8042,1.90437 0.746,3.88162 -1.7739,3.31458 -4.7507,4.74205 -7.1218,3.41529 z m 4.9731,-4.8735 c -0.2938,-1.64258 -2.7237,-1.35906 -3.3053,0.38565 -0.321,0.96302 0.2181,1.36367 1.5022,1.11635 1.1014,-0.21205 1.9129,-0.88803 1.8031,-1.502 z m 91.3556,2.8183 c -1.01,-1.88749 -0.7626,-2.31005 1.717,-2.93237 3.697,-0.92791 5.8934,1.00109 3.8894,3.41582 -1.9533,2.35359 -4.1914,2.16054 -5.6064,-0.48345 z m -469.25373,0.34466 c -1.28453,-1.28455 -0.81296,-2.60482 0.93028,-2.60482 0.92099,0 1.67453,0.75355 1.67453,1.67457 0,1.74322 -1.32031,2.21471 -2.60481,0.93025 z m 529.13193,-1.59457 c -1.1014,-1.28634 -1.841,-2.43327 -1.6436,-2.54876 5.235,-3.06115 6.5212,-3.2528 8.685,-1.2947 1.7026,1.54085 1.9515,2.47658 1.0879,4.09008 -1.4895,2.78302 -5.6432,2.65705 -8.1293,-0.24662 z m -480.47769,-0.6332 c -1.61295,-0.6508 -1.89112,-5.52069 -0.36908,-6.46127 1.52937,-0.94526 4.77997,2.77239 4.06142,4.64494 -0.3423,0.89201 -0.62237,1.83197 -0.62237,2.08882 0,0.57823 -1.23264,0.46892 -3.06997,-0.27249 z m 178.33689,-1.27908 c 0,-2.89764 3.0387,-5.43655 4.6174,-3.85793 1.8781,1.87819 0.6068,5.28627 -2.117,5.67489 -1.8556,0.26469 -2.5004,-0.20377 -2.5004,-1.81696 z m 3.3491,-0.83837 c 0,-0.95722 -0.5024,-1.42998 -1.1164,-1.05043 -0.614,0.37946 -1.1163,1.16264 -1.1163,1.74039 0,0.57769 0.5023,1.05044 1.1163,1.05044 0.614,0 1.1164,-0.78317 1.1164,-1.7404 z m -111.635,-2.16678 c 0,-3.76568 0.2194,-4.03028 3.0699,-3.70226 2.5884,0.29776 3.07,0.87857 3.07,3.70226 0,2.82367 -0.4816,3.4044 -3.07,3.70224 -2.8505,0.32802 -3.0699,0.0634 -3.0699,-3.70224 z m 4.4654,0 c 0,-0.92104 -0.7378,-1.6745 -1.6395,-1.6745 -0.9987,0 -1.3883,0.65439 -0.9969,1.6745 0.3534,0.92101 1.0912,1.67448 1.6395,1.67448 0.5483,0 0.9969,-0.75347 0.9969,-1.67448 z m -150.67176,0.8372 c 0.0792,-4.36079 5.37411,-7.73237 7.28574,-4.63931 0.41521,0.67183 1.96392,0.99038 3.44157,0.70796 1.47767,-0.2826 2.9555,-0.0789 3.28408,0.45296 0.32859,0.53171 -0.43693,0.96669 -1.70117,0.96669 -1.26421,0 -3.3033,1.00461 -4.53128,2.23263 -2.83779,2.83775 -7.8287,3.01689 -7.77894,0.27907 z m -9.83911,-3.80054 c 0.58156,-1.74478 3.01138,-2.02831 3.3052,-0.38573 0.10986,0.61397 -0.70156,1.28986 -1.80309,1.50209 -1.28401,0.24731 -1.8231,-0.15342 -1.50211,-1.11636 z m 329.07967,-0.26632 c 0,-0.85527 0.7536,-1.84425 1.6745,-2.1976 1.1391,-0.4371 1.6746,0.0595 1.6746,1.55501 0,1.20924 -0.7532,2.19775 -1.6746,2.19775 -0.9209,0 -1.6745,-0.69989 -1.6745,-1.55516 z m 52.0882,-0.0579 c -0.7233,-1.88491 2.0311,-4.4597 3.6804,-3.44038 1.7735,1.09602 1.3984,2.61772 -0.9559,3.87771 -1.5866,0.84909 -2.2731,0.73892 -2.7245,-0.43733 z m 91.5616,-0.39965 c -1.3772,-1.52177 -1.7572,-3.08452 -1.2458,-5.1226 0.9376,-3.73573 2.1126,-4.43242 4.9311,-2.92393 2.783,1.4894 2.8918,4.56127 0.2761,7.79156 -1.9628,2.42404 -1.9965,2.42622 -3.9614,0.25497 z m 3.7084,-4.19283 c 0,-0.88466 -0.4486,-1.60856 -0.9969,-1.60856 -1.2322,0 -2.4326,2.89648 -1.5613,3.76769 0.9771,0.97717 2.5582,-0.35726 2.5582,-2.15913 z m -483.37952,2.17923 c 0,-2.19517 0.43391,-2.74392 1.76584,-2.2327 0.9712,0.37266 3.35741,0.74595 5.30266,0.82962 2.48518,0.10686 2.81407,0.29266 1.10612,0.62522 -1.3369,0.26023 -3.03108,1.1965 -3.76483,2.08062 -2.1439,2.58331 -4.40979,1.91384 -4.40979,-1.30276 z m 110.71369,1.04731 c 0.47324,-2.45728 4.82852,-2.79085 4.82852,-0.36977 0,0.92102 -1.175,1.84095 -2.6111,2.04426 -2.02485,0.28673 -2.5227,-0.0888 -2.21742,-1.67449 z m 391.83353,-0.55947 c 0.2456,-1.73407 1.1126,-2.60115 2.6011,-2.60115 3.3246,0 2.9925,4.35782 -0.3684,4.83385 -2.1644,0.30659 -2.5393,-0.068 -2.2327,-2.2327 z m 41.9725,0.1897 c -0.7669,-1.22802 -2.4998,-2.23263 -3.8509,-2.23263 -1.351,0 -2.8154,-0.58081 -3.2541,-1.29064 -0.5701,-0.92266 0.2069,-1.0897 2.7251,-0.58605 1.9373,0.38744 3.5226,0.24857 3.5226,-0.30871 0,-0.55727 1.092,-1.35977 2.4267,-1.78349 4.3389,-1.37712 6.5637,4.9194 2.6783,7.57997 -1.8909,1.29471 -2.7531,1.01485 -4.2477,-1.37845 z m 3.6081,-2.79085 c 0,-0.92094 -0.5024,-1.67448 -1.1163,-1.67448 -0.614,0 -1.1164,0.75354 -1.1164,1.67448 0,0.92103 0.5024,1.6745 1.1164,1.6745 0.6139,0 1.1163,-0.75347 1.1163,-1.6745 z m -472.90409,2.29682 c -0.87579,-2.28228 1.46656,-5.08765 4.24796,-5.08765 3.32726,0 2.35254,6.01369 -1.05311,6.49723 -1.5166,0.21543 -2.78623,-0.34483 -3.19485,-1.40958 z m 4.58404,-2.87317 c -0.38566,-0.62405 -1.16884,-0.84558 -1.74041,-0.4923 -1.54843,0.95692 -1.2597,1.62687 0.7012,1.62687 0.95723,0 1.42485,-0.51059 1.03921,-1.13457 z m -26.17848,1.74627 c -1.81947,-2.19221 -1.03208,-5.52209 1.41739,-5.99375 4.22345,-0.81336 7.35499,5.44641 3.47039,6.93714 -2.60977,1.0014 -3.4004,0.84886 -4.88778,-0.94339 z m 3.51388,-2.49066 c -0.80589,-0.32246 -1.76872,-0.28282 -2.13969,0.088 -0.37094,0.37094 0.2884,0.63477 1.46522,0.58629 1.3005,-0.0531 1.56501,-0.31809 0.67447,-0.67441 z m 84.63329,0.89929 c 0,-3.28009 2.57528,-4.85582 5.01745,-3.07007 2.7572,2.01612 1.42091,5.16602 -2.19156,5.16602 -2.02025,0 -2.82589,-0.59747 -2.82589,-2.09595 z m 58.05016,-0.47166 c 0,-2.5149 1.8396,-5.24678 3.5331,-5.24678 1.4631,0 3.1908,4.21542 2.4834,6.05904 -0.3705,0.96545 -1.8758,1.75535 -3.345,1.75535 -2.0434,0 -2.6715,-0.60364 -2.6715,-2.56761 z m 4.4654,-1.40543 c 0,-1.64391 -1.3301,-2.13918 -2.5279,-0.94136 -1.0063,1.00626 0.3794,3.87781 1.5286,3.16766 0.5496,-0.33976 0.9993,-1.34156 0.9993,-2.2263 z m 86.7032,3.2288 c -1.6108,-1.61084 -0.6977,-4.83745 1.369,-4.83745 2.196,0 3.941,2.79765 2.8481,4.56605 -0.7338,1.18727 -3.146,1.34256 -4.2171,0.2714 z m 2.0467,-2.60474 c -0.3796,-0.61396 -0.9115,-1.11635 -1.1823,-1.11635 -0.2708,0 -0.4923,0.50239 -0.4923,1.11635 0,0.61397 0.532,1.11635 1.1822,1.11635 0.6503,0 0.8718,-0.50238 0.4924,-1.11635 z m 263.7838,-0.43343 c -1.8828,-2.62068 -1.862,-2.66409 1.6048,-3.35742 3.9756,-0.79522 5.7196,0.35601 5.1404,3.39316 -0.5853,3.06929 -4.5296,3.04841 -6.7452,-0.0352 z m 22.7403,0.37666 c -4.8477,-2.60294 -5.7656,-3.60381 -2.8637,-3.12245 1.2871,0.21353 3.1074,-0.24833 4.0448,-1.02651 2.3579,-1.95685 5.3366,-0.54406 5.3366,2.53116 0,3.4819 -2.0829,3.99899 -6.5177,1.6178 z m -546.96859,-0.16683 c -1.49121,-1.49113 -1.79822,-4.16726 -0.50237,-4.3787 3.8874,-0.6346 11.44259,-0.52286 11.44259,0.16922 0,0.47595 -1.50707,1.39073 -3.34905,2.03284 -1.84199,0.64212 -3.34906,1.69599 -3.34906,2.34186 0,1.58856 -2.58924,1.48769 -4.24211,-0.16522 z m -29.24838,-1.38534 c 0,-1.94557 1.83045,-3.23715 3.3003,-2.32871 1.4858,0.91837 0.14761,3.93745 -1.74521,3.93745 -0.8553,0 -1.55509,-0.7239 -1.55509,-1.60874 z m 79.26084,-0.71702 c 0,-2.7207 2.60866,-2.33615 3.15182,0.46462 0.21364,1.10157 -0.35586,1.86114 -1.39545,1.86114 -1.03555,0 -1.75637,-0.9545 -1.75637,-2.32576 z m 140.66013,-0.46524 c -1.7064,-2.05591 0.272,-5.02354 3.349,-5.02354 3.077,0 5.0554,2.96763 3.3491,5.02354 -0.7645,0.92103 -2.2715,1.67456 -3.3491,1.67456 -1.0777,0 -2.5847,-0.75353 -3.349,-1.67456 z m 4.4654,-1.7404 c 0,-0.65017 -0.5024,-0.8717 -1.1164,-0.4923 -0.6139,0.37955 -1.1163,0.91156 -1.1163,1.18227 0,0.27077 0.5024,0.4923 1.1163,0.4923 0.614,0 1.1164,-0.53202 1.1164,-1.18227 z m -202.43147,0.43803 c -0.40935,-0.40926 -0.74424,-1.26328 -0.74424,-1.89781 0,-0.69943 0.51995,-0.63352 1.321,0.16741 0.72657,0.72665 1.06147,1.58066 0.74424,1.89789 -0.31724,0.31722 -0.91169,0.24193 -1.321,-0.16749 z m 428.55457,-1.38768 c -0.9465,-1.5314 0.5316,-4.5662 2.2239,-4.5662 2.0038,0 2.8939,1.6422 2.0634,3.80649 -0.742,1.93385 -3.2834,2.384 -4.2873,0.75971 z m -270.3795,-0.8006 c -2.3425,-5.23128 5.1193,-9.75918 5.1841,-2.46314 0,3.10807 -1.6729,3.90281 -5.1841,2.46314 z m 3.8705,-3.02081 c 0.2137,-1.10158 -0.3558,-1.86114 -1.3954,-1.86114 -1.0356,0 -1.7564,0.9545 -1.7564,2.32576 0,2.72054 2.6087,2.33598 3.1518,-0.46462 z m 222.5937,2.3252 c -5.555,-9.41338 6.9937,-6.48405 4.2608,-0.9086 -1.4136,2.64126 -2.6244,2.89954 -4.2608,0.9086 z m 2.2318,-3.27461 c -1.7053,-1.70523 -2.9636,-0.44695 -2.0178,2.01767 0.5585,1.45532 1.0427,1.5995 2.0357,0.60638 0.9932,-0.9932 0.9889,-1.61725 -0.018,-2.62405 z m -55.6823,1.80991 c -1.0722,-11.8904 9.3031,-0.39299 2.6895,1.53186 -1.0767,0.20737 -2.2865,-0.48165 -2.6895,-1.53186 z m 2.972,-1.88436 c 0,-1.30737 -1.6263,-0.98209 -2.0933,0.41865 -0.2302,0.69067 0.1466,1.06748 0.8374,0.8372 0.6907,-0.23019 1.2559,-0.79529 1.2559,-1.25585 z m -290.59988,1.79077 c -1.45584,-1.45571 -0.76079,-2.62805 1.55823,-2.62805 1.29915,0 2.13067,0.58519 1.88384,1.32567 -0.5438,1.63141 -2.40781,2.3367 -3.44207,1.30238 z m -59.93404,-1.5117 c 0,-0.61396 0.97507,-1.11635 2.16682,-1.11635 1.19174,0 2.47729,0.50239 2.85676,1.11635 0.3913,0.63313 -0.54659,1.11636 -2.16682,1.11636 -1.5712,0 -2.85676,-0.50239 -2.85676,-1.11636 z m 118.34833,-0.27907 c 0.0512,-9.75972 7.06848,-6.07643 5.84851,-0.6787 -0.61283,2.34349 -5.87335,2.95403 -5.84851,0.6787 z m -103.41157,-1.34169 c -0.96877,-2.52452 0.52041,-3.96068 4.10708,-3.96068 3.81888,0 3.94738,0.31511 1.36054,3.33639 -2.25928,2.6386 -4.59243,2.905 -5.46762,0.62429 z m 18.80957,0.29548 c 0.68998,-2.06999 3.09322,-2.41325 3.09322,-0.44194 0,0.97216 -0.79541,1.76753 -1.76755,1.76753 -0.97217,0 -1.56872,-0.59652 -1.32567,-1.32559 z m 478.70929,-0.28752 c -0.7364,-0.88708 -1.1746,-2.77097 -0.9739,-4.18625 0.3014,-2.12707 1.042,-2.57323 4.2719,-2.57323 3.2299,0 3.9705,0.44616 4.272,2.57323 0.4367,3.08062 -1.566,5.79936 -4.272,5.79936 -1.0776,0 -2.5617,-0.72585 -3.298,-1.61311 z m 4.4144,-3.41043 c 0,-0.92103 -0.7536,-1.67456 -1.6746,-1.67456 -0.9209,0 -1.6745,0.75353 -1.6745,1.67456 0,0.92095 0.7536,1.67449 1.6745,1.67449 0.921,0 1.6746,-0.75354 1.6746,-1.67449 z m 44.9331,3.77466 c -3.7585,-1.08531 -5.2306,-3.42654 -1.5492,-2.46376 1.4327,0.37469 2.2678,-0.17835 2.6864,-1.77904 0.4155,-1.58917 1.5093,-2.32278 3.4634,-2.32278 3.5586,0 5.9974,3.79483 3.9919,6.21137 -1.4949,1.80116 -3.3206,1.87646 -8.5925,0.35421 z m 5.3026,-2.37916 c 0,-1.30745 -1.6262,-0.98217 -2.0931,0.41857 -0.2303,0.69075 0.1465,1.06747 0.8373,0.8372 0.6907,-0.23019 1.2558,-0.7953 1.2558,-1.25577 z m -575.47834,0.27899 c -0.37948,-0.61396 0.34441,-1.11636 1.60864,-1.11636 1.26422,0 2.29858,0.5024 2.29858,1.11636 0,0.61397 -0.72388,1.11636 -1.60863,1.11636 -0.88476,0 -1.91913,-0.50239 -2.29859,-1.11636 z m 544.41174,-0.74658 c 0.2166,-1.13566 1.5452,-2.20854 2.9895,-2.41402 2.0127,-0.28619 2.5116,0.0919 2.2099,1.67455 -0.2165,1.13567 -1.5453,2.20862 -2.9895,2.41396 -2.0127,0.28627 -2.5117,-0.092 -2.2099,-1.67449 z m -531.20324,-3.24725 c -0.37168,-0.96848 0.12123,-2.55805 1.09537,-3.53218 1.457,-1.45695 2.07704,-1.51724 3.49575,-0.3399 0.94855,0.78732 2.73269,1.16772 3.96479,0.84549 1.23211,-0.32215 1.95867,-0.13027 1.6146,0.42646 -0.34408,0.55673 -1.1342,1.01227 -1.75581,1.01227 -0.62162,0 -1.88374,0.75347 -2.80473,1.6745 -2.17611,2.1761 -4.75696,2.1363 -5.60997,-0.0861 z m 4.09493,-2.21199 c 0,-0.27069 -0.50236,-0.49221 -1.11635,-0.49221 -0.614,0 -1.11636,0.53194 -1.11636,1.18219 0,0.65024 0.50236,0.87177 1.11636,0.4923 0.61399,-0.37947 1.11635,-0.91149 1.11635,-1.18228 z m 14.52435,2.31287 c -2.55604,-3.07985 -0.49597,-5.0406 5.25581,-5.00236 4.40952,0.0289 5.0345,0.27203 3.594,1.39549 -0.95903,0.74792 -2.07358,2.23905 -2.47677,3.31349 -0.89596,2.38784 -4.49723,2.55361 -6.37304,0.29338 z m 3.89541,-1.68874 c -0.37947,-0.61396 -1.1923,-1.11634 -1.8063,-1.11634 -0.61397,0 -0.80586,0.50238 -0.42639,1.11634 0.37945,0.61398 1.19229,1.11628 1.80627,1.11628 0.614,0 0.80588,-0.5023 0.42642,-1.11628 z m 519.10275,0.45493 c -1.8421,-1.5475 -2.5956,-2.68003 -1.6745,-2.51654 0.9209,0.1635 2.8048,-0.32817 4.1862,-1.09257 2.5772,-1.426 6.9772,-0.17376 6.9772,1.98576 0,5.08548 -4.46,5.84848 -9.4889,1.62335 z m -553.70642,-1.56126 c -0.388,-1.22255 -0.39221,-2.72962 -0.009,-3.34913 1.166,-1.88663 5.53646,-1.25874 7.54197,1.0835 1.78668,2.08665 1.7735,2.27321 -0.23669,3.34907 -3.37737,1.80748 -6.52683,1.33974 -7.29595,-1.08344 z m 69.43517,1.517 c -0.43056,-0.43052 -0.78283,-2.24004 -0.78283,-4.02103 0,-2.83878 0.30984,-3.14458 2.51178,-2.4794 3.86116,1.16662 4.86597,2.52953 3.4834,4.72508 -1.32558,2.10494 -3.97898,3.00868 -5.21235,1.77535 z m -20.59804,-3.38274 c -2.29983,-0.92791 -1.58757,-4.53173 1.031,-5.21652 3.22391,-0.84308 4.27167,-0.0508 4.27167,3.23089 0,2.68693 -1.84889,3.37925 -5.30267,1.98563 z m 3.06997,-2.67558 c 0,-0.65018 -0.50235,-0.8717 -1.11636,-0.4923 -0.614,0.37945 -1.11634,0.91147 -1.11634,1.18225 0,0.27079 0.50234,0.4923 1.11634,0.4923 0.61401,0 1.11636,-0.53201 1.11636,-1.18225 z m 520.21902,0.0665 c -2.1489,-0.45226 -2.8978,-0.88858 -1.664,-0.96935 1.2338,-0.0807 2.8708,-1.1517 3.6376,-2.37971 1.6333,-2.61513 6.432,-2.97897 7.3609,-0.55814 0.3534,0.92095 1.9143,1.67449 3.4686,1.67449 2.877,0 3.7701,1.51732 1.6606,2.82118 -0.6409,0.39605 -1.9785,0.0493 -2.9725,-0.77144 -1.4191,-1.17124 -1.908,-1.19189 -2.2767,-0.0961 -0.5058,1.5027 -3.0372,1.57934 -9.2145,0.27907 z m -25.6313,-3.85331 c -0.789,-0.95059 -2.252,-1.7358 -3.2514,-1.74487 -1.6805,-0.0157 -0.011,-1.30088 5.1745,-3.97186 2.0556,-1.05989 4.8919,1.74096 4.505,4.44883 -0.41,2.8706 -4.4386,3.66519 -6.4281,1.2679 z m 4.4207,-1.66253 c 0,-0.57768 -0.5024,-1.36094 -1.1163,-1.7404 -0.614,-0.37947 -1.1164,0.0932 -1.1164,1.05043 0,0.95731 0.5024,1.7404 1.1164,1.7404 0.6139,0 1.1163,-0.47259 1.1163,-1.05043 z m -529.14988,-1.74103 c 0,-3.59709 0.2658,-3.90728 3.34906,-3.90728 1.84198,0 3.34906,0.55681 3.34906,1.2374 0,0.76636 1.16856,0.98499 3.06995,0.57432 2.74942,-0.59386 2.84819,-0.51904 0.94602,0.71616 -1.16816,0.75863 -2.91246,2.25851 -3.87623,3.33295 -0.96376,1.07452 -2.89654,1.95364 -4.29507,1.95364 -2.1618,0 -2.54279,-0.58535 -2.54279,-3.90719 z m 4.46541,-0.68989 c 0,-0.61405 -0.50235,-0.80601 -1.11635,-0.42654 -0.61399,0.37954 -1.11635,1.19235 -1.11635,1.8064 0,0.61397 0.50236,0.80585 1.11635,0.42637 0.614,-0.37953 1.11635,-1.19227 1.11635,-1.80623 z m 532.49897,3.48073 c 0,-0.61404 0.5022,-1.11628 1.1163,-1.11628 0.614,0 1.1164,0.50224 1.1164,1.11628 0,0.61397 -0.5024,1.11635 -1.1164,1.11635 -0.6141,0 -1.1163,-0.50238 -1.1163,-1.11635 z m -553.70961,-1.60858 c 0,-2.07303 1.86611,-3.23677 2.79087,-1.74039 0.39185,0.63389 1.18008,0.86371 1.75168,0.51043 0.57153,-0.35328 1.03919,-0.16397 1.03919,0.42051 0,1.05146 -2.57524,2.41803 -4.55671,2.41803 -0.56375,0 -1.02503,-0.72383 -1.02503,-1.60858 z m 7.81444,0.4923 c 0,-0.61412 0.47271,-1.11634 1.05047,-1.11634 0.57775,0 1.36094,0.50222 1.74041,1.11634 0.37947,0.61396 -0.0933,1.11628 -1.05046,1.11628 -0.95722,0 -1.74042,-0.50232 -1.74042,-1.11628 z m 24.5597,-1.05051 c 0,-2.58778 2.004,-4.09024 3.4829,-2.61131 1.40139,1.40144 0.039,4.7781 -1.92783,4.7781 -0.85527,0 -1.55507,-0.97506 -1.55507,-2.16679 z m -39.60418,-3.20268 c -1.44516,-1.44515 -0.31463,-2.445 2.76464,-2.445 1.84196,0 3.34905,0.44382 3.34905,0.98625 0,1.11439 -5.21396,2.35851 -6.11369,1.45875 z m 571.20145,-3.31129 c -3.4086,-0.55892 -2.5176,-2.94636 1.2668,-3.39441 2.0709,-0.24513 2.9838,0.16171 2.9838,1.32959 0,2.11634 -0.9933,2.59896 -4.2506,2.06482 z m -514.72316,-1.76953 c -1.66659,-2.00806 -0.33961,-5.49864 1.78102,-4.68481 0.89198,0.34225 1.83186,0.62234 2.08865,0.62234 1.11047,0 0.33291,3.18687 -1.05953,4.34248 -1.15482,0.9584 -1.83895,0.89022 -2.81014,-0.28001 z m 474.92576,0.4801 c -0.8257,-1.33583 1.2743,-2.65946 2.7614,-1.7404 1.2485,0.77153 0.4288,2.77958 -1.1346,2.77958 -0.5416,0 -1.2736,-0.46767 -1.6268,-1.03918 z m -487.33447,-6.15092 c 0,-3.46539 1.35526,-4.30268 3.92414,-2.42428 2.52954,1.84964 1.46812,5.14929 -1.6564,5.14929 -1.66007,0 -2.26774,-0.73023 -2.26774,-2.72501 z m 536.49327,1.46744 c 0.3315,-0.5364 1.2681,-0.97514 2.0812,-0.97514 0.8131,0 1.7527,-1.04848 2.0877,-2.32982 0.89,-3.40339 4.5858,-2.32747 5.0242,1.46274 0.336,2.90422 0.1532,3.01714 -4.7231,2.91932 -2.7899,-0.0562 -4.8015,-0.5407 -4.47,-1.0771 z m -555.47122,-0.97514 c 0,-0.61404 0.47271,-1.11635 1.05047,-1.11635 0.57776,0 1.36094,0.50231 1.74041,1.11635 0.37946,0.61397 -0.0932,1.11635 -1.05046,1.11635 -0.95723,0 -1.74042,-0.50238 -1.74042,-1.11635 z m 525.80082,-1.11635 c -0.7104,-1.32732 -2.424,-2.28087 -4.2257,-2.35148 l -3.0306,-0.11877 2.9887,-1.18446 c 1.6437,-0.6515 3.2293,-2.10509 3.5236,-3.23036 0.3412,-1.30463 1.56,-2.04575 3.3644,-2.04575 3.3617,0 4.6963,1.76794 4.2139,5.58169 -0.6964,5.50654 -4.6443,7.44108 -6.8343,3.34913 z m 4.4747,-5.57566 c -2.1434,-1.3252 -3.6461,0.17781 -2.6841,2.68465 0.6878,1.79233 0.8912,1.80397 2.5483,0.14631 1.5821,-1.58247 1.5985,-1.92659 0.1358,-2.83096 z m -554.83522,5.57566 c 0,-0.61405 0.7832,-1.11635 1.74042,-1.11635 0.95722,0 1.42994,0.5023 1.05046,1.11635 -0.37947,0.61396 -1.16265,1.11635 -1.74042,1.11635 -0.57775,0 -1.05046,-0.50239 -1.05046,-1.11635 z m 5.58176,-1.7096 c 0,-3.79365 2.93207,-4.74072 5.64885,-1.82469 2.15067,2.30855 2.15079,2.34725 0.0112,3.49254 -3.69708,1.97858 -5.65979,1.40018 -5.65979,-1.66785 z m 3.34904,-0.52311 c 0,-0.61403 -0.50236,-1.11642 -1.11635,-1.11642 -0.61399,0 -1.11634,0.50239 -1.11634,1.11642 0,0.61398 0.50235,1.11636 1.11634,1.11636 0.61399,0 1.11635,-0.50238 1.11635,-1.11636 z m 23.07125,1.48847 c -0.92946,-0.92947 -0.96714,-5.19049 -0.0666,-7.5371 0.8801,-2.29347 3.29433,-2.24232 6.44839,0.13684 2.3255,1.75408 2.40087,2.14628 0.96549,5.02353 -1.48313,2.97303 -5.46342,4.26055 -7.34725,2.37673 z m 4.83749,-3.09719 c 0,-2.29307 -2.31113,-3.41975 -3.40019,-1.6576 -0.50483,0.81688 -0.6702,1.886 -0.36748,2.37572 0.9382,1.5181 3.76767,0.97881 3.76767,-0.71812 z m 529.86378,1.95043 c -1.2573,-1.25719 -0.7658,-2.57448 0.9606,-2.57448 0.921,0 1.6745,0.47274 1.6745,1.05059 0,1.40769 -1.7433,2.41583 -2.6351,1.52389 z m -551.07442,-1.94942 c 0,-1.09774 0.97359,-1.49214 3.06997,-1.24356 4.31094,0.51113 4.47091,0.65313 1.95361,1.73485 -3.3778,1.45156 -5.02358,1.29056 -5.02358,-0.49129 z m 44.20361,-1.56689 c -0.3863,-0.62507 -0.15839,-1.47275 0.50644,-1.88365 1.71638,-1.06076 2.82378,0.39221 1.39095,1.82508 -0.80174,0.80179 -1.42617,0.82094 -1.89739,0.0578 z m 518.60601,-2.30222 c -2.0296,-1.25483 -1.1775,-5.01126 1.2424,-5.47729 1.0693,-0.20596 2.2625,0.45523 2.6516,1.46915 0.9134,2.38049 -1.8785,5.25429 -3.894,4.00814 z m -579.55487,-3.38815 c 0,-2.82885 1.47145,-3.64846 4.97223,-2.76989 3.60321,0.90436 3.60285,1.99914 -7.7e-4,3.64118 -3.96256,1.80546 -4.97101,1.62874 -4.97101,-0.87129 z m 25.19762,0.41261 c -2.21619,-2.2162 -2.27991,-7.04489 -0.10406,-7.87983 0.95408,-0.36617 3.00295,0.7193 4.85675,2.57315 l 3.20649,3.20643 -2.55497,1.92722 c -3.11874,2.35249 -3.22146,2.35585 -5.40429,0.17303 z m 510.37115,-1.25521 c -3.0353,-0.48238 -4.3842,-2.5723 -1.66,-2.5723 0.7753,0 1.9056,-1.13027 2.5117,-2.51177 1.3674,-3.11674 6.9515,-3.47142 8.7891,-0.55814 2.6828,4.25312 -1.8155,6.88585 -9.6408,5.64221 z m 6.4191,-3.68865 c 0,-0.81868 -0.628,-1.6978 -1.3955,-1.95356 -0.8301,-0.2768 -1.3954,0.51466 -1.3954,1.95356 0,1.43882 0.5653,2.23027 1.3954,1.95363 0.7675,-0.25585 1.3955,-1.13496 1.3955,-1.95363 z m 19.1532,1.95363 c 0.2831,-0.46048 1.219,-0.83728 2.0799,-0.83728 0.8608,0 2.5436,-1.05036 3.7397,-2.33421 2.907,-3.12026 6.1886,-2.38845 6.6357,1.47996 0.3496,3.0248 0.3308,3.033 -6.3096,2.7813 -3.6632,-0.13895 -6.4287,-0.62929 -6.1457,-1.08977 z m 10.43,-1.95363 c 0,-0.61397 -0.5022,-1.11636 -1.1163,-1.11636 -0.614,0 -1.1164,0.50239 -1.1164,1.11636 0,0.61404 0.5024,1.11635 1.1164,1.11635 0.6141,0 1.1163,-0.50231 1.1163,-1.11635 z m -534.25718,-0.49472 c -0.3765,-1.50013 -0.35642,-3.25828 0.0447,-3.90719 1.0889,-1.76191 5.03935,-1.42351 5.77544,0.49464 0.35341,0.92103 1.84472,1.67456 3.31401,1.67456 1.4693,0 2.67144,0.50239 2.67144,1.11635 0,0.61405 -1.22624,1.11636 -2.72498,1.11636 -1.49876,0 -3.03546,0.50237 -3.41494,1.11635 -1.35767,2.19673 -4.96751,1.17022 -5.66557,-1.61107 z m 31.20766,1.10634 c -0.34212,-0.89163 -0.29588,-2.14881 0.10288,-2.7939 0.99535,-1.61052 5.05475,0.62179 5.05475,2.77967 0,2.12025 -4.34478,2.13223 -5.15754,0.0148 z m -59.40468,-0.61162 c 0.56191,-1.68576 2.35709,-1.8595 2.88389,-0.27907 0.25584,0.76746 -0.3721,1.39542 -1.39543,1.39542 -1.02333,0 -1.69314,-0.50231 -1.48846,-1.11635 z m 46.01964,-2.70843 c -1.01567,-2.64673 0.42142,-5.31973 2.63123,-4.89413 1.23582,0.23794 1.95699,1.39401 1.95699,3.13716 0,3.18234 -3.52352,4.53163 -4.58822,1.75697 z m 527.45256,-2.128 -2.9363,-1.30612 2.5881,-1.95231 c 3.2231,-2.43108 3.8046,-2.43131 5.581,0 1.0008,1.36852 1.08,2.36774 0.2656,3.34905 -1.3587,1.63711 -1.6278,1.63281 -5.4984,-0.0888 z m -580.35638,-1.10743 c 0,-2.70507 1.98689,-3.28573 4.71186,-1.37713 1.36567,0.9566 1.9945,1.74611 1.39739,1.75448 -0.59711,0.01 -2.21596,0.31816 -3.59745,0.6884 -1.81787,0.48713 -2.5118,0.19274 -2.5118,-1.06575 z m 549.52898,0.69137 c -2.4676,-0.47565 -2.4566,-0.52467 0.7193,-3.19698 1.7739,-1.49268 4.0478,-2.71405 5.0529,-2.71405 2.4369,0 3.4647,2.96646 1.7456,5.03777 -1.3675,1.64783 -2.6977,1.80234 -7.5178,0.87326 z m -536.50488,-1.0735 c -0.40933,-0.40927 -0.74423,-1.67926 -0.74423,-2.82221 0,-1.95222 2.28661,-2.19641 8.93079,-0.95379 0.97456,0.18244 -4.9697,4.46949 -6.23295,4.49537 -0.66516,0.0133 -1.54429,-0.31004 -1.95361,-0.71937 z m 16.00102,-6.22811 c 0,-1.54499 0.52419,-1.99616 1.76582,-1.51967 0.97121,0.37268 2.2271,0.67755 2.79087,0.67755 2.2581,0 0.84379,2.00712 -1.76582,2.50591 -2.21238,0.42294 -2.79087,0.0781 -2.79087,-1.66379 z m -23.44335,-4.61271 c 0,-1.45969 0.80789,-3.32458 1.79532,-4.14412 1.50933,-1.25264 1.99839,-1.21706 3.06997,0.22348 0.70105,0.94237 2.27934,2.28962 3.50733,2.99382 2.17262,1.24607 2.16511,1.28142 -0.27909,1.31442 -1.38147,0.0187 -2.51179,0.53639 -2.51179,1.15037 0,0.61396 -1.25589,1.11627 -2.79087,1.11627 -2.19437,0 -2.79087,-0.56721 -2.79087,-2.65424 z m 3.34905,-1.87701 c 0,-0.65032 -0.50236,-0.87185 -1.11636,-0.4923 -0.61399,0.37948 -1.11635,0.91149 -1.11635,1.18227 0,0.27078 0.50236,0.4923 1.11635,0.4923 0.614,0 1.11636,-0.53202 1.11636,-1.18227 z m 568.78026,3.51905 c -3.1423,-0.70178 -3.192,-0.79107 -0.8052,-1.44624 1.3991,-0.38409 2.4038,-1.29073 2.2327,-2.01472 -0.439,-1.85729 2.937,-3.83306 5.1188,-2.99577 2.5075,0.96215 2.2995,4.90438 -0.333,6.31332 -1.1876,0.63563 -2.3179,1.09618 -2.5117,1.02354 -0.1939,-0.0728 -1.8596,-0.46869 -3.7016,-0.88013 z m -539.59543,-2.21449 c -1.04643,-0.66307 -1.27786,-2.03839 -0.74855,-4.44827 0.64709,-2.94621 1.27847,-3.48849 4.0616,-3.48849 2.11496,0 3.55796,0.69975 4.02842,1.95356 0.40318,1.07452 1.51772,2.56557 2.47675,3.31356 1.49392,1.16515 1.31336,1.36508 -1.26037,1.39541 -1.65224,0.0187 -3.31455,0.53789 -3.69403,1.15194 -0.84087,1.36054 -2.83065,1.41059 -4.86382,0.12229 z m 4.30566,-4.09548 c 0,-0.2707 -0.50236,-0.49229 -1.11636,-0.49229 -0.61398,0 -1.11635,0.53201 -1.11635,1.18226 0,0.65024 0.50237,0.87178 1.11635,0.4923 0.614,-0.37946 1.11636,-0.91149 1.11636,-1.18227 z m 516.87007,3.97319 c -2.1491,-0.45242 -3.1088,-0.88858 -2.1329,-0.9695 0.9759,-0.0807 2.3623,-1.4371 3.0808,-3.01401 1.7055,-3.74338 6.1314,-3.40692 6.6851,0.50817 0.3264,2.30879 -1.4717,4.82221 -3.1677,4.42764 -0.3069,-0.0719 -2.3164,-0.50004 -4.4653,-0.9523 z m -544.06493,-1.89092 c -1.25721,-1.25726 -0.7657,-2.57456 0.96064,-2.57456 0.92099,0 1.67452,0.47274 1.67452,1.05051 0,1.4077 -1.74328,2.41584 -2.63516,1.52405 z m 7.44604,-3.28447 c -0.72879,-1.89921 0.69465,-5.03246 2.5703,-5.65769 2.28979,-0.76323 5.19142,2.57018 4.40207,5.05725 -0.92976,2.92947 -5.91394,3.35866 -6.97237,0.60044 z m 514.65229,0.0391 c -0.7065,-1.84111 1.5676,-4.02753 3.5468,-3.40989 0.614,0.19165 1.2768,1.43936 1.4731,2.77279 0.2695,1.83211 -0.2162,2.42435 -1.9887,2.42435 -1.29,0 -2.654,-0.80429 -3.0312,-1.78725 z m 55.457,1.29495 c 0,-0.27079 0.5024,-0.80281 1.1164,-1.18228 0.614,-0.37946 1.1163,-0.15794 1.1163,0.49231 0,0.65024 -0.5023,1.18227 -1.1163,1.18227 -0.614,0 -1.1164,-0.22153 -1.1164,-0.4923 z m -590.17808,-5.73289 c -1.07371,-2.79804 1.88466,-3.90642 4.73659,-1.77466 1.36851,1.02298 2.41181,1.91484 2.31844,1.98194 -0.0934,0.0672 -1.56225,0.45625 -3.26423,0.86473 -2.29975,0.55188 -3.2733,0.27656 -3.7908,-1.07201 z m 582.36368,0.64344 c 0,-0.61404 0.7535,-1.11635 1.6745,-1.11635 0.921,0 1.6745,0.50231 1.6745,1.11635 0,0.61397 -0.7535,1.11635 -1.6745,1.11635 -0.921,0 -1.6745,-0.50238 -1.6745,-1.11635 z m -16.7453,-1.07233 c -4.021,-0.80101 -3.4087,-1.46415 2.5631,-2.77584 3.7408,-0.82163 5.3808,-0.0212 4.525,2.20941 -0.67,1.74588 -1.0251,1.77427 -7.0881,0.56643 z m -556.54629,-2.35101 c -1.02743,-1.66244 0.16379,-2.56627 2.3012,-1.74603 0.9864,0.37852 1.48076,1.19407 1.09862,1.81241 -0.90489,1.46416 -2.47283,1.4335 -3.39982,-0.0665 z m 509.86459,-1.8698 c 0.4363,-3.78006 3.6413,-4.64776 5.3531,-1.44922 1.5971,2.98413 0.6136,4.50966 -2.9072,4.50966 -2.3932,0 -2.7479,-0.44389 -2.4459,-3.06044 z m 19.6824,1.12385 c 0.8071,-0.29165 1.925,-1.73353 2.4841,-3.20407 1.2629,-3.32138 5.5373,-3.71274 5.5373,-0.50701 0,2.66495 -1.5665,3.70358 -6.0445,4.00751 -1.8945,0.12855 -2.7841,-0.008 -1.9769,-0.29643 z m -520.01213,-2.52881 c 0,-0.61405 0.50237,-1.11635 1.11635,-1.11635 0.61401,0 1.11636,0.5023 1.11636,1.11635 0,0.61396 -0.50235,1.11635 -1.11636,1.11635 -0.61398,0 -1.11635,-0.50239 -1.11635,-1.11635 z m 21.63938,-2.72572 c -1.21,-3.15318 0.0796,-5.64696 2.92033,-5.64696 3.4452,0 4.45364,3.6877 1.58254,5.7871 -2.58693,1.89162 -3.73697,1.8558 -4.50287,-0.14014 z m 4.03667,-2.85604 c 0,-0.61397 -0.50236,-1.11635 -1.11634,-1.11635 -0.61399,0 -1.11635,0.50238 -1.11635,1.11635 0,0.61396 0.50236,1.11635 1.11635,1.11635 0.61398,0 1.11634,-0.50239 1.11634,-1.11635 z m 530.89068,1.00914 c 0.343,-0.555 1.2889,-1.00914 2.102,-1.00914 0.8132,0 1.7413,-1.0047 2.0624,-2.2327 0.6894,-2.63634 4.3747,-2.96788 6.3628,-0.57237 2.5776,3.10588 0.5308,4.91392 -5.5101,4.86716 -3.1026,-0.0243 -5.3602,-0.49785 -5.0171,-1.05295 z m -550.98497,-2.02572 c 0,-2.02526 0.45213,-2.26657 3.06996,-1.63852 5.04257,1.20971 5.04203,1.97748 -10e-4,3.2435 -2.62602,0.65916 -3.06772,0.42803 -3.06772,-1.60498 z m 30.88569,1.38869 c -1.71516,-1.71514 -0.70605,-3.85948 1.48845,-3.16303 1.22798,0.38978 2.23271,0.21433 2.23271,-0.38987 0,-0.60418 -0.59131,-1.29564 -1.31399,-1.53656 -0.72272,-0.24091 -0.94425,-1.03628 -0.4923,-1.76753 1.67856,-2.71601 4.6728,-0.85003 5.79209,3.60967 0.67968,2.70804 0.51621,3.12808 -0.9921,2.54931 -0.99322,-0.38112 -2.10277,-0.21253 -2.46566,0.37461 -0.76081,1.23106 -3.15906,1.41357 -4.2492,0.3234 z m 507.47408,-2.27633 c -1.3815,-0.26609 -2.5118,-0.69623 -2.5118,-0.95583 0,-1.2316 5.0378,-6.07076 6.3199,-6.07076 1.6579,0 3.1897,4.85839 2.092,6.63461 -0.7424,1.20111 -1.4538,1.24842 -5.9001,0.39198 z M 848.30094,660.5787 c -0.74135,-1.93199 1.048,-6.05906 2.62697,-6.05906 0.54855,0 1.75088,0.75355 2.67187,1.67456 0.92099,0.92097 2.21277,1.6745 2.87061,1.6745 0.65786,0 1.1961,0.5561 1.1961,1.23575 0,0.67973 -0.71681,0.96075 -1.59291,0.6246 -0.87611,-0.33623 -2.19349,0.11236 -2.92756,0.99687 -1.75444,2.11393 -4.00361,2.04559 -4.84508,-0.14722 z m 534.05006,-0.49239 c -0.921,-0.60356 -3.1817,-0.84589 -5.0236,-0.53858 -2.8931,0.48267 -3.0394,0.3976 -1.0741,-0.62508 1.2513,-0.65111 2.7584,-2.28494 3.3491,-3.6307 0.7262,-1.65447 2.2463,-2.55995 4.6941,-2.79607 2.9646,-0.28597 3.8535,0.16295 4.9086,2.47877 2.1483,4.71499 -2.3452,8.06624 -6.8541,5.11166 z m 4.9758,-2.14044 c 0.8257,-1.33584 -1.2745,-2.65947 -2.7614,-1.74047 -1.2485,0.7716 -0.4288,2.77965 1.1346,2.77965 0.5415,0 1.2736,-0.46766 1.6268,-1.03918 z m -525.83571,-2.68082 c -1.01635,-2.64853 -0.0905,-5.70506 1.84096,-6.07703 1.61579,-0.31112 8.46364,4.97858 7.57577,5.85207 -0.22181,0.21823 -2.28185,0.74768 -4.57784,1.17657 -3.24342,0.60582 -4.32271,0.39361 -4.83889,-0.95161 z m 3.38398,-3.05521 c -0.95696,-1.54844 -1.62685,-1.25975 -1.62685,0.70115 0,0.95723 0.51057,1.4249 1.13457,1.03926 0.62401,-0.38565 0.84555,-1.1689 0.49228,-1.74041 z m 529.28693,2.45453 c -0.3426,-0.55446 0.125,-1.6289 1.0393,-2.3876 1.3515,-1.12167 1.6622,-1.05332 1.6622,0.36579 0,2.08414 -1.8208,3.4468 -2.7015,2.02181 z m -517.29431,-1.48432 c -0.7368,-0.73681 -1.33962,-2.25967 -1.33962,-3.38408 0,-2.83354 3.34762,-3.89703 5.029,-1.59763 0.74639,1.02072 2.71282,1.8559 4.36985,1.8559 1.72424,0 2.71769,0.47744 2.32283,1.11635 -0.37947,0.61396 -1.88653,1.11635 -3.34906,1.11635 -1.46248,0 -2.96957,0.50239 -3.34903,1.11635 -0.91353,1.47806 -2.05159,1.40911 -3.68397,-0.22324 z m -25.40734,-3.23294 c -1.19732,-1.93729 2.022,-4.36758 4.8173,-3.63665 2.81252,0.73549 3.41065,2.62743 0.83066,2.62743 -0.92099,0 -1.67453,0.50237 -1.67453,1.11635 0,1.50543 -3.02727,1.4238 -3.97343,-0.10708 z m 40.81297,-3.27696 c 0,-1.55274 2.93183,-2.5873 4.53114,-1.59888 0.94059,0.58137 0.87961,1.05607 -0.22564,1.75636 -2.07756,1.31645 -4.3055,1.23497 -4.3055,-0.15748 z m 472.89368,-0.61443 c -1.1985,-3.12324 -0.7238,-7.2174 0.9096,-7.84418 2.3617,-0.90625 6.2272,1.56909 6.2272,3.98781 0,4.34178 -5.7569,7.45251 -7.1368,3.85637 z m 4.9041,-3.32365 c 0,-0.27077 -0.5024,-0.4923 -1.1164,-0.4923 -0.614,0 -1.1163,0.53203 -1.1163,1.18228 0,0.65024 0.5023,0.87176 1.1163,0.4923 0.614,-0.37948 1.1164,-0.91149 1.1164,-1.18228 z m 27.9088,2.64361 c 0,-0.49676 1.3029,-0.9032 2.8953,-0.9032 1.9565,0 3.0847,-0.72398 3.4793,-2.23271 0.6901,-2.63906 2.8473,-2.89757 4.777,-0.57237 2.5584,3.08265 0.5664,4.78819 -5.4859,4.69686 -3.1162,-0.0469 -5.6657,-0.49191 -5.6657,-0.98858 z m 18.3459,0.33255 c 0.4201,-0.67965 1.703,-1.23575 2.8508,-1.23575 1.1479,0 2.8407,-0.75353 3.7616,-1.67449 1.8942,-1.89429 5.1831,-2.24843 5.1831,-0.55822 0,0.61404 0.1256,1.49317 0.2791,1.95364 0.1535,0.46048 -0.9769,0.89069 -2.5118,0.95597 -1.535,0.0649 -4.4864,0.49583 -6.5587,0.95662 -2.6484,0.58901 -3.5409,0.47079 -3.0041,-0.39777 z m -554.19393,-2.91027 c 0,-0.92104 0.69204,-1.67457 1.53784,-1.67457 0.84581,0 2.16322,0.75353 2.92757,1.67457 1.17525,1.41606 0.93787,1.67449 -1.53783,1.67449 -1.85805,0 -2.92758,-0.61171 -2.92758,-1.67449 z m 528.03353,0.55814 c 0,-0.61396 0.5024,-1.11636 1.1164,-1.11636 0.6139,0 1.1163,0.5024 1.1163,1.11636 0,0.61404 -0.5024,1.11635 -1.1163,1.11635 -0.614,0 -1.1164,-0.50231 -1.1164,-1.11635 z m -519.56552,-4.06123 c -0.91726,-2.39034 1.28105,-4.91384 3.52909,-4.05122 1.676,0.64313 5.86451,4.31316 5.86451,5.13856 0,0.20636 -1.95785,0.45187 -4.35078,0.5457 -3.08696,0.12097 -4.55179,-0.35342 -5.04282,-1.63304 z m 514.57942,-2.20073 c -1.0734,-1.07327 -2.9032,-1.58504 -4.5452,-1.27117 -3.5468,0.67801 -3.525,-0.0414 0.042,-1.39769 1.6966,-0.645 2.7909,-1.93893 2.7909,-3.3001 0,-1.44343 0.9692,-2.48229 2.7274,-2.92362 3.6898,-0.9261 5.087,0.16312 5.087,3.96561 0,6.53836 -2.4848,8.54462 -6.1024,4.92697 z m 3.8698,-2.01932 c 0,-0.25677 0.3048,-1.26156 0.6775,-2.23269 0.4858,-1.26594 0.012,-1.76582 -1.6745,-1.76582 -2.5824,0 -2.6616,0.12744 -1.6745,2.69951 0.5935,1.54672 2.6715,2.55713 2.6715,1.299 z m -490.44978,1.95528 c -1.43622,-1.43616 -0.72471,-4.60608 1.19959,-5.34452 1.26861,-0.48683 2.59107,0.0532 3.80709,1.55509 1.02477,1.26554 2.53624,2.35108 3.35882,2.41231 1.74706,0.12995 -3.25095,1.84627 -5.85373,2.01009 -0.97216,0.061 -2.10246,-0.22363 -2.51177,-0.63297 z m 3.72116,-3.22887 c 0,-0.2707 -0.50237,-0.49222 -1.11635,-0.49222 -0.61399,0 -1.11636,0.53194 -1.11636,1.18219 0,0.65024 0.50237,0.87177 1.11636,0.4923 0.61398,-0.37947 1.11635,-0.91148 1.11635,-1.18227 z m 454.35442,-3.28314 c 2.3567,0 2.7908,0.52099 2.7908,3.34906 -2.7971,12.61372 -12.5768,-3.22509 -2.7908,-3.34906 z m -501.24112,3.91971 c 0,-0.60709 1.21968,-1.0029 2.7104,-0.87951 1.49072,0.12339 2.46578,0.62014 2.1668,1.10383 -0.78573,1.27134 -4.8772,1.0832 -4.8772,-0.22432 z m 562.24752,0.37297 c 1.3188,-0.28102 2.6672,-1.54031 2.9962,-2.7985 0.7313,-2.79655 3.5365,-2.137 3.5365,0.83158 0,1.72382 -0.8677,2.17249 -4.4654,2.3087 -2.4559,0.0931 -3.3863,-0.061 -2.0673,-0.34178 z m -551.70841,-2.72531 c -0.41587,-0.67285 -0.0337,-1.94589 0.84939,-2.82892 1.35188,-1.35194 2.05498,-1.37235 4.45076,-0.12941 l 2.84523,1.47612 -2.8667,1.35287 c -3.53079,1.66621 -4.31691,1.68553 -5.27868,0.12934 z m 16.45823,-2.8767 c 0.42772,-3.61303 2.26949,-4.42935 4.64162,-2.05724 2.34998,2.35 1.14924,5.04106 -2.24929,5.04106 -2.31983,0 -2.6908,-0.46267 -2.39233,-2.98382 z m 514.57188,0.89069 c 0.4669,-1.40073 2.0932,-1.72594 2.0932,-0.41864 0,0.46048 -0.5652,1.02565 -1.2559,1.25592 -0.6907,0.2302 -1.0676,-0.14653 -0.8373,-0.83728 z m 9.6039,-3.61905 c 1.3681,-0.71781 2.7662,-2.18376 3.107,-3.25766 0.8065,-2.54101 4.9488,-3.65532 5.757,-1.54882 1.0029,2.61327 -0.5086,4.93596 -3.2226,4.95214 -1.4007,0.01 -3.8027,0.27274 -5.3377,0.58739 -2.751,0.56392 -2.7554,0.55345 -0.3037,-0.73305 z m -96.8187,-2.66042 c 0,-2.2327 0.5582,-2.79083 2.7909,-2.79083 2.8704,0 3.288,0.75423 2.1132,3.81585 -1.1407,2.97272 -4.9041,2.18611 -4.9041,-1.02502 z m 3.3491,-0.55814 c 0,-0.61405 -0.5024,-1.11634 -1.1164,-1.11634 -0.614,0 -1.1164,0.50229 -1.1164,1.11634 0,0.61396 0.5024,1.11635 1.1164,1.11635 0.614,0 1.1164,-0.50239 1.1164,-1.11635 z m 56.0146,1.51506 c 0.5411,-2.74893 3.904,-4.55845 5.5021,-2.96044 2.0038,2.00375 0.2837,4.79445 -2.9552,4.79445 -2.0993,0 -2.8074,-0.50998 -2.5469,-1.83401 z m -512.42848,-0.29166 c -0.81674,-0.50473 -1.31543,-2.11683 -1.10823,-3.58238 0.56119,-3.96897 5.66556,-4.30425 7.4051,-0.48636 0.71303,1.56495 1.80956,2.84534 2.4367,2.84534 0.62716,0 1.1377,0.37673 1.13452,0.83721 -0.008,1.17953 -8.07369,1.49519 -9.86809,0.38619 z m 3.52504,-4.66972 c -1.48232,-1.48229 -3.12501,0.54812 -1.96368,2.42725 0.54011,0.87388 1.08975,0.87388 1.96368,0 0.87393,-0.87396 0.87393,-1.55337 0,-2.42725 z m 134.21353,4.17367 c -1.49047,-1.08985 -1.62506,-1.94066 -0.69431,-4.3887 1.34678,-3.54227 3.98771,-3.95723 5.63196,-0.88498 2.19326,4.0983 -1.35798,7.89124 -4.93765,5.27368 z m 3.86458,-2.89421 c 0,-3.06944 -1.91137,-3.86856 -3.25375,-1.36024 -1.22282,2.28478 -0.60105,3.5271 1.76528,3.5271 0.81866,0 1.48847,-0.97505 1.48847,-2.16686 z m 68.46783,2.63836 c -0.9499,-2.47525 0.4583,-4.93691 2.824,-4.93691 2.1453,0 3.9963,2.76505 2.9664,4.4314 -1.0823,1.75127 -5.1753,2.10862 -5.7904,0.50551 z m 209.5477,0.14021 c -2.5372,-3.05717 1.2531,-9.14335 4.8377,-7.76787 2.2916,0.87944 2.3235,3.70202 0.078,6.90775 -2.0316,2.90038 -3.0715,3.08234 -4.9158,0.86012 z m 4.0357,-3.45079 c 0.9041,-2.35585 -0.6048,-3.62773 -1.8911,-1.59403 -1.3665,2.161 -1.3391,3.31677 0.079,3.31677 0.6333,0 1.449,-0.77521 1.8125,-1.72274 z m 70.7153,1.72274 c 0,-2.14529 2.1832,-3.02652 3.7115,-1.49817 0.8451,0.8451 -1.2679,3.73086 -2.7318,3.73086 -0.5389,0 -0.9797,-1.00476 -0.9797,-2.23269 z m -477.79772,-0.55822 c -1.10874,-1.33592 -1.10874,-2.01306 0,-3.34905 1.58559,-1.91049 4.46539,-2.24725 4.46539,-0.52218 0,0.63376 1.13031,1.60663 2.51178,2.16195 l 2.5118,1.00961 -2.4459,0.0712 c -1.34525,0.0391 -2.75639,0.57306 -3.13586,1.18711 -0.97386,1.57573 -2.29258,1.38728 -3.90721,-0.55821 z m 457.26472,-3.44039 c -1.0131,-2.64008 -0.8174,-6.04856 0.3475,-6.04856 4.1461,0 5.9869,3.70491 3.217,6.4748 -1.8005,1.80053 -2.7537,1.68661 -3.5645,-0.42624 z m 29.4638,0.0913 c 0,-0.93024 0.9923,-1.67447 2.2327,-1.67447 1.2404,0 2.2327,0.74423 2.2327,1.67447 0,0.93035 -0.9923,1.67458 -2.2327,1.67458 -1.2404,0 -2.2327,-0.74423 -2.2327,-1.67458 z m 24.4052,-0.36179 c 1.313,-0.87176 2.3873,-2.17679 2.3873,-2.90007 0,-0.72336 0.5793,-1.89443 1.2873,-2.60247 1.7468,-1.7469 5.4108,0.26835 5.4108,2.97607 0,3.03934 -2.2546,4.37893 -7.1318,4.23748 -4.1392,-0.12003 -4.2299,-0.19954 -1.9536,-1.71101 z m -13.1323,-0.87114 c 0.9812,-1.16389 2.0957,-2.99522 2.4767,-4.06967 0.3811,-1.07452 1.7134,-1.95364 2.9606,-1.95364 1.6748,0 2.2678,0.72985 2.2678,2.79084 0,2.07632 -0.5906,2.79093 -2.3061,2.79093 -1.2683,0 -3.4034,0.57542 -4.7445,1.27875 -2.3107,1.21191 -2.345,1.16804 -0.6545,-0.83721 z m 23.8482,0.74596 c 0.4037,-0.65315 1.4033,-1.1875 2.2215,-1.1875 0.8183,0 1.7869,-1.19229 2.1526,-2.64955 0.3865,-1.53962 2.074,-3.23318 4.0283,-4.0427 1.8498,-0.7662 3.3632,-1.83448 3.3632,-2.374 0,-0.53953 0.7535,-0.98093 1.6745,-0.98093 2.8531,0 1.8474,1.67802 -1.8398,3.06976 -3.0352,1.14567 -3.3147,1.56722 -2.0495,3.09165 1.214,1.46289 1.1946,2.02001 -0.1138,3.25366 -1.9994,1.88537 -10.4894,3.52241 -9.437,1.81961 z m -510.93352,-2.18045 c -0.7304,-3.07992 0.32948,-5.70718 2.28285,-5.6587 1.02949,0.0258 3.71342,1.67503 5.96437,3.66543 l 4.09259,3.61896 -5.95672,0.0861 c -4.60293,0.0665 -6.05363,-0.32254 -6.38309,-1.71179 z m 3.15455,-3.17006 c -1.13478,-1.13481 -2.0711,0.5736 -1.14003,2.08013 0.70334,1.13802 0.96629,1.13896 1.34442,0.008 0.25855,-0.77567 0.16657,-1.71374 -0.20439,-2.08469 z m 16.34988,4.54007 c -1.94377,-0.78435 -1.74855,-2.60975 0.27909,-2.60975 0.92098,0 1.67453,0.75354 1.67453,1.67449 0,0.92102 -0.1256,1.63493 -0.27909,1.58644 -0.1535,-0.0485 -0.90704,-0.34153 -1.67453,-0.65118 z m 317.88059,-0.93526 c 0,-0.92095 0.7536,-1.67449 1.6745,-1.67449 0.921,0 1.6746,0.75354 1.6746,1.67449 0,0.92102 -0.7536,1.67456 -1.6746,1.67456 -0.9209,0 -1.6745,-0.75354 -1.6745,-1.67456 z m -269.97057,-0.55816 c 0.56191,-1.68574 2.35711,-1.85949 2.8839,-0.27907 0.25583,0.76746 -0.37212,1.39543 -1.39543,1.39543 -1.02334,0 -1.69314,-0.50239 -1.48847,-1.11636 z m 86.49027,-0.85878 c -1.3963,-2.25913 0.6848,-5.83932 3.3942,-5.83932 2.3249,0 2.6818,0.46024 2.3815,3.06998 -0.2476,2.15248 -1.0724,3.17242 -2.7597,3.41287 -1.3234,0.18859 -2.6807,-0.10104 -3.016,-0.64353 z m 4.3216,-4.52147 c -0.9467,-0.94683 -3.9118,2.26186 -3.1817,3.44319 0.4388,0.71 1.2944,0.36821 2.2088,-0.88232 0.8209,-1.12269 1.2588,-2.27508 0.9729,-2.56087 z m -178.53879,2.18102 c -0.48089,-0.77809 -0.57286,-1.71617 -0.2044,-2.08469 0.99911,-0.99906 2.08844,0.47033 1.54881,2.08922 -0.37812,1.13441 -0.64108,1.13347 -1.34441,-0.008 z m 66.71186,-1.93706 c -1.36965,-2.09031 -1.58902,-3.40066 -0.78325,-4.6781 1.79679,-2.84846 3.20846,-2.73976 6.93969,0.5343 3.66031,3.2119 4.64779,5.49051 1.92693,4.4464 -0.87017,-0.33388 -1.85912,0.11471 -2.19767,0.99696 -0.96387,2.51177 -3.79849,1.88592 -5.8857,-1.29956 z m 4.08376,-2.08492 c 0,-0.99594 -0.65485,-1.38823 -1.66812,-0.99937 -0.91746,0.35202 -1.39017,1.08984 -1.05047,1.63945 0.97416,1.57621 2.71859,1.16546 2.71859,-0.64008 z m 170.23717,3.86215 c -1.1855,-1.91821 0.6083,-5.57176 2.7355,-5.57176 2.6143,0 4.9593,2.84511 4.1288,5.0094 -0.7259,1.89131 -5.7867,2.30597 -6.8643,0.56236 z m 4.1366,-3.56228 c -1.0418,-1.04191 -1.6476,-1.03159 -2.7256,0.0462 -1.104,1.10392 -1.049,1.5945 0.2697,2.4095 2.2386,1.38353 4.2671,-0.64485 2.4559,-2.45595 z M 919.34481,611.359 c -2.19639,-0.88632 -1.69476,-4.84246 0.614,-4.84246 3.01465,0 4.9157,2.28855 3.40906,4.10393 -1.2934,1.55846 -1.77288,1.6465 -4.02306,0.73853 z m -44.93308,-1.4934 c 0,-0.61396 0.75353,-1.11634 1.67452,-1.11634 0.92098,0 1.67452,0.50238 1.67452,1.11634 0,0.61397 -0.75354,1.11635 -1.67452,1.11635 -0.92099,0 -1.67452,-0.50238 -1.67452,-1.11635 z m 436.01747,-0.63484 c -2.5837,-2.58363 -1.6587,-4.32637 2.5149,-4.73852 4.1166,-0.40654 4.761,1.6916 1.4422,4.69513 -1.9585,1.7723 -2.2253,1.77527 -3.9571,0.043 z m -323.23033,-1.5309 c -1.83742,-3.43327 0.40036,-6.99852 4.11301,-6.55284 3.73826,0.44876 5.77905,3.53406 4.1055,6.20683 -1.83523,2.93104 -6.72486,3.13685 -8.21851,0.34601 z m 6.45226,-2.59154 c 0.25513,-1.32488 -0.33989,-1.9408 -1.87492,-1.9408 -2.56018,0 -3.97798,1.6673 -2.90042,3.41091 1.08652,1.75799 4.34695,0.75423 4.77534,-1.47011 z m 364.14007,2.52461 c 0,-0.61397 1.0048,-1.11637 2.2327,-1.11637 1.228,0 2.2327,0.5024 2.2327,1.11637 0,0.61396 -1.0047,1.11635 -2.2327,1.11635 -1.2279,0 -2.2327,-0.50239 -2.2327,-1.11635 z m 15.815,0 c 0.5619,-1.68576 2.3571,-1.8595 2.8838,-0.27908 0.256,0.76747 -0.372,1.39543 -1.3953,1.39543 -1.0233,0 -1.6931,-0.50239 -1.4885,-1.11635 z m -189.431,-3.42334 c -0.84,-2.64666 0.8233,-4.34484 4.2841,-4.37401 1.5565,-0.0133 1.9456,0.69631 1.6745,3.05287 -0.4605,4.00188 -4.8022,4.96458 -5.9586,1.32114 z m 4.3209,-0.44813 c 0.3458,-0.90132 0.2053,-1.90053 -0.3123,-2.22042 -1.1956,-0.73892 -3.658,2.13958 -2.6729,3.12464 1.1894,1.18946 2.3123,0.84932 2.9852,-0.90422 z m 206.2817,-0.12299 c 1.0019,-1.18001 2.1579,-3.25006 2.5689,-4.60013 0.7203,-2.36572 4.6187,-4.53727 5.8804,-3.27556 0.8562,0.85628 0.7691,6.22584 -0.1154,7.11035 -0.4009,0.40088 -2.1848,0.82969 -3.9642,0.95292 -1.7793,0.12315 -3.9003,0.61412 -4.7132,1.09093 -0.8498,0.49849 -0.7038,-0.0453 0.3435,-1.27851 z m -530.03831,-1.10416 c -1.3783,-3.59184 1.57512,-4.26852 5.22514,-1.1972 l 3.50206,2.94676 -4.02792,0 c -2.62733,0 -4.26136,-0.60834 -4.69928,-1.74956 z m 14.29324,0.2625 c -0.91564,-1.1033 -0.81604,-2.03957 0.38598,-3.62812 0.89105,-1.17758 1.63609,-1.57175 1.65562,-0.87584 0.0195,0.69583 1.04021,1.52796 2.2682,1.84909 1.22797,0.32113 2.2327,1.16289 2.2327,1.8706 0,0.70772 -0.46766,0.99773 -1.03921,0.64446 -0.57158,-0.35328 -1.35476,-0.13168 -1.74041,0.4923 -0.95702,1.54852 -2.28876,1.42372 -3.76288,-0.35249 z m 372.33307,0.74282 c -1.526,-1.52608 -0.6786,-2.82383 0.9574,-1.46611 2.3116,1.91846 3.5566,0.38714 1.8748,-2.30581 -1.1086,-1.77527 -1.071,-2.18195 0.202,-2.18195 1.8936,0 3.0899,2.72296 2.2071,5.02354 -0.6544,1.70529 -3.8917,2.27993 -5.2413,0.93033 z m 109.2496,-0.31816 c -1.1945,-1.93276 0.4602,-5.4647 2.927,-6.24764 2.9207,-0.92698 4.5883,0.74063 4.1114,4.11135 -0.2699,1.90718 -1.1969,2.73579 -3.3382,2.98358 -1.6304,0.18868 -3.2955,-0.19259 -3.7002,-0.84729 z m 4.9903,-2.91072 c 0,-0.27077 -0.5024,-0.49228 -1.1164,-0.49228 -0.614,0 -1.1163,0.53201 -1.1163,1.18226 0,0.65016 0.5023,0.87177 1.1163,0.49222 0.614,-0.37947 1.1164,-0.91141 1.1164,-1.1822 z m -200.943,1.74042 c 0,-0.61397 0.5024,-1.11636 1.1163,-1.11636 0.614,0 1.1164,0.50239 1.1164,1.11636 0,0.61396 -0.5024,1.11635 -1.1164,1.11635 -0.6139,0 -1.1163,-0.50239 -1.1163,-1.11635 z m -207.64108,-2.2327 c -1.22799,-1.22802 -2.2327,-2.71743 -2.2327,-3.30981 0,-0.59239 1.00471,-1.61475 2.2327,-2.27195 4.50678,-2.41193 8.91668,2.91664 5.35849,6.47487 -1.84656,1.8465 -2.77332,1.69208 -5.35849,-0.89311 z m 3.90723,-2.23271 c 0.37948,-0.61397 -0.0932,-1.11636 -1.05046,-1.11636 -0.95723,0 -1.74043,0.50239 -1.74043,1.11636 0,0.61396 0.47272,1.11635 1.05046,1.11635 0.57778,0 1.36097,-0.50239 1.74043,-1.11635 z m 422.06165,3.67456 c 0.6588,-0.48604 1.5221,-1.76284 1.9186,-2.83727 0.3965,-1.07454 1.6876,-1.95365 2.8691,-1.95365 2.394,0 4.04,2.8857 2.27,3.97968 -1.7105,1.05716 -8.4394,1.83056 -7.0577,0.81124 z M 907.31383,599.7696 c -0.84693,-1.37041 1.41925,-4.43437 3.23688,-4.37643 0.69231,0.0219 2.7658,1.27555 4.60778,2.78536 2.44677,2.00555 2.84048,2.74667 1.46132,2.75073 -1.03824,0.008 -2.22524,-0.54054 -2.63777,-1.20807 -0.54012,-0.87396 -1.08974,-0.87396 -1.96369,0 -1.53694,1.53694 -3.77035,1.55993 -4.70452,0.0485 z m 316.07667,-0.60061 c -1.4654,-3.81899 -0.6535,-5.83862 2.8367,-7.05528 5.957,-2.07664 8.7247,2.16381 4.3001,6.5884 -2.6772,2.67722 -6.2001,2.90766 -7.1368,0.46688 z m 6.0205,-3.25772 c 0,-0.92102 -0.7239,-1.67456 -1.6086,-1.67456 -2.1583,0 -3.2272,1.89827 -1.4684,2.60739 2.4371,0.98248 3.077,0.78849 3.077,-0.93283 z m -336.73398,2.2327 c -0.85802,-2.23599 0.26084,-4.92032 2.39164,-5.73799 1.05199,-0.4037 2.81141,0.50356 4.49075,2.31551 3.14753,3.39629 3.42627,4.16578 1.19945,3.3113 -0.85889,-0.32959 -1.89323,-0.0626 -2.29857,0.59323 -1.09521,1.77208 -5.04459,1.44288 -5.78327,-0.48205 z m 370.22448,-0.55821 c -0.8489,-1.58628 -0.8489,-2.87905 0,-4.46541 1.4743,-2.75479 2.4146,-2.78904 5.6067,-0.20431 2.1328,1.72703 2.3111,2.39057 1.2007,4.46541 -1.6312,3.04792 -5.2278,3.15583 -6.8074,0.20431 z m 4.4654,-1.60866 c 0,-2.48596 -1.7482,-2.98084 -1.9316,-0.54672 -0.09,1.18549 0.3088,2.15538 0.8846,2.15538 0.5759,0 1.047,-0.72391 1.047,-1.60866 z m 142.2906,2.79625 c 0.4036,-0.65322 1.4736,-1.18759 2.3776,-1.18759 0.904,0 1.9328,-0.75354 2.2862,-1.67449 0.7484,-1.95011 3.2854,-2.21761 4.3711,-0.46094 1.0791,1.74595 -0.5668,2.87247 -5.4726,3.74572 -2.9222,0.5202 -4.0615,0.38503 -3.5623,-0.4227 z m -322.023,-2.21262 c 0,-3.63367 1.2595,-5.67309 3.5035,-5.67309 2.7447,0 3.7183,2.51748 2.125,5.49451 -1.596,2.98209 -5.6285,3.11001 -5.6285,0.17858 z m 4.4654,-1.97835 c 0,-2.19735 -2.6927,-1.22464 -3.1511,1.13833 -0.2511,1.2951 0.1712,1.6533 1.3955,1.18353 0.9656,-0.37056 1.7556,-1.41536 1.7556,-2.32186 z m 39.0599,0.74761 c -1.621,-3.02886 -0.5304,-4.44235 3.4273,-4.44235 3.3182,0 4.0017,1.29394 2.6056,4.93231 -0.9557,2.49058 -4.5959,2.19501 -6.0329,-0.48996 z m 4.4778,-1.65143 c 0,-0.92103 -0.7535,-1.67457 -1.6745,-1.67457 -0.9211,0 -1.6745,0.75354 -1.6745,1.67457 0,0.92096 0.7534,1.6745 1.6745,1.6745 0.921,0 1.6745,-0.75354 1.6745,-1.6745 z m 159.8263,1.41623 c -0.8105,-0.81046 -0.8419,-1.86959 -0.097,-3.26179 1.9229,-3.59279 6.2912,-2.09884 4.8494,1.65845 -0.8704,2.26829 -3.2761,3.07984 -4.7525,1.60334 z m 50.3931,-4.76184 c 2.7806,-5.70852 5.7051,-6.55283 7.6805,-2.21745 1.084,2.37915 0.952,3.05645 -0.8612,4.42005 -1.1778,0.88576 -2.9782,1.35921 -4.001,1.05224 -1.0228,-0.30706 -2.1828,-0.0352 -2.5777,0.60348 -0.3949,0.63899 -1.1607,1.16179 -1.702,1.16179 -0.5411,0 0.1165,-2.25905 1.4614,-5.02011 z m 5.2361,-1.1857 c 0,-0.95724 -0.5024,-1.42991 -1.1163,-1.05045 -0.614,0.37948 -1.1164,1.16265 -1.1164,1.74041 0,0.57777 0.5024,1.05043 1.1164,1.05043 0.6139,0 1.1163,-0.78316 1.1163,-1.74039 z m -480.51449,4.08725 c -1.24567,-0.48782 -1.66933,-1.14769 -1.00172,-1.56032 0.63626,-0.39323 2.11,0.008 3.27494,0.88827 2.27889,1.725 1.21717,2.03887 -2.27322,0.67205 z m 177.95609,-1.86136 c -2.095,-5.5102 -0.5499,-8.29995 4.5969,-8.29995 3.1256,0 4.3615,1.70256 4.3615,6.00798 0,5.52319 -7.0447,7.32552 -8.9584,2.29197 z m 5.5976,-1.02947 c 1.6613,-2.0018 0.7201,-5.03778 -1.5618,-5.03778 -2.2234,0 -2.91,1.36421 -2.1496,4.27173 0.7438,2.84439 1.8048,3.06341 3.7114,0.76605 z m 55.4179,3.10955 c -0.3877,-0.38775 -0.705,-1.37478 -0.705,-2.19346 0,-1.69504 3.9941,-2.03776 4.9889,-0.4281 0.7605,1.23044 -3.2319,3.67356 -4.2839,2.62156 z m -187.601,-1.2994 c -0.48089,-0.7781 -0.57287,-1.71617 -0.2044,-2.08469 0.99911,-0.99906 2.08843,0.47033 1.54881,2.08922 -0.37812,1.13441 -0.64107,1.13356 -1.34441,-0.008 z m -45.47828,-2.0334 c -1.96421,-2.36671 -0.1911,-4.81453 3.48752,-4.81453 2.51452,0 3.38409,0.51638 3.38409,2.00946 0,1.10518 0.50235,2.51178 1.11635,3.12574 0.74422,0.74424 -0.20227,1.11635 -2.83949,1.11635 -2.17571,0 -4.49251,-0.64666 -5.14847,-1.43702 z m 526.58348,0.56526 c 1.256,-0.80991 2.1074,-2.3048 1.8918,-3.32208 -0.5267,-2.48597 1.6731,-3.6892 3.6878,-2.01713 2.3818,1.97662 1.9847,4.08672 -0.8861,4.70929 -1.3815,0.29963 -3.5165,0.89531 -4.7444,1.32364 -2.1571,0.75236 -2.1554,0.72883 0.051,-0.69372 z m -457.64667,-0.73993 c -0.3863,-0.62508 -0.1584,-1.47269 0.50646,-1.88358 1.71637,-1.06084 2.82377,0.39222 1.39095,1.82501 -0.80175,0.80178 -1.42617,0.82102 -1.89741,0.0586 z m 80.81017,-0.75355 c -1.1525,-1.38869 -1.0369,-2.10455 0.639,-3.95637 2.4752,-2.73501 6.4561,-2.42076 7.0238,0.55446 0.4117,2.15795 -2.4318,5.09735 -4.9312,5.09735 -0.7285,0 -1.9576,-0.76291 -2.7316,-1.69544 z m 5.4528,-2.03542 c 1.2175,-1.46689 0.6528,-2.96724 -1.1168,-2.96724 -0.4901,0 -1.4287,1.00476 -2.0859,2.23269 -0.9327,1.743 -0.849,2.23272 0.3822,2.23272 0.8675,0 2.1367,-0.67419 2.8205,-1.49817 z m 365.751,0.73251 c 3.3454,-3.43726 5.0236,-3.7623 5.0236,-0.97318 0,0.8132 -0.8792,1.73125 -1.9537,2.04018 -1.0745,0.30895 -2.9583,0.96943 -4.1863,1.46783 -1.6717,0.6784 -1.3911,0.0415 1.1164,-2.53483 z m -23.0682,0.53546 c 0.8204,-1.04755 1.1538,-2.45102 0.7412,-3.11886 -0.8863,-1.4339 1.3585,-4.4654 3.3065,-4.4654 1.6856,0 4.2314,5.33936 3.2797,6.87904 -0.384,0.62147 -1.7457,0.85606 -3.026,0.52123 -1.2803,-0.33482 -3.1074,0 -4.0603,0.74002 -1.5124,1.17734 -1.5431,1.10672 -0.2411,-0.55603 z m 5.7647,-3.677 c 0,-0.92103 -0.7535,-1.67456 -1.6745,-1.67456 -1.7433,0 -2.2148,1.32035 -0.9302,2.60482 1.2844,1.28453 2.6047,0.81296 2.6047,-0.93026 z m -21.0245,2.79084 c 0.5619,-1.68575 2.357,-1.85949 2.8839,-0.27907 0.2558,0.76746 -0.3722,1.39543 -1.3955,1.39543 -1.0233,0 -1.6931,-0.50232 -1.4884,-1.11636 z m -465.70402,-2.03315 c 0,-0.95911 0.67653,-1.2951 1.76582,-0.87717 0.9712,0.37275 1.97592,0.67762 2.23271,0.67762 0.25679,0 0.46688,0.39471 0.46688,0.87715 0,0.48247 -1.00473,0.87717 -2.23271,0.87717 -1.228,0 -2.2327,-0.69966 -2.2327,-1.55477 z m 14.96763,0.75001 c -0.98172,-1.58848 1.29594,-1.82992 3.31745,-0.35179 1.97344,1.44297 1.95531,1.50716 -0.37628,1.33154 -1.34733,-0.10147 -2.67086,-0.54233 -2.94117,-0.97975 z m 259.65439,0.79084 c 0,-1.17827 2.1424,-1.67331 2.7797,-0.64227 0.3857,0.62406 -0.082,1.13457 -1.0393,1.13457 -0.9571,0 -1.7404,-0.22152 -1.7404,-0.4923 z M 974.44848,584.6669 c -0.37048,-0.96552 -0.15196,-2.73016 0.48562,-3.92143 0.9307,-1.73906 1.59013,-1.9354 3.34505,-0.99624 2.52533,1.35155 2.58429,1.6099 1.0302,4.51373 -1.39517,2.60686 -3.93453,2.81789 -4.86087,0.40394 z m 182.39972,-0.26648 c 0,-1.1936 0.7472,-2.79021 1.6604,-3.54813 2.4012,-1.99288 5.2645,-0.51599 4.837,2.49503 -0.4836,3.40567 -6.4974,4.38034 -6.4974,1.0531 z m 4.2561,-1.25741 c 0.2791,-0.83729 -0.1395,-1.25593 -0.9768,-0.97686 -0.8059,0.26867 -1.685,1.14779 -1.9536,1.95364 -0.2791,0.83728 0.1395,1.25593 0.9769,0.97678 0.8058,-0.26859 1.6849,-1.1477 1.9535,-1.95356 z m 162.2161,1.85237 c -0.6888,-0.68879 -1.2523,-1.94034 -1.2523,-2.78129 0,-2.17445 4.9167,-1.25686 5.346,0.99773 0.4282,2.2485 -2.3976,3.47972 -4.0937,1.78356 z m 65.4495,-0.32105 c 1.3815,-1.03041 2.5119,-2.83268 2.5119,-4.00501 0,-3.05764 3.343,-3.9903 5.2,-1.45078 2.0708,2.83205 1.3914,4.21762 -2.4927,5.08328 -1.796,0.40036 -4.2702,1.06943 -5.4982,1.4869 -1.9597,0.66629 -1.9256,0.53 0.279,-1.11439 z m -190.2487,-1.1359 c -0.3974,-1.03566 0.3105,-2.7562 1.7096,-4.1553 l 2.3877,-2.38783 2.42,2.4199 c 2.0231,2.02314 2.1837,2.70443 0.9796,4.15528 -1.8723,2.25601 -6.6266,2.23569 -7.4969,-0.0321 z m 4.9344,-2.23295 c -1.0637,-1.0638 -3.1966,0.65933 -2.4038,1.94216 0.4713,0.76244 1.0957,0.74321 1.8975,-0.0586 0.6572,-0.65729 0.8851,-1.50488 0.5063,-1.88357 z m 4.7447,2.32592 c 0,-0.92103 0.5024,-1.67457 1.1163,-1.67457 0.6141,0 1.1164,0.75354 1.1164,1.67457 0,0.92095 -0.5023,1.67449 -1.1164,1.67449 -0.6139,0 -1.1163,-0.75354 -1.1163,-1.67449 z m -276.02926,-0.69881 c -2.7639,-1.54671 -2.40119,-4.16335 0.77787,-5.61186 3.2974,-1.50238 6.68552,-0.44303 5.81752,1.81892 -0.34389,0.89616 -0.14483,1.92626 0.44234,2.28915 0.58718,0.36289 1.06761,1.19408 1.06761,1.84699 0,0.74861 -0.61859,0.67377 -1.67453,-0.2026 -1.18012,-0.97937 -2.09003,-1.04488 -3.08178,-0.22184 -0.93017,0.77199 -2.06551,0.7996 -3.34903,0.0813 z m 4.19812,-3.20846 c 0.37946,-0.61397 -0.34443,-1.11635 -1.60865,-1.11635 -1.26423,0 -2.29859,0.50238 -2.29859,1.11635 0,0.61404 0.7239,1.11636 1.60864,1.11636 0.88475,0 1.91912,-0.50232 2.2986,-1.11636 z m 366.28224,1.58324 c -1.4018,-3.65283 -0.6811,-6.00517 2.0497,-6.6906 3.5035,-0.87928 5.0871,0.14035 5.0871,3.27548 0,4.5862 -5.65,7.28986 -7.1368,3.41512 z m 4.3459,-2.51349 c 0,-2.18532 -2.1753,-2.00015 -2.6031,0.22159 -0.2612,1.35594 0.1229,1.90751 1.1011,1.58152 0.8261,-0.27539 1.502,-1.0868 1.502,-1.80311 z m -210.89,1.34694 c -1.0112,-2.63532 1.4883,-5.04762 4.8279,-4.65941 2.1942,0.25507 2.7927,0.87099 2.4958,2.56823 -0.6922,3.9556 -6.024,5.47808 -7.3237,2.09118 z m 264.1958,-0.0774 c 1.0744,-1.20439 1.9535,-3.28063 1.9535,-4.61373 0,-1.80796 0.6745,-2.42388 2.6542,-2.42388 5.7009,0 6.4307,5.88968 0.8932,7.20854 -1.644,0.39159 -3.9939,1.00603 -5.2219,1.36547 -2.1419,0.62695 -2.1533,0.56448 -0.279,-1.5364 z m 6.9771,-3.68856 c -0.3794,-0.61397 -1.1627,-1.11635 -1.7404,-1.11635 -0.5778,0 -1.0505,0.50238 -1.0505,1.11635 0,0.61396 0.7833,1.11635 1.7404,1.11635 0.9572,0 1.43,-0.50239 1.0505,-1.11635 z m -494.09472,2.65844 c -0.65496,-0.78919 -1.01686,-2.3381 -0.80425,-3.44211 0.56982,-2.95887 5.66007,-2.63976 7.01173,0.4396 0.59071,1.34578 2.07772,2.89468 3.30445,3.44212 1.69649,0.75697 0.96751,0.99522 -3.04537,0.99522 -2.93597,0 -5.80388,-0.63633 -6.46656,-1.43483 z m 117.31141,0.96967 c -0.009,-0.46048 -0.31816,-1.96756 -0.68839,-3.34906 -0.58856,-2.19619 -0.25238,-2.51177 2.67592,-2.51177 2.49932,0 3.51004,0.6156 3.98358,2.42638 0.34899,1.3346 0.37792,2.84167 0.0643,3.34906 -0.71177,1.15169 -6.01466,1.22668 -6.03544,0.0854 z m 83.88101,-1.25585 c 0.4669,-1.40074 2.0931,-1.72602 2.0931,-0.41864 0,0.46046 -0.5651,1.02565 -1.2558,1.25585 -0.6907,0.23027 -1.0676,-0.14654 -0.8373,-0.83721 z m 262.5396,-0.87161 c -0.7648,-1.9932 3.1818,-5.96608 5.9267,-5.96608 1.9085,0 2.0594,4.62656 0.2112,6.47479 -1.9284,1.92847 -5.3102,1.64814 -6.1379,-0.50871 z m 4.6866,-1.50067 c 0.3795,-0.61397 -0.093,-1.11635 -1.0504,-1.11635 -0.9572,0 -1.7405,0.50238 -1.7405,1.11635 0,0.61397 0.4728,1.11635 1.0505,1.11635 0.5778,0 1.361,-0.50238 1.7404,-1.11635 z m -445.58586,0.53773 c -0.68328,-1.78059 1.46486,-6.11949 3.02969,-6.11949 0.61285,0 2.74612,1.63266 4.7406,3.62812 l 3.62637,3.62813 -5.41445,0.1714 c -3.59622,0.11385 -5.60511,-0.32544 -5.98221,-1.30816 z m 246.87556,0.57862 c -0.3794,-0.61404 -0.1579,-1.11635 0.4924,-1.11635 0.6502,0 1.1822,0.50231 1.1822,1.11635 0,0.61396 -0.2215,1.11635 -0.4923,1.11635 -0.2708,0 -0.8027,-0.50239 -1.1823,-1.11635 z m -254.5277,-1.0566 c -2.65332,-0.50676 -3.34905,-1.21708 -3.34905,-3.41951 0,-2.22106 0.5611,-2.7799 2.79087,-2.7799 1.72344,0 2.80217,0.64039 2.82038,1.67449 0.0162,0.92102 0.44331,2.33592 0.94905,3.14427 1.21756,1.94597 0.76581,2.14019 -3.21125,1.38065 z m 27.7844,-0.53915 c -0.86343,-2.25013 -0.64703,-2.49316 3.04471,-3.41973 2.348,-0.58933 3.03372,-0.28095 3.52134,1.58378 0.33306,1.27359 0.27581,2.32246 -0.1272,2.33083 -0.40303,0.01 -1.85694,0.31652 -3.23098,0.6848 -1.72989,0.46369 -2.71646,0.10082 -3.20787,-1.17968 z m 47.6097,0.52827 c -2.34057,-1.48042 -0.19016,-7.30489 2.69697,-7.30489 3.13159,0 4.48944,5.77834 1.70771,7.26713 -2.48225,1.32841 -2.36567,1.32739 -4.40468,0.0376 z m 409.8927,-0.0555 c 1.049,-0.64281 1.6592,-1.81515 1.3561,-2.60513 -0.3033,-0.79006 0.4889,-2.37774 1.7602,-3.52826 2.2617,-2.04685 2.359,-2.04434 4.5195,0.11612 2.9705,2.97051 0.9687,5.52538 -5.0777,6.48064 -3.3617,0.53109 -3.994,0.41654 -2.5581,-0.46337 z m -371.6318,-1.81969 c -0.8525,-2.22152 0.9942,-5.43006 3.1252,-5.43006 0.936,0 1.6919,1.4414 1.9027,3.6282 0.2941,3.0499 -0.023,3.62812 -1.9886,3.62812 -1.2862,0 -2.6539,-0.82179 -3.0393,-1.82626 z m 33.8508,-0.6855 c -0.7366,-2.75754 1.6745,-5.30262 5.0234,-5.30262 2.6092,0 3.5592,1.77207 2.7273,5.08703 -0.9459,3.76856 -6.7584,3.93027 -7.7507,0.21559 z m 5.9923,-2.09032 c 0,-0.53882 -0.7535,-0.97967 -1.6745,-0.97967 -0.9625,0 -1.6745,1.0075 -1.6745,2.36946 0,1.97952 0.2754,2.14067 1.6745,0.97959 0.921,-0.76433 1.6745,-1.83056 1.6745,-2.36938 z m 307.3999,2.9276 c -0.9771,-2.54641 0.3905,-5.02362 2.7736,-5.02362 2.7083,0 5.0839,2.80741 4.239,5.00939 -0.8382,2.1843 -6.1757,2.19517 -7.0126,0.014 z m 36.4359,0.44765 c 0,-0.58362 1.2559,-1.53859 2.7909,-2.12222 1.5349,-0.58354 2.7909,-1.86888 2.7909,-2.85621 0,-2.15599 2.6672,-1.53632 3.0824,0.71608 0.1715,0.9305 -1.5524,2.35234 -4.1863,3.45267 -2.4629,1.02893 -4.4779,1.39323 -4.4779,0.80968 z m 15.2567,0.48261 c -1.2845,-1.28447 -0.8129,-2.60483 0.9303,-2.60483 0.9211,0 1.6746,0.75353 1.6746,1.67457 0,1.74323 -1.3203,2.21479 -2.6049,0.93026 z m -172.6621,-5.39566 c 0,-2.41677 0.4514,-2.88209 2.5119,-2.58943 1.6486,0.23411 2.5117,1.12394 2.5117,2.58943 0,1.46547 -0.8631,2.3553 -2.5117,2.5894 -2.0605,0.29269 -2.5119,-0.17263 -2.5119,-2.5894 z m 45.1144,1.26405 c -0.8643,-2.25241 -0.1854,-5.45016 1.2593,-5.93112 0.6389,-0.21261 2.1459,0.34427 3.3491,1.23754 1.7522,1.30105 1.9416,2.02589 0.9515,3.64322 -1.604,2.62015 -4.7308,3.2108 -5.5599,1.05036 z m 45.6855,-1.33748 c -0.7539,-1.96482 0.6349,-5.10088 2.5403,-5.73603 0.595,-0.1983 2.0661,0.37031 3.2693,1.26359 1.7492,1.29876 1.941,2.02876 0.9571,3.6432 -1.6678,2.73705 -5.8384,3.24812 -6.7667,0.82924 z m 4.694,-1.67534 c 1.0274,-1.66246 -0.1639,-2.56629 -2.3013,-1.74612 -0.9864,0.37853 -1.4807,1.19416 -1.0986,1.81249 0.905,1.46408 2.4728,1.4335 3.3999,-0.0664 z m -193.4536,1.58042 c -3.3252,-1.37235 -0.6124,-7.08791 3.364,-7.08791 1.6734,0 2.0117,0.70749 1.7303,3.61898 -0.3429,3.54758 -2.064,4.7196 -5.0943,3.46893 z m 3.3491,-3.08766 c 0.1535,-0.56283 -0.3489,-1.23263 -1.1164,-1.48848 -0.7675,-0.25583 -1.3954,0.37213 -1.3954,1.39542 0,1.89038 2.0014,1.96451 2.5118,0.0929 z m -234.15439,0.46508 c 0.37945,-0.61397 1.16264,-1.11627 1.7404,-1.11627 0.57775,0 1.05047,0.5023 1.05047,1.11627 0,0.61404 -0.78319,1.11643 -1.74041,1.11643 -0.95723,0 -1.42993,-0.50239 -1.05046,-1.11643 z m 353.32479,-0.99688 c 0,-2.34295 3.1763,-4.08765 4.6886,-2.57542 1.5123,1.51225 -0.2325,4.68873 -2.5754,4.68873 -1.3292,0 -2.1132,-0.78411 -2.1132,-2.11331 z m 96.7227,-0.24536 c 1.3152,-1.46571 2.736,-4.29432 3.1572,-6.28571 0.6662,-3.15015 1.0447,-3.47159 2.9113,-2.47253 3.3953,1.81704 2.5604,5.05654 -2.0407,7.91892 -5.9539,3.70405 -6.7464,3.86919 -4.0278,0.83932 z m 5.9814,-5.45579 c 0,-0.61404 -0.5024,-1.11635 -1.1163,-1.11635 -0.614,0 -1.1164,0.50231 -1.1164,1.11635 0,0.61397 0.5024,1.11636 1.1164,1.11636 0.6139,0 1.1163,-0.50239 1.1163,-1.11636 z m -439.84183,5.02355 c 0,-0.92095 0.50237,-1.6745 1.11635,-1.6745 0.61398,0 1.11634,0.75355 1.11634,1.6745 0,0.92102 -0.50236,1.67448 -1.11634,1.67448 -0.61398,0 -1.11635,-0.75346 -1.11635,-1.67448 z m 34.60685,0.68018 c -1.75073,-0.48408 -2.92786,-1.72163 -3.15845,-3.32042 -0.31651,-2.19471 0.0609,-2.49849 2.71713,-2.18696 2.27866,0.26726 3.29752,1.16395 3.89916,3.43177 0.44796,1.68849 0.48115,3.01987 0.0737,2.95865 -0.40742,-0.061 -1.99662,-0.45853 -3.5316,-0.88304 z m 420.86388,0.0368 c 0,-0.55814 1.0048,-1.2775 2.2327,-1.59864 1.5174,-0.39683 2.2327,-1.52272 2.2327,-3.51427 0,-3.37878 2.6165,-4.85817 5.0379,-2.84856 2.4971,2.07242 2.1028,5.56996 -0.6279,5.56996 -1.2584,0 -3.7703,0.76644 -5.5818,1.70319 -1.8114,0.93673 -3.2936,1.24646 -3.2936,0.68832 z m 8.9308,-5.74065 c 0,-0.61397 -0.5023,-1.11626 -1.1163,-1.11626 -0.614,0 -1.1164,0.50229 -1.1164,1.11626 0,0.61405 0.5024,1.11635 1.1164,1.11635 0.614,0 1.1163,-0.5023 1.1163,-1.11635 z m -200.6639,4.80415 c -1.9104,-0.71843 -1.7612,-5.34352 0.2255,-6.99228 2.5264,-2.09673 5.6354,-0.95621 5.6354,2.06733 0,2.81546 -3.5462,5.79538 -5.8609,4.92495 z m 4.0139,-4.18791 c 0.2467,-1.27265 -0.1556,-1.80946 -1.1164,-1.48948 -0.8261,0.27508 -1.6756,1.39549 -1.8877,2.48979 -0.2468,1.27267 0.1556,1.80945 1.1164,1.48949 0.826,-0.27508 1.6756,-1.3955 1.8877,-2.4898 z m 39.3081,3.91203 c -1.3042,-0.82523 -1.3619,-1.56595 -0.303,-3.89014 1.5491,-3.3998 4.1688,-3.72579 5.778,-0.71898 2.2794,4.2589 -1.2853,7.25985 -5.475,4.60912 z m 2.8438,-4.2259 c -1.1348,-1.13473 -2.0711,0.5737 -1.1401,2.08024 0.7034,1.138 0.9663,1.13886 1.3444,0.008 0.2586,-0.77566 0.1666,-1.71374 -0.2043,-2.08476 z m -344.51028,2.0255 c 0,-3.38353 2.75826,-4.03495 5.49544,-1.29784 1.3733,1.37329 1.74993,2.32529 0.92357,2.33428 -0.76748,0.01 -2.52572,0.31816 -3.90721,0.6884 -2.03417,0.54516 -2.5118,0.21714 -2.5118,-1.72484 z m 53.87698,0.12208 c -5.74475,-2.74158 -5.95537,-7.99047 -0.37919,-9.44868 2.78971,-0.72954 4.68648,0.5977 4.56176,3.19204 -0.0563,1.17273 -0.13468,3.51373 -0.17401,5.20213 -0.0393,1.68849 -0.14397,3.0047 -0.23252,2.92487 -0.0885,-0.0798 -1.78777,-0.9215 -3.77604,-1.87036 z m 1.94053,-4.68263 c 0,-1.24037 -0.74424,-2.23271 -1.67454,-2.23271 -0.92098,0 -1.67451,0.21012 -1.67451,0.4669 0,0.25678 -0.30492,1.26155 -0.67762,2.2327 -0.48577,1.26586 -0.0118,1.76581 1.67453,1.76581 1.6079,0 2.35214,-0.70638 2.35214,-2.2327 z m 149.21877,5.95388 c -1.2078,-1.20768 -0.8525,-4.56346 0.6512,-6.15319 0.7675,-0.81132 1.3954,-2.47987 1.3954,-3.70788 0,-1.46149 0.8626,-2.35523 2.4971,-2.58754 2.3448,-0.3331 2.4756,-0.008 2.1461,5.39691 -0.3323,5.44727 -1.726,7.73627 -4.7362,7.77888 -0.6652,0.01 -1.5443,-0.31785 -1.9536,-0.72718 z m 4.665,-4.2213 c 0.2467,-1.27265 -0.1556,-1.80945 -1.1164,-1.48956 -0.8261,0.27516 -1.6756,1.39558 -1.8877,2.48988 -0.2467,1.27265 0.1556,1.80945 1.1164,1.48949 0.8261,-0.27508 1.6756,-1.3955 1.8877,-2.48981 z m 303.1958,3.25554 c 1.1918,-0.90148 2.4876,-1.63907 2.8795,-1.63907 0.3919,0 0.6726,-1.07944 0.6239,-2.39878 -0.1146,-3.1015 1.9408,-3.78489 4.297,-1.42865 2.5684,2.56838 1.8336,3.81282 -3.3083,5.6024 -5.6788,1.97639 -7.2231,1.92963 -4.4921,-0.1359 z m -405.1693,-0.52272 c 0.37947,-0.61396 1.16265,-1.11635 1.74042,-1.11635 0.57775,0 1.05045,0.50239 1.05045,1.11635 0,0.61405 -0.7832,1.11637 -1.74041,1.11637 -0.95722,0 -1.42993,-0.50232 -1.05046,-1.11637 z m -90.98251,-0.8164 c -5.32939,-0.62624 -6.27852,-1.86113 -4.04745,-5.26617 2.43515,-3.71648 4.92847,-3.62257 5.88562,0.22175 0.42037,1.6885 1.56026,3.68192 2.53303,4.42991 0.9728,0.74799 1.26635,1.29549 0.65236,1.21674 -0.614,-0.0787 -2.8746,-0.34974 -5.02356,-0.60223 z m 161.87071,-1.37696 c 0,-2.37659 3.0539,-4.50897 5.3027,-3.70265 1.8745,0.67214 1.7573,2.02565 -0.3588,4.14178 -2.4218,2.42168 -4.9439,2.19759 -4.9439,-0.43913 z m -143.79181,-0.26855 c -0.74007,-0.74009 -2.72438,-1.36805 -4.40958,-1.39541 -3.7034,-0.0602 -4.75308,-3.7831 -1.87749,-6.6587 2.40336,-2.40332 4.29636,-1.73986 4.77217,1.67269 0.20733,1.4869 1.4252,3.83369 2.70639,5.21518 2.36852,2.55392 1.27071,3.62845 -1.19149,1.16624 z m -3.56636,-5.35249 c 0,-0.61405 -0.50236,-1.11644 -1.11636,-1.11644 -0.614,0 -1.11635,0.50239 -1.11635,1.11644 0,0.61396 0.50235,1.11627 1.11635,1.11627 0.614,0 1.11636,-0.50231 1.11636,-1.11627 z m 191.50167,5.65885 c -0.3533,-0.57158 -0.1318,-1.35476 0.4923,-1.7404 0.624,-0.38565 1.1346,0.082 1.1346,1.03918 0,1.9609 -0.6699,2.24967 -1.6269,0.70122 z m 222.3844,-3.42623 c 0.7068,-6.04927 0.6503,-5.96889 3.5446,-5.05028 3.1929,1.01337 2.9687,4.85778 -0.3569,6.12214 -1.4706,0.55915 -2.9215,1.67699 -3.2242,2.48417 -0.3027,0.80718 -0.2863,-0.79303 0.037,-3.55603 z m 3.6288,-2.23262 c 0,-0.61405 -0.5023,-1.11644 -1.1163,-1.11644 -0.614,0 -1.1164,0.50239 -1.1164,1.11644 0,0.61396 0.5024,1.11627 1.1164,1.11627 0.614,0 1.1163,-0.50231 1.1163,-1.11627 z m -299.1225,3.97849 c -1.004,-1.20963 -1.0191,-2.18515 -0.062,-3.97451 1.4226,-2.65823 4.206,-2.60028 5.9211,0.12331 2.5825,4.1015 -2.7457,7.60343 -5.8598,3.8512 z m 4.4061,-1.74587 c 0,-0.61397 -0.5024,-1.11635 -1.1164,-1.11635 -0.6139,0 -1.1163,0.50238 -1.1163,1.11635 0,0.61405 0.5024,1.11635 1.1163,1.11635 0.614,0 1.1164,-0.5023 1.1164,-1.11635 z m -65.36656,1.01911 c -1.05526,-1.70749 0.64828,-3.0904 4.83949,-3.92863 2.70192,-0.54038 3.59324,-0.32402 3.59324,0.87217 0,3.60201 -6.61399,5.99923 -8.43273,3.05646 z m 324.47616,-0.92353 c -2.3799,-1.50693 -0.584,-4.78256 2.3903,-4.36024 3.2115,0.45609 4.3144,5.39011 1.1991,5.36391 -1.1172,-0.01 -2.7324,-0.46111 -3.5894,-1.00367 z m 69.8449,-1.72226 c 2.2657,-0.98555 3.6711,-2.47565 3.9072,-4.14255 0.274,-1.93441 1.0859,-2.60343 3.1596,-2.60343 2.1983,0 2.7909,0.56644 2.7909,2.66739 0,2.2606 -0.8511,2.89138 -5.5817,4.137 -7.1988,1.89545 -8.7198,1.87474 -4.276,-0.0586 z m 8.1832,-3.95505 c 0,-0.61404 -0.5024,-1.11635 -1.1164,-1.11635 -0.6139,0 -1.1163,0.50231 -1.1163,1.11635 0,0.61397 0.5024,1.11635 1.1163,1.11635 0.614,0 1.1164,-0.50238 1.1164,-1.11635 z m -369.8839,3.72109 c -0.4094,-0.40926 -0.7443,-1.66518 -0.7443,-2.79084 0,-2.20041 2.8066,-2.70889 5.51,-0.99828 1.3283,0.84048 1.3526,1.31551 0.1424,2.77379 -1.5287,1.84198 -3.644,2.27954 -4.9081,1.01533 z m 238.1546,-2.04661 c 0,-1.1201 0.7322,-1.69724 1.8742,-1.47728 1.0309,0.19853 1.8742,0.86332 1.8742,1.47728 0,0.61396 -0.8433,1.27877 -1.8742,1.47728 -1.142,0.21997 -1.8742,-0.35717 -1.8742,-1.47728 z m 30.7557,-1.29056 c -1.023,-4.0757 1.5411,-6.6831 4.8373,-4.91907 3.0495,1.63203 3.0047,3.95895 -0.1182,6.14629 -3.3529,2.34852 -3.8545,2.21801 -4.7191,-1.22722 z m 4.1302,-1.96545 c 0.1535,-0.56281 -0.3488,-1.23261 -1.1163,-1.48846 -0.7675,-0.25585 -1.3955,0.37211 -1.3955,1.39542 0,1.89038 2.0014,1.9645 2.5118,0.0929 z m -133.4703,3.0965 c -0.4239,-0.42388 -0.7708,-1.69176 -0.7708,-2.81742 0,-2.22677 2.7534,-2.79717 3.9735,-0.82313 0.8835,1.42967 -2.0634,4.77974 -3.2027,3.64055 z m -252.22377,-1.79411 c -0.28224,-0.76747 -0.29412,-2.02339 -0.0262,-2.79085 0.56094,-1.60819 3.64974,-1.9118 3.64974,-0.35882 0,0.5701 0.78942,1.82603 1.75427,2.79084 1.59477,1.5948 1.45341,1.75432 -1.55509,1.75432 -1.82015,0 -3.54028,-0.62796 -3.82251,-1.39549 z m 29.80358,0.19171 c -0.90123,-1.45819 1.5674,-5.49433 3.36055,-5.49433 0.85442,0 2.25687,1.40997 3.11657,3.13324 1.55297,3.113 1.53902,3.13395 -2.1533,3.23865 -2.04401,0.0577 -3.98973,-0.33693 -4.32382,-0.87756 z m 430.40689,0.12636 c 0,-0.59222 1.0047,-1.61451 2.2327,-2.27164 1.2279,-0.6572 2.2327,-2.33271 2.2327,-3.72328 0,-3.58316 2.073,-5.37151 4.6365,-3.99969 3.5849,1.91868 2.3253,4.76887 -3.5363,8.00173 -3.061,1.68824 -5.5656,2.58504 -5.5656,1.99288 z m 37.1186,-0.47665 c 1.0745,-0.81563 1.9537,-2.05552 1.9537,-2.75535 0,-0.69981 -0.8792,-1.2987 -1.9537,-1.33091 -1.6401,-0.0493 -1.5505,-0.33974 0.5582,-1.8107 1.3814,-0.96372 2.5118,-2.89304 2.5118,-4.28744 0,-3.76863 6.8972,-5.65839 8.2058,-2.24826 0.6522,1.69967 -1.9366,5.05592 -3.8999,5.05592 -1.5919,0 -4.3335,2.94932 -3.5085,3.77426 1.2011,1.20119 2.7179,0.74697 1.9039,-0.57009 -0.4731,-0.76551 -0.1699,-1.05796 0.7715,-0.74424 2.3699,0.79005 1.8462,2.52154 -0.88,2.90968 -1.3369,0.1904 -3.031,1.06953 -3.7648,1.95365 -0.7337,0.88411 -1.9005,1.59152 -2.5928,1.57205 -0.6924,-0.0195 -0.3797,-0.70288 0.6948,-1.51857 z m 9.1622,-11.91932 c -0.957,-1.54845 -1.6268,-1.25969 -1.6268,0.70122 0,0.95723 0.5106,1.4249 1.1345,1.03917 0.624,-0.38563 0.8456,-1.16881 0.4923,-1.74039 z m -437.40699,9.56651 c -0.35341,-0.92095 -1.85271,-1.67449 -3.33179,-1.67449 -1.47908,0 -3.34955,-0.79561 -4.15661,-1.76808 -2.25565,-2.71789 0.099,-5.48816 4.66473,-5.48816 3.58212,0 3.78556,0.20994 3.78556,3.90718 0,2.14896 0.40642,4.53516 0.90315,5.3027 0.4994,0.7716 0.42804,1.39541 -0.15965,1.39541 -0.58453,0 -1.35197,-0.75354 -1.70539,-1.67456 z m -1.6293,-5.58168 c -0.29382,-1.64259 -2.72363,-1.35906 -3.30518,0.38564 -0.321,0.96302 0.21809,1.36367 1.5021,1.11635 1.10154,-0.21213 1.91293,-0.88803 1.80308,-1.50199 z m 169.85599,5.49512 c -0.3718,-0.96857 0.1465,-2.58331 1.1513,-3.58824 1.692,-1.69201 1.9624,-1.69201 3.6544,0 2.2824,2.28234 1.2348,5.34936 -1.8271,5.34936 -1.2666,0 -2.607,-0.79247 -2.9786,-1.76112 z m 210.0615,-1.58793 c 1.7647,-1.84197 2.8457,-3.34906 2.4023,-3.34906 -0.4435,0 -0.2524,-1.03517 0.4248,-2.30041 1.6446,-3.07296 5.9778,-2.49199 6.4552,0.86551 0.263,1.84957 -0.349,2.64822 -2.4296,3.17039 -1.5297,0.38392 -3.6496,1.65759 -4.7109,2.83032 -1.0614,1.17273 -2.6994,2.1323 -3.64,2.1323 -1.2034,0 -0.7592,-0.99288 1.4982,-3.34905 z M 977.72,548.54065 c -0.40472,-0.65486 -1.74774,-1.19064 -2.98452,-1.19064 -1.53502,0 -2.13005,-0.61592 -1.8749,-1.94081 0.59545,-3.09196 3.57051,-2.82876 5.08091,0.44938 1.36791,2.96895 1.20146,4.98444 -0.22149,2.68207 z m 319.5093,-0.82721 c 1.3815,-0.96363 2.5117,-2.61771 2.5117,-3.67566 0,-2.95293 3.7272,-5.91024 5.3738,-4.26374 1.9586,1.95864 1.6069,5.32497 -0.6293,6.02401 -1.0745,0.33591 -3.287,1.32489 -4.9167,2.19768 -3.9413,2.11088 -5.5005,1.92274 -2.3395,-0.28229 z m -394.35065,-0.36343 c 0.37947,-0.61396 1.16265,-1.11635 1.74041,-1.11635 0.57776,0 1.05047,0.50239 1.05047,1.11635 0,0.61397 -0.7832,1.11635 -1.74042,1.11635 -0.95722,0 -1.42994,-0.50238 -1.05046,-1.11635 z M 1020.8257,546.34 c -1.9599,-1.21128 -1.1988,-6.24623 0.9442,-6.24623 1.8473,0 2.9728,4.72992 1.4807,6.22215 -0.5177,0.51762 -1.6089,0.52843 -2.4249,0.0243 z m 267.4832,-1.50176 c 1.8411,-1.96513 2.1,-2.96263 1.1896,-4.58325 -1.4416,-2.56587 1.3199,-5.84893 4.0414,-4.8046 3.6237,1.3905 3.2192,4.08766 -1.1982,7.98914 -4.8559,4.28885 -7.6477,5.25711 -4.0328,1.39871 z m 5.8504,-5.30268 c 0,-0.61397 -0.5024,-1.11636 -1.1164,-1.11636 -0.614,0 -1.1163,0.50239 -1.1163,1.11636 0,0.61396 0.5023,1.11634 1.1163,1.11634 0.614,0 1.1164,-0.50238 1.1164,-1.11634 z m 32.6532,5.45328 c 1.8892,-1.40949 3.07,-3.34146 3.07,-5.02324 0,-3.37813 2.9255,-4.68098 5.2628,-2.34381 2.046,2.04599 1.1758,5.26281 -1.4235,5.26281 -0.997,0 -3.0899,1.0047 -4.651,2.23271 -1.5612,1.22801 -3.3986,2.21676 -4.0834,2.19736 -0.6847,-0.0195 0.1367,-1.06607 1.8251,-2.32583 z m -389.60853,0.32958 c -1.38284,-0.19634 -3.03435,-1.32888 -3.67,-2.51662 -0.96267,-1.79874 -0.67738,-2.3776 1.70724,-3.46407 3.49056,-1.59044 5.3753,-0.15452 4.84336,3.68997 -0.28077,2.02909 -0.95383,2.5644 -2.8806,2.29072 z m 101.48363,-0.81727 c 0.2122,-1.09438 1.0617,-2.21479 1.8878,-2.48988 0.9608,-0.31988 1.3631,0.21683 1.1163,1.48957 -0.2121,1.0943 -1.0616,2.21471 -1.8877,2.48979 -0.9608,0.31989 -1.3631,-0.21682 -1.1164,-1.48948 z m -144.18157,-0.5002 c 0,-0.61396 0.50236,-1.11635 1.11635,-1.11635 0.614,0 1.11634,0.50239 1.11634,1.11635 0,0.61398 -0.50234,1.11636 -1.11634,1.11636 -0.61399,0 -1.11635,-0.50238 -1.11635,-1.11636 z m 417.51077,-1.6701 c 1.4397,-1.53257 2.2852,-3.11901 1.8788,-3.52545 -1.1217,-1.1216 1.4843,-3.73525 3.7243,-3.73525 2.2527,0 3.5194,2.35553 2.3149,4.30455 -0.7212,1.16679 -8.7045,5.74261 -10.0191,5.74261 -0.2842,0 0.6612,-1.2539 2.1011,-2.78646 z m 6.7022,-3.97749 c 0,-0.57777 -0.7535,-1.05052 -1.6745,-1.05052 -1.7264,0 -2.2179,1.31723 -0.9607,2.57449 0.8919,0.89186 2.6352,-0.11635 2.6352,-1.52397 z m -214.6809,4.9337 c -0.892,-0.89186 0.1162,-2.63516 1.5239,-2.63516 0.5778,0 1.0505,0.75354 1.0505,1.67457 0,1.72633 -1.3172,2.21784 -2.5744,0.96059 z m 171.1432,-0.95559 c 0,-0.52005 0.7678,-1.79405 1.7063,-2.83095 1.3087,-1.44601 1.4463,-2.56909 0.5907,-4.8193 -0.9898,-2.60358 -0.8119,-3.01009 1.5795,-3.6103 3.0106,-0.75565 5.0639,0.10535 5.0355,2.1115 -0.011,0.73126 -2.0197,3.30168 -4.4654,5.71212 -2.4456,2.41035 -4.4466,3.95699 -4.4466,3.43693 z m 97.1225,-0.12346 c 0,-0.37211 1.2559,-1.66448 2.7909,-2.87193 1.5443,-1.2148 2.7908,-3.35218 2.7908,-4.78568 0,-2.58653 2.6449,-4.51255 4.5662,-3.32521 0.5586,0.34523 1.0156,1.84433 1.0156,3.33139 0,1.93112 -0.7741,2.89804 -2.7087,3.38361 -1.4899,0.37392 -3.5771,1.63939 -4.6385,2.81211 -1.8805,2.07796 -3.8163,2.8164 -3.8163,1.45571 z m 9.4413,-8.33131 c -0.957,-1.54845 -1.6269,-1.25976 -1.6269,0.70114 0,0.95723 0.5106,1.4249 1.1346,1.03926 0.624,-0.38564 0.8456,-1.16881 0.4923,-1.7404 z m -468.7035,6.11628 c -1.45345,-3.78764 3.31965,-5.39066 6.09473,-2.04685 1.21026,1.45829 1.18589,1.93324 -0.14239,2.77379 -2.47596,1.56674 -5.19982,1.23404 -5.95234,-0.72694 z m 272.1696,0.23254 c -0.9577,-2.4959 0.4163,-4.03903 3.5965,-4.03903 2.2679,0 2.7346,0.47924 2.4459,2.51178 -0.425,2.99273 -5.0331,4.1574 -6.0424,1.52725 z m 59.1161,-0.13175 c -1.002,-2.61101 0.4125,-5.02362 2.9453,-5.02362 3.1851,0 4.2287,3.29399 1.6426,5.185 -2.6668,1.94996 -3.7929,1.91032 -4.5879,-0.16138 z m 20.4347,0.93024 c -0.4093,-0.40933 -0.7441,-1.72672 -0.7441,-2.92759 0,-1.7849 0.2965,-1.93714 1.6256,-0.83415 2.2157,1.83892 4.5198,0.39048 2.7572,-1.73329 -1.0357,-1.24795 -0.9237,-1.57519 0.5391,-1.57519 3.0995,0 3.5359,3.47738 0.7222,5.75565 -2.7342,2.2141 -3.7325,2.48192 -4.9,1.31457 z m -202.0593,-1.11634 c -0.4093,-0.40934 -0.7442,-1.95129 -0.7442,-3.42671 0,-2.11049 0.5113,-2.60637 2.3978,-2.32566 3.3531,0.49886 5.4066,3.9781 3.184,5.39495 -1.9742,1.2585 -3.8014,1.39346 -4.8376,0.35742 z m 3.7212,-2.60483 c 0,-0.61396 -0.5023,-1.11635 -1.1163,-1.11635 -0.6141,0 -1.1164,0.50239 -1.1164,1.11635 0,0.61396 0.5023,1.11636 1.1164,1.11636 0.614,0 1.1163,-0.5024 1.1163,-1.11636 z m -161.87073,1.11636 c 0,-0.61397 0.50236,-1.11636 1.11636,-1.11636 0.61399,0 1.11635,0.50239 1.11635,1.11636 0,0.61404 -0.50236,1.11636 -1.11635,1.11636 -0.614,0 -1.11636,-0.50232 -1.11636,-1.11636 z m 83.03807,-0.49442 c -0.48018,-1.2513 -1.27227,-1.36209 -3.54954,-0.49628 -1.61226,0.61303 -4.11186,0.81829 -5.55464,0.45617 -2.17704,-0.5464 -2.56421,-1.26906 -2.27627,-4.24827 0.30198,-3.12448 0.89406,-3.72492 4.56731,-4.63226 5.26281,-1.29999 7.92277,0.87044 8.1227,6.62789 0.14407,4.14881 -0.29939,4.92526 -1.30956,2.29275 z m -2.18243,-3.49253 c 2.2297,-2.22973 2.20981,-2.38877 -0.47844,-3.82751 -2.90297,-1.55361 -6.6981,0.36617 -6.6981,3.38838 0,2.73924 4.59523,3.02041 7.17654,0.43913 z m 171.80989,3.34225 c -0.3717,-0.96864 0.1279,-2.56478 1.1102,-3.54703 1.4675,-1.46753 2.2983,-1.55251 4.6599,-0.47651 2.4352,1.10955 2.6911,1.65112 1.6765,3.54704 -1.439,2.68872 -6.474,3.01088 -7.4466,0.4765 z m 4.6531,-1.58801 c -0.3794,-0.61397 -0.9115,-1.11634 -1.1822,-1.11634 -0.2708,0 -0.4923,0.50237 -0.4923,1.11634 0,0.61405 0.532,1.11635 1.1823,1.11635 0.6501,0 0.8717,-0.5023 0.4922,-1.11635 z m -75.1303,0.89312 c -1.909,-1.90891 -1.6636,-3.60294 0.8515,-5.87904 4.0897,-3.70123 8.7287,0.93775 5.0275,5.02752 -2.2762,2.51507 -3.9701,2.76042 -5.879,0.85152 z m -85.0659,-1.98821 c 0,-2.57572 5.0495,-4.34913 6.9558,-2.4428 1.7337,1.73369 -0.9655,4.65424 -4.3016,4.65424 -1.9014,0 -2.6542,-0.62717 -2.6542,-2.21144 z m 5.5818,-0.6453 c 0,-0.27079 -0.7832,-0.49231 -1.7404,-0.49231 -0.9573,0 -1.4249,0.51059 -1.0393,1.13457 0.6373,1.03106 2.7797,0.53602 2.7797,-0.64226 z m 335.2734,0.1577 c 0.4114,-1.07193 0.7478,-3.16374 0.7478,-4.64853 0,-3.18875 3.3006,-3.70498 6.058,-0.94753 2.1739,2.17382 0.3968,6.34554 -2.5003,5.86942 -1.0357,-0.17022 -2.5964,0.13724 -3.4683,0.6831 -1.2119,0.75885 -1.409,0.53366 -0.8372,-0.95646 z m 6.3296,-2.76323 c 0,-0.54828 -0.7946,-1.30182 -1.7657,-1.67457 -2.731,-1.04794 -3.0919,-0.82071 -1.5834,0.99695 1.5403,1.85582 3.3491,2.22176 3.3491,0.67762 z m 62.5156,3.29549 c 0,-0.65024 1.2683,-1.18227 2.8185,-1.18227 1.9793,0 3.1345,-0.83103 3.8796,-2.79084 1.6938,-4.4552 7.8145,-3.03122 7.8145,1.81805 0,1.59396 -1.0645,1.92971 -6.1175,1.92971 -3.3646,0 -6.63,0.31667 -7.2563,0.70381 -0.6263,0.38704 -1.1388,0.17179 -1.1388,-0.47846 z m 12.2799,-2.73735 c 0,-0.85528 -0.7536,-1.84425 -1.6746,-2.19769 -1.6784,-0.64406 -2.3644,1.57441 -0.9302,3.00854 1.2517,1.2517 2.6048,0.83049 2.6048,-0.81085 z m -493.83038,0.99695 c -0.35341,-0.92103 -1.91422,-1.67458 -3.4685,-1.67458 -2.39566,0 -2.8259,-0.50989 -2.8259,-3.34902 0,-2.8065 0.44146,-3.34904 2.72499,-3.34904 3.27255,0 4.21517,1.31232 4.51732,6.28897 0.25062,4.12808 0.0261,4.62171 -0.94791,2.08367 z m 18.78781,-0.67058 c -0.94372,-2.97334 0.70108,-4.64839 4.09322,-4.16846 1.93433,0.27371 2.73501,1.19465 2.99378,3.44361 0.31587,2.7451 -7.8e-4,3.06992 -2.99473,3.06992 -2.421,0 -3.55406,-0.64932 -4.09227,-2.34507 z m 361.07457,0.29963 c 0.6021,-1.12495 1.8054,-2.63524 2.6741,-3.3561 0.9194,-0.76299 1.3569,-2.47397 1.0472,-4.09452 -0.459,-2.4006 -0.1254,-2.78379 2.4238,-2.78379 4.9549,0 4.7205,2.95873 -0.6165,7.78465 -5.2995,4.79185 -7.2428,5.65299 -5.5286,2.44976 z m -409.60013,-1.49887 c 0,-3.00926 3.14479,-3.84522 5.04171,-1.34022 2.21887,2.93027 2.08423,3.19463 -1.69522,3.32888 -2.57797,0.0915 -3.34649,-0.36515 -3.34649,-1.98866 z m 39.73822,1.48604 c -0.38631,-0.62505 -0.1584,-1.47267 0.50645,-1.88357 1.71636,-1.06076 2.82377,0.39222 1.39094,1.82501 -0.80173,0.80179 -1.42615,0.82102 -1.89739,0.0586 z m 165.67021,-0.7985 c 0,-0.95722 0.5023,-1.42989 1.1163,-1.05043 0.614,0.37947 1.1164,1.16264 1.1164,1.74041 0,0.57775 -0.5024,1.05043 -1.1164,1.05043 -0.614,0 -1.1163,-0.78317 -1.1163,-1.74041 z m 257.2421,-1.01493 c 1.7998,-1.47127 3.3977,-3.5283 3.5507,-4.57115 0.4575,-3.11754 2.4671,-4.50905 4.5837,-3.17396 3.0578,1.92886 2.9088,3.68982 -0.4348,5.13732 -1.7367,0.7519 -4.3558,2.26618 -5.82,3.36508 -3.9935,2.99703 -5.654,2.32802 -1.8796,-0.75729 z m 8.4491,-5.68315 c 0,-0.27076 -0.5023,-0.49228 -1.1163,-0.49228 -0.614,0 -1.1164,0.53199 -1.1164,1.18222 0,0.65024 0.5024,0.87175 1.1164,0.49229 0.614,-0.37947 1.1163,-0.91148 1.1163,-1.18223 z m -326.6998,6.46781 c -0.7061,-0.45109 -1.4597,-1.82493 -1.6746,-3.05286 -0.3186,-1.82149 0.2234,-2.23272 2.9431,-2.23272 2.3754,0 3.45,0.60341 3.738,2.09893 0.5655,2.93636 -2.4218,4.83784 -5.0065,3.18665 z m -23.6108,-1.60161 c -1.8341,-1.83418 -1.6905,-2.84243 0.7828,-5.49727 2.7429,-2.94421 7.238,-2.43794 7.7092,0.86826 0.2147,1.50648 -0.6074,3.06938 -2.202,4.18627 -3.0426,2.13114 -4.4991,2.23366 -6.29,0.44274 z m 7.5912,-4.28142 c 0,-0.59239 -1.0047,-1.07706 -2.2327,-1.07706 -1.5013,0 -2.2327,0.74422 -2.2327,2.27196 0,1.92607 0.34,2.09003 2.2327,1.07708 1.228,-0.6572 2.2327,-1.67959 2.2327,-2.27198 z m 105.3925,2.81882 c -0.9456,-3.76763 0.6548,-5.33647 4.4675,-4.37953 2.4492,0.6147 2.9497,1.30556 2.6733,3.68993 -0.2615,2.25549 -1.0407,3.01443 -3.3711,3.2831 -2.4775,0.2857 -3.166,-0.18798 -3.7697,-2.5935 z m 72.7639,0.98211 c -0.9902,-2.58059 3.24,-7.0096 5.0071,-5.24243 0.6728,0.67279 1.0551,2.41151 0.8496,3.8638 -0.4599,3.25156 -4.7504,4.26151 -5.8567,1.37863 z m 3.8086,-1.52895 c 0,-0.61399 -0.5023,-1.11635 -1.1164,-1.11635 -0.6139,0 -1.1163,0.50236 -1.1163,1.11635 0,0.61402 0.5024,1.11632 1.1163,1.11632 0.6141,0 1.1164,-0.5023 1.1164,-1.11632 z m 16.7453,1.20766 c 0,-2.51835 1.5221,-4.5567 3.4026,-4.5567 2.7434,0 3.7998,1.95439 2.1385,3.95609 -1.4848,1.7892 -5.5411,2.2288 -5.5411,0.60061 z m 39.5392,-0.46174 c 0.3572,-1.12466 0.6494,-3.00851 0.6494,-4.18627 0,-1.39717 0.7759,-2.14141 2.2327,-2.14141 1.4885,0 2.2326,0.74424 2.2326,2.23272 0,1.22796 -0.5725,2.23269 -1.2723,2.23269 -0.6998,0 -1.9967,0.87912 -2.882,1.95361 -1.5235,1.84901 -1.5749,1.84417 -0.9604,-0.0913 z m 61.2114,-1.28583 c 1.6884,-1.48612 3.07,-3.70122 3.07,-4.92242 0,-2.68018 1.4089,-3.71452 3.8064,-2.79448 2.3837,0.9147 2.2619,4.80017 -0.1783,5.69098 -1.0745,0.39225 -3.1517,1.63238 -4.616,2.75586 -3.9332,3.01771 -5.6544,2.41429 -2.0821,-0.72994 z m 7.5353,-5.04185 c 0,-0.61399 -0.5023,-1.11635 -1.1163,-1.11635 -0.6141,0 -1.1163,0.50236 -1.1163,1.11635 0,0.614 0.5022,1.11636 1.1163,1.11636 0.614,0 1.1163,-0.50236 1.1163,-1.11636 z m -372.58173,5.86088 c -1.99689,-0.66567 -1.72495,-4.37921 0.37982,-5.18689 2.47827,-0.95099 3.80648,0.13527 3.80648,3.11307 0,2.44586 -1.23493,3.05755 -4.1863,2.07382 z m 44.43053,-0.77028 c -0.7338,-0.88414 -2.4279,-1.76326 -3.7648,-1.95362 -3.63333,-0.51732 -3.3119,-4.81149 0.3601,-4.81149 2.1298,0 2.8824,0.66112 3.177,2.79087 0.2123,1.53498 0.9017,3.41881 1.5321,4.18631 0.6303,0.76753 0.8949,1.39541 0.5879,1.39541 -0.307,0 -1.1585,-0.72335 -1.8923,-1.60748 z m 244.1325,-0.90429 c 1.2813,-1.38148 2.4991,-3.76767 2.7065,-5.30266 0.2835,-2.09976 1.1386,-2.87848 3.4532,-3.14471 2.0151,-0.23178 3.3097,0.25448 3.753,1.40965 0.8416,2.19318 -1.4341,5.08413 -4.0022,5.08413 -1.0576,0 -2.8322,1.0047 -3.9435,2.23269 -1.1113,1.22799 -2.5326,2.23267 -3.1585,2.23267 -0.6259,0 -0.09,-1.13028 1.1915,-2.51177 z m 7.5488,-5.30266 c 0.3794,-0.61398 -0.093,-1.11634 -1.0505,-1.11634 -0.9572,0 -1.7404,0.50236 -1.7404,1.11634 0,0.61401 0.4727,1.11635 1.0504,1.11635 0.5778,0 1.361,-0.50234 1.7405,-1.11635 z m 27.3505,6.76399 c 0,-0.57776 0.5431,-1.38609 1.2068,-1.79631 0.6638,-0.41023 0.9154,-1.90702 0.5592,-3.32622 -0.9482,-3.77815 0.3396,-6.10684 3.3771,-6.10684 3.9195,0 3.5263,4.55504 -0.7635,8.84492 -3.6608,3.66072 -4.3796,4.05207 -4.3796,2.38445 z m 5.5818,-8.50439 c 0,-0.95723 -0.5024,-1.42994 -1.1164,-1.05047 -0.614,0.37947 -1.1163,1.16266 -1.1163,1.74042 0,0.57776 0.5023,1.05045 1.1163,1.05045 0.614,0 1.1164,-0.78318 1.1164,-1.7404 z m -378.25656,7.32216 c 0.56191,-1.68575 2.3571,-1.85948 2.8839,-0.2791 0.25583,0.7675 -0.37213,1.39545 -1.39545,1.39545 -1.02332,0 -1.69313,-0.50236 -1.48845,-1.11635 z m 146.27906,-1.33963 c -1.9782,-1.97821 -1.7248,-8.67542 0.3349,-8.84706 0.921,-0.0768 2.5343,-0.20234 3.5854,-0.2791 1.0509,-0.0768 2.6835,1.27241 3.628,2.99811 1.6265,2.9717 1.578,3.25217 -0.9181,5.30266 -3.041,2.49823 -4.7452,2.71037 -6.6302,0.82539 z m 4.8003,-4.31987 c 0,-0.86141 -0.8792,-1.73551 -1.9536,-1.94243 -1.9244,-0.37058 -2.7198,1.99821 -1.1861,3.5319 1.1701,1.17016 3.1397,0.17311 3.1397,-1.58947 z m 212.6646,3.54624 c 0,-0.5483 0.7535,-1.28606 1.6745,-1.6395 0.9211,-0.35341 1.6746,-1.88459 1.6746,-3.4026 0,-3.18514 1.2779,-4.30446 3.8065,-3.33416 2.7172,1.0427 2.1441,4.82282 -0.9072,5.98288 -1.4754,0.56094 -3.012,1.55321 -3.4149,2.20508 -0.8902,1.44033 -2.8335,1.56948 -2.8335,0.1883 z m 28.1879,-1.98945 c 1.6885,-1.80166 3.0699,-4.36898 3.0699,-5.70517 0,-2.79601 4.9455,-4.67113 6.9729,-2.64379 2.0535,2.05352 -0.8154,6.86991 -4.0922,6.86991 -1.5119,0 -3.0577,0.49967 -3.4352,1.11036 -0.3773,0.61067 -1.7885,1.68051 -3.1358,2.37738 -2.1069,1.08978 -2.0201,0.80876 0.6204,-2.00869 z m 8.0935,-5.75837 c 0,-2.18535 -2.1753,-2.00017 -2.6031,0.22158 -0.2612,1.35592 0.1229,1.90754 1.1011,1.5815 0.8261,-0.27538 1.502,-1.08677 1.502,-1.80308 z m -376.96633,6.15429 c -0.86921,-0.86923 -2.68728,-1.9317 -4.04012,-2.36109 -2.64106,-0.83823 -3.06296,-2.4212 -1.35806,-5.09563 1.47073,-2.30708 4.90626,-0.11598 5.42991,3.46307 0.21538,1.47227 0.95437,3.02631 1.64217,3.45342 0.68782,0.4271 0.94815,1.079 0.57854,1.44861 -0.36963,0.36961 -1.38322,-0.0392 -2.25244,-0.90838 z m 14.12298,-0.9915 c -0.40271,-1.04941 -1.60694,-1.48404 -3.24448,-1.17101 -1.43224,0.27379 -2.93739,-0.0416 -3.34474,-0.70061 -0.96571,-1.56255 1.26888,-5.70994 3.07651,-5.70994 1.41348,0 5.57252,7.83092 4.64935,8.75411 -0.27295,0.27294 -0.78443,-0.25472 -1.13664,-1.17255 z m 426.60065,0.43567 c -0.3106,-0.50248 1.2126,-1.55626 3.3848,-2.34175 3.0579,-1.10572 3.823,-1.91201 3.3891,-3.57145 -0.6718,-2.56849 2.1366,-5.70176 4.6788,-5.22022 2.6745,0.5066 3.0788,6.30069 0.4975,7.1281 -1.1156,0.35758 -3.855,1.61062 -6.0876,2.78452 -4.5714,2.40363 -5.0677,2.507 -5.8626,1.2208 z m 12.1068,-6.82374 c 0.8256,-1.33583 -1.2745,-2.6594 -2.7614,-1.74042 -1.2485,0.77161 -0.4288,2.77964 1.1346,2.77964 0.5416,0 1.2736,-0.46766 1.6268,-1.03922 z m -469.84316,5.7837 c -0.46081,-0.4605 -2.67202,-0.83726 -4.9138,-0.83726 -4.6169,0 -6.2831,-2.9641 -2.73394,-4.86355 1.66868,-0.89305 2.79063,-0.36828 5.80588,2.71556 2.05564,2.10239 3.49951,3.8225 3.20861,3.8225 -0.29091,0 -0.90594,-0.37676 -1.36675,-0.83725 z m 208.88136,0.12338 c -0.8918,-0.89188 0.1163,-2.63517 1.524,-2.63517 0.5777,0 1.0505,0.75353 1.0505,1.67453 0,1.72633 -1.3172,2.21785 -2.5745,0.96064 z m 212.4482,-0.045 c 0,-0.60586 0.3769,-1.48288 0.8374,-1.94892 0.4604,-0.46607 0.8372,-2.93599 0.8372,-5.48874 0,-3.94122 0.3729,-4.69435 2.4723,-4.99289 1.8549,-0.26375 2.6484,0.34984 3.1772,2.45674 0.5608,2.23418 -0.1158,3.65335 -3.3096,6.94181 -2.2079,2.27345 -4.0145,3.63785 -4.0145,3.032 z m 5.5818,-8.10588 c 0,-0.57775 -0.5024,-1.36094 -1.1164,-1.74041 -0.6139,-0.37946 -1.1163,0.0933 -1.1163,1.05047 0,0.95723 0.5024,1.74041 1.1163,1.74041 0.614,0 1.1164,-0.47271 1.1164,-1.05047 z m 59.1666,7.19039 c -0.7644,-0.92098 -3.4632,-1.76229 -5.9975,-1.86956 l -4.6078,-0.19502 4.8052,-0.43031 c 2.8302,-0.25343 5.0589,-1.09097 5.4221,-2.03765 0.3401,-0.8864 2.0655,-1.60738 3.8465,-1.60738 2.6258,0 3.2295,0.48004 3.2295,2.56761 0,4.65349 -4.0209,6.79803 -6.698,3.57231 z m 4.2095,-2.58156 c 0.2431,-0.72911 -0.3535,-1.32566 -1.3256,-1.32566 -0.9722,0 -1.7676,0.79539 -1.7676,1.76756 0,1.97138 2.4032,1.62806 3.0932,-0.4419 z m -51.0542,2.75765 c -0.023,-0.51715 0.9415,-2.19059 2.1435,-3.71878 1.7545,-2.23037 1.9329,-3.18315 0.9045,-4.82991 -1.7741,-2.84083 0.7868,-5.80575 4.6289,-5.35912 3.5748,0.41555 4.7509,4.96915 1.5693,6.07586 -1.1176,0.38873 -3.6457,2.52151 -5.6182,4.7395 -1.9724,2.21799 -3.6051,3.60959 -3.628,3.09245 z m 8.3306,-10.7814 c 0.3795,-0.614 -0.064,-1.11636 -0.9846,-1.11636 -0.9209,0 -1.985,0.50236 -2.3645,1.11636 -0.3794,0.61398 0.064,1.11634 0.9846,1.11634 0.9211,0 1.9851,-0.50236 2.3645,-1.11634 z m -261.5715,8.09354 c 0.2069,-1.07449 1.116,-1.95363 2.0202,-1.95363 0.9041,0 1.8132,0.87914 2.0201,1.95363 0.264,1.3707 -0.3388,1.9536 -2.0201,1.9536 -1.6815,0 -2.2842,-0.5829 -2.0202,-1.9536 z m 37.7433,-0.2791 c -2.5351,-4.73681 3.3265,-9.0862 6.7256,-4.99052 1.0836,1.30569 1.1214,2.35666 0.1606,4.46541 -1.5241,3.34513 -5.2258,3.62742 -6.8862,0.52511 z m 4.4654,-2.79088 c 0,-0.92099 -0.5024,-1.67453 -1.1163,-1.67453 -0.614,0 -1.1164,0.75354 -1.1164,1.67453 0,0.92099 0.5024,1.67453 1.1164,1.67453 0.6139,0 1.1163,-0.75354 1.1163,-1.67453 z m -154.05623,3.08447 c -3.3332,-0.61947 -4.3858,-2.03134 -3.64019,-4.88257 0.3799,-1.45275 1.55327,-2.10912 3.77039,-2.10912 2.93445,0 3.21886,0.34522 3.21886,3.90722 0,2.14898 -0.12559,3.83882 -0.27909,3.7552 -0.1535,-0.0836 -1.53498,-0.38542 -3.06997,-0.67073 z m 231.60343,-0.35707 c -1.2855,-2.08004 0.5329,-6.81141 2.4712,-6.42973 2.9149,0.57395 4.3799,3.78011 2.6692,5.84142 -1.6868,2.03242 -4.0787,2.30618 -5.1404,0.58831 z m 3.3882,-3.28561 c -0.3794,-0.61399 -0.9115,-1.11635 -1.1822,-1.11635 -0.2708,0 -0.4923,0.50236 -0.4923,1.11635 0,0.61399 0.532,1.11635 1.1823,1.11635 0.6501,0 0.8717,-0.50236 0.4922,-1.11635 z m -305.32168,1.86059 c 0,-0.81866 0.33055,-1.81902 0.73456,-2.22302 1.00954,-1.00955 3.85423,1.49235 3.09449,2.72162 -0.95125,1.53917 -3.82905,1.16442 -3.82905,-0.4986 z m 55.25445,0.36423 c -0.38213,-0.61834 0.11225,-1.43393 1.09862,-1.81244 2.13742,-0.8202 3.32863,0.0837 2.30121,1.74605 -0.92699,1.49991 -2.49494,1.53053 -3.39983,0.0665 z m 58.89233,0.3849 c -0.7675,-0.30969 -1.3954,-1.78953 -1.3954,-3.28854 0,-5.20556 8.8583,-6.19513 9.8603,-1.10151 0.7608,3.86839 -3.842,6.25545 -8.4649,4.39005 z m 4.1863,-3.72607 c 0,-0.61398 -0.5024,-1.11633 -1.1163,-1.11633 -0.614,0 -1.1164,0.50235 -1.1164,1.11633 0,0.61399 0.5024,1.11635 1.1164,1.11635 0.6139,0 1.1163,-0.50236 1.1163,-1.11635 z m 133.1015,-0.20931 c 0.69,-2.06996 3.0932,-2.41328 3.0932,-0.44188 0,0.97214 -0.7954,1.76754 -1.7676,1.76754 -0.9721,0 -1.5687,-0.59656 -1.3256,-1.32566 z m 70.359,-0.64058 c 1.6915,-1.04877 2.8897,-2.41688 2.6626,-3.04027 -0.7354,-2.01832 1.5369,-5.04064 3.79,-5.04064 1.5708,0 2.1934,0.76023 2.1934,2.67816 0,1.99579 -1.1466,3.27575 -4.4998,5.02357 -5.3772,2.80277 -8.5188,3.09006 -4.1462,0.37918 z m -163.0486,-0.48972 c -1.9139,-1.91393 -1.655,-6.11498 0.4262,-6.91357 5.8937,-2.26162 10.6095,0.79829 8.4693,5.49536 -1.3833,3.03619 -6.4671,3.84669 -8.8955,1.41821 z m 6.2647,-3.41768 c 0.2552,-1.32487 -0.3398,-1.94081 -1.8749,-1.94081 -2.5602,0 -3.9779,1.66733 -2.9004,3.41086 1.0866,1.75801 4.347,0.75431 4.7753,-1.47005 z m 110.952,3.41768 c -1.8039,-1.8039 -1.6906,-3.86859 0.2533,-4.61452 2.0415,-0.78339 4.4363,2.06149 3.5906,4.2654 -0.7812,2.03583 -2.0426,2.15039 -3.8439,0.34912 z m 37.2094,-1.34789 c 1.1686,-1.78362 1.3651,-2.93216 0.5839,-3.41494 -1.7915,-1.10724 -1.4127,-2.62368 0.9748,-3.90143 3.026,-1.61947 5.6627,-0.28452 5.6627,2.86703 0,2.37385 -1.0523,3.19773 -3.5949,2.81475 -0.4421,-0.0665 -1.3389,0.87863 -1.9928,2.10049 -0.654,1.22189 -1.6853,2.2216 -2.2918,2.2216 -0.6065,0 -0.3104,-1.20938 0.6581,-2.6875 z m 4.9886,-5.12694 c 0,-0.614 -0.5023,-1.11636 -1.1163,-1.11636 -0.614,0 -1.1164,0.50236 -1.1164,1.11636 0,0.61399 0.5024,1.11634 1.1164,1.11634 0.614,0 1.1163,-0.50235 1.1163,-1.11634 z m 55.8175,6.9465 c 0,-0.47738 0.7857,-1.98972 1.7461,-3.36077 1.024,-1.46196 1.4474,-3.43343 1.0241,-4.76736 -0.7976,-2.51288 1.1117,-5.51648 3.5064,-5.51648 2.5573,0 1.7537,5.24001 -1.5321,9.98988 -2.8946,4.1846 -4.7445,5.60949 -4.7445,3.65473 z m -338.07365,-1.98333 c -1.76817,-0.9214 -2.18388,-1.62402 -1.28829,-2.17752 0.7272,-0.44944 2.12323,-0.0162 3.10226,0.96287 2.33479,2.33479 1.4599,2.92062 -1.81397,1.21465 z m 10.61106,0.99065 c -1.17213,-1.17212 -0.86884,-4.62873 0.47924,-5.4619 1.7828,-1.10183 4.56449,2.1371 3.72169,4.33341 -0.7313,1.90572 -2.85361,2.47583 -4.20093,1.12849 z m 55.15069,-0.83695 c -0.7463,-0.89932 -2.0802,-1.35762 -2.9641,-1.01844 -2.2564,0.86584 -4.9278,-1.66216 -4.9278,-4.66314 0,-2.59176 2.4492,-3.85464 7.5354,-3.8855 1.923,-0.0118 2.5118,0.62355 2.5118,2.70976 0,1.49874 -0.5268,3.05055 -1.1706,3.44844 -0.7978,0.49309 -0.7472,1.23355 0.1591,2.32556 0.7313,0.88116 1.0785,1.85329 0.7714,2.16028 -0.3069,0.307 -1.1688,-0.17762 -1.9152,-1.07696 z m -1.1938,-5.75694 c 0,-1.0396 -0.7595,-1.60908 -1.8611,-1.39543 -2.8007,0.54316 -3.1852,3.1518 -0.4646,3.1518 1.3712,0 2.3257,-0.72081 2.3257,-1.75637 z m 260.0255,5.26238 c 0.6111,-1.14167 0.8156,-3.89575 0.4547,-6.12015 -0.5156,-3.17634 -0.2477,-4.20121 1.2476,-4.775 1.0929,-0.41941 2.6306,-0.004 3.6099,0.97541 1.5305,1.53047 1.3958,2.23544 -1.309,6.85075 -1.6582,2.8296 -3.4873,5.14475 -4.0645,5.14475 -0.6332,0 -0.6088,-0.82353 0.062,-2.07576 z m 4.2936,-7.7621 c 0.2431,-0.72911 -0.3535,-1.32565 -1.3257,-1.32565 -0.9721,0 -1.7675,0.79538 -1.7675,1.76755 0,1.9714 2.4032,1.62808 3.0932,-0.4419 z m -233.7489,7.11219 c -1.3921,-3.62782 0.057,-5.64697 4.0519,-5.64697 3.2761,0 3.831,0.35329 3.5068,2.23271 -0.2118,1.22797 -0.9013,2.86064 -1.5321,3.62812 -1.5586,1.89614 -5.2674,1.76452 -6.0266,-0.21386 z m 4.5949,-2.8561 c 0.3794,-0.61399 0.1875,-1.11634 -0.4265,-1.11634 -0.614,0 -1.4268,0.50235 -1.8062,1.11634 -0.3796,0.614 -0.1876,1.11636 0.4263,1.11636 0.614,0 1.4268,-0.50236 1.8064,-1.11636 z m 152.0022,1.95362 c 0.4779,-0.76749 0.7291,-2.47776 0.5582,-3.80061 -0.4129,-3.19796 1.8307,-4.43643 4.0382,-2.22898 1.6157,1.61573 1.5041,2.01638 -1.281,4.59751 -3.2963,3.05487 -4.7042,3.66303 -3.3154,1.43208 z m 3.7285,-4.18632 c 0,-0.61399 -0.5319,-1.11634 -1.1822,-1.11634 -0.6502,0 -0.8717,0.50235 -0.4923,1.11634 0.3795,0.614 0.9115,1.11636 1.1823,1.11636 0.2707,0 0.4922,-0.50236 0.4922,-1.11636 z m -275.48255,3.13975 c 0.68903,-2.06706 2.74766,-2.30142 3.47881,-0.39605 0.46306,1.20665 -0.0245,1.72171 -1.63001,1.72171 -1.27208,0 -2.09419,-0.58949 -1.8488,-1.32566 z m 212.65915,-2.17352 c -2.6065,-1.45864 -2.4254,-3.96881 0.395,-5.47832 3.0079,-1.60971 5.4946,-0.61174 5.4946,2.20508 0,2.87122 -3.3155,4.71382 -5.8896,3.27324 z m 167.9649,-2.08257 c 0.6877,-2.14898 1.4095,-4.53518 1.6042,-5.30266 0.4077,-1.60744 4.4504,-1.89258 5.3853,-0.37984 0.9883,1.59925 -0.5646,4.56614 -2.39,4.56614 -0.9104,0 -2.5991,1.13031 -3.7526,2.51179 l -2.0972,2.51179 z m 5.3772,-4.53129 c 0,-0.65023 -0.5023,-0.87175 -1.1163,-0.49229 -0.614,0.37948 -1.1164,0.91149 -1.1164,1.18223 0,0.27077 0.5024,0.49229 1.1164,0.49229 0.614,0 1.1163,-0.532 1.1163,-1.18223 z m 11.0646,5.19479 c 2.1387,-2.27665 2.3226,-3.05978 1.2074,-5.14343 -1.8547,-3.46552 0.1015,-5.24175 4.1884,-3.80424 3.6336,1.27788 4.2443,5.23768 0.9067,5.88044 -1.193,0.22976 -3.1134,1.6181 -4.2674,3.08525 -1.154,1.46714 -2.6517,2.66752 -3.3282,2.66752 -0.6765,0 -0.095,-1.2085 1.2931,-2.68554 z m 6.1912,-6.32239 c -0.3533,-0.57156 -1.4277,-1.03922 -2.3876,-1.03922 -1.4192,0 -1.4875,0.31071 -0.3659,1.66224 1.4414,1.73674 3.872,1.18677 2.7535,-0.62302 z m -416.89728,6.23127 c -2.75828,-3.32352 1.70247,-7.78427 5.02599,-5.02599 2.18085,1.80996 2.12214,5.15388 -0.10546,6.00869 -2.61882,1.00493 -3.40044,0.84883 -4.92048,-0.9827 z m 65.13461,0.34937 c -5.7492,-1.5137 -6.20445,-6.88982 -0.67296,-7.94724 5.44829,-1.0415 6.7444,0.68896 4.90806,6.5529 -0.62256,1.98802 -1.22584,2.18666 -4.2351,1.39434 z m 1.83459,-4.27081 c 0,-0.61399 -1.00472,-1.11634 -2.23269,-1.11634 -1.228,0 -2.23271,0.50235 -2.23271,1.11634 0,0.61399 1.00471,1.11636 2.23271,1.11636 1.22797,0 2.23269,-0.50237 2.23269,-1.11636 z m 397.42058,5.08653 c 0,-0.4055 1.4811,-1.25358 3.2913,-1.88465 1.8102,-0.63105 4.3051,-2.86552 5.5441,-4.96549 2.3109,-3.91665 3.8914,-4.56037 6.7531,-2.75042 1.2657,0.8006 1.3856,1.74021 0.5321,4.16921 -0.8877,2.52643 -1.9644,3.26578 -5.5413,3.80511 -2.4416,0.36818 -5.8209,1.05058 -7.5094,1.51646 -1.6884,0.46588 -3.0699,0.51527 -3.0699,0.10973 z m 14.322,-6.59615 c 0.2841,-1.4748 -0.174,-1.93292 -1.6489,-1.6489 -1.1231,0.21631 -2.2191,1.31227 -2.4354,2.43546 -0.2841,1.47479 0.174,1.93291 1.6488,1.64889 1.1232,-0.21631 2.2191,-1.31227 2.4355,-2.43545 z m -274.1831,4.23721 c -4.8743,-3.41405 -2.6504,-7.19298 4.233,-7.19298 4.0772,0 5.5327,3.65067 2.7024,6.7781 -2.3592,2.60688 -3.6921,2.68663 -6.9354,0.41488 z m 5.3333,-3.0997 c 0,-2.09972 -1.0743,-2.92301 -2.9001,-2.2224 -2.3745,0.91119 -1.871,3.71087 0.6674,3.71087 1.228,0 2.2327,-0.66982 2.2327,-1.48847 z m 46.0262,3.51186 c 0.69,-2.06997 3.0932,-2.41328 3.0932,-0.4419 0,0.97215 -0.7954,1.76755 -1.7676,1.76755 -0.9721,0 -1.5687,-0.59656 -1.3256,-1.32565 z m -218.12811,-0.54192 c -2.25158,-0.59631 -3.49941,-3.37574 -1.94645,-4.33553 1.77266,-1.09554 3.99832,0.2219 4.66195,2.75958 0.33471,1.27995 0.27883,2.2689 -0.12419,2.19767 -0.40301,-0.0711 -1.56911,-0.351 -2.59131,-0.62172 z m 106.23731,-0.9112 c -3.2665,-1.10991 -3.9073,-1.86056 -3.9073,-4.5771 0,-3.0405 0.2513,-3.22546 3.9073,-2.87628 5.0933,0.48643 5.9146,1.41549 4.8158,5.4474 -0.8874,3.25558 -1.0001,3.30254 -4.8158,2.00598 z m 1.6744,-3.91931 c 0.3796,-0.61402 0.1876,-1.11637 -0.4264,-1.11637 -0.6139,0 -1.4268,0.50235 -1.8062,1.11637 -0.3795,0.61399 -0.1876,1.11634 0.4264,1.11634 0.614,0 1.4268,-0.50235 1.8062,-1.11634 z m 133.9667,4.57807 c 0.49,-0.859 0.9407,-2.862 1.0013,-4.45111 0.069,-1.80947 0.8418,-3.02976 2.0674,-3.26516 2.2661,-0.43525 4.2129,3.31424 2.0885,4.02241 -0.759,0.25296 -2.4303,1.53898 -3.7141,2.85781 -1.2838,1.31885 -1.9333,1.69508 -1.4431,0.83605 z m 61.3702,-3.0229 c 1.2899,-1.96872 1.5402,-3.27677 0.7738,-4.04325 -1.6443,-1.6443 -0.306,-4.21003 2.196,-4.21003 3.543,0 3.6463,3.07082 0.2412,7.16812 -3.7598,4.52391 -5.9489,5.26373 -3.211,1.08516 z m -155.8591,0.79555 c 0.8369,-0.53027 1.088,-1.19237 0.5581,-1.47137 -0.53,-0.27898 -0.4926,-0.43398 0.083,-0.34444 2.0145,0.31337 1.9106,2.81397 -0.1164,2.79703 -1.5814,-0.0131 -1.7007,-0.23628 -0.5248,-0.98122 z m -160.60168,-1.18751 c -3.40074,-0.85997 -3.69411,-3.82523 -0.42461,-4.2918 1.67275,-0.23869 2.55954,0.40139 3.02568,2.18396 0.79546,3.04181 0.86609,2.98456 -2.60107,2.10784 z m 95.60238,-0.60508 c -0.3756,-0.97888 -2.0484,-1.67453 -4.0266,-1.67453 -2.8906,0 -3.3841,-0.41867 -3.3841,-2.87061 0,-1.57883 0.7914,-3.66203 1.7587,-4.62929 1.6007,-1.60071 1.9403,-1.56848 3.7803,0.35881 1.1118,1.16465 2.3526,4.00136 2.7573,6.30383 0.7468,4.24976 0.2845,5.56101 -0.8856,2.51179 z m -2.9453,-5.58175 c 0,-0.92097 -0.5024,-1.67452 -1.1164,-1.67452 -0.614,0 -1.1163,0.75355 -1.1163,1.67452 0,0.92099 0.5023,1.67453 1.1163,1.67453 0.614,0 1.1164,-0.75354 1.1164,-1.67453 z m -102.33075,5.36446 c -3.1022,-0.60497 -4.26659,-3.6243 -2.19615,-5.69477 2.13423,-2.13421 3.68722,-1.00971 4.29149,3.10752 0.27145,1.8495 0.45497,3.29431 0.40782,3.2107 -0.0472,-0.0837 -1.17359,-0.36418 -2.50316,-0.62345 z m 33.6752,-1.45724 c -1.11132,-1.22798 -2.91357,-2.23269 -4.00502,-2.23269 -2.50557,0 -3.87162,-4.04731 -2.09044,-6.1935 2.39074,-2.88066 5.65751,-1.08991 6.14705,3.36964 0.18184,1.65647 1.20159,3.9742 2.26614,5.15052 1.06454,1.17631 1.43318,2.13873 0.81919,2.13873 -0.61399,0 -2.0256,-1.00471 -3.13692,-2.2327 z m 34.39415,-1.82625 c -0.9416,-2.45385 1.0772,-5.43002 3.6834,-5.43002 1.5657,0 2.2014,0.93727 2.4609,3.62814 0.3134,3.25099 0.049,3.62813 -2.5469,3.62813 -1.6519,0 -3.1977,-0.78475 -3.5974,-1.82625 z m 73.5461,-0.12735 c 0.4744,-2.46361 2.4599,-2.40999 2.9393,0.0793 0.22,1.14208 -0.3572,1.87423 -1.4773,1.87423 -1.1498,0 -1.6973,-0.73167 -1.462,-1.95361 z m 105.8763,0.13667 c -0.019,-0.69229 0.6955,-1.86545 1.589,-2.60697 1.2912,-1.07164 1.3542,-1.78104 0.307,-3.45789 -1.0186,-1.63119 -1.0073,-2.41974 0.05,-3.4771 1.0791,-1.07908 1.3674,-0.96725 1.3674,0.5303 0,1.04378 0.5363,1.89779 1.1916,1.89779 0.701,0 0.8864,-0.96144 0.4504,-2.33531 -0.5906,-1.86074 -0.3223,-2.25463 1.3202,-1.93833 3.0454,0.5865 2.7025,5.56266 -0.4932,7.15586 -1.405,0.70047 -3.2729,2.22238 -4.1509,3.382 -0.8778,1.15962 -1.6121,1.54198 -1.6316,0.84965 z m 12.9065,-2.09227 c 1.0064,-1.53606 1.565,-3.80551 1.2414,-5.0432 -0.6968,-2.66424 1.842,-5.56015 4.8742,-5.56015 3.5399,0 2.5492,4.0546 -2.1817,8.92953 -4.9205,5.07023 -6.6382,5.80109 -3.9339,1.67382 z m 6.0358,-7.87835 c 0,-0.27076 -0.5022,-0.49229 -1.1163,-0.49229 -0.614,0 -1.1164,0.532 -1.1164,1.18223 0,0.65023 0.5024,0.87176 1.1164,0.49229 0.6141,-0.37946 1.1163,-0.91147 1.1163,-1.18223 z m -152.9305,8.4679 c -1.3552,-0.85678 -1.3986,-1.31946 -0.2327,-2.48537 1.1659,-1.16588 1.6287,-1.12259 2.4854,0.23261 0.5791,0.91585 1.0605,2.04196 1.0699,2.50245 0.023,1.12768 -1.3014,1.02813 -3.3226,-0.24969 z m 41.2956,-0.40837 c 0,-0.82245 -1.2559,-2.06756 -2.7909,-2.76695 -4.574,-2.08407 -3.3262,-8.01758 1.6861,-8.01758 0.5199,0 1.7338,0.78842 2.6974,1.75206 1.4306,1.43057 1.5057,2.19868 0.4092,4.18631 -0.7387,1.33885 -1.2084,3.31338 -1.044,4.38787 0.1644,1.07448 0.016,1.95362 -0.3295,1.95362 -0.3455,0 -0.6283,-0.67291 -0.6283,-1.49533 z m -0.3017,-6.66599 c -0.7476,-2.24304 -3.0474,-2.07793 -3.0474,0.2188 0,1.60544 0.5151,2.09306 1.7217,1.63001 0.947,-0.36338 1.5435,-1.19533 1.3257,-1.84881 z m -144.15618,6.10564 c -0.28617,-0.463 -0.13231,-1.46955 0.34186,-2.23678 0.67422,-1.09091 1.15106,-1.04687 2.18752,0.20201 1.04265,1.25632 0.96971,1.73349 -0.34185,2.2368 -0.91702,0.35187 -1.9014,0.26096 -2.18753,-0.20203 z m 218.69518,-0.17703 c -0.9345,-1.51193 0.3264,-3.34904 2.2985,-3.34904 0.8848,0 1.6087,1.00471 1.6087,2.2327 0,2.31118 -2.6932,3.08067 -3.9072,1.11634 z m 190.5191,0.13575 c -2.3922,-1.51622 -1.1318,-6.21997 1.7772,-6.63306 3.0559,-0.43394 4.2708,2.08472 2.5535,5.29374 -1.3596,2.54033 -2.083,2.76406 -4.3307,1.33932 z m 3.1676,-3.55068 c 0,-0.57776 -0.5024,-1.05047 -1.1164,-1.05047 -0.614,0 -1.1163,0.78319 -1.1163,1.74042 0,0.95723 0.5023,1.42993 1.1163,1.05046 0.614,-0.37946 1.1164,-1.16265 1.1164,-1.74041 z m -380.67533,1.64738 c 0,-0.97215 0.59655,-1.5687 1.32567,-1.32565 2.06996,0.68997 2.41327,3.0932 0.44189,3.0932 -0.97216,0 -1.76756,-0.7954 -1.76756,-1.76755 z m 118.57663,0.47873 c 0.5816,-1.74471 3.0114,-2.02825 3.3052,-0.3857 0.1099,0.61399 -0.7015,1.28992 -1.8031,1.50206 -1.284,0.24728 -1.8231,-0.15337 -1.5021,-1.11636 z m -100.25,-2.45861 c -0.3872,-1.00887 -1.63719,-1.83431 -2.7779,-1.83431 -2.93306,0 -4.82201,-3.82954 -2.74087,-5.55671 2.28889,-1.89961 5.59997,-0.92607 5.68077,1.67028 0.038,1.21655 0.4766,3.1127 0.9751,4.21367 0.4985,1.10096 0.605,2.30317 0.2366,2.67156 -0.3684,0.3684 -0.9866,-0.15564 -1.3737,-1.16449 z m -2.69773,-6.29972 c 0,-0.61398 -0.50236,-1.11634 -1.11634,-1.11634 -0.614,0 -1.11635,0.50236 -1.11635,1.11634 0,0.614 0.50235,1.11635 1.11635,1.11635 0.61398,0 1.11634,-0.50235 1.11634,-1.11635 z m 236.66613,7.00362 c 0,-0.5917 0.9767,-1.95968 2.1703,-3.03996 1.1938,-1.08025 2.3241,-2.99065 2.5119,-4.24531 0.532,-3.55465 3.81,-5.1008 6.0549,-2.85594 2.1245,2.12452 1.3463,5.3703 -1.2876,5.3703 -0.9812,0 -3.5087,1.31551 -5.6167,2.92336 -2.108,1.60785 -3.8328,2.43926 -3.8328,1.84755 z m 10.0472,-8.11996 c 0,-0.61399 -0.7536,-1.11635 -1.6745,-1.11635 -0.921,0 -1.6746,0.50236 -1.6746,1.11635 0,0.61398 0.7536,1.11634 1.6746,1.11634 0.9209,0 1.6745,-0.50236 1.6745,-1.11634 z m -133.856,6.26772 c -2.2133,-2.66684 0.4091,-6.48835 4.1554,-6.05554 2.5066,0.28957 2.9949,0.89209 2.9949,3.69504 0,2.77114 -0.4982,3.40694 -2.8864,3.68457 -1.5875,0.18455 -3.5063,-0.41128 -4.2639,-1.32407 z m 4.7631,-2.3605 c 0.3914,-1.02002 0,-1.67453 -0.9969,-1.67453 -0.9017,0 -1.6395,0.75353 -1.6395,1.67453 0,0.92098 0.4486,1.67453 0.9969,1.67453 0.5483,0 1.2861,-0.75355 1.6395,-1.67453 z m 96.4397,2.54473 c 1.5613,-0.75298 2.5117,-2.2162 2.5117,-3.86672 0,-3.33016 2.952,-4.57703 5.2933,-2.23574 1.46,1.45988 1.5188,2.07529 0.335,3.50171 -0.7899,0.9518 -2.3498,1.73055 -3.4664,1.73055 -1.1166,0 -2.3405,0.50235 -2.7201,1.11634 -0.3794,0.61399 -1.5394,1.08236 -2.5776,1.04081 -1.4329,-0.0574 -1.2825,-0.36744 0.6241,-1.28695 z m 6.4189,-4.21926 c -0.3794,-0.61399 -1.1626,-1.11635 -1.7403,-1.11635 -0.5777,0 -1.0505,0.50236 -1.0505,1.11635 0,0.61401 0.7832,1.11636 1.7404,1.11636 0.9573,0 1.43,-0.50235 1.0504,-1.11636 z m 94.3317,4.71349 c 0,-0.47753 1.0094,-1.73259 2.2432,-2.78902 1.894,-1.62162 2.0287,-2.26447 0.8653,-4.12746 -2.0534,-3.28792 0.2939,-5.33778 4.1174,-3.59566 3.8772,1.76655 3.5196,3.51086 -1.5892,7.75227 -4.475,3.71507 -5.6367,4.28392 -5.6367,2.75987 z m 7.8144,-8.06253 c 0,-0.61399 -0.7832,-1.11637 -1.7405,-1.11637 -0.9571,0 -1.4299,0.50238 -1.0504,1.11637 0.3795,0.61399 1.1627,1.11635 1.7404,1.11635 0.5778,0 1.0505,-0.50236 1.0505,-1.11635 z M 964.232,486.9929 c -1.2015,-1.94406 0.16692,-2.35577 1.69804,-0.51091 0.88051,1.06098 0.96522,1.70152 0.22496,1.70152 -0.65294,0 -1.51828,-0.53578 -1.923,-1.19061 z m 113.3554,0.18466 c -0.921,-0.48105 -2.6792,-1.3854 -3.9072,-2.00963 -1.228,-0.62425 -2.2328,-2.08495 -2.2328,-3.24602 0,-1.66836 0.8194,-2.11102 3.9073,-2.11102 3.7497,0 3.912,0.16874 4.0256,4.18632 0.065,2.30247 0.065,4.15677 0,4.12066 -0.065,-0.0362 -0.8719,-0.45925 -1.7929,-0.94031 z m -1.1164,-4.5758 c 0,-0.61398 -0.5319,-1.11634 -1.1822,-1.11634 -0.6502,0 -0.8717,0.50236 -0.4923,1.11634 0.3795,0.614 0.9115,1.11635 1.1823,1.11635 0.2707,0 0.4922,-0.50235 0.4922,-1.11635 z m 99.7962,1.3373 c 0.1036,-3.63908 0.4808,-4.17002 3.1871,-4.48139 4.0341,-0.46418 3.9882,1.72658 -0.1172,5.60138 l -3.1872,3.00818 z m 4.0244,-1.96135 c 0,-0.27077 -0.5024,-0.49229 -1.1163,-0.49229 -0.614,0 -1.1164,0.532 -1.1164,1.18224 0,0.65022 0.5024,0.87174 1.1164,0.49229 0.6139,-0.37948 1.1163,-0.91149 1.1163,-1.18224 z m 204.2854,4.69524 c 1.5314,-0.90775 3.061,-2.82309 3.3993,-4.25628 0.9032,-3.82569 6.0963,-3.707 6.0963,0.13932 0,2.1285 -0.7523,2.92444 -3.349,3.54344 -1.8421,0.43907 -4.605,1.11909 -6.1399,1.51116 l -2.7909,0.71284 z m 7.8211,-4.07119 c 0,-0.61398 -0.7832,-1.11634 -1.7405,-1.11634 -0.9572,0 -1.4299,0.50236 -1.0504,1.11634 0.3795,0.614 1.1627,1.11635 1.7404,1.11635 0.5777,0 1.0505,-0.50235 1.0505,-1.11635 z m -435.78416,2.78053 c -0.3556,-0.92669 -1.28847,-1.55464 -2.07303,-1.39545 -1.80205,0.36566 -1.89182,-2.71844 -0.0966,-3.31687 0.73147,-0.24381 2.12586,1.09581 3.09863,2.97695 0.97277,1.88113 1.30717,3.42025 0.74311,3.42025 -0.56407,0 -1.31655,-0.7582 -1.67214,-1.68488 z m 178.25886,0.14639 c 0.3247,-0.84617 0.064,-2.06529 -0.5803,-2.70914 -0.6439,-0.64387 -0.8462,-2.46334 -0.4497,-4.04326 0.525,-2.09164 1.4522,-2.87261 3.4109,-2.87261 2.5745,0 6.1983,2.55607 6.1983,4.37212 0,1.27783 -3.8795,4.55868 -5.3905,4.55868 -0.7192,0 -1.3075,0.50235 -1.3075,1.11634 0,0.614 -0.5561,1.11636 -1.2358,1.11636 -0.6798,0 -0.9701,-0.69233 -0.6454,-1.53849 z m 4.7321,-4.14053 c 1.0849,-1.75531 -1.2604,-3.67267 -3.4598,-2.82863 -1.5228,0.58432 -1.616,1.03197 -0.4965,2.38094 1.6335,1.96824 2.9262,2.11452 3.9563,0.44769 z m 11.2331,3.94001 c -0.4186,-1.09086 -0.299,-2.44552 0.2659,-3.01033 1.5106,-1.51052 2.7118,1.03303 1.5057,3.18816 -0.9133,1.63204 -1.0836,1.61494 -1.7716,-0.17783 z m 254.3243,-0.37432 c 0.42,-0.67964 1.4876,-1.23573 2.3724,-1.23573 0.8847,0 1.6086,-1.02047 1.6086,-2.26772 0,-2.81037 2.8141,-4.03138 5.0378,-2.18588 2.2373,1.85675 2.0968,4.18026 -0.2933,4.85322 -5.9254,1.66835 -9.4485,2.00596 -8.7255,0.83611 z m -375.857,-1.31014 c -2.6246,-1.54883 -2.4673,-4.0375 0.3504,-5.54553 2.926,-1.56594 5.765,0.49471 5.2852,3.83634 -0.3815,2.65727 -2.7908,3.38798 -5.6356,1.70919 z m 3.6281,-3.27463 c 0,-0.61399 -0.4727,-1.11637 -1.0504,-1.11637 -0.5778,0 -1.361,0.50238 -1.7405,1.11637 -0.3794,0.61399 0.093,1.11635 1.0505,1.11635 0.9573,0 1.7404,-0.50236 1.7404,-1.11635 z m 21.7689,2.23269 c -0.3796,-0.61398 -1.8547,-1.11634 -3.2783,-1.11634 -3.1079,0 -5.4244,-2.4855 -4.8922,-5.24903 0.295,-1.53177 1.4407,-2.00725 4.8367,-2.00725 4.2345,0 4.4384,0.15899 4.2108,3.28263 -0.1316,1.80543 0.3067,3.94046 0.974,4.74448 0.8434,1.01636 0.8514,1.46186 0.026,1.46186 -0.653,0 -1.4976,-0.50235 -1.8772,-1.11635 z m -1.6746,-5.58174 c 0,-0.61399 -1.0047,-1.11635 -2.2327,-1.11635 -1.2279,0 -2.2327,0.50236 -2.2327,1.11635 0,0.61399 1.0048,1.11634 2.2327,1.11634 1.228,0 2.2327,-0.50235 2.2327,-1.11634 z m -67.5443,3.33283 c -0.39257,-1.2369 -1.13464,-1.9888 -1.64901,-1.6709 -0.51438,0.3179 -1.76002,0.2615 -2.76811,-0.12534 -1.39911,-0.53688 -1.65931,-1.52846 -1.09948,-4.18993 0.40337,-1.91762 1.17094,-3.95196 1.70575,-4.52074 1.57325,-1.67323 5.39602,2.6245 5.24994,5.90222 -0.0722,1.6205 0.2573,3.8255 0.73226,4.89999 0.51345,1.16156 0.39302,1.95361 -0.297,1.95361 -0.63832,0 -1.48177,-1.012 -1.87435,-2.24891 z m -1.20064,-6.82657 c -0.88069,-1.42501 -2.70142,-0.0623 -2.70142,2.02178 0,1.4191 0.31069,1.48747 1.66222,0.3658 0.91423,-0.75873 1.38187,-1.83316 1.0392,-2.38758 z m -11.35316,7.15509 c -1.67593,-0.59855 -1.88009,-3.66135 -0.24404,-3.66135 1.15153,0 2.84345,3.12844 2.0565,3.80253 -0.22936,0.19647 -1.04495,0.13293 -1.81246,-0.14118 z m 39.3246,-1.47195 c -1.128,-1.82515 2.2718,-4.87041 4.4881,-4.01997 1.014,0.38912 1.6757,1.58811 1.4706,2.66446 -0.432,2.26642 -4.7839,3.25641 -5.9587,1.35551 z m -50.02294,-0.70094 c -1.32152,-1.32151 -0.79057,-4.58086 0.84867,-5.2099 2.0938,-0.80345 4.21527,1.83245 3.33049,4.13812 -0.71273,1.85739 -2.84637,2.40458 -4.17916,1.07178 z m 204.66414,-0.19909 c 0,-0.51885 1.0047,-1.85258 2.2327,-2.96391 1.247,-1.12844 2.2327,-3.43831 2.2327,-5.23161 0,-3.79826 2.7651,-5.31981 5.2151,-2.86977 1.5129,1.51292 1.1446,2.24111 -3.465,6.85075 -5.2389,5.23887 -6.2155,5.90106 -6.2155,4.21454 z m -76.6883,-2.343 c -0.3121,-1.19347 -1.6465,-2.32377 -2.9655,-2.51177 -1.8442,-0.2629 -2.398,-1.1152 -2.398,-3.69088 0,-3.06419 0.3562,-3.37853 4.1864,-3.69554 3.8141,-0.31566 4.1863,-0.0982 4.1863,2.44593 0,1.5358 -0.5042,3.10399 -1.1205,3.48485 -0.6162,0.38085 -0.8129,1.91757 -0.4371,3.41493 0.3758,1.49735 0.3306,2.72245 -0.1004,2.72245 -0.431,0 -1.0391,-0.97648 -1.3512,-2.16997 z m -0.3399,-6.20265 c 1.1612,-1.39901 0.9999,-1.67452 -0.9797,-1.67452 -1.3618,0 -2.3693,0.71203 -2.3693,1.67452 0,0.92099 0.4408,1.67452 0.9797,1.67452 0.5388,0 1.605,-0.75353 2.3693,-1.67452 z m 32.0128,5.17057 c -1.0913,-5.45662 0.8138,-7.26134 4.8268,-4.57261 1.4424,0.96638 1.3503,1.39502 -0.6641,3.0916 -1.2863,1.08332 -2.5814,2.69791 -2.8781,3.58802 -0.2967,0.89009 -0.8747,-0.058 -1.2846,-2.10701 z m 2.8034,-3.14229 c -0.8059,-0.32247 -1.7687,-0.28283 -2.1396,0.0881 -0.371,0.37095 0.2883,0.63479 1.4652,0.58631 1.3004,-0.0535 1.565,-0.31808 0.6744,-0.67445 z m 171.9955,2.99529 c 0.074,-2.14897 -0.2504,-4.74782 -0.721,-5.77522 -0.5966,-1.30266 -0.178,-2.23054 1.383,-3.06595 4.4918,-2.40391 7.7292,1.34283 3.9036,4.51774 -1.015,0.84244 -2.4879,3.03897 -3.2729,4.88118 l -1.4273,3.34949 z m 4.1785,-6.69809 c 0,-0.61399 -0.4727,-1.11635 -1.0505,-1.11635 -0.5777,0 -1.361,0.50236 -1.7404,1.11635 -0.3794,0.61399 0.093,1.11635 1.0505,1.11635 0.9573,0 1.7404,-0.50236 1.7404,-1.11635 z m 42.4212,8.30054 c 0,-0.34663 1.4823,-1.87742 3.2938,-3.40176 1.8215,-1.53265 3.0306,-3.45751 2.705,-4.30611 -0.88,-2.29315 1.6037,-6.17443 3.951,-6.17443 1.1312,0 2.7171,0.79565 3.5242,1.76809 1.7861,2.15221 0.2032,5.27771 -2.9882,5.9006 -1.1622,0.22681 -3.7633,1.85947 -5.7801,3.62813 -3.6539,3.20422 -4.7057,3.78212 -4.7057,2.58548 z m 11.7217,-9.41689 c 0.3796,-0.614 -0.093,-1.11634 -1.0504,-1.11634 -0.9572,0 -1.7404,0.50234 -1.7404,1.11634 0,0.61398 0.4727,1.11635 1.0505,1.11635 0.5777,0 1.3609,-0.50237 1.7403,-1.11635 z m -198.1521,7.82842 c 0,-0.54921 0.5024,-1.30902 1.1164,-1.6885 0.614,-0.37946 1.1163,-2.11362 1.1163,-3.85367 0,-3.90503 3.194,-5.53543 5.2733,-2.69183 1.634,2.23476 1.7046,2.76948 0.5696,4.3128 -1.2792,1.73948 -8.0756,5.03949 -8.0756,3.9212 z m 6.081,-6.80742 c -0.3594,-0.58159 -1.1293,-0.76333 -1.7109,-0.40389 -0.5816,0.35942 -0.7634,1.12936 -0.4039,1.71093 0.3594,0.58159 1.1294,0.76334 1.7109,0.4039 0.5816,-0.35944 0.7634,-1.12936 0.4039,-1.71094 z m -157.8986,4.57185 c -0.6539,-1.22185 -1.5507,-2.16708 -1.9929,-2.1005 -4.19307,0.63158 -5.31266,-5.02935 -1.2497,-6.3189 3.0374,-0.96403 3.9112,0.11352 4.7817,5.8965 0.7797,5.18031 0.3021,5.96317 -1.5391,2.5229 z m -1.1223,-5.59285 c 0,-0.614 -0.4727,-1.11634 -1.0504,-1.11634 -0.5778,0 -1.361,0.50234 -1.7405,1.11634 -0.3794,0.61398 0.093,1.11635 1.0505,1.11635 0.9572,0 1.7404,-0.50237 1.7404,-1.11635 z m 425.9298,3.75605 c 2.2682,-2.44747 2.6106,-3.66725 2.0367,-7.25627 -0.6517,-4.07611 -0.5301,-4.31423 2.2045,-4.31423 1.7688,0 3.3672,0.88385 4.1107,2.27308 1.0514,1.9645 0.5204,2.9496 -3.9108,7.25628 -5.4891,5.3349 -8.9809,6.93972 -4.4411,2.04114 z m 7.0047,-8.15167 c 0.2791,-0.83728 -0.1395,-1.2559 -0.9768,-0.97681 -0.8059,0.26861 -1.685,1.14773 -1.9537,1.95361 -0.279,0.83726 0.1396,1.2559 0.9769,0.9768 0.8058,-0.26863 1.6849,-1.14775 1.9536,-1.9536 z m -412.5753,6.02147 c -1.9876,-2.08902 -3.6139,-4.56531 -3.6139,-5.5029 0,-2.0472 4.3784,-2.32416 4.8893,-0.30926 0.1947,0.76749 0.9237,3.12056 1.6201,5.22905 0.6964,2.10847 1.143,3.95682 0.9924,4.10745 -0.1507,0.15062 -1.9002,-1.43534 -3.8879,-3.52434 z m 17.3177,0.72349 c -1.6886,-1.64538 -3.07,-3.31356 -3.07,-3.70708 0,-1.5384 3.6219,-4.224 5.6967,-4.224 1.9232,0 2.1501,0.67517 1.8739,5.57696 -0.173,3.06734 -0.5655,5.52493 -0.8725,5.46133 -0.307,-0.0637 -1.9397,-1.46185 -3.6281,-3.10721 z m 2.5117,-4.08976 c 0,-0.27075 -0.5024,-0.49227 -1.1163,-0.49227 -0.614,0 -1.1164,0.53199 -1.1164,1.18222 0,0.65023 0.5024,0.87177 1.1164,0.49229 0.6139,-0.37946 1.1163,-0.91147 1.1163,-1.18224 z m 65.4157,4.35848 c 0.3188,-1.93703 0.048,-3.85052 -0.6021,-4.2522 -1.5477,-0.95657 -1.52,-4.72303 0.042,-5.68835 1.8066,-1.11646 4.8325,2.31733 3.6531,4.1454 -0.5331,0.82641 -1.5776,3.26082 -2.3209,5.40979 -1.3355,3.86094 -1.3447,3.86549 -0.7719,0.38536 z m 261.6748,1.69849 c 0,-0.90052 0.6237,-2.26106 1.3861,-3.02342 1.104,-1.10391 1.0732,-1.57952 -0.1511,-2.33615 -1.0298,-0.63646 -1.29,-1.93468 -0.7884,-3.93321 0.5703,-2.27219 1.3353,-2.89937 3.2096,-2.6316 3.5152,0.50217 3.5985,3.33941 0.2434,8.28342 -3.6811,5.42438 -3.8996,5.62843 -3.8996,3.64096 z m 4.4654,-8.84784 c 0,-0.57775 -0.7535,-1.05045 -1.6745,-1.05045 -1.7263,0 -2.2178,1.31724 -0.9607,2.57446 0.892,0.89189 2.6352,-0.11632 2.6352,-1.52401 z m -305.3609,6.30266 c -1.0796,-1.64768 -2.9395,-2.88771 -4.3312,-2.88771 -2.4035,0 -5.1185,-1.87097 -5.1185,-3.52714 0,-1.85969 6.2796,-6.52002 8.7854,-6.52002 2.5225,0 2.6358,0.28954 2.0715,5.29585 -0.3283,2.91272 -0.1014,6.22105 0.5035,7.35187 1.74,3.25143 0.1848,3.48517 -1.9107,0.28715 z m -0.5361,-8.74856 c 0.011,-0.4605 -0.9338,-0.83726 -2.0961,-0.83726 -2.7397,0 -3.9781,3.07547 -1.453,3.6085 1.7981,0.37958 3.5121,-0.95876 3.5491,-2.77124 z m 79.278,9.20989 c 0,-1.63732 0.7442,-2.2327 2.7908,-2.2327 2.0468,0 2.7909,0.59538 2.7909,2.2327 0,1.63731 -0.7441,2.23269 -2.7909,2.23269 -2.0466,0 -2.7908,-0.59538 -2.7908,-2.23269 z m 258.9305,-3.04425 c 0.9099,-1.83892 0.887,-3.03549 -0.089,-4.59661 -2.0113,-3.22059 -0.4241,-5.96972 3.2047,-5.551 4.3326,0.49991 4.2172,3.00109 -0.3768,8.16828 -2.1835,2.45597 -3.4165,3.34666 -2.7399,1.97933 z m 3.4117,-7.62697 c 0,-0.27075 -0.5023,-0.49229 -1.1164,-0.49229 -0.6139,0 -1.1163,0.53202 -1.1163,1.18223 0,0.65025 0.5024,0.87177 1.1163,0.4923 0.6141,-0.37947 1.1164,-0.91147 1.1164,-1.18224 z m -423.57873,7.4452 c -0.38813,-0.62804 -1.39234,-0.87839 -2.23154,-0.55634 -1.92481,0.73861 -3.08653,-1.04745 -2.19408,-3.37317 1.09901,-2.86395 4.57803,-2.12465 5.39925,1.14733 0.77598,3.09176 0.21262,4.70157 -0.97363,2.78218 z m 28.39093,-0.0795 c 0,-0.59008 -1.0426,-2.04414 -2.3168,-3.23125 -1.6162,-1.50573 -1.9243,-2.40086 -1.019,-2.96036 1.5128,-0.93502 2.4201,-0.0324 4.2162,4.1945 0.7892,1.85734 0.8729,3.06996 0.212,3.06996 -0.6008,0 -1.0924,-0.48279 -1.0924,-1.07285 z m 113.2252,-1.53022 c 0.3533,-1.12472 0.6425,-3.51091 0.6425,-5.30266 0,-2.51351 0.51,-3.25775 2.2327,-3.25775 2.5842,0 3.122,3.82313 0.7382,5.24719 -0.822,0.49099 -2.1158,1.89745 -2.8752,3.12542 -1.1558,1.86915 -1.2761,1.89973 -0.7382,0.1878 z m 10.7278,-0.81733 c 0.8884,-1.66005 0.8941,-2.71261 0.019,-3.76573 -1.7973,-2.16559 -0.1956,-5.0937 2.7862,-5.0937 3.9432,0 4.3262,1.90709 1.1428,5.69025 -1.5789,1.87653 -2.8708,3.87566 -2.8708,4.44255 0,0.56688 -0.52,1.0307 -1.1556,1.0307 -0.7716,0 -0.7459,-0.76571 0.078,-2.30407 z m 257.2126,-1.57213 c -0.5081,-2.7083 -1.3432,-3.93826 -2.6742,-3.93826 -3.1217,0 -5.5373,-3.50286 -4.4265,-6.419 1.9326,-5.07382 9.5542,-1.52072 8.5054,3.96519 -0.2918,1.52653 -0.121,4.20343 0.3795,5.94866 0.5005,1.74524 0.4701,3.44506 -0.068,3.77739 -0.5378,0.33235 -1.3102,-1.16797 -1.7165,-3.33398 z m -1.6238,-7.00821 c -0.011,-0.4605 -0.4908,-1.5866 -1.0698,-2.50245 -0.7958,-1.2587 -1.3674,-1.35057 -2.3416,-0.37635 -0.7089,0.70885 -0.9513,1.83494 -0.5388,2.50244 0.8451,1.36748 3.9765,1.66582 3.9502,0.37636 z m -275.4019,7.25626 c 0.2781,-0.76749 -0.1945,-2.2019 -1.0502,-3.1876 -1.7328,-1.9961 -0.9257,-5.46409 1.2717,-5.46409 2.433,0 4.4767,3.24345 2.9841,4.73597 -0.7108,0.71077 -1.2923,2.19655 -1.2923,3.30173 0,1.10518 -0.5442,2.00944 -1.2094,2.00944 -0.6651,0 -0.9818,-0.62796 -0.7039,-1.39545 z m 1.9133,-5.92671 c 0,-0.27076 -0.5023,-0.49229 -1.1163,-0.49229 -0.614,0 -1.1164,0.532 -1.1164,1.18224 0,0.65023 0.5024,0.87176 1.1164,0.49229 0.614,-0.37947 1.1163,-0.91149 1.1163,-1.18224 z m -39.3513,3.88007 c -2.5227,-2.76288 -2.4825,-4.37236 0.1091,-4.37236 1.5267,0 2.0876,0.87053 2.1581,3.34905 0.052,1.84198 0,3.30718 -0.1092,3.25603 -0.1125,-0.0512 -1.0835,-1.05591 -2.158,-2.23272 z m 69.4927,1.36018 c 0,-0.62447 0.5228,-1.45848 1.1618,-1.85339 0.6389,-0.39492 0.866,-1.64984 0.5045,-2.78876 -0.4329,-1.36407 0.073,-2.46153 1.4823,-3.21581 2.3992,-1.28395 3.5796,-0.59606 3.4878,2.0324 -0.067,1.92127 -6.6364,7.68788 -6.6364,5.82556 z m -51.3673,-2.03852 c -0.011,-1.11072 -0.3166,-3.14369 -0.6849,-4.51771 -0.4662,-1.73947 -0.099,-2.7169 1.2067,-3.2182 2.5842,-0.99165 4.8643,1.35027 3.0657,3.14882 -0.7367,0.73679 -1.3396,2.2142 -1.3396,3.28315 0,1.06894 -0.5023,2.25401 -1.1163,2.63349 -0.614,0.37946 -1.1233,-0.21883 -1.1316,-1.32955 z m -65.5211,-1.18223 c -0.395,-1.07447 -1.3839,-2.35532 -2.1977,-2.84634 -0.8138,-0.491 -1.4797,-1.87247 -1.4797,-3.06995 0,-1.55814 0.7672,-2.17724 2.6979,-2.17724 2.4532,0 2.6978,0.45554 2.6978,5.02359 0,5.31782 -0.5385,6.27999 -1.7183,3.06994 z m -30.4921,-3.09693 c -0.7767,-0.93583 -1.1015,-2.01213 -0.7219,-2.39178 0.8108,-0.81078 4.0933,1.68609 4.0933,3.11363 0,1.53771 -1.8195,1.14814 -3.3714,-0.72185 z m 12.5671,-3.37074 c -4.5646,-4.79733 -4.7737,-7.48936 -0.544,-7.00266 2.4105,0.27735 3.0864,0.95276 3.1466,3.14411 0.042,1.53497 0.4809,3.69166 0.9751,4.79263 1.5194,3.38452 0.2049,3.04134 -3.5777,-0.93408 z m 33.9973,0.82707 c -4.1195,-1.99866 -3.8177,-6.20109 0.4811,-6.69964 3.3527,-0.38879 4.5743,1.60451 3.4204,5.58116 -0.7182,2.47513 -0.9614,2.54485 -3.9015,1.11848 z m 2.3216,-4.4763 c 0.6696,-2.00928 -1.6378,-1.58707 -2.4165,0.44213 -0.4172,1.08722 -0.1676,1.59759 0.6481,1.32567 0.7295,-0.24318 1.5253,-1.0387 1.7684,-1.7678 z m 40.5963,3.4847 c -0.083,-1.34525 -0.6543,-2.75638 -1.2683,-3.13585 -1.9347,-1.19573 -1.2114,-4.84296 1.1064,-5.57858 4.1142,-1.30581 6.1587,2.2336 2.8678,4.9648 -0.8841,0.73375 -1.8204,2.42792 -2.0807,3.76482 l -0.4731,2.43072 z m 2.0807,-7.10896 c 0,-0.57775 -0.5023,-1.05046 -1.1163,-1.05046 -0.614,0 -1.1164,0.78318 -1.1164,1.74041 0,0.95723 0.5024,1.42993 1.1164,1.05046 0.614,-0.37947 1.1163,-1.16265 1.1163,-1.74041 z m -18.9289,5.92672 c -0.027,-1.38148 -0.5675,-2.51178 -1.2013,-2.51178 -1.7799,0 -3.2274,-4.81075 -1.9315,-6.41901 1.6411,-2.03648 5.0695,-1.70513 5.7751,0.55817 0.335,1.07449 -0.1116,3.96304 -0.9922,6.41901 -1.1221,3.12961 -1.6158,3.71402 -1.6501,1.95361 z m 1.0673,-7.04307 c 0,-0.65023 -0.5024,-0.87176 -1.1163,-0.49229 -0.614,0.37947 -1.1164,0.91147 -1.1164,1.18224 0,0.27075 0.5024,0.49229 1.1164,0.49229 0.6139,0 1.1163,-0.53201 1.1163,-1.18224 z m 32.5014,7.60125 c 0.1237,-0.76749 -0.1871,-2.3472 -0.6907,-3.51049 -0.6557,-1.51466 -0.3266,-2.54572 1.1594,-3.63229 2.8527,-2.08598 4.8985,-0.0639 3.0042,2.96919 -0.752,1.20433 -1.3674,2.95004 -1.3674,3.87936 0,0.92931 -0.5244,1.68967 -1.1652,1.68967 -0.641,0 -1.0641,-0.62794 -0.9403,-1.39544 z m 2.6933,-6.20341 c -0.3438,-0.34371 -1.2446,-7.2e-4 -2.0018,0.76221 -1.0944,1.10254 -0.9661,1.23077 0.6248,0.62494 1.1011,-0.41922 1.7207,-1.04343 1.377,-1.38715 z m 248.3582,2.68043 c 0,-2.7913 -0.6484,-4.28087 -2.2327,-5.12873 -4.1583,-2.22545 -1.6509,-8.537 3.0164,-7.59271 1.3951,0.28226 1.9111,1.24659 1.6921,3.16215 -0.1733,1.51581 -0.3108,4.86872 -0.3054,7.45091 0,2.58216 -0.4808,4.998 -1.0804,5.36853 -0.6304,0.3896 -1.09,-0.98518 -1.09,-3.26015 z m 0.8605,-9.38481 c 0.2431,-0.72914 -0.3535,-1.32567 -1.3256,-1.32567 -0.9721,0 -1.7676,0.7954 -1.7676,1.76754 0,1.9714 2.4033,1.62809 3.0932,-0.44187 z m -296.7429,8.44604 c -0.7541,-2.08539 -2.433,-4.25802 -3.7306,-4.82805 -1.2979,-0.57005 -2.5247,-2.20152 -2.7265,-3.62549 -0.3286,-2.31878 0.022,-2.55187 3.3491,-2.2327 3.1927,0.30617 3.6735,0.73769 3.4151,3.06477 -0.1654,1.48964 0.2614,4.41186 0.9485,6.49381 1.6485,4.99482 0.5119,6.01557 -1.2556,1.12766 z m 81.5432,2.99093 c 0,-0.6063 0.7972,-2.24043 1.7715,-3.6314 1.3954,-1.99227 1.4873,-2.87128 0.4333,-4.1414 -1.9506,-2.35027 -0.478,-4.98984 2.7838,-4.98984 1.5542,0 2.8259,0.2101 2.8259,0.46686 0,0.2568 0.2605,1.14573 0.5789,1.97542 0.3184,0.8297 -1.4399,3.73922 -3.9073,6.46563 -2.4673,2.72641 -4.4861,4.46104 -4.4861,3.85473 z m 6.1399,-9.41359 c -0.3794,-0.61399 -0.9114,-1.11636 -1.1822,-1.11636 -0.2707,0 -0.4923,0.50237 -0.4923,1.11636 0,0.61398 0.5321,1.11634 1.1823,1.11634 0.6502,0 0.8718,-0.50236 0.4922,-1.11634 z m -19.2563,4.93088 c -0.2308,-3.16274 0.1025,-3.81454 1.9536,-3.81454 2.7651,0 2.9021,2.72443 0.2784,5.53575 -1.8894,2.0246 -1.9627,1.9681 -2.232,-1.72121 z m -89.4357,1.45309 c -0.083,-1.09377 -0.9056,-2.2778 -1.8266,-2.63122 -1.7797,-0.68295 -2.3482,-3.75275 -0.6948,-3.75275 1.8812,0 3.6532,3.24651 3.1652,5.7994 -0.3274,1.71288 -0.5426,1.90833 -0.6438,0.58457 z m -14.6646,-3.03492 c 0,-0.61399 0.5024,-1.11635 1.1163,-1.11635 0.614,0 1.1164,0.50236 1.1164,1.11635 0,0.61398 -0.5024,1.11635 -1.1164,1.11635 -0.6139,0 -1.1163,-0.50237 -1.1163,-1.11635 z m 94.1169,-0.83616 c 0.3098,-1.38086 0.1081,-2.79199 -0.4483,-3.13584 -0.5563,-0.34385 -1.0115,-1.60024 -1.0115,-2.79199 0,-1.56704 0.7724,-2.16682 2.7909,-2.16682 3.4527,0 3.5853,2.0554 0.4482,6.95021 -1.7899,2.79296 -2.2096,3.0629 -1.7793,1.14444 z m 300.137,0.57205 c -1.8816,-1.88167 -1.5954,-3.96401 0.7151,-5.20047 2.352,-1.25884 3.5031,-0.6209 6.015,3.33349 1.8365,2.89139 1.8358,2.89254 -1.7969,3.02911 -1.9989,0.0751 -4.2188,-0.44781 -4.9332,-1.16213 z m 3.0619,-2.65312 c -1.6222,-1.9545 -2.6579,-1.19054 -1.7155,1.26531 0.3785,0.98638 1.2185,1.46568 1.8666,1.06511 0.8093,-0.50016 0.7619,-1.23019 -0.1511,-2.33042 z m -342.2209,-0.96416 c 0.455,-1.18548 0.013,-3.17571 -1.0743,-4.83462 -1.739,-2.65422 -1.725,-2.90926 0.2407,-4.34656 1.8037,-1.31894 2.2805,-1.26376 3.5009,0.40519 0.9454,1.29285 1.042,2.30278 0.2922,3.05258 -0.6163,0.6163 -1.1206,2.24632 -1.1206,3.62225 0,1.37595 -0.5876,2.86495 -1.306,3.30892 -0.8986,0.55539 -1.0648,0.17863 -0.5329,-1.20776 z m 14.6586,-2.7589 c 0.5427,-1.70979 0.1852,-2.88868 -1.1781,-3.88559 -2.213,-1.61821 -1.5409,-4.76524 1.2462,-5.83474 2.7997,-1.07435 4.644,1.44866 2.9923,4.09348 -0.7521,1.20433 -1.3675,3.17158 -1.3675,4.37165 0,1.20008 -0.5562,2.52572 -1.236,2.94582 -0.8378,0.51783 -0.9849,-0.0267 -0.4569,-1.69062 z m 11.1078,-1.47777 c 0.49,-2.20691 0.199,-3.28178 -1.0148,-3.74757 -2.5468,-0.97727 -2.1427,-5.62032 0.5504,-6.32457 2.0682,-0.54084 5.6096,1.68778 5.5272,3.47829 -0.019,0.41664 -1.3207,2.76696 -2.8923,5.22294 -2.5058,3.91574 -2.773,4.0845 -2.1705,1.37091 z m 21.9724,-1.02594 c -0.071,-1.65224 -0.6332,-3.31539 -1.2488,-3.69588 -1.5314,-0.94643 0.7143,-5.02172 2.7672,-5.02172 2.4502,0 2.8382,1.57455 1.1769,4.77654 -0.8395,1.61808 -1.7602,3.84266 -2.0461,4.94354 -0.342,1.31732 -0.564,0.97461 -0.6492,-1.00248 z m 2.1032,-5.99261 c 0,-0.27076 -0.5023,-0.49229 -1.1163,-0.49229 -0.6141,0 -1.1164,0.532 -1.1164,1.18223 0,0.65023 0.5023,0.87175 1.1164,0.49229 0.614,-0.37948 1.1163,-0.91149 1.1163,-1.18223 z m 259.8862,7.09889 c 1.6822,-1.68218 1.7351,-5.63289 0.097,-7.27065 -1.7663,-1.76629 -0.2192,-3.66958 2.9828,-3.66958 1.9808,0 2.7249,0.60978 2.7249,2.23269 0,1.22799 -0.4014,2.2327 -0.892,2.2327 -0.4906,0 -1.5279,1.75826 -2.3049,3.90722 -0.7771,2.14899 -1.9833,3.90724 -2.6803,3.90724 -0.9054,0 -0.8848,-0.38257 0.072,-1.33962 z m -323.5181,-0.89309 c 0,-0.61399 0.5023,-1.11634 1.1163,-1.11634 0.614,0 1.1163,0.50235 1.1163,1.11634 0,0.61401 -0.5023,1.11635 -1.1163,1.11635 -0.614,0 -1.1163,-0.50234 -1.1163,-1.11635 z m 305.1639,-2.79949 c -0.3553,-0.92572 0.1398,-2.88235 1.1002,-4.34807 1.1747,-1.79277 1.5324,-3.98201 1.0931,-6.68948 -0.4275,-2.63426 -0.217,-4.02454 0.6093,-4.02454 0.6943,0 1.2624,1.55409 1.2624,3.45354 0,2.51472 0.607,3.61229 2.2327,4.03743 2.2164,0.57961 2.6902,1.57152 2.2878,4.78886 -0.4822,3.85493 -7.3231,6.07183 -8.5855,2.78226 z m 6.337,-2.27139 c 2.1385,-2.5768 -0.2985,-4.5577 -2.6787,-2.17742 -1.0043,1.00432 -1.826,2.29251 -1.826,2.86264 0,1.64881 2.9385,1.20181 4.5047,-0.68522 z m -42.4435,-1.84042 c 0.011,-0.80373 0.4755,-2.18594 1.0359,-3.07159 0.6971,-1.10178 0.4407,-2.03306 -0.8122,-2.94916 -1.5448,-1.12961 -1.5981,-1.61952 -0.341,-3.13421 1.874,-2.25813 3.8842,-2.28698 5.7141,-0.082 1.1808,1.42274 1.0146,2.09274 -0.9796,3.9507 -1.3209,1.23056 -2.4017,2.94173 -2.4017,3.80257 0,0.86082 -0.5023,1.87562 -1.1163,2.2551 -0.614,0.37946 -1.1086,0.0324 -1.0992,-0.77139 z m 3.5412,-8.36383 c -0.8058,-0.32248 -1.7687,-0.28283 -2.1397,0.0881 -0.3709,0.37095 0.2885,0.6348 1.4653,0.58632 1.3005,-0.0536 1.565,-0.3181 0.6744,-0.67445 z m 78.3944,5.33735 c 1.0569,-1.16783 1.8288,-2.8005 1.7153,-3.62815 -0.4408,-3.2154 0.1441,-4.29565 2.326,-4.29565 3.9887,0 3.9087,3.24204 -0.1662,6.727 -4.2613,3.64434 -6.7995,4.42826 -3.8751,1.1968 z m -11.9917,-4.96603 c 0.3613,-2.22643 0.1037,-4.10635 -0.6243,-4.5563 -1.7939,-1.1087 -1.5207,-4.59276 0.4911,-6.26245 2.5418,-2.10941 6.041,1.42039 4.2505,4.2875 -0.6774,1.08472 -1.5853,3.58263 -2.0177,5.55091 -1.07,4.87172 -2.8673,5.7109 -2.0996,0.98034 z m 2.0435,-7.42319 c 0.3795,-0.614 -0.093,-1.11637 -1.0504,-1.11637 -0.9572,0 -1.7405,0.50237 -1.7405,1.11637 0,0.61398 0.4728,1.11634 1.0505,1.11634 0.5778,0 1.361,-0.50236 1.7404,-1.11634 z m -88.0056,-5.20966 c -1.2698,-1.2699 -0.8198,-4.5013 0.816,-5.85889 1.2102,-1.00447 2.5868,-0.75953 6.1398,1.09238 4.4826,2.33643 6.3112,4.18132 2.8146,2.83954 -0.9708,-0.37255 -2.8408,0.076 -4.1556,0.99692 -2.577,1.80509 -4.4324,2.11241 -5.6148,0.93005 z m 3.7213,-3.16298 c 0,-0.92099 -0.5024,-1.67453 -1.1164,-1.67453 -0.614,0 -1.1163,0.75354 -1.1163,1.67453 0,0.92099 0.5023,1.67453 1.1163,1.67453 0.614,0 1.1164,-0.75354 1.1164,-1.67453 z m 30.3398,-1.58518 c -0.7423,-2.12932 -2.0383,-3.38748 -3.7374,-3.62814 -3.4684,-0.4913 -4.3592,-5.93412 -1.1101,-6.78379 3.003,-0.7853 3.9404,0.14283 5.3521,5.29901 0.6725,2.45598 1.5967,5.34452 2.0537,6.41901 0.4762,1.11908 0.35,1.95362 -0.2954,1.95362 -0.6196,0 -1.6379,-1.46688 -2.2629,-3.25971 z m -2.4311,-7.41149 c 0,-0.27077 -0.5024,-0.4923 -1.1164,-0.4923 -0.614,0 -1.1163,0.532 -1.1163,1.18224 0,0.65023 0.5023,0.87176 1.1163,0.49228 0.614,-0.37946 1.1164,-0.91147 1.1164,-1.18222 z m 53.6187,7.17939 c -0.018,-0.38551 0.7401,-2.55342 1.6861,-4.81757 1.1369,-2.72078 2.3357,-3.99725 3.5357,-3.76447 2.9756,0.5772 2.9454,3.05132 -0.051,4.19065 -1.5354,0.58371 -3.3192,1.96829 -3.964,3.07681 -0.645,1.10854 -1.1878,1.7001 -1.2065,1.31458 z m -10.081,-6.18835 c 0,-1.02613 -0.8156,-2.76689 -1.8124,-3.86836 -1.6915,-1.86895 -1.6166,-2.09186 1.121,-3.3392 1.6134,-0.7351 3.1502,-1.11974 3.4152,-0.85476 0.8531,0.85301 -0.7507,9.92804 -1.7545,9.92804 -0.5331,0 -0.9693,-0.83957 -0.9693,-1.86572 z m -20.9516,-13.76319 c -0.7958,-1.27427 -2.6034,-2.2327 -4.2108,-2.2327 -3.6209,0 -4.9328,-3.15474 -2.1563,-5.18501 3.0246,-2.21156 6.3752,-1.95784 5.8173,0.44054 -0.25,1.07447 0.5078,3.58626 1.6837,5.58174 2.2778,3.86518 1.2208,5.16598 -1.1339,1.39543 z m 13.1619,-9.68622 c 0.014,-1.11948 0.8927,-3.1626 1.9536,-4.54023 l 1.9288,-2.50479 -0.013,4.16644 c -0.011,3.06393 -0.5262,4.26535 -1.9537,4.54025 -1.2767,0.2459 -1.9325,-0.32276 -1.9162,-1.66167 z m 20.3486,-1.25939 c -2.6589,-0.26335 -3.6282,-0.91205 -3.6282,-2.42829 0,-2.21347 1.909,-3.36679 4.1864,-2.52928 0.7674,0.28223 1.3953,1.17109 1.3953,1.97521 0,0.80413 0.6281,1.68633 1.3955,1.96043 2.3422,0.83651 0.4888,1.40206 -3.349,1.02193 z m -24.7068,-6.54388 c -0.072,-1.3303 -0.76,-2.64898 -1.5275,-2.93041 -1.1163,-0.40933 -1.1163,-0.8075 0,-1.99083 2.0363,-2.15841 3.3798,0.0321 2.448,3.99094 -0.5889,2.50177 -0.8217,2.73712 -0.9205,0.9303 z m -12.4119,-12.09378 c 0,-0.921 0.7125,-1.67453 1.5832,-1.67453 0.8708,0 2.5035,-0.32971 3.6282,-0.73269 1.2889,-0.4618 0.948,0.15729 -0.922,1.67453 -3.5094,2.84722 -4.2894,2.98046 -4.2894,0.73269 z" id="path4018-8" style="fill:#2e3436"/>
+ <g transform="matrix(0.42389391,0,0,0.42389391,1049.1506,83.111946)" id="g4143-2-6" style="display:inline">
+ <path d="m -306,1342.3622 c 1.2074,11.2282 2.13691,22.4863 2.78739,33.7605 1.02723,17.8041 1.35834,35.6399 1.7449,53.4694 0.22235,10.2554 0.4631,20.5104 0.67263,30.7661 0.31568,15.4513 0.56049,30.9041 0.73442,46.3576 8.54284,0.78 17.13192,1.0533 25.70706,0.8179 9.13053,-0.2507 18.24015,-1.0775 27.2929,-2.2928 8.9578,-1.2026 17.86264,-2.7854 26.7071,-4.6465 4.35225,-0.9158 8.69081,-1.8992 13,-3 3.55815,-0.9089 7.10291,-1.9001 10.5252,-3.2322 11.93382,-4.6451 22.13846,-13.4961 28.6464,-24.5252 7.0356,-11.9233 9.72678,-26.2865 7.8284,-40 -0.95427,-6.8934 -3.01763,-13.5878 -5.4142,-20.1213 -3.08253,-8.4035 -6.73687,-16.6131 -11.2322,-24.3535 -4.78296,-8.2356 -10.52966,-15.9423 -17.3536,-22.5858 -4.81919,-4.6918 -10.14948,-8.8314 -15.6464,-12.7071 -4.98251,-3.513 -10.19132,-6.8562 -16,-8.7071 -9.27395,-2.9551 -19.26724,-1.8896 -29,-2 -9.6754,-0.1097 -19.3328,-1.4131 -29,-1 -7.47016,0.3192 -14.89556,1.6693 -22,4" id="path3027-0-2" style="fill:none;stroke:#2e3436;stroke-width:6;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"/>
+ <path d="m -293.061,1354.6006 c -1.14816,16.2499 -0.79259,32.6057 1.0607,48.7904 0.62198,5.4317 1.41197,10.8425 2.1213,16.2635 1.32229,10.1054 2.36431,20.2468 3.182,30.4055 1.15515,14.3512 1.86271,28.7383 2.1213,43.1336 5.09342,1.3064 10.30901,2.1362 15.5564,2.4748 5.41711,0.3496 10.86093,0.1762 16.2634,-0.3535 6.54025,-0.6413 13.02017,-1.8031 19.4455,-3.182 5.81375,-1.2476 11.5887,-2.6737 17.3241,-4.2426 6.71263,-1.8362 13.44495,-3.8997 19.4454,-7.4247 4.06036,-2.3853 7.72918,-5.4129 10.9602,-8.8388 2.97392,-3.1533 5.60024,-6.6748 7.4246,-10.6066 3.94063,-8.4927 3.89392,-18.2148 3.8891,-27.5772 -0.002,-4.1372 0.0162,-8.3008 -0.7071,-12.3743 -0.92177,-5.1915 -3.02294,-10.0953 -5.3033,-14.8493 -2.28466,-4.763 -4.7737,-9.4436 -7.7782,-13.7886 -3.28422,-4.7495 -7.16345,-9.0665 -11.3137,-13.0814 -3.11691,-3.0153 -6.38952,-5.8651 -9.546,-8.8389 -4.32361,-4.0734 -8.46726,-8.4103 -13.435,-11.6672 -3.27355,-2.1462 -6.86724,-3.7925 -10.6066,-4.9498 -5.6014,-1.7336 -11.47881,-2.366 -17.3241,-2.8284 -7.40994,-0.5862 -14.86192,-0.9135 -22.2739,-0.3536 -6.95198,0.5251 -13.84459,1.8324 -20.5061,3.8891" id="path3799-0-1" style="fill:none;stroke:#2e3436;stroke-width:6;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"/>
+ <path d="m -130.0729,1339.7514 c -1.23151,13.3929 -1.46807,26.8772 -0.7071,40.3051 0.63574,11.218 1.96561,22.3848 2.82846,33.5876 0.45334,5.8859 0.7777,11.781 1.06064,17.6776 1.11878,23.3155 1.59042,46.662 1.4142,70.0036 0.99756,2.1042 3.05787,3.6702 5.3523,4.0681 1.20892,0.2097 2.47047,0.1082 3.63036,-0.2919 1.1599,-0.4001 2.21567,-1.0981 3.03819,-2.0085 -0.0936,-14.3827 -0.44721,-28.7636 -1.06065,-43.1335 -0.30698,-7.1911 -0.67902,-14.3792 -1.0607,-21.5667 -0.45651,-8.5966 -0.92701,-17.2035 -0.7071,-25.8094 0.24408,-9.552 1.33835,-19.0867 1.0607,-28.6378 -0.20622,-7.094 -1.16799,-14.1416 -1.7678,-21.2132 -0.60818,-7.1703 -0.8443,-14.3721 -0.7071,-21.5668 -1.30319,-1.381 -3.02241,-2.3643 -4.87353,-2.7874 -2.54728,-0.5821 -5.32504,-0.074 -7.50087,1.3732" id="path3803-1-0" style="fill:none;stroke:#2e3436;stroke-width:6;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"/>
+ <path d="m -91.216775,1508.4461 c 1.495459,1.3098 3.375851,2.1746 5.343549,2.4575 2.563756,0.3686 5.258869,-0.2702 7.384373,-1.7504 l 14.849242,-33.5876 c 14.346684,0.4856 28.692289,1.0031 43.036671,1.5525 18.8906894,0.7235 37.779259,1.5024 56.665386,2.3366 l 16.263456,28.9914 c 1.715993,0.7095 3.687118,0.7818 5.450476,0.1999 1.883823,-0.6217 3.510749,-1.9877 4.449019,-3.7355 -5.519137,-17.448 -12.599963,-34.4017 -21.130147,-50.5921 -3.333511,-6.3271 -6.891653,-12.5457 -9.816772,-19.0716 -5.152385,-11.4949 -8.26858,-23.775 -12.20588,-35.7407 -6.073227,-18.4569 -14.142706,-36.2562 -24.0223455,-52.9875 -2.5282526,-1.5148 -5.4538455,-2.3597 -8.4004165,-2.4259 -2.707646,-0.061 -5.427747,0.5337 -7.863039,1.7188 -5.079394,12.5286 -10.172021,25.0518 -15.277869,37.5697 -5.725332,14.0366 -11.467651,28.0673 -17.452441,41.9953 -6.470825,15.0591 -13.223808,29.9951 -19.983979,44.9265 -5.757538,12.7169 -11.520633,25.4313 -17.289283,38.1431" id="path6340-7-9" style="fill:none;stroke:#2e3436;stroke-width:6;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"/>
+ <path d="m -57.982756,1464.6054 c 8.480576,0.3893 16.969463,0.5976 25.458928,0.6246 16.282237,0.052 32.6353108,-0.5593 48.787284,1.4968 5.230739,0.6659 10.425987,1.6105 15.556349,2.8284 l -0.707107,-5.6569 c -9.857341,-19.7044 -19.048817,-39.7418 -27.5534675,-60.0667 -5.4801018,-13.0966 -10.6750907,-26.3126 -15.5800455,-39.6353 -9.041596,17.3108 -17.15043,35.1088 -24.279588,53.291 -3.398601,8.6678 -6.577465,17.4292 -10.405296,25.9162 -3.293437,7.3021 -7.063088,14.3894 -11.277057,21.2019" id="path6344-7-3" style="fill:none;stroke:#2e3436;stroke-width:6;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"/>
+ <path d="m 139.30004,1361.3678 c 1.25704,-0.01 2.49023,-0.4331 3.56049,-1.0924 1.07027,-0.6594 1.98659,-1.5452 2.79269,-2.5098 1.05788,-1.2659 1.94508,-2.6903 2.48049,-4.2507 0.5354,-1.5604 0.70829,-3.2628 0.35871,-4.875 -0.31694,-1.4617 -1.05595,-2.8167 -2.03985,-3.9432 -0.9839,-1.1265 -2.20732,-2.0302 -3.52846,-2.7313 -2.64228,-1.4024 -5.62894,-1.9927 -8.57382,-2.5179 -9.60821,-1.7136 -19.66953,-2.8909 -28.99138,0 -8.19306,2.5408 -15.189519,8.0743 -20.8595,14.5112 -4.674839,5.3071 -8.604164,11.3472 -10.960305,18.0157 -1.614417,4.5692 -2.472723,9.3711 -3.085864,14.1782 -0.897746,7.0384 -1.275591,14.2494 0.257437,21.1772 1.565357,7.0739 5.113302,13.6529 9.899495,19.0919 8.998367,10.2258 21.784267,16.1027 33.408887,23.2024 6.17703,3.7726 12.13985,7.9831 17.21196,13.1466 4.2236,4.2997 7.77443,9.202 11.60455,13.8556 2.52841,3.072 5.23027,6.1177 6.69671,9.8163 1.96468,4.9553 1.47503,10.6249 -0.33275,15.6395 -1.81424,5.0326 -5.00309,9.6685 -9.46395,12.6213 -3.3861,2.2413 -7.40454,3.4492 -11.45551,3.7301 -3.91559,0.2716 -7.87026,-0.3026 -11.60745,-1.5022 -5.88124,-1.8878 -11.42411,-5.5276 -14.41328,-10.9329 -1.33127,-2.4074 -2.11489,-5.0708 -3.121194,-7.6311 -1.0063,-2.5603 -2.296544,-5.1023 -4.385837,-6.8918 -0.81666,-0.6995 -1.757809,-1.2769 -2.798114,-1.5489 -1.040305,-0.272 -2.18706,-0.219 -3.141592,0.2761 -0.947135,0.4912 -1.646427,1.3852 -2.044145,2.3753 -0.397717,0.99 -0.514773,2.0732 -0.501431,3.1401 0.03859,3.086 1.139434,6.0885 2.725349,8.7361 1.585916,2.6476 3.6458,4.9768 5.755564,7.2293 4.776139,5.0993 9.98372,9.9723 16.26782,13.026 5.48477,2.6652 11.59297,3.8395 17.67767,4.2427 4.36212,0.2891 8.77983,0.1917 13.04989,-0.7455 4.27007,-0.9371 8.40053,-2.7452 11.70892,-5.6029 4.62029,-3.9908 7.35619,-9.7463 9.18232,-15.572 1.76838,-5.6415 2.80731,-11.6233 1.98218,-17.4776 -1.14022,-8.0898 -5.74406,-15.3095 -11.17457,-21.4132 -11.81252,-13.2768 -27.6236,-22.2555 -41.01219,-33.9412 -8.36373,-7.2999 -15.836197,-15.7435 -21.213205,-25.4558 -2.8291,-5.1101 -5.091722,-10.6585 -5.530471,-16.483 -0.462149,-6.1351 1.112014,-12.2217 2.702044,-18.1652 1.28612,-4.8075 2.671542,-9.769 5.833649,-13.6118 2.052319,-2.4941 4.764427,-4.3868 7.668383,-5.8009 2.90395,-1.414 6.00762,-2.3708 9.12538,-3.2147 2.70721,-0.7328 5.46352,-1.3884 8.26772,-1.4372 2.8042,-0.049 5.68772,0.5509 7.99574,2.1443 2.134,1.4733 3.63091,3.6741 5.38916,5.5801 0.87912,0.9531 1.83979,1.8456 2.95082,2.514 1.11102,0.6684 2.38428,1.1057 3.68084,1.0982" id="path6348-0-2" style="fill:none;stroke:#2e3436;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"/>
+ <path d="m 197.28279,1364.1963 c 1.14732,12.9375 1.70611,25.9272 1.67404,38.9155 -0.0323,13.0718 -0.6624,26.1529 -0.0217,39.2091 0.42487,8.6581 1.4089,17.2886 2.94391,25.8201 6.56087,-1.0694 13.0588,-2.5248 19.449,-4.3561 8.67539,-2.4863 17.38786,-5.8067 24.03806,-11.9074 4.18499,-3.8392 7.41021,-8.6795 9.56337,-13.9347 2.425,-5.9187 3.4958,-12.2883 4.57877,-18.5922 1.30298,-7.5845 2.64778,-15.3708 1.15762,-22.9208 -1.75873,-8.9107 -7.48568,-16.8002 -14.9462,-21.9804 -6.98005,-4.8466 -15.30927,-7.4168 -23.67823,-8.8903 -8.15951,-1.4366 -16.49075,-1.8952 -24.75864,-1.3628" id="path6352-2-6" style="fill:none;stroke:#2e3436;stroke-width:6;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"/>
+ <path d="m 184.55487,1351.4684 c 1.19542,14.5958 2.13842,29.2122 2.82843,43.8406 0.83359,17.6722 1.29793,35.3603 2.12132,53.033 1.16625,25.0318 3.05291,50.03 5.65685,74.9533 0.50951,0.9553 1.28255,1.7684 2.21097,2.3255 0.92842,0.557 2.00961,0.8565 3.09233,0.8565 1.08272,0 2.16391,-0.2995 3.09233,-0.8565 0.92842,-0.5571 1.70146,-1.3702 2.21097,-2.3255 l -2.12132,-42.4264 c 4.7545,-0.3889 9.48277,-1.0982 14.14214,-2.1213 6.42007,-1.4098 12.69698,-3.412 18.87885,-5.6456 6.3403,-2.2909 12.70589,-4.895 17.8907,-9.2037 4.81089,-3.998 8.3997,-9.3156 11.03086,-14.9906 2.79042,-6.0185 4.55559,-12.4626 5.9397,-18.9505 1.48878,-6.9785 2.55354,-14.0801 2.52527,-21.2156 -0.0316,-7.985 -1.45963,-16.0106 -4.64659,-23.3321 -2.8208,-6.4803 -7.01063,-12.3639 -12.23039,-17.129 -5.43487,-4.9614 -11.94956,-8.6873 -18.8823,-11.1553 -9.04644,-3.2204 -18.70316,-4.3084 -28.28428,-4.9497 -8.47176,-0.5671 -16.96567,-0.803 -25.45584,-0.7071" id="path6356-2-0" style="fill:none;stroke:#2e3436;stroke-width:6;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"/>
+ <path d="m 335.87572,1371.9744 c 5.10326,-3.114 10.95175,-4.8776 16.87457,-5.6902 7.07305,-0.9704 14.30033,-0.618 21.3092,0.7405 10.99867,2.1318 21.5459,6.7849 30.30044,13.7759 10.19422,8.1406 17.73742,19.2223 23.27944,31.0324 4.77948,10.1851 8.18601,21.0762 9.35262,32.2663 0.81667,7.8335 0.5268,15.8081 -1.18965,23.4948 -1.742,7.8011 -4.94946,15.2622 -9.319,21.9554 -4.23808,6.4918 -9.55742,12.2567 -15.5576,17.1661 -5.97265,4.8869 -12.65809,8.952 -19.89569,11.63 -4.08419,1.5112 -8.35312,2.5804 -12.69778,2.8774 -5.06502,0.3463 -10.13379,-0.3574 -15.19226,-0.789 -4.62262,-0.3944 -9.30221,-0.5681 -13.78552,-1.7615 -4.36456,-1.1618 -8.44943,-3.2764 -12.06456,-5.9838 -8.22646,-6.1608 -13.84508,-15.1529 -18.54649,-24.2922 -4.71177,-9.1595 -8.71546,-18.7328 -11.15199,-28.7408 -1.55175,-6.3738 -2.46085,-12.8967 -2.86434,-19.4442 -0.45932,-7.4534 -0.25735,-15.0054 1.45013,-22.2751 1.28803,-5.4839 3.41707,-10.7409 5.89881,-15.7979 2.20453,-4.4921 4.69307,-8.8447 7.44358,-13.0249 4.37688,-6.6519 9.55889,-12.9916 16.35609,-17.1392" id="path6360-0-6" style="fill:none;stroke:#2e3436;stroke-width:6;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"/>
+ <path d="m 339.41126,1357.1252 c 5.82734,-2.2354 12.13102,-2.9206 18.3672,-3.1758 8.0957,-0.3312 16.32677,0.048 24.0592,2.4687 9.96645,3.12 18.58613,9.4532 26.64717,16.0928 6.77813,5.5829 13.36103,11.5138 18.60767,18.5554 5.45927,7.327 9.34357,15.6793 13.34159,23.8954 3.89173,7.9977 7.98195,16.0968 9.28582,24.895 1.08918,7.3495 0.17668,14.8294 -0.65714,22.2123 -0.89009,7.8811 -1.74859,15.9778 -5.35327,23.0425 -2.50635,4.9121 -6.22152,9.0796 -9.70296,13.3563 -2.78116,3.4165 -5.43959,6.9406 -8.4425,10.1639 -4.25055,4.5625 -9.15181,8.4783 -14.26228,12.0514 -4.33946,3.034 -8.89446,5.8581 -13.90775,7.5619 -6.55954,2.2293 -13.60558,2.4485 -20.52976,2.6791 -7.30794,0.2434 -14.66455,0.5203 -21.89665,-0.5577 -9.72058,-1.4489 -19.06029,-5.378 -26.89791,-11.3077 -5.73495,-4.3389 -10.64642,-9.7071 -14.82139,-15.5624 -4.63834,-6.5052 -8.39504,-13.6373 -11.14684,-21.1379 -2.28014,-6.215 -3.86837,-12.6659 -5.11661,-19.1672 -2.72862,-14.2117 -3.83672,-28.9309 -1.06066,-43.1335 2.74067,-14.0215 9.1894,-27.1062 17.15419,-38.9669 3.36212,-5.0067 7.02154,-9.847 11.34903,-14.0474 4.3275,-4.2004 9.35313,-7.7582 14.98385,-9.9182" id="path6364-5-2" style="fill:none;stroke:#2e3436;stroke-width:6;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"/>
+ <path d="m 582.65034,1526.813 c 1.89519,0.1151 3.79037,0.2303 5.68556,0.3454 1.80923,0.1099 3.61846,0.2199 5.42769,0.3298 1.65044,-5.4756 3.70915,-10.828 6.1534,-15.9983 2.98352,-6.311 6.54191,-12.35 10.6167,-18.018 5.84652,0.6857 11.67431,1.5311 17.47468,2.5349 5.7224,0.9903 11.43023,2.1364 17.21741,2.6213 3.8241,0.3204 7.66934,0.3507 11.48898,0.7205 4.45991,0.4318 8.86023,1.3239 13.27983,2.0617 6.82087,1.1387 13.70277,1.9117 20.60629,2.3147 0.2527,4.2443 1.05162,8.4558 2.37083,12.4978 1.25231,3.837 2.97308,7.5209 5.11193,10.9438 2.23196,0.4528 4.55665,0.4432 6.78479,-0.028 2.18279,-0.4616 4.27106,-1.3656 6.10148,-2.6412 -3.27243,-7.4153 -6.74718,-14.7413 -10.41909,-21.9671 -2.38758,-4.6984 -4.86492,-9.3688 -6.71952,-14.302 -1.40128,-3.7274 -2.43824,-7.5822 -3.79054,-11.3276 -1.24253,-3.4414 -2.74816,-6.7818 -4.05008,-10.2012 -2.16899,-5.6966 -3.76554,-11.593 -5.72794,-17.3641 -1.68193,-4.9463 -3.63257,-9.8003 -5.2084,-14.7814 -1.4091,-4.4541 -2.51625,-9.0028 -4.05082,-13.4152 -1.43375,-4.1225 -3.23368,-8.1063 -4.87928,-12.1489 -1.86765,-4.5881 -3.54062,-9.2649 -4.74791,-14.0692 -0.6678,-2.6574 -1.19279,-5.3523 -1.9792,-7.9771 -1.07048,-3.5729 -2.62422,-7.0007 -4.60562,-10.1607 0.0246,-1.1362 -0.35416,-2.277 -1.05338,-3.1729 -0.69923,-0.8959 -1.71393,-1.5404 -2.82207,-1.7925 -1.41806,-0.3226 -2.97232,0.015 -4.12822,0.898 -1.15589,0.8826 -1.89155,2.2929 -1.95396,3.7458 -1.3116,5.0228 -3.02967,9.9394 -5.13189,14.6859 -2.19928,4.9657 -4.81375,9.7362 -7.12402,14.6512 -3.29204,7.0037 -5.95753,14.2812 -8.84716,21.4603 -1.8476,4.5903 -3.78793,9.1428 -5.63163,13.7346 -2.19307,5.4619 -4.24908,10.9786 -6.48835,16.4217 -1.98016,4.8133 -4.10264,9.5667 -6.11897,14.365 -1.50777,3.588 -2.95602,7.2007 -4.43703,10.7999 -1.81201,4.4036 -3.67312,8.787 -5.44876,13.2054 -1.90648,4.7439 -3.71408,9.5272 -5.63144,14.2668 -2.28681,5.6528 -4.72948,11.2426 -7.32429,16.7608 l 0,1e-4" id="path6340-5-3-2" style="fill:none;stroke:#2e3436;stroke-width:6;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"/>
+ <path d="m 614.71873,1481.8891 c 4.4932,-0.5536 9.05577,-0.5418 13.54605,0.035 3.26929,0.42 6.49828,1.1375 9.77901,1.4561 5.39656,0.524 10.84262,-0.039 16.25684,0.25 5.13827,0.2746 10.20063,1.3138 15.24927,2.308 3.99513,0.7868 7.99545,1.5471 12.00062,2.2811 -1.21397,-3.1379 -2.33921,-6.3102 -3.37391,-9.5117 -2.03262,-6.2892 -3.72637,-12.7189 -6.51467,-18.7115 -1.16045,-2.494 -2.50479,-4.8991 -3.66622,-7.3927 -2.57972,-5.5386 -4.23243,-11.4577 -6.47652,-17.1406 -1.10287,-2.7929 -2.34793,-5.527 -3.56217,-8.2733 -3.27811,-7.4143 -6.33519,-14.9263 -9.1658,-22.5227 -1.99621,3.8376 -3.72741,7.8131 -5.17718,11.8887 -0.84248,2.3684 -1.59064,4.772 -2.53977,7.0997 -1.49444,3.665 -3.47527,7.113 -5.04484,10.7465 -1.79053,4.145 -3.03477,8.505 -4.71649,12.6953 -2.02408,5.0434 -4.66864,9.8095 -7.06881,14.6851 -1.31812,2.6776 -2.56344,5.3902 -3.82264,8.096 -1.87004,4.0184 -3.77104,8.0223 -5.70277,12.0114 l 0,-4e-4" id="path6344-3-4-1" style="fill:none;stroke:#2e3436;stroke-width:6;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"/>
+ <path d="m 467.39758,1357.8323 c 0.41854,14.8446 0.68432,29.6935 0.79728,44.5436 0.0811,10.6619 0.0834,21.3242 0.0838,31.9864 4.6e-4,13.1406 -0.002,26.2813 0.0609,39.4218 0.0881,18.3905 0.30444,36.7805 0.64899,55.168 1.28372,0.8515 2.79455,1.3571 4.3322,1.4498 1.88999,0.1139 3.81263,-0.4031 5.39052,-1.4497 l 0.46922,-24.3998 c 0.13616,-7.0805 0.39174,-14.1645 1.12177,-21.2086 5.89592,-1.7715 12.06379,-2.6348 18.21951,-2.5502 5.80332,0.08 11.59441,1.0013 17.13583,2.7269 5.07967,7.5748 9.75263,15.4223 13.99204,23.4974 4.19366,7.988 7.96306,16.1987 11.28702,24.5859 2.11115,0.8754 4.3892,1.3463 6.67441,1.3797 2.30262,0.034 4.61092,-0.3771 6.76063,-1.2029 -3.3369,-8.8163 -7.10184,-17.4705 -11.27712,-25.9221 -4.10141,-8.302 -8.59875,-16.4085 -13.47162,-24.2825 9.24678,-4.0777 17.15559,-11.1268 22.26581,-19.8455 3.47553,-5.9297 5.64968,-12.5227 8.70637,-18.6788 2.73553,-5.5093 6.20087,-10.7238 7.91869,-16.6301 2.03572,-6.9993 1.47288,-14.4458 1.28874,-21.7328 -0.15379,-6.086 -0.0571,-12.3334 -2.17262,-18.0419 -2.34372,-6.3244 -7.23735,-11.4282 -12.74926,-15.3154 -5.80591,-4.0945 -12.39517,-7.0263 -19.24733,-8.9029 -11.29867,-3.0944 -23.14589,-3.3298 -34.825,-4.2427 -5.35885,-0.4189 -10.70971,-0.9843 -16.0821,-1.1578 -5.7854,-0.1868 -11.58547,0.082 -17.3287,0.8042 l 2e-5,0" id="path6395-7-3" style="fill:none;stroke:#2e3436;stroke-width:6;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"/>
+ <path d="m 480.1255,1367.7318 c 0.64355,11.4182 0.78636,22.8646 0.42788,34.2953 -0.30302,9.6624 -0.96405,19.3163 -0.95953,28.9835 0.004,8.8188 0.5621,17.6269 1.12405,26.4277 0.27295,4.2747 0.54689,8.5494 0.82182,12.824 5.47498,0.4353 10.96605,0.6682 16.45822,0.6979 5.55759,0.03 11.14672,-0.1511 16.59902,-1.2282 4.87347,-0.9628 9.59284,-2.6353 14.07688,-4.7733 4.44162,-2.1178 8.71181,-4.7333 12.12876,-8.2741 4.85773,-5.0338 7.72337,-11.6391 10.03358,-18.2421 2.63232,-7.5237 4.67718,-15.2502 6.1758,-23.0789 0.70968,-3.7073 1.29889,-7.4599 1.25691,-11.2343 -0.042,-3.7744 -0.73949,-7.5938 -2.48296,-10.9416 -1.45615,-2.7961 -3.60277,-5.1908 -6.01933,-7.2154 -2.41657,-2.0245 -5.10612,-3.6969 -7.83362,-5.2778 -6.93499,-4.0197 -14.24729,-7.5195 -22.03272,-9.4272 -7.01943,-1.72 -14.28566,-2.1153 -21.50184,-2.5121 -6.09132,-0.335 -12.18229,-0.6761 -18.27292,-1.0234" id="path6399-5-1" style="fill:none;stroke:#2e3436;stroke-width:6;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"/>
+ </g>
+ </g>
+ </g>
+</svg> \ No newline at end of file
diff --git a/graphics/camera.svg b/graphics/camera.svg
index 147f29fde..147f29fde 100755..100644
--- a/graphics/camera.svg
+++ b/graphics/camera.svg
diff --git a/graphics/check_box_checked.svg b/graphics/check_box_checked.svg
index 8d829aeb4..8d829aeb4 100755..100644
--- a/graphics/check_box_checked.svg
+++ b/graphics/check_box_checked.svg
diff --git a/graphics/heart.svg b/graphics/heart.svg
index c48ac4940..c48ac4940 100755..100644
--- a/graphics/heart.svg
+++ b/graphics/heart.svg
diff --git a/graphics/pencil.svg b/graphics/pencil.svg
index 1a277dd50..1a277dd50 100755..100644
--- a/graphics/pencil.svg
+++ b/graphics/pencil.svg
diff --git a/lib/account_deleter.rb b/lib/account_deleter.rb
index 3d869ea8a..7aaf40937 100644
--- a/lib/account_deleter.rb
+++ b/lib/account_deleter.rb
@@ -39,6 +39,8 @@ class AccountDeleter
disconnect_contacts
tombstone_user
end
+
+ mark_account_deletion_complete
end
end
@@ -48,7 +50,7 @@ class AccountDeleter
end
def special_ar_user_associations
- [:invitations_from_me, :person, :contacts, :auto_follow_back_aspect]
+ [:invitations_from_me, :person, :profile, :contacts, :auto_follow_back_aspect]
end
def ignored_ar_user_associations
@@ -111,4 +113,8 @@ class AccountDeleter
def ignored_or_special_ar_person_associations
[:comments, :contacts, :notification_actors, :notifications, :owner, :profile, :conversation_visibilities]
end
+
+ def mark_account_deletion_complete
+ AccountDeletion.where(:diaspora_handle => self.person.diaspora_handle).where(:person_id => self.person.id).update_all(["completed_at = ?", Time.now])
+ end
end
diff --git a/app/assets/javascripts/clear-form.js b/lib/assets/javascripts/clear-form.js
index 70d13f61d..81aadef16 100644
--- a/app/assets/javascripts/clear-form.js
+++ b/lib/assets/javascripts/clear-form.js
@@ -1,3 +1,5 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
/* Clear form plugin - called using $("elem").clearForm(); */
$.fn.clearForm = function() {
return this.each(function() {
@@ -10,9 +12,10 @@ $.fn.clearForm = function() {
$(this).attr('checked', false);
} else if ($(this).is('select')) {
this.selectedIndex = -1;
- } else if ($(this).attr('name') == 'photos[]') {
+ } else if ($(this).attr('name') === 'photos[]') {
$(this).val('');
}
$(this).blur();
});
};
+// @license-end
diff --git a/lib/assets/javascripts/fileuploader-custom.js b/lib/assets/javascripts/fileuploader-custom.js
index cfdb36680..5b5879f52 100644
--- a/lib/assets/javascripts/fileuploader-custom.js
+++ b/lib/assets/javascripts/fileuploader-custom.js
@@ -1,3 +1,4 @@
+// @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2-or-Later
/**
* http://github.com/valums/file-uploader
*
@@ -1263,3 +1264,4 @@ qq.extend(qq.UploadHandlerXhr.prototype, {
}
}
});
+// @license-end
diff --git a/lib/assets/javascripts/jquery.mentionsInput.js b/lib/assets/javascripts/jquery.mentionsInput.js
index e1a73ff4c..d3a7d25b2 100644
--- a/lib/assets/javascripts/jquery.mentionsInput.js
+++ b/lib/assets/javascripts/jquery.mentionsInput.js
@@ -1,3 +1,4 @@
+// @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt Expat
/*
* Mentions Input
* Version 1.0.2
@@ -33,7 +34,7 @@
autocompleteListItem : _.template('<li data-ref-id="<%= id %>" data-ref-type="<%= type %>" data-display="<%= display %>"><%= content %></li>'),
autocompleteListItemAvatar : _.template('<img src="<%= avatar %>" />'),
autocompleteListItemIcon : _.template('<div class="icon <%= icon %>"></div>'),
- mentionsOverlay : _.template('<div class="mentions"><div></div></div>'),
+ mentionsOverlay : _.template('<div class="mentions-box"><div class="mentions"><div></div></div></div>'),
mentionItemSyntax : _.template('@[<%= value %>](<%= type %>:<%= id %>)'),
mentionItemHighlight : _.template('<strong><span><%= value %></span></strong>')
}
@@ -138,7 +139,7 @@
mentionText = mentionText.replace(/ {2}/g, '&nbsp; ');
elmInputBox.data('messageText', syntaxMessage);
- elmMentionsOverlay.find('div').html(mentionText);
+ elmMentionsOverlay.find('div > div').html(mentionText);
}
function resetBuffer() {
@@ -428,3 +429,4 @@
};
})(jQuery, _);
+// @license-end
diff --git a/lib/assets/javascripts/posix-bracket-expressions.js b/lib/assets/javascripts/posix-bracket-expressions.js
new file mode 100644
index 000000000..4f573e5b6
--- /dev/null
+++ b/lib/assets/javascripts/posix-bracket-expressions.js
@@ -0,0 +1,448 @@
+// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
+
+// information for jshint
+/* exported PosixBracketExpressions */
+
+var PosixBracketExpressions = {
+ alnum : '\\u0030-\\u0039'
+ + '\\u0041-\\u005a'
+ + '\\u0061-\\u007a'
+ + '\\u00aa'
+ + '\\u00b5'
+ + '\\u00ba'
+ + '\\u00c0-\\u00d6'
+ + '\\u00d8-\\u00f6'
+ + '\\u00f8-\\u02c1'
+ + '\\u02c6-\\u02d1'
+ + '\\u02e0-\\u02e4'
+ + '\\u02ec'
+ + '\\u02ee'
+ + '\\u0345'
+ + '\\u0370-\\u0374'
+ + '\\u0376-\\u0377'
+ + '\\u037a-\\u037d'
+ + '\\u0386'
+ + '\\u0388-\\u038a'
+ + '\\u038c'
+ + '\\u038e-\\u03a1'
+ + '\\u03a3-\\u03f5'
+ + '\\u03f7-\\u0481'
+ + '\\u048a-\\u0527'
+ + '\\u0531-\\u0556'
+ + '\\u0559'
+ + '\\u0561-\\u0587'
+ + '\\u05b0-\\u05bd'
+ + '\\u05bf'
+ + '\\u05c1-\\u05c2'
+ + '\\u05c4-\\u05c5'
+ + '\\u05c7'
+ + '\\u05d0-\\u05ea'
+ + '\\u05f0-\\u05f2'
+ + '\\u0610-\\u061a'
+ + '\\u0620-\\u0657'
+ + '\\u0659-\\u0669'
+ + '\\u066e-\\u06d3'
+ + '\\u06d5-\\u06dc'
+ + '\\u06e1-\\u06e8'
+ + '\\u06ed-\\u06fc'
+ + '\\u06ff'
+ + '\\u0710-\\u073f'
+ + '\\u074d-\\u07b1'
+ + '\\u07c0-\\u07ea'
+ + '\\u07f4-\\u07f5'
+ + '\\u07fa'
+ + '\\u0800-\\u0817'
+ + '\\u081a-\\u082c'
+ + '\\u0840-\\u0858'
+ + '\\u08a0'
+ + '\\u08a2-\\u08ac'
+ + '\\u08e4-\\u08e9'
+ + '\\u08f0-\\u08fe'
+ + '\\u0900-\\u093b'
+ + '\\u093d-\\u094c'
+ + '\\u094e-\\u0950'
+ + '\\u0955-\\u0963'
+ + '\\u0966-\\u096f'
+ + '\\u0971-\\u0977'
+ + '\\u0979-\\u097f'
+ + '\\u0981-\\u0983'
+ + '\\u0985-\\u098c'
+ + '\\u098f-\\u0990'
+ + '\\u0993-\\u09a8'
+ + '\\u09aa-\\u09b0'
+ + '\\u09b2'
+ + '\\u09b6-\\u09b9'
+ + '\\u09bd-\\u09c4'
+ + '\\u09c7-\\u09c8'
+ + '\\u09cb-\\u09cc'
+ + '\\u09ce'
+ + '\\u09d7'
+ + '\\u09dc-\\u09dd'
+ + '\\u09df-\\u09e3'
+ + '\\u09e6-\\u09f1'
+ + '\\u0a01-\\u0a03'
+ + '\\u0a05-\\u0a0a'
+ + '\\u0a0f-\\u0a10'
+ + '\\u0a13-\\u0a28'
+ + '\\u0a2a-\\u0a30'
+ + '\\u0a32-\\u0a33'
+ + '\\u0a35-\\u0a36'
+ + '\\u0a38-\\u0a39'
+ + '\\u0a3e-\\u0a42'
+ + '\\u0a47-\\u0a48'
+ + '\\u0a4b-\\u0a4c'
+ + '\\u0a51'
+ + '\\u0a59-\\u0a5c'
+ + '\\u0a5e'
+ + '\\u0a66-\\u0a75'
+ + '\\u0a81-\\u0a83'
+ + '\\u0a85-\\u0a8d'
+ + '\\u0a8f-\\u0a91'
+ + '\\u0a93-\\u0aa8'
+ + '\\u0aaa-\\u0ab0'
+ + '\\u0ab2-\\u0ab3'
+ + '\\u0ab5-\\u0ab9'
+ + '\\u0abd-\\u0ac5'
+ + '\\u0ac7-\\u0ac9'
+ + '\\u0acb-\\u0acc'
+ + '\\u0ad0'
+ + '\\u0ae0-\\u0ae3'
+ + '\\u0ae6-\\u0aef'
+ + '\\u0b01-\\u0b03'
+ + '\\u0b05-\\u0b0c'
+ + '\\u0b0f-\\u0b10'
+ + '\\u0b13-\\u0b28'
+ + '\\u0b2a-\\u0b30'
+ + '\\u0b32-\\u0b33'
+ + '\\u0b35-\\u0b39'
+ + '\\u0b3d-\\u0b44'
+ + '\\u0b47-\\u0b48'
+ + '\\u0b4b-\\u0b4c'
+ + '\\u0b56-\\u0b57'
+ + '\\u0b5c-\\u0b5d'
+ + '\\u0b5f-\\u0b63'
+ + '\\u0b66-\\u0b6f'
+ + '\\u0b71'
+ + '\\u0b82-\\u0b83'
+ + '\\u0b85-\\u0b8a'
+ + '\\u0b8e-\\u0b90'
+ + '\\u0b92-\\u0b95'
+ + '\\u0b99-\\u0b9a'
+ + '\\u0b9c'
+ + '\\u0b9e-\\u0b9f'
+ + '\\u0ba3-\\u0ba4'
+ + '\\u0ba8-\\u0baa'
+ + '\\u0bae-\\u0bb9'
+ + '\\u0bbe-\\u0bc2'
+ + '\\u0bc6-\\u0bc8'
+ + '\\u0bca-\\u0bcc'
+ + '\\u0bd0'
+ + '\\u0bd7'
+ + '\\u0be6-\\u0bef'
+ + '\\u0c01-\\u0c03'
+ + '\\u0c05-\\u0c0c'
+ + '\\u0c0e-\\u0c10'
+ + '\\u0c12-\\u0c28'
+ + '\\u0c2a-\\u0c33'
+ + '\\u0c35-\\u0c39'
+ + '\\u0c3d-\\u0c44'
+ + '\\u0c46-\\u0c48'
+ + '\\u0c4a-\\u0c4c'
+ + '\\u0c55-\\u0c56'
+ + '\\u0c58-\\u0c59'
+ + '\\u0c60-\\u0c63'
+ + '\\u0c66-\\u0c6f'
+ + '\\u0c82-\\u0c83'
+ + '\\u0c85-\\u0c8c'
+ + '\\u0c8e-\\u0c90'
+ + '\\u0c92-\\u0ca8'
+ + '\\u0caa-\\u0cb3'
+ + '\\u0cb5-\\u0cb9'
+ + '\\u0cbd-\\u0cc4'
+ + '\\u0cc6-\\u0cc8'
+ + '\\u0cca-\\u0ccc'
+ + '\\u0cd5-\\u0cd6'
+ + '\\u0cde'
+ + '\\u0ce0-\\u0ce3'
+ + '\\u0ce6-\\u0cef'
+ + '\\u0cf1-\\u0cf2'
+ + '\\u0d02-\\u0d03'
+ + '\\u0d05-\\u0d0c'
+ + '\\u0d0e-\\u0d10'
+ + '\\u0d12-\\u0d3a'
+ + '\\u0d3d-\\u0d44'
+ + '\\u0d46-\\u0d48'
+ + '\\u0d4a-\\u0d4c'
+ + '\\u0d4e'
+ + '\\u0d57'
+ + '\\u0d60-\\u0d63'
+ + '\\u0d66-\\u0d6f'
+ + '\\u0d7a-\\u0d7f'
+ + '\\u0d82-\\u0d83'
+ + '\\u0d85-\\u0d96'
+ + '\\u0d9a-\\u0db1'
+ + '\\u0db3-\\u0dbb'
+ + '\\u0dbd'
+ + '\\u0dc0-\\u0dc6'
+ + '\\u0dcf-\\u0dd4'
+ + '\\u0dd6'
+ + '\\u0dd8-\\u0ddf'
+ + '\\u0df2-\\u0df3'
+ + '\\u0e01-\\u0e3a'
+ + '\\u0e40-\\u0e46'
+ + '\\u0e4d'
+ + '\\u0e50-\\u0e59'
+ + '\\u0e81-\\u0e82'
+ + '\\u0e84'
+ + '\\u0e87-\\u0e88'
+ + '\\u0e8a'
+ + '\\u0e8d'
+ + '\\u0e94-\\u0e97'
+ + '\\u0e99-\\u0e9f'
+ + '\\u0ea1-\\u0ea3'
+ + '\\u0ea5'
+ + '\\u0ea7'
+ + '\\u0eaa-\\u0eab'
+ + '\\u0ead-\\u0eb9'
+ + '\\u0ebb-\\u0ebd'
+ + '\\u0ec0-\\u0ec4'
+ + '\\u0ec6'
+ + '\\u0ecd'
+ + '\\u0ed0-\\u0ed9'
+ + '\\u0edc-\\u0edf'
+ + '\\u0f00'
+ + '\\u0f20-\\u0f29'
+ + '\\u0f40-\\u0f47'
+ + '\\u0f49-\\u0f6c'
+ + '\\u0f71-\\u0f81'
+ + '\\u0f88-\\u0f97'
+ + '\\u0f99-\\u0fbc'
+ + '\\u1000-\\u1036'
+ + '\\u1038'
+ + '\\u103b-\\u1049'
+ + '\\u1050-\\u1062'
+ + '\\u1065-\\u1068'
+ + '\\u106e-\\u1086'
+ + '\\u108e'
+ + '\\u1090-\\u1099'
+ + '\\u109c-\\u109d'
+ + '\\u10a0-\\u10c5'
+ + '\\u10c7'
+ + '\\u10cd'
+ + '\\u10d0-\\u10fa'
+ + '\\u10fc-\\u1248'
+ + '\\u124a-\\u124d'
+ + '\\u1250-\\u1256'
+ + '\\u1258'
+ + '\\u125a-\\u125d'
+ + '\\u1260-\\u1288'
+ + '\\u128a-\\u128d'
+ + '\\u1290-\\u12b0'
+ + '\\u12b2-\\u12b5'
+ + '\\u12b8-\\u12be'
+ + '\\u12c0'
+ + '\\u12c2-\\u12c5'
+ + '\\u12c8-\\u12d6'
+ + '\\u12d8-\\u1310'
+ + '\\u1312-\\u1315'
+ + '\\u1318-\\u135a'
+ + '\\u135f'
+ + '\\u1380-\\u138f'
+ + '\\u13a0-\\u13f4'
+ + '\\u1401-\\u166c'
+ + '\\u166f-\\u167f'
+ + '\\u1681-\\u169a'
+ + '\\u16a0-\\u16ea'
+ + '\\u16ee-\\u16f0'
+ + '\\u1700-\\u170c'
+ + '\\u170e-\\u1713'
+ + '\\u1720-\\u1733'
+ + '\\u1740-\\u1753'
+ + '\\u1760-\\u176c'
+ + '\\u176e-\\u1770'
+ + '\\u1772-\\u1773'
+ + '\\u1780-\\u17b3'
+ + '\\u17b6-\\u17c8'
+ + '\\u17d7'
+ + '\\u17dc'
+ + '\\u17e0-\\u17e9'
+ + '\\u1810-\\u1819'
+ + '\\u1820-\\u1877'
+ + '\\u1880-\\u18aa'
+ + '\\u18b0-\\u18f5'
+ + '\\u1900-\\u191c'
+ + '\\u1920-\\u192b'
+ + '\\u1930-\\u1938'
+ + '\\u1946-\\u196d'
+ + '\\u1970-\\u1974'
+ + '\\u1980-\\u19ab'
+ + '\\u19b0-\\u19c9'
+ + '\\u19d0-\\u19d9'
+ + '\\u1a00-\\u1a1b'
+ + '\\u1a20-\\u1a5e'
+ + '\\u1a61-\\u1a74'
+ + '\\u1a80-\\u1a89'
+ + '\\u1a90-\\u1a99'
+ + '\\u1aa7'
+ + '\\u1b00-\\u1b33'
+ + '\\u1b35-\\u1b43'
+ + '\\u1b45-\\u1b4b'
+ + '\\u1b50-\\u1b59'
+ + '\\u1b80-\\u1ba9'
+ + '\\u1bac-\\u1be5'
+ + '\\u1be7-\\u1bf1'
+ + '\\u1c00-\\u1c35'
+ + '\\u1c40-\\u1c49'
+ + '\\u1c4d-\\u1c7d'
+ + '\\u1ce9-\\u1cec'
+ + '\\u1cee-\\u1cf3'
+ + '\\u1cf5-\\u1cf6'
+ + '\\u1d00-\\u1dbf'
+ + '\\u1e00-\\u1f15'
+ + '\\u1f18-\\u1f1d'
+ + '\\u1f20-\\u1f45'
+ + '\\u1f48-\\u1f4d'
+ + '\\u1f50-\\u1f57'
+ + '\\u1f59'
+ + '\\u1f5b'
+ + '\\u1f5d'
+ + '\\u1f5f-\\u1f7d'
+ + '\\u1f80-\\u1fb4'
+ + '\\u1fb6-\\u1fbc'
+ + '\\u1fbe'
+ + '\\u1fc2-\\u1fc4'
+ + '\\u1fc6-\\u1fcc'
+ + '\\u1fd0-\\u1fd3'
+ + '\\u1fd6-\\u1fdb'
+ + '\\u1fe0-\\u1fec'
+ + '\\u1ff2-\\u1ff4'
+ + '\\u1ff6-\\u1ffc'
+ + '\\u2071'
+ + '\\u207f'
+ + '\\u2090-\\u209c'
+ + '\\u2102'
+ + '\\u2107'
+ + '\\u210a-\\u2113'
+ + '\\u2115'
+ + '\\u2119-\\u211d'
+ + '\\u2124'
+ + '\\u2126'
+ + '\\u2128'
+ + '\\u212a-\\u212d'
+ + '\\u212f-\\u2139'
+ + '\\u213c-\\u213f'
+ + '\\u2145-\\u2149'
+ + '\\u214e'
+ + '\\u2160-\\u2188'
+ + '\\u24b6-\\u24e9'
+ + '\\u2c00-\\u2c2e'
+ + '\\u2c30-\\u2c5e'
+ + '\\u2c60-\\u2ce4'
+ + '\\u2ceb-\\u2cee'
+ + '\\u2cf2-\\u2cf3'
+ + '\\u2d00-\\u2d25'
+ + '\\u2d27'
+ + '\\u2d2d'
+ + '\\u2d30-\\u2d67'
+ + '\\u2d6f'
+ + '\\u2d80-\\u2d96'
+ + '\\u2da0-\\u2da6'
+ + '\\u2da8-\\u2dae'
+ + '\\u2db0-\\u2db6'
+ + '\\u2db8-\\u2dbe'
+ + '\\u2dc0-\\u2dc6'
+ + '\\u2dc8-\\u2dce'
+ + '\\u2dd0-\\u2dd6'
+ + '\\u2dd8-\\u2dde'
+ + '\\u2de0-\\u2dff'
+ + '\\u2e2f'
+ + '\\u3005-\\u3007'
+ + '\\u3021-\\u3029'
+ + '\\u3031-\\u3035'
+ + '\\u3038-\\u303c'
+ + '\\u3041-\\u3096'
+ + '\\u309d-\\u309f'
+ + '\\u30a1-\\u30fa'
+ + '\\u30fc-\\u30ff'
+ + '\\u3105-\\u312d'
+ + '\\u3131-\\u318e'
+ + '\\u31a0-\\u31ba'
+ + '\\u31f0-\\u31ff'
+ + '\\u3400-\\u4db5'
+ + '\\u4e00-\\u9fcc'
+ + '\\ua000-\\ua48c'
+ + '\\ua4d0-\\ua4fd'
+ + '\\ua500-\\ua60c'
+ + '\\ua610-\\ua62b'
+ + '\\ua640-\\ua66e'
+ + '\\ua674-\\ua67b'
+ + '\\ua67f-\\ua697'
+ + '\\ua69f-\\ua6ef'
+ + '\\ua717-\\ua71f'
+ + '\\ua722-\\ua788'
+ + '\\ua78b-\\ua78e'
+ + '\\ua790-\\ua793'
+ + '\\ua7a0-\\ua7aa'
+ + '\\ua7f8-\\ua801'
+ + '\\ua803-\\ua805'
+ + '\\ua807-\\ua80a'
+ + '\\ua80c-\\ua827'
+ + '\\ua840-\\ua873'
+ + '\\ua880-\\ua8c3'
+ + '\\ua8d0-\\ua8d9'
+ + '\\ua8f2-\\ua8f7'
+ + '\\ua8fb'
+ + '\\ua900-\\ua92a'
+ + '\\ua930-\\ua952'
+ + '\\ua960-\\ua97c'
+ + '\\ua980-\\ua9b2'
+ + '\\ua9b4-\\ua9bf'
+ + '\\ua9cf-\\ua9d9'
+ + '\\uaa00-\\uaa36'
+ + '\\uaa40-\\uaa4d'
+ + '\\uaa50-\\uaa59'
+ + '\\uaa60-\\uaa76'
+ + '\\uaa7a'
+ + '\\uaa80-\\uaabe'
+ + '\\uaac0'
+ + '\\uaac2'
+ + '\\uaadb-\\uaadd'
+ + '\\uaae0-\\uaaef'
+ + '\\uaaf2-\\uaaf5'
+ + '\\uab01-\\uab06'
+ + '\\uab09-\\uab0e'
+ + '\\uab11-\\uab16'
+ + '\\uab20-\\uab26'
+ + '\\uab28-\\uab2e'
+ + '\\uabc0-\\uabea'
+ + '\\uabf0-\\uabf9'
+ + '\\uac00-\\ud7a3'
+ + '\\ud7b0-\\ud7c6'
+ + '\\ud7cb-\\ud7fb'
+ + '\\uf900-\\ufa6d'
+ + '\\ufa70-\\ufad9'
+ + '\\ufb00-\\ufb06'
+ + '\\ufb13-\\ufb17'
+ + '\\ufb1d-\\ufb28'
+ + '\\ufb2a-\\ufb36'
+ + '\\ufb38-\\ufb3c'
+ + '\\ufb3e'
+ + '\\ufb40-\\ufb41'
+ + '\\ufb43-\\ufb44'
+ + '\\ufb46-\\ufbb1'
+ + '\\ufbd3-\\ufd3d'
+ + '\\ufd50-\\ufd8f'
+ + '\\ufd92-\\ufdc7'
+ + '\\ufdf0-\\ufdfb'
+ + '\\ufe70-\\ufe74'
+ + '\\ufe76-\\ufefc'
+ + '\\uff10-\\uff19'
+ + '\\uff21-\\uff3a'
+ + '\\uff41-\\uff5a'
+ + '\\uff66-\\uffbe'
+ + '\\uffc2-\\uffc7'
+ + '\\uffca-\\uffcf'
+ + '\\uffd2-\\uffd7'
+ + '\\uffda-\\uffdc'
+};
+// @license-end
diff --git a/lib/collect_user_photos.rb b/lib/collect_user_photos.rb
deleted file mode 100644
index 8ea909a64..000000000
--- a/lib/collect_user_photos.rb
+++ /dev/null
@@ -1,25 +0,0 @@
-module PhotoMover
- def self.move_photos(user)
- Dir.chdir Rails.root
- temp_dir = "tmp/exports/#{user.id}"
- FileUtils::mkdir_p temp_dir
- Dir.chdir 'tmp/exports'
-
- photos = user.visible_shareables(Post).where(:author_id => user.person_id, :type => 'Photo')
-
- photos_dir = "#{user.id}/photos"
- FileUtils::mkdir_p photos_dir
-
- photos.each do |photo|
- current_photo_location = "#{Rails.root}/public/uploads/images/#{photo.remote_photo_name}"
- new_photo_location = "#{photos_dir}/#{photo.remote_photo_name}"
- FileUtils::cp current_photo_location, new_photo_location
- end
-
- `tar c #{user.id} > #{user.id}.tar`
- #system("tar", "c", "#{user.id}",">", "#{user.id}.tar")
- FileUtils::rm_r "#{user.id.to_s}/", :secure => true, :force => true
-
- "#{Rails.root}/#{temp_dir}.tar"
- end
-end
diff --git a/lib/configuration_methods.rb b/lib/configuration_methods.rb
index 5fcf4246e..8f471319b 100644
--- a/lib/configuration_methods.rb
+++ b/lib/configuration_methods.rb
@@ -1,4 +1,6 @@
module Configuration
+ KNOWN_SERVICES = [:twitter, :tumblr, :facebook, :wordpress].freeze
+
module Methods
def pod_uri
return @pod_uri unless @pod_uri.nil?
@@ -24,7 +26,7 @@ module Configuration
return @configured_services unless @configured_services.nil?
@configured_services = []
- [:twitter, :tumblr, :facebook, :wordpress].each do |service|
+ KNOWN_SERVICES.each do |service|
@configured_services << service if services.send(service).enable?
end
@@ -44,10 +46,10 @@ module Configuration
File.dirname(__FILE__)
)
unless File.exist? token_file
- `bundle exec rake generate:secret_token`
+ `DISABLE_SPRING=1 bin/rake generate:secret_token`
end
require token_file
- Rails.application.config.secret_token
+ Diaspora::Application.config.secret_key_base
end
end
@@ -117,8 +119,11 @@ module Configuration
end
def postgres?
- defined?(ActiveRecord::ConnectionAdapters::PostgreSQLAdapter) &&
- ActiveRecord::Base.connection.is_a?(ActiveRecord::ConnectionAdapters::PostgreSQLAdapter)
+ ActiveRecord::Base.connection.adapter_name == "PostgreSQL"
+ end
+
+ def mysql?
+ ActiveRecord::Base.connection.adapter_name == "Mysql2"
end
def bitcoin_donation_address
diff --git a/lib/csv_generator.rb b/lib/csv_generator.rb
deleted file mode 100644
index 0f99f1fd2..000000000
--- a/lib/csv_generator.rb
+++ /dev/null
@@ -1,248 +0,0 @@
-module CsvGenerator
-
- PATH = '/tmp/'
- BACKER_CSV_LOCATION = File.join('/usr/local/app/diaspora/', 'backer_list.csv')
- #BACKER_CSV_LOCATION = File.join('/home/ilya/workspace/diaspora/', 'backer_list.csv')
- WAITLIST_LOCATION = Rails.root.join('config', 'mailing_list.csv')
- OFFSET_LOCATION = Rails.root.join('config', 'email_offset')
- UNSUBSCRIBE_LOCATION = Rails.root.join('config', 'unsubscribe.csv')
-
- def self.all_active_users
- file = self.filename("all_active_users")
- sql = <<SQL
- SELECT email AS '%EMAIL%'
- #{self.output_syntax(file)}
- FROM users where username IS NOT NULL
-SQL
- ActiveRecord::Base.connection.execute(sql)
- end
-
- def self.all_inactive_invited_users
- file = self.filename("all_inactive_invited_users.csv")
- sql = <<SQL
- SELECT invitations.identifier AS '%EMAIL%', users.invitation_token AS '%TOKEN%'
- #{self.output_syntax(file)}
- FROM invitations
- JOIN users ON
- users.id=invitations.recipient_id
- WHERE users.username IS NULL
- AND invitations.service='email'
-SQL
- ActiveRecord::Base.connection.execute(sql)
- end
-
- def self.generate_csvs
- #`mkdir /tmp/csvs`
- self.backers_recent_login
- self.backers_old_login
- self.backers_never_login
- self.non_backers_recent_login
- self.non_backers_old_login
- self.non_backers_never_login
- end
-
- def self.all_users
- file = self.filename("v1_9_20_all_users.csv")
- sql = self.select_fragment(file, "#{self.has_email}" +
- " AND #{self.unsubscribe_email_condition}")
-
- ActiveRecord::Base.connection.execute(sql)
- end
-
- def self.backers_recent_login
- file = self.filename("v1_backers_recent_login.csv")
- sql = self.select_fragment(file, "#{self.has_email} AND #{self.backer_email_condition}" +
- " AND #{self.unsubscribe_email_condition} AND #{self.recent_login_query}")
-
- ActiveRecord::Base.connection.execute(sql)
- end
-
- def self.backers_old_login
- file = self.filename("v2_backers_old_login.csv")
- sql = self.select_fragment(file, "#{self.has_email} AND #{self.backer_email_condition} " +
- " AND #{self.unsubscribe_email_condition} AND #{self.old_login_query}")
-
- ActiveRecord::Base.connection.execute(sql)
- end
-
- def self.backers_never_login
- #IF(`users`.invitation_token, ,NULL)
- file = self.filename("v3_backers_never_login.csv")
- sql = <<SQL
- SELECT '%EMAIL%','%NAME%','%INVITATION_LINK%'
- UNION
- SELECT `users`.email AS '%EMAIL%',
- 'Friend of Diaspora*' AS '%NAME%',
- CONCAT( 'https://joindiaspora.com/users/invitation/accept?invitation_token=', `users`.invitation_token) AS '%INVITATION_LINK%'
- #{self.output_syntax(file)}
- FROM `users`
- WHERE #{self.has_email} AND #{self.has_invitation_token} AND #{self.backer_email_condition} AND #{self.unsubscribe_email_condition} AND #{self.never_login_query};
-SQL
-
- ActiveRecord::Base.connection.execute(sql)
- end
-
- def self.non_backers_recent_login
- file = self.filename("v4_non_backers_recent_login.csv")
- sql = self.select_fragment(file, "#{self.has_email} AND #{self.non_backer_email_condition} " +
- "AND #{self.unsubscribe_email_condition} AND #{self.recent_login_query}")
-
- ActiveRecord::Base.connection.execute(sql)
- end
-
- def self.non_backers_old_login
- file = self.filename("v5_non_backers_old_login.csv")
- sql = self.select_fragment(file, "#{self.has_email} AND #{self.non_backer_email_condition} " +
- "AND #{self.unsubscribe_email_condition} AND #{self.old_login_query}")
-
- ActiveRecord::Base.connection.execute(sql)
- end
-
- def self.non_backers_never_login
- file = self.filename("v6_non_backers_never_login.csv")
- sql = <<SQL
- SELECT '%EMAIL%','%NAME%','%INVITATION_LINK%'
- UNION
- SELECT `users`.email AS '%EMAIL%',
- 'Friend of Diaspora*' AS '%NAME%',
- CONCAT( 'https://joindiaspora.com/users/invitation/accept?invitation_token=', `users`.invitation_token) AS '%INVITATION_LINK%'
- #{self.output_syntax(file)}
- FROM `users`
- WHERE #{self.has_email} AND #{self.has_invitation_token} AND #{self.non_backer_email_condition} AND #{self.unsubscribe_email_condition} AND #{self.never_login_query};
-SQL
- ActiveRecord::Base.connection.execute(sql)
- end
-
- def self.non_backers_logged_in
- file = self.filename("v2_non_backers.csv")
- sql = self.select_fragment(file, "#{self.has_email} AND #{self.non_backer_email_condition} " +
- "AND #{self.unsubscribe_email_condition} AND #{self.has_username}")
-
- ActiveRecord::Base.connection.execute(sql)
- end
-
- # ---------------- QUERY METHODS & NOTES -------------------------
- def self.select_fragment(file, where_clause)
- sql = <<SQL
- SELECT '%EMAIL%','%NAME%','%INVITATION_LINK%'
- UNION
- SELECT `users`.email AS '%EMAIL%',
- IF( `profiles`.first_name IS NOT NULL AND `profiles`.first_name != "",
- `profiles`.first_name, 'Friend of Diaspora*') AS '%NAME%',
- IF(`users`.invitation_token, CONCAT( 'https://joindiaspora.com/users/invitation/accept?invitation_token=', `users`.invitation_token) ,NULL) AS '%INVITATION_LINK%'
- #{self.output_syntax(file)}
- FROM `users`
- JOIN `people` ON `users`.id = `people`.owner_id JOIN `profiles` ON `people`.id = `profiles`.person_id
- WHERE #{where_clause};
-SQL
- end
-
- def self.has_username
- '`users`.`username` IS NOT NULL'
- end
-
- def self.has_invitation_token
- '`users`.`invitation_token` IS NOT NULL'
- end
-
- def self.has_email
- '`users`.`email` IS NOT NULL AND `users`.`email` != ""'
- end
-
- def self.backer_email_condition
- b_emails = self.backer_emails
- b_emails.map!{|a| "'#{a}'"}
- "`users`.`email` IN (#{query_string_from_array(b_emails[1..b_emails.length])})"
- end
-
- def self.non_backer_email_condition
- b_emails = self.backer_emails
- b_emails.map!{|a| "'#{a}'"}
- "`users`.`email` NOT IN (#{query_string_from_array(b_emails[1..b_emails.length])})"
- end
-
- def self.unsubscribe_email_condition
- u_emails = self.unsubscriber_emails
- u_emails.map!{|a| "'#{a}'"}
- "`users`.`email` NOT IN (#{query_string_from_array(u_emails[1..u_emails.length])})"
- end
-
- def self.recent_login_query
- "(last_sign_in_at > SUBDATE(NOW(), INTERVAL 31 DAY))"
- end
-
- def self.old_login_query
- "(last_sign_in_at < SUBDATE(NOW(), INTERVAL 31 DAY))"
- end
-
- def self.never_login_query
- "(last_sign_in_at IS NULL)"
- end
-
- def self.query_string_from_array(array)
- array.join(", ")
- end
-
- # BACKER RECENT LOGIN
- # User.where("last_sign_in_at > ?", (Time.now - 1.month).to_i).where(:email => ["maxwell@joindiaspora.com"]).count
- #
- # "SELECT `users`.* FROM `users` WHERE `users`.`email` IN ('maxwell@joindiaspora.com') AND (last_sign_in_at > 1312663724)"
-
- # NON BACKER RECENT LOGIN
- # User.where("last_sign_in_at > ?", (Time.now - 1.month).to_i).where("email NOT IN (?)", 'maxwell@joindiaspora.com').to_sql
- # "SELECT `users`.* FROM `users` WHERE (last_sign_in_at > 1312665370) AND (email NOT IN ('maxwell@joindiaspora.com'))"
-
-
-
-
- # ---------------- HELPER METHODS -------------------------
- def self.load_waiting_list_csv(filename)
- require 'csv'
- csv = filename
- people = CSV.read(csv)
- people
- end
-
- def self.offset
- offset_filename = OFFSET_LOCATION
- File.read(offset_filename).to_i
- end
-
- def self.filename(name)
- "#{PATH}#{Time.now.strftime("%Y-%m-%d")}-#{name}"
- end
-
- def self.output_syntax filename
- <<SQL
- INTO OUTFILE '#{filename}'
-FIELDS TERMINATED BY '\t'
-LINES TERMINATED BY '\n'
-SQL
- end
-
- def self.waitlist
- people = self.load_waiting_list_csv(WAITLIST_LOCATION)
- offset = self.offset
- left = people[0...offset]
- right = people[offset...people.size]
-
- #reading from csv (get number of row we're on) - left
- #reading from csv (get number of row we're on) - right
- end
-
- def self.backers
- self.load_waiting_list_csv(BACKER_CSV_LOCATION)
- end
-
- def self.backer_emails
- self.backers.map{|b| b[0]}
- end
-
- def self.unsubsribers
- self.load_waiting_list_csv(UNSUBSCRIBE_LOCATION)
- end
-
- def self.unsubscriber_emails
- self.unsubsribers.map{|b| b[1]}
- end
-end
diff --git a/lib/development_mail_interceptor.rb b/lib/development_mail_interceptor.rb
deleted file mode 100644
index efc89596f..000000000
--- a/lib/development_mail_interceptor.rb
+++ /dev/null
@@ -1,7 +0,0 @@
-class DevelopmentMailInterceptor
- def self.delivering_email(message)
- message.subject = "[#{message.to}] #{message.subject}"
- message.to = "email@joindiaspora.com"
- end
-end
-
diff --git a/lib/diaspora.rb b/lib/diaspora.rb
index 161dbae8f..6f6d2002c 100644
--- a/lib/diaspora.rb
+++ b/lib/diaspora.rb
@@ -3,12 +3,13 @@
# the COPYRIGHT file.
module Diaspora
+ require 'diaspora/camo'
require 'diaspora/exceptions'
- require 'diaspora/parser'
+ require 'diaspora/exporter'
+ require 'diaspora/federated'
require 'diaspora/fetcher'
require 'diaspora/markdownify'
- require 'diaspora/message_renderer'
require 'diaspora/mentionable'
- require 'diaspora/exporter'
- require 'diaspora/federated'
+ require 'diaspora/message_renderer'
+ require 'diaspora/parser'
end
diff --git a/lib/diaspora/camo.rb b/lib/diaspora/camo.rb
new file mode 100644
index 000000000..389aa48a5
--- /dev/null
+++ b/lib/diaspora/camo.rb
@@ -0,0 +1,35 @@
+# implicitly requires OpenSSL
+module Diaspora
+ module Camo
+ def self.from_markdown(markdown_text)
+ return unless markdown_text
+ markdown_text.gsub!(/(!\[(.*?)\]\s?\([ \t]*()<?(\S+?)>?[ \t]*((['"])(.*?)\6[ \t]*)?\))/m) do |link|
+ link.gsub($4, self.image_url($4))
+ end
+ markdown_text.gsub(/src=(['"])(.+?)\1/m) do |link|
+ link.gsub($2, self.image_url($2))
+ end
+ end
+
+ def self.image_url(url)
+ return unless url
+ return url unless self.url_eligible?(url)
+
+ digest = OpenSSL::HMAC.hexdigest(
+ OpenSSL::Digest.new('sha1'),
+ AppConfig.privacy.camo.key,
+ url
+ )
+
+ encoded_url = url.to_enum(:each_byte).map {|byte| '%02x' % byte}.join
+ File.join(AppConfig.privacy.camo.root, digest, encoded_url)
+ end
+
+ def self.url_eligible?(url)
+ return false unless url.start_with?('http', '//')
+ return false if url.start_with?(AppConfig.environment.url.to_s,
+ AppConfig.privacy.camo.root.to_s)
+ true
+ end
+ end
+end
diff --git a/lib/diaspora/exceptions.rb b/lib/diaspora/exceptions.rb
index eba8366e0..2a9da47a2 100644
--- a/lib/diaspora/exceptions.rb
+++ b/lib/diaspora/exceptions.rb
@@ -16,7 +16,6 @@ module Diaspora
# that prevents further execution
class NotMine < StandardError
end
-
# Received a message without having a contact
class ContactRequiredUnlessRequest < StandardError
@@ -30,4 +29,10 @@ module Diaspora
# original XML message
class AuthorXMLAuthorMismatch < StandardError
end
+
+ # Tried to fetch a post but it was deleted, not valid
+ # or the remote end doesn't support post fetching
+ class PostNotFetchable < StandardError
+ end
+
end
diff --git a/lib/diaspora/exporter.rb b/lib/diaspora/exporter.rb
index 80f0814f1..e6f65ac7a 100644
--- a/lib/diaspora/exporter.rb
+++ b/lib/diaspora/exporter.rb
@@ -5,87 +5,23 @@
module Diaspora
class Exporter
- def initialize(strategy)
- self.class.send(:include, strategy)
- end
- end
-
- module Exporters
- module XML
- def execute(user)
- builder = Nokogiri::XML::Builder.new do |xml|
- user_person_id = user.person_id
- xml.export {
- xml.user {
- xml.username user.username
- xml.serialized_private_key user.serialized_private_key
-
- xml.parent << user.person.to_xml
- }
-
-
-
- xml.aspects {
- user.aspects.each do |aspect|
- xml.aspect {
- xml.name aspect.name
-# xml.person_ids {
- #aspect.person_ids.each do |id|
- #xml.person_id id
- #end
- #}
+ SERIALIZED_VERSION = '1.0'
- xml.post_ids {
- aspect.posts.find_all_by_author_id(user_person_id).each do |post|
- xml.post_id post.id
- end
- }
- }
- end
- }
-
- xml.contacts {
- user.contacts.each do |contact|
- xml.contact {
- xml.user_id contact.user_id
- xml.person_id contact.person_id
- xml.person_guid contact.person_guid
-
- xml.aspects {
- contact.aspects.each do |aspect|
- xml.aspect {
- xml.name aspect.name
- }
- end
- }
- }
- end
- }
-
- xml.posts {
- user.visible_shareables(Post).find_all_by_author_id(user_person_id).each do |post|
- #post.comments.each do |comment|
- # post_doc << comment.to_xml
- #end
-
- xml.parent << post.to_xml
- end
- }
+ def initialize(user)
+ @user = user
+ end
- xml.people {
- user.contacts.each do |contact|
- person = contact.person
- xml.parent << person.to_xml
+ def execute
+ @export ||= JSON.generate serialized_user.merge(version: SERIALIZED_VERSION)
+ end
- end
- }
- }
- end
+ private
- builder.to_xml.to_s
- end
+ def serialized_user
+ @serialized_user ||= Export::UserSerializer.new(@user).as_json
end
+
end
end
diff --git a/lib/diaspora/federated/relayable_retraction.rb b/lib/diaspora/federated/relayable_retraction.rb
index ab7be6528..3d48f6763 100644
--- a/lib/diaspora/federated/relayable_retraction.rb
+++ b/lib/diaspora/federated/relayable_retraction.rb
@@ -60,4 +60,8 @@ class RelayableRetraction < SignedRetraction
def parent_author_signature_valid?
verify_signature(self.parent_author_signature, self.parent.author)
end
+
+ def parent_diaspora_handle
+ target.author.diaspora_handle
+ end
end
diff --git a/lib/diaspora/federated/request.rb b/lib/diaspora/federated/request.rb
index 0b0f446b3..a920fba7c 100644
--- a/lib/diaspora/federated/request.rb
+++ b/lib/diaspora/federated/request.rb
@@ -75,10 +75,10 @@ class Request
def receive(user, person)
Rails.logger.info("event=receive payload_type=request sender=#{self.sender} to=#{self.recipient}")
- contact = user.contacts.find_or_initialize_by_person_id(self.sender.id)
+ contact = user.contacts.find_or_initialize_by(person_id: self.sender.id)
contact.sharing = true
contact.save
-
+
user.share_with(person, user.auto_follow_back_aspect) if user.auto_follow_back && !contact.receiving
self
diff --git a/lib/diaspora/federated/shareable.rb b/lib/diaspora/federated/shareable.rb
index a2c4ce957..3921395cb 100644
--- a/lib/diaspora/federated/shareable.rb
+++ b/lib/diaspora/federated/shareable.rb
@@ -2,9 +2,9 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-#this module attempts to be what you need to mix into
+#this module attempts to be what you need to mix into
# base level federation objects that are not relayable, and not persistable
-#assumes there is an author, author_id, id,
+#assumes there is an author, author_id, id,
module Diaspora
module Federated
module Shareable
@@ -85,7 +85,7 @@ module Diaspora
known_shareable = user.find_visible_shareable_by_id(self.class.base_class, self.guid, :key => :guid)
if known_shareable
if known_shareable.mutable?
- known_shareable.update_attributes(self.attributes)
+ known_shareable.update_attributes(self.attributes.except("id"))
true
else
Rails.logger.info("event=receive payload_type=#{self.class} update=true status=abort sender=#{self.diaspora_handle} reason=immutable") #existing_shareable=#{known_shareable.id}")
@@ -113,4 +113,4 @@ module Diaspora
end
end
end
-end \ No newline at end of file
+end
diff --git a/lib/diaspora/federated/signed_retraction.rb b/lib/diaspora/federated/signed_retraction.rb
index 67a6812c1..9a1f6d367 100644
--- a/lib/diaspora/federated/signed_retraction.rb
+++ b/lib/diaspora/federated/signed_retraction.rb
@@ -4,7 +4,7 @@
class SignedRetraction
include Diaspora::Federated::Base
-
+
include Diaspora::Encryptable
xml_name :signed_retraction
@@ -78,7 +78,7 @@ class SignedRetraction
onward_retraction.sender = receiving_user.person
Postzord::Dispatcher.build(receiving_user, onward_retraction).post
end
- if target
+ if target && !target.destroyed?
self.target.destroy
end
Rails.logger.info("event=retraction status =complete target_type=#{self.target_type} guid =#{self.target_guid}")
diff --git a/lib/diaspora/fetcher.rb b/lib/diaspora/fetcher.rb
index adb82e552..a27831e2f 100644
--- a/lib/diaspora/fetcher.rb
+++ b/lib/diaspora/fetcher.rb
@@ -1,5 +1,6 @@
module Diaspora
module Fetcher
require 'diaspora/fetcher/public'
+ require 'diaspora/fetcher/single'
end
end
diff --git a/lib/diaspora/fetcher/public.rb b/lib/diaspora/fetcher/public.rb
index 8f196c625..241928246 100644
--- a/lib/diaspora/fetcher/public.rb
+++ b/lib/diaspora/fetcher/public.rb
@@ -76,8 +76,8 @@ module Diaspora; module Fetcher; class Public
FEDERATION_LOGGER.info "fetching public posts for #{@person.diaspora_handle}"
resp = Faraday.get("#{@person.url}people/#{@person.guid}") do |req|
- req.headers[:accept] = 'application/json'
- req.headers[:user_agent] = 'diaspora-fetcher'
+ req.headers['Accept'] = 'application/json'
+ req.headers['User-Agent'] = 'diaspora-fetcher'
end
FEDERATION_LOGGER.debug resp.body.to_s[0..250]
@@ -111,7 +111,7 @@ module Diaspora; module Fetcher; class Public
:created_at => ActiveSupport::TimeZone.new('UTC').parse(post['created_at']).to_datetime,
:interacted_at => ActiveSupport::TimeZone.new('UTC').parse(post['interacted_at']).to_datetime,
:frame_name => post['frame_name']
- }, :without_protection => true)
+ })
entry.save
# re-enable everything we disabled before
diff --git a/lib/diaspora/fetcher/single.rb b/lib/diaspora/fetcher/single.rb
new file mode 100644
index 000000000..4e8340132
--- /dev/null
+++ b/lib/diaspora/fetcher/single.rb
@@ -0,0 +1,41 @@
+module Diaspora
+ module Fetcher
+ module Single
+ module_function
+
+ # Fetch and store a remote public post
+ # @param [String] guid the remote posts guid
+ # @param [String] author_id Diaspora ID of a user known to have the post,
+ # preferably the author
+ # @yield [Post, Person] If a block is given it is yielded the post
+ # and the author prior save
+ # @return a saved post
+ def find_or_fetch_from_remote guid, author_id
+ post = Post.where(guid: guid).first
+ return post if post
+
+ post_author = Webfinger.new(author_id).fetch
+ post_author.save! unless post_author.persisted?
+
+ if fetched_post = fetch_post(post_author, guid)
+ yield fetched_post, post_author if block_given?
+ raise Diaspora::PostNotFetchable unless fetched_post.save
+ end
+
+ fetched_post
+ end
+
+ # Fetch a remote public post, used for receiving of unknown public posts
+ # @param [Person] author the remote post's author
+ # @param [String] guid the remote post's guid
+ # @return [Post] an unsaved remote post or false if the post was not found
+ def fetch_post author, guid
+ url = URI.join(author.url, "/p/#{guid}.xml")
+ response = Faraday.get(url)
+ raise Diaspora::PostNotFetchable if response.status == 404 # Old pod, Friendika, deleted
+ raise "Failed to get #{url}" unless response.success? # Other error, N/A for example
+ Diaspora::Parser.from_xml(response.body)
+ end
+ end
+ end
+end
diff --git a/lib/diaspora/guid.rb b/lib/diaspora/guid.rb
index 6f509a543..baf840a1f 100644
--- a/lib/diaspora/guid.rb
+++ b/lib/diaspora/guid.rb
@@ -4,7 +4,7 @@ module Diaspora::Guid
# Creates a before_create callback which calls #set_guid and makes the guid serialize in to_xml
def self.included(model)
model.class_eval do
- before_create :set_guid
+ after_initialize :set_guid
xml_attr :guid
validates :guid, :uniqueness => true
diff --git a/lib/diaspora/likeable.rb b/lib/diaspora/likeable.rb
index 9e05c79b3..bbb84d2ce 100644
--- a/lib/diaspora/likeable.rb
+++ b/lib/diaspora/likeable.rb
@@ -6,15 +6,15 @@ module Diaspora
module Likeable
def self.included(model)
model.instance_eval do
- has_many :likes, :conditions => {:positive => true}, :dependent => :delete_all, :as => :target
- has_many :dislikes, :conditions => {:positive => false}, :class_name => 'Like', :dependent => :delete_all, :as => :target
+ has_many :likes, -> { where(positive: true) }, dependent: :delete_all, as: :target
+ has_many :dislikes, -> { where(positive: false) }, class_name: 'Like', dependent: :delete_all, as: :target
end
end
# @return [Integer]
def update_likes_counter
- self.class.where(:id => self.id).
- update_all(:likes_count => self.likes.count)
+ self.class.where(id: self.id).
+ update_all(likes_count: self.likes.count)
end
end
end
diff --git a/lib/diaspora/markdownify/html.rb b/lib/diaspora/markdownify/html.rb
index 60209dcd6..04b2e8f16 100644
--- a/lib/diaspora/markdownify/html.rb
+++ b/lib/diaspora/markdownify/html.rb
@@ -4,7 +4,7 @@ module Diaspora
include ActionView::Helpers::TextHelper
def autolink link, type
- auto_link(link, link: :urls, html: { target: "_blank" })
+ Twitter::Autolink.auto_link_urls(link, url_target: "_blank")
end
end
end
diff --git a/lib/diaspora/message_renderer.rb b/lib/diaspora/message_renderer.rb
index 9a62fe661..a876156f8 100644
--- a/lib/diaspora/message_renderer.rb
+++ b/lib/diaspora/message_renderer.rb
@@ -14,6 +14,10 @@ module Diaspora
processor.instance_exec(&block)
processor.message
end
+
+ def normalize message
+ message.delete("\u202a-\u202e\u200b-\u200f")
+ end
end
attr_reader :message, :options
@@ -36,12 +40,9 @@ module Diaspora
message << options[:append_after_truncate].to_s
end
- include ActionView::Helpers::TagHelper
def escape
if options[:escape]
- # TODO: On Rails 4 port change this to ERB::Util.html_escape_once
- # and remove the include
- @message = escape_once message
+ @message = ERB::Util.html_escape_once message
# Special case Hex entities since escape_once
# doesn't catch them.
@@ -90,6 +91,14 @@ module Diaspora
def render_tags
@message = Diaspora::Taggable.format_tags message, no_escape: !options[:escape_tags]
end
+
+ def camo_urls
+ @message = Diaspora::Camo.from_markdown(@message)
+ end
+
+ def normalize
+ @message = self.class.normalize(@message)
+ end
end
DEFAULTS = {mentioned_people: [],
@@ -169,9 +178,18 @@ module Diaspora
end
# @param [Hash] opts Override global output options, see {#initialize}
+ def plain_text_for_json opts={}
+ process(opts) {
+ normalize
+ camo_urls if AppConfig.privacy.camo.proxy_markdown_images?
+ }
+ end
+
+ # @param [Hash] opts Override global output options, see {#initialize}
def html opts={}
process(opts) {
escape
+ normalize
render_mentions
render_tags
squish
@@ -183,6 +201,8 @@ module Diaspora
def markdownified opts={}
process(opts) {
process_newlines
+ normalize
+ camo_urls if AppConfig.privacy.camo.proxy_markdown_images?
markdownify
render_mentions
render_tags
@@ -205,7 +225,7 @@ module Diaspora
atx_content
end
- heading &&= heading.strip
+ heading &&= self.class.new(heading).plain_text_without_markdown
if heading && opts[:length]
heading.truncate opts[:length]
@@ -216,6 +236,12 @@ module Diaspora
end
end
+ # Extracts all the urls from the raw message and return them in the form of a string
+ # Different URLs are seperated with a space
+ def urls
+ @urls ||= Twitter::Extractor.extract_urls(plain_text_without_markdown)
+ end
+
def raw
@raw_message
end
diff --git a/lib/diaspora/relayable.rb b/lib/diaspora/relayable.rb
index d0db312b7..4f43ed402 100644
--- a/lib/diaspora/relayable.rb
+++ b/lib/diaspora/relayable.rb
@@ -51,7 +51,8 @@ module Diaspora
end
def parent_guid= new_parent_guid
- self.parent = parent_class.where(:guid => new_parent_guid).first
+ @parent_guid = new_parent_guid
+ self.parent = parent_class.where(guid: new_parent_guid).first
end
# @return [Array<Person>]
@@ -66,7 +67,7 @@ module Diaspora
end
def receive(user, person=nil)
- comment_or_like = self.class.where(:guid => self.guid).first || self
+ comment_or_like = self.class.where(guid: self.guid).first || self
# Check to make sure the signature of the comment or like comes from the person claiming to author it
unless comment_or_like.parent_author == user.person || comment_or_like.verify_parent_author_signature
@@ -134,5 +135,17 @@ module Diaspora
def parent= parent
raise NotImplementedError.new('you must override parent= in order to enable relayable on this model')
end
+
+ # ROXML hook ensuring our own hooks are called
+ def after_parse
+ if @parent_guid
+ self.parent ||= fetch_parent(@parent_guid)
+ end
+ end
+
+ # Childs should override this to support fetching a missing parent
+ # @param guid the parents guid
+ def fetch_parent guid
+ end
end
end
diff --git a/lib/diaspora/shareable.rb b/lib/diaspora/shareable.rb
index 6603a45b8..5c34115f8 100644
--- a/lib/diaspora/shareable.rb
+++ b/lib/diaspora/shareable.rb
@@ -8,7 +8,7 @@ module Diaspora
def self.included(model)
model.instance_eval do
- has_many :aspect_visibilities, :as => :shareable
+ has_many :aspect_visibilities, :as => :shareable, :validate => false
has_many :aspects, :through => :aspect_visibilities
has_many :share_visibilities, :as => :shareable
@@ -19,7 +19,7 @@ module Diaspora
delegate :id, :name, :first_name, to: :author, prefix: true
#scopes
- scope :all_public, where(:public => true, :pending => false)
+ scope :all_public, -> { where(:public => true, :pending => false) }
def self.owned_or_visible_by_user(user)
self.joins("LEFT OUTER JOIN share_visibilities ON share_visibilities.shareable_id = posts.id AND share_visibilities.shareable_type = 'Post'").
diff --git a/lib/diaspora/taggable.rb b/lib/diaspora/taggable.rb
index 13c9bb811..3e340df5d 100644
--- a/lib/diaspora/taggable.rb
+++ b/lib/diaspora/taggable.rb
@@ -7,9 +7,20 @@ module Diaspora
def self.included(model)
model.class_eval do
cattr_accessor :field_with_tags
+
+ # validate tag's name maximum length [tag's name should be less than or equal to 255 chars]
+ validate :tag_name_max_length, on: :create
+
+ # tag's name is limited to 255 charchters according to ActsAsTaggableOn gem, so we check the length of the name for each tag
+ def tag_name_max_length
+ self.tag_list.each do |tag|
+ errors[:tags] << I18n.t('tags.name_too_long', :count => 255, :current_length => tag.length) if tag.length > 255
+ end
+ end
+ protected :tag_name_max_length
end
model.instance_eval do
- before_create :build_tags
+ before_validation :build_tags # build tags before validation fixs the too long tag name issue #5737
def extract_tags_from sym
self.field_with_tags = sym
@@ -25,16 +36,10 @@ module Diaspora
end
def tag_strings
- regex = /(?:^|\s)#([#{ActsAsTaggableOn::Tag.tag_text_regexp}]+|<3)/u
- matches = self.
- send( self.class.field_with_tags ).
- scan(regex).
- map { |match| match[0] }
- unique_matches = matches.inject(Hash.new) do |h,element|
- h[element.downcase] = element unless h[element.downcase]
- h
- end
- unique_matches.values
+ MessageRenderer::Processor.normalize(send(self.class.field_with_tags) || "")
+ .scan(/(?:^|\s)#([#{ActsAsTaggableOn::Tag.tag_text_regexp}]+|<3)/u)
+ .map(&:first)
+ .uniq(&:downcase)
end
def self.format_tags(text, opts={})
@@ -50,7 +55,7 @@ module Diaspora
url_bit = '<3'
end
- %{#{pre}<a href="/tags/#{url_bit}" class="tag">#{clickable}</a>}
+ %{#{pre}<a class="tag" href="/tags/#{url_bit}">#{clickable}</a>}
}.html_safe
end
end
diff --git a/lib/email_inviter.rb b/lib/email_inviter.rb
index eaba72310..7f8c54475 100644
--- a/lib/email_inviter.rb
+++ b/lib/email_inviter.rb
@@ -26,6 +26,6 @@ class EmailInviter
private
def mail(email)
- Notifier.invite(email, message, inviter, invitation_code, locale).deliver!
+ Notifier.invite(email, message, inviter, invitation_code, locale).deliver_now!
end
end
diff --git a/lib/evil_query.rb b/lib/evil_query.rb
index a9923d4cd..395022b8b 100644
--- a/lib/evil_query.rb
+++ b/lib/evil_query.rb
@@ -6,7 +6,7 @@ module EvilQuery
end
def id_sql(relation, id_column)
- relation.select(id_column).to_sql
+ @class.connection.unprepared_statement { relation.select(id_column).to_sql }
end
end
diff --git a/lib/federated/relayable.rb b/lib/federated/relayable.rb
index d852a4dcd..a6cf6bf83 100644
--- a/lib/federated/relayable.rb
+++ b/lib/federated/relayable.rb
@@ -38,5 +38,9 @@ module Federated
def parent= parent
self.target = parent
end
+
+ def fetch_parent guid
+ Diaspora::Fetcher::Single.find_or_fetch_from_remote guid, diaspora_handle
+ end
end
-end \ No newline at end of file
+end
diff --git a/lib/hydra_wrapper.rb b/lib/hydra_wrapper.rb
index e22d94d7f..f7f3c7c2b 100644
--- a/lib/hydra_wrapper.rb
+++ b/lib/hydra_wrapper.rb
@@ -83,7 +83,7 @@ class HydraWrapper
def prepare_request request, people_for_receive_url
request.on_complete do |response|
# Save the reference to the pod to the database if not already present
- Pod.find_or_create_by_url response.effective_url
+ Pod.find_or_create_by(url: response.effective_url)
if redirecting_to_https? response
Person.url_batch_update people_for_receive_url, response.headers_hash['Location']
diff --git a/lib/i18n_interpolation_fallbacks.rb b/lib/i18n_interpolation_fallbacks.rb
index f5af4b1de..d379a965e 100644
--- a/lib/i18n_interpolation_fallbacks.rb
+++ b/lib/i18n_interpolation_fallbacks.rb
@@ -5,17 +5,19 @@ module I18n
default = extract_non_symbol_default!(options) if options[:default]
options.merge!(:default => default) if default
+ original_exception = nil
+
I18n.fallbacks[locale].each do |fallback|
begin
result = super(fallback, key, options)
return result unless result.nil?
- rescue I18n::MissingInterpolationArgument
- rescue I18n::InvalidPluralizationData
+ rescue I18n::MissingInterpolationArgument, I18n::InvalidPluralizationData => e
+ original_exception ||= e
end
end
return super(locale, nil, options) if default
- raise(I18n::MissingInterpolationArgument.new(key, options, locale))
+ raise original_exception
end
end
end
diff --git a/lib/postzord/receiver/private.rb b/lib/postzord/receiver/private.rb
index f2d560e50..0a45f9744 100644
--- a/lib/postzord/receiver/private.rb
+++ b/lib/postzord/receiver/private.rb
@@ -16,18 +16,16 @@ class Postzord::Receiver::Private < Postzord::Receiver
end
def receive!
- begin
- if @sender && self.salmon.verified_for_key?(@sender.public_key)
- parse_and_receive(salmon.parsed_data)
- else
- FEDERATION_LOGGER.info("event=receive status=abort recipient=#{@user.diaspora_handle} sender=#{@salmon.author_id} reason='not_verified for key'")
- false
- end
- rescue => e
- #this sucks
- FEDERATION_LOGGER.error("Failure to receive #{@object.class} from sender:#{@sender.id} for user:#{@user.id}: #{e.message}\n#{@object.inspect}")
- raise e
+ if @sender && self.salmon.verified_for_key?(@sender.public_key)
+ parse_and_receive(salmon.parsed_data)
+ else
+ FEDERATION_LOGGER.info("event=receive status=abort recipient=#{@user.diaspora_handle} sender=#{@salmon.author_id} reason='not_verified for key'")
+ false
end
+ rescue => e
+ #this sucks
+ FEDERATION_LOGGER.error("Failure to receive #{@object.class} from sender:#{@sender.id} for user:#{@user.id}: #{e.message}\n#{@object.inspect}")
+ raise e
end
def parse_and_receive(xml)
@@ -101,7 +99,7 @@ class Postzord::Receiver::Private < Postzord::Receiver
def contact_required_unless_request
unless @object.is_a?(Request) || @user.contact_for(@sender)
FEDERATION_LOGGER.error("event=receive status=abort reason='sender not connected to recipient' recipient=#{@user_person.diaspora_handle} sender=#{@sender.diaspora_handle}")
- return true
+ return true
end
end
diff --git a/lib/postzord/receiver/public.rb b/lib/postzord/receiver/public.rb
index e60da9083..d3f27be77 100644
--- a/lib/postzord/receiver/public.rb
+++ b/lib/postzord/receiver/public.rb
@@ -26,15 +26,15 @@ class Postzord::Receiver::Public < Postzord::Receiver
return false unless save_object
FEDERATION_LOGGER.info("received a #{@object.inspect}")
- if @object.respond_to?(:relayable?)
- receive_relayable
- elsif @object.is_a?(AccountDeletion)
- #nothing
- elsif @object.is_a?(SignedRetraction) # feels like a hack
+ if @object.is_a?(SignedRetraction) # feels like a hack
self.recipient_user_ids.each do |user_id|
user = User.where(id: user_id).first
@object.perform user if user
end
+ elsif @object.respond_to?(:relayable?)
+ receive_relayable
+ elsif @object.is_a?(AccountDeletion)
+ #nothing
else
Workers::ReceiveLocalBatch.perform_async(@object.class.to_s, @object.id, self.recipient_user_ids)
true
@@ -57,6 +57,7 @@ class Postzord::Receiver::Public < Postzord::Receiver
def save_object
@object = Diaspora::Parser::from_xml(@salmon.parsed_data)
raise "Object is not public" if object_can_be_public_and_it_is_not?
+ raise Diaspora::RelayableObjectWithoutParent if object_must_have_parent_and_does_not?
raise Diaspora::AuthorXMLAuthorMismatch if author_does_not_match_xml_author?
@object.save! if @object && @object.respond_to?(:save!)
@object
@@ -64,7 +65,7 @@ class Postzord::Receiver::Public < Postzord::Receiver
# @return [Array<Integer>] User ids
def recipient_user_ids
- User.all_sharing_with_person(@author).select('users.id').map!{ |u| u.id }
+ User.all_sharing_with_person(@author).pluck('users.id')
end
def xml_author
@@ -88,4 +89,12 @@ class Postzord::Receiver::Public < Postzord::Receiver
def object_can_be_public_and_it_is_not?
@object.respond_to?(:public) && !@object.public?
end
+
+ def object_must_have_parent_and_does_not?
+ if @object.respond_to?(:relayable?) # comment, like
+ @object.parent.nil?
+ else
+ false
+ end
+ end
end
diff --git a/lib/rack/chrome_frame.rb b/lib/rack/chrome_frame.rb
index de7234dd1..a81c7d12e 100644
--- a/lib/rack/chrome_frame.rb
+++ b/lib/rack/chrome_frame.rb
@@ -60,7 +60,7 @@ module Rack
<meta http-equiv="X-UA-Compatible" content="chrome=1">
HEAD
- body.gsub!('<head>', "<head>\n" + head )
+ body.gsub!(/<head(.*)>/, "<head\\1>\n" + head )
body
end
diff --git a/lib/stream/base.rb b/lib/stream/base.rb
index 9a00ee173..ceb835fd8 100644
--- a/lib/stream/base.rb
+++ b/lib/stream/base.rb
@@ -32,7 +32,7 @@ class Stream::Base
# @return [ActiveRecord::Relation<Post>]
def posts
- Post.scoped
+ Post.all
end
# @return [Array<Post>]
@@ -115,7 +115,7 @@ class Stream::Base
#
# @return [Array<Contact>]
def contacts_in_stream
- @contacts_in_stream ||= Contact.where(:user_id => user.id, :person_id => people.map{|x| x.id}).all
+ @contacts_in_stream ||= Contact.where(:user_id => user.id, :person_id => people.map(&:id)).load
end
# @param post [Post]
diff --git a/lib/stream/tag.rb b/lib/stream/tag.rb
index 9817a24a8..afb6175a2 100644
--- a/lib/stream/tag.rb
+++ b/lib/stream/tag.rb
@@ -38,13 +38,9 @@ class Stream::Tag < Stream::Base
private
- def tag_prefill_text
- I18n.translate('streams.tags.tag_prefill_text', :tag_name => display_tag_name)
- end
-
# @return [Hash]
def publisher_opts
- {:prefill => "#{tag_prefill_text}", :open => true}
+ {:open => true}
end
def construct_post_query
diff --git a/lib/tasks/accounts.rake b/lib/tasks/accounts.rake
index 91bfd7a02..fb79a2730 100644
--- a/lib/tasks/accounts.rake
+++ b/lib/tasks/accounts.rake
@@ -1,9 +1,9 @@
namespace :accounts do
desc "Run deletions"
task :run_deletions => :environment do
- if ::AccountDeletion.count > 0
+ if ::AccountDeletion.uncompleted.count > 0
puts "Running account deletions.."
- ::AccountDeletion.find_each do |account_delete|
+ ::AccountDeletion.uncompleted.find_each do |account_delete|
account_delete.perform!
end
puts "OK."
diff --git a/lib/tasks/assets.rake b/lib/tasks/assets.rake
new file mode 100644
index 000000000..cc84fbf97
--- /dev/null
+++ b/lib/tasks/assets.rake
@@ -0,0 +1,59 @@
+# Inspired by https://github.com/route/errgent/blob/master/lib/errgent/renderer.rb
+class ErrorPageRenderer
+ def initialize options={}
+ @codes = options.fetch :codes, [404, 500]
+ @output = options.fetch :output, "public/%s.html"
+ @vars = options.fetch :vars, {}
+ @template = options.fetch :template, "errors/error_%s"
+ @layout = options.fetch :layout, "layouts/error_page"
+ end
+
+ def render
+ @codes.each do |code|
+ view = build_action_view
+ view.assign @vars.merge(code: code)
+ path = Rails.root.join(@output % code)
+ File.write path, view.render(template: @template % code, layout: @layout)
+ end
+ end
+
+ def helpers(&block)
+ @helpers = block
+ end
+
+ private
+
+ def build_action_view
+ paths = ::ActionController::Base.view_paths
+ ::ActionView::Base.new(paths).tap do |view|
+ view.class_eval do
+ include Rails.application.helpers
+ include Rails.application.routes.url_helpers
+ end
+ view.assets_manifest = build_manifest(Rails.application)
+ view.class_eval(&@helpers) if @helpers
+ end
+ end
+
+ # Internal API from the sprocket-rails railtie, if somebody finds a way to
+ # call it, please replace it. Might need to be updated on sprocket-rails
+ # updates.
+ def build_manifest(app)
+ config = app.config
+ path = File.join(config.paths['public'].first, config.assets.prefix)
+ Sprockets::Manifest.new(app.assets, path, config.assets.manifest)
+ end
+end
+
+namespace :assets do
+ desc "Generate error pages"
+ task :generate_error_pages do
+ renderer = ErrorPageRenderer.new codes: [404, 422, 500]
+ renderer.render
+ end
+
+ # Augment precompile with error page generation
+ task :precompile do
+ Rake::Task['assets:generate_error_pages'].invoke
+ end
+end
diff --git a/lib/tasks/generate_session_secret.rake b/lib/tasks/generate_session_secret.rake
index 0d819ce67..cab226177 100644
--- a/lib/tasks/generate_session_secret.rake
+++ b/lib/tasks/generate_session_secret.rake
@@ -6,17 +6,18 @@ namespace :generate do
secret = SecureRandom.hex(40)
File.open(path, 'w') do |f|
f.write <<"EOF"
-# Copyright (c) 2010-2011, Diaspora Inc. This file is
-# licensed under the Affero General Public License version 3 or later. See
-# the COPYRIGHT file.
-
# Be sure to restart your server when you modify this file.
-# Your secret key for verifying the integrity of signed cookies.
+# Your secret key is used for verifying the integrity of signed cookies.
# If you change this key, all old signed cookies will become invalid!
+
# Make sure the secret is at least 30 characters and all random,
# no regular words or you'll be exposed to dictionary attacks.
-Rails.application.config.secret_token = '#{secret}'
+# You can use `rake secret` to generate a secure secret key.
+
+# Make sure your secret_key_base is kept private
+# if you're sharing your code publicly.
+Diaspora::Application.config.secret_key_base = '#{secret}'
EOF
end
diff --git a/lib/tasks/linter.rake b/lib/tasks/linter.rake
new file mode 100644
index 000000000..c533ad820
--- /dev/null
+++ b/lib/tasks/linter.rake
@@ -0,0 +1,12 @@
+begin
+ require "jshintrb/jshinttask"
+ Jshintrb::JshintTask.new :jshint do |t|
+ t.pattern = "{app/assets,lib/assets,spec}/javascripts/**/*.js"
+ t.options = :jshintrc
+ end
+rescue LoadError
+ desc "jshint rake task not available (jshintrb not installed)"
+ task :jshint do
+ abort "JSHint rake task is not available. Be sure to install jshintrb."
+ end
+end
diff --git a/lib/tasks/maintenance.rake b/lib/tasks/maintenance.rake
index fd8c9e59d..746a773f5 100644
--- a/lib/tasks/maintenance.rake
+++ b/lib/tasks/maintenance.rake
@@ -36,4 +36,13 @@ RUBY
puts "Could not install logrotate configs. Perhaps you should try running this task as root and ensuring logrotate is installed:\n#{logrotate_conf}"
end
end
+
+ desc "Queue users for removal"
+ task :queue_users_for_removal => :environment do
+ # Queue users for removal due to inactivity
+ # Note! settings.maintenance.remove_old_users
+ # must still be enabled, this only bypasses
+ # scheduling to run the queuing immediately
+ Workers::QueueUsersForRemoval.perform_async
+ end
end
diff --git a/lib/tasks/migrations.rake b/lib/tasks/migrations.rake
index f0b8498d0..20d7d42d8 100644
--- a/lib/tasks/migrations.rake
+++ b/lib/tasks/migrations.rake
@@ -82,7 +82,7 @@ namespace :migrations do
puts "found #{evil_tags.count} tags to convert..."
evil_tags.each_with_index do |tag, i|
- good_tag = ActsAsTaggableOn::Tag.find_or_create_by_name(tag.name.mb_chars.downcase)
+ good_tag = ActsAsTaggableOn::Tag.first_or_create_by(name: tag.name.mb_chars.downcase)
puts "++ '#{tag.name}' has #{tag.taggings.count} records attached"
taggings = tag.taggings
diff --git a/lib/tasks/tests.rake b/lib/tasks/tests.rake
index faabcfafd..11c9bf3c5 100644
--- a/lib/tasks/tests.rake
+++ b/lib/tasks/tests.rake
@@ -1,23 +1,21 @@
namespace :ci do
namespace :travis do
+ task prepare_db: %w(db:create db:test:load)
+ task prepare: %w(prepare_db assets:generate_error_pages)
+
desc "Run everyhting except cucumber"
- task :other => [ :prepare, "tests:generate_fixtures", :spec, "jasmine:ci" ]
+ task other: %w(prepare tests:generate_fixtures spec jasmine:ci)
desc "Run cucumber"
- task :cucumber => [ :prepare, "rake:cucumber" ]
-
- desc "Prepare db"
- task :prepare_db => [ "db:create", "db:test:load"]
+ task cucumber: %w(prepare rake:cucumber)
- desc "Prepare"
- task :prepare => [:prepare_db, "assets:precompile"]
end
end
if defined?(RSpec)
namespace :tests do
desc "Run all specs that generate fixtures for rspec or jasmine"
- RSpec::Core::RakeTask.new(:generate_fixtures) do |t|
+ RSpec::Core::RakeTask.new(:generate_fixtures => 'spec:prepare') do |t|
t.rspec_opts = ['--tag fixture']
end
end
diff --git a/lib/webfinger.rb b/lib/webfinger.rb
index 93e2cf5f6..385c2b40b 100644
--- a/lib/webfinger.rb
+++ b/lib/webfinger.rb
@@ -31,7 +31,9 @@ class Webfinger
Rails.logger.info("Getting: #{url} for #{account}")
begin
res = Faraday.get(url)
- return false if res.status == 404
+ unless res.success?
+ raise "Failed to fetch #{url}: #{res.status}"
+ end
res.body
rescue OpenSSL::SSL::SSLError => e
Rails.logger.info "Failed to fetch #{url}: SSL setup invalid"
diff --git a/public/404.css b/public/404.css
deleted file mode 100644
index b0d7864ad..000000000
--- a/public/404.css
+++ /dev/null
@@ -1,52 +0,0 @@
-@font-face {
- font-family:Roboto;
- src: local("Roboto-Regular.ttf")
-}
-
-@font-face {
- font-family:Roboto-BoldCondensed;
- src: local("Roboto-BoldCondensed.ttf")
-}
-
-html {
- background: url("bgpattern.png") #ebebeb;
- text-align: center;
-}
-
-body {
- width: 100%;
- height: 100%;
- position: fixed;
- bottom:0px;
- margin: 0px;
- font-family: Roboto, Helvetica, Arial, sans-serif;
- text-align: center;
- text-shadow: 0 1px 0 #fff;
- color: #666;
- background: url("peeping-tom.png") no-repeat bottom;
-}
-
-#big-number {
- font-family: Roboto-BoldCondensed, Helvetica, Arial, sans-serif;
- font-size: 250px;
- text-shadow: 0 2px 0 #fff, 0 -1px 0 #999;
- color: #ddd;
-}
-
-a {
- text-decoration : none;
- color : rgb(42,156,235);
-}
-
-a:hover {
- text-decoration : underline;
-}
-
-.transparent {
- -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=80)";
- filter: alpha(opacity=80);
- opacity: 0.8;
- -moz-opacity: 0.8;
- -khtml-opacity: 0.8;
- -webkit-opacity: 0.8;
-}
diff --git a/public/404.html b/public/404.html
deleted file mode 100644
index daa4be7f5..000000000
--- a/public/404.html
+++ /dev/null
@@ -1,14 +0,0 @@
-<!DOCTYPE html>
-<html>
- <head>
- <title>The page you were looking for doesn't exist (404)</title>
- <link href="/favicon.ico" rel="shortcut icon">
- <link href="/404.css" type="text/css" rel="stylesheet">
- </head>
- <body>
- <!-- This file lives in public/404.html -->
- <div id="big-number" class="transparent">404</div>
- <p>These are not the kittens you're looking for. Move along.</p>
- <p><a href="javascript:history.back()">Go Back?</a></p>
- </body>
-</html>
diff --git a/public/422.html b/public/422.html
deleted file mode 100644
index 83660ab18..000000000
--- a/public/422.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>The change you wanted was rejected (422)</title>
- <style type="text/css">
- body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
- div.dialog {
- width: 25em;
- padding: 0 4em;
- margin: 4em auto 0 auto;
- border: 1px solid #ccc;
- border-right-color: #999;
- border-bottom-color: #999;
- }
- h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
- </style>
-</head>
-
-<body>
- <!-- This file lives in public/422.html -->
- <div class="dialog">
- <h1>The change you wanted was rejected.</h1>
- <p>Maybe you tried to change something you didn't have access to.</p>
- </div>
-</body>
-</html>
diff --git a/public/500.html b/public/500.html
deleted file mode 100644
index d90787b1d..000000000
--- a/public/500.html
+++ /dev/null
@@ -1,47 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
- <title>We're sorry, but something went wrong (500)</title>
- <style type="text/css">
- body {
- text-align: center;
- background-color: rgb(252,252,252);
- color: #444;
- font-family: 'helvetica neue', 'helvetica', 'arial', sans-serif;
- margin: 0;
- padding: 1em;
- }
-
- header {
- height: 100px;
- background-color: #333;
- position:relative;
- }
-
- #diaspora_logo {
- position: relative;
- margin-top: 50px;
- }
-
- h1 {
- font-size: 100%;
- color: #444;
- line-height: 1.5em;
- }
- </style>
-</head>
-
-<body>
- <!-- This file lives in public/500.html -->
- <header>
- <img id="diaspora_logo" src="/assets/branding/white2x.png"/>
- </header>
-
- <h1>
- 500: Internal server error.
- </h1>
- <h3>
- Our bad! Sorry about that. :(
- </h3>
-</body>
-</html>
diff --git a/public/Roboto-BoldCondensed.ttf b/public/Roboto-BoldCondensed.ttf
deleted file mode 100644
index d7ea8833b..000000000
--- a/public/Roboto-BoldCondensed.ttf
+++ /dev/null
Binary files differ
diff --git a/public/Roboto-Regular.ttf b/public/Roboto-Regular.ttf
deleted file mode 100644
index 7d9a6c4c3..000000000
--- a/public/Roboto-Regular.ttf
+++ /dev/null
Binary files differ
diff --git a/public/apple-touch-icon.png b/public/apple-touch-icon.png
deleted file mode 100644
index 302744847..000000000
--- a/public/apple-touch-icon.png
+++ /dev/null
Binary files differ
diff --git a/public/bgpattern.png b/public/bgpattern.png
deleted file mode 100644
index a21195356..000000000
--- a/public/bgpattern.png
+++ /dev/null
Binary files differ
diff --git a/public/crossdomain.xml b/public/crossdomain.xml
deleted file mode 100644
index 6c5ca91c4..000000000
--- a/public/crossdomain.xml
+++ /dev/null
@@ -1,3 +0,0 @@
-<cross-domain-policy>
- <allow-access-from domain="*" to-ports="*" />
-</cross-domain-policy>
diff --git a/public/default.html b/public/default.html
deleted file mode 100644
index aeb5cc587..000000000
--- a/public/default.html
+++ /dev/null
@@ -1,158 +0,0 @@
- <style type="text/css">
- body {
- margin-top: 50px;
- background-color: white;
- background-image : none;
- }
-
- li {
- list-style: none;
- }
-
- footer h3 {
- margin-bottom: 25px;
- text-align: center;
- }
-
- footer {
- margin-bottom: 12px;
- padding: 42px;
- border-top: 1px solid #ccc;
- border-bottom: 1px solid #ccc;
- }
-
- #header {
- /* Hack to hide the header */
- -webkit-box-shadow:none;
- -moz-box-shadow:none;
- box-shadow:none;
- border:none;
- background:none;
-
- left: 0px;
- padding: 15px 0px;
- }
-
- #header img {
- margin-left: 15px;
- }
-
- #login-link {
- float: right;
- margin-right: 15px;
- }
-
- #steps {
- text-align: center;
- }
-
- #banner {
- border-bottom : 1px solid #ccc;
- border-top : 1px solid #eee;
- padding : 30px;
- margin-top: 20px;
- text-align: center;
-
- -webkit-box-shadow : 0 9px 15px -10px rgba(0,0,0,0.7);
- -moz-box-shadow : 0 9px 15px -10px rgba(0,0,0,0.7);
- -khtml-box-shadow : 0 9px 15px -10px rgba(0,0,0,0.7);
- -o-box-shadow : 0 9px 15px -10px rgba(0,0,0,0.7);
- -ms-box-shadow : 0 9px 15px -10px rgba(0,0,0,0.7);
- box-shadow : 0 9px 15px -10px rgba(0,0,0,0.7);
- }
-
- #links {
- margin: 0;
- padding: 0;
- text-align: center;
- }
-
- #links .section {
- margin: 0;
- padding: 0;
- display: inline-block;
- vertical-align: top;
- width: 24%;
- max-width: 24%;
- }
-
- #change-page {
- color: #999;
- text-align: center;
- font-style: italic;
- }
-
- .helpful {
- cursor: help;
- }
-
- .row {
- margin-bottom: 60px;
- }
- </style>
-
- <div id="page" class="container">
- <header id="header">
- <a id="login-link" href="login" class="btn">Log In</a>
- <img src="assets/branding/logo.png" />
- </header>
-
- <div id="banner" class="row">
- <h1>Welcome, friend.</h1>
- <h3>You're about to change the Internet. Let's get you set up, shall we?</h3>
- </div>
-
- <div id="steps" class="row">
- <div class="span4">
- <h2>Configure your <abbr class="helpful" title="A Diaspora installation">pod</abbr></h2>
- <img src="assets/icons/cog.png" />
-
- <p>Look at
- <code class="helpful" title='General pod configuration (location to upload photos, SSL certs, etc.)'>
- config/diaspora.yml.example</code> and <code class="helpful" title="mySQL username/password">
- config/database.yml.example</code> for help.</p>
- </div>
-
- <div class="span4">
- <h2>Try it out</h2>
- <img src="assets/icons/smiley_laughing.png" />
-
- <p>Start by <a href="users/sign_up">creating an account</a>.</p>
- </div>
-
- <div class="span4">
- <h2>Make a contribution!</h2>
- <img src="assets/icons/pen_write.png" />
-
- <p>Make Diaspora even better! Fork the project on
- <a href="http://github.com/diaspora/diaspora/" title="github">github</a>,
- make some changes, and submit a pull request.</p>
- </div>
- </div>
-
- <footer>
- <h3>Useful Resources</h3>
- <ul id="links">
- <ul class="section">
- <li><a href="http://github.com/diaspora/diaspora/" title="Git repository">Codebase</a></li>
- <li><a href="http://wiki.diasporafoundation.org" title="Wiki on github">Documentation</a></li>
- </ul>
- <ul class="section">
- <li><a href="http://webchat.freenode.net/?channels=diaspora" title="#diaspora">IRC - General</a></li>
- <li><a href="http://webchat.freenode.net/?channels=diaspora-dev" title="#diaspora-dev">IRC - Development</a></li>
- </ul>
- <ul class="section">
- <li><a href="http://groups.google.com/group/diaspora-discuss" title="General discussion mailing list">Discussion - General</a></li>
- <li><a href="http://groups.google.com/group/diaspora-dev" title="Dev mailing list">Discussion - Development</a></li>
- </ul>
- <ul class="section">
- <li><a href="https://github.com/diaspora/diaspora/issues" title="Bug tracker">Find & Report bugs</a></li>
- <li><a href="http://guides.rubyonrails.org/">Learn more about Ruby On Rails!</a></li>
- </ul>
- </ul>
- </footer>
-
- <div id="change-page">
- This page can be changed to a custom landing page by creating <code>app/views/home/_show.html.haml</code>
- </div>
- </div>
diff --git a/public/icon_128.gif b/public/icon_128.gif
deleted file mode 100644
index fd164228e..000000000
--- a/public/icon_128.gif
+++ /dev/null
Binary files differ
diff --git a/script/get_config.rb b/script/get_config.rb
index 1c97d78ca..a9197096d 100755
--- a/script/get_config.rb
+++ b/script/get_config.rb
@@ -14,9 +14,8 @@ require 'pathname'
require 'active_support/core_ext/class/attribute_accessors'
require 'active_support/core_ext/object/blank'
require 'active_support/core_ext/module/delegation'
-require 'active_support/core_ext/module/method_names'
-class Rails
+module Rails
def self.root
@@root ||= Pathname.new(File.expand_path(File.join(File.dirname(__FILE__), "..")))
end
diff --git a/script/install/setup b/script/install/setup
index 503538740..586e7a0f0 100644
--- a/script/install/setup
+++ b/script/install/setup
@@ -168,7 +168,7 @@ diaspora_setup() {
prepare_gem_bundle
log_inf "creating the default database specified in config/database.yml. please wait..."
- run_or_error "bundle exec rake db:schema:load_if_ruby --trace"
+ run_or_error "bin/rake db:schema:load_if_ruby --trace"
printf "\n"
printf "$GOODBYE_MSG"
diff --git a/script/server b/script/server
index 4652e04b6..d99c33056 100755
--- a/script/server
+++ b/script/server
@@ -64,18 +64,21 @@ fi
# Setup environment
if [ -z "$RAILS_ENV" ]
then
- RAILS_ENV=$(bundle exec ruby ./script/get_config.rb server.rails_environment)
+ RAILS_ENV=$(bin/bundle exec ruby ./script/get_config.rb server.rails_environment)
on_failure "Couldn't parse config/diaspora.yml!"
export RAILS_ENV
fi
os=$(uname -s)
-vars=$(bundle exec ruby ./script/get_config.rb \
+vars=$(bin/bundle exec ruby ./script/get_config.rb \
port=server.port \
single_process_mode=environment.single_process_mode? \
embed_sidekiq_worker=server.embed_sidekiq_worker \
- workers=server.sidekiq_workers
+ workers=server.sidekiq_workers \
+ chat=chat.enabled \
+ chat_server=chat.server.enabled \
+ chat_bosh_proxy=chat.server.bosh.proxy
)
on_failure "Couldn't parse config/diaspora.yml!"
eval "$vars"
@@ -117,12 +120,12 @@ then
fi
# Check if assets are precompiled
-if [ "$RAILS_ENV" = "production" -a ! -e "public/assets/default.css" ]
+if [ "$RAILS_ENV" = "production" -a -z "$(find public/assets -maxdepth 1 -name 'home-*.css' -print -quit)" ]
then
fatal "You're running in production mode without having assets
precompiled. Now and after each update before you restart the
application, run:
- bundle exec rake assets:precompile"
+ bin/rake assets:precompile"
fi
# Check for old curl versions (see https://github.com/diaspora/diaspora/issues/4202)
@@ -137,6 +140,24 @@ https://github.com/diaspora/diaspora/issues/4202 for details
"
fi
+vines=0
+if [ "$chat" = "true" ] && [ "$chat_server" = "true" ]
+then
+ vines=1
+ if [ "$chat_bosh_proxy" = "false" ]
+ then
+ warning "
+*****************************************************************
+You enabled the chat feature but haven't configured BOSH! That
+could lead to mixed-content problems with the http clients. Please
+think about editing your proxy configuration as described in:
+
+diaspora.yml.example
+*****************************************************************
+"
+ fi
+fi
+
# Start Diaspora
echo -n "Starting Diaspora in $RAILS_ENV mode on port $port "
if [ "$embed_sidekiq_worker" = "true" ]
@@ -152,4 +173,4 @@ else
fi
echo ""
-exec bundle exec foreman start -m "web=1,sidekiq=$workers" -p $port
+exec bin/bundle exec foreman start -m "xmpp=$vines,web=1,sidekiq=$workers" -p $port
diff --git a/spec/controllers/admin/users_controller_spec.rb b/spec/controllers/admin/users_controller_spec.rb
index dcb59d04e..c26536853 100644
--- a/spec/controllers/admin/users_controller_spec.rb
+++ b/spec/controllers/admin/users_controller_spec.rb
@@ -1,7 +1,7 @@
require 'spec_helper'
-describe Admin::UsersController do
+describe Admin::UsersController, :type => :controller do
before do
@user = FactoryGirl.create :user
Role.add_admin(@user.person)
@@ -12,11 +12,28 @@ describe Admin::UsersController do
describe '#close_account' do
it 'queues a job to disable the given account' do
other_user = FactoryGirl.create :user
- other_user.should_receive(:close_account!)
- User.stub(:find).and_return(other_user)
+ expect(other_user).to receive(:close_account!)
+ allow(User).to receive(:find).and_return(other_user)
post :close_account, id: other_user.id
end
end
+ describe '#lock_account' do
+ it 'it locks the given account' do
+ other_user = FactoryGirl.create :user
+ other_user.lock_access!
+ expect(other_user.reload.access_locked?).to be_truthy
+ end
+ end
+
+ describe '#unlock_account' do
+ it 'it unlocks the given account' do
+ other_user = FactoryGirl.create :user
+ other_user.lock_access!
+ other_user.unlock_access!
+ expect(other_user.reload.access_locked?).to be_falsey
+ end
+ end
+
end
diff --git a/spec/controllers/admins_controller_spec.rb b/spec/controllers/admins_controller_spec.rb
index 398b7b5eb..3bab4f38a 100644
--- a/spec/controllers/admins_controller_spec.rb
+++ b/spec/controllers/admins_controller_spec.rb
@@ -4,7 +4,7 @@
require 'spec_helper'
-describe AdminsController do
+describe AdminsController, :type => :controller do
before do
@user = FactoryGirl.create :user
sign_in :user, @user
@@ -14,7 +14,7 @@ describe AdminsController do
context 'admin not signed in' do
it 'is behind redirect_unless_admin' do
get :user_search
- response.should redirect_to stream_path
+ expect(response).to redirect_to stream_path
end
end
@@ -25,23 +25,23 @@ describe AdminsController do
it 'succeeds and renders user_search' do
get :user_search
- response.should be_success
- response.should render_template(:user_search)
+ expect(response).to be_success
+ expect(response).to render_template(:user_search)
end
it 'assigns users to an empty array if nothing is searched for' do
get :user_search
- assigns[:users].should == []
+ expect(assigns[:users]).to eq([])
end
it 'searches on username' do
get :user_search, admins_controller_user_search: { username: @user.username }
- assigns[:users].should == [@user]
+ expect(assigns[:users]).to eq([@user])
end
it 'searches on email' do
get :user_search, admins_controller_user_search: { email: @user.email }
- assigns[:users].should == [@user]
+ expect(assigns[:users]).to eq([@user])
end
it 'searches on age < 13 (COPPA)' do
@@ -55,8 +55,8 @@ describe AdminsController do
get :user_search, admins_controller_user_search: { under13: '1' }
- assigns[:users].should include(u_13)
- assigns[:users].should_not include(o_13)
+ expect(assigns[:users]).to include(u_13)
+ expect(assigns[:users]).not_to include(o_13)
end
end
end
@@ -65,7 +65,7 @@ describe AdminsController do
context 'admin not signed in' do
it 'is behind redirect_unless_admin' do
get :admin_inviter
- response.should redirect_to stream_path
+ expect(response).to redirect_to stream_path
end
end
@@ -77,14 +77,14 @@ describe AdminsController do
it 'does not die if you do it twice' do
get :admin_inviter, :identifier => 'bob@moms.com'
get :admin_inviter, :identifier => 'bob@moms.com'
- response.should be_redirect
+ expect(response).to be_redirect
end
it 'invites a new user' do
- EmailInviter.should_receive(:new).and_return(double.as_null_object)
+ expect(EmailInviter).to receive(:new).and_return(double.as_null_object)
get :admin_inviter, :identifier => 'bob@moms.com'
- response.should redirect_to user_search_path
- flash.notice.should include("invitation sent")
+ expect(response).to redirect_to user_search_path
+ expect(flash.notice).to include("invitation sent")
end
end
end
@@ -96,8 +96,8 @@ describe AdminsController do
it 'succeeds and renders stats' do
get :stats
- response.should be_success
- response.should render_template(:stats)
+ expect(response).to be_success
+ expect(response).to render_template(:stats)
end
end
end
diff --git a/spec/controllers/application_controller_spec.rb b/spec/controllers/application_controller_spec.rb
index a23af3610..3910e9461 100644
--- a/spec/controllers/application_controller_spec.rb
+++ b/spec/controllers/application_controller_spec.rb
@@ -4,7 +4,7 @@
require 'spec_helper'
-describe ApplicationController do
+describe ApplicationController, :type => :controller do
controller do
def index
head :ok
@@ -18,20 +18,20 @@ describe ApplicationController do
describe '#set_diaspora_headers' do
it 'sets the version header' do
get :index
- response.headers['X-Diaspora-Version'].should include AppConfig.version.number.get
+ expect(response.headers['X-Diaspora-Version']).to include AppConfig.version.number.get
end
context 'with git info' do
before do
- AppConfig.stub(:git_available?).and_return(true)
- AppConfig.stub(:git_update).and_return('yesterday')
- AppConfig.stub(:git_revision).and_return('02395')
+ allow(AppConfig).to receive(:git_available?).and_return(true)
+ allow(AppConfig).to receive(:git_update).and_return('yesterday')
+ allow(AppConfig).to receive(:git_revision).and_return('02395')
end
it 'sets the git header' do
get :index
- response.headers['X-Git-Update'].should == 'yesterday'
- response.headers['X-Git-Revision'].should == '02395'
+ expect(response.headers['X-Git-Update']).to eq('yesterday')
+ expect(response.headers['X-Git-Revision']).to eq('02395')
end
end
end
@@ -41,25 +41,25 @@ describe ApplicationController do
request.format = :html
session[:mobile_view] = true
get :index
- request.format.mobile?.should be_true
+ expect(request.format.mobile?).to be true
end
it 'uses :html for :tablets' do
request.format = :tablet
session[:tablet_view] = true
get :index
- request.format.html?.should be_true
+ expect(request.format.html?).to be true
end
it "doesn't mess up other formats, like json" do
get :index, :format => 'json'
- request.format.json?.should be_true
+ expect(request.format.json?).to be true
end
it "doesn't mess up other formats, like xml, even with :mobile session" do
session[:mobile_view] = true
get :index, :format => 'xml'
- request.format.xml?.should be_true
+ expect(request.format.xml?).to be true
end
end
@@ -70,11 +70,11 @@ describe ApplicationController do
end
it 'queries current_users tag if there are tag_followings' do
- @controller.send(:tags).should == [@tag]
+ expect(@controller.send(:tags)).to eq([@tag])
end
it 'does not query twice' do
- User.any_instance.should_receive(:followed_tags).once.and_return([@tag])
+ expect_any_instance_of(User).to receive(:followed_tags).once.and_return([@tag])
@controller.send(:tags)
@controller.send(:tags)
end
@@ -87,8 +87,15 @@ describe ApplicationController do
end
it "redirects to getting started if the user has getting started set to true" do
- @controller.send(:after_sign_in_path_for, alice).should == getting_started_path
+ expect(@controller.send(:after_sign_in_path_for, alice)).to eq(getting_started_path)
end
end
end
+
+ describe "#after_sign_out_path_for" do
+ it "can handle a nil HTTP_USER_AGENT" do
+ @request.headers["HTTP_USER_AGENT"] = nil
+ expect(@controller.send(:after_sign_out_path_for, alice)).to eq(new_user_session_path)
+ end
+ end
end
diff --git a/spec/controllers/aspect_memberships_controller_spec.rb b/spec/controllers/aspect_memberships_controller_spec.rb
index a3d4666c1..abdae8de8 100644
--- a/spec/controllers/aspect_memberships_controller_spec.rb
+++ b/spec/controllers/aspect_memberships_controller_spec.rb
@@ -4,7 +4,7 @@
require 'spec_helper'
-describe AspectMembershipsController do
+describe AspectMembershipsController, :type => :controller do
before do
@aspect0 = alice.aspects.first
@aspect1 = alice.aspects.create(:name => "another aspect")
@@ -14,7 +14,7 @@ describe AspectMembershipsController do
alice.getting_started = false
alice.save
sign_in :user, alice
- @controller.stub(:current_user).and_return(alice)
+ allow(@controller).to receive(:current_user).and_return(alice)
request.env["HTTP_REFERER"] = 'http://' + request.host
end
@@ -28,16 +28,16 @@ describe AspectMembershipsController do
:format => :json,
:person_id => bob.person.id,
:aspect_id => @aspect1.id
- response.should be_success
+ expect(response).to be_success
end
it 'creates an aspect membership' do
- lambda {
+ expect {
post :create,
:format => :json,
:person_id => bob.person.id,
:aspect_id => @aspect1.id
- }.should change{
+ }.to change{
alice.contact_for(bob.person).aspect_memberships.count
}.by(1)
end
@@ -45,41 +45,41 @@ describe AspectMembershipsController do
it 'creates a contact' do
#argggg why?
alice.contacts.reload
- lambda {
+ expect {
post :create,
:format => :json,
:person_id => @person.id,
:aspect_id => @aspect0.id
- }.should change{
+ }.to change{
alice.contacts.size
}.by(1)
end
it 'failure flashes error' do
- alice.should_receive(:share_with).and_return(nil)
+ expect(alice).to receive(:share_with).and_return(nil)
post :create,
:format => :json,
:person_id => @person.id,
:aspect_id => @aspect0.id
- flash[:error].should_not be_blank
+ expect(flash[:error]).not_to be_blank
end
it 'does not 500 on a duplicate key error' do
params = {:format => :json, :person_id => @person.id, :aspect_id => @aspect0.id}
post :create, params
post :create, params
- response.status.should == 400
+ expect(response.status).to eq(400)
end
context 'json' do
- it 'returns a list of aspect ids for the person' do
+ it 'returns the aspect membership' do
post :create,
:format => :json,
:person_id => @person.id,
:aspect_id => @aspect0.id
contact = @controller.current_user.contact_for(@person)
- response.body.should == contact.aspect_memberships.first.to_json
+ expect(response.body).to eq(AspectMembershipPresenter.new(contact.aspect_memberships.first).base_hash.to_json)
end
end
end
@@ -88,23 +88,23 @@ describe AspectMembershipsController do
it 'removes contacts from an aspect' do
membership = alice.add_contact_to_aspect(@contact, @aspect1)
delete :destroy, :format => :json, :id => membership.id
- response.should be_success
+ expect(response).to be_success
@aspect1.reload
- @aspect1.contacts.include?(@contact).should be false
+ expect(@aspect1.contacts.to_a).not_to include @contact
end
it 'does not 500 on an html request' do
membership = alice.add_contact_to_aspect(@contact, @aspect1)
delete :destroy, :id => membership.id
- response.should redirect_to :back
+ expect(response).to redirect_to :back
@aspect1.reload
- @aspect1.contacts.include?(@contact).should be false
+ expect(@aspect1.contacts.to_a).not_to include @contact
end
it 'aspect membership does not exist' do
delete :destroy, :format => :json, :id => 123
- response.should_not be_success
- response.body.should include "Could not find the selected person in that aspect"
+ expect(response).not_to be_success
+ expect(response.body).to include "Could not find the selected person in that aspect"
end
end
end
diff --git a/spec/controllers/aspects_controller_spec.rb b/spec/controllers/aspects_controller_spec.rb
index 1e68047e3..fa375516c 100644
--- a/spec/controllers/aspects_controller_spec.rb
+++ b/spec/controllers/aspects_controller_spec.rb
@@ -4,7 +4,7 @@
require 'spec_helper'
-describe AspectsController do
+describe AspectsController, :type => :controller do
before do
alice.getting_started = false
alice.save
@@ -12,7 +12,7 @@ describe AspectsController do
@alices_aspect_1 = alice.aspects.where(:name => "generic").first
@alices_aspect_2 = alice.aspects.create(:name => "another aspect")
- @controller.stub(:current_user).and_return(alice)
+ allow(@controller).to receive(:current_user).and_return(alice)
request.env["HTTP_REFERER"] = 'http://' + request.host
end
@@ -20,74 +20,74 @@ describe AspectsController do
describe "#new" do
it "renders a remote form if remote is true" do
get :new, "remote" => "true"
- response.should be_success
- response.body.should =~ /#{Regexp.escape('data-remote="true"')}/
+ expect(response).to be_success
+ expect(response.body).to match(/#{Regexp.escape('data-remote="true"')}/)
end
it "renders a non-remote form if remote is false" do
get :new, "remote" => "false"
- response.should be_success
- response.body.should_not =~ /#{Regexp.escape('data-remote="true"')}/
+ expect(response).to be_success
+ expect(response.body).not_to match(/#{Regexp.escape('data-remote="true"')}/)
end
it "renders a non-remote form if remote is missing" do
get :new
- response.should be_success
- response.body.should_not =~ /#{Regexp.escape('data-remote="true"')}/
+ expect(response).to be_success
+ expect(response.body).not_to match(/#{Regexp.escape('data-remote="true"')}/)
end
end
describe "#show" do
it "succeeds" do
get :show, 'id' => @alices_aspect_1.id.to_s
- response.should be_redirect
+ expect(response).to be_redirect
end
it 'redirects on an invalid id' do
- get :show, 'id' => 4341029835
- response.should be_redirect
+ get :show, 'id' => 0
+ expect(response).to be_redirect
end
end
describe "#create" do
context "with valid params" do
it "creates an aspect" do
- alice.aspects.count.should == 2
+ expect(alice.aspects.count).to eq(2)
post :create, "aspect" => {"name" => "new aspect"}
- alice.reload.aspects.count.should == 3
+ expect(alice.reload.aspects.count).to eq(3)
end
it "redirects to the aspect's contact page" do
post :create, "aspect" => {"name" => "new aspect"}
- response.should redirect_to(contacts_path(:a_id => Aspect.find_by_name("new aspect").id))
+ expect(response).to redirect_to(contacts_path(:a_id => Aspect.find_by_name("new aspect").id))
end
context "with person_id param" do
it "creates a contact if one does not already exist" do
- lambda {
+ expect {
post :create, :format => 'js', :aspect => {:name => "new", :person_id => eve.person.id}
- }.should change {
+ }.to change {
alice.contacts.count
}.by(1)
end
it "adds a new contact to the new aspect" do
post :create, :format => 'js', :aspect => {:name => "new", :person_id => eve.person.id}
- alice.aspects.find_by_name("new").contacts.count.should == 1
+ expect(alice.aspects.find_by_name("new").contacts.count).to eq(1)
end
it "adds an existing contact to the new aspect" do
post :create, :format => 'js', :aspect => {:name => "new", :person_id => bob.person.id}
- alice.aspects.find_by_name("new").contacts.count.should == 1
+ expect(alice.aspects.find_by_name("new").contacts.count).to eq(1)
end
end
end
context "with invalid params" do
it "does not create an aspect" do
- alice.aspects.count.should == 2
+ expect(alice.aspects.count).to eq(2)
post :create, "aspect" => {"name" => ""}
- alice.reload.aspects.count.should == 2
+ expect(alice.reload.aspects.count).to eq(2)
end
it "goes back to the page you came from" do
post :create, "aspect" => {"name" => ""}
- response.should redirect_to(:back)
+ expect(response).to redirect_to(:back)
end
end
end
@@ -102,58 +102,13 @@ describe AspectsController do
params = {"name" => "Bruisers"}
params[:user_id] = new_user.id
put('update', :id => @alices_aspect_1.id, "aspect" => params)
- Aspect.find(@alices_aspect_1.id).user_id.should == alice.id
+ expect(Aspect.find(@alices_aspect_1.id).user_id).to eq(alice.id)
end
it "should return the name and id of the updated item" do
params = {"name" => "Bruisers"}
put('update', :id => @alices_aspect_1.id, "aspect" => params)
- response.body.should == { :id => @alices_aspect_1.id, :name => "Bruisers" }.to_json
- end
- end
-
- describe '#edit' do
- before do
- eve.profile.first_name = eve.profile.last_name = nil
- eve.profile.save
- eve.save
-
- @zed = FactoryGirl.create(:user_with_aspect, :username => "zed")
- @zed.profile.first_name = "zed"
- @zed.profile.save
- @zed.save
- @katz = FactoryGirl.create(:user_with_aspect, :username => "katz")
- @katz.profile.first_name = "katz"
- @katz.profile.save
- @katz.save
-
- connect_users(alice, @alices_aspect_2, eve, eve.aspects.first)
- connect_users(alice, @alices_aspect_2, @zed, @zed.aspects.first)
- connect_users(alice, @alices_aspect_1, @katz, @katz.aspects.first)
- end
-
- it 'renders' do
- get :edit, :id => @alices_aspect_1.id
- response.should be_success
- end
-
- it 'assigns the contacts in alphabetical order with people in aspects first' do
- get :edit, :id => @alices_aspect_2.id
- assigns[:contacts].map(&:id).should == [alice.contact_for(eve.person), alice.contact_for(@zed.person), alice.contact_for(bob.person), alice.contact_for(@katz.person)].map(&:id)
- end
-
- it 'assigns all the contacts if noone is there' do
- alices_aspect_3 = alice.aspects.create(:name => "aspect 3")
-
- get :edit, :id => alices_aspect_3.id
- assigns[:contacts].map(&:id).should == [alice.contact_for(bob.person), alice.contact_for(eve.person), alice.contact_for(@katz.person), alice.contact_for(@zed.person)].map(&:id)
- end
-
- it 'eager loads the aspect memberships for all the contacts' do
- get :edit, :id => @alices_aspect_2.id
- assigns[:contacts].each do |c|
- c.aspect_memberships.loaded?.should be_true
- end
+ expect(response.body).to eq({ :id => @alices_aspect_1.id, :name => "Bruisers" }.to_json)
end
end
@@ -162,16 +117,16 @@ describe AspectsController do
@alices_aspect_1.contacts_visible = false
@alices_aspect_1.save
- get :toggle_contact_visibility, :format => 'js', :aspect_id => @alices_aspect_1.id
- @alices_aspect_1.reload.contacts_visible.should be_true
+ xhr :get, :toggle_contact_visibility, :aspect_id => @alices_aspect_1.id
+ expect(@alices_aspect_1.reload.contacts_visible).to be true
end
it 'sets contacts hidden' do
@alices_aspect_1.contacts_visible = true
@alices_aspect_1.save
- get :toggle_contact_visibility, :format => 'js', :aspect_id => @alices_aspect_1.id
- @alices_aspect_1.reload.contacts_visible.should be_false
+ xhr :get, :toggle_contact_visibility, :aspect_id => @alices_aspect_1.id
+ expect(@alices_aspect_1.reload.contacts_visible).to be false
end
end
end
diff --git a/spec/controllers/blocks_controller_spec.rb b/spec/controllers/blocks_controller_spec.rb
index de1f81663..fe733cf8d 100644
--- a/spec/controllers/blocks_controller_spec.rb
+++ b/spec/controllers/blocks_controller_spec.rb
@@ -1,6 +1,6 @@
require 'spec_helper'
-describe BlocksController do
+describe BlocksController, :type => :controller do
before do
sign_in alice
end
@@ -15,17 +15,17 @@ describe BlocksController do
it "redirects back" do
post :create, :block => { :person_id => 2 }
- response.should be_redirect
+ expect(response).to be_redirect
end
it "notifies the user" do
post :create, :block => { :person_id => 2 }
- flash.should_not be_empty
+ expect(flash).not_to be_empty
end
it "calls #disconnect_if_contact" do
- @controller.should_receive(:disconnect_if_contact).with(bob.person)
+ expect(@controller).to receive(:disconnect_if_contact).with(bob.person)
post :create, :block => {:person_id => bob.person.id}
end
end
@@ -37,7 +37,7 @@ describe BlocksController do
it "redirects back" do
delete :destroy, :id => @block.id
- response.should be_redirect
+ expect(response).to be_redirect
end
it "removes a block" do
@@ -49,18 +49,18 @@ describe BlocksController do
describe "#disconnect_if_contact" do
before do
- @controller.stub(:current_user).and_return(alice)
+ allow(@controller).to receive(:current_user).and_return(alice)
end
it "calls disconnect with the force option if there is a contact for a given user" do
contact = alice.contact_for(bob.person)
- alice.stub(:contact_for).and_return(contact)
- alice.should_receive(:disconnect).with(contact, hash_including(:force => true))
+ allow(alice).to receive(:contact_for).and_return(contact)
+ expect(alice).to receive(:disconnect).with(contact, hash_including(:force => true))
@controller.send(:disconnect_if_contact, bob.person)
end
it "doesn't call disconnect if there is a contact for a given user" do
- alice.should_not_receive(:disconnect)
+ expect(alice).not_to receive(:disconnect)
@controller.send(:disconnect_if_contact, eve.person)
end
end
diff --git a/spec/controllers/comments_controller_spec.rb b/spec/controllers/comments_controller_spec.rb
index d4286de90..f3e2bf185 100644
--- a/spec/controllers/comments_controller_spec.rb
+++ b/spec/controllers/comments_controller_spec.rb
@@ -4,9 +4,9 @@
require 'spec_helper'
-describe CommentsController do
+describe CommentsController, :type => :controller do
before do
- @controller.stub(:current_user).and_return(alice)
+ allow(@controller).to receive(:current_user).and_return(alice)
sign_in :user, alice
end
@@ -24,13 +24,13 @@ describe CommentsController do
it 'responds to format json' do
post :create, comment_hash.merge(:format => 'json')
- response.code.should == '201'
- response.body.should match comment_hash[:text]
+ expect(response.code).to eq('201')
+ expect(response.body).to match comment_hash[:text]
end
it 'responds to format mobile' do
post :create, comment_hash.merge(:format => 'mobile')
- response.should be_success
+ expect(response).to be_success
end
end
@@ -42,21 +42,21 @@ describe CommentsController do
it 'comments' do
post :create, comment_hash
- response.code.should == '201'
+ expect(response.code).to eq('201')
end
it "doesn't overwrite author_id" do
new_user = FactoryGirl.create(:user)
comment_hash[:author_id] = new_user.person.id.to_s
post :create, comment_hash
- Comment.find_by_text(comment_hash[:text]).author_id.should == alice.person.id
+ expect(Comment.find_by_text(comment_hash[:text]).author_id).to eq(alice.person.id)
end
it "doesn't overwrite id" do
old_comment = alice.comment!(@post, "hello")
comment_hash[:id] = old_comment.id
post :create, comment_hash
- old_comment.reload.text.should == 'hello'
+ expect(old_comment.reload.text).to eq('hello')
end
end
@@ -64,9 +64,9 @@ describe CommentsController do
aspect_to_post = eve.aspects.where(:name => "generic").first
@post = eve.post :status_message, :text => 'GIANTS', :to => aspect_to_post
- alice.should_not_receive(:comment)
+ expect(alice).not_to receive(:comment)
post :create, comment_hash
- response.code.should == '422'
+ expect(response.code).to eq('422')
end
end
@@ -78,24 +78,24 @@ describe CommentsController do
context 'your post' do
before do
- @controller.stub(:current_user).and_return(bob)
+ allow(@controller).to receive(:current_user).and_return(bob)
sign_in :user, bob
end
it 'lets the user delete his comment' do
comment = bob.comment!(@message, "hey")
- bob.should_receive(:retract).with(comment)
+ expect(bob).to receive(:retract).with(comment)
delete :destroy, :format => "js", :post_id => 1, :id => comment.id
- response.status.should == 204
+ expect(response.status).to eq(204)
end
it "lets the user destroy other people's comments" do
comment = alice.comment!(@message, "hey")
- bob.should_receive(:retract).with(comment)
+ expect(bob).to receive(:retract).with(comment)
delete :destroy, :format => "js", :post_id => 1, :id => comment.id
- response.status.should == 204
+ expect(response.status).to eq(204)
end
end
@@ -103,25 +103,25 @@ describe CommentsController do
it 'let the user delete his comment' do
comment = alice.comment!(@message, "hey")
- alice.should_receive(:retract).with(comment)
+ expect(alice).to receive(:retract).with(comment)
delete :destroy, :format => "js", :post_id => 1, :id => comment.id
- response.status.should == 204
+ expect(response.status).to eq(204)
end
it 'does not let the user destroy comments he does not own' do
comment1 = bob.comment!(@message, "hey")
comment2 = eve.comment!(@message, "hey")
- alice.should_not_receive(:retract).with(comment1)
+ expect(alice).not_to receive(:retract).with(comment1)
delete :destroy, :format => "js", :post_id => 1, :id => comment2.id
- response.status.should == 403
+ expect(response.status).to eq(403)
end
end
it 'renders nothing and 404 on a nonexistent comment' do
delete :destroy, :post_id => 1, :id => 343415
- response.status.should == 404
- response.body.strip.should be_empty
+ expect(response.status).to eq(404)
+ expect(response.body.strip).to be_empty
end
end
@@ -133,19 +133,19 @@ describe CommentsController do
it 'works for mobile' do
get :index, :post_id => @message.id, :format => 'mobile'
- response.should be_success
+ expect(response).to be_success
end
it 'returns all the comments for a post' do
comments = [alice, bob, eve].map{ |u| u.comment!(@message, "hey") }
- get :index, :post_id => @message.id, :format => 'js'
- assigns[:comments].map(&:id).should =~ comments.map(&:id)
+ get :index, :post_id => @message.id, :format => :json
+ expect(assigns[:comments].map(&:id)).to match_array(comments.map(&:id))
end
it 'returns a 404 on a nonexistent post' do
- get :index, :post_id => 235236, :format => 'js'
- response.status.should == 404
+ get :index, :post_id => 235236, :format => :json
+ expect(response.status).to eq(404)
end
it 'returns a 404 on a post that is not visible to the signed in user' do
@@ -153,7 +153,7 @@ describe CommentsController do
message = eve.post(:status_message, :text => "hey", :to => aspect_to_post.id)
bob.comment!(@message, "hey")
get :index, :post_id => message.id, :format => :json
- response.status.should == 404
+ expect(response.status).to eq(404)
end
end
end
diff --git a/spec/controllers/contacts_controller_spec.rb b/spec/controllers/contacts_controller_spec.rb
index 91be1c5dc..5b70a0014 100644
--- a/spec/controllers/contacts_controller_spec.rb
+++ b/spec/controllers/contacts_controller_spec.rb
@@ -4,56 +4,39 @@
require 'spec_helper'
-describe ContactsController do
+describe ContactsController, :type => :controller do
before do
sign_in :user, bob
- @controller.stub(:current_user).and_return(bob)
- end
-
- describe '#sharing' do
- it "succeeds" do
- get :sharing
- response.should be_success
- end
-
- it 'eager loads the aspects' do
- get :sharing
- assigns[:contacts].first.aspect_memberships.loaded?.should be_true
- end
-
- it "assigns only the people sharing with you with 'share_with' flag" do
- get :sharing, :id => 'share_with'
- assigns[:contacts].to_set.should == bob.contacts.sharing.to_set
- end
+ allow(@controller).to receive(:current_user).and_return(bob)
end
describe '#index' do
context 'format mobile' do
it "succeeds" do
get :index, :format => 'mobile'
- response.should be_success
+ expect(response).to be_success
end
end
context 'format html' do
it "succeeds" do
get :index
- response.should be_success
+ expect(response).to be_success
end
it "assigns contacts" do
get :index
contacts = assigns(:contacts)
- contacts.to_set.should == bob.contacts.to_set
+ expect(contacts.to_set).to eq(bob.contacts.to_set)
end
it "shows only contacts a user is sharing with" do
contact = bob.contacts.first
contact.update_attributes(:sharing => false)
- get :index, :set => "mine"
+ get :index
contacts = assigns(:contacts)
- contacts.to_set.should == bob.contacts.receiving.to_set
+ expect(contacts.to_set).to eq(bob.contacts.receiving.to_set)
end
it "shows all contacts (sharing and receiving)" do
@@ -62,29 +45,29 @@ describe ContactsController do
get :index, :set => "all"
contacts = assigns(:contacts)
- contacts.to_set.should == bob.contacts.to_set
+ expect(contacts.to_set).to eq(bob.contacts.to_set)
end
end
context 'format json' do
it 'assumes all aspects if none are specified' do
get :index, :format => 'json'
- assigns[:people].map(&:id).should =~ bob.contacts.map { |c| c.person.id }
- response.should be_success
+ expect(assigns[:people].map(&:id)).to match_array(bob.contacts.map { |c| c.person.id })
+ expect(response).to be_success
end
it 'returns the contacts for multiple aspects' do
get :index, :aspect_ids => bob.aspect_ids, :format => 'json'
- assigns[:people].map(&:id).should =~ bob.contacts.map { |c| c.person.id }
- response.should be_success
+ expect(assigns[:people].map(&:id)).to match_array(bob.contacts.map { |c| c.person.id })
+ expect(response).to be_success
end
it 'does not return duplicate contacts' do
aspect = bob.aspects.create(:name => 'hilarious people')
aspect.contacts << bob.contact_for(eve.person)
get :index, :format => 'json', :aspect_ids => bob.aspect_ids
- assigns[:people].map { |p| p.id }.uniq.should == assigns[:people].map { |p| p.id }
- assigns[:people].map(&:id).should =~ bob.contacts.map { |c| c.person.id }
+ expect(assigns[:people].map { |p| p.id }.uniq).to eq(assigns[:people].map { |p| p.id })
+ expect(assigns[:people].map(&:id)).to match_array(bob.contacts.map { |c| c.person.id })
end
end
end
@@ -92,14 +75,14 @@ describe ContactsController do
describe '#spotlight' do
it 'succeeds' do
get :spotlight
- response.should be_success
+ expect(response).to be_success
end
it 'gets queries for users in the app config' do
Role.add_spotlight(alice.person)
get :spotlight
- assigns[:people].should == [alice.person]
+ expect(assigns[:people]).to eq([alice.person])
end
end
end
diff --git a/spec/controllers/conversation_visibilities_controller_spec.rb b/spec/controllers/conversation_visibilities_controller_spec.rb
index 54993fd72..24d60adda 100644
--- a/spec/controllers/conversation_visibilities_controller_spec.rb
+++ b/spec/controllers/conversation_visibilities_controller_spec.rb
@@ -4,7 +4,7 @@
require 'spec_helper'
-describe ConversationVisibilitiesController do
+describe ConversationVisibilitiesController, :type => :controller do
before do
@user1 = alice
sign_in :user, @user1
@@ -20,18 +20,31 @@ describe ConversationVisibilitiesController do
describe '#destroy' do
it 'deletes the visibility' do
- lambda {
+ expect {
delete :destroy, :conversation_id => @conversation.id
- }.should change(ConversationVisibility, :count).by(-1)
+ }.to change(ConversationVisibility, :count).by(-1)
end
it 'does not let a user destroy a visibility that is not theirs' do
user2 = eve
sign_in :user, user2
- lambda {
+ expect {
delete :destroy, :conversation_id => @conversation.id
- }.should_not change(ConversationVisibility, :count)
+ }.not_to change(ConversationVisibility, :count)
+ end
+
+ it 'returns "hidden"' do
+ get :destroy, :conversation_id => @conversation.id
+ expect(flash.notice).to include("hidden")
+ end
+
+ it 'returns "deleted" when last participant' do
+ get :destroy, :conversation_id => @conversation.id
+ sign_out :user
+ sign_in :user, bob
+ get :destroy, :conversation_id => @conversation.id
+ expect(flash.notice).to include("deleted")
end
end
-end \ No newline at end of file
+end
diff --git a/spec/controllers/conversations_controller_spec.rb b/spec/controllers/conversations_controller_spec.rb
index eba62c04b..fe1cb3263 100644
--- a/spec/controllers/conversations_controller_spec.rb
+++ b/spec/controllers/conversations_controller_spec.rb
@@ -4,39 +4,46 @@
require 'spec_helper'
-describe ConversationsController do
+describe ConversationsController, :type => :controller do
before do
sign_in :user, alice
end
describe '#new' do
- it 'succeeds' do
+ it 'redirects to #index' do
get :new
- response.should be_success
+ expect(response).to redirect_to conversations_path
+ end
+ end
+
+ describe '#new modal' 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
- get :new
- assigns(:contacts_json).should include(alice.contacts.where(:sharing => true).first.person.name)
+ get :new, :modal => true
+ expect(assigns(:contacts_json)).to include(alice.contacts.where(:sharing => true).first.person.name)
alice.contacts << Contact.new(:person_id => eve.person.id, :user_id => alice.id, :sharing => false, :receiving => true)
- assigns(:contacts_json).should_not include(alice.contacts.where(:sharing => false).first.person.name)
+ expect(assigns(:contacts_json)).not_to include(alice.contacts.where(:sharing => false).first.person.name)
end
it "assigns a contact if passed a contact id" do
- get :new, :contact_id => alice.contacts.first.id
- assigns(:contact_ids).should == alice.contacts.first.id
+ get :new, :contact_id => alice.contacts.first.id, :modal => true
+ expect(assigns(:contact_ids)).to eq(alice.contacts.first.id)
end
it "assigns a set of contacts if passed an aspect id" do
- get :new, :aspect_id => alice.aspects.first.id
- assigns(:contact_ids).should == alice.aspects.first.contacts.map(&:id).join(',')
+ get :new, :aspect_id => alice.aspects.first.id, :modal => true
+ expect(assigns(:contact_ids)).to eq(alice.aspects.first.contacts.map(&:id).join(','))
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, name: xss
- response.body.should_not include xss
+ get :new, :modal => true, name: xss
+ expect(response.body).not_to include xss
end
end
@@ -44,7 +51,7 @@ describe ConversationsController do
xss = "<script>alert(0);</script>"
contact = alice.contacts.first
contact.person.profile.update_attribute(:first_name, xss)
- get :new
+ 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)
@@ -64,20 +71,26 @@ describe ConversationsController do
it 'succeeds' do
get :index
- response.should be_success
- assigns[:conversations].should =~ @conversations
+ expect(response).to be_success
+ expect(assigns[:conversations]).to match_array(@conversations)
end
it 'succeeds with json' do
get :index, :format => :json
- response.should be_success
+ expect(response).to be_success
json = JSON.parse(response.body)
- json.first['conversation'].should be_present
+ expect(json.first['conversation']).to be_present
end
it 'retrieves all conversations for a user' do
get :index
- assigns[:conversations].count.should == 3
+ expect(assigns[:conversations].count).to eq(3)
+ end
+
+ it 'does not let you access conversations where you are not a recipient' do
+ sign_in :user, eve
+ get :index, :conversation_id => @conversations.first.id
+ expect(assigns[:conversation]).to be_nil
end
end
@@ -85,6 +98,7 @@ describe ConversationsController do
context 'with a valid conversation' do
before do
@hash = {
+ :format => :js,
:conversation => {
:subject => "secret stuff",
:text => 'text debug'
@@ -94,29 +108,29 @@ describe ConversationsController do
end
it 'creates a conversation' do
- lambda {
+ expect {
post :create, @hash
- }.should change(Conversation, :count).by(1)
+ }.to change(Conversation, :count).by(1)
end
it 'creates a message' do
- lambda {
+ expect {
post :create, @hash
- }.should change(Message, :count).by(1)
+ }.to change(Message, :count).by(1)
end
it 'should set response with success to true and message to success message' do
post :create, @hash
- assigns[:response][:success].should == true
- assigns[:response][:message].should == I18n.t('conversations.create.sent')
- assigns[:response][:conversation_id].should == Conversation.first.id
+ expect(assigns[:response][:success]).to eq(true)
+ expect(assigns[:response][:message]).to eq(I18n.t('conversations.create.sent'))
+ expect(assigns[:response][:conversation_id]).to eq(Conversation.first.id)
end
it 'sets the author to the current_user' do
@hash[:author] = FactoryGirl.create(:user)
post :create, @hash
- Message.first.author.should == alice.person
- Conversation.first.author.should == alice.person
+ expect(Message.first.author).to eq(alice.person)
+ expect(Conversation.first.author).to eq(alice.person)
end
it 'dispatches the conversation' do
@@ -130,8 +144,8 @@ describe ConversationsController do
)
p = Postzord::Dispatcher.build(alice, cnv)
- p.class.stub(:new).and_return(p)
- p.should_receive(:post)
+ allow(p.class).to receive(:new).and_return(p)
+ expect(p).to receive(:post)
post :create, @hash
end
end
@@ -139,6 +153,7 @@ describe ConversationsController do
context 'with empty subject' do
before do
@hash = {
+ :format => :js,
:conversation => {
:subject => ' ',
:text => 'text debug'
@@ -148,28 +163,29 @@ describe ConversationsController do
end
it 'creates a conversation' do
- lambda {
+ expect {
post :create, @hash
- }.should change(Conversation, :count).by(1)
+ }.to change(Conversation, :count).by(1)
end
it 'creates a message' do
- lambda {
+ expect {
post :create, @hash
- }.should change(Message, :count).by(1)
+ }.to change(Message, :count).by(1)
end
it 'should set response with success to true and message to success message' do
post :create, @hash
- assigns[:response][:success].should == true
- assigns[:response][:message].should == I18n.t('conversations.create.sent')
- assigns[:response][:conversation_id].should == Conversation.first.id
+ expect(assigns[:response][:success]).to eq(true)
+ expect(assigns[:response][:message]).to eq(I18n.t('conversations.create.sent'))
+ expect(assigns[:response][:conversation_id]).to eq(Conversation.first.id)
end
end
context 'with empty text' do
before do
@hash = {
+ :format => :js,
:conversation => {
:subject => 'secret stuff',
:text => ' '
@@ -179,27 +195,28 @@ describe ConversationsController do
end
it 'does not create a conversation' do
- lambda {
- post :create, @hash
- }.should_not change(Conversation, :count).by(1)
+ count = Conversation.count
+ post :create, @hash
+ expect(Conversation.count).to eq(count)
end
it 'does not create a message' do
- lambda {
- post :create, @hash
- }.should_not change(Message, :count).by(1)
+ count = Message.count
+ post :create, @hash
+ expect(Message.count).to eq(count)
end
it 'should set response with success to false and message to create fail' do
post :create, @hash
- assigns[:response][:success].should == false
- assigns[:response][:message].should == I18n.t('conversations.create.fail')
+ expect(assigns[:response][:success]).to eq(false)
+ expect(assigns[:response][:message]).to eq(I18n.t('conversations.create.fail'))
end
end
context 'with empty contact' do
before do
@hash = {
+ :format => :js,
:conversation => {
:subject => 'secret stuff',
:text => 'text debug'
@@ -209,27 +226,28 @@ describe ConversationsController do
end
it 'does not create a conversation' do
- lambda {
- post :create, @hash
- }.should_not change(Conversation, :count).by(1)
+ count = Conversation.count
+ post :create, @hash
+ expect(Conversation.count).to eq(count)
end
it 'does not create a message' do
- lambda {
- post :create, @hash
- }.should_not change(Message, :count).by(1)
+ count = Message.count
+ post :create, @hash
+ expect(Message.count).to eq(count)
end
it 'should set response with success to false and message to fail due to no contact' do
post :create, @hash
- assigns[:response][:success].should == false
- assigns[:response][:message].should == I18n.t('conversations.create.no_contact')
+ expect(assigns[:response][:success]).to eq(false)
+ expect(assigns[:response][:message]).to eq(I18n.t('conversations.create.no_contact'))
end
end
context 'with nil contact' do
before do
@hash = {
+ :format => :js,
:conversation => {
:subject => 'secret stuff',
:text => 'text debug'
@@ -239,15 +257,15 @@ describe ConversationsController do
end
it 'does not create a conversation' do
- lambda {
- post :create, @hash
- }.should_not change(Conversation, :count).by(1)
+ count = Conversation.count
+ post :create, @hash
+ expect(Conversation.count).to eq(count)
end
it 'does not create a message' do
- lambda {
- post :create, @hash
- }.should_not change(Message, :count).by(1)
+ count = Message.count
+ post :create, @hash
+ expect(Message.count).to eq(count)
end
end
end
@@ -264,29 +282,21 @@ describe ConversationsController do
end
it 'succeeds with js' do
- get :show, :id => @conversation.id, :format => :js
- response.should be_success
- assigns[:conversation].should == @conversation
+ xhr :get, :show, :id => @conversation.id, :format => :js
+ expect(response).to be_success
+ expect(assigns[:conversation]).to eq(@conversation)
end
it 'succeeds with json' do
get :show, :id => @conversation.id, :format => :json
- response.should be_success
- assigns[:conversation].should == @conversation
- response.body.should include @conversation.guid
+ expect(response).to be_success
+ expect(assigns[:conversation]).to eq(@conversation)
+ expect(response.body).to include @conversation.guid
end
it 'redirects to index' do
get :show, :id => @conversation.id
- response.should redirect_to(conversations_path(:conversation_id => @conversation.id))
- assigns[:conversation].should == @conversation
- end
-
- it 'does not let you access conversations where you are not a recipient' do
- sign_in :user, eve
-
- get :show, :id => @conversation.id
- response.code.should redirect_to conversations_path
+ expect(response).to redirect_to(conversations_path(:conversation_id => @conversation.id))
end
end
end
diff --git a/spec/controllers/home_controller_spec.rb b/spec/controllers/home_controller_spec.rb
index d120c65bb..f34d3671e 100644
--- a/spec/controllers/home_controller_spec.rb
+++ b/spec/controllers/home_controller_spec.rb
@@ -4,12 +4,12 @@
require 'spec_helper'
-describe HomeController do
+describe HomeController, :type => :controller do
describe '#show' do
it 'does not redirect' do
sign_out :user
get :show
- response.should_not be_redirect
+ expect(response).not_to be_redirect
end
context 'redirection' do
@@ -19,7 +19,7 @@ describe HomeController do
it 'points to the stream if a user has contacts' do
get :show, :home => true
- response.should redirect_to(stream_path)
+ expect(response).to redirect_to(stream_path)
end
end
end
@@ -28,13 +28,13 @@ describe HomeController do
it 'changes :mobile to :html' do
session[:mobile_view] = true
get :toggle_mobile
- session[:mobile_view].should be_false
+ expect(session[:mobile_view]).to be false
end
it 'changes :html to :mobile' do
session[:mobile_view] = nil
get :toggle_mobile
- session[:mobile_view].should be_true
+ expect(session[:mobile_view]).to be true
end
end
end
diff --git a/spec/controllers/invitations_controller_spec.rb b/spec/controllers/invitations_controller_spec.rb
index 852181ada..c0a0bee68 100644
--- a/spec/controllers/invitations_controller_spec.rb
+++ b/spec/controllers/invitations_controller_spec.rb
@@ -4,7 +4,7 @@
require 'spec_helper'
-describe InvitationsController do
+describe InvitationsController, :type => :controller do
before do
AppConfig.settings.invitations.open = true
@@ -15,7 +15,7 @@ describe InvitationsController do
describe "#create" do
before do
sign_in :user, @user
- @controller.stub(:current_user).and_return(@user)
+ allow(@controller).to receive(:current_user).and_return(@user)
@referer = 'http://test.host/cats/foo'
request.env["HTTP_REFERER"] = @referer
end
@@ -26,18 +26,18 @@ describe InvitationsController do
end
it 'does not create an EmailInviter' do
- Workers::Mail::InviteEmail.should_not_receive(:perform_async)
+ expect(Workers::Mail::InviteEmail).not_to receive(:perform_async)
post :create, @invite
end
it 'returns to the previous page' do
post :create, @invite
- response.should redirect_to @referer
+ expect(response).to redirect_to @referer
end
it 'flashes an error' do
post :create, @invite
- flash[:error].should == I18n.t("invitations.create.empty")
+ expect(flash[:error]).to eq(I18n.t("invitations.create.empty"))
end
end
@@ -49,19 +49,19 @@ describe InvitationsController do
it 'creates an InviteEmail worker' do
inviter = double(:emails => [@emails], :send! => true)
- Workers::Mail::InviteEmail.should_receive(:perform_async).with(@invite['email_inviter']['emails'], @user.id, @invite['email_inviter'])
+ expect(Workers::Mail::InviteEmail).to receive(:perform_async).with(@invite['email_inviter']['emails'], @user.id, @invite['email_inviter'])
post :create, @invite
end
it 'returns to the previous page on success' do
post :create, @invite
- response.should redirect_to @referer
+ expect(response).to redirect_to @referer
end
it 'flashes a notice' do
post :create, @invite
expected = I18n.t('invitations.create.sent', :emails => @emails.split(',').join(', '))
- flash[:notice].should == expected
+ expect(flash[:notice]).to eq(expected)
end
end
@@ -72,20 +72,20 @@ describe InvitationsController do
end
it 'does not create an InviteEmail worker' do
- Workers::Mail::InviteEmail.should_not_receive(:perform_async)
+ expect(Workers::Mail::InviteEmail).not_to receive(:perform_async)
post :create, @invite
end
it 'returns to the previous page' do
post :create, @invite
- response.should redirect_to @referer
+ expect(response).to redirect_to @referer
end
it 'flashes an error' do
post :create, @invite
expected = I18n.t('invitations.create.rejected') + @emails.split(',').join(', ')
- flash[:error].should == expected
+ expect(flash[:error]).to eq(expected)
end
end
@@ -99,13 +99,13 @@ describe InvitationsController do
it 'creates an InviteEmail worker' do
inviter = double(:emails => [@emails], :send! => true)
- Workers::Mail::InviteEmail.should_receive(:perform_async).with(@valid_emails, @user.id, @invite['email_inviter'])
+ expect(Workers::Mail::InviteEmail).to receive(:perform_async).with(@valid_emails, @user.id, @invite['email_inviter'])
post :create, @invite
end
it 'returns to the previous page' do
post :create, @invite
- response.should redirect_to @referer
+ expect(response).to redirect_to @referer
end
it 'flashes a notice' do
@@ -114,17 +114,15 @@ describe InvitationsController do
@valid_emails.split(',').join(', ')) +
'. ' + I18n.t('invitations.create.rejected') +
@invalid_emails.split(',').join(', ')
- flash[:error].should == expected
+ expect(flash[:error]).to eq(expected)
end
end
it 'redirects if invitations are closed' do
- open_bit = AppConfig.settings.invitations.open?
AppConfig.settings.invitations.open = false
post :create, @invite
- response.should be_redirect
- AppConfig.settings.invitations.open = open_bit
+ expect(response).to be_redirect
end
end
@@ -132,7 +130,7 @@ describe InvitationsController do
it 'succeeds' do
get :email, :invitation_code => "anycode"
- response.should be_success
+ expect(response).to be_success
end
context 'legacy invite tokens' do
@@ -146,14 +144,14 @@ describe InvitationsController do
it 'redirects and flashes if the invitation token is invalid' do
get_email
- response.should be_redirect
- response.should redirect_to root_url
+ expect(response).to be_redirect
+ expect(response).to redirect_to root_url
end
it 'flashes an error if the invitation token is invalid' do
get_email
- flash[:error].should == I18n.t("invitations.check_token.not_found")
+ expect(flash[:error]).to eq(I18n.t("invitations.check_token.not_found"))
end
end
end
@@ -169,50 +167,50 @@ describe InvitationsController do
describe 'redirect logged out users to the sign in page' do
it 'redriects #new' do
get :new
- response.should be_redirect
- response.should redirect_to new_user_session_path
+ expect(response).to be_redirect
+ expect(response).to redirect_to new_user_session_path
end
it 'redirects #create' do
post :create
- response.should be_redirect
- response.should redirect_to new_user_session_path
+ expect(response).to be_redirect
+ expect(response).to redirect_to new_user_session_path
end
end
describe '.valid_email?' do
it 'returns false for empty email' do
- subject.send(:valid_email?, '').should be false
+ expect(subject.send(:valid_email?, '')).to be false
end
it 'returns false for email without @-sign' do
- subject.send(:valid_email?, 'foo').should be false
+ expect(subject.send(:valid_email?, 'foo')).to be false
end
it 'returns true for valid email' do
- subject.send(:valid_email?, 'foo@bar.com').should be true
+ expect(subject.send(:valid_email?, 'foo@bar.com')).to be true
end
end
describe '.html_safe_string_from_session_array' do
it 'returns "" for blank session[key]' do
- subject.send(:html_safe_string_from_session_array, :blank).should eq ""
+ expect(subject.send(:html_safe_string_from_session_array, :blank)).to eq ""
end
it 'returns "" if session[key] is not an array' do
session[:test_key] = "test"
- subject.send(:html_safe_string_from_session_array, :test_key).should eq ""
+ expect(subject.send(:html_safe_string_from_session_array, :test_key)).to eq ""
end
it 'returns the correct value' do
session[:test_key] = ["test", "foo"]
- subject.send(:html_safe_string_from_session_array, :test_key).should eq "test, foo"
+ expect(subject.send(:html_safe_string_from_session_array, :test_key)).to eq "test, foo"
end
it 'sets session[key] to nil' do
session[:test_key] = ["test"]
subject.send(:html_safe_string_from_session_array, :test_key)
- session[:test_key].should be nil
+ expect(session[:test_key]).to be nil
end
end
end
diff --git a/spec/controllers/jasmine_fixtures/aspects_spec.rb b/spec/controllers/jasmine_fixtures/aspects_spec.rb
index 7cb66843b..bdbf026ba 100644
--- a/spec/controllers/jasmine_fixtures/aspects_spec.rb
+++ b/spec/controllers/jasmine_fixtures/aspects_spec.rb
@@ -4,7 +4,7 @@
require 'spec_helper'
-describe StreamsController do
+describe StreamsController, :type => :controller do
describe '#aspects' do
before do
sign_in :user, alice
@@ -15,7 +15,7 @@ describe StreamsController do
context 'jasmine fixtures' do
before do
- Stream::Aspect.any_instance.stub(:ajax_stream?).and_return(false)
+ allow_any_instance_of(Stream::Aspect).to receive(:ajax_stream?).and_return(false)
end
it "generates a jasmine fixture", :fixture => true do
@@ -68,18 +68,7 @@ describe StreamsController do
it "generates a jasmine fixture with a post containing a video", :fixture => true do
stub_request(
:get,
- "http://gdata.youtube.com/feeds/api/videos/UYrkQL1bX4A?v=2"
- ).with(
- :headers => {'Accept'=>'*/*'}
- ).to_return(
- :status => 200,
- :body => "<title>LazyTown song - Cooking By The Book</title>",
- :headers => {}
- )
-
- stub_request(
- :get,
- "http://www.youtube.com/oembed?scheme=https&format=json&frame=1&iframe=1&maxheight=420&maxwidth=420&url=http://www.youtube.com/watch?v=UYrkQL1bX4A"
+ "http://www.youtube.com/oembed?format=json&frame=1&iframe=1&maxheight=420&maxwidth=420&scheme=https&url=http://www.youtube.com/watch?v=UYrkQL1bX4A"
).with(
:headers => {'Accept'=>'*/*'}
).to_return(
diff --git a/spec/controllers/jasmine_fixtures/contacts_spec.rb b/spec/controllers/jasmine_fixtures/contacts_spec.rb
index d2a5321de..6311c3b34 100644
--- a/spec/controllers/jasmine_fixtures/contacts_spec.rb
+++ b/spec/controllers/jasmine_fixtures/contacts_spec.rb
@@ -4,15 +4,26 @@
require 'spec_helper'
-describe ContactsController do
+describe ContactsController, :type => :controller do
describe '#index' do
before do
+ AppConfig.chat.enabled = true
+ @aspect = bob.aspects.create(:name => "another aspect")
+ bob.share_with alice.person, @aspect
+ bob.share_with eve.person, @aspect
sign_in :user, bob
end
- it "generates a jasmine fixture", :fixture => true do
- get :index
+ it "generates the aspects_manage fixture", :fixture => true do
+ get :index, :a_id => @aspect.id
save_fixture(html_for("body"), "aspects_manage")
end
+
+ it "generates the contacts_json fixture", :fixture => true do
+ json = bob.contacts.map { |c|
+ ContactPresenter.new(c, bob).full_hash_with_person
+ }.to_json
+ save_fixture(json, "contacts_json")
+ end
end
end
diff --git a/spec/controllers/jasmine_fixtures/conversations_spec.rb b/spec/controllers/jasmine_fixtures/conversations_spec.rb
new file mode 100644
index 000000000..b5d86e66c
--- /dev/null
+++ b/spec/controllers/jasmine_fixtures/conversations_spec.rb
@@ -0,0 +1,34 @@
+require 'spec_helper'
+
+describe ConversationsController, :type => :controller do
+ describe '#index' do
+ before do
+ @person = alice.contacts.first.person
+ hash = {
+ :author => @person,
+ :participant_ids => [alice.person.id, @person.id],
+ :subject => 'not spam',
+ :messages_attributes => [ {:author => @person, :text => 'cool stuff'} ]
+ }
+ @conv1 = Conversation.create(hash)
+ Message.create(:author => @person, :created_at => Time.now + 100, :text => "message", :conversation_id => @conv1.id)
+ .increase_unread(alice)
+ Message.create(:author => @person, :created_at => Time.now + 200, :text => "another message", :conversation_id => @conv1.id)
+ .increase_unread(alice)
+
+ @conv2 = Conversation.create(hash)
+ Message.create(:author => @person, :created_at => Time.now + 100, :text => "message", :conversation_id => @conv2.id)
+ .increase_unread(alice)
+
+ sign_in :user, alice
+ end
+
+ it "generates a jasmine fixture", :fixture => true do
+ get :index, :conversation_id => @conv1.id
+ save_fixture(html_for("body"), "conversations_unread")
+
+ get :index, :conversation_id => @conv1.id
+ save_fixture(html_for("body"), "conversations_read")
+ end
+ end
+end
diff --git a/spec/controllers/jasmine_fixtures/notifications_spec.rb b/spec/controllers/jasmine_fixtures/notifications_spec.rb
index 8851eb02d..771d99ec5 100644
--- a/spec/controllers/jasmine_fixtures/notifications_spec.rb
+++ b/spec/controllers/jasmine_fixtures/notifications_spec.rb
@@ -1,6 +1,6 @@
require 'spec_helper'
-describe NotificationsController do
+describe NotificationsController, :type => :controller do
describe '#index' do
before do
sign_in :user, alice
diff --git a/spec/controllers/jasmine_fixtures/people_spec.rb b/spec/controllers/jasmine_fixtures/people_spec.rb
index 53ea8ae72..36e66fe0b 100644
--- a/spec/controllers/jasmine_fixtures/people_spec.rb
+++ b/spec/controllers/jasmine_fixtures/people_spec.rb
@@ -4,7 +4,7 @@
require 'spec_helper'
-describe PeopleController do
+describe PeopleController, :type => :controller do
describe '#index' do
before do
sign_in :user, bob
@@ -23,17 +23,14 @@ describe PeopleController do
describe '#aspect_membership_dropdown' do
before do
+ aspect = bob.aspects.create name: 'Testing'
+ bob.share_with alice.person, aspect
sign_in :user, bob
end
- it "generates a jasmine fixture using Blueprint", :fixture => true do
+ it "generates a jasmine fixture", :fixture => true do
get :aspect_membership_dropdown, :person_id => alice.person.guid
- save_fixture(html_for("body"), "aspect_membership_dropdown_blueprint")
- end
-
- it "generates a jasmine fixture using Bootstrap", :fixture => true do
- get :aspect_membership_dropdown, :person_id => alice.person.guid, :bootstrap => true
- save_fixture(html_for("body"), "aspect_membership_dropdown_bootstrap")
+ save_fixture(html_for("body"), "aspect_membership_dropdown")
end
end
end
diff --git a/spec/controllers/jasmine_fixtures/photos_spec.rb b/spec/controllers/jasmine_fixtures/photos_spec.rb
new file mode 100644
index 000000000..79e6868ee
--- /dev/null
+++ b/spec/controllers/jasmine_fixtures/photos_spec.rb
@@ -0,0 +1,20 @@
+# 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 PhotosController, :type => :controller do
+ before do
+ @alices_photo = alice.post(:photo, :user_file => uploaded_photo, :to => alice.aspects.first.id, :public => false)
+ sign_in :user, alice
+ end
+
+ describe '#index' do
+ it "generates a jasmine fixture", :fixture => true do
+ request.env['HTTP_ACCEPT'] = 'application/json'
+ get :index, :person_id => alice.person.guid.to_s
+ save_fixture(response.body, "photos_json")
+ end
+ end
+end
diff --git a/spec/controllers/jasmine_fixtures/status_messages_spec.rb b/spec/controllers/jasmine_fixtures/status_messages_spec.rb
index 90a2f9df6..66730dfad 100644
--- a/spec/controllers/jasmine_fixtures/status_messages_spec.rb
+++ b/spec/controllers/jasmine_fixtures/status_messages_spec.rb
@@ -4,7 +4,7 @@
require 'spec_helper'
-describe StatusMessagesController do
+describe StatusMessagesController, :type => :controller do
describe '#bookmarklet' do
before do
sign_in :user, bob
@@ -16,4 +16,19 @@ describe StatusMessagesController do
end
end
+
+ describe '#new' do
+ before do
+ sign_in :user, alice
+ end
+
+ it 'generates a jasmine fixture', :fixture => true do
+ contact = alice.contact_for(bob.person)
+ aspect = alice.aspects.create(:name => 'people')
+ contact.aspects << aspect
+ contact.save
+ get :new, :person_id => bob.person.id
+ save_fixture(html_for("body"), "status_message_new")
+ end
+ end
end
diff --git a/spec/controllers/jasmine_fixtures/streams_spec.rb b/spec/controllers/jasmine_fixtures/streams_spec.rb
index 2a3a8a1b8..94e0cbb03 100644
--- a/spec/controllers/jasmine_fixtures/streams_spec.rb
+++ b/spec/controllers/jasmine_fixtures/streams_spec.rb
@@ -4,7 +4,7 @@
require 'spec_helper'
-describe StreamsController do
+describe StreamsController, :type => :controller do
describe '#multi' do
before do
sign_in :user, alice
@@ -53,7 +53,7 @@ TXT
Timecop.travel(time) do
get :multi, :format => :json
- response.should be_success
+ expect(response).to be_success
save_fixture(response.body, "stream_json")
end
end
diff --git a/spec/controllers/likes_controller_spec.rb b/spec/controllers/likes_controller_spec.rb
index dfaddc413..725c7f1a8 100644
--- a/spec/controllers/likes_controller_spec.rb
+++ b/spec/controllers/likes_controller_spec.rb
@@ -4,7 +4,7 @@
require 'spec_helper'
-describe LikesController do
+describe LikesController, :type => :controller do
before do
@alices_aspect = alice.aspects.where(:name => "generic").first
@bobs_aspect = bob.aspects.where(:name => "generic").first
@@ -33,7 +33,7 @@ describe LikesController do
@target = alice.post :status_message, :text => "AWESOME", :to => @alices_aspect.id
@target = alice.comment!(@target, "hey") if class_const == Comment
post :create, like_hash.merge(:format => :json)
- response.code.should == '201'
+ expect(response.code).to eq('201')
end
end
@@ -45,18 +45,18 @@ describe LikesController do
it 'likes' do
post :create, like_hash
- response.code.should == '201'
+ expect(response.code).to eq('201')
end
it 'dislikes' do
post :create, dislike_hash
- response.code.should == '201'
+ expect(response.code).to eq('201')
end
it "doesn't post multiple times" do
alice.like!(@target)
post :create, dislike_hash
- response.code.should == '422'
+ expect(response.code).to eq('422')
end
end
@@ -67,9 +67,30 @@ describe LikesController do
end
it "doesn't post" do
- alice.should_not_receive(:like!)
+ expect(alice).not_to receive(:like!)
post :create, like_hash
- response.code.should == '422'
+ expect(response.code).to eq('422')
+ end
+ end
+
+ context "when an the exception is raised" do
+ before do
+ @target = alice.post :status_message, :text => "AWESOME", :to => @alices_aspect.id
+ @target = alice.comment!(@target, "hey") if class_const == Comment
+ end
+
+ it "should be catched when it means that the target is not found" do
+ params = like_hash.merge(format: :json, id_field => -1)
+ post :create, params
+ expect(response.code).to eq('422')
+ end
+
+ it "should not be catched when it is unexpected" do
+ @target = alice.post :status_message, :text => "AWESOME", :to => @alices_aspect.id
+ @target = alice.comment!(@target, "hey") if class_const == Comment
+ allow(alice).to receive(:like!).and_raise("something")
+ allow(@controller).to receive(:current_user).and_return(alice)
+ expect { post :create, like_hash.merge(:format => :json) }.to raise_error("something")
end
end
end
@@ -94,12 +115,12 @@ describe LikesController do
it 'returns an array of likes for a post' do
like = bob.like!(@message)
get :index, id_field => @message.id
- assigns[:likes].map(&:id).should == @message.likes.map(&:id)
+ expect(assigns[:likes].map(&:id)).to eq(@message.likes.map(&:id))
end
it 'returns an empty array for a post with no likes' do
get :index, id_field => @message.id
- assigns[:likes].should == []
+ expect(assigns[:likes]).to eq([])
end
end
@@ -112,10 +133,10 @@ describe LikesController do
it 'lets a user destroy their like' do
current_user = controller.send(:current_user)
- current_user.should_receive(:retract).with(@like)
+ expect(current_user).to receive(:retract).with(@like)
delete :destroy, :format => :json, id_field => @like.target_id, :id => @like.id
- response.status.should == 204
+ expect(response.status).to eq(204)
end
it 'does not let a user destroy other likes' do
@@ -126,7 +147,7 @@ describe LikesController do
delete :destroy, :format => :json, id_field => like2.target_id, :id => like2.id
}.to raise_error(ActiveRecord::RecordNotFound)
- Like.count.should == like_count
+ expect(Like.count).to eq(like_count)
end
end
diff --git a/spec/controllers/messages_controller_spec.rb b/spec/controllers/messages_controller_spec.rb
index 4e3116cf2..c4364ef9e 100644
--- a/spec/controllers/messages_controller_spec.rb
+++ b/spec/controllers/messages_controller_spec.rb
@@ -4,7 +4,7 @@
require 'spec_helper'
-describe MessagesController do
+describe MessagesController, :type => :controller do
before do
sign_in :user, alice
end
@@ -33,11 +33,11 @@ describe MessagesController do
end
it 'redirects to conversation' do
- lambda {
+ expect {
post :create, @message_params
- }.should change(Message, :count).by(1)
- response.status.should == 302
- response.should redirect_to(conversations_path(:conversation_id => @conversation))
+ }.to change(Message, :count).by(1)
+ expect(response.status).to eq(302)
+ expect(response).to redirect_to(conversations_path(:conversation_id => @conversation))
end
end
@@ -50,10 +50,10 @@ describe MessagesController do
end
it 'does not create the message' do
- lambda {
+ expect {
post :create, @message_params
- }.should_not change(Message, :count)
- flash[:error].should be_present
+ }.not_to change(Message, :count)
+ expect(flash[:error]).to be_present
end
end
end
@@ -70,8 +70,8 @@ describe MessagesController do
it 'comments' do
post :create, @message_params
- response.status.should == 302
- response.should redirect_to(conversations_path(:conversation_id => @conversation))
+ expect(response.status).to eq(302)
+ expect(response).to redirect_to(conversations_path(:conversation_id => @conversation))
end
it "doesn't overwrite author_id" do
@@ -80,7 +80,7 @@ describe MessagesController do
post :create, @message_params
created_message = Message.find_by_text(@message_params[:message][:text])
- created_message.author.should == alice.person
+ expect(created_message.author).to eq(alice.person)
end
it "doesn't overwrite id" do
@@ -92,7 +92,7 @@ describe MessagesController do
@message_params[:id] = old_message.id
post :create, @message_params
- old_message.reload.text.should == 'hello'
+ expect(old_message.reload.text).to eq('hello')
end
end
@@ -109,10 +109,10 @@ describe MessagesController do
end
it 'does not create the message' do
- lambda {
+ expect {
post :create, @message_params
- }.should_not change(Message, :count)
- flash[:error].should be_present
+ }.not_to change(Message, :count)
+ expect(flash[:error]).to be_present
end
end
end
diff --git a/spec/controllers/notifications_controller_spec.rb b/spec/controllers/notifications_controller_spec.rb
index adb739df5..2302320b0 100644
--- a/spec/controllers/notifications_controller_spec.rb
+++ b/spec/controllers/notifications_controller_spec.rb
@@ -4,30 +4,31 @@
require 'spec_helper'
-describe NotificationsController do
+describe NotificationsController, :type => :controller do
before do
sign_in :user, alice
end
describe '#update' do
it 'marks a notification as read if it gets no other information' do
- note = mock_model( Notification )
- Notification.should_receive( :where ).and_return( [note] )
- note.should_receive( :set_read_state ).with( true )
- get :update, "id" => note.id
+ note = FactoryGirl.create(:notification)
+ expect(Notification).to receive( :where ).and_return( [note] )
+ expect(note).to receive( :set_read_state ).with( true )
+ get :update, "id" => note.id, :format => :json
end
+
it 'marks a notification as read if it is told to' do
- note = mock_model( Notification )
- Notification.should_receive( :where ).and_return( [note] )
- note.should_receive( :set_read_state ).with( true )
- get :update, "id" => note.id, :set_unread => "false"
+ note = FactoryGirl.create(:notification)
+ expect(Notification).to receive( :where ).and_return( [note] )
+ expect(note).to receive( :set_read_state ).with( true )
+ get :update, "id" => note.id, :set_unread => "false", :format => :json
end
it 'marks a notification as unread if it is told to' do
- note = mock_model( Notification )
- Notification.should_receive( :where ).and_return( [note] )
- note.should_receive( :set_read_state ).with( false )
- get :update, "id" => note.id, :set_unread => "true"
+ note = FactoryGirl.create(:notification)
+ expect(Notification).to receive( :where ).and_return( [note] )
+ expect(note).to receive( :set_read_state ).with( false )
+ get :update, "id" => note.id, :set_unread => "true", :format => :json
end
it 'only lets you read your own notifications' do
@@ -36,9 +37,9 @@ describe NotificationsController do
FactoryGirl.create(:notification, :recipient => alice)
note = FactoryGirl.create(:notification, :recipient => user2)
- get :update, "id" => note.id, :set_unread => "false"
+ get :update, "id" => note.id, :set_unread => "false", :format => :json
- Notification.find(note.id).unread.should == true
+ expect(Notification.find(note.id).unread).to eq(true)
end
end
@@ -50,63 +51,70 @@ describe NotificationsController do
it 'succeeds' do
get :index
- response.should be_success
- assigns[:notifications].count.should == 1
+ expect(response).to be_success
+ expect(assigns[:notifications].count).to eq(1)
end
it 'succeeds for notification dropdown' do
get :index, :format => :json
- response.should be_success
- response.body.should =~ /note_html/
+ expect(response).to be_success
+ expect(response.body).to match(/note_html/)
end
it 'succeeds on mobile' do
get :index, :format => :mobile
- response.should be_success
+ expect(response).to be_success
end
-
+
it 'paginates the notifications' do
25.times { FactoryGirl.create(:notification, :recipient => alice, :target => @post) }
get :index
- assigns[:notifications].count.should == 25
+ expect(assigns[:notifications].count).to eq(25)
get :index, "page" => 2
- assigns[:notifications].count.should == 1
+ expect(assigns[:notifications].count).to eq(1)
end
it "supports a limit per_page parameter" do
- 5.times { FactoryGirl.create(:notification, :recipient => alice, :target => @post) }
- get :index, "per_page" => 5
- assigns[:notifications].count.should == 5
+ 2.times { FactoryGirl.create(:notification, :recipient => alice, :target => @post) }
+ get :index, "per_page" => 2
+ expect(assigns[:notifications].count).to eq(2)
end
describe "special case for start sharing notifications" do
it "should not provide a contacts menu for standard notifications" do
- 2.times { FactoryGirl.create(:notification, :recipient => alice, :target => @post) }
+ FactoryGirl.create(:notification, :recipient => alice, :target => @post)
get :index, "per_page" => 5
- Nokogiri(response.body).css('.aspect_membership').should be_empty
+ expect(Nokogiri(response.body).css('.aspect_membership')).to be_empty
end
+
it "should provide a contacts menu for start sharing notifications" do
- 2.times { FactoryGirl.create(:notification, :recipient => alice, :target => @post) }
eve.share_with(alice.person, eve.aspects.first)
get :index, "per_page" => 5
- Nokogiri(response.body).css('.aspect_membership').should_not be_empty
+ expect(Nokogiri(response.body).css('.aspect_membership')).not_to be_empty
+ end
+
+ it 'succeeds on mobile' do
+ eve.share_with(alice.person, eve.aspects.first)
+ get :index, :format => :mobile
+ expect(response).to be_success
end
end
describe "filter notifications" do
it "supports filtering by notification type" do
- eve.share_with(alice.person, eve.aspects.first)
+ FactoryGirl.create(:notification, :recipient => alice, :type => "Notifications::StartedSharing")
get :index, "type" => "started_sharing"
- assigns[:notifications].count.should == 1
+ expect(assigns[:notifications].count).to eq(1)
end
it "supports filtering by read/unread" do
+ FactoryGirl.create(:notification, :recipient => alice, :target => @post)
get :read_all
- 2.times { FactoryGirl.create(:notification, :recipient => alice, :target => @post) }
+ FactoryGirl.create(:notification, :recipient => alice, :target => @post)
get :index, "show" => "unread"
- assigns[:notifications].count.should == 2
+ expect(assigns[:notifications].count).to eq(1)
end
end
end
@@ -114,47 +122,45 @@ describe NotificationsController do
describe "#read_all" do
it 'marks all notifications as read' do
request.env["HTTP_REFERER"] = "I wish I were spelled right"
- FactoryGirl.create(:notification, :recipient => alice)
- FactoryGirl.create(:notification, :recipient => alice)
+ FactoryGirl.create(:notification, :recipient => alice, :target => @post)
+ FactoryGirl.create(:notification, :recipient => alice, :target => @post)
- Notification.where(:unread => true).count.should == 2
+ expect(Notification.where(:unread => true).count).to eq(2)
get :read_all
- Notification.where(:unread => true).count.should == 0
+ expect(Notification.where(:unread => true).count).to eq(0)
end
it 'marks all notifications in the current filter as read' do
request.env["HTTP_REFERER"] = "I wish I were spelled right"
- FactoryGirl.create(:notification, :recipient => alice)
- eve.share_with(alice.person, eve.aspects.first)
- Notification.where(:unread => true).count.should == 2
+ FactoryGirl.create(:notification, :recipient => alice, :target => @post)
+ FactoryGirl.create(:notification, :recipient => alice, :type => "Notifications::StartedSharing")
+ expect(Notification.where(:unread => true).count).to eq(2)
get :read_all, "type" => "started_sharing"
- Notification.where(:unread => true).count.should == 1
+ expect(Notification.where(:unread => true).count).to eq(1)
end
it "should redirect back in the html version if it has > 0 notifications" do
- FactoryGirl.create(:notification, :recipient => alice)
- eve.share_with(alice.person, eve.aspects.first)
- get :read_all, :format => :html, "type" => "started_sharing"
- response.should redirect_to(notifications_path)
+ FactoryGirl.create(:notification, :recipient => alice, :type => "Notifications::StartedSharing")
+ get :read_all, :format => :html, "type" => "liked"
+ expect(response).to redirect_to(notifications_path)
end
it "should redirect back in the mobile version if it has > 0 notifications" do
- FactoryGirl.create(:notification, :recipient => alice)
- eve.share_with(alice.person, eve.aspects.first)
- get :read_all, :format => :mobile, "type" => "started_sharing"
- response.should redirect_to(notifications_path)
+ FactoryGirl.create(:notification, :recipient => alice, :type => "Notifications::StartedSharing")
+ get :read_all, :format => :mobile, "type" => "liked"
+ expect(response).to redirect_to(notifications_path)
end
it "should redirect to stream in the html version if it has 0 notifications" do
- FactoryGirl.create(:notification, :recipient => alice)
- get :read_all, :format => :html
- response.should redirect_to(stream_path)
+ FactoryGirl.create(:notification, :recipient => alice, :type => "Notifications::StartedSharing")
+ get :read_all, :format => :html, "type" => "started_sharing"
+ expect(response).to redirect_to(stream_path)
end
it "should redirect back in the mobile version if it has 0 notifications" do
- FactoryGirl.create(:notification, :recipient => alice)
- get :read_all, :format => :mobile
- response.should redirect_to(stream_path)
+ FactoryGirl.create(:notification, :recipient => alice, :type => "Notifications::StartedSharing")
+ get :read_all, :format => :mobile, "type" => "started_sharing"
+ expect(response).to redirect_to(stream_path)
end
it "should return a dummy value in the json version" do
- FactoryGirl.create(:notification, :recipient => alice)
+ FactoryGirl.create(:notification, :recipient => alice, :target => @post)
get :read_all, :format => :json
- response.should_not be_redirect
+ expect(response).not_to be_redirect
end
end
end
diff --git a/spec/controllers/participations_controller_spec.rb b/spec/controllers/participations_controller_spec.rb
new file mode 100644
index 000000000..4262ae580
--- /dev/null
+++ b/spec/controllers/participations_controller_spec.rb
@@ -0,0 +1,79 @@
+require 'spec_helper'
+
+describe ParticipationsController, :type => :controller do
+ before do
+ allow(@controller).to receive(:current_user).and_return(alice)
+ sign_in :user, alice
+ end
+
+ describe '#create' do
+ let(:stranger) { FactoryGirl.create(:user) }
+
+ shared_examples 'on a visible post' do
+ it 'creates the participation' do
+ post :create, post_id: @post.id
+ expect(alice.participations.where(:target_id => @post.id)).to exist
+ expect(response.code).to eq('201')
+ end
+ end
+
+ context 'on my own post' do
+ before do
+ aspect_to_post = alice.aspects.where(:name => 'generic').first
+ @post = alice.post :status_message, :text => 'something', :to => aspect_to_post
+ end
+
+ it_behaves_like 'on a visible post'
+ end
+
+ context 'on a post from a contact' do
+ before do
+ aspect_to_post = bob.aspects.where(:name => 'generic').first
+ @post = bob.post :status_message, :text => 'something', :to => aspect_to_post
+ end
+
+ it_behaves_like 'on a visible post'
+ end
+
+ context 'on a public post from a stranger' do
+ before do
+ @post = stranger.post :status_message, :text => 'something', :public => true, :to => 'all'
+ end
+
+ it_behaves_like 'on a visible post'
+ end
+
+ context 'on a non visible post' do
+ before do
+ @post = stranger.post :status_message, :text => 'something', :public => false, :to => 'all'
+ end
+
+ it 'should not create the participation' do
+ post :create, post_id: @post.id
+ expect(alice.participations.where(:target_id => @post.id)).not_to exist
+ expect(response.code).to eq('403')
+ end
+ end
+ end
+
+ describe '#destroy' do
+ let(:post) { FactoryGirl.create(:status_message) }
+
+ context 'on a post you partecipate to' do
+ before { alice.participate! post }
+
+ it 'should remove participation' do
+ delete :destroy, post_id: post.id
+ expect(alice.participations.where(:target_id => post.id)).not_to exist
+ expect(response.code).to eq('200')
+ end
+ end
+
+ context 'on a post you do not partecipate to' do
+ it 'says it is an unprocessable request' do
+ delete :destroy, post_id: post.id
+ expect(response.code).to eq('422')
+ end
+ end
+ end
+end
diff --git a/spec/controllers/passwords_controller_spec.rb b/spec/controllers/passwords_controller_spec.rb
index b5d2880e8..30794cc07 100644
--- a/spec/controllers/passwords_controller_spec.rb
+++ b/spec/controllers/passwords_controller_spec.rb
@@ -2,9 +2,9 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require 'spec_helper'
+require "spec_helper"
-describe PasswordsController do
+describe Devise::PasswordsController, type: :controller do
include Devise::TestHelpers
before do
@@ -15,21 +15,21 @@ describe PasswordsController do
context "when there is no such user" do
it "succeeds" do
post :create, "user" => {"email" => "foo@example.com"}
- response.should be_success
+ expect(response).to be_success
end
it "doesn't send email" do
- Workers::ResetPassword.should_not_receive(:perform_async)
+ expect(Workers::ResetPassword).not_to receive(:perform_async)
post :create, "user" => {"email" => "foo@example.com"}
end
end
context "when there is a user with that email" do
it "redirects to the login page" do
post :create, "user" => {"email" => alice.email}
- response.should redirect_to(new_user_session_path)
+ expect(response).to redirect_to(new_user_session_path)
end
it "sends email (enqueued to Sidekiq)" do
- Workers::ResetPassword.should_receive(:perform_async).with(alice.id)
+ expect(Workers::ResetPassword).to receive(:perform_async).with(alice.id)
post :create, "user" => {"email" => alice.email}
end
end
diff --git a/spec/controllers/people_controller_spec.rb b/spec/controllers/people_controller_spec.rb
index 881c198d8..74610562e 100644
--- a/spec/controllers/people_controller_spec.rb
+++ b/spec/controllers/people_controller_spec.rb
@@ -4,7 +4,7 @@
require 'spec_helper'
-describe PeopleController do
+describe PeopleController, :type => :controller do
before do
@user = alice
@aspect = @user.aspects.first
@@ -22,17 +22,17 @@ describe PeopleController do
describe 'via json' do
it 'succeeds' do
get :index, :q => "Korth", :format => 'json'
- response.should be_success
+ expect(response).to be_success
end
it 'responds with json' do
get :index, :q => "Korth", :format => 'json'
- response.body.should == [@korth].to_json
+ expect(response.body).to eq([@korth].to_json)
end
it 'does not assign hashes' do
get :index, :q => "Korth", :format => 'json'
- assigns[:hashes].should be_nil
+ expect(assigns[:hashes]).to be_nil
end
end
@@ -45,34 +45,34 @@ describe PeopleController do
end
it 'finds people even if they have searchable off' do
get :index, :q => "eugene@example.org"
- assigns[:people][0].id.should == @unsearchable_eugene.id
+ expect(assigns[:people][0].id).to eq(@unsearchable_eugene.id)
end
it 'downcases the query term' do
get :index, :q => "Eugene@Example.ORG"
- assigns[:people][0].id.should == @unsearchable_eugene.id
+ expect(assigns[:people][0].id).to eq(@unsearchable_eugene.id)
end
it 'does not the background query task if the user is found' do
get :index, :q => "Eugene@Example.ORG"
- assigns[:background_query].should == nil
+ expect(assigns[:background_query]).to eq(nil)
end
it 'sets background query task if the user is not found' do
get :index, :q => "Eugene@Example1.ORG"
- assigns[:background_query].should == "eugene@example1.org"
+ expect(assigns[:background_query]).to eq("eugene@example1.org")
end
end
context 'query is not a tag or a diaspora ID' do
it 'assigns hashes' do
get :index, :q => "Korth"
- assigns[:hashes].should_not be_nil
+ expect(assigns[:hashes]).not_to be_nil
end
it 'does not set the background query task' do
get :index, :q => "Korth"
- assigns[:background_query].should_not be_present
+ expect(assigns[:background_query]).not_to be_present
end
it "assigns people" do
@@ -80,29 +80,29 @@ describe PeopleController do
:profile => FactoryGirl.build(:profile, :first_name => "Eugene",
:last_name => "w"))
get :index, :q => "Eug"
- assigns[:people].map { |x| x.id }.should =~ [@eugene.id, eugene2.id]
+ expect(assigns[:people].map { |x| x.id }).to match_array([@eugene.id, eugene2.id])
end
it "succeeds if there is exactly one match" do
get :index, :q => "Korth"
- assigns[:people].length.should == 1
- response.should be_success
+ expect(assigns[:people].length).to eq(1)
+ expect(response).to be_success
end
it "succeeds if there are no matches" do
get :index, :q => "Korthsauce"
- assigns[:people].length.should == 0
- response.should be_success
+ expect(assigns[:people].length).to eq(0)
+ expect(response).to be_success
end
it 'succeeds if you search for the empty term' do
get :index, :q => ''
- response.should be_success
+ expect(response).to be_success
end
it 'succeeds if you search for punctuation' do
get :index, :q => '+'
- response.should be_success
+ expect(response).to be_success
end
it "excludes people who have searchable off" do
@@ -110,7 +110,7 @@ describe PeopleController do
:profile => FactoryGirl.build(:profile, :first_name => "Eugene",
:last_name => "w", :searchable => false))
get :index, :q => "Eug"
- assigns[:people].should_not =~ [eugene2]
+ expect(assigns[:people]).not_to match_array([eugene2])
end
end
end
@@ -118,16 +118,16 @@ describe PeopleController do
describe '#tag_index' do
it 'works for js' do
- get :tag_index, :name => 'jellybeans', :format => :js
- response.should be_success
+ xhr :get, :tag_index, :name => 'jellybeans', :format => :js
+ expect(response).to be_success
end
it 'returns awesome people who have that tag' do
f = FactoryGirl.create(:person)
f.profile.tag_string = "#seeded"
f.profile.save
- get :tag_index, :name => 'seeded', :format => :js
- assigns[:people].count.should == 1
+ xhr :get, :tag_index, :name => 'seeded', :format => :js
+ expect(assigns[:people].count).to eq(1)
end
end
@@ -152,33 +152,48 @@ describe PeopleController do
end
it 'takes time' do
- Benchmark.realtime {
+ expect(Benchmark.realtime {
get :show, :id => @user.person.to_param
- }.should < 1.0
+ }).to be < 1.0
end
end
describe '#show' do
it "404s if the id is invalid" do
get :show, :id => 'delicious'
- response.code.should == "404"
+ expect(response.code).to eq("404")
end
it "404s if no person is found via id" do
get :show, :id => "3d920397846"
- response.code.should == "404"
+ expect(response.code).to eq("404")
end
it "404s if no person is found via username" do
get :show, :username => 'delicious'
- response.code.should == "404"
+ expect(response.code).to eq("404")
+ end
+
+ it 'finds a person via username' do
+ get :show, username: @user.username
+ expect(assigns(:person)).to eq(@user.person)
+ end
+
+ it "404s if no person is found via diaspora handle" do
+ get :show, :username => 'delicious@pod.net'
+ expect(response.code).to eq("404")
+ end
+
+ it 'finds a person via diaspora handle' do
+ get :show, username: @user.diaspora_handle
+ expect(assigns(:person)).to eq(@user.person)
end
it 'redirects home for closed account' do
@person = FactoryGirl.create(:person, :closed_account => true)
get :show, :id => @person.to_param
- response.should be_redirect
- flash[:notice].should_not be_blank
+ expect(response).to be_redirect
+ expect(flash[:notice]).not_to be_blank
end
it 'does not allow xss attacks' do
@@ -186,52 +201,49 @@ describe PeopleController do
profile = user2.profile
profile.update_attribute(:first_name, "</script><script> alert('xss attack');</script>")
get :show, :id => user2.person.to_param
- response.should be_success
- response.body.should_not include(profile.first_name)
+ expect(response).to be_success
+ expect(response.body).not_to include(profile.first_name)
end
it "doesn't leak photos in the sidebar" do
private_photo = @user.post(:photo, user_file: uploaded_photo, to: @aspect.id, public: false)
public_photo = @user.post(:photo, user_file: uploaded_photo, to: @aspect.id, public: true)
+ allow(@user.person).to receive(:remote?) { false }
sign_out :user
get :show, id: @user.person.to_param
- assigns(:photos).should_not include private_photo
- assigns(:photos).should include public_photo
+ expect(response).to be_success
+ expect(assigns(:photos)).not_to include private_photo
+ expect(assigns(:photos)).to include public_photo
+ end
+
+ it "displays the correct number of photos" do
+ 16.times do |i|
+ eve.post(:photo, :user_file => uploaded_photo, :to => eve.aspects.first.id, :public => true)
+ end
+ get :show, :id => eve.person.to_param
+ expect(response.body).to include '"photos":{"count":16}'
+
+ eve.post(:photo, :user_file => uploaded_photo, :to => eve.aspects.first.id, :public => false)
+ get :show, :id => eve.person.to_param
+ expect(response.body).to include '"photos":{"count":16}' # eve is not sharing with alice
end
context "when the person is the current user" do
it "succeeds" do
get :show, :id => @user.person.to_param
- response.should be_success
+ expect(response).to be_success
end
it 'succeeds on the mobile site' do
get :show, :id => @user.person.to_param, :format => :mobile
- response.should be_success
+ expect(response).to be_success
end
it "assigns the right person" do
get :show, :id => @user.person.to_param
- assigns(:person).should == @user.person
- end
-
- it "assigns all the user's posts" do
- @user.posts.should be_empty
- @user.post(:status_message, :text => "to one aspect", :to => @aspect.id)
- @user.post(:status_message, :text => "to all aspects", :to => 'all')
- @user.post(:status_message, :text => "public", :to => 'all', :public => true)
- @user.reload.posts.length.should == 3
- get :show, :id => @user.person.to_param
- assigns(:stream).posts.map(&:id).should =~ @user.posts.map(&:id)
- end
-
- it "renders the comments on the user's posts" do
- message = @user.post :status_message, :text => 'test more', :to => @aspect.id
- @user.comment!(message, 'I mean it')
- get :show, :id => @user.person.to_param
- response.should be_success
+ expect(assigns(:person)).to eq(@user.person)
end
end
@@ -243,48 +255,20 @@ describe PeopleController do
it "succeeds" do
get :show, :id => @person.to_param
- response.status.should == 200
+ expect(response.status).to eq(200)
end
it 'succeeds on the mobile site' do
get :show, :id => @person.to_param, :format => :mobile
- response.should be_success
- end
-
- context 'with posts' do
- before do
- @public_posts = []
- @public_posts << bob.post(:status_message, :text => "first public ", :to => bob.aspects[0].id, :public => true)
- bob.post(:status_message, :text => "to an aspect @user is not in", :to => bob.aspects[1].id)
- bob.post(:status_message, :text => "to all aspects", :to => 'all')
- @public_posts << bob.post(:status_message, :text => "public", :to => 'all', :public => true)
- @public_posts.first.created_at -= 1000
- @public_posts.first.save
- end
-
- it "posts include reshares" do
- reshare = @user.post(:reshare, :public => true, :root_guid => FactoryGirl.create(:status_message, :public => true).guid, :to => alice.aspects)
- get :show, :id => @user.person.to_param
- assigns[:stream].posts.map { |x| x.id }.should include(reshare.id)
- end
-
- it "assigns only public posts" do
- get :show, :id => @person.to_param
- assigns[:stream].posts.map(&:id).should =~ @public_posts.map(&:id)
- end
-
- it 'is sorted by created_at desc' do
- get :show, :id => @person.to_param
- assigns[:stream].stream_posts.should == @public_posts.sort_by { |p| p.created_at }.reverse
- end
+ expect(response).to be_success
end
it 'forces to sign in if the person is remote' do
p = FactoryGirl.create(:person)
get :show, :id => p.to_param
- response.should be_redirect
- response.should redirect_to new_user_session_path
+ expect(response).to be_redirect
+ expect(response).to redirect_to new_user_session_path
end
end
@@ -295,33 +279,12 @@ describe PeopleController do
it "succeeds" do
get :show, :id => @person.to_param
- response.should be_success
+ expect(response).to be_success
end
it 'succeeds on the mobile site' do
get :show, :id => @person.to_param, :format => :mobile
- response.should be_success
- end
-
- it "assigns only the posts the current user can see" do
- bob.posts.should be_empty
- posts_user_can_see = []
- aspect_user_is_in = bob.aspects.where(:name => "generic").first
- aspect_user_is_not_in = bob.aspects.where(:name => "empty").first
- posts_user_can_see << bob.post(:status_message, :text => "to an aspect @user is in", :to => aspect_user_is_in.id)
- bob.post(:status_message, :text => "to an aspect @user is not in", :to => aspect_user_is_not_in.id)
- posts_user_can_see << bob.post(:status_message, :text => "to all aspects", :to => 'all')
- posts_user_can_see << bob.post(:status_message, :text => "public", :to => 'all', :public => true)
- bob.reload.posts.length.should == 4
-
- get :show, :id => @person.to_param
- assigns(:stream).posts.map(&:id).should =~ posts_user_can_see.map(&:id)
- end
-
- it "posts include reshares" do
- reshare = @user.post(:reshare, :public => true, :root_guid => FactoryGirl.create(:status_message, :public => true).guid, :to => alice.aspects)
- get :show, :id => @user.person.to_param
- assigns[:stream].posts.map { |x| x.id }.should include(reshare.id)
+ expect(response).to be_success
end
it 'marks a corresponding notifications as read' do
@@ -341,29 +304,125 @@ describe PeopleController do
it "succeeds" do
get :show, :id => @person.to_param
- response.should be_success
+ expect(response).to be_success
end
it 'succeeds on the mobile site' do
get :show, :id => @person.to_param, :format => :mobile
- response.should be_success
+ expect(response).to be_success
+ end
+ end
+ end
+
+ describe '#stream' do
+ it "redirects non-json requests" do
+ get :stream, person_id: @user.person.to_param
+ expect(response).to be_redirect
+ end
+
+ context "person is current user" do
+ it "assigns all the user's posts" do
+ expect(@user.posts).to be_empty
+ @user.post(:status_message, :text => "to one aspect", :to => @aspect.id)
+ @user.post(:status_message, :text => "to all aspects", :to => 'all')
+ @user.post(:status_message, :text => "public", :to => 'all', :public => true)
+ expect(@user.reload.posts.length).to eq(3)
+ get :stream, person_id: @user.person.to_param, format: :json
+ expect(assigns(:stream).posts.map(&:id)).to match_array(@user.posts.map(&:id))
+ end
+
+ it "renders the comments on the user's posts" do
+ cmmt = 'I mean it'
+ message = @user.post :status_message, :text => 'test more', :to => @aspect.id
+ @user.comment!(message, cmmt)
+ get :stream, person_id: @user.person.to_param, format: :json
+ expect(response).to be_success
+ expect(response.body).to include(cmmt)
+ end
+ end
+
+ context "person is contact of current user" do
+ before do
+ @person = bob.person
+ end
+
+ it "includes reshares" do
+ reshare = @user.post(:reshare, :public => true, :root_guid => FactoryGirl.create(:status_message, :public => true).guid, :to => alice.aspect_ids)
+ get :stream, person_id: @user.person.to_param, format: :json
+ expect(assigns[:stream].posts.map { |x| x.id }).to include(reshare.id)
+ end
+
+ it "assigns only the posts the current user can see" do
+ expect(bob.posts).to be_empty
+ posts_user_can_see = []
+ aspect_user_is_in = bob.aspects.where(:name => "generic").first
+ aspect_user_is_not_in = bob.aspects.where(:name => "empty").first
+ posts_user_can_see << bob.post(:status_message, :text => "to an aspect @user is in", :to => aspect_user_is_in.id)
+ bob.post(:status_message, :text => "to an aspect @user is not in", :to => aspect_user_is_not_in.id)
+ posts_user_can_see << bob.post(:status_message, :text => "to all aspects", :to => 'all')
+ posts_user_can_see << bob.post(:status_message, :text => "public", :to => 'all', :public => true)
+ expect(bob.reload.posts.length).to eq(4)
+
+ get :stream, person_id: @person.to_param, format: :json
+ expect(assigns(:stream).posts.map(&:id)).to match_array(posts_user_can_see.map(&:id))
+ end
+ end
+
+ context "person is not contact of current user" do
+ before do
+ @person = eve.person
end
it "assigns only public posts" do
- eve.posts.should be_empty
+ expect(eve.posts).to be_empty
eve.post(:status_message, :text => "to an aspect @user is not in", :to => eve.aspects.first.id)
eve.post(:status_message, :text => "to all aspects", :to => 'all')
public_post = eve.post(:status_message, :text => "public", :to => 'all', :public => true)
- eve.reload.posts.length.should == 3
+ expect(eve.reload.posts.length).to eq(3)
- get :show, :id => @person.to_param
- assigns[:stream].posts.map(&:id).should =~ [public_post].map(&:id)
+ get :stream, person_id: @person.to_param, format: :json
+ expect(assigns[:stream].posts.map(&:id)).to match_array([public_post].map(&:id))
end
it "posts include reshares" do
- reshare = @user.post(:reshare, :public => true, :root_guid => FactoryGirl.create(:status_message, :public => true).guid, :to => alice.aspects)
- get :show, :id => @user.person.to_param
- assigns[:stream].posts.map { |x| x.id }.should include(reshare.id)
+ reshare = @user.post(:reshare, :public => true, :root_guid => FactoryGirl.create(:status_message, :public => true).guid, :to => alice.aspect_ids)
+ get :stream, person_id: @user.person.to_param, format: :json
+ expect(assigns[:stream].posts.map { |x| x.id }).to include(reshare.id)
+ end
+ end
+
+ context "logged out" do
+ before do
+ sign_out :user
+ @person = bob.person
+ end
+
+ context 'with posts' do
+ before do
+ @public_posts = []
+ @public_posts << bob.post(:status_message, :text => "first public ", :to => bob.aspects[0].id, :public => true)
+ bob.post(:status_message, :text => "to an aspect @user is not in", :to => bob.aspects[1].id)
+ bob.post(:status_message, :text => "to all aspects", :to => 'all')
+ @public_posts << bob.post(:status_message, :text => "public", :to => 'all', :public => true)
+ @public_posts.first.created_at -= 1000
+ @public_posts.first.save
+ end
+
+ it "posts include reshares" do
+ reshare = @user.post(:reshare, :public => true, :root_guid => FactoryGirl.create(:status_message, :public => true).guid, :to => alice.aspect_ids)
+ get :stream, person_id: @user.person.to_param, format: :json
+ expect(assigns[:stream].posts.map { |x| x.id }).to include(reshare.id)
+ end
+
+ it "assigns only public posts" do
+ get :stream, person_id: @person.to_param, format: :json
+ expect(assigns[:stream].posts.map(&:id)).to match_array(@public_posts.map(&:id))
+ end
+
+ it 'is sorted by created_at desc' do
+ get :stream, person_id: @person.to_param, format: :json
+ expect(assigns[:stream].stream_posts).to eq(@public_posts.sort_by { |p| p.created_at }.reverse)
+ end
end
end
end
@@ -377,12 +436,12 @@ describe PeopleController do
it 'redirects html requests' do
get :hovercard, :person_id => @hover_test.guid
- response.should redirect_to person_path(:id => @hover_test.guid)
+ expect(response).to redirect_to person_path(:id => @hover_test.guid)
end
it 'returns json with profile stuff' do
get :hovercard, :person_id => @hover_test.guid, :format => 'json'
- JSON.parse( response.body )['handle'].should == @hover_test.diaspora_handle
+ expect(JSON.parse( response.body )['handle']).to eq(@hover_test.diaspora_handle)
end
end
@@ -397,16 +456,16 @@ describe PeopleController do
describe 'via json' do
it 'returns a zero count when a search fails' do
get :refresh_search, :q => "weweweKorth", :format => 'json'
- response.body.should == {:search_count=>0, :search_html=>""}.to_json
+ expect(response.body).to eq({:search_count=>0, :search_html=>""}.to_json)
end
it 'returns with a zero count unless a fully composed name is sent' do
get :refresh_search, :q => "Korth"
- response.body.should == {:search_count=>0, :search_html=>""}.to_json
+ expect(response.body).to eq({:search_count=>0, :search_html=>""}.to_json)
end
it 'returns with a found name' do
get :refresh_search, :q => @korth.diaspora_handle
- JSON.parse( response.body )["search_count"].should == 1
+ expect(JSON.parse( response.body )["search_count"]).to eq(1)
end
end
end
@@ -417,48 +476,60 @@ describe PeopleController do
contact = alice.contact_for(bob.person)
contacts = contact.contacts
get :contacts, :person_id => bob.person.to_param
- assigns(:contacts_of_contact).should =~ contacts
- response.should be_success
+ expect(assigns(:contacts_of_contact).to_a).to eq(contacts.to_a)
+ expect(response).to be_success
end
it 'shows an error when invalid person id' do
get :contacts, :person_id => 'foo'
- flash[:error].should be_present
- response.should redirect_to people_path
+ expect(flash[:error]).to be_present
+ expect(response).to redirect_to people_path
+ end
+
+ it "displays the correct number of photos" do
+ 16.times do |i|
+ eve.post(:photo, :user_file => uploaded_photo, :to => eve.aspects.first.id, :public => true)
+ end
+ get :contacts, :person_id => eve.person.to_param
+ expect(response.body).to include '"photos":{"count":16}'
+
+ eve.post(:photo, :user_file => uploaded_photo, :to => eve.aspects.first.id, :public => false)
+ get :contacts, :person_id => eve.person.to_param
+ expect(response.body).to include '"photos":{"count":16}' # eve is not sharing with alice
end
end
describe '#diaspora_id?' do
it 'returns true for pods on urls' do
- @controller.send(:diaspora_id?, "ilya_123@pod.geraspora.de").should be_true
+ expect(@controller.send(:diaspora_id?, "ilya_123@pod.geraspora.de")).to be true
end
it 'returns true for pods on urls with port' do
- @controller.send(:diaspora_id?, "ilya_123@pod.geraspora.de:12314").should be_true
+ expect(@controller.send(:diaspora_id?, "ilya_123@pod.geraspora.de:12314")).to be true
end
it 'returns true for pods on localhost' do
- @controller.send(:diaspora_id?, "ilya_123@localhost").should be_true
+ expect(@controller.send(:diaspora_id?, "ilya_123@localhost")).to be true
end
it 'returns true for pods on localhost and port' do
- @controller.send(:diaspora_id?, "ilya_123@localhost:1234").should be_true
+ expect(@controller.send(:diaspora_id?, "ilya_123@localhost:1234")).to be true
end
it 'returns true for pods on ip' do
- @controller.send(:diaspora_id?, "ilya_123@1.1.1.1").should be_true
+ expect(@controller.send(:diaspora_id?, "ilya_123@1.1.1.1")).to be true
end
it 'returns true for pods on ip and port' do
- @controller.send(:diaspora_id?, "ilya_123@1.2.3.4:1234").should be_true
+ expect(@controller.send(:diaspora_id?, "ilya_123@1.2.3.4:1234")).to be true
end
it 'returns false for pods on with invalid url characters' do
- @controller.send(:diaspora_id?, "ilya_123@join_diaspora.com").should be_false
+ expect(@controller.send(:diaspora_id?, "ilya_123@join_diaspora.com")).to be false
end
it 'returns false for invalid usernames' do
- @controller.send(:diaspora_id?, "ilya_2%3@joindiaspora.com").should be_false
+ expect(@controller.send(:diaspora_id?, "ilya_2%3@joindiaspora.com")).to be false
end
end
end
diff --git a/spec/controllers/photos_controller_spec.rb b/spec/controllers/photos_controller_spec.rb
index 40d02acc3..8efdfe769 100644
--- a/spec/controllers/photos_controller_spec.rb
+++ b/spec/controllers/photos_controller_spec.rb
@@ -4,7 +4,7 @@
require 'spec_helper'
-describe PhotosController do
+describe PhotosController, :type => :controller do
before do
@alices_photo = alice.post(:photo, :user_file => uploaded_photo, :to => alice.aspects.first.id, :public => false)
@bobs_photo = bob.post(:photo, :user_file => uploaded_photo, :to => bob.aspects.first.id, :public => true)
@@ -25,53 +25,53 @@ describe PhotosController do
end
it 'accepts a photo from a regular form submission' do
- lambda {
+ expect {
post :create, @params
- }.should change(Photo, :count).by(1)
+ }.to change(Photo, :count).by(1)
end
it 'returns application/json when possible' do
request.env['HTTP_ACCEPT'] = 'application/json'
- post(:create, @params).headers['Content-Type'].should match 'application/json.*'
+ expect(post(:create, @params).headers['Content-Type']).to match 'application/json.*'
end
it 'returns text/html by default' do
request.env['HTTP_ACCEPT'] = 'text/html,*/*'
- post(:create, @params).headers['Content-Type'].should match 'text/html.*'
+ expect(post(:create, @params).headers['Content-Type']).to match 'text/html.*'
end
end
describe '#create' do
before do
- @controller.stub(:file_handler).and_return(uploaded_photo)
+ allow(@controller).to receive(:file_handler).and_return(uploaded_photo)
@params = {:photo => {:user_file => uploaded_photo, :aspect_ids => "all"} }
end
it "creates a photo" do
- lambda {
+ expect {
post :create, @params
- }.should change(Photo, :count).by(1)
+ }.to change(Photo, :count).by(1)
end
it "doesn't allow mass assignment of person" do
new_user = FactoryGirl.create(:user)
@params[:photo][:author] = new_user
post :create, @params
- Photo.last.author.should == alice.person
+ expect(Photo.last.author).to eq(alice.person)
end
it "doesn't allow mass assignment of person_id" do
new_user = FactoryGirl.create(:user)
@params[:photo][:author_id] = new_user.id
post :create, @params
- Photo.last.author.should == alice.person
+ expect(Photo.last.author).to eq(alice.person)
end
it 'can set the photo as the profile photo' do
old_url = alice.person.profile.image_url
@params[:photo][:set_profile_photo] = true
post :create, @params
- alice.reload.person.profile.image_url.should_not == old_url
+ expect(alice.reload.person.profile.image_url).not_to eq(old_url)
end
end
@@ -79,116 +79,127 @@ describe PhotosController do
it "succeeds without any available pictures" do
get :index, :person_id => FactoryGirl.create(:person).guid.to_s
- response.should be_success
+ expect(response).to be_success
end
it "displays the logged in user's pictures" do
get :index, :person_id => alice.person.guid.to_s
- assigns[:person].should == alice.person
- assigns[:posts].should == [@alices_photo]
+ expect(assigns[:person]).to eq(alice.person)
+ expect(assigns[:posts]).to eq([@alices_photo])
end
it "displays another person's pictures" do
get :index, :person_id => bob.person.guid.to_s
- assigns[:person].should == bob.person
- assigns[:posts].should == [@bobs_photo]
+ expect(assigns[:person]).to eq(bob.person)
+ expect(assigns[:posts]).to eq([@bobs_photo])
+ end
+
+ it "displays the correct number of photos" do
+ 16.times do |i|
+ eve.post(:photo, :user_file => uploaded_photo, :to => eve.aspects.first.id, :public => true)
+ end
+ get :index, :person_id => eve.person.to_param
+ expect(response.body).to include '"photos":{"count":16}'
+
+ eve.post(:photo, :user_file => uploaded_photo, :to => eve.aspects.first.id, :public => false)
+ get :index, :person_id => eve.person.to_param
+ expect(response.body).to include '"photos":{"count":16}' # eve is not sharing with alice
end
it "returns json when requested" do
request.env['HTTP_ACCEPT'] = 'application/json'
get :index, :person_id => alice.person.guid.to_s
- response.headers['Content-Type'].should match 'application/json.*'
- save_fixture(response.body, "photos_json")
+ expect(response.headers['Content-Type']).to match 'application/json.*'
end
-
+
it 'displays by date of creation' do
max_time = bob.photos.first.created_at - 1.day
- get :index, person_id: bob.person.guid.to_s,
+ get :index, person_id: bob.person.guid.to_s,
max_time: max_time.to_i
- assigns[:posts].should be_empty
+ expect(assigns[:posts]).to be_empty
end
end
describe '#edit' do
it "succeeds when user owns the photo" do
get :edit, :id => @alices_photo.id
- response.should be_success
+ expect(response).to be_success
end
it "redirects when the user does not own the photo" do
get :edit, :id => @bobs_photo.id
- response.should redirect_to(:action => :index, :person_id => alice.person.guid.to_s)
+ expect(response).to redirect_to(:action => :index, :person_id => alice.person.guid.to_s)
end
end
describe '#destroy' do
it 'let a user delete his message' do
delete :destroy, :id => @alices_photo.id
- Photo.find_by_id(@alices_photo.id).should be_nil
+ expect(Photo.find_by_id(@alices_photo.id)).to be_nil
end
it 'will let you delete your profile picture' do
- get :make_profile_photo, :photo_id => @alices_photo.id
+ xhr :get, :make_profile_photo, :photo_id => @alices_photo.id, :format => :js
delete :destroy, :id => @alices_photo.id
- Photo.find_by_id(@alices_photo.id).should be_nil
+ expect(Photo.find_by_id(@alices_photo.id)).to be_nil
end
it 'sends a retraction on delete' do
- @controller.stub(:current_user).and_return(alice)
- alice.should_receive(:retract).with(@alices_photo)
+ allow(@controller).to receive(:current_user).and_return(alice)
+ expect(alice).to receive(:retract).with(@alices_photo)
delete :destroy, :id => @alices_photo.id
end
it 'will not let you destroy posts visible to you' do
delete :destroy, :id => @bobs_photo.id
- Photo.find_by_id(@bobs_photo.id).should be_true
+ expect(Photo.find_by_id(@bobs_photo.id)).to be_truthy
end
it 'will not let you destroy posts you do not own' do
eves_photo = eve.post(:photo, :user_file => uploaded_photo, :to => eve.aspects.first.id, :public => true)
delete :destroy, :id => eves_photo.id
- Photo.find_by_id(eves_photo.id).should be_true
+ expect(Photo.find_by_id(eves_photo.id)).to be_truthy
end
end
describe "#update" do
it "updates the caption of a photo" do
- put :update, :id => @alices_photo.id, :photo => { :text => "now with lasers!" }
- @alices_photo.reload.text.should == "now with lasers!"
+ put :update, :id => @alices_photo.id, :photo => { :text => "now with lasers!" }, :format => :js
+ expect(@alices_photo.reload.text).to eq("now with lasers!")
end
it "doesn't allow mass assignment of person" do
new_user = FactoryGirl.create(:user)
params = { :text => "now with lasers!", :author => new_user }
- put :update, :id => @alices_photo.id, :photo => params
- @alices_photo.reload.author.should == alice.person
+ put :update, :id => @alices_photo.id, :photo => params, :format => :js
+ expect(@alices_photo.reload.author).to eq(alice.person)
end
it "doesn't allow mass assignment of person_id" do
new_user = FactoryGirl.create(:user)
params = { :text => "now with lasers!", :author_id => new_user.id }
- put :update, :id => @alices_photo.id, :photo => params
- @alices_photo.reload.author_id.should == alice.person.id
+ put :update, :id => @alices_photo.id, :photo => params, :format => :js
+ expect(@alices_photo.reload.author_id).to eq(alice.person.id)
end
it 'redirects if you do not have access to the post' do
params = { :text => "now with lasers!" }
put :update, :id => @bobs_photo.id, :photo => params
- response.should redirect_to(:action => :index, :person_id => alice.person.guid.to_s)
+ expect(response).to redirect_to(:action => :index, :person_id => alice.person.guid.to_s)
end
end
describe "#make_profile_photo" do
it 'should return a 201 on a js success' do
- get :make_profile_photo, :photo_id => @alices_photo.id, :format => 'js'
- response.code.should == "201"
+ xhr :get, :make_profile_photo, :photo_id => @alices_photo.id, :format => 'js'
+ expect(response.code).to eq("201")
end
it 'should return a 422 on failure' do
get :make_profile_photo, :photo_id => @bobs_photo.id
- response.code.should == "422"
+ expect(response.code).to eq("422")
end
end
@@ -201,7 +212,7 @@ describe PhotosController do
it 'should return 200 for existing stuff on mobile devices' do
get :show, :person_id => alice.person.guid, :id => @alices_photo.id, :format => 'mobile'
- response.should be_success
+ expect(response).to be_success
end
it "doesn't leak private photos to the public" do
diff --git a/spec/controllers/posts_controller_spec.rb b/spec/controllers/posts_controller_spec.rb
index fb1145f62..246238484 100644
--- a/spec/controllers/posts_controller_spec.rb
+++ b/spec/controllers/posts_controller_spec.rb
@@ -4,7 +4,7 @@
require 'spec_helper'
-describe PostsController do
+describe PostsController, :type => :controller do
before do
aspect = alice.aspects.first
@message = alice.build_post :status_message, :text => "ohai", :to => aspect.id
@@ -17,27 +17,38 @@ describe PostsController do
describe '#show' do
context 'user signed in' do
before do
- sign_in alice
+ sign_in :user, alice
end
it 'succeeds' do
get :show, "id" => @message.id
- response.should be_success
+ expect(response).to be_success
end
it 'succeeds on mobile' do
get :show, "id" => @message.id
- response.should be_success
+ expect(response).to be_success
+ end
+
+ it 'succeeds after removing a mention when closing the mentioned user\'s account' do
+ user = FactoryGirl.create(:user, :username => "user")
+ alice.share_with(user.person, alice.aspects.first)
+ msg = alice.build_post :status_message, text: "Mention @{User ; #{user.diaspora_handle}}", :public => true, :to => 'all'
+ msg.save!
+ expect(msg.mentioned_people.count).to eq(1)
+ user.destroy
+ get :show, "id" => msg.id
+ expect(response).to be_success
end
it 'renders the application layout on mobile' do
get :show, :id => @message.id, :format => :mobile
- response.should render_template('layouts/application')
+ expect(response).to render_template('layouts/application')
end
it 'succeeds on mobile with a reshare' do
get :show, "id" => FactoryGirl.create(:reshare, :author => alice.person).id, :format => :mobile
- response.should be_success
+ expect(response).to be_success
end
it 'marks a corresponding notifications as read' do
@@ -76,25 +87,25 @@ describe PostsController do
it 'shows a public post' do
get :show, :id => @status.id
- response.status.should == 200
+ expect(response.status).to eq(200)
end
it 'succeeds for statusnet' do
@request.env["HTTP_ACCEPT"] = "application/html+xml,text/html"
get :show, :id => @status.id
- response.should be_success
+ expect(response).to be_success
end
it 'responds with diaspora xml if format is xml' do
get :show, :id => @status.guid, :format => :xml
- response.body.should == @status.to_diaspora_xml
+ expect(response.body).to eq(@status.to_diaspora_xml)
end
end
it 'does not show a private post' do
status = alice.post(:status_message, :text => "hello", :public => false, :to => 'all')
get :show, :id => status.id
- response.status.should == 404
+ expect(response.status).to eq(404)
end
# We want to be using guids from now on for this post route, but do not want to break
@@ -107,20 +118,20 @@ describe PostsController do
it 'assumes guids less than 8 chars are ids and not guids' do
p = Post.where(:id => @status.id.to_s)
- Post.should_receive(:where)
+ expect(Post).to receive(:where)
.with(hash_including(:id => @status.id.to_s))
.and_return(p)
get :show, :id => @status.id
- response.should be_success
+ expect(response).to be_success
end
it 'assumes guids more than (or equal to) 8 chars are actually guids' do
p = Post.where(:guid => @status.guid)
- Post.should_receive(:where)
+ expect(Post).to receive(:where)
.with(hash_including(:guid => @status.guid))
.and_return(p)
get :show, :id => @status.guid
- response.should be_success
+ expect(response).to be_success
end
end
end
@@ -129,7 +140,7 @@ describe PostsController do
describe 'iframe' do
it 'contains an iframe' do
get :iframe, :id => @message.id
- response.body.should match /iframe/
+ expect(response.body).to match /iframe/
end
end
@@ -137,12 +148,12 @@ describe PostsController do
it 'works when you can see it' do
sign_in alice
get :oembed, :url => "/posts/#{@message.id}"
- response.body.should match /iframe/
+ expect(response.body).to match /iframe/
end
it 'returns a 404 response when the post is not found' do
get :oembed, :url => "/posts/#{@message.id}"
- response.status.should == 404
+ expect(response.status).to eq(404)
end
end
@@ -154,28 +165,28 @@ describe PostsController do
it 'let a user delete his message' do
message = alice.post(:status_message, :text => "hey", :to => alice.aspects.first.id)
delete :destroy, :format => :js, :id => message.id
- response.should be_success
- StatusMessage.find_by_id(message.id).should be_nil
+ expect(response).to be_success
+ expect(StatusMessage.find_by_id(message.id)).to be_nil
end
it 'sends a retraction on delete' do
- controller.stub(:current_user).and_return alice
+ allow(controller).to receive(:current_user).and_return alice
message = alice.post(:status_message, :text => "hey", :to => alice.aspects.first.id)
- alice.should_receive(:retract).with(message)
+ expect(alice).to receive(:retract).with(message)
delete :destroy, :format => :js, :id => message.id
- response.should be_success
+ expect(response).to be_success
end
it 'will not let you destroy posts visible to you' do
message = bob.post(:status_message, :text => "hey", :to => bob.aspects.first.id)
expect { delete :destroy, :format => :js, :id => message.id }.to raise_error(ActiveRecord::RecordNotFound)
- StatusMessage.exists?(message.id).should be_true
+ expect(StatusMessage.exists?(message.id)).to be true
end
it 'will not let you destory posts you do not own' do
message = eve.post(:status_message, :text => "hey", :to => eve.aspects.first.id)
expect { delete :destroy, :format => :js, :id => message.id }.to raise_error(ActiveRecord::RecordNotFound)
- StatusMessage.exists?(message.id).should be_true
+ expect(StatusMessage.exists?(message.id)).to be true
end
end
end
diff --git a/spec/controllers/profiles_controller_spec.rb b/spec/controllers/profiles_controller_spec.rb
index d136aebb9..c32878c6e 100644
--- a/spec/controllers/profiles_controller_spec.rb
+++ b/spec/controllers/profiles_controller_spec.rb
@@ -4,43 +4,43 @@
require 'spec_helper'
-describe ProfilesController do
+describe ProfilesController, :type => :controller do
before do
sign_in :user, eve
end
describe '#show' do
- let(:mock_person) {mock_model(User)}
+ let(:mock_person) { FactoryGirl.create(:user) }
let(:mock_presenter) { double(:as_json => {:rock_star => "Jamie Cai"})}
it "returns a post Presenter" do
- Person.should_receive(:find_by_guid!).with("12345").and_return(mock_person)
- PersonPresenter.should_receive(:new).with(mock_person, eve).and_return(mock_presenter)
+ expect(Person).to receive(:find_by_guid!).with("12345").and_return(mock_person)
+ expect(PersonPresenter).to receive(:new).with(mock_person, eve).and_return(mock_presenter)
get :show, :id => 12345, :format => :json
- response.body.should == {:rock_star => "Jamie Cai"}.to_json
+ expect(response.body).to eq({:rock_star => "Jamie Cai"}.to_json)
end
end
describe '#edit' do
it 'succeeds' do
get :edit
- response.should be_success
+ expect(response).to be_success
end
it 'sets the profile to the current users profile' do
get :edit
- assigns[:profile].should == eve.person.profile
+ expect(assigns[:profile]).to eq(eve.person.profile)
end
it 'sets the aspect to "person_edit" ' do
get :edit
- assigns[:aspect].should == :person_edit
+ expect(assigns[:aspect]).to eq(:person_edit)
end
it 'sets the person to the current users person' do
get :edit
- assigns[:person].should == eve.person
+ expect(assigns[:person]).to eq(eve.person)
end
end
@@ -51,22 +51,22 @@ describe ProfilesController do
:first_name => "Will",
:last_name => "Smith"
}
- flash[:notice].should_not be_blank
+ expect(flash[:notice]).not_to be_blank
end
it "sets nsfw" do
- eve.person(true).profile.nsfw.should == false
+ expect(eve.person(true).profile.nsfw).to eq(false)
put :update, :profile => { :id => eve.person.id, :nsfw => "1" }
- eve.person(true).profile.nsfw.should == true
+ expect(eve.person(true).profile.nsfw).to eq(true)
end
it "unsets nsfw" do
eve.person.profile.nsfw = true
eve.person.profile.save
- eve.person(true).profile.nsfw.should == true
+ expect(eve.person(true).profile.nsfw).to eq(true)
put :update, :profile => { :id => eve.person.id }
- eve.person(true).profile.nsfw.should == false
+ expect(eve.person(true).profile.nsfw).to eq(false)
end
it 'sets tags' do
@@ -75,7 +75,7 @@ describe ProfilesController do
:profile => {:tag_string => ''} }
put :update, params
- eve.person(true).profile.tag_list.to_set.should == ['apples', 'oranges'].to_set
+ expect(eve.person(true).profile.tag_list.to_set).to eq(['apples', 'oranges'].to_set)
end
it 'sets plaintext tags' do
@@ -84,7 +84,7 @@ describe ProfilesController do
:profile => {:tag_string => '#pears'} }
put :update, params
- eve.person(true).profile.tag_list.to_set.should == ['apples', 'oranges', 'pears'].to_set
+ expect(eve.person(true).profile.tag_list.to_set).to eq(['apples', 'oranges', 'pears'].to_set)
end
it 'sets plaintext tags without #' do
@@ -93,7 +93,7 @@ describe ProfilesController do
:profile => {:tag_string => 'bananas'} }
put :update, params
- eve.person(true).profile.tag_list.to_set.should == ['apples', 'oranges', 'bananas'].to_set
+ expect(eve.person(true).profile.tag_list.to_set).to eq(['apples', 'oranges', 'bananas'].to_set)
end
it 'sets valid birthday' do
@@ -105,9 +105,9 @@ describe ProfilesController do
:day => '28' } } }
put :update, params
- eve.person(true).profile.birthday.year.should == 2001
- eve.person(true).profile.birthday.month.should == 2
- eve.person(true).profile.birthday.day.should == 28
+ expect(eve.person(true).profile.birthday.year).to eq(2001)
+ expect(eve.person(true).profile.birthday.month).to eq(2)
+ expect(eve.person(true).profile.birthday.day).to eq(28)
end
it 'displays error for invalid birthday' do
@@ -119,7 +119,7 @@ describe ProfilesController do
:day => '31' } } }
put :update, params
- flash[:error].should_not be_blank
+ expect(flash[:error]).not_to be_blank
end
context 'with a profile photo set' do
@@ -138,7 +138,7 @@ describe ProfilesController do
image_url = eve.person.profile.image_url
put :update, @params
- Person.find(eve.person.id).profile.image_url.should == image_url
+ expect(Person.find(eve.person.id).profile.image_url).to eq(image_url)
end
end
@@ -153,12 +153,12 @@ describe ProfilesController do
person = eve.person
profile = person.profile
put :update, @profile_params
- profile.reload.person_id.should == person.id
+ expect(profile.reload.person_id).to eq(person.id)
end
it 'diaspora handle' do
put :update, @profile_params
- Person.find(eve.person.id).profile[:diaspora_handle].should_not == 'abc@a.com'
+ expect(Person.find(eve.person.id).profile[:diaspora_handle]).not_to eq('abc@a.com')
end
end
end
diff --git a/spec/controllers/publics_controller_spec.rb b/spec/controllers/publics_controller_spec.rb
index 16df77950..08415577a 100644
--- a/spec/controllers/publics_controller_spec.rb
+++ b/spec/controllers/publics_controller_spec.rb
@@ -4,7 +4,7 @@
require 'spec_helper'
-describe PublicsController do
+describe PublicsController, :type => :controller do
let(:fixture_path) { Rails.root.join('spec', 'fixtures') }
before do
@user = alice
@@ -14,8 +14,8 @@ describe PublicsController do
describe '#host_meta' do
it 'succeeds', :fixture => true do
get :host_meta
- response.should be_success
- response.body.should =~ /webfinger/
+ expect(response).to be_success
+ expect(response.body).to match(/webfinger/)
save_fixture(response.body, "host-meta", fixture_path)
end
end
@@ -23,17 +23,17 @@ describe PublicsController do
describe '#receive_public' do
it 'succeeds' do
post :receive_public, :xml => "<stuff/>"
- response.should be_success
+ expect(response).to be_success
end
it 'returns a 422 if no xml is passed' do
post :receive_public
- response.code.should == '422'
+ expect(response.code).to eq('422')
end
it 'enqueues a ReceiveUnencryptedSalmon job' do
xml = "stuff"
- Workers::ReceiveUnencryptedSalmon.should_receive(:perform_async).with(xml)
+ expect(Workers::ReceiveUnencryptedSalmon).to receive(:perform_async).with(xml)
post :receive_public, :xml => xml
end
end
@@ -43,11 +43,11 @@ describe PublicsController do
it 'succeeds' do
post :receive, "guid" => @user.person.guid.to_s, "xml" => xml
- response.should be_success
+ expect(response).to be_success
end
it 'enqueues a receive job' do
- Workers::ReceiveEncryptedSalmon.should_receive(:perform_async).with(@user.id, xml).once
+ expect(Workers::ReceiveEncryptedSalmon).to receive(:perform_async).with(@user.id, xml).once
post :receive, "guid" => @user.person.guid.to_s, "xml" => xml
end
@@ -60,90 +60,90 @@ describe PublicsController do
salmon_factory = Salmon::EncryptedSlap.create_by_user_and_activity(@user, xml2)
enc_xml = salmon_factory.xml_for(user2.person)
- Workers::ReceiveEncryptedSalmon.should_receive(:perform_async).with(@user.id, enc_xml).once
+ expect(Workers::ReceiveEncryptedSalmon).to receive(:perform_async).with(@user.id, enc_xml).once
post :receive, "guid" => @user.person.guid.to_s, "xml" => CGI::escape(enc_xml)
end
it 'returns a 422 if no xml is passed' do
post :receive, "guid" => @person.guid.to_s
- response.code.should == '422'
+ expect(response.code).to eq('422')
end
it 'returns a 404 if no user is found' do
post :receive, "guid" => @person.guid.to_s, "xml" => xml
- response.should be_not_found
+ expect(response).to be_not_found
end
it 'returns a 404 if no person is found' do
post :receive, :guid => '2398rq3948yftn', :xml => xml
- response.should be_not_found
+ expect(response).to be_not_found
end
end
describe '#hcard' do
it "succeeds", :fixture => true do
post :hcard, "guid" => @user.person.guid.to_s
- response.should be_success
+ expect(response).to be_success
save_fixture(response.body, "hcard", fixture_path)
end
it 'sets the person' do
post :hcard, "guid" => @user.person.guid.to_s
- assigns[:person].should == @user.person
+ expect(assigns[:person]).to eq(@user.person)
end
it 'does not query by user id' do
post :hcard, "guid" => 90348257609247856.to_s
- assigns[:person].should be_nil
- response.should be_not_found
+ expect(assigns[:person]).to be_nil
+ expect(response).to be_not_found
end
it 'finds nothing for closed accounts' do
@user.person.update_attributes(:closed_account => true)
get :hcard, :guid => @user.person.guid.to_s
- response.should be_not_found
+ expect(response).to be_not_found
end
end
describe '#webfinger' do
it "succeeds when the person and user exist locally", :fixture => true do
post :webfinger, 'q' => @user.person.diaspora_handle
- response.should be_success
+ expect(response).to be_success
save_fixture(response.body, "webfinger", fixture_path)
end
it "404s when the person exists remotely because it is local only" do
stub_success('me@mydiaspora.pod.com')
post :webfinger, 'q' => 'me@mydiaspora.pod.com'
- response.should be_not_found
+ expect(response).to be_not_found
end
it "404s when the person is local but doesn't have an owner" do
post :webfinger, 'q' => @person.diaspora_handle
- response.should be_not_found
+ expect(response).to be_not_found
end
it "404s when the person does not exist locally or remotely" do
stub_failure('me@mydiaspora.pod.com')
post :webfinger, 'q' => 'me@mydiaspora.pod.com'
- response.should be_not_found
+ expect(response).to be_not_found
end
it 'has the users profile href' do
get :webfinger, :q => @user.diaspora_handle
- response.body.should include "http://webfinger.net/rel/profile-page"
+ expect(response.body).to include "http://webfinger.net/rel/profile-page"
end
it 'finds nothing for closed accounts' do
@user.person.update_attributes(:closed_account => true)
get :webfinger, :q => @user.diaspora_handle
- response.should be_not_found
+ expect(response).to be_not_found
end
end
describe '#hub' do
it 'succeeds' do
get :hub
- response.should be_success
+ expect(response).to be_success
end
end
end
diff --git a/spec/controllers/registrations_controller_spec.rb b/spec/controllers/registrations_controller_spec.rb
index 94f5b27bb..32ee54b4f 100644
--- a/spec/controllers/registrations_controller_spec.rb
+++ b/spec/controllers/registrations_controller_spec.rb
@@ -4,7 +4,7 @@
require 'spec_helper'
-describe RegistrationsController do
+describe RegistrationsController, :type => :controller do
include Devise::TestHelpers
before do
@@ -16,7 +16,7 @@ describe RegistrationsController do
:password_confirmation => "password"
}
}
- Webfinger.stub_chain(:new, :fetch).and_return(FactoryGirl.create(:person))
+ allow(Webfinger).to receive_message_chain(:new, :fetch).and_return(FactoryGirl.create(:person))
end
describe '#check_registrations_open!' do
@@ -24,64 +24,60 @@ describe RegistrationsController do
AppConfig.settings.enable_registrations = false
end
- after do
- AppConfig.settings.enable_registrations = true
- end
-
it 'redirects #new to the login page' do
get :new
- flash[:error].should == I18n.t('registrations.closed')
- response.should redirect_to new_user_session_path
+ expect(flash[:error]).to eq(I18n.t('registrations.closed'))
+ expect(response).to redirect_to new_user_session_path
end
it 'redirects #create to the login page' do
post :create, @valid_params
- flash[:error].should == I18n.t('registrations.closed')
- response.should redirect_to new_user_session_path
+ expect(flash[:error]).to eq(I18n.t('registrations.closed'))
+ expect(response).to redirect_to new_user_session_path
end
it 'does not redirect if there is a valid invite token' do
i = InvitationCode.create(:user => bob)
get :new, :invite => {:token => i.token}
- response.should_not be_redirect
+ expect(response).not_to be_redirect
end
it 'does redirect if there is an invalid invite token' do
get :new, :invite => {:token => 'fssdfsd'}
- response.should be_redirect
+ expect(response).to be_redirect
end
end
describe "#create" do
render_views
-
+
context "with valid parameters" do
before do
AppConfig.settings.enable_registrations = true
user = FactoryGirl.build(:user)
- User.stub(:build).and_return(user)
+ allow(User).to receive(:build).and_return(user)
end
it "creates a user" do
- lambda {
+ expect {
get :create, @valid_params
- }.should change(User, :count).by(1)
+ }.to change(User, :count).by(1)
end
it "assigns @user" do
get :create, @valid_params
- assigns(:user).should be_true
+ expect(assigns(:user)).to be_truthy
end
it "sets the flash" do
get :create, @valid_params
- flash[:notice].should_not be_blank
+ expect(flash[:notice]).not_to be_blank
end
it "redirects to the home path" do
get :create, @valid_params
- response.should be_redirect
- response.location.should match /^#{stream_url}\??$/
+ expect(response).to be_redirect
+ expect(response.location).to match /^#{stream_url}\??$/
end
end
@@ -92,28 +88,28 @@ describe RegistrationsController do
end
it "does not create a user" do
- lambda { get :create, @invalid_params }.should_not change(User, :count)
+ expect { get :create, @invalid_params }.not_to change(User, :count)
end
it "does not create a person" do
- lambda { get :create, @invalid_params }.should_not change(Person, :count)
+ expect { get :create, @invalid_params }.not_to change(Person, :count)
end
it "assigns @user" do
get :create, @invalid_params
- assigns(:user).should_not be_nil
+ expect(assigns(:user)).not_to be_nil
end
it "sets the flash error" do
get :create, @invalid_params
- flash[:error].should_not be_blank
+ expect(flash[:error]).not_to be_blank
end
it "renders new" do
get :create, @invalid_params
expect(response).to render_template("registrations/new")
end
-
+
it "keeps invalid params in form" do
get :create, @invalid_params
expect(response.body).to match /jdoe@example.com/m
diff --git a/spec/controllers/report_controller_spec.rb b/spec/controllers/report_controller_spec.rb
index 9c48503c0..6e63902e2 100644
--- a/spec/controllers/report_controller_spec.rb
+++ b/spec/controllers/report_controller_spec.rb
@@ -4,7 +4,7 @@
require 'spec_helper'
-describe ReportController do
+describe ReportController, :type => :controller do
before do
sign_in alice
@message = alice.post(:status_message, :text => "hey", :to => alice.aspects.first.id)
@@ -15,7 +15,7 @@ describe ReportController do
context 'admin not signed in' do
it 'is behind redirect_unless_admin' do
get :index
- response.should redirect_to stream_path
+ expect(response).to redirect_to stream_path
end
end
@@ -25,7 +25,7 @@ describe ReportController do
end
it 'succeeds and renders index' do
get :index
- response.should render_template('index')
+ expect(response).to render_template('index')
end
end
end
@@ -39,15 +39,15 @@ describe ReportController do
context 'report offensive post' do
it 'succeeds' do
put :create, :report => { :item_id => @message.id, :item_type => 'post', :text => 'offensive content' }
- response.status.should == 200
- Report.exists?(:item_id => @message.id, :item_type => 'post').should be_true
+ expect(response.status).to eq(200)
+ expect(Report.exists?(:item_id => @message.id, :item_type => 'post')).to be true
end
end
context 'report offensive comment' do
it 'succeeds' do
put :create, :report => { :item_id => @comment.id, :item_type => 'comment', :text => 'offensive content' }
- response.status.should == 200
- Report.exists?(:item_id => @comment.id, :item_type => 'comment').should be_true
+ expect(response.status).to eq(200)
+ expect(Report.exists?(:item_id => @comment.id, :item_type => 'comment')).to be true
end
end
end
@@ -56,15 +56,15 @@ describe ReportController do
context 'mark post report as user' do
it 'is behind redirect_unless_admin' do
put :update, :id => @message.id, :type => 'post'
- response.should redirect_to stream_path
- Report.where(:reviewed => false, :item_id => @message.id, :item_type => 'post').should be_true
+ expect(response).to redirect_to stream_path
+ expect(Report.where(:reviewed => false, :item_id => @message.id, :item_type => 'post')).to be_truthy
end
end
context 'mark comment report as user' do
it 'is behind redirect_unless_admin' do
put :update, :id => @comment.id, :type => 'comment'
- response.should redirect_to stream_path
- Report.where(:reviewed => false, :item_id => @comment.id, :item_type => 'comment').should be_true
+ expect(response).to redirect_to stream_path
+ expect(Report.where(:reviewed => false, :item_id => @comment.id, :item_type => 'comment')).to be_truthy
end
end
@@ -74,8 +74,8 @@ describe ReportController do
end
it 'succeeds' do
put :update, :id => @message.id, :type => 'post'
- response.status.should == 302
- Report.where(:reviewed => true, :item_id => @message.id, :item_type => 'post').should be_true
+ expect(response.status).to eq(302)
+ expect(Report.where(:reviewed => true, :item_id => @message.id, :item_type => 'post')).to be_truthy
end
end
context 'mark comment report as admin' do
@@ -84,8 +84,8 @@ describe ReportController do
end
it 'succeeds' do
put :update, :id => @comment.id, :type => 'comment'
- response.status.should == 302
- Report.where(:reviewed => true, :item_id => @comment.id, :item_type => 'comment').should be_true
+ expect(response.status).to eq(302)
+ expect(Report.where(:reviewed => true, :item_id => @comment.id, :item_type => 'comment')).to be_truthy
end
end
end
@@ -94,15 +94,15 @@ describe ReportController do
context 'destroy post as user' do
it 'is behind redirect_unless_admin' do
delete :destroy, :id => @message.id, :type => 'post'
- response.should redirect_to stream_path
- Report.where(:reviewed => false, :item_id => @message.id, :item_type => 'post').should be_true
+ expect(response).to redirect_to stream_path
+ expect(Report.where(:reviewed => false, :item_id => @message.id, :item_type => 'post')).to be_truthy
end
end
context 'destroy comment as user' do
it 'is behind redirect_unless_admin' do
delete :destroy, :id => @comment.id, :type => 'comment'
- response.should redirect_to stream_path
- Report.where(:reviewed => false, :item_id => @comment.id, :item_type => 'comment').should be_true
+ expect(response).to redirect_to stream_path
+ expect(Report.where(:reviewed => false, :item_id => @comment.id, :item_type => 'comment')).to be_truthy
end
end
@@ -112,8 +112,8 @@ describe ReportController do
end
it 'succeeds' do
delete :destroy, :id => @message.id, :type => 'post'
- response.status.should == 302
- Report.where(:reviewed => true, :item_id => @message.id, :item_type => 'post').should be_true
+ expect(response.status).to eq(302)
+ expect(Report.where(:reviewed => true, :item_id => @message.id, :item_type => 'post')).to be_truthy
end
end
context 'destroy comment as admin' do
@@ -122,8 +122,8 @@ describe ReportController do
end
it 'succeeds' do
delete :destroy, :id => @comment.id, :type => 'comment'
- response.status.should == 302
- Report.where(:reviewed => true, :item_id => @comment.id, :item_type => 'comment').should be_true
+ expect(response.status).to eq(302)
+ expect(Report.where(:reviewed => true, :item_id => @comment.id, :item_type => 'comment')).to be_truthy
end
end
end
diff --git a/spec/controllers/reshares_controller_spec.rb b/spec/controllers/reshares_controller_spec.rb
index 180f9f6e8..8f9090784 100644
--- a/spec/controllers/reshares_controller_spec.rb
+++ b/spec/controllers/reshares_controller_spec.rb
@@ -1,6 +1,6 @@
require 'spec_helper'
-describe ResharesController do
+describe ResharesController, :type => :controller do
describe '#create' do
let(:post_request!) {
post :create, :format => :json, :root_guid => @post_guid
@@ -13,17 +13,17 @@ describe ResharesController do
it 'requires authentication' do
post_request!
- response.should_not be_success
+ expect(response).not_to be_success
end
context 'with an authenticated user' do
before do
sign_in :user, bob
- @controller.stub(:current_user).and_return(bob)
+ allow(@controller).to receive(:current_user).and_return(bob)
end
it 'succeeds' do
- response.should be_success
+ expect(response).to be_success
post_request!
end
@@ -34,12 +34,12 @@ describe ResharesController do
end
it 'after save, calls add to streams' do
- bob.should_receive(:add_to_streams)
+ expect(bob).to receive(:add_to_streams)
post_request!
end
it 'calls dispatch' do
- bob.should_receive(:dispatch_post).with(anything, hash_including(:additional_subscribers))
+ expect(bob).to receive(:dispatch_post).with(anything, hash_including(:additional_subscribers))
post_request!
end
@@ -50,8 +50,21 @@ describe ResharesController do
it 'doesn\'t allow the user to reshare the post again' do
post_request!
- response.code.should == '422'
- response.body.strip.should be_empty
+ expect(response.code).to eq('422')
+ expect(response.body.strip).to be_empty
+ end
+ end
+
+ context 'resharing another user\'s reshare' do
+ before do
+ @root = @post
+ @post = FactoryGirl.create(:reshare, :root => @root, :author => alice.person)
+ end
+
+ it 'reshares the absolute root' do
+ post_request!
+ expect(@post.reshares.count).to eq(0)
+ expect(@root.reshares.count).to eq(2)
end
end
end
diff --git a/spec/controllers/search_controller_spec.rb b/spec/controllers/search_controller_spec.rb
index e048c376d..bc07db4ae 100644
--- a/spec/controllers/search_controller_spec.rb
+++ b/spec/controllers/search_controller_spec.rb
@@ -1,6 +1,6 @@
require 'spec_helper'
-describe SearchController do
+describe SearchController, :type => :controller do
before do
@user = alice
@aspect = @user.aspects.first
@@ -13,7 +13,7 @@ describe SearchController do
:last_name => "w", :searchable => false))
it 'goes to people index page' do
get :search, :q => 'eugene'
- response.should be_redirect
+ expect(response).to be_redirect
end
end
@@ -21,19 +21,30 @@ describe SearchController do
describe 'query is a tag' do
it 'goes to a tag page' do
get :search, :q => '#cats'
- response.should redirect_to(tag_path('cats'))
+ expect(response).to redirect_to(tag_path('cats'))
end
it 'removes dots from the query' do
get :search, :q => '#cat.s'
- response.should redirect_to(tag_path('cats'))
+ expect(response).to redirect_to(tag_path('cats'))
end
it 'stay on the page if you search for the empty hash' do
get :search, :q => '#'
- flash[:error].should be_present
+ expect(flash[:error]).to be_present
end
end
+ describe '#search_query' do
+ it 'strips the term parameter' do
+ @controller.params[:term] = ' IN SPACE! '
+ expect(@controller.send(:search_query)).to eq 'IN SPACE!'
+ end
+
+ it 'strips the q parameter' do
+ @controller.params[:q] = ' IN SPACE! '
+ expect(@controller.send(:search_query)).to eq 'IN SPACE!'
+ end
+ end
end
diff --git a/spec/controllers/services_controller_spec.rb b/spec/controllers/services_controller_spec.rb
index 1fb9237a9..d7bd50e92 100644
--- a/spec/controllers/services_controller_spec.rb
+++ b/spec/controllers/services_controller_spec.rb
@@ -4,18 +4,18 @@
require 'spec_helper'
-describe ServicesController do
+describe ServicesController, :type => :controller do
let(:omniauth_auth) do
{ 'provider' => 'facebook',
'uid' => '2',
- 'info' => { 'nickname' => 'grimmin' },
+ 'info' => { 'nickname' => 'grimmin', 'image' => 'http://graph.facebook.com/2/picture' },
'credentials' => { 'token' => 'tokin', 'secret' =>"not_so_much" }}
end
let(:user) { alice }
before do
sign_in :user, user
- @controller.stub(:current_user).and_return(user)
+ allow(@controller).to receive(:current_user).and_return(user)
end
describe '#index' do
@@ -25,7 +25,7 @@ describe ServicesController do
it "displays user's connected services" do
get :index
- assigns[:services].should == user.services
+ expect(assigns[:services]).to eq(user.services)
end
end
@@ -43,22 +43,31 @@ describe ServicesController do
it 'saves the provider' do
post :create, :provider => 'facebook'
- user.reload.services.first.class.name.should == "Services::Facebook"
+ expect(user.reload.services.first.class.name).to eq("Services::Facebook")
+ end
+
+ context "when the user hasn't got a profile photo on Diaspora" do
+ before { user.person.profile.update_attribute :image_url, nil }
+
+ it "imports the profile photo from the service" do
+ expect(Workers::FetchProfilePhoto).to receive(:perform_async)
+ post :create, :provider => 'facebook'
+ end
end
context 'when service exists with the same uid' do
before { Services::Twitter.create!(uid: omniauth_auth['uid'], user_id: user.id) }
it 'doesnt create a new service' do
- expect {
+ service_count = Service.count
post :create, :provider => 'twitter'
- }.to_not change(Service, :count).by(1)
+ expect(Service.count).to eq(service_count)
end
it 'flashes an already_authorized error with the diaspora handle for the user' do
post :create, :provider => 'twitter'
- flash[:error].include?(user.profile.diaspora_handle).should be_true
- flash[:error].include?( 'already authorized' ).should be_true
+ expect(flash[:error].include?(user.profile.diaspora_handle)).to be true
+ expect(flash[:error].include?( 'already authorized' )).to be true
end
end
@@ -71,19 +80,19 @@ describe ServicesController do
let(:provider) { {'provider' => 'twitter'} }
before do
- access_token.stub_chain(:response, :header).and_return header
+ allow(access_token).to receive_message_chain(:response, :header).and_return header
request.env['omniauth.auth'] = omniauth_auth.merge!( provider).merge!( extra )
end
it 'doesnt create a new service' do
- expect {
- post :create, :provider => 'twitter'
- }.to_not change(Service, :count).by(1)
+ service_count = Service.count
+ post :create, :provider => 'twitter'
+ expect(Service.count).to eq(service_count)
end
it 'flashes an read-only access error' do
post :create, :provider => 'twitter'
- flash[:error].include?( 'Access level is read-only' ).should be_true
+ expect(flash[:error].include?( 'Access level is read-only' )).to be true
end
end
end
@@ -110,17 +119,17 @@ describe ServicesController do
end
it 'does not queue a job if the profile photo is set' do
- @controller.stub(:no_profile_image?).and_return false
+ allow(@controller).to receive(:no_profile_image?).and_return false
- Workers::FetchProfilePhoto.should_not_receive(:perform_async)
+ expect(Workers::FetchProfilePhoto).not_to receive(:perform_async)
post :create, :provider => 'twitter'
end
it 'queues a job to save user photo if the photo does not exist' do
- @controller.stub(:no_profile_image?).and_return true
+ allow(@controller).to receive(:no_profile_image?).and_return true
- Workers::FetchProfilePhoto.should_receive(:perform_async).with(user.id, anything(), "https://service.com/fallback_lowres.jpg")
+ expect(Workers::FetchProfilePhoto).to receive(:perform_async).with(user.id, anything(), "https://service.com/fallback_lowres.jpg")
post :create, :provider => 'twitter'
end
@@ -133,9 +142,9 @@ describe ServicesController do
end
it 'destroys a service selected by id' do
- lambda{
+ expect{
delete :destroy, :id => @service1.id
- }.should change(user.services, :count).by(-1)
+ }.to change(user.services, :count).by(-1)
end
end
end
diff --git a/spec/controllers/sessions_controller_spec.rb b/spec/controllers/sessions_controller_spec.rb
index 3efcb616b..fba0810f8 100644
--- a/spec/controllers/sessions_controller_spec.rb
+++ b/spec/controllers/sessions_controller_spec.rb
@@ -4,7 +4,7 @@
require 'spec_helper'
-describe SessionsController do
+describe SessionsController, :type => :controller do
include Devise::TestHelpers
let(:mock_access_token) { Object.new }
@@ -20,15 +20,15 @@ describe SessionsController do
describe "#create" do
it "redirects to /stream for a non-mobile user" do
post :create, {"user" => {"remember_me" => "0", "username" => @user.username, "password" => "evankorth"}}
- response.should be_redirect
- response.location.should match /^#{stream_url}\??$/
+ expect(response).to be_redirect
+ expect(response.location).to match /^#{stream_url}\??$/
end
it "redirects to /stream for a mobile user" do
@request.env['HTTP_USER_AGENT'] = 'Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_1 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8B117 Safari/6531.22.7'
post :create, {"user" => {"remember_me" => "0", "username" => @user.username, "password" => "evankorth"}}
- response.should be_redirect
- response.location.should match /^#{stream_url}\??$/
+ expect(response).to be_redirect
+ expect(response.location).to match /^#{stream_url}\??$/
end
end
@@ -38,13 +38,13 @@ describe SessionsController do
end
it "redirects to / for a non-mobile user" do
delete :destroy
- response.should redirect_to new_user_session_path
+ expect(response).to redirect_to new_user_session_path
end
it "redirects to / for a mobile user" do
@request.env['HTTP_USER_AGENT'] = 'Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_1 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8B117 Safari/6531.22.7'
delete :destroy
- response.should redirect_to root_path
+ expect(response).to redirect_to root_path
end
end
end
diff --git a/spec/controllers/share_visibilities_controller_spec.rb b/spec/controllers/share_visibilities_controller_spec.rb
index fce516f7b..5fe1bb11b 100644
--- a/spec/controllers/share_visibilities_controller_spec.rb
+++ b/spec/controllers/share_visibilities_controller_spec.rb
@@ -4,7 +4,7 @@
require 'spec_helper'
-describe ShareVisibilitiesController do
+describe ShareVisibilitiesController, :type => :controller do
before do
@status = alice.post(:status_message, :text => "hello", :to => alice.aspects.first)
sign_in :user, bob
@@ -14,11 +14,11 @@ describe ShareVisibilitiesController do
context "on a post you can see" do
it 'succeeds' do
put :update, :format => :js, :id => 42, :post_id => @status.id
- response.should be_success
+ expect(response).to be_success
end
it 'it calls toggle_hidden_shareable' do
- @controller.current_user.should_receive(:toggle_hidden_shareable).with(an_instance_of(Post))
+ expect(@controller.current_user).to receive(:toggle_hidden_shareable).with(an_instance_of(Post))
put :update, :format => :js, :id => 42, :post_id => @status.id
end
end
@@ -30,7 +30,7 @@ describe ShareVisibilitiesController do
@controller.params[:post_id] = id
@controller.params[:shareable_type] = 'Post'
- Post.should_receive(:where).with(hash_including(:id => id)).once.and_return(double.as_null_object)
+ 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)
end
diff --git a/spec/controllers/statistics_controller_spec.rb b/spec/controllers/statistics_controller_spec.rb
index 8fb06c122..07abf7370 100644
--- a/spec/controllers/statistics_controller_spec.rb
+++ b/spec/controllers/statistics_controller_spec.rb
@@ -2,22 +2,29 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-require 'spec_helper'
+require "spec_helper"
-describe StatisticsController do
-
- describe '#statistics' do
-
- it 'responds to format json' do
- get :statistics, :format => 'json'
- response.code.should == '200'
+describe StatisticsController, type: :controller do
+ describe "#statistics" do
+ it "responds to format json" do
+ get :statistics, format: "json"
+ expect(response.code).to eq("200")
end
-
- it 'contains json' do
- get :statistics, :format => 'json'
+
+ it "contains json" do
+ get :statistics, format: "json"
json = JSON.parse(response.body)
- json['name'].should be_present
+ expect(json["name"]).to be_present
end
- end
+ it "responds to html" do
+ get :statistics, format: "html"
+ expect(response.code).to eq("200")
+ end
+
+ it "responds to mobile" do
+ get :statistics, format: "mobile"
+ expect(response.code).to eq("200")
+ end
+ end
end
diff --git a/spec/controllers/status_messages_controller_spec.rb b/spec/controllers/status_messages_controller_spec.rb
index 7d6a4b46e..24b8787b8 100644
--- a/spec/controllers/status_messages_controller_spec.rb
+++ b/spec/controllers/status_messages_controller_spec.rb
@@ -4,56 +4,47 @@
require 'spec_helper'
-describe StatusMessagesController do
+describe StatusMessagesController, :type => :controller do
before do
@aspect1 = alice.aspects.first
request.env["HTTP_REFERER"] = ""
sign_in :user, alice
- @controller.stub(:current_user).and_return(alice)
+ allow(@controller).to receive(:current_user).and_return(alice)
alice.reload
end
describe '#bookmarklet' do
it 'succeeds' do
get :bookmarklet
- response.should be_success
+ expect(response).to be_success
end
it 'contains a complete html document' do
get :bookmarklet
doc = Nokogiri(response.body)
- doc.xpath('//head').count.should equal 1
- doc.xpath('//body').count.should equal 1
+ expect(doc.xpath('//head').count).to equal 1
+ expect(doc.xpath('//body').count).to equal 1
end
it 'accepts get params' do
get :bookmarklet, { url: 'https://www.youtube.com/watch?v=0Bmhjf0rKe8',
title: 'Surprised Kitty',
notes: 'cute kitty' }
- response.should be_success
+ expect(response).to be_success
end
end
describe '#new' do
it 'succeeds' do
get :new, :person_id => bob.person.id
- response.should be_success
+ expect(response).to be_success
end
it 'should redirect on desktop version' do
get :new
- response.should redirect_to(stream_path)
- end
-
- it 'generates a jasmine fixture', :fixture => true do
- contact = alice.contact_for(bob.person)
- aspect = alice.aspects.create(:name => 'people')
- contact.aspects << aspect
- contact.save
- get :new, :person_id => bob.person.id, :layout => true
- save_fixture(html_for("body"), "status_message_new")
+ expect(response).to redirect_to(stream_path)
end
end
@@ -68,51 +59,51 @@ describe StatusMessagesController do
it 'creates with valid html' do
post :create, status_message_hash
- response.status.should == 302
- response.should be_redirect
+ expect(response.status).to eq(302)
+ expect(response).to be_redirect
end
it 'creates with invalid html' do
post :create, status_message_hash.merge(:status_message => { :text => "0123456789" * 7000 })
- response.status.should == 302
- response.should be_redirect
+ expect(response.status).to eq(302)
+ expect(response).to be_redirect
end
it 'creates with valid json' do
post :create, status_message_hash.merge(:format => 'json')
- response.status.should == 201
+ expect(response.status).to eq(201)
end
it 'creates with invalid json' do
post :create, status_message_hash.merge(:status_message => { :text => "0123456789" * 7000 }, :format => 'json')
- response.status.should == 403
+ expect(response.status).to eq(403)
end
it 'creates with valid mobile' do
post :create, status_message_hash.merge(:format => 'mobile')
- response.status.should == 302
- response.should be_redirect
+ expect(response.status).to eq(302)
+ expect(response).to be_redirect
end
it 'creates with invalid mobile' do
post :create, status_message_hash.merge(:status_message => { :text => "0123456789" * 7000 }, :format => 'mobile')
- response.status.should == 302
- response.should be_redirect
+ expect(response.status).to eq(302)
+ expect(response).to be_redirect
end
it 'removes getting started from new users' do
- @controller.should_receive(:remove_getting_started)
+ expect(@controller).to receive(:remove_getting_started)
post :create, status_message_hash
end
it 'takes public in aspect ids' do
post :create, status_message_hash.merge(:aspect_ids => ['public'])
- response.status.should == 302
+ expect(response.status).to eq(302)
end
it 'takes all_aspects in aspect ids' do
post :create, status_message_hash.merge(:aspect_ids => ['all_aspects'])
- response.status.should == 302
+ expect(response.status).to eq(302)
end
it "dispatches the post to the specified services" do
@@ -121,7 +112,7 @@ describe StatusMessagesController do
alice.services << Services::Twitter.new
status_message_hash[:services] = ['facebook']
service_types = Service.titles(status_message_hash[:services])
- alice.should_receive(:dispatch_post).with(anything(), hash_including(:service_types => service_types))
+ expect(alice).to receive(:dispatch_post).with(anything(), hash_including(:service_types => service_types))
post :create, status_message_hash
end
@@ -129,7 +120,7 @@ describe StatusMessagesController do
s1 = Services::Facebook.new
alice.services << s1
status_message_hash[:services] = "facebook"
- alice.should_receive(:dispatch_post).with(anything(), hash_including(:service_types => ["Services::Facebook"]))
+ expect(alice).to receive(:dispatch_post).with(anything(), hash_including(:service_types => ["Services::Facebook"]))
post :create, status_message_hash
end
@@ -137,19 +128,19 @@ describe StatusMessagesController do
status_message_hash[:status_message][:author_id] = bob.person.id
post :create, status_message_hash
new_message = StatusMessage.find_by_text(status_message_hash[:status_message][:text])
- new_message.author_id.should == alice.person.id
+ expect(new_message.author_id).to eq(alice.person.id)
end
it "doesn't overwrite id" do
old_status_message = alice.post(:status_message, :text => "hello", :to => @aspect1.id)
status_message_hash[:status_message][:id] = old_status_message.id
post :create, status_message_hash
- old_status_message.reload.text.should == 'hello'
+ expect(old_status_message.reload.text).to eq('hello')
end
it 'calls dispatch post once subscribers is set' do
- alice.should_receive(:dispatch_post){|post, opts|
- post.subscribers(alice).should == [bob.person]
+ expect(alice).to receive(:dispatch_post){|post, opts|
+ expect(post.subscribers(alice)).to eq([bob.person])
}
post :create, status_message_hash
end
@@ -158,7 +149,7 @@ describe StatusMessagesController do
status_message_hash.merge!(:aspect_ids => ['public'])
status_message_hash[:status_message].merge!(:provider_display_name => "mobile")
post :create, status_message_hash
- StatusMessage.first.provider_display_name.should == 'mobile'
+ expect(StatusMessage.first.provider_display_name).to eq('mobile')
end
# disabled to fix federation
@@ -182,12 +173,12 @@ describe StatusMessagesController do
it "will post a photo without text" do
@hash.delete :text
post :create, @hash
- response.should be_redirect
+ expect(response).to be_redirect
end
it "attaches all referenced photos" do
post :create, @hash
- assigns[:status_message].photos.map(&:id).should =~ [@photo1, @photo2].map(&:id)
+ expect(assigns[:status_message].photos.map(&:id)).to match_array([@photo1, @photo2].map(&:id))
end
it "sets the pending bit of referenced photos" do
@@ -195,8 +186,8 @@ describe StatusMessagesController do
post :create, @hash
end
- @photo1.reload.pending.should be_false
- @photo2.reload.pending.should be_false
+ expect(@photo1.reload.pending).to be false
+ expect(@photo2.reload.pending).to be false
end
end
end
diff --git a/spec/controllers/streams_controller_spec.rb b/spec/controllers/streams_controller_spec.rb
index e6735f4a5..05440948f 100644
--- a/spec/controllers/streams_controller_spec.rb
+++ b/spec/controllers/streams_controller_spec.rb
@@ -4,7 +4,7 @@
require 'spec_helper'
-describe StreamsController do
+describe StreamsController, :type => :controller do
before do
sign_in alice
end
@@ -13,24 +13,24 @@ describe StreamsController do
it 'will succeed if admin' do
Role.add_admin(alice.person)
get :public
- response.should be_success
+ expect(response).to be_success
end
it 'will redirect if not' do
get :public
- response.should be_redirect
+ expect(response).to be_redirect
end
end
describe '#multi' do
it 'succeeds' do
get :multi
- response.should be_success
+ expect(response).to be_success
end
it 'succeeds on mobile' do
get :multi, :format => :mobile
- response.should be_success
+ expect(response).to be_success
end
end
@@ -45,8 +45,8 @@ describe StreamsController do
describe "a GET to #{stream_path}" do
it 'assigns a stream of the proper class' do
get stream_path
- response.should be_success
- assigns[:stream].should be_a stream_class
+ expect(response).to be_success
+ expect(assigns[:stream]).to be_a stream_class
end
end
end
diff --git a/spec/controllers/tags_controller_spec.rb b/spec/controllers/tags_controller_spec.rb
index 391cb3b8a..06ccdf6ea 100644
--- a/spec/controllers/tags_controller_spec.rb
+++ b/spec/controllers/tags_controller_spec.rb
@@ -4,7 +4,7 @@
require 'spec_helper'
-describe TagsController do
+describe TagsController, :type => :controller do
describe '#index (search)' do
before do
sign_in :user, alice
@@ -16,22 +16,22 @@ describe TagsController do
it 'responds with json' do
get :index, :q => "ra", :format => 'json'
#parse json
- response.body.should include("#rad")
+ expect(response.body).to include("#rad")
end
it 'requires at least two characters' do
get :index, :q => "c", :format => 'json'
- response.body.should_not include("#cats")
+ expect(response.body).not_to include("#cats")
end
it 'redirects the aimless to excellent parties' do
get :index
- response.should redirect_to tag_path('partytimeexcellent')
+ expect(response).to redirect_to tag_path('partytimeexcellent')
end
it 'does not allow json requestors to party' do
get :index, :format => :json
- response.status.should == 422
+ expect(response.status).to eq(422)
end
end
@@ -43,40 +43,70 @@ describe TagsController do
it 'redirect to the downcase tag uri' do
get :show, :name => 'DiasporaRocks!'
- response.should redirect_to(:action => :show, :name => 'diasporarocks!')
+ expect(response).to redirect_to(:action => :show, :name => 'diasporarocks!')
end
end
- context 'signed in' do
+ context 'with a tagged user' do
before do
- sign_in :user, alice
- end
-
- it 'assigns a Stream::Tag object with the current_user' do
- get :show, :name => 'yes'
- assigns[:stream].user.should == alice
+ bob.profile.tag_string = "#cats #diaspora #rad"
+ bob.profile.build_tags
+ bob.profile.save!
end
- it 'succeeds' do
- get :show, :name => 'hellyes'
- response.status.should == 200
+ it 'includes the tagged user' do
+ get :show, :name => 'cats'
+ expect(response.body).to include(bob.diaspora_handle)
end
end
- context "not signed in" do
- it 'assigns a Stream::Tag object with no user' do
- get :show, :name => 'yes'
- assigns[:stream].user.should be_nil
+ context 'with a tagged post' do
+ before do
+ @post = eve.post(:status_message, text: "#what #yes #hellyes #foo tagged post", public: true, to: 'all')
end
- it 'succeeds' do
- get :show, :name => 'hellyes'
- response.status.should == 200
+ context 'signed in' do
+ before do
+ sign_in :user, alice
+ end
+
+ it 'assigns a Stream::Tag object with the current_user' do
+ get :show, :name => 'yes'
+ expect(assigns[:stream].user).to eq(alice)
+ end
+
+ it 'succeeds' do
+ get :show, :name => 'hellyes'
+ expect(response.status).to eq(200)
+ end
+
+ it 'includes the tagged post' do
+ get :show, :name => 'foo'
+ expect(assigns[:stream].posts.first.text).to include("tagged post")
+ end
+
+ it 'includes comments of the tagged post' do
+ alice.comment!(@post, "comment on a tagged post")
+ get :show, :name => 'foo', :format => 'json'
+ expect(response.body).to include("comment on a tagged post")
+ end
end
- it 'succeeds with mobile' do
- get :show, :name => 'foo', :format => :mobile
- response.should be_success
+ context "not signed in" do
+ it 'assigns a Stream::Tag object with no user' do
+ get :show, :name => 'yes'
+ expect(assigns[:stream].user).to be_nil
+ end
+
+ it 'succeeds' do
+ get :show, :name => 'hellyes'
+ expect(response.status).to eq(200)
+ end
+
+ it 'succeeds with mobile' do
+ get :show, :name => 'foo', :format => :mobile
+ expect(response).to be_success
+ end
end
end
end
@@ -86,17 +116,17 @@ describe TagsController do
before do
sign_in bob
@tag = ActsAsTaggableOn::Tag.create!(:name => "partytimeexcellent")
- @controller.stub(:current_user).and_return(bob)
- @controller.stub(:params).and_return({:name => "PARTYTIMEexcellent"})
+ allow(@controller).to receive(:current_user).and_return(bob)
+ allow(@controller).to receive(:params).and_return({:name => "PARTYTIMEexcellent"})
end
it 'returns true if the following already exists and should be case insensitive' do
TagFollowing.create!(:tag => @tag, :user => bob )
- @controller.send(:tag_followed?).should be_true
+ expect(@controller.send(:tag_followed?)).to be true
end
it 'returns false if the following does not already exist' do
- @controller.send(:tag_followed?).should be_false
+ expect(@controller.send(:tag_followed?)).to be false
end
end
end
diff --git a/spec/controllers/users_controller_spec.rb b/spec/controllers/users_controller_spec.rb
index 61ac792fc..40006a3af 100644
--- a/spec/controllers/users_controller_spec.rb
+++ b/spec/controllers/users_controller_spec.rb
@@ -4,36 +4,56 @@
require 'spec_helper'
-describe UsersController do
+describe UsersController, :type => :controller do
before do
@user = alice
sign_in :user, @user
- @controller.stub(:current_user).and_return(@user)
+ allow(@controller).to receive(:current_user).and_return(@user)
end
- describe '#export' do
- it 'returns an xml file' do
- get :export
- response.header["Content-Type"].should include "application/xml"
+ describe '#export_profile' do
+ it 'queues an export job' do
+ expect(@user).to receive :queue_export
+ post :export_profile
+ expect(request.flash[:notice]).to eql(I18n.t('users.edit.export_in_progress'))
+ expect(response).to redirect_to(edit_user_path)
+ end
+ end
+
+ describe "#download_profile" do
+ it "downloads a user's export file" do
+ @user.perform_export!
+ get :download_profile
+ expect(response).to redirect_to(@user.export.url)
end
end
describe '#export_photos' do
- it 'returns a tar file' do
- get :export_photos
- response.header["Content-Type"].should include "application/octet-stream"
+ it 'queues an export photos job' do
+ expect(@user).to receive :queue_export_photos
+ post :export_photos
+ expect(request.flash[:notice]).to eql(I18n.t('users.edit.export_photos_in_progress'))
+ expect(response).to redirect_to(edit_user_path)
+ end
+ end
+
+ describe '#download_photos' do
+ it "redirects to user's photos zip file" do
+ @user.perform_export_photos!
+ get :download_photos
+ expect(response).to redirect_to(@user.exported_photos_file.url)
end
end
describe 'user_photo' do
it 'should return the url of the users profile photo' do
get :user_photo, :username => @user.username
- response.should redirect_to(@user.profile.image_url)
+ expect(response).to redirect_to(@user.profile.image_url)
end
it 'should 404 if no user is found' do
get :user_photo, :username => 'none'
- response.should_not be_success
+ expect(response).not_to be_success
end
end
@@ -41,7 +61,7 @@ describe UsersController do
it 'renders xml if atom is requested' do
sm = FactoryGirl.create(:status_message, :public => true, :author => @user.person)
get :public, :username => @user.username, :format => :atom
- response.body.should include(sm.raw_message)
+ expect(response.body).to include(sm.raw_message)
end
it 'renders xml if atom is requested with clickalbe urls' do
@@ -51,13 +71,13 @@ describe UsersController do
p.save
end
get :public, :username => @user.username, :format => :atom
- response.body.should include('a href')
+ expect(response.body).to include('a href')
end
-
+
it 'includes reshares in the atom feed' do
reshare = FactoryGirl.create(:reshare, :author => @user.person)
get :public, :username => @user.username, :format => :atom
- response.body.should include reshare.root.raw_message
+ expect(response.body).to include reshare.root.raw_message
end
it 'do not show reshares in atom feed if origin post is deleted' do
@@ -65,17 +85,17 @@ describe UsersController do
reshare = FactoryGirl.create(:reshare, :root => post, :author => @user.person)
post.delete
get :public, :username => @user.username, :format => :atom
- response.code.should == '200'
+ expect(response.code).to eq('200')
end
it 'redirects to a profile page if html is requested' do
get :public, :username => @user.username
- response.should be_redirect
+ expect(response).to be_redirect
end
it 'redirects to a profile page if mobile is requested' do
get :public, :username => @user.username, :format => :mobile
- response.should be_redirect
+ expect(response).to be_redirect
end
end
@@ -86,32 +106,36 @@ describe UsersController do
end
it "doesn't overwrite random attributes" do
- lambda {
+ expect {
put :update, @params
- }.should_not change(@user, :diaspora_handle)
+ }.not_to change(@user, :diaspora_handle)
end
- it 'redirects to the user edit page' do
+ it 'renders the user edit page' do
put :update, @params
- response.should redirect_to edit_user_path
+ expect(response).to render_template('edit')
end
it 'responds with a 204 on a js request' do
put :update, @params.merge(:format => :js)
- response.status.should == 204
+ expect(response.status).to eq(204)
end
- context 'password updates' do
- before do
- @password_params = {:current_password => 'bluepin7',
- :password => "foobaz",
- :password_confirmation => "foobaz"}
+ describe 'password updates' do
+ let(:password_params) do
+ {:current_password => 'bluepin7',
+ :password => "foobaz",
+ :password_confirmation => "foobaz"}
+ end
+
+ let(:params) do
+ {id: @user.id, user: password_params, change_password: 'Change Password'}
end
it "uses devise's update with password" do
- @user.should_receive(:update_with_password).with(hash_including(@password_params))
- @controller.stub(:current_user).and_return(@user)
- put :update, :id => @user.id, :user => @password_params
+ expect(@user).to receive(:update_with_password).with(hash_including(password_params))
+ allow(@controller).to receive(:current_user).and_return(@user)
+ put :update, params
end
end
@@ -124,7 +148,7 @@ describe UsersController do
{ :language => "fr"}
)
@user.reload
- @user.language.should_not == old_language
+ expect(@user.language).not_to eq(old_language)
end
end
@@ -133,35 +157,35 @@ describe UsersController do
@user.email = "my@newemail.com"
put(:update, :id => @user.id, :user => { :email => "my@newemail.com"})
@user.reload
- @user.unconfirmed_email.should eql(nil)
+ expect(@user.unconfirmed_email).to eql(nil)
end
it 'allow the user to change his (unconfirmed) email' do
put(:update, :id => @user.id, :user => { :email => "my@newemail.com"})
@user.reload
- @user.unconfirmed_email.should eql("my@newemail.com")
+ expect(@user.unconfirmed_email).to eql("my@newemail.com")
end
it 'informs the user about success' do
put(:update, :id => @user.id, :user => { :email => "my@newemail.com"})
- request.flash[:notice].should eql(I18n.t('users.update.unconfirmed_email_changed'))
- request.flash[:error].should be_blank
+ expect(request.flash[:notice]).to eql(I18n.t('users.update.unconfirmed_email_changed'))
+ expect(request.flash[:error]).to be_blank
end
it 'informs the user about failure' do
put(:update, :id => @user.id, :user => { :email => "my@newemailcom"})
- request.flash[:error].should eql(I18n.t('users.update.unconfirmed_email_not_changed'))
- request.flash[:notice].should be_blank
+ expect(request.flash[:error]).to eql(I18n.t('users.update.unconfirmed_email_not_changed'))
+ expect(request.flash[:notice]).to be_blank
end
it 'allow the user to change his (unconfirmed) email to blank (= abort confirmation)' do
put(:update, :id => @user.id, :user => { :email => ""})
@user.reload
- @user.unconfirmed_email.should eql(nil)
+ expect(@user.unconfirmed_email).to eql(nil)
end
it 'sends out activation email on success' do
- Workers::Mail::ConfirmEmail.should_receive(:perform_async).with(@user.id).once
+ expect(Workers::Mail::ConfirmEmail).to receive(:perform_async).with(@user.id).once
put(:update, :id => @user.id, :user => { :email => "my@newemail.com"})
end
end
@@ -169,24 +193,24 @@ describe UsersController do
describe 'email settings' do
it 'lets the user turn off mail' do
par = {:id => @user.id, :user => {:email_preferences => {'mentioned' => 'true'}}}
- proc{
+ expect{
put :update, par
- }.should change(@user.user_preferences, :count).by(1)
+ }.to change(@user.user_preferences, :count).by(1)
end
it 'lets the user get mail again' do
@user.user_preferences.create(:email_type => 'mentioned')
par = {:id => @user.id, :user => {:email_preferences => {'mentioned' => 'false'}}}
- proc{
+ expect{
put :update, par
- }.should change(@user.user_preferences, :count).by(-1)
+ }.to change(@user.user_preferences, :count).by(-1)
end
end
describe 'getting started' do
it 'can be reenabled' do
put :update, user: {getting_started: true}
- @user.reload.getting_started?.should be_true
+ expect(@user.reload.getting_started?).to be true
end
end
end
@@ -194,43 +218,55 @@ describe UsersController do
describe '#privacy_settings' do
it "returns a 200" do
get 'privacy_settings'
- response.status.should == 200
+ expect(response.status).to eq(200)
end
end
describe '#edit' do
it "returns a 200" do
get 'edit', :id => @user.id
- response.status.should == 200
+ expect(response.status).to eq(200)
+ end
+
+ it 'displays community spotlight checkbox' do
+ AppConfig.settings.community_spotlight.enable = true
+ get 'edit', :id => @user.id
+ expect(response.body).to include('input name="user[show_community_spotlight_in_stream]"')
+ end
+
+ it 'hides community spotlight checkbox' do
+ AppConfig.settings.community_spotlight = false
+ get 'edit', :id => @user.id
+ expect(response.body).not_to include('input name="user[show_community_spotlight_in_stream]"')
end
it 'set @email_pref to false when there is a user pref' do
@user.user_preferences.create(:email_type => 'mentioned')
get 'edit', :id => @user.id
- assigns[:email_prefs]['mentioned'].should be_false
+ expect(assigns[:email_prefs]['mentioned']).to be false
end
- it 'does not allow token auth' do
+ it 'does allow token auth' do
sign_out :user
bob.reset_authentication_token!
get :edit, :auth_token => bob.authentication_token
- response.should redirect_to new_user_session_path
+ expect(response.status).to eq(200)
end
end
describe '#destroy' do
it 'does nothing if the password does not match' do
- Workers::DeleteAccount.should_not_receive(:perform_async)
+ expect(Workers::DeleteAccount).not_to receive(:perform_async)
delete :destroy, :user => { :current_password => "stuff" }
end
it 'closes the account' do
- alice.should_receive(:close_account!)
+ expect(alice).to receive(:close_account!)
delete :destroy, :user => { :current_password => "bluepin7" }
end
it 'enqueues a delete job' do
- Workers::DeleteAccount.should_receive(:perform_async).with(anything)
+ expect(Workers::DeleteAccount).to receive(:perform_async).with(anything)
delete :destroy, :user => { :current_password => "bluepin7" }
end
end
@@ -242,35 +278,35 @@ describe UsersController do
it 'redirects to to the user edit page' do
get 'confirm_email', :token => @user.confirm_email_token
- response.should redirect_to edit_user_path
+ expect(response).to redirect_to edit_user_path
end
it 'confirms email' do
get 'confirm_email', :token => @user.confirm_email_token
@user.reload
- @user.email.should eql('my@newemail.com')
- request.flash[:notice].should eql(I18n.t('users.confirm_email.email_confirmed', :email => 'my@newemail.com'))
- request.flash[:error].should be_blank
+ expect(@user.email).to eql('my@newemail.com')
+ expect(request.flash[:notice]).to eql(I18n.t('users.confirm_email.email_confirmed', :email => 'my@newemail.com'))
+ expect(request.flash[:error]).to be_blank
end
it 'does NOT confirm email with wrong token' do
get 'confirm_email', :token => @user.confirm_email_token.reverse
@user.reload
- @user.email.should_not eql('my@newemail.com')
- request.flash[:error].should eql(I18n.t('users.confirm_email.email_not_confirmed'))
- request.flash[:notice].should be_blank
+ expect(@user.email).not_to eql('my@newemail.com')
+ expect(request.flash[:error]).to eql(I18n.t('users.confirm_email.email_not_confirmed'))
+ expect(request.flash[:notice]).to be_blank
end
end
describe 'getting_started' do
it 'does not fail miserably' do
get :getting_started
- response.should be_success
+ expect(response).to be_success
end
it 'does not fail miserably on mobile' do
get :getting_started, :format => :mobile
- response.should be_success
+ expect(response).to be_success
end
end
end
diff --git a/spec/factories.rb b/spec/factories.rb
index ac040e185..c7d5b18c0 100644
--- a/spec/factories.rb
+++ b/spec/factories.rb
@@ -113,6 +113,11 @@ FactoryGirl.define do
end
end
+ factory(:location) do
+ lat 1
+ lng 2
+ end
+
factory(:poll) do
sequence(:question) { |n| "What do you think about #{n} ninjas?" }
after(:build) do |p|
diff --git a/spec/fixtures/exif.jpg b/spec/fixtures/exif.jpg
new file mode 100644
index 000000000..60236d594
--- /dev/null
+++ b/spec/fixtures/exif.jpg
Binary files differ
diff --git a/spec/helpers/application_helper_spec.rb b/spec/helpers/application_helper_spec.rb
index fac5f1381..8ce0ea39c 100644
--- a/spec/helpers/application_helper_spec.rb
+++ b/spec/helpers/application_helper_spec.rb
@@ -4,7 +4,7 @@
require 'spec_helper'
-describe ApplicationHelper do
+describe ApplicationHelper, :type => :helper do
before do
@user = alice
@person = FactoryGirl.create(:person)
@@ -19,18 +19,17 @@ describe ApplicationHelper do
it 'links to community spotlight' do
@current_user = FactoryGirl.create(:user)
- contacts_link.should == community_spotlight_path
+ expect(contacts_link).to eq(community_spotlight_path)
end
it 'links to contacts#index' do
@current_user = alice
- contacts_link.should == contacts_path
+ expect(contacts_link).to eq(contacts_path)
end
end
describe "#all_services_connected?" do
before do
- @old_configured_services = AppConfig.configured_services
AppConfig.configured_services = [1, 2, 3]
def current_user
@@ -40,17 +39,17 @@ describe ApplicationHelper do
end
after do
- AppConfig.configured_services = @old_configured_services
+ AppConfig.configured_services = nil
end
it 'returns true if all networks are connected' do
3.times { |t| @current_user.services << FactoryGirl.build(:service) }
- all_services_connected?.should be_true
+ expect(all_services_connected?).to be true
end
it 'returns false if not all networks are connected' do
@current_user.services.delete_all
- all_services_connected?.should be_false
+ expect(all_services_connected?).to be false
end
end
@@ -61,11 +60,11 @@ describe ApplicationHelper do
end
it 'inclues jquery.js from jquery cdn' do
- jquery_include_tag.should match(/jquery\.com/)
+ expect(jquery_include_tag).to match(/jquery\.com/)
end
it 'falls back to asset pipeline on cdn failure' do
- jquery_include_tag.should match(/document\.write/)
+ expect(jquery_include_tag).to match(/document\.write/)
end
end
@@ -75,57 +74,49 @@ describe ApplicationHelper do
end
it 'includes jquery.js from asset pipeline' do
- jquery_include_tag.should match(/jquery\.js/)
- jquery_include_tag.should_not match(/jquery\.com/)
+ expect(jquery_include_tag).to match(/jquery\.js/)
+ expect(jquery_include_tag).not_to match(/jquery\.com/)
end
end
it 'inclues jquery_ujs.js' do
- jquery_include_tag.should match(/jquery_ujs\.js/)
+ expect(jquery_include_tag).to match(/jquery_ujs\.js/)
end
it "disables ajax caching" do
- jquery_include_tag.should match(/jQuery\.ajaxSetup/)
+ expect(jquery_include_tag).to match(/jQuery\.ajaxSetup/)
end
end
describe '#changelog_url' do
it 'defaults to master branch changleog' do
- old_revision = AppConfig.git_revision
AppConfig.git_revision = nil
- changelog_url.should == 'https://github.com/diaspora/diaspora/blob/master/Changelog.md'
- AppConfig.git_revision = old_revision
+ 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
- old_revision = AppConfig.git_revision
AppConfig.git_revision = '123'
- changelog_url.should == 'https://github.com/diaspora/diaspora/blob/123/Changelog.md'
- AppConfig.git_revision = old_revision
+ expect(changelog_url).to eq('https://github.com/diaspora/diaspora/blob/123/Changelog.md')
end
end
describe '#pod_name' do
it 'defaults to Diaspora*' do
- pod_name.should match /DIASPORA/i
+ expect(pod_name).to match /DIASPORA/i
end
it 'displays the supplied pod_name if it is set' do
- old_name = AppConfig.settings.pod_name.get
AppConfig.settings.pod_name = "Catspora"
- pod_name.should match "Catspora"
- AppConfig.settings.pod_name = old_name
+ # require 'pry'; binding.pry
+ expect(pod_name).to match "Catspora"
end
end
describe '#pod_version' do
-
it 'displays the supplied pod_version if it is set' do
- old_version = AppConfig.version.number.get
AppConfig.version.number = "0.0.1.0"
- pod_version.should match "0.0.1.0"
- AppConfig.version.number = old_version
+ expect(pod_version).to match "0.0.1.0"
end
end
end
diff --git a/spec/helpers/conversations_helper_spec.rb b/spec/helpers/conversations_helper_spec.rb
new file mode 100644
index 000000000..fafde29bf
--- /dev/null
+++ b/spec/helpers/conversations_helper_spec.rb
@@ -0,0 +1,34 @@
+require 'spec_helper'
+
+describe ConversationsHelper, :type => :helper do
+ before do
+ @conversation = FactoryGirl.create(:conversation)
+ end
+
+ describe '#conversation_class' do
+ it 'returns an empty string as default' do
+ expect(conversation_class(@conversation, 0, nil)).to eq('')
+ expect(conversation_class(@conversation, 0, @conversation.id+1)).to eq('')
+ end
+
+ it 'includes unread for unread conversations' do
+ expect(conversation_class(@conversation, 1, nil)).to include('unread')
+ expect(conversation_class(@conversation, 42, @conversation.id+1)).to include('unread')
+ expect(conversation_class(@conversation, 42, @conversation.id)).to include('unread')
+ end
+
+ it 'does not include unread for read conversations' do
+ expect(conversation_class(@conversation, 0, @conversation.id)).to_not include('unread')
+ end
+
+ it 'includes selected for selected conversations' do
+ expect(conversation_class(@conversation, 0, @conversation.id)).to include('selected')
+ expect(conversation_class(@conversation, 1, @conversation.id)).to include('selected')
+ end
+
+ it 'does not include selected for not selected conversations' do
+ expect(conversation_class(@conversation, 1, @conversation.id+1)).to_not include('selected')
+ expect(conversation_class(@conversation, 1, nil)).to_not include('selected')
+ end
+ end
+end
diff --git a/spec/helpers/getting_started_helper_spec.rb b/spec/helpers/getting_started_helper_spec.rb
index c780fc73b..fea1fcf89 100644
--- a/spec/helpers/getting_started_helper_spec.rb
+++ b/spec/helpers/getting_started_helper_spec.rb
@@ -3,7 +3,7 @@
# the COPYRIGHT file.
require 'spec_helper'
-describe GettingStartedHelper do
+describe GettingStartedHelper, :type => :helper do
before do
@current_user = alice
end
@@ -16,13 +16,13 @@ describe GettingStartedHelper do
it 'returns true if the current user has completed getting started' do
@current_user.getting_started = false
@current_user.save
- has_completed_getting_started?.should be_true
+ expect(has_completed_getting_started?).to be true
end
it 'returns false if the current user has not completed getting started' do
@current_user.getting_started = true
@current_user.save
- has_completed_getting_started?.should be_false
+ expect(has_completed_getting_started?).to be false
end
end
end
diff --git a/spec/helpers/interim_stream_hackiness_helper_spec.rb b/spec/helpers/interim_stream_hackiness_helper_spec.rb
index 2212976f4..c0cbb0ba5 100644
--- a/spec/helpers/interim_stream_hackiness_helper_spec.rb
+++ b/spec/helpers/interim_stream_hackiness_helper_spec.rb
@@ -1,6 +1,6 @@
require 'spec_helper'
-describe InterimStreamHackinessHelper do
+describe InterimStreamHackinessHelper, :type => :helper do
describe 'commenting_disabled?' do
include Devise::TestHelpers
before do
@@ -14,24 +14,24 @@ describe InterimStreamHackinessHelper do
def user_signed_in?
false
end
- commenting_disabled?(double).should == true
+ expect(commenting_disabled?(double)).to eq(true)
end
it 'returns true if @commenting_disabled is set' do
@commenting_disabled = true
- commenting_disabled?(double).should == true
+ expect(commenting_disabled?(double)).to eq(true)
@commenting_disabled = false
- commenting_disabled?(double).should == false
+ expect(commenting_disabled?(double)).to eq(false)
end
it 'returns @stream.can_comment? if @stream is set' do
post = double
@stream = double
- @stream.should_receive(:can_comment?).with(post).and_return(true)
- commenting_disabled?(post).should == false
+ expect(@stream).to receive(:can_comment?).with(post).and_return(true)
+ expect(commenting_disabled?(post)).to eq(false)
- @stream.should_receive(:can_comment?).with(post).and_return(false)
- commenting_disabled?(post).should == true
+ expect(@stream).to receive(:can_comment?).with(post).and_return(false)
+ expect(commenting_disabled?(post)).to eq(true)
end
end
end
diff --git a/spec/helpers/invitation_codes_helper_spec.rb b/spec/helpers/invitation_codes_helper_spec.rb
index c2dfae147..5ebd8b1ef 100644
--- a/spec/helpers/invitation_codes_helper_spec.rb
+++ b/spec/helpers/invitation_codes_helper_spec.rb
@@ -10,6 +10,6 @@ require 'spec_helper'
# end
# end
# end
-describe InvitationCodesHelper do
- pending "add some examples to (or delete) #{__FILE__}"
+describe InvitationCodesHelper, :type => :helper do
+ skip "add some examples to (or delete) #{__FILE__}"
end
diff --git a/spec/helpers/jsxc_helper_spec.rb b/spec/helpers/jsxc_helper_spec.rb
new file mode 100644
index 000000000..014e2f0b6
--- /dev/null
+++ b/spec/helpers/jsxc_helper_spec.rb
@@ -0,0 +1,21 @@
+require 'spec_helper'
+
+describe JsxcHelper, :type => :helper do
+ before do
+ AppConfig.chat.server.bosh.proxy = false
+ AppConfig.chat.server.bosh.port = 1234
+ AppConfig.chat.server.bosh.bind = '/bind'
+ AppConfig.environment.url = "https://localhost/"
+ end
+
+ describe "#get_bosh_endpoint" do
+ it "using http scheme and default values" do
+ expect(helper.get_bosh_endpoint).to include %Q(http://localhost:1234/bind)
+ end
+
+ it "using https scheme and no port" do
+ AppConfig.chat.server.bosh.proxy = true
+ expect(helper.get_bosh_endpoint).to include %Q(https://localhost/bind)
+ end
+ end
+end
diff --git a/spec/helpers/layout_helper_spec.rb b/spec/helpers/layout_helper_spec.rb
index 33b3ae2e1..8810e9ee3 100644
--- a/spec/helpers/layout_helper_spec.rb
+++ b/spec/helpers/layout_helper_spec.rb
@@ -4,18 +4,18 @@
require 'spec_helper'
-describe LayoutHelper do
+describe LayoutHelper, :type => :helper do
describe "#page_title" do
context "passed blank text" do
it "returns Diaspora*" do
- page_title.to_s.should == pod_name
+ expect(page_title.to_s).to eq(pod_name)
end
end
context "passed text" do
it "returns the text" do
text = "This is the title"
- page_title(text).should == text
+ expect(page_title(text)).to eq(text)
end
end
end
diff --git a/spec/helpers/mobile_helper_spec.rb b/spec/helpers/mobile_helper_spec.rb
index 18a870bdf..c506b3b3c 100644
--- a/spec/helpers/mobile_helper_spec.rb
+++ b/spec/helpers/mobile_helper_spec.rb
@@ -4,7 +4,7 @@
require 'spec_helper'
-describe MobileHelper do
+describe MobileHelper, :type => :helper do
describe "#aspect_select_options" do
it "adds an all option to the list of aspects" do
@@ -13,7 +13,7 @@ describe MobileHelper do
n = FactoryGirl.create(:aspect)
options = aspect_select_options([n], n).split('\n')
- options.first.should =~ /All/
+ expect(options.first).to match(/All/)
end
end
end \ No newline at end of file
diff --git a/spec/helpers/notifications_helper_spec.rb b/spec/helpers/notifications_helper_spec.rb
index 94817dd0a..3b9cefb1e 100644
--- a/spec/helpers/notifications_helper_spec.rb
+++ b/spec/helpers/notifications_helper_spec.rb
@@ -1,7 +1,7 @@
require 'spec_helper'
-describe NotificationsHelper do
+describe NotificationsHelper, :type => :helper do
include ApplicationHelper
before do
@@ -38,28 +38,28 @@ describe NotificationsHelper do
end
it 'with two, does not comma seperate two actors' do
- @note.stub(:actors).and_return([@max, @sarah])
- output.scan(/,/).should be_empty
- output.scan(/and/).count.should be 1
+ allow(@note).to receive(:actors).and_return([@max, @sarah])
+ expect(output.scan(/,/)).to be_empty
+ expect(output.scan(/and/).count).to be 1
end
it 'with three, comma seperates the first two, and and the last actor' do
- @note.stub(:actors).and_return([@max, @sarah, @daniel])
- output.scan(/,/).count.should be 2
- output.scan(/and/).count.should be 1
+ allow(@note).to receive(:actors).and_return([@max, @sarah, @daniel])
+ expect(output.scan(/,/).count).to be 2
+ expect(output.scan(/and/).count).to be 1
end
it 'with more than three, lists the first three, then the others tag' do
- @note.stub(:actors).and_return([@max, @sarah, @daniel, @ilya])
- output.scan(/,/).count.should be 3
- output.scan(/and/).count.should be 2
+ allow(@note).to receive(:actors).and_return([@max, @sarah, @daniel, @ilya])
+ expect(output.scan(/,/).count).to be 3
+ expect(output.scan(/and/).count).to be 2
end
end
describe 'for a like' do
it 'displays #{list of actors}' do
output = notification_people_link(@notification)
- output.should include @person2.name
- output.should include @person.name
+ expect(output).to include @person2.name
+ expect(output).to include @person.name
end
end
end
@@ -69,12 +69,12 @@ describe NotificationsHelper do
describe 'for a like' do
it 'should include a link to the post' do
output = object_link(@notification, notification_people_link(@notification))
- output.should include post_path(@post)
+ expect(output).to include post_path(@post)
end
it 'includes the boilerplate translation' do
output = object_link(@notification, notification_people_link(@notification))
- output.should include I18n.t("#{@notification.popup_translation_key}",
+ expect(output).to include I18n.t("#{@notification.popup_translation_key}",
:actors => notification_people_link(@notification),
:count => @notification.actors.count,
:post_link => link_to(post_page_title(@post), post_path(@post), 'data-ref' => @post.id, :class => 'hard_object_link').html_safe)
@@ -88,9 +88,28 @@ describe NotificationsHelper do
it 'displays that the post was deleted' do
@post.destroy
- object_link(@notification, notification_people_link(@notification)).should == t('notifications.liked_post_deleted.one', :actors => notification_people_link(@notification))
+ expect(object_link(@notification, notification_people_link(@notification))).to eq(t('notifications.liked_post_deleted.one', :actors => notification_people_link(@notification)))
end
end
end
end
+
+ describe '#display_year?' do
+ it 'returns false if year is nil and the date includes the current year' do
+ expect(display_year?(nil,Date.current.strftime('%Y-%m-%d'))).to be_falsey
+ end
+
+ it 'returns true if year is nil and the date does not include the current year' do
+ expect(display_year?(nil,'1900-12-31')).to be_truthy
+ end
+
+ it 'returns false if the date includes the given year' do
+ expect(display_year?(2015,'2015-12-31')).to be_falsey
+ end
+
+ it 'returns true if the date does not include the given year' do
+ expect(display_year?(2015,'2014-12-31')).to be_truthy
+ expect(display_year?(2015,'2016-12-31')).to be_truthy
+ end
+ end
end
diff --git a/spec/helpers/notifier_helper_spec.rb b/spec/helpers/notifier_helper_spec.rb
index 5917afbc8..a5e1dc98b 100644
--- a/spec/helpers/notifier_helper_spec.rb
+++ b/spec/helpers/notifier_helper_spec.rb
@@ -4,50 +4,46 @@
require 'spec_helper'
-describe NotifierHelper do
+describe NotifierHelper, :type => :helper do
describe '#post_message' do
before do
- # post for truncate test
- @post = FactoryGirl.create(:status_message)
- @post.text = "hi dude! "*10
- @truncated_post = "hi dude! hi dude! hi dude! hi dude! hi dude! hi dude! hi dude! hi dude! hi du..."
# post for markdown test
- @markdown_post = FactoryGirl.create(:status_message)
- @markdown_post.text = "[link](http://diasporafoundation.org) **bold text** *other text*"
+ @markdown_post = FactoryGirl.create(:status_message,
+ text: "[link](http://diasporafoundation.org) **bold text** *other text*", public: true)
@striped_markdown_post = "link (http://diasporafoundation.org) bold text other text"
+
+ @limited_post = FactoryGirl.create(:status_message, text: "This is top secret post. Shhhhhhhh!!!", public: false)
end
-
- it 'truncates in the post' do
- opts = {:length => @post.text.length - 10}
- post_message(@post, opts).should == @truncated_post
+
+ it 'strip markdown in the post' do
+ expect(post_message(@markdown_post)).to eq(@striped_markdown_post)
end
- it 'strip markdown in the post' do
- opts = {:length => @markdown_post.text.length}
- post_message(@markdown_post, opts).should == @striped_markdown_post
+ it 'hides the private content' do
+ expect(post_message(@limited_post)).not_to include("secret post")
end
end
describe '#comment_message' do
before do
- # comment for truncate test
- @comment = FactoryGirl.create(:comment)
- @comment.text = "hi dude! "*10
- @truncated_comment = "hi dude! hi dude! hi dude! hi dude! hi dude! hi dude! hi dude! hi dude! hi d..."
# comment for markdown test
@markdown_comment = FactoryGirl.create(:comment)
+ @markdown_comment.post.public = true
@markdown_comment.text = "[link](http://diasporafoundation.org) **bold text** *other text*"
@striped_markdown_comment = "link (http://diasporafoundation.org) bold text other text"
+
+ # comment for limited post
+ @limited_comment = FactoryGirl.create(:comment)
+ @limited_comment.post.public = false
+ @limited_comment.text = "This is top secret comment. Shhhhhhhh!!!"
end
-
- it 'truncates in the comment' do
- opts = {:length => @comment.text.length - 10}
- comment_message(@comment, opts).should == @truncated_comment
- end
-
+
it 'strip markdown in the comment' do
- opts = {:length => @markdown_comment.text.length}
- comment_message(@markdown_comment, opts).should == @striped_markdown_comment
+ expect(comment_message(@markdown_comment)).to eq(@striped_markdown_comment)
+ end
+
+ it 'hides the private content' do
+ expect(comment_message(@limited_comment)).not_to include("secret comment")
end
end
end
diff --git a/spec/helpers/o_embed_helper_spec.rb b/spec/helpers/o_embed_helper_spec.rb
index 3668a6783..306860ebf 100644
--- a/spec/helpers/o_embed_helper_spec.rb
+++ b/spec/helpers/o_embed_helper_spec.rb
@@ -1,6 +1,6 @@
require 'spec_helper'
-describe OEmbedHelper do
+describe OEmbedHelper, :type => :helper do
describe 'o_embed_html' do
scenarios = {
"photo" => {
@@ -112,15 +112,15 @@ describe OEmbedHelper do
formatted = o_embed_html(cache).gsub('https://', 'http://')
case type
when 'photo'
- formatted.should =~ /#{data['oembed_data']['url']}/
+ expect(formatted).to match(/#{data['oembed_data']['url']}/)
when 'unsupported'
- formatted.should =~ /#{data['link_url']}/
+ expect(formatted).to match(/#{data['link_url']}/)
when 'secure_video', 'secure_rich'
- formatted.should =~ /#{data['oembed_data']['html']}/
+ expect(formatted).to match(/#{data['oembed_data']['html']}/)
when 'unsecure_video', 'unsecure_rich'
- formatted.should_not =~ /#{data['oembed_data']['html']}/
- formatted.should =~ /#{data['oembed_data']['title']}/
- formatted.should =~ /#{data['oembed_data']['url']}/
+ expect(formatted).not_to match(/#{data['oembed_data']['html']}/)
+ expect(formatted).to match(/#{data['oembed_data']['title']}/)
+ expect(formatted).to match(/#{data['oembed_data']['url']}/)
end
end
end
diff --git a/spec/helpers/open_graph_helper_spec.rb b/spec/helpers/open_graph_helper_spec.rb
index f6b72f1fa..f2f3e6480 100644
--- a/spec/helpers/open_graph_helper_spec.rb
+++ b/spec/helpers/open_graph_helper_spec.rb
@@ -1,6 +1,21 @@
require 'spec_helper'
-describe OpenGraphHelper do
+describe OpenGraphHelper, :type => :helper do
+ describe 'og_page_post_tags' do
+ it 'handles a reshare of a deleted post' do
+ reshare = FactoryGirl.build(:reshare, root: nil, id: 123)
+
+ expect {
+ helper.og_page_post_tags(reshare)
+ }.to_not raise_error
+ end
+
+ it 'handles a normal post' do
+ post = FactoryGirl.create(:status_message)
+ expect(helper.og_page_post_tags(post)).to include helper.og_url(post_url(post))
+ end
+ end
+
describe 'og_html' do
scenarios = {
"article" => {
@@ -21,10 +36,10 @@ describe OpenGraphHelper do
formatted = og_html(cache)
- formatted.should =~ /#{data['url']}/
- formatted.should =~ /#{data['title']}/
- formatted.should =~ /#{data['image']}/
- formatted.should =~ /#{data['description']}/
+ expect(formatted).to match(/#{data['url']}/)
+ expect(formatted).to match(/#{data['title']}/)
+ expect(formatted).to match(/#{data['image']}/)
+ expect(formatted).to match(/#{data['description']}/)
end
end
end
diff --git a/spec/helpers/people_helper_spec.rb b/spec/helpers/people_helper_spec.rb
index f8ff42813..6d633097d 100644
--- a/spec/helpers/people_helper_spec.rb
+++ b/spec/helpers/people_helper_spec.rb
@@ -4,7 +4,7 @@
require 'spec_helper'
-describe PeopleHelper do
+describe PeopleHelper, :type => :helper do
before do
@user = alice
@person = FactoryGirl.create(:person)
@@ -12,13 +12,13 @@ describe PeopleHelper do
describe "#person_image_link" do
it "returns an empty string if person is nil" do
- person_image_link(nil).should == ""
+ expect(person_image_link(nil)).to eq("")
end
it "returns a link containing the person's photo" do
- person_image_link(@person).should include(@person.profile.image_url)
+ expect(person_image_link(@person)).to include(@person.profile.image_url)
end
it "returns a link to the person's profile" do
- person_image_link(@person).should include(person_path(@person))
+ expect(person_image_link(@person)).to include(person_path(@person))
end
end
@@ -26,7 +26,7 @@ describe PeopleHelper do
it "should not allow basic XSS/HTML" do
@person.profile.first_name = "I'm <h1>Evil"
@person.profile.last_name = "I'm <h1>Evil"
- person_image_tag(@person).should_not include("<h1>")
+ expect(person_image_tag(@person)).not_to include("<h1>")
end
end
@@ -36,31 +36,31 @@ describe PeopleHelper do
end
it 'includes the name of the person if they have a first name' do
- person_link(@person).should include @person.profile.first_name
+ expect(person_link(@person)).to include @person.profile.first_name
end
it 'uses diaspora handle if the person has no first or last name' do
@person.profile.first_name = nil
@person.profile.last_name = nil
- person_link(@person).should include @person.diaspora_handle
+ expect(person_link(@person)).to include @person.diaspora_handle
end
it 'uses diaspora handle if first name and first name are rails#blank?' do
@person.profile.first_name = " "
@person.profile.last_name = " "
- person_link(@person).should include @person.diaspora_handle
+ expect(person_link(@person)).to include @person.diaspora_handle
end
it "should not allow basic XSS/HTML" do
@person.profile.first_name = "I'm <h1>Evil"
@person.profile.last_name = "I'm <h1>Evil"
- person_link(@person).should_not include("<h1>")
+ expect(person_link(@person)).not_to include("<h1>")
end
it 'links by id for a local user' do
- person_link(@user.person).should include "href='#{person_path(@user.person)}'"
+ expect(person_link(@user.person)).to include "href='#{person_path(@user.person)}'"
end
end
@@ -68,13 +68,13 @@ describe PeopleHelper do
it "calls local_or_remote_person_path and passes through the options" do
opts = {:absolute => true}
- self.should_receive(:local_or_remote_person_path).with(@person, opts).exactly(1).times
+ expect(self).to receive(:local_or_remote_person_path).with(@person, opts).exactly(1).times
person_href(@person, opts)
end
it "returns a href attribute" do
- person_href(@person).should include "href="
+ expect(person_href(@person)).to include "href="
end
end
@@ -85,42 +85,20 @@ describe PeopleHelper do
it "links by id if there is a period in the user's username" do
@user.username = "invalid.username"
- @user.save(:validate => false).should == true
+ expect(@user.save(:validate => false)).to eq(true)
person = @user.person
person.diaspora_handle = "#{@user.username}@#{AppConfig.pod_uri.authority}"
person.save!
- local_or_remote_person_path(@user.person).should == person_path(@user.person)
+ expect(local_or_remote_person_path(@user.person)).to eq(person_path(@user.person))
end
it 'links by username for a local user' do
- local_or_remote_person_path(@user.person).should == user_profile_path(:username => @user.username)
+ expect(local_or_remote_person_path(@user.person)).to eq(user_profile_path(:username => @user.username))
end
it 'links by id for a remote person' do
- local_or_remote_person_path(@person).should == person_path(@person)
- end
- end
-
- describe '#sharing_message' do
- before do
- @contact = FactoryGirl.create(:contact, :person => @person)
- end
-
- context 'when the contact is sharing' do
- it 'shows the sharing message' do
- message = I18n.t('people.helper.is_sharing', :name => @person.name)
- @contact.stub(:sharing?).and_return(true)
- sharing_message(@person, @contact).should include(message)
- end
- end
-
- context 'when the contact is not sharing' do
- it 'does show the not sharing message' do
- message = I18n.t('people.helper.is_not_sharing', :name => @person.name)
- @contact.stub(:sharing?).and_return(false)
- sharing_message(@person, @contact).should include(message)
- end
+ expect(local_or_remote_person_path(@person)).to eq(person_path(@person))
end
end
end
diff --git a/spec/helpers/posts_helper_spec.rb b/spec/helpers/posts_helper_spec.rb
index 1d1d6edee..d1624f8dc 100644
--- a/spec/helpers/posts_helper_spec.rb
+++ b/spec/helpers/posts_helper_spec.rb
@@ -4,7 +4,7 @@
require 'spec_helper'
-describe PostsHelper do
+describe PostsHelper, :type => :helper do
describe '#post_page_title' do
before do
@@ -14,7 +14,7 @@ describe PostsHelper do
context 'with posts with text' do
it "delegates to message.title" do
message = double
- message.should_receive(:title)
+ expect(message).to receive(:title)
post = double(message: message)
post_page_title(post)
end
@@ -28,11 +28,11 @@ describe PostsHelper do
end
it "returns an iframe tag" do
- post_iframe_url(@post.id).should include "iframe"
+ expect(post_iframe_url(@post.id)).to include "iframe"
end
it "returns an iframe containing the post" do
- post_iframe_url(@post.id).should include "src='http://localhost:9887#{post_path(@post)}'"
+ expect(post_iframe_url(@post.id)).to include "src='http://localhost:9887#{post_path(@post)}'"
end
end
end
diff --git a/spec/helpers/report_helper_spec.rb b/spec/helpers/report_helper_spec.rb
new file mode 100644
index 000000000..8cb003c42
--- /dev/null
+++ b/spec/helpers/report_helper_spec.rb
@@ -0,0 +1,17 @@
+require 'spec_helper'
+
+describe ReportHelper, :type => :helper do
+ before do
+ @comment = FactoryGirl.create(:comment)
+ @post = @comment.post
+ end
+
+ describe "#report_content" do
+ it "contains a link to the post" do
+ expect(helper.report_content(@post, 'post')).to include %Q(href="#{post_path(@post)}")
+ end
+ it "contains an anchor to the comment" do
+ expect(helper.report_content(@comment, 'comment')).to include %Q(href="#{post_path(@post, anchor: @comment.guid)}")
+ end
+ end
+end
diff --git a/spec/helpers/stream_helper_spec.rb b/spec/helpers/stream_helper_spec.rb
index b44b54d1c..b7c39ce10 100644
--- a/spec/helpers/stream_helper_spec.rb
+++ b/spec/helpers/stream_helper_spec.rb
@@ -4,7 +4,7 @@
require 'spec_helper'
-describe StreamHelper do
+describe StreamHelper, :type => :helper do
describe "next_page_path" do
def build_controller controller_class
controller_class.new.tap {|c| c.request = controller.request }
@@ -14,29 +14,29 @@ describe StreamHelper do
end
it 'works for public page' do
- helper.stub(:controller).and_return(build_controller(PostsController))
- helper.next_page_path.should include '/public'
+ allow(helper).to receive(:controller).and_return(build_controller(PostsController))
+ expect(helper.next_page_path).to include '/public'
end
it 'works for stream page when current page is stream' do
- helper.stub(:current_page?).and_return(false)
- helper.should_receive(:current_page?).with(:stream).and_return(true)
- helper.stub(:controller).and_return(build_controller(StreamsController))
- helper.next_page_path.should include stream_path
+ allow(helper).to receive(:current_page?).and_return(false)
+ expect(helper).to receive(:current_page?).with(:stream).and_return(true)
+ allow(helper).to receive(:controller).and_return(build_controller(StreamsController))
+ expect(helper.next_page_path).to include stream_path
end
it 'works for aspects page when current page is aspects' do
- helper.stub(:current_page?).and_return(false)
- helper.should_receive(:current_page?).with(:aspects_stream).and_return(true)
- helper.stub(:controller).and_return(build_controller(StreamsController))
- helper.next_page_path.should include aspects_stream_path
+ allow(helper).to receive(:current_page?).and_return(false)
+ expect(helper).to receive(:current_page?).with(:aspects_stream).and_return(true)
+ allow(helper).to receive(:controller).and_return(build_controller(StreamsController))
+ expect(helper.next_page_path).to include aspects_stream_path
end
it 'works for activity page when current page is not stream or aspects' do
- helper.stub(:current_page?).and_return(false)
- helper.stub(:controller).and_return(build_controller(StreamsController))
+ allow(helper).to receive(:current_page?).and_return(false)
+ allow(helper).to receive(:controller).and_return(build_controller(StreamsController))
# binding.pry
- helper.next_page_path.should include activity_stream_path
+ expect(helper.next_page_path).to include activity_stream_path
end
end
end
diff --git a/spec/helpers/tags_helper_spec.rb b/spec/helpers/tags_helper_spec.rb
index f62edef90..748d591d8 100644
--- a/spec/helpers/tags_helper_spec.rb
+++ b/spec/helpers/tags_helper_spec.rb
@@ -1,20 +1,20 @@
require 'spec_helper'
-describe TagsHelper do
+describe TagsHelper, :type => :helper do
describe '#looking_for_tag_link' do
it 'returns nil if there is a @ in the query' do
- helper.stub(:search_query).and_return('foo@bar.com')
- helper.looking_for_tag_link.should be_nil
+ allow(helper).to receive(:search_query).and_return('foo@bar.com')
+ expect(helper.looking_for_tag_link).to be_nil
end
it 'returns nil if it normalizes to blank' do
- helper.stub(:search_query).and_return('++')
- helper.looking_for_tag_link.should be_nil
+ allow(helper).to receive(:search_query).and_return('++')
+ expect(helper.looking_for_tag_link).to be_nil
end
it 'returns a link to the tag otherwise' do
- helper.stub(:search_query).and_return('foo')
- helper.looking_for_tag_link.should include(helper.tag_link)
+ allow(helper).to receive(:search_query).and_return('foo')
+ expect(helper.looking_for_tag_link).to include(helper.tag_link('foo'))
end
end
end
diff --git a/spec/integration/account_deletion_spec.rb b/spec/integration/account_deletion_spec.rb
index ea578bff4..71e52786e 100644
--- a/spec/integration/account_deletion_spec.rb
+++ b/spec/integration/account_deletion_spec.rb
@@ -1,6 +1,6 @@
require 'spec_helper'
-describe 'deleteing your account' do
+describe 'deleteing your account', :type => :request do
context "user" do
before do
@bob2 = bob
@@ -23,8 +23,8 @@ describe 'deleteing your account' do
create_conversation_with_message(alice, @bob2.person, "Subject", "Hey @bob2")
#join tables
- @users_sv = ShareVisibility.where(:contact_id => @bobs_contact_ids).all
- @persons_sv = ShareVisibility.where(:contact_id => bob.person.contacts.map(&:id)).all
+ @users_sv = ShareVisibility.where(:contact_id => @bobs_contact_ids).load
+ @persons_sv = ShareVisibility.where(:contact_id => bob.person.contacts.map(&:id)).load
#user associated objects
@prefs = []
@@ -54,42 +54,42 @@ describe 'deleteing your account' do
end
it "deletes all of the user's preferences" do
- UserPreference.where(:id => @prefs.map{|pref| pref.id}).should be_empty
+ expect(UserPreference.where(:id => @prefs.map{|pref| pref.id})).to be_empty
end
it "deletes all of the user's notifications" do
- Notification.where(:id => @notifications.map{|n| n.id}).should be_empty
+ expect(Notification.where(:id => @notifications.map{|n| n.id})).to be_empty
end
it "deletes all of the users's blocked users" do
- Block.where(:id => @block.id).should be_empty
+ expect(Block.where(:id => @block.id)).to be_empty
end
it "deletes all of the user's services" do
- Service.where(:id => @services.map{|s| s.id}).should be_empty
+ expect(Service.where(:id => @services.map{|s| s.id})).to be_empty
end
it 'deletes all of @bob2s share visiblites' do
- ShareVisibility.where(:id => @users_sv.map{|sv| sv.id}).should be_empty
- ShareVisibility.where(:id => @persons_sv.map{|sv| sv.id}).should be_empty
+ expect(ShareVisibility.where(:id => @users_sv.map{|sv| sv.id})).to be_empty
+ expect(ShareVisibility.where(:id => @persons_sv.map{|sv| sv.id})).to be_empty
end
it 'deletes all of @bob2s aspect visiblites' do
- AspectVisibility.where(:id => @aspect_vis.map(&:id)).should be_empty
+ expect(AspectVisibility.where(:id => @aspect_vis.map(&:id))).to be_empty
end
it 'deletes all aspects' do
- @bob2.aspects.should be_empty
+ expect(@bob2.aspects).to be_empty
end
it 'deletes all user contacts' do
- @bob2.contacts.should be_empty
+ expect(@bob2.contacts).to be_empty
end
-
- it "clears the account fields" do
+
+ it "clears the account fields" do
@bob2.send(:clearable_fields).each do |field|
- @bob2.reload[field].should be_blank
+ expect(@bob2.reload[field]).to be_blank
end
end
@@ -99,7 +99,7 @@ describe 'deleteing your account' do
context 'remote person' do
before do
@person = remote_raphael
-
+
#contacts
@contacts = @person.contacts
diff --git a/spec/integration/attack_vectors_spec.rb b/spec/integration/attack_vectors_spec.rb
index 7e7f9f126..284823f4e 100644
--- a/spec/integration/attack_vectors_spec.rb
+++ b/spec/integration/attack_vectors_spec.rb
@@ -39,7 +39,7 @@ def expect_error(partial_message, &block)# DOES NOT REQUIRE ERROR!!
begin
yield
rescue => e
- e.message.should match partial_message
+ expect(e.message).to match partial_message
ensure
raise "no error occured where expected" unless e.present?
@@ -53,7 +53,7 @@ def bogus_retraction(&block)
end
def user_should_not_see_guid(user, guid)
- user.reload.visible_shareables(Post).where(:guid => guid).should be_blank
+ expect(user.reload.visible_shareables(Post).where(:guid => guid)).to be_blank
end
#returns the message
def legit_post_from_user1_to_user2(user1, user2)
@@ -62,7 +62,7 @@ def legit_post_from_user1_to_user2(user1, user2)
original_message
end
-describe "attack vectors" do
+describe "attack vectors", :type => :request do
let(:eves_aspect) { eve.aspects.find_by_name("generic") }
let(:alices_aspect) { alice.aspects.find_by_name("generic") }
@@ -212,7 +212,7 @@ describe "attack vectors" do
expect {
receive_post(retraction, :from => alice, :by => bob)
}.to raise_error Diaspora::AuthorXMLAuthorMismatch
- }.to_not change(bob.visible_shareables(Post), :count)
+ }.to_not change { bob.visible_shareables(Post).count(:all) }
end
diff --git a/spec/integration/contact_deleting_spec.rb b/spec/integration/contact_deleting_spec.rb
index a1c83fd72..255680d08 100644
--- a/spec/integration/contact_deleting_spec.rb
+++ b/spec/integration/contact_deleting_spec.rb
@@ -4,13 +4,13 @@
require 'spec_helper'
-describe 'disconnecting a contact' do
+describe 'disconnecting a contact', :type => :request do
it 'removes the aspect membership' do
@user = alice
@user2 = bob
- lambda{
+ expect{
@user.disconnect(@user.contact_for(@user2.person))
- }.should change(AspectMembership, :count).by(-1)
+ }.to change(AspectMembership, :count).by(-1)
end
end
diff --git a/spec/integration/dispatching_spec.rb b/spec/integration/dispatching_spec.rb
index af967a66c..83d4f0e32 100644
--- a/spec/integration/dispatching_spec.rb
+++ b/spec/integration/dispatching_spec.rb
@@ -1,6 +1,6 @@
require 'spec_helper'
-describe "Dispatching" do
+describe "Dispatching", :type => :request do
context "a comment retraction on a public post" do
it "should trigger a private dispatch" do
luke, leia, raph = set_up_friends
@@ -11,8 +11,8 @@ describe "Dispatching" do
inlined_jobs do
# Luke now retracts his comment
- Postzord::Dispatcher::Public.should_not_receive(:new)
- Postzord::Dispatcher::Private.should_receive(:new).and_return(double(:post => true))
+ expect(Postzord::Dispatcher::Public).not_to receive(:new)
+ expect(Postzord::Dispatcher::Private).to receive(:new).and_return(double(:post => true))
luke.retract(comment)
end
end
diff --git a/spec/integration/mentioning_spec.rb b/spec/integration/mentioning_spec.rb
index dac2bcc0e..d8e851660 100644
--- a/spec/integration/mentioning_spec.rb
+++ b/spec/integration/mentioning_spec.rb
@@ -3,7 +3,7 @@ require 'spec_helper'
module MentioningSpecHelpers
def default_aspect
- @user1.aspects.where(name: 'generic')
+ @user1.aspects.where(name: 'generic').first
end
def text_mentioning(user)
@@ -26,7 +26,7 @@ module MentioningSpecHelpers
end
-describe 'mentioning' do
+describe 'mentioning', :type => :request do
include MentioningSpecHelpers
before do
@@ -39,20 +39,20 @@ describe 'mentioning' do
# see: https://github.com/diaspora/diaspora/issues/4160
it 'only mentions people that are in the target aspect' do
- users_connected?(@user1, @user2).should be_true
- users_connected?(@user1, @user3).should be_false
+ expect(users_connected?(@user1, @user2)).to be true
+ expect(users_connected?(@user1, @user3)).to be false
status_msg = nil
- lambda do
+ expect do
status_msg = @user1.post(:status_message, {text: text_mentioning(@user3), to: default_aspect})
- end.should change(Post, :count).by(1)
+ end.to change(Post, :count).by(1)
- status_msg.should_not be_nil
- status_msg.public?.should be_false
- status_msg.text.should include(@user3.name)
+ expect(status_msg).not_to be_nil
+ expect(status_msg.public?).to be false
+ expect(status_msg.text).to include(@user3.name)
- notifications_about_mentioning(@user3).should be_empty
- stream_for(@user3).map { |item| item.id }.should_not include(status_msg.id)
+ expect(notifications_about_mentioning(@user3)).to be_empty
+ expect(stream_for(@user3).map { |item| item.id }).not_to include(status_msg.id)
end
end
diff --git a/spec/integration/receiving_spec.rb b/spec/integration/receiving_spec.rb
index 231d92d7c..1d31116e9 100644
--- a/spec/integration/receiving_spec.rb
+++ b/spec/integration/receiving_spec.rb
@@ -4,7 +4,7 @@
require 'spec_helper'
-describe 'a user receives a post' do
+describe 'a user receives a post', :type => :request do
def receive_with_zord(user, person, xml)
zord = Postzord::Receiver::Private.new(user, :person => person)
@@ -26,9 +26,9 @@ describe 'a user receives a post' do
bob.delete
status_message.destroy
- lambda {
+ expect {
receive_with_zord(alice, bob.person, xml)
- }.should change(Post,:count).by(1)
+ }.to change(Post,:count).by(1)
end
it 'should not create new aspects on message receive' do
@@ -38,7 +38,7 @@ describe 'a user receives a post' do
status_message = bob.post :status_message, :text => "store this #{n}!", :to => @bobs_aspect.id
end
- alice.aspects.size.should == num_aspects
+ expect(alice.aspects.size).to eq(num_aspects)
end
it "should show bob's post to alice" do
@@ -51,13 +51,13 @@ describe 'a user receives a post' do
bob.dispatch_post(sm, :to => @bobs_aspect)
end
- alice.visible_shareables(Post).count.should == 1
+ expect(alice.visible_shareables(Post).count(:all)).to eq(1)
end
context 'with mentions, ' do
it 'adds the notifications for the mentioned users regardless of the order they are received' do
- Notification.should_receive(:notify).with(alice, anything(), bob.person)
- Notification.should_receive(:notify).with(eve, anything(), bob.person)
+ expect(Notification).to receive(:notify).with(alice, anything(), bob.person)
+ expect(Notification).to receive(:notify).with(eve, anything(), bob.person)
@sm = bob.build_post(:status_message, :text => "@{#{alice.name}; #{alice.diaspora_handle}} stuff @{#{eve.name}; #{eve.diaspora_handle}}")
bob.add_to_streams(@sm, [bob.aspects.first])
@@ -74,7 +74,7 @@ describe 'a user receives a post' do
@remote_person = FactoryGirl.create(:person, :diaspora_handle => "foobar@foobar.com")
Contact.create!(:user => alice, :person => @remote_person, :aspects => [@alices_aspect])
- Notification.should_receive(:notify).with(alice, anything(), @remote_person)
+ expect(Notification).to receive(:notify).with(alice, anything(), @remote_person)
@sm = FactoryGirl.create(:status_message, :text => "hello @{#{alice.name}; #{alice.diaspora_handle}}", :diaspora_handle => @remote_person.diaspora_handle, :author => @remote_person)
@sm.save
@@ -84,7 +84,7 @@ describe 'a user receives a post' do
end
it 'does not notify the mentioned user if the mentioned user is not friends with the post author' do
- Notification.should_not_receive(:notify).with(alice, anything(), eve.person)
+ expect(Notification).not_to receive(:notify).with(alice, anything(), eve.person)
@sm = eve.build_post(:status_message, :text => "should not notify @{#{alice.name}; #{alice.diaspora_handle}}")
eve.add_to_streams(@sm, [eve.aspects.first])
@@ -103,7 +103,7 @@ describe 'a user receives a post' do
receive_with_zord(bob, alice.person, xml)
- status.reload.text.should == 'store this!'
+ expect(status.reload.text).to eq('store this!')
end
it 'updates posts marked as mutable' do
@@ -114,7 +114,7 @@ describe 'a user receives a post' do
receive_with_zord(bob, alice.person, xml)
- photo.reload.text.should match(/foo/)
+ expect(photo.reload.text).to match(/foo/)
end
end
@@ -127,7 +127,7 @@ describe 'a user receives a post' do
p.tag_string = "#big #rafi #style"
p.receive(luke, raph)
- p.tags(true).count.should == 3
+ expect(p.tags(true).count).to eq(3)
end
end
@@ -140,14 +140,14 @@ describe 'a user receives a post' do
end
it "adds a received post to the the contact" do
- alice.visible_shareables(Post).should include(@status_message)
- @contact.posts.should include(@status_message)
+ expect(alice.visible_shareables(Post)).to include(@status_message)
+ expect(@contact.posts).to include(@status_message)
end
it 'removes posts upon forceful removal' do
alice.remove_contact(@contact, :force => true)
alice.reload
- alice.visible_shareables(Post).should_not include @status_message
+ expect(alice.visible_shareables(Post)).not_to include @status_message
end
context 'dependent delete' do
@@ -156,16 +156,16 @@ describe 'a user receives a post' do
alice.contacts.create(:person => @person, :aspects => [@alices_aspect])
@post = FactoryGirl.create(:status_message, :author => @person)
- @post.share_visibilities.should be_empty
+ expect(@post.share_visibilities).to be_empty
receive_with_zord(alice, @person, @post.to_diaspora_xml)
@contact = alice.contact_for(@person)
@contact.share_visibilities.reset
- @contact.posts(true).should include(@post)
+ expect(@contact.posts(true)).to include(@post)
@post.share_visibilities.reset
- lambda {
+ expect {
alice.disconnected_by(@person)
- }.should change{@post.share_visibilities(true).count}.by(-1)
+ }.to change{@post.share_visibilities(true).count}.by(-1)
end
end
end
@@ -200,21 +200,21 @@ describe 'a user receives a post' do
end
it 'should receive a relayed comment with leading whitespace' do
- eve.reload.visible_shareables(Post).size.should == 1
+ expect(eve.reload.visible_shareables(Post).size).to eq(1)
post_in_db = StatusMessage.find(@post.id)
- post_in_db.comments.should == []
+ expect(post_in_db.comments).to eq([])
receive_with_zord(eve, alice.person, @xml_with_whitespace)
- post_in_db.comments(true).first.guid.should == @guid_with_whitespace
+ expect(post_in_db.comments(true).first.guid).to eq(@guid_with_whitespace)
end
it 'should correctly attach the user already on the pod' do
- bob.reload.visible_shareables(Post).size.should == 1
+ expect(bob.reload.visible_shareables(Post).size).to eq(1)
post_in_db = StatusMessage.find(@post.id)
- post_in_db.comments.should == []
+ expect(post_in_db.comments).to eq([])
receive_with_zord(bob, alice.person, @xml)
- post_in_db.comments(true).first.author.should == eve.person
+ expect(post_in_db.comments(true).first.author).to eq(eve.person)
end
it 'should correctly marshal a stranger for the downstream user' do
@@ -226,20 +226,18 @@ describe 'a user receives a post' do
remote_person.attributes.delete(:id) # leaving a nil id causes it to try to save with id set to NULL in postgres
m = double()
- Webfinger.should_receive(:new).twice.with(eve.person.diaspora_handle).and_return(m)
- m.should_receive(:fetch).twice.and_return{
- remote_person.save(:validate => false)
- remote_person.profile = FactoryGirl.create(:profile, :person => remote_person)
- remote_person
- }
-
- bob.reload.visible_shareables(Post).size.should == 1
+ expect(Webfinger).to receive(:new).twice.with(eve.person.diaspora_handle).and_return(m)
+ remote_person.save(:validate => false)
+ remote_person.profile = FactoryGirl.create(:profile, :person => remote_person)
+ expect(m).to receive(:fetch).twice.and_return(remote_person)
+
+ expect(bob.reload.visible_shareables(Post).size).to eq(1)
post_in_db = StatusMessage.find(@post.id)
- post_in_db.comments.should == []
+ expect(post_in_db.comments).to eq([])
receive_with_zord(bob, alice.person, @xml)
- post_in_db.comments(true).first.author.should == remote_person
+ expect(post_in_db.comments(true).first.author).to eq(remote_person)
end
end
@@ -259,7 +257,7 @@ describe 'a user receives a post' do
inlined_jobs do
@comment = bob.comment!(@post, 'tada')
@xml = @comment.to_diaspora_xml
-
+
expect {
receive_with_zord(alice, bob.person, @xml)
}.to_not raise_exception
@@ -281,8 +279,8 @@ describe 'a user receives a post' do
receive_with_zord(@local_luke, @remote_raphael, xml)
old_time = Time.now+1
receive_with_zord(@local_leia, @remote_raphael, xml)
- (Post.find_by_guid @post.guid).updated_at.should be < old_time
- (Post.find_by_guid @post.guid).created_at.should be < old_time
+ expect((Post.find_by_guid @post.guid).updated_at).to be < old_time
+ expect((Post.find_by_guid @post.guid).created_at).to be < old_time
end
it 'does not update the post if a new one is sent with a new created_at' do
@@ -292,7 +290,7 @@ describe 'a user receives a post' do
receive_with_zord(@local_luke, @remote_raphael, xml)
@post = FactoryGirl.build(:status_message, :text => 'hey', :guid => '12313123', :author => @remote_raphael, :created_at => 2.days.ago)
receive_with_zord(@local_luke, @remote_raphael, xml)
- (Post.find_by_guid @post.guid).created_at.day.should == old_time.day
+ expect((Post.find_by_guid @post.guid).created_at.day).to eq(old_time.day)
end
end
@@ -307,7 +305,7 @@ describe 'a user receives a post' do
zord = Postzord::Receiver::Private.new(bob, :salmon_xml => salmon_xml)
zord.perform!
- bob.visible_shareables(Post).include?(post).should be_true
+ expect(bob.visible_shareables(Post).include?(post)).to be true
end
end
@@ -362,15 +360,14 @@ describe 'a user receives a post' do
#Build xml for profile
xml = new_profile.to_diaspora_xml
-
#Marshal profile
zord = Postzord::Receiver::Private.new(alice, :person => person)
zord.parse_and_receive(xml)
#Check that marshaled profile is the same as old profile
person = Person.find(person.id)
- person.profile.first_name.should == new_profile.first_name
- person.profile.last_name.should == new_profile.last_name
- person.profile.image_url.should == new_profile.image_url
+ expect(person.profile.first_name).to eq(new_profile.first_name)
+ expect(person.profile.last_name).to eq(new_profile.last_name)
+ expect(person.profile.image_url).to eq(new_profile.image_url)
end
end
diff --git a/spec/integration/tag_people_spec.rb b/spec/integration/tag_people_spec.rb
index 049ef9375..9dc6db029 100644
--- a/spec/integration/tag_people_spec.rb
+++ b/spec/integration/tag_people_spec.rb
@@ -1,28 +1,28 @@
require 'spec_helper'
-describe TagsController, type: :controller do
+describe TagsController, :type => :request do
describe 'will_paginate people on the tag page' do
let(:people) { (1..2).map { FactoryGirl.create(:person) } }
let(:tag) { "diaspora" }
before do
- Stream::Tag.any_instance.stub(people_per_page: 1)
- Person.should_receive(:profile_tagged_with).with(/#{tag}/).twice.and_return(people)
+ allow_any_instance_of(Stream::Tag).to receive_messages(people_per_page: 1)
+ expect(Person).to receive(:profile_tagged_with).with(/#{tag}/).twice.and_return(people)
end
it 'paginates the people set' do
get "/tags/#{tag}"
expect(response.status).to eq(200)
- response.body.should match(/div class="pagination"/)
- response.body.should match(/href="\/tags\/#{tag}\?page=2"/)
+ expect(response.body).to match(/div class="pagination"/)
+ expect(response.body).to match(/href="\/tags\/#{tag}\?page=2"/)
end
it 'fetches the second page' do
get "/tags/#{tag}", page: 2
expect(response.status).to eq(200)
- response.body.should match(/<em class="current">2<\/em>/)
+ expect(response.body).to match(/<li class="active"><a href="\/tags\/diaspora\?page=2">2<\/a><\/li>/)
end
end
end
diff --git a/spec/javascripts/alert-spec.js b/spec/javascripts/alert-spec.js
deleted file mode 100644
index 017a51e30..000000000
--- a/spec/javascripts/alert-spec.js
+++ /dev/null
@@ -1,30 +0,0 @@
-describe("Diaspora.Alert", function() {
- beforeEach(function() {
- spec.loadFixture("aspects_index");
-
- $(document).trigger("close.facebox");
- });
-
- afterEach(function() {
- $("#facebox").remove();
-
- });
-
-
- describe("on widget ready", function() {
- it("should remove #diaspora_alert on close.facebox", function() {
- Diaspora.Alert.show("YEAH", "YEAHH");
- expect($("#diaspora_alert").length).toEqual(1);
- $(document).trigger("close.facebox");
- expect($("#diaspora_alert").length).toEqual(0);
- });
- });
-
- describe("alert", function() {
- it("should render a mustache template and append it the body", function() {
- Diaspora.Alert.show("YO", "YEAH");
- expect($("#diaspora_alert").length).toEqual(1);
- $(document).trigger("close.facebox");
- });
- });
-});
diff --git a/spec/javascripts/app/app_spec.js b/spec/javascripts/app/app_spec.js
index e5f396fd1..2840c1d31 100644
--- a/spec/javascripts/app/app_spec.js
+++ b/spec/javascripts/app/app_spec.js
@@ -6,7 +6,7 @@ describe("app", function() {
});
it("sets the user if given one and returns the current user", function() {
- expect(app.user()).toBeFalsy()
+ expect(app.user()).toBeFalsy();
app.user({name: "alice"});
expect(app.user().get("name")).toEqual("alice");
});
diff --git a/spec/javascripts/app/collections/aspects_spec.js b/spec/javascripts/app/collections/aspects_spec.js
index 280dd7592..ab89a4206 100644
--- a/spec/javascripts/app/collections/aspects_spec.js
+++ b/spec/javascripts/app/collections/aspects_spec.js
@@ -1,13 +1,17 @@
describe("app.collections.Aspects", function(){
beforeEach(function(){
- Diaspora.I18n.load({
- 'and' : "and",
- 'comma' : ",",
- 'my_aspects' : "My Aspects"
- });
- var my_aspects = [{ name: 'Work', selected: true },
- { name: 'Friends', selected: false },
- { name: 'Acquaintances', selected: false }]
+ var locale = {
+ and: 'and',
+ comma: ',',
+ my_aspects: 'My Aspects'
+ };
+ var my_aspects = [
+ { name: 'Work', selected: true },
+ { name: 'Friends', selected: false },
+ { name: 'Acquaintances', selected: false }
+ ];
+
+ Diaspora.I18n.load(locale);
this.aspects = new app.collections.Aspects(my_aspects);
});
@@ -44,25 +48,21 @@ describe("app.collections.Aspects", function(){
describe("#toSentence", function(){
describe('without aspects', function(){
beforeEach(function(){
- this.aspects = new app.collections.Aspects({ name: 'Work', selected: false })
- spyOn(this.aspects, 'selectedAspects').andCallThrough();
+ this.aspects = new app.collections.Aspects([{ name: 'Work', selected: false }]);
});
it("returns the name of the aspect", function(){
expect(this.aspects.toSentence()).toEqual('My Aspects');
- expect(this.aspects.selectedAspects).toHaveBeenCalled();
});
});
describe("with one aspect", function(){
beforeEach(function(){
- this.aspects = new app.collections.Aspects({ name: 'Work', selected: true })
- spyOn(this.aspects, 'selectedAspects').andCallThrough();
+ this.aspects = new app.collections.Aspects([{ name: 'Work', selected: true }]);
});
it("returns the name of the aspect", function(){
expect(this.aspects.toSentence()).toEqual('Work');
- expect(this.aspects.selectedAspects).toHaveBeenCalled();
});
});
diff --git a/spec/javascripts/app/collections/comments_collection_spec.js b/spec/javascripts/app/collections/comments_collection_spec.js
index 76f6498e9..0e8c3ddf5 100644
--- a/spec/javascripts/app/collections/comments_collection_spec.js
+++ b/spec/javascripts/app/collections/comments_collection_spec.js
@@ -1,10 +1,9 @@
describe("app.collections.comments", function(){
describe("url", function(){
it("should user the post id", function(){
- var post =new app.models.Post({id : 5})
- var collection = new app.collections.Comments([], {post : post})
- expect(collection.url()).toBe("/posts/5/comments")
- })
- })
-})
-
+ var post =new app.models.Post({id : 5});
+ var collection = new app.collections.Comments([], {post : post});
+ expect(collection.url()).toBe("/posts/5/comments");
+ });
+ });
+});
diff --git a/spec/javascripts/app/collections/contacts_collection_spec.js b/spec/javascripts/app/collections/contacts_collection_spec.js
new file mode 100644
index 000000000..3b64d4bd9
--- /dev/null
+++ b/spec/javascripts/app/collections/contacts_collection_spec.js
@@ -0,0 +1,37 @@
+describe("app.collections.Contacts", function(){
+ beforeEach(function(){
+ this.collection = new app.collections.Contacts();
+ });
+
+ describe("comparator", function() {
+ beforeEach(function(){
+ this.aspect = new app.models.Aspect({id: 42, name: "cats"});
+ this.con1 = new app.models.Contact({
+ person: { name: "aaa" },
+ aspect_memberships: []
+ });
+ this.con2 = new app.models.Contact({
+ person: { name: "aaa" },
+ aspect_memberships: [{id: 23, aspect: this.aspect}]
+ });
+ this.con3 = new app.models.Contact({
+ person: { name: "zzz" },
+ aspect_memberships: [{id: 23, aspect: this.aspect}]
+ });
+ });
+
+ it("should compare the username if app.aspect is not present", function() {
+ expect(this.collection.comparator(this.con1, this.con3)).toBeLessThan(0);
+ });
+
+ it("should compare the aspect memberships if app.aspect is present", function() {
+ app.aspect = this.aspect;
+ expect(this.collection.comparator(this.con1, this.con3)).toBeGreaterThan(0);
+ });
+
+ it("should compare the username if the contacts have equal aspect memberships", function() {
+ app.aspect = this.aspect;
+ expect(this.collection.comparator(this.con2, this.con3)).toBeLessThan(0);
+ });
+ });
+});
diff --git a/spec/javascripts/app/collections/likes_collections_spec.js b/spec/javascripts/app/collections/likes_collections_spec.js
index 292888403..b23f5ae7a 100644
--- a/spec/javascripts/app/collections/likes_collections_spec.js
+++ b/spec/javascripts/app/collections/likes_collections_spec.js
@@ -1,10 +1,9 @@
describe("app.collections.Likes", function(){
describe("url", function(){
it("should user the post id", function(){
- var post =new app.models.Post({id : 5})
- var collection = new app.collections.Likes([], {post : post})
- expect(collection.url).toBe("/posts/5/likes")
- })
- })
-})
-
+ var post =new app.models.Post({id : 5});
+ var collection = new app.collections.Likes([], {post : post});
+ expect(collection.url).toBe("/posts/5/likes");
+ });
+ });
+});
diff --git a/spec/javascripts/app/collections/tag_following_collection_spec.js b/spec/javascripts/app/collections/tag_following_collection_spec.js
index b3b4c646c..d776d35e6 100644
--- a/spec/javascripts/app/collections/tag_following_collection_spec.js
+++ b/spec/javascripts/app/collections/tag_following_collection_spec.js
@@ -1,21 +1,21 @@
describe("app.collections.TagFollowings", function(){
beforeEach(function(){
this.collection = new app.collections.TagFollowings();
- })
+ });
describe("comparator", function() {
it("should compare in reverse order", function() {
var a = new app.models.TagFollowing({name: "aaa"}),
- b = new app.models.TagFollowing({name: "zzz"})
- expect(this.collection.comparator(a, b)).toBeGreaterThan(0)
- })
- })
+ b = new app.models.TagFollowing({name: "zzz"});
+ expect(this.collection.comparator(a, b)).toBeGreaterThan(0);
+ });
+ });
describe("create", function(){
it("should not allow duplicates", function(){
- this.collection.create({"name":"name"})
- this.collection.create({"name":"name"})
- expect(this.collection.length).toBe(1)
- })
- })
-})
+ this.collection.create({"name":"name"});
+ this.collection.create({"name":"name"});
+ expect(this.collection.length).toBe(1);
+ });
+ });
+});
diff --git a/spec/javascripts/app/helpers/date_formatter_spec.js b/spec/javascripts/app/helpers/date_formatter_spec.js
index 9d317a108..141cdbd6e 100644
--- a/spec/javascripts/app/helpers/date_formatter_spec.js
+++ b/spec/javascripts/app/helpers/date_formatter_spec.js
@@ -3,31 +3,30 @@ describe("app.helpers.dateFormatter", function(){
beforeEach(function(){
this.statusMessage = factory.post();
this.formatter = app.helpers.dateFormatter;
- })
+ });
describe("parse", function(){
context("modern web browsers", function(){
it ("supports ISO 8601 UTC dates", function(){
var timestamp = new Date(this.statusMessage.get("created_at")).getTime();
expect(this.formatter.parse(this.statusMessage.get("created_at"))).toEqual(timestamp);
- })
- })
+ });
+ });
context("legacy web browsers", function(){
it("supports ISO 8601 UTC dates", function(){
var timestamp = new Date(this.statusMessage.get("created_at")).getTime();
expect(this.formatter.parseISO8601UTC(this.statusMessage.get("created_at"))).toEqual(timestamp);
- })
- })
+ });
+ });
context("status messages", function(){
it("uses ISO 8601 UTC dates", function(){
var iso8601_utc_pattern = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(.(\d{3}))?Z$/;
expect(iso8601_utc_pattern.test(this.statusMessage.get("created_at"))).toBe(true);
- })
- })
- })
-
-})
+ });
+ });
+ });
+});
diff --git a/spec/javascripts/app/helpers/direction_detector_spec.js b/spec/javascripts/app/helpers/direction_detector_spec.js
new file mode 100644
index 000000000..2067530d8
--- /dev/null
+++ b/spec/javascripts/app/helpers/direction_detector_spec.js
@@ -0,0 +1,34 @@
+describe("app.helpers.txtDirection", function() {
+ context("#isRTL", function() {
+ beforeEach(function() {
+ this.samples = {
+ "ثم بغزو ناجازاكي الأوروبي بال, ": "rtl", // arabic
+ "אם ברית מחליטה זכר, צ'ט לשון": "rtl", // hebrew
+ "ߊߍߌߐߎ": "rtl", // n'ko
+ "𐨙𐨜𐨪𐨭𐨢": "rtl", // Kharoshthi
+ "𐤂𐤃𐤄𐤅𐤆𐤇𐤈𐤉𐤊": "rtl", // Phoenecian
+ "ܫܠܡܐ": "rtl", //syriac
+ "ހަށް ގޮސް އުޅޭ އިރު": "rtl", // thaana
+ "ⴻⴼⴽⵄⵅⵆⵇ": "rtl", // Tifinagh
+ "ᚳᚴᚵᚶᚷᚸᚹᛅᛆᛇᛈᛉᛊᛋ": "ltr", // Runes
+ "ΘΛΞΠΣΦΨΩέαβγζλφχψϖϗ": "ltr", // Greek
+ "経担裁洋府時話家": "ltr", // Chinese
+ "Анёмал зэнтынтиаэ": "ltr", // Cyrillic
+ "उपेक्ष सोफ़्टवेर विचारशिलता": "ltr", // Hindi
+ "選そ前制数えほ長春セ名": "ltr", // Japanese
+ "ascii text": "ltr",
+ };
+ });
+
+ it("detects the right text direction", function() {
+ _.each(this.samples, function(dir, str) {
+ var result = app.helpers.txtDirection.isRTL(str);
+ if( result ) {
+ expect(dir).toEqual('rtl');
+ } else {
+ expect(dir).toEqual('ltr');
+ }
+ });
+ });
+ });
+});
diff --git a/spec/javascripts/app/helpers/text_formatter_spec.js b/spec/javascripts/app/helpers/text_formatter_spec.js
index 14d8a149c..ff9dafaf0 100644
--- a/spec/javascripts/app/helpers/text_formatter_spec.js
+++ b/spec/javascripts/app/helpers/text_formatter_spec.js
@@ -3,28 +3,92 @@ describe("app.helpers.textFormatter", function(){
beforeEach(function(){
this.statusMessage = factory.post();
this.formatter = app.helpers.textFormatter;
- })
+ });
+
+ // Some basic specs. For more detailed specs see
+ // https://github.com/svbergerem/markdown-it-hashtag/tree/master/test
+ context("hashtags", function() {
+ beforeEach(function() {
+ this.tags = [
+ "tag",
+ "diaspora",
+ "PARTIES",
+ "<3"
+ ];
+ });
- describe("main", function(){
- it("calls mentionify, hashtagify, and markdownify", function(){
- spyOn(app.helpers.textFormatter, "mentionify")
- spyOn(app.helpers.textFormatter, "hashtagify")
- spyOn(app.helpers.textFormatter, "markdownify")
+ it("renders tags as links", function() {
+ var formattedText = this.formatter('#'+this.tags.join(" #"));
+ _.each(this.tags, function(tag) {
+ var link ='<a href="/tags/'+tag.toLowerCase()+'" class="tag">#'+tag.replace("<","&lt;")+'</a>';
+ expect(formattedText).toContain(link);
+ });
+ });
+ });
+
+ // Some basic specs. For more detailed specs see
+ // https://github.com/diaspora/markdown-it-diaspora-mention/tree/master/test
+ context("mentions", function() {
+ beforeEach(function(){
+ this.alice = factory.author({
+ name : "Alice Smith",
+ diaspora_id : "alice@example.com",
+ guid: "555",
+ id : "555"
+ });
- app.helpers.textFormatter(this.statusMessage.get("text"), this.statusMessage)
- expect(app.helpers.textFormatter.mentionify).toHaveBeenCalled()
- expect(app.helpers.textFormatter.hashtagify).toHaveBeenCalled()
- expect(app.helpers.textFormatter.markdownify).toHaveBeenCalled()
- })
+ this.bob = factory.author({
+ name : "Bob Grimm",
+ diaspora_id : "bob@example.com",
+ guid: "666",
+ id : "666"
+ });
- // A couple of complex (intergration) test cases here would be rad.
- })
+ this.statusMessage.set({text: "hey there @{Alice Smith; alice@example.com} and @{Bob Grimm; bob@example.com}"});
+ this.statusMessage.set({mentioned_people : [this.alice, this.bob]});
+ });
- describe(".markdownify", function(){
- // NOTE: for some strange reason, links separated by just a whitespace character
- // will not be autolinked; thus we join our URLS here with (" and ").
- // This test will fail if our join is just (" ") -- an edge case that should be addressed.
+ it("matches mentions", function(){
+ var formattedText = this.formatter(this.statusMessage.get("text"), this.statusMessage.get("mentioned_people"));
+ var wrapper = $("<div>").html(formattedText);
+ _.each([this.alice, this.bob], function(person) {
+ expect(wrapper.find("a[href='/people/" + person.guid + "']").text()).toContain(person.name);
+ });
+ });
+
+ it("returns mentions for on posts that haven't been saved yet (framer posts)", function(){
+ var freshBob = factory.author({
+ name : "Bob Grimm",
+ handle : "bob@example.com",
+ url : 'googlebot.com',
+ id : "666"
+ });
+
+ this.statusMessage.set({'mentioned_people' : [freshBob] });
+
+ var formattedText = this.formatter(this.statusMessage.get("text"), this.statusMessage.get("mentioned_people"));
+ var wrapper = $("<div>").html(formattedText);
+ expect(wrapper.find("a[href='googlebot.com']").text()).toContain(freshBob.name);
+ });
+
+ it("returns the name of the mention if the mention does not exist in the array", function(){
+ var text = "hey there @{Chris Smith; chris@example.com}";
+ var formattedText = this.formatter(text, []);
+ expect(formattedText.match(/<a/)).toBeNull();
+ expect(formattedText).toContain('Chris Smith');
+ });
+
+ it("makes mentions hovercardable unless the current user has been mentioned", function() {
+ app.currentUser.get = jasmine.createSpy().and.returnValue(this.alice.guid);
+ var formattedText = this.formatter(this.statusMessage.get("text"), this.statusMessage.get("mentioned_people"));
+ var wrapper = $("<div>").html(formattedText);
+ expect(wrapper.find("a[href='/people/" + this.alice.guid + "']")).not.toHaveClass('hovercardable');
+ expect(wrapper.find("a[href='/people/" + this.bob.guid + "']")).toHaveClass('hovercardable');
+ });
+ });
+
+ context("markdown", function(){
it("autolinks", function(){
var links = [
"http://google.com",
@@ -32,23 +96,35 @@ describe("app.helpers.textFormatter", function(){
"http://www.yahooligans.com",
"http://obama.com",
"http://japan.co.jp",
- "www.mygreat-example-website.de",
- "www.jenseitsderfenster.de", // from issue #3468
- "www.google.com"
+ "http://www.mygreat-example-website.de",
+ "http://www.jenseitsderfenster.de", // from issue #3468
+ "mumble://mumble.coding4.coffee",
+ "xmpp:podmin@pod.tld",
+ "mailto:podmin@pod.tld"
];
- // The join that would make this particular test fail:
- //
- // var formattedText = this.formatter.markdownify(links.join(" "))
-
- var formattedText = this.formatter.markdownify(links.join(" and "));
+ var formattedText = this.formatter(links.join(" "));
var wrapper = $("<div>").html(formattedText);
_.each(links, function(link) {
var linkElement = wrapper.find("a[href*='" + link + "']");
expect(linkElement.text()).toContain(link);
expect(linkElement.attr("target")).toContain("_blank");
- })
+ });
+
+ expect(this.formatter('<http://google.com>')).toContain('<a href');
+ expect(this.formatter('<http://google.com>')).toContain('_blank');
+ });
+
+ it("adds a missing http://", function() {
+ expect(this.formatter('[test](www.google.com)')).toContain('href="http://www.google.com"');
+ expect(this.formatter('[test](http://www.google.com)')).toContain('href="http://www.google.com"');
+ });
+
+ it("respects code blocks", function() {
+ var content = '`<unknown tag>`';
+ var wrapper = $('<div>').html(this.formatter(content));
+ expect(wrapper.find('code').text()).toEqual('<unknown tag>');
});
context("symbol conversion", function() {
@@ -67,13 +143,13 @@ describe("app.helpers.textFormatter", function(){
it("correctly converts the input strings to their corresponding output symbol", function() {
_.each(this.input_strings, function(str, idx) {
- var text = this.formatter.markdownify(str);
+ var text = this.formatter(str);
expect(text).toContain(this.output_symbols[idx]);
}, this);
});
it("converts all symbols at once", function() {
- var text = this.formatter.markdownify(this.input_strings.join(" "));
+ var text = this.formatter(this.input_strings.join(" "));
_.each(this.output_symbols, function(sym) {
expect(text).toContain(sym);
});
@@ -82,36 +158,43 @@ describe("app.helpers.textFormatter", function(){
context("non-ascii url", function() {
beforeEach(function() {
+ /* jshint -W100 */
this.evilUrls = [
"http://www.bürgerentscheid-krankenhäuser.de", // example from issue #2665
"http://bündnis-für-krankenhäuser.de/wp-content/uploads/2011/11/cropped-logohp.jpg",
"http://موقع.وزارة-الاتصالات.مصر/", // example from #3082
- "http:///scholar.google.com/citations?view_op=top_venues",
"http://lyricstranslate.com/en/someone-you-നിന്നെ-പോലൊരാള്‍.html", // example from #3063,
"http://de.wikipedia.org/wiki/Liste_der_Abkürzungen_(Netzjargon)", // #3645
"http://wiki.com/?query=Kr%E4fte", // #4874
];
+ /* jshint +W100 */
this.asciiUrls = [
"http://www.xn--brgerentscheid-krankenhuser-xkc78d.de",
"http://xn--bndnis-fr-krankenhuser-i5b27cha.de/wp-content/uploads/2011/11/cropped-logohp.jpg",
"http://xn--4gbrim.xn----ymcbaaajlc6dj7bxne2c.xn--wgbh1c/",
- "http:///scholar.google.com/citations?view_op=top_venues",
"http://lyricstranslate.com/en/someone-you-%E0%B4%A8%E0%B4%BF%E0%B4%A8%E0%B5%8D%E0%B4%A8%E0%B5%86-%E0%B4%AA%E0%B5%8B%E0%B4%B2%E0%B5%8A%E0%B4%B0%E0%B4%BE%E0%B4%B3%E0%B5%8D%E2%80%8D.html",
- "http://de.wikipedia.org/wiki/Liste_der_Abk%C3%BCrzungen_%28Netzjargon%29",
+ "http://de.wikipedia.org/wiki/Liste_der_Abk%C3%BCrzungen_(Netzjargon)",
"http://wiki.com/?query=Kr%E4fte",
];
});
it("correctly encodes to punycode", function() {
_.each(this.evilUrls, function(url, num) {
- var text = this.formatter.markdownify( "<" + url + ">" );
+ var text = this.formatter(url);
+ expect(text).toContain(this.asciiUrls[num]);
+ }, this);
+ });
+
+ it("correctly encodes image src to punycode", function() {
+ _.each(this.evilUrls, function(url, num) {
+ var text = this.formatter("![](" + url + ")");
expect(text).toContain(this.asciiUrls[num]);
}, this);
});
it("doesn't break link texts", function() {
var linkText = "check out this awesome link!";
- var text = this.formatter.markdownify( "["+linkText+"]("+this.evilUrls[0]+")" );
+ var text = this.formatter( "["+linkText+"]("+this.evilUrls[0]+")" );
expect(text).toContain(this.asciiUrls[0]);
expect(text).toContain(linkText);
@@ -119,42 +202,47 @@ describe("app.helpers.textFormatter", function(){
it("doesn't break reference style links", function() {
var postContent = "blabla blab [my special link][1] bla blabla\n\n[1]: "+this.evilUrls[0]+" and an optional title)";
- var text = this.formatter.markdownify(postContent);
+ var text = this.formatter(postContent);
- expect(text).not.toContain(this.evilUrls[0]);
+ expect(text).not.toContain('"'+this.evilUrls[0]+'"');
expect(text).toContain(this.asciiUrls[0]);
});
it("can be used as img src", function() {
var postContent = "![logo]("+ this.evilUrls[1] +")";
var niceImg = 'src="'+ this.asciiUrls[1] +'"'; // the "" are from src=""
- var text = this.formatter.markdownify(postContent);
+ var text = this.formatter(postContent);
expect(text).toContain(niceImg);
});
it("doesn't break linked images", function() {
var postContent = "I am linking an image here [![some-alt-text]("+this.evilUrls[1]+")]("+this.evilUrls[3]+")";
- var text = this.formatter.markdownify(postContent);
+ var text = this.formatter(postContent);
var linked_image = 'src="'+this.asciiUrls[1]+'"';
var image_link = 'href="'+this.asciiUrls[3]+'"';
expect(text).toContain(linked_image);
expect(text).toContain(image_link);
});
-
});
context("misc breakage and/or other issues with weird urls", function(){
+ it("doesn't crash Firefox", function() {
+ var content = "antifaschistisch-feministische ://";
+ var parsed = this.formatter(content);
+ expect(parsed).toContain(content);
+ });
+
it("doesn't crash Chromium - RUN ME WITH CHROMIUM! (issue #3553)", function() {
var text_part = 'Revert "rails admin is conflicting with client side validations: see https://github.com/sferik/rails_admin/issues/985"';
var link_part = 'https://github.com/diaspora/diaspora/commit/61f40fc6bfe6bb859c995023b5a17d22c9b5e6e5';
var content = '['+text_part+']('+link_part+')';
- var parsed = this.formatter.markdownify(content);
+ var parsed = this.formatter(content);
var link = 'href="' + link_part + '"';
- var text = '>'+ text_part +'<';
+ var text = '>Revert “rails admin is conflicting with client side validations: see https://github.com/sferik/rails_admin/issues/985”<';
expect(parsed).toContain(link);
expect(parsed).toContain(text);
@@ -162,154 +250,43 @@ describe("app.helpers.textFormatter", function(){
context("percent-encoded input url", function() {
beforeEach(function() {
- this.input = "http://www.soilandhealth.org/01aglibrary/010175.tree%20crops.pdf" // #4507
+ this.input = "http://www.soilandhealth.org/01aglibrary/010175.tree%20crops.pdf"; // #4507
this.correctHref = 'href="'+this.input+'"';
});
it("doesn't get double-encoded", function(){
- var parsed = this.formatter.markdownify(this.input);
- expect(parsed).toContain(this.correctHref);
- });
-
- it("gets correctly decoded, even when multiply encoded", function() {
- var uglyUrl = encodeURI(encodeURI(encodeURI(this.input)));
- var parsed = this.formatter.markdownify(uglyUrl);
+ var parsed = this.formatter(this.input);
expect(parsed).toContain(this.correctHref);
});
});
- it("tests a bunch of benchmark urls", function(){
- var self = this;
- $.ajax({
- async: false,
- cache: false,
- url: '/spec/fixtures/good_urls.txt',
- success: function(data) { self.url_list = data.split("\n"); }
- });
-
- _.each(this.url_list, function(url) {
- // 'comments'
- if( url.match(/^#/) ) return;
-
- // regex.test is stupid, use match and boolean-ify it
- var result = !!url.match(Diaspora.url_regex);
- expect(result).toBeTruthy();
- if( !result && console && console.log ) {
- console.log(url);
- }
- });
+ it("doesn't fail for misc urls", function() {
+ var contents = [
+ 'https://foo.com!',
+ 'ftp://example.org:8080'
+ ];
+ var results = [
+ '<p><a href="https://foo.com" target="_blank">https://foo.com</a>!</p>',
+ '<p><a href="ftp://example.org:8080" target="_blank">ftp://example.org:8080</a></p>'
+ ];
+ for (var i = 0; i < contents.length; i++) {
+ expect(this.formatter(contents[i])).toContain(results[i]);
+ }
});
-
- // TODO: try to match the 'bad_urls.txt' and have as few matches as possible
});
+ });
- })
-
- describe(".hashtagify", function(){
- context("changes hashtags to links", function(){
- it("creates links to hashtags", function(){
- var formattedText = this.formatter.hashtagify("I love #parties and #rockstars and #unicorns")
- var wrapper = $("<div>").html(formattedText);
-
- _.each(["parties", "rockstars", "unicorns"], function(tagName){
- expect(wrapper.find("a[href='/tags/" + tagName + "']").text()).toContain(tagName)
- })
- })
-
- it("requires hashtags to be preceeded with a space", function(){
- var formattedText = this.formatter.hashtagify("I love the#parties")
- expect(formattedText).not.toContain('/tags/parties')
- })
-
- // NOTE THIS DIVERGES FROM GRUBER'S ORIGINAL DIALECT OF MARKDOWN.
- // We had to edit Markdown.Converter.js line 747
- //
- // text = text.replace(/^(\#{1,6})[ \t]+(.+?)[ \t]*\#*\n+/gm,
- // [ \t]* changed to [ \t]+
- //
- it("doesn't create a header tag if the first word is a hashtag", function(){
- var formattedText = this.formatter.hashtagify("#parties, I love")
- var wrapper = $("<div>").html(formattedText);
-
- expect(wrapper.find("h1").length).toBe(0)
- expect(wrapper.find("a[href='/tags/parties']").text()).toContain("#parties")
- })
-
- it("and the resultant link has the tags name downcased", function(){
- var formattedText = this.formatter.hashtagify("#PARTIES, I love")
-
- expect(formattedText).toContain("/tags/parties")
- })
-
- it("doesn't create tag if the text is a link", function(){
- var tags = ['diaspora', 'twitter', 'hrabrahabr'];
-
- var text = $('<a/>', { href: 'http://me.co' }).html('#me')[0].outerHTML;
- _.each(tags, function(tagName){
- text += ' #'+tagName+',';
- });
- text += 'I love';
-
- var formattedText = this.formatter.hashtagify(text);
- var wrapper = $('<div>').html(formattedText);
-
- expect(wrapper.find("a[href='http://me.co']").text()).toContain('#me');
- _.each(tags, function(tagName){
- expect(wrapper.find("a[href='/tags/"+tagName+"']").text()).toContain('#'+tagName);
- });
-
- })
- })
- })
-
- describe(".mentionify", function(){
- context("changes mention markup to links", function(){
- beforeEach(function(){
- this.alice = factory.author({
- name : "Alice Smith",
- diaspora_id : "alice@example.com",
- id : "555"
- })
-
- this.bob = factory.author({
- name : "Bob Grimm",
- diaspora_id : "bob@example.com",
- id : "666"
- })
-
- this.statusMessage.set({text: "hey there @{Alice Smith; alice@example.com} and @{Bob Grimm; bob@example.com}"})
- this.statusMessage.set({mentioned_people : [this.alice, this.bob]})
- })
-
- it("matches mentions", function(){
- var formattedText = this.formatter.mentionify(this.statusMessage.get("text"), this.statusMessage.get("mentioned_people"))
- var wrapper = $("<div>").html(formattedText);
-
- _.each([this.alice, this.bob], function(person) {
- expect(wrapper.find("a[href='/people/" + person.guid + "']").text()).toContain(person.name)
- })
- });
-
- it("returns mentions for on posts that haven't been saved yet (framer posts)", function(){
- var freshBob = factory.author({
- name : "Bob Grimm",
- handle : "bob@example.com",
- url : 'googlebot.com',
- id : "666"
- })
-
- this.statusMessage.set({'mentioned_people' : [freshBob] })
-
- var formattedText = this.formatter.mentionify(this.statusMessage.get("text"), this.statusMessage.get("mentioned_people"))
- var wrapper = $("<div>").html(formattedText);
- expect(wrapper.find("a[href='googlebot.com']").text()).toContain(freshBob.name)
- })
-
- it('returns the name of the mention if the mention does not exist in the array', function(){
- var text = "hey there @{Chris Smith; chris@example.com}"
- var formattedText = this.formatter.mentionify(text, [])
- expect(formattedText.match(/\<a/)).toBeNull();
- });
- })
- })
-})
+ context("real world examples", function(){
+ it("renders them as expected", function(){
+ var contents = [
+ 'oh, cool, nginx 1.7.9 supports json autoindexes: http://nginx.org/en/docs/http/ngx_http_autoindex_module.html#autoindex_format'
+ ];
+ var results = [
+ '<p>oh, cool, nginx 1.7.9 supports json autoindexes: <a href="http://nginx.org/en/docs/http/ngx_http_autoindex_module.html#autoindex_format" target="_blank">http://nginx.org/en/docs/http/ngx_http_autoindex_module.html#autoindex_format</a></p>'
+ ];
+ for (var i = 0; i < contents.length; i++) {
+ expect(this.formatter(contents[i])).toContain(results[i]);
+ }
+ });
+ });
+});
diff --git a/spec/javascripts/app/helpers/timeago_spec.js b/spec/javascripts/app/helpers/timeago_spec.js
new file mode 100644
index 000000000..6884bbc78
--- /dev/null
+++ b/spec/javascripts/app/helpers/timeago_spec.js
@@ -0,0 +1,20 @@
+describe("app.helpers.timeago", function() {
+ beforeEach(function(){
+ this.date = '2015-02-08T13:37:42.000Z';
+ this.datestring = new Date(this.date).toLocaleString();
+ var html = '<time class="timeago" datetime="' + this.date + '"></time>';
+ this.content = spec.content().html(html);
+ });
+
+ it("converts the date into a locale string for the tooltip", function() {
+ var timeago = this.content.find('time.timeago');
+ expect(timeago.attr('datetime')).toEqual(this.date);
+ expect(timeago.data('original-title')).toEqual(undefined);
+
+ app.helpers.timeago(this.content);
+
+ timeago = this.content.find('time.timeago');
+ expect(timeago.attr('datetime')).toEqual(this.date);
+ expect(timeago.data('original-title')).toEqual(this.datestring);
+ });
+});
diff --git a/spec/javascripts/app/helpers/truncate_spec.js b/spec/javascripts/app/helpers/truncate_spec.js
new file mode 100644
index 000000000..d816d9f15
--- /dev/null
+++ b/spec/javascripts/app/helpers/truncate_spec.js
@@ -0,0 +1,9 @@
+describe("app.helpers.truncate", function() {
+ it("handles null values", function() {
+ expect(app.helpers.truncate(null, 123)).toEqual(null);
+ });
+
+ it("handles undefined", function() {
+ expect(app.helpers.truncate(undefined, 123)).toEqual(undefined);
+ });
+});
diff --git a/spec/javascripts/app/models/contact_spec.js b/spec/javascripts/app/models/contact_spec.js
new file mode 100644
index 000000000..b5fda20c1
--- /dev/null
+++ b/spec/javascripts/app/models/contact_spec.js
@@ -0,0 +1,20 @@
+describe("app.models.Contact", function() {
+
+ beforeEach(function(){
+ this.aspect = factory.aspect();
+ this.contact = new app.models.Contact({
+ person: { name: "aaa" },
+ aspect_memberships: [{id: 42, aspect: this.aspect}]
+ });
+ });
+
+ describe("inAspect", function(){
+ it("returns true if the contact has been added to the aspect", function(){
+ expect(this.contact.inAspect(this.aspect.id)).toBeTruthy();
+ });
+
+ it("returns false if the contact hasn't been added to the aspect", function(){
+ expect(this.contact.inAspect(this.aspect.id+1)).toBeFalsy();
+ });
+ });
+});
diff --git a/spec/javascripts/app/models/person_spec.js b/spec/javascripts/app/models/person_spec.js
new file mode 100644
index 000000000..b36b8beb6
--- /dev/null
+++ b/spec/javascripts/app/models/person_spec.js
@@ -0,0 +1,69 @@
+
+describe("app.models.Person", function() {
+ beforeEach(function() {
+ this.mutual_contact = factory.person({relationship: 'mutual'});
+ this.sharing_contact = factory.person({relationship :'sharing'});
+ this.receiving_contact = factory.person({relationship: 'receiving'});
+ this.blocked_contact = factory.person({relationship: 'blocked', block: {id: 1}});
+ });
+
+ context("#isSharing", function() {
+ it("indicates if the person is sharing", function() {
+ expect(this.mutual_contact.isSharing()).toBeTruthy();
+ expect(this.sharing_contact.isSharing()).toBeTruthy();
+
+ expect(this.receiving_contact.isSharing()).toBeFalsy();
+ expect(this.blocked_contact.isSharing()).toBeFalsy();
+ });
+ });
+
+ context("#isReceiving", function() {
+ it("indicates if the person is receiving", function() {
+ expect(this.mutual_contact.isReceiving()).toBeTruthy();
+ expect(this.receiving_contact.isReceiving()).toBeTruthy();
+
+ expect(this.sharing_contact.isReceiving()).toBeFalsy();
+ expect(this.blocked_contact.isReceiving()).toBeFalsy();
+ });
+ });
+
+ context("#isMutual", function() {
+ it("indicates if we share mutually with the person", function() {
+ expect(this.mutual_contact.isMutual()).toBeTruthy();
+
+ expect(this.receiving_contact.isMutual()).toBeFalsy();
+ expect(this.sharing_contact.isMutual()).toBeFalsy();
+ expect(this.blocked_contact.isMutual()).toBeFalsy();
+ });
+ });
+
+ context("#isBlocked", function() {
+ it("indicates whether we blocked the person", function() {
+ expect(this.blocked_contact.isBlocked()).toBeTruthy();
+
+ expect(this.mutual_contact.isBlocked()).toBeFalsy();
+ expect(this.receiving_contact.isBlocked()).toBeFalsy();
+ expect(this.sharing_contact.isBlocked()).toBeFalsy();
+ });
+ });
+
+ context("#block", function() {
+ it("POSTs a block to the server", function() {
+ this.sharing_contact.block();
+ var request = jasmine.Ajax.requests.mostRecent();
+
+ expect(request.method).toEqual("POST");
+ expect($.parseJSON(request.params).block.person_id).toEqual(this.sharing_contact.id);
+ });
+ });
+
+ context("#unblock", function() {
+ it("DELETEs a block from the server", function(){
+ this.blocked_contact.unblock();
+ var request = jasmine.Ajax.requests.mostRecent();
+
+ expect(request.method).toEqual("DELETE");
+ expect(request.url).toEqual(Routes.block_path(this.blocked_contact.get('block').id));
+ });
+ });
+});
diff --git a/spec/javascripts/app/models/photo_spec.js b/spec/javascripts/app/models/photo_spec.js
index 1953181e1..20e235085 100644
--- a/spec/javascripts/app/models/photo_spec.js
+++ b/spec/javascripts/app/models/photo_spec.js
@@ -16,7 +16,7 @@ describe("app.models.Photo", function() {
describe("createdAt", function() {
it("returns the photo's created_at as an integer", function() {
- var date = new Date;
+ var date = new Date();
this.photo.set({ created_at: +date * 1000 });
expect(typeof this.photo.createdAt()).toEqual("number");
diff --git a/spec/javascripts/app/models/post/interacations_spec.js b/spec/javascripts/app/models/post/interacations_spec.js
index f6a5be3ad..0536b3f1d 100644
--- a/spec/javascripts/app/models/post/interacations_spec.js
+++ b/spec/javascripts/app/models/post/interacations_spec.js
@@ -1,45 +1,85 @@
describe("app.models.Post.Interactions", function(){
beforeEach(function(){
- this.interactions = factory.post()
- this.interactions = this.interactions.interactions
- this.author = factory.author({guid: "loggedInAsARockstar"})
- loginAs({guid: "loggedInAsARockstar"})
-
- this.userLike = new app.models.Like({author : this.author})
- })
-
+ this.interactions = factory.post().interactions;
+ this.author = factory.author({guid: "loggedInAsARockstar"});
+ loginAs({guid: "loggedInAsARockstar"});
+
+ this.userLike = new app.models.Like({author : this.author});
+ });
+
describe("toggleLike", function(){
it("calls unliked when the user_like exists", function(){
- this.interactions.likes.add(this.userLike)
- spyOn(this.interactions, "unlike").andReturn(true);
+ spyOn(this.interactions, "unlike").and.returnValue(true);
+ this.interactions.likes.add(this.userLike);
this.interactions.toggleLike();
+
expect(this.interactions.unlike).toHaveBeenCalled();
- })
+ });
it("calls liked when the user_like does not exist", function(){
+ spyOn(this.interactions, "like").and.returnValue(true);
this.interactions.likes.reset([]);
- spyOn(this.interactions, "like").andReturn(true);
this.interactions.toggleLike();
+
expect(this.interactions.like).toHaveBeenCalled();
- })
- })
+ });
+ });
describe("like", function(){
it("calls create on the likes collection", function(){
- spyOn(this.interactions.likes, "create");
-
this.interactions.like();
- expect(this.interactions.likes.create).toHaveBeenCalled();
- })
- })
+ expect(this.interactions.likes.length).toEqual(1);
+ });
+ });
describe("unlike", function(){
it("calls destroy on the likes collection", function(){
- this.interactions.likes.add(this.userLike)
- spyOn(this.userLike, "destroy");
-
+ this.interactions.likes.add(this.userLike);
this.interactions.unlike();
- expect(this.userLike.destroy).toHaveBeenCalled();
- })
- })
-}) \ No newline at end of file
+
+ expect(this.interactions.likes.length).toEqual(0);
+ });
+ });
+
+ describe("reshare", function() {
+ var ajaxSuccess = { status: 200, responseText: "{\"id\": 1}" };
+
+ beforeEach(function(){
+ this.reshare = this.interactions.post.reshare();
+ });
+
+ it("triggers a change on the model", function() {
+ spyOn(this.interactions, "trigger");
+
+ this.interactions.reshare();
+ jasmine.Ajax.requests.mostRecent().respondWith(ajaxSuccess);
+
+ expect(this.interactions.trigger).toHaveBeenCalledWith("change");
+ });
+
+ it("adds the reshare to the default, activity and aspects stream", function() {
+ app.stream = { addNow: $.noop };
+ spyOn(app.stream, "addNow");
+ var self = this;
+ ["/stream", "/activity", "/aspects"].forEach(function(path) {
+ app.stream.basePath = function() { return path; };
+ self.interactions.reshare();
+ jasmine.Ajax.requests.mostRecent().respondWith(ajaxSuccess);
+
+ expect(app.stream.addNow).toHaveBeenCalledWith({id: 1});
+ });
+ });
+
+ it("doesn't add the reshare to any other stream", function() {
+ app.stream = { addNow: $.noop };
+ spyOn(app.stream, "addNow");
+ var self = this;
+ ["/followed_tags", "/mentions/", "/tag/diaspora", "/people/guid/stream"].forEach(function(path) {
+ app.stream.basePath = function() { return path; };
+ self.interactions.reshare();
+ jasmine.Ajax.requests.mostRecent().respondWith(ajaxSuccess);
+ expect(app.stream.addNow).not.toHaveBeenCalled();
+ });
+ });
+ });
+});
diff --git a/spec/javascripts/app/models/post_spec.js b/spec/javascripts/app/models/post_spec.js
index 3eaea4559..b644e26be 100644
--- a/spec/javascripts/app/models/post_spec.js
+++ b/spec/javascripts/app/models/post_spec.js
@@ -1,35 +1,35 @@
describe("app.models.Post", function() {
beforeEach(function(){
this.post = new app.models.Post();
- })
+ });
describe("headline and body", function(){
describe("headline", function(){
beforeEach(function(){
- this.post.set({text :" yes "})
- })
+ this.post.set({text :" yes "});
+ });
it("the headline is the entirety of the post", function(){
- expect(this.post.headline()).toBe("yes")
- })
+ expect(this.post.headline()).toBe("yes");
+ });
it("takes up until the new line", function(){
- this.post.set({text : "love\nis avery powerful force"})
- expect(this.post.headline()).toBe("love")
- })
- })
+ this.post.set({text : "love\nis avery powerful force"});
+ expect(this.post.headline()).toBe("love");
+ });
+ });
describe("body", function(){
it("takes after the new line", function(){
- this.post.set({text : "Inflamatory Title\nwith text that substantiates a less absolutist view of the title."})
- expect(this.post.body()).toBe("with text that substantiates a less absolutist view of the title.")
- })
- })
- })
+ this.post.set({text : "Inflamatory Title\nwith text that substantiates a less absolutist view of the title."});
+ expect(this.post.body()).toBe("with text that substantiates a less absolutist view of the title.");
+ });
+ });
+ });
describe("createdAt", function() {
it("returns the post's created_at as an integer", function() {
- var date = new Date;
+ var date = new Date();
this.post.set({ created_at: +date * 1000 });
expect(typeof this.post.createdAt()).toEqual("number");
@@ -39,25 +39,25 @@ describe("app.models.Post", function() {
describe("hasPhotos", function(){
it('returns true if the model has more than one photo', function(){
- this.post.set({photos : [1,2]})
- expect(this.post.hasPhotos()).toBeTruthy()
- })
+ this.post.set({photos : [1,2]});
+ expect(this.post.hasPhotos()).toBeTruthy();
+ });
it('returns false if the model does not have any photos', function(){
- this.post.set({photos : []})
- expect(this.post.hasPhotos()).toBeFalsy()
- })
+ this.post.set({photos : []});
+ expect(this.post.hasPhotos()).toBeFalsy();
+ });
});
describe("hasText", function(){
it('returns true if the model has text', function(){
- this.post.set({text : "hella"})
- expect(this.post.hasText()).toBeTruthy()
- })
+ this.post.set({text : "hella"});
+ expect(this.post.hasText()).toBeTruthy();
+ });
it('returns false if the model does not have text', function(){
- this.post.set({text : " "})
- expect(this.post.hasText()).toBeFalsy()
- })
+ this.post.set({text : " "});
+ expect(this.post.hasText()).toBeFalsy();
+ });
});
});
diff --git a/spec/javascripts/app/models/reshare_spec.js b/spec/javascripts/app/models/reshare_spec.js
index 04fc949b1..e93c34e00 100644
--- a/spec/javascripts/app/models/reshare_spec.js
+++ b/spec/javascripts/app/models/reshare_spec.js
@@ -1,27 +1,27 @@
describe("app.models.Reshare", function(){
beforeEach(function(){
- this.reshare = new app.models.Reshare({root: {a:"namaste", be : "aloha", see : "community"}})
+ this.reshare = new app.models.Reshare({root: {a:"namaste", be : "aloha", see : "community"}});
});
describe("rootPost", function(){
it("should be the root attrs", function(){
- expect(this.reshare.rootPost().get("be")).toBe("aloha")
+ expect(this.reshare.rootPost().get("be")).toBe("aloha");
});
it("should return a post", function(){
- expect(this.reshare.rootPost() instanceof app.models.Post).toBeTruthy()
+ expect(this.reshare.rootPost() instanceof app.models.Post).toBeTruthy();
});
it("does not create a new object every time", function(){
- expect(this.reshare.rootPost()).toBe(this.reshare.rootPost())
+ expect(this.reshare.rootPost()).toBe(this.reshare.rootPost());
});
});
describe(".reshare", function(){
it("reshares the root post", function(){
- spyOn(this.reshare.rootPost(), "reshare")
- this.reshare.reshare()
- expect(this.reshare.rootPost().reshare).toHaveBeenCalled()
+ spyOn(this.reshare.rootPost(), "reshare");
+ this.reshare.reshare();
+ expect(this.reshare.rootPost().reshare).toHaveBeenCalled();
});
it("returns something", function() {
diff --git a/spec/javascripts/app/models/status_message_spec.js b/spec/javascripts/app/models/status_message_spec.js
index ad8c93a31..c80156074 100644
--- a/spec/javascripts/app/models/status_message_spec.js
+++ b/spec/javascripts/app/models/status_message_spec.js
@@ -1,12 +1,12 @@
describe("app.models.StatusMessage", function(){
describe("#url", function(){
it("is /status_messages when its new", function(){
- var post = new app.models.StatusMessage()
- expect(post.url()).toBe("/status_messages")
- })
+ var post = new app.models.StatusMessage();
+ expect(post.url()).toBe("/status_messages");
+ });
it("is /posts/id when it has an id", function(){
- expect(new app.models.StatusMessage({id : 5}).url()).toBe("/posts/5")
- })
- })
-}) \ No newline at end of file
+ expect(new app.models.StatusMessage({id : 5}).url()).toBe("/posts/5");
+ });
+ });
+});
diff --git a/spec/javascripts/app/models/stream_aspects_spec.js b/spec/javascripts/app/models/stream_aspects_spec.js
index f6d99195c..35ba94a4e 100644
--- a/spec/javascripts/app/models/stream_aspects_spec.js
+++ b/spec/javascripts/app/models/stream_aspects_spec.js
@@ -6,7 +6,7 @@ describe("app.models.StreamAspects", function() {
beforeEach(function(){
fetch = new $.Deferred();
stream = new app.models.StreamAspects([], {aspects_ids: [1,2]});
- spyOn(stream.items, "fetch").andCallFake(function(options){
+ spyOn(stream.items, "fetch").and.callFake(function(options){
stream.items.set([{name: 'a'}, {name: 'b'}, {name: 'c'}], options);
fetch.resolve();
return fetch;
diff --git a/spec/javascripts/app/models/stream_spec.js b/spec/javascripts/app/models/stream_spec.js
index 2b0094234..0778dbf1f 100644
--- a/spec/javascripts/app/models/stream_spec.js
+++ b/spec/javascripts/app/models/stream_spec.js
@@ -1,55 +1,59 @@
describe("app.models.Stream", function() {
- beforeEach(function(){
- this.stream = new app.models.Stream(),
- this.expectedPath = document.location.pathname;
- })
-
- describe(".fetch", function() {
- var postFetch
- beforeEach(function(){
- postFetch = new $.Deferred()
+ var stream,
+ expectedPath;
- spyOn(this.stream.items, "fetch").andCallFake(function(){
- return postFetch
- })
- })
+ beforeEach(function(){
+ stream = new app.models.Stream();
+ expectedPath = document.location.pathname;
+ });
+ describe("#_fetchOpts", function() {
it("it fetches posts from the window's url, and ads them to the collection", function() {
- this.stream.fetch()
- expect(this.stream.items.fetch).toHaveBeenCalledWith({ remove: false, url: this.expectedPath});
+ expect( stream._fetchOpts() ).toEqual({ remove: false, url: expectedPath});
});
it("returns the json path with max_time if the collection has models", function() {
- var post = new app.models.Post();
- spyOn(post, "createdAt").andReturn(1234);
- this.stream.add(post);
+ var post = new app.models.Post({created_at: 1234000});
+ stream.add(post);
+
+ expect( stream._fetchOpts() ).toEqual({ remove: false, url: expectedPath + "?max_time=1234"});
+ });
+ });
- this.stream.fetch()
- expect(this.stream.items.fetch).toHaveBeenCalledWith({ remove: false, url: this.expectedPath + "?max_time=1234"});
+ describe("events", function() {
+ var postFetch,
+ fetchedSpy;
+
+ beforeEach(function(){
+ postFetch = new $.Deferred();
+ fetchedSpy = jasmine.createSpy();
+ spyOn(stream.items, "fetch").and.callFake(function(){
+ return postFetch;
+ });
});
it("triggers fetched on the stream when it is fetched", function(){
- var fetchedSpy = jasmine.createSpy()
- this.stream.bind('fetched', fetchedSpy)
- this.stream.fetch()
- postFetch.resolve([1,2,3])
- expect(fetchedSpy).toHaveBeenCalled()
- })
+ stream.bind('fetched', fetchedSpy);
+ stream.fetch();
+ postFetch.resolve([1,2,3]);
+
+ expect(fetchedSpy).toHaveBeenCalled();
+ });
it("triggers allItemsLoaded on the stream when zero posts are returned", function(){
- var fetchedSpy = jasmine.createSpy()
- this.stream.bind('allItemsLoaded', fetchedSpy)
- this.stream.fetch()
- postFetch.resolve([])
- expect(fetchedSpy).toHaveBeenCalled()
- })
+ stream.bind('allItemsLoaded', fetchedSpy);
+ stream.fetch();
+ postFetch.resolve([]);
+
+ expect(fetchedSpy).toHaveBeenCalled();
+ });
it("triggers allItemsLoaded on the stream when a Post is returned", function(){
- var fetchedSpy = jasmine.createSpy()
- this.stream.bind('allItemsLoaded', fetchedSpy)
- this.stream.fetch()
- postFetch.resolve(factory.post().attributes)
- expect(fetchedSpy).toHaveBeenCalled()
- })
+ stream.bind('allItemsLoaded', fetchedSpy);
+ stream.fetch();
+ postFetch.resolve(factory.post().attributes);
+
+ expect(fetchedSpy).toHaveBeenCalled();
+ });
});
});
diff --git a/spec/javascripts/app/models/user_spec.js b/spec/javascripts/app/models/user_spec.js
index 6870a07df..621b35a36 100644
--- a/spec/javascripts/app/models/user_spec.js
+++ b/spec/javascripts/app/models/user_spec.js
@@ -1,6 +1,6 @@
describe("app.models.User", function(){
beforeEach(function(){
- this.user = new app.models.User({})
+ this.user = new app.models.User({});
});
describe("authenticated", function(){
@@ -9,17 +9,16 @@ describe("app.models.User", function(){
});
it('should be true if ID is set', function(){
- this.user.set({id : 1})
+ this.user.set({id : 1});
expect(this.user.authenticated()).toBeTruthy();
});
});
describe("isServiceConnected", function(){
it("checks to see if the sent provider name is a configured service", function(){
- this.user.set({configured_services : ["facebook"]})
- expect(this.user.isServiceConfigured("facebook")).toBeTruthy()
- expect(this.user.isServiceConfigured("tumblr")).toBeFalsy()
+ this.user.set({configured_services : ["facebook"]});
+ expect(this.user.isServiceConfigured("facebook")).toBeTruthy();
+ expect(this.user.isServiceConfigured("tumblr")).toBeFalsy();
});
});
});
-
diff --git a/spec/javascripts/app/pages/contacts_spec.js b/spec/javascripts/app/pages/contacts_spec.js
new file mode 100644
index 000000000..e62bce96a
--- /dev/null
+++ b/spec/javascripts/app/pages/contacts_spec.js
@@ -0,0 +1,101 @@
+describe("app.pages.Contacts", function(){
+ beforeEach(function() {
+ spec.loadFixture("aspects_manage");
+ this.view = new app.pages.Contacts({
+ stream: {
+ render: function(){}
+ }
+ });
+ Diaspora.I18n.load({
+ contacts: {
+ aspect_list_is_visible: "Contacts in this aspect are able to see each other.",
+ aspect_list_is_not_visible: "Contacts in this aspect are not able to see each other.",
+ aspect_chat_is_enabled: "Contacts in this aspect are able to chat with you.",
+ aspect_chat_is_not_enabled: "Contacts in this aspect are not able to chat with you.",
+ }
+ });
+ });
+
+ context('toggle chat privilege', function() {
+ beforeEach(function() {
+ this.chat_toggle = $("#chat_privilege_toggle");
+ this.chat_icon = $("#chat_privilege_toggle .entypo");
+ });
+
+ it('updates the title for the tooltip', function() {
+ expect(this.chat_icon.attr('data-original-title')).toBe(
+ Diaspora.I18n.t("contacts.aspect_chat_is_not_enabled")
+ );
+ this.chat_toggle.trigger('click');
+ expect(this.chat_icon.attr('data-original-title')).toBe(
+ Diaspora.I18n.t("contacts.aspect_chat_is_enabled")
+ );
+ });
+
+ it('toggles the chat icon', function() {
+ expect(this.chat_icon.hasClass('enabled')).toBeFalsy();
+ this.chat_toggle.trigger('click');
+ expect(this.chat_icon.hasClass('enabled')).toBeTruthy();
+ });
+ });
+
+ context('toggle contacts visibility', function() {
+ beforeEach(function() {
+ this.visibility_toggle = $("#contacts_visibility_toggle");
+ this.lock_icon = $("#contacts_visibility_toggle .entypo");
+ });
+
+ it('updates the title for the tooltip', function() {
+ expect(this.lock_icon.attr('data-original-title')).toBe(
+ Diaspora.I18n.t("contacts.aspect_list_is_visible")
+ );
+
+ this.visibility_toggle.trigger('click');
+
+ expect(this.lock_icon.attr('data-original-title')).toBe(
+ Diaspora.I18n.t("contacts.aspect_list_is_not_visible")
+ );
+ });
+
+ it('toggles the lock icon', function() {
+ expect(this.lock_icon.hasClass('lock-open')).toBeTruthy();
+ expect(this.lock_icon.hasClass('lock')).toBeFalsy();
+
+ this.visibility_toggle.trigger('click');
+
+ expect(this.lock_icon.hasClass('lock')).toBeTruthy();
+ expect(this.lock_icon.hasClass('lock-open')).toBeFalsy();
+ });
+ });
+
+ context('show aspect name form', function() {
+ beforeEach(function() {
+ this.button = $('#change_aspect_name');
+ });
+
+ it('shows the form', function() {
+ expect($('#aspect_name_form').css('display')).toBe('none');
+ this.button.trigger('click');
+ expect($('#aspect_name_form').css('display')).not.toBe('none');
+ });
+
+ it('hides the aspect name', function() {
+ expect($('.header > h3').css('display')).not.toBe('none');
+ this.button.trigger('click');
+ expect($('.header > h3').css('display')).toBe('none');
+ });
+ });
+
+ context('search contact list', function() {
+ beforeEach(function() {
+ this.searchinput = $('#contact_list_search');
+ });
+
+ it('calls stream.search', function() {
+ this.view.stream.search = jasmine.createSpy();
+ this.searchinput.val("Username");
+ this.searchinput.trigger('keyup');
+ expect(this.view.stream.search).toHaveBeenCalledWith("Username");
+ });
+ });
+});
diff --git a/spec/javascripts/app/pages/profile_spec.js b/spec/javascripts/app/pages/profile_spec.js
new file mode 100644
index 000000000..bd5277371
--- /dev/null
+++ b/spec/javascripts/app/pages/profile_spec.js
@@ -0,0 +1,24 @@
+
+describe("app.pages.Profile", function() {
+ beforeEach(function() {
+ this.model = factory.person();
+ spyOn(this.model, 'block').and.returnValue($.Deferred());
+ spyOn(this.model, 'unblock').and.returnValue($.Deferred());
+ this.view = new app.pages.Profile({model: this.model});
+ });
+
+ context("#blockPerson", function() {
+ it("calls person#block", function() {
+ spyOn(window, 'confirm').and.returnValue(true);
+ this.view.blockPerson();
+ expect(this.model.block).toHaveBeenCalled();
+ });
+ });
+
+ context("#unblockPerson", function() {
+ it("calls person#unblock", function() {
+ this.view.unblockPerson();
+ expect(this.model.unblock).toHaveBeenCalled();
+ });
+ });
+});
diff --git a/spec/javascripts/app/router_spec.js b/spec/javascripts/app/router_spec.js
index 6371f34e1..259105d30 100644
--- a/spec/javascripts/app/router_spec.js
+++ b/spec/javascripts/app/router_spec.js
@@ -1,33 +1,27 @@
describe('app.Router', function () {
describe('followed_tags', function() {
+ beforeEach(function() {
+ factory.preloads({tagFollowings: []});
+ });
+
it('decodes name before passing it into TagFollowingAction', function () {
- var followed_tags = spyOn(app.router, 'followed_tags').andCallThrough();
- var tag_following_action = spyOn(app.views, 'TagFollowingAction').andCallFake(function(data) {
+ var followed_tags = spyOn(app.router, 'followed_tags').and.callThrough();
+ var tag_following_action = spyOn(app.views, 'TagFollowingAction').and.callFake(function() {
return {render: function() { return {el: ""}}};
});
- spyOn(window.history, 'pushState').andCallFake(function (data, title, url) {
- var route = app.router._routeToRegExp("tags/:name");
- var args = app.router._extractParameters(route, url.replace(/^\//, ""));
- app.router.followed_tags(args[0]);
- });
- window.preloads = {tagFollowings: []};
- app.router.navigate('/tags/'+encodeURIComponent('օբյեկտիվ'));
+
+ app.router.followed_tags(encodeURIComponent('օբյեկտիվ'));
expect(followed_tags).toHaveBeenCalled();
expect(tag_following_action).toHaveBeenCalledWith({tagText: 'օբյեկտիվ'});
});
it('navigates to the downcase version of the corresponding tag', function () {
- var followed_tags = spyOn(app.router, 'followed_tags').andCallThrough();
- var tag_following_action = spyOn(app.views, 'TagFollowingAction').andCallFake(function(data) {
+ var followed_tags = spyOn(app.router, 'followed_tags').and.callThrough();
+ var tag_following_action = spyOn(app.views, 'TagFollowingAction').and.callFake(function() {
return {render: function() { return {el: ""}}};
});
- spyOn(window.history, 'pushState').andCallFake(function (data, title, url) {
- var route = app.router._routeToRegExp("tags/:name");
- var args = app.router._extractParameters(route, url.replace(/^\//, ""));
- app.router.followed_tags(args[0]);
- });
- window.preloads = {tagFollowings: []};
- app.router.navigate('/tags/'+encodeURIComponent('SomethingWithCapitalLetters'));
+
+ app.router.followed_tags('SomethingWithCapitalLetters');
expect(followed_tags).toHaveBeenCalled();
expect(tag_following_action).toHaveBeenCalledWith({tagText: 'somethingwithcapitalletters'});
});
@@ -42,37 +36,34 @@ describe('app.Router', function () {
router = new app.Router();
});
- it('calls hideInactiveStreamLists', function () {
- var hideInactiveStreamLists = spyOn(router, 'hideInactiveStreamLists').andCallThrough();
-
- router.stream();
- expect(hideInactiveStreamLists).toHaveBeenCalled();
- });
-
it('hides the aspects list', function(){
- aspects = new app.collections.Aspects([{ name: 'Work', selected: true }]);
- var aspectsListView = new app.views.AspectsList({collection: aspects});
- var hideAspectsList = spyOn(aspectsListView, 'hideAspectsList').andCallThrough();
+ setFixtures('<div id="aspects_list" />');
+ aspects = new app.collections.Aspects([
+ factory.aspectAttrs({selected:true}),
+ factory.aspectAttrs()
+ ]);
+ var aspectsListView = new app.views.AspectsList({collection: aspects}).render();
router.aspects_list = aspectsListView;
+ expect(aspectsListView.$el.html()).not.toBe("");
router.stream();
- expect(hideAspectsList).toHaveBeenCalled();
+ expect(aspectsListView.$el.html()).toBe("");
});
it('hides the followed tags view', function(){
tagFollowings = new app.collections.TagFollowings();
- var followedTagsView = new app.views.TagFollowingList({collection: tagFollowings});
- var hideFollowedTags = spyOn(followedTagsView, 'hideFollowedTags').andCallThrough();
+ var followedTagsView = new app.views.TagFollowingList({collection: tagFollowings}).render();
router.followedTagsView = followedTagsView;
+ expect(followedTagsView.$el.html()).not.toBe("");
router.stream();
- expect(hideFollowedTags).toHaveBeenCalled();
+ expect(followedTagsView.$el.html()).toBe("");
});
});
describe("bookmarklet", function() {
it('routes to bookmarklet even if params have linefeeds', function() {
- router = new app.Router();
+ var router = new app.Router();
var route = jasmine.createSpy('bookmarklet route');
router.on('route:bookmarklet', route);
router.navigate("/bookmarklet?\n\nfeefwefwewef\n", {trigger: true});
diff --git a/spec/javascripts/app/views/aspect_membership_blueprint_view_spec.js b/spec/javascripts/app/views/aspect_membership_blueprint_view_spec.js
deleted file mode 100644
index d17405513..000000000
--- a/spec/javascripts/app/views/aspect_membership_blueprint_view_spec.js
+++ /dev/null
@@ -1,118 +0,0 @@
-describe("app.views.AspectMembershipBlueprint", function(){
- beforeEach(function() {
- spec.loadFixture("aspect_membership_dropdown_blueprint");
- this.view = new app.views.AspectMembershipBlueprint();
- this.person_id = $('.dropdown_list').data('person_id');
- });
-
- it('attaches to the aspect selector', function(){
- spyOn($.fn, 'on');
- view = new app.views.AspectMembership();
-
- expect($.fn.on).toHaveBeenCalled();
- });
-
- context('adding to aspects', function() {
- beforeEach(function() {
- this.newAspect = $('li:not(.selected)');
- this.newAspectId = this.newAspect.data('aspect_id');
- });
-
- it('calls "addMembership"', function() {
- spyOn(this.view, "addMembership");
- this.newAspect.trigger('click');
-
- expect(this.view.addMembership).toHaveBeenCalledWith(this.person_id, this.newAspectId);
- });
-
- it('tries to create a new AspectMembership', function() {
- spyOn(app.models.AspectMembership.prototype, "save");
- this.view.addMembership(1, 2);
-
- expect(app.models.AspectMembership.prototype.save).toHaveBeenCalled();
- });
-
- it('displays an error when it fails', function() {
- spyOn(this.view, "_displayError");
- spyOn(app.models.AspectMembership.prototype, "save").andCallFake(function() {
- this.trigger('error');
- });
-
- this.view.addMembership(1, 2);
-
- expect(this.view._displayError).toHaveBeenCalledWith('aspect_dropdown.error');
- });
- });
-
- context('removing from aspects', function(){
- beforeEach(function() {
- this.oldAspect = $('li.selected');
- this.oldMembershipId = this.oldAspect.data('membership_id');
- });
-
- it('calls "removeMembership"', function(){
- spyOn(this.view, "removeMembership");
- this.oldAspect.trigger('click');
-
- expect(this.view.removeMembership).toHaveBeenCalledWith(this.oldMembershipId);
- });
-
- it('tries to destroy an AspectMembership', function() {
- spyOn(app.models.AspectMembership.prototype, "destroy");
- this.view.removeMembership(1);
-
- expect(app.models.AspectMembership.prototype.destroy).toHaveBeenCalled();
- });
-
- it('displays an error when it fails', function() {
- spyOn(this.view, "_displayError");
- spyOn(app.models.AspectMembership.prototype, "destroy").andCallFake(function() {
- this.trigger('error');
- });
-
- this.view.removeMembership(1);
-
- expect(this.view._displayError).toHaveBeenCalledWith('aspect_dropdown.error_remove');
- });
- });
-
- context('summary text in the button', function() {
- beforeEach(function() {
- this.btn = $('div.button.toggle');
- this.btn.text(""); // reset
- this.view.dropdown = $('ul.dropdown_list');
- });
-
- it('shows "no aspects" when nothing is selected', function() {
- $('li[data-aspect_id]').removeClass('selected');
- this.view.updateSummary();
-
- expect(this.btn.text()).toContain(Diaspora.I18n.t('aspect_dropdown.toggle.zero'));
- });
-
- it('shows "all aspects" when everything is selected', function() {
- $('li[data-aspect_id]').addClass('selected');
- this.view.updateSummary();
-
- expect(this.btn.text()).toContain(Diaspora.I18n.t('aspect_dropdown.all_aspects'));
- });
-
- it('shows the name of the selected aspect ( == 1 )', function() {
- var list = $('li[data-aspect_id]');
- list.removeClass('selected'); // reset
- list.eq(1).addClass('selected');
- this.view.updateSummary();
-
- expect(this.btn.text()).toContain(list.eq(1).text());
- });
-
- it('shows the number of selected aspects ( > 1)', function() {
- var list = $('li[data-aspect_id]');
- list.removeClass('selected'); // reset
- $([list.eq(1), list.eq(2)]).addClass('selected');
- this.view.updateSummary();
-
- expect(this.btn.text()).toContain(Diaspora.I18n.t('aspect_dropdown.toggle', { 'count':2 }));
- });
- });
-});
diff --git a/spec/javascripts/app/views/aspect_membership_view_spec.js b/spec/javascripts/app/views/aspect_membership_view_spec.js
index 5f5abe9bb..660ddc215 100644
--- a/spec/javascripts/app/views/aspect_membership_view_spec.js
+++ b/spec/javascripts/app/views/aspect_membership_view_spec.js
@@ -1,9 +1,21 @@
describe("app.views.AspectMembership", function(){
+ var resp_success = {status: 200, responseText: '{}'};
+ var resp_fail = {status: 400};
+
beforeEach(function() {
// mock a dummy aspect dropdown
- spec.loadFixture("aspect_membership_dropdown_bootstrap");
+ spec.loadFixture("aspect_membership_dropdown");
this.view = new app.views.AspectMembership({el: $('.aspect_membership_dropdown')});
this.person_id = $('.dropdown-menu').data('person_id');
+ this.person_name = $('.dropdown-menu').data('person-short-name');
+ Diaspora.I18n.load({
+ aspect_dropdown: {
+ started_sharing_with: 'you started sharing with <%= name %>',
+ stopped_sharing_with: 'you stopped sharing with <%= name %>',
+ error: 'unable to add <%= name %>',
+ error_remove: 'unable to remove <%= name %>'
+ }
+ });
});
context('adding to aspects', function() {
@@ -12,65 +24,67 @@ describe("app.views.AspectMembership", function(){
this.newAspectId = this.newAspect.data('aspect_id');
});
- it('calls "addMembership"', function() {
- spyOn(this.view, "addMembership");
- this.newAspect.trigger('click');
+ it('marks the aspect as selected', function() {
+ this.newAspect.trigger('click');
+ jasmine.Ajax.requests.mostRecent().respondWith(resp_success);
- expect(this.view.addMembership).toHaveBeenCalledWith(this.person_id, this.newAspectId);
+ expect(this.newAspect.attr('class')).toContain('selected');
});
- it('tries to create a new AspectMembership', function() {
- spyOn(app.models.AspectMembership.prototype, "save");
- this.view.addMembership(1, 2);
+ it('displays flash message when added to first aspect', function() {
+ spec.content().find('li').removeClass('selected');
+ this.newAspect.trigger('click');
+ jasmine.Ajax.requests.mostRecent().respondWith(resp_success);
- expect(app.models.AspectMembership.prototype.save).toHaveBeenCalled();
+ expect($('[id^="flash"]')).toBeSuccessFlashMessage(
+ Diaspora.I18n.t('aspect_dropdown.started_sharing_with', {name: this.person_name})
+ );
});
it('displays an error when it fails', function() {
- spyOn(this.view, "_displayError");
- spyOn(app.models.AspectMembership.prototype, "save").andCallFake(function() {
- this.trigger('error');
- });
-
- this.view.addMembership(1, 2);
+ this.newAspect.trigger('click');
+ jasmine.Ajax.requests.mostRecent().respondWith(resp_fail);
- expect(this.view._displayError).toHaveBeenCalledWith('aspect_dropdown.error');
+ expect($('[id^="flash"]')).toBeErrorFlashMessage(
+ Diaspora.I18n.t('aspect_dropdown.error', {name: this.person_name})
+ );
});
});
context('removing from aspects', function(){
beforeEach(function() {
- this.oldAspect = $('li.selected');
+ this.oldAspect = $('li.selected').first();
this.oldMembershipId = this.oldAspect.data('membership_id');
});
- it('calls "removeMembership"', function(){
- spyOn(this.view, "removeMembership");
+ it('marks the aspect as unselected', function(){
this.oldAspect.trigger('click');
+ jasmine.Ajax.requests.mostRecent().respondWith(resp_success);
- expect(this.view.removeMembership).toHaveBeenCalledWith(this.oldMembershipId);
+ expect(this.oldAspect.attr('class')).not.toContain('selected');
});
- it('tries to destroy an AspectMembership', function() {
- spyOn(app.models.AspectMembership.prototype, "destroy");
- this.view.removeMembership(1);
+ it('displays a flash message when removed from last aspect', function() {
+ spec.content().find('li.selected:last').removeClass('selected');
+ this.oldAspect.trigger('click');
+ jasmine.Ajax.requests.mostRecent().respondWith(resp_success);
- expect(app.models.AspectMembership.prototype.destroy).toHaveBeenCalled();
+ expect($('[id^="flash"]')).toBeSuccessFlashMessage(
+ Diaspora.I18n.t('aspect_dropdown.stopped_sharing_with', {name: this.person_name})
+ );
});
it('displays an error when it fails', function() {
- spyOn(this.view, "_displayError");
- spyOn(app.models.AspectMembership.prototype, "destroy").andCallFake(function() {
- this.trigger('error');
- });
-
- this.view.removeMembership(1);
+ this.oldAspect.trigger('click');
+ jasmine.Ajax.requests.mostRecent().respondWith(resp_fail);
- expect(this.view._displayError).toHaveBeenCalledWith('aspect_dropdown.error_remove');
+ expect($('[id^="flash"]')).toBeErrorFlashMessage(
+ Diaspora.I18n.t('aspect_dropdown.error_remove', {name: this.person_name})
+ );
});
});
- context('updateSummary', function() {
+ context('button summary text', function() {
beforeEach(function() {
this.Aspect = $('li:eq(0)');
});
diff --git a/spec/javascripts/app/views/aspect_view_spec.js b/spec/javascripts/app/views/aspect_view_spec.js
index 40839c922..9f3a98cb1 100644
--- a/spec/javascripts/app/views/aspect_view_spec.js
+++ b/spec/javascripts/app/views/aspect_view_spec.js
@@ -1,6 +1,6 @@
describe("app.views.Aspect", function(){
beforeEach(function(){
- this.aspect = new app.models.Aspect({ name: 'Acquaintances', selected: true });
+ this.aspect = factory.aspect({selected:true});
this.view = new app.views.Aspect({ model: this.aspect });
});
@@ -10,25 +10,24 @@ describe("app.views.Aspect", function(){
});
it('should show the aspect selected', function(){
- expect(this.view.$el.children('.icons-check_yes_ok').hasClass('selected')).toBeTruthy();
+ expect(this.view.$el.children('.entypo.check').hasClass('selected')).toBeTruthy();
});
it('should show the name of the aspect', function(){
- expect(this.view.$el.children('a.selectable').text()).toMatch('Acquaintances');
+ expect(this.view.$el.children('a.selectable').text()).toMatch(this.aspect.get('name'));
});
describe('selecting aspects', function(){
beforeEach(function(){
app.router = new app.Router();
spyOn(app.router, 'aspects_stream');
- spyOn(this.view, 'toggleAspect').andCallThrough();
+ spyOn(this.view, 'toggleAspect').and.callThrough();
this.view.delegateEvents();
});
it('it should deselect the aspect', function(){
this.view.$el.children('a.selectable').trigger('click');
expect(this.view.toggleAspect).toHaveBeenCalled();
- expect(this.view.$el.children('.icons-check_yes_ok').hasClass('selected')).toBeFalsy();
expect(app.router.aspects_stream).toHaveBeenCalled();
});
diff --git a/spec/javascripts/app/views/aspects_dropdown_view_spec.js b/spec/javascripts/app/views/aspects_dropdown_view_spec.js
index 6c017ccd5..a3b7238de 100644
--- a/spec/javascripts/app/views/aspects_dropdown_view_spec.js
+++ b/spec/javascripts/app/views/aspects_dropdown_view_spec.js
@@ -1,6 +1,15 @@
describe("app.views.AspectsDropdown", function(){
beforeEach(function() {
spec.loadFixture("bookmarklet");
+ Diaspora.I18n.reset({
+ 'aspect_dropdown': {
+ 'select_aspects': "Select aspects",
+ 'all_aspects': "All aspects",
+ 'toggle': {
+ 'zero': "Select aspects",
+ 'one': "In <%= count %> aspect",
+ 'other': "In <%= count %> aspects"
+ }}});
this.view = new app.views.AspectsDropdown({el: $('.aspect_dropdown')});
});
@@ -69,7 +78,7 @@ describe("app.views.AspectsDropdown", function(){
expect(this.view.$('li.aspect_selector:eq(1)').hasClass('selected')).toBeTruthy();
});
});
-
+
context('_updateButton', function() {
beforeEach(function() {
this.view.$('li.selected').removeClass('selected');
diff --git a/spec/javascripts/app/views/aspects_list_view_spec.js b/spec/javascripts/app/views/aspects_list_view_spec.js
index 81bc7b19f..5a0ded38d 100644
--- a/spec/javascripts/app/views/aspects_list_view_spec.js
+++ b/spec/javascripts/app/views/aspects_list_view_spec.js
@@ -24,8 +24,8 @@ describe("app.views.AspectsList", function(){
});
it('should show all the aspects', function(){
- var aspect_selectors = this.view.$('.icons-check_yes_ok + a.selectable');
- expect(aspect_selectors.length).toBe(3)
+ var aspect_selectors = this.view.$('.entypo.check + a.selectable');
+ expect(aspect_selectors.length).toBe(3);
expect(aspect_selectors[0].text).toMatch('Work');
expect(aspect_selectors[1].text).toMatch('Friends');
expect(aspect_selectors[2].text).toMatch('Acquaintances');
@@ -40,15 +40,14 @@ describe("app.views.AspectsList", function(){
beforeEach(function(){
app.router = new app.Router();
spyOn(app.router, 'aspects_stream');
- spyOn(this.view, 'toggleAll').andCallThrough();
- spyOn(this.view, 'toggleSelector').andCallThrough();
+ spyOn(this.view, 'toggleAll').and.callThrough();
+ spyOn(this.view, 'toggleSelector').and.callThrough();
this.view.delegateEvents();
this.view.$('.toggle_selector').click();
});
it('should show all the aspects selected', function(){
expect(this.view.toggleAll).toHaveBeenCalled();
- expect(this.view.$('.selected').length).toBe(3);
});
it('should show \'Deselect all\' link', function(){
diff --git a/spec/javascripts/app/views/bookmarklet_view_spec.js b/spec/javascripts/app/views/bookmarklet_view_spec.js
index 24015c68e..57296ad3b 100644
--- a/spec/javascripts/app/views/bookmarklet_view_spec.js
+++ b/spec/javascripts/app/views/bookmarklet_view_spec.js
@@ -49,12 +49,12 @@ describe('app.views.Bookmarklet', function() {
});
it('keeps the publisher disabled after successful post creation', function() {
- jasmine.Ajax.useMock();
+ jasmine.Ajax.install();
init_bookmarklet(test_data);
spec.content().find('form').submit();
- mostRecentAjaxRequest().response({
+ jasmine.Ajax.requests.mostRecent().respondWith({
status: 200, // success!
responseText: "{}"
});
diff --git a/spec/javascripts/app/views/comment_stream_view_spec.js b/spec/javascripts/app/views/comment_stream_view_spec.js
index 38948d294..c9abb16f9 100644
--- a/spec/javascripts/app/views/comment_stream_view_spec.js
+++ b/spec/javascripts/app/views/comment_stream_view_spec.js
@@ -15,23 +15,22 @@ describe("app.views.CommentStream", function(){
describe("postRenderTemplate", function(){
it("applies infield labels", function(){
- spyOn($.fn, "placeholder")
- this.view.postRenderTemplate()
- expect($.fn.placeholder).toHaveBeenCalled()
- expect($.fn.placeholder.mostRecentCall.object.selector).toBe("textarea")
+ spyOn($.fn, "placeholder");
+ this.view.postRenderTemplate();
+ expect($.fn.placeholder).toHaveBeenCalled();
+ expect($.fn.placeholder.calls.mostRecent().object.selector).toBe("textarea");
});
it("autoResizes the new comment textarea", function(){
- spyOn($.fn, "autoResize")
- this.view.postRenderTemplate()
- expect($.fn.autoResize).toHaveBeenCalled()
- expect($.fn.autoResize.mostRecentCall.object.selector).toBe("textarea")
+ spyOn($.fn, "autoResize");
+ this.view.postRenderTemplate();
+ expect($.fn.autoResize).toHaveBeenCalled();
+ expect($.fn.autoResize.calls.mostRecent().object.selector).toBe("textarea");
});
});
describe("createComment", function() {
beforeEach(function() {
- jasmine.Ajax.useMock();
this.view.render();
this.view.expandComments();
});
@@ -41,25 +40,23 @@ describe("app.views.CommentStream", function(){
this.view.$(".comment_box").val('a new comment');
this.view.createComment();
- this.request = mostRecentAjaxRequest();
+ this.request = jasmine.Ajax.requests.mostRecent();
});
it("fires an AJAX request", function() {
- params = JSON.parse(this.request.params);
- // TODO: use this, once jasmine-ajax is updated to latest version
- //params = this.request.data();
+ var params = this.request.data();
expect(params.text).toEqual("a new comment");
});
it("adds the comment to the view", function() {
- this.request.response({status: 200, responseText: '[]'});
+ this.request.respondWith({status: 200, responseText: '[]'});
expect(this.view.$(".comment-content p").text()).toEqual("a new comment");
});
it("doesn't add the comment to the view, when the request fails", function(){
Diaspora.I18n.load({failed_to_post_message: "posting failed!"});
- this.request.response({status: 500});
+ this.request.respondWith({status: 500});
expect(this.view.$(".comment-content p").text()).not.toEqual("a new comment");
expect($('*[id^="flash"]')).toBeErrorFlashMessage("posting failed!");
@@ -90,28 +87,27 @@ describe("app.views.CommentStream", function(){
describe("expandComments", function() {
it("refills the comment textbox on success", function() {
- jasmine.Ajax.useMock();
-
this.view.render();
-
this.view.$("textarea").val("great post!");
-
this.view.expandComments();
- mostRecentAjaxRequest().response({
- status: 200,
- responseText: JSON.stringify([factory.comment()])
- });
+ jasmine.Ajax.requests.mostRecent().respondWith({ comments : [] });
expect(this.view.$("textarea").val()).toEqual("great post!");
});
});
describe("pressing a key when typing on the new comment box", function(){
+ var submitCallback;
+
+ beforeEach(function() {
+ submitCallback = jasmine.createSpy().and.returnValue(false);
+ });
+
it("should not submit the form when enter key is pressed", function(){
this.view.render();
- var form = this.view.$("form")
- var submitCallback = jasmine.createSpy().andReturn(false);form.submit(submitCallback);
+ var form = this.view.$("form");
+ form.submit(submitCallback);
var e = $.Event("keydown", { keyCode: 13 });
e.shiftKey = false;
@@ -122,8 +118,7 @@ describe("app.views.CommentStream", function(){
it("should submit the form when enter is pressed with ctrl", function(){
this.view.render();
- var form = this.view.$("form")
- var submitCallback = jasmine.createSpy().andReturn(false);
+ var form = this.view.$("form");
form.submit(submitCallback);
var e = $.Event("keydown", { keyCode: 13 });
diff --git a/spec/javascripts/app/views/comment_view_spec.js b/spec/javascripts/app/views/comment_view_spec.js
index 2b1676b9d..fc5a633cf 100644
--- a/spec/javascripts/app/views/comment_view_spec.js
+++ b/spec/javascripts/app/views/comment_view_spec.js
@@ -1,75 +1,75 @@
describe("app.views.Comment", function(){
beforeEach(function(){
- this.post = factory.post({author : {diaspora_id : "xxx@xxx.xxx"}})
- this.comment = factory.comment({parent : this.post.toJSON()})
- this.view = new app.views.Comment({model : this.comment})
- })
+ this.post = factory.post({author : {diaspora_id : "xxx@xxx.xxx"}});
+ this.comment = factory.comment({parent : this.post.toJSON()});
+ this.view = new app.views.Comment({model : this.comment});
+ });
describe("render", function(){
it("has a delete link if the author is the current user", function(){
- loginAs(this.comment.get("author"))
- expect(this.view.render().$('.delete').length).toBe(1)
- })
+ loginAs(this.comment.get("author"));
+ expect(this.view.render().$('.delete').length).toBe(1);
+ });
it("doesn't have a delete link if the author is not the current user", function(){
- loginAs(factory.author({diaspora_id : "notbob@bob.com"}))
- expect(this.view.render().$('.delete').length).toBe(0)
- })
+ loginAs(factory.author({diaspora_id : "notbob@bob.com"}));
+ expect(this.view.render().$('.delete').length).toBe(0);
+ });
it("doesn't have a delete link if the user is logged out", function(){
- logout()
- expect(this.view.render().$('.delete').length).toBe(0)
- })
- })
+ logout();
+ expect(this.view.render().$('.delete').length).toBe(0);
+ });
+ });
describe("ownComment", function(){
it("returns true if the author diaspora_id == the current user's diaspora_id", function(){
- loginAs(this.comment.get("author"))
- expect(this.view.ownComment()).toBe(true)
- })
+ loginAs(this.comment.get("author"));
+ expect(this.view.ownComment()).toBe(true);
+ });
it("returns false if the author diaspora_id != the current user's diaspora_id", function(){
- loginAs(factory.author({diaspora_id : "notbob@bob.com"}))
+ loginAs(factory.author({diaspora_id : "notbob@bob.com"}));
expect(this.view.ownComment()).toBe(false);
- })
- })
+ });
+ });
describe("postOwner", function(){
it("returns true if the author diaspora_id == the current user's diaspora_id", function(){
- loginAs(this.post.get("author"))
- expect(this.view.postOwner()).toBe(true)
- })
+ loginAs(this.post.get("author"));
+ expect(this.view.postOwner()).toBe(true);
+ });
it("returns false if the author diaspora_id != the current user's diaspora_id", function(){
- loginAs(factory.author({diaspora_id : "notbob@bob.com"}))
+ loginAs(factory.author({diaspora_id : "notbob@bob.com"}));
expect(this.view.postOwner()).toBe(false);
- })
- })
+ });
+ });
describe("canRemove", function(){
context("is truthy", function(){
it("when ownComment is true", function(){
- spyOn(this.view, "ownComment").andReturn(true)
- spyOn(this.view, "postOwner").andReturn(false)
+ spyOn(this.view, "ownComment").and.returnValue(true);
+ spyOn(this.view, "postOwner").and.returnValue(false);
- expect(this.view.canRemove()).toBe(true)
- })
+ expect(this.view.canRemove()).toBe(true);
+ });
it("when postOwner is true", function(){
- spyOn(this.view, "postOwner").andReturn(true)
- spyOn(this.view, "ownComment").andReturn(false)
+ spyOn(this.view, "postOwner").and.returnValue(true);
+ spyOn(this.view, "ownComment").and.returnValue(false);
- expect(this.view.canRemove()).toBe(true)
- })
- })
+ expect(this.view.canRemove()).toBe(true);
+ });
+ });
context("is falsy", function(){
it("when postOwner and ownComment are both false", function(){
- spyOn(this.view, "postOwner").andReturn(false)
- spyOn(this.view, "ownComment").andReturn(false)
+ spyOn(this.view, "postOwner").and.returnValue(false);
+ spyOn(this.view, "ownComment").and.returnValue(false);
- expect(this.view.canRemove()).toBe(false)
- })
- })
- })
-})
+ expect(this.view.canRemove()).toBe(false);
+ });
+ });
+ });
+});
diff --git a/spec/javascripts/app/views/contact_stream_view_spec.js b/spec/javascripts/app/views/contact_stream_view_spec.js
new file mode 100644
index 000000000..955dd2e7b
--- /dev/null
+++ b/spec/javascripts/app/views/contact_stream_view_spec.js
@@ -0,0 +1,77 @@
+describe("app.views.ContactStream", function() {
+ beforeEach(function() {
+ loginAs({name: "alice", avatar : {small : "http://avatar.com/photo.jpg"}});
+ spec.loadFixture("aspects_manage");
+ this.contacts = new app.collections.Contacts($.parseJSON(spec.readFixture("contacts_json")));
+ app.aspect = new app.models.Aspect(this.contacts.first().get('aspect_memberships')[0].aspect);
+ this.view = new app.views.ContactStream({
+ collection : this.contacts,
+ el: $('.stream.contacts #contact_stream')
+ });
+
+ this.view.perPage=1;
+
+ //clean the page
+ this.view.$el.html('');
+ });
+
+ describe("initialize", function() {
+ it("binds an infinite scroll listener", function() {
+ spyOn($.fn, "scroll");
+ new app.views.ContactStream({collection : this.contacts});
+ expect($.fn.scroll).toHaveBeenCalled();
+ });
+ });
+
+ describe("search", function() {
+ it("filters the contacts", function() {
+ this.view.render();
+ expect(this.view.$el.html()).toContain("alice");
+ this.view.search("eve");
+ expect(this.view.$el.html()).not.toContain("alice");
+ expect(this.view.$el.html()).toContain("eve");
+ });
+ });
+
+ describe("infScroll", function() {
+ beforeEach(function() {
+ this.view.off("renderContacts");
+ this.fn = jasmine.createSpy();
+ this.view.on("renderContacts", this.fn);
+ spyOn($.fn, "height").and.returnValue(0);
+ spyOn($.fn, "scrollTop").and.returnValue(100);
+ });
+
+ it("triggers renderContacts when the user is at the bottom of the page", function() {
+ this.view.infScroll();
+ expect(this.fn).toHaveBeenCalled();
+ });
+ });
+
+ describe("render", function() {
+ beforeEach(function() {
+ spyOn(this.view, "renderContacts");
+ });
+
+ it("calls renderContacts", function() {
+ this.view.render();
+ expect(this.view.renderContacts).toHaveBeenCalled();
+ });
+ });
+
+ describe("renderContacts", function() {
+ beforeEach(function() {
+ this.view.off("renderContacts");
+ this.view.renderContacts();
+ });
+
+ it("renders perPage contacts", function() {
+ expect(this.view.$el.find('.stream_element.contact').length).toBe(1);
+ });
+
+ it("renders more contacts when called a second time", function() {
+ this.view.renderContacts();
+ expect(this.view.$el.find('.stream_element.contact').length).toBe(2);
+ });
+ });
+});
diff --git a/spec/javascripts/app/views/contact_view_spec.js b/spec/javascripts/app/views/contact_view_spec.js
new file mode 100644
index 000000000..b1d400ed1
--- /dev/null
+++ b/spec/javascripts/app/views/contact_view_spec.js
@@ -0,0 +1,136 @@
+describe("app.views.Contact", function(){
+ beforeEach(function() {
+ this.aspect1 = factory.aspect({id: 1});
+ this.aspect2 = factory.aspect({id: 2});
+
+ this.model = new app.models.Contact({
+ person_id: 42,
+ person: { id: 42, name: 'alice' },
+ aspect_memberships: [{id: 23, aspect: this.aspect1}]
+ });
+ this.view = new app.views.Contact({ model: this.model });
+ Diaspora.I18n.load({
+ contacts: {
+ add_contact: "Add contact",
+ remove_contact: "Remove contact",
+ error_add: "Couldn't add <%= name %> to the aspect :(",
+ error_remove: "Couldn't remove <%= name %> from the aspect :("
+ }
+ });
+ });
+
+ context("#presenter", function() {
+ it("contains necessary elements", function() {
+ app.aspect = this.aspect1;
+ expect(this.view.presenter()).toEqual(jasmine.objectContaining({
+ person_id: 42,
+ person: jasmine.objectContaining({id: 42, name: 'alice'}),
+ in_aspect: 'in_aspect'
+ }));
+ });
+ });
+
+ context('add contact to aspect', function() {
+ beforeEach(function() {
+ app.aspect = this.aspect2;
+ this.view.render();
+ this.button = this.view.$el.find('.contact_add-to-aspect');
+ this.contact = this.view.$el.find('.stream_element.contact');
+ this.aspect_membership = {id: 42, aspect: app.aspect.toJSON()};
+ this.response = JSON.stringify(this.aspect_membership);
+ });
+
+ it('sends a correct ajax request', function() {
+ this.button.trigger('click');
+ var obj = $.parseJSON(jasmine.Ajax.requests.mostRecent().params);
+ expect(obj.person_id).toBe(this.model.get('person_id'));
+ expect(obj.aspect_id).toBe(app.aspect.get('id'));
+ });
+
+ it('adds a aspect_membership to the contact', function() {
+ expect(this.model.aspect_memberships.length).toBe(1);
+ $('.contact_add-to-aspect',this.contact).trigger('click');
+ jasmine.Ajax.requests.mostRecent().respondWith({
+ status: 200, // success
+ responseText: this.response
+ });
+ expect(this.model.aspect_memberships.length).toBe(2);
+ });
+
+ it('calls render', function() {
+ spyOn(this.view, 'render');
+ $('.contact_add-to-aspect',this.contact).trigger('click');
+ jasmine.Ajax.requests.mostRecent().respondWith({
+ status: 200, // success
+ responseText: this.response
+ });
+ expect(this.view.render).toHaveBeenCalled();
+ });
+
+
+ it('displays a flash message on errors', function(){
+ $('.contact_add-to-aspect',this.contact).trigger('click');
+ jasmine.Ajax.requests.mostRecent().respondWith({
+ status: 400, // fail
+ });
+ expect($('[id^="flash"]')).toBeErrorFlashMessage(
+ Diaspora.I18n.t(
+ 'contacts.error_add',
+ {name: this.model.get('person').name}
+ )
+ );
+ });
+ });
+
+ context('remove contact from aspect', function() {
+ beforeEach(function() {
+ app.aspect = this.aspect1;
+ this.view.render();
+ this.button = this.view.$el.find('.contact_remove-from-aspect');
+ this.contact = this.view.$el.find('.stream_element.contact');
+ this.aspect_membership = this.model.aspect_memberships.first().toJSON();
+ this.response = JSON.stringify(this.aspect_membership);
+ });
+
+ it('sends a correct ajax request', function() {
+ $('.contact_remove-from-aspect',this.contact).trigger('click');
+ expect(jasmine.Ajax.requests.mostRecent().url).toBe(
+ "/aspect_memberships/"+this.aspect_membership.id
+ );
+ });
+
+ it('removes the aspect_membership from the contact', function() {
+ expect(this.model.aspect_memberships.length).toBe(1);
+ $('.contact_remove-from-aspect',this.contact).trigger('click');
+ jasmine.Ajax.requests.mostRecent().respondWith({
+ status: 200, // success
+ responseText: this.response
+ });
+ expect(this.model.aspect_memberships.length).toBe(0);
+ });
+
+ it('calls render', function() {
+ spyOn(this.view, 'render');
+ $('.contact_remove-from-aspect',this.contact).trigger('click');
+ jasmine.Ajax.requests.mostRecent().respondWith({
+ status: 200, // success
+ responseText: this.response,
+ });
+ expect(this.view.render).toHaveBeenCalled();
+ });
+
+ it('displays a flash message on errors', function(){
+ $('.contact_remove-from-aspect',this.contact).trigger('click');
+ jasmine.Ajax.requests.mostRecent().respondWith({
+ status: 400, // fail
+ });
+ expect($('[id^="flash"]')).toBeErrorFlashMessage(
+ Diaspora.I18n.t(
+ 'contacts.error_remove',
+ {name: this.model.get('person').name}
+ )
+ );
+ });
+ });
+
+});
diff --git a/spec/javascripts/app/views/content_view_spec.js b/spec/javascripts/app/views/content_view_spec.js
index d7a4442d6..8f42a247f 100644
--- a/spec/javascripts/app/views/content_view_spec.js
+++ b/spec/javascripts/app/views/content_view_spec.js
@@ -1,15 +1,13 @@
describe("app.views.Content", function(){
beforeEach(function(){
this.post = new app.models.StatusMessage();
- this.view = new app.views.Content({model : this.post})
+ this.view = new app.views.Content({model : this.post});
});
describe("rendering", function(){
-
it("should return all but the first photo from the post", function() {
- this.post.set({photos : [1,2]}) // set 2 Photos
- expect(this.view.smallPhotos().length).toEqual(1)
+ this.post.set({photos : [1,2]}); // set 2 Photos
+ expect(this.view.smallPhotos().length).toEqual(1);
});
-
});
-}); \ No newline at end of file
+});
diff --git a/spec/javascripts/app/views/conversations_view_spec.js b/spec/javascripts/app/views/conversations_view_spec.js
new file mode 100644
index 000000000..c0346cd73
--- /dev/null
+++ b/spec/javascripts/app/views/conversations_view_spec.js
@@ -0,0 +1,54 @@
+describe("app.views.Conversations", function(){
+ describe('setupConversation', function() {
+ context('for unread conversations', function() {
+ beforeEach(function() {
+ spec.loadFixture('conversations_unread');
+ });
+
+ it('removes the unread class from the conversation', function() {
+ expect($('.conversation-wrapper > .conversation.selected')).toHaveClass('unread');
+ new app.views.Conversations();
+ expect($('.conversation-wrapper > .conversation.selected')).not.toHaveClass('unread');
+ });
+
+ it('removes the unread message counter from the conversation', function() {
+ expect($('.conversation-wrapper > .conversation.selected .unread_message_count').length).toEqual(1);
+ new app.views.Conversations();
+ expect($('.conversation-wrapper > .conversation.selected .unread_message_count').length).toEqual(0);
+ });
+
+ it('decreases the unread message count in the header', function() {
+ var badge = '<div id="conversations_badge"><div class="badge_count">3</div></div>';
+ $('header').append(badge);
+ expect($('#conversations_badge .badge_count').text().trim()).toEqual('3');
+ expect($('.conversation-wrapper > .conversation.selected .unread_message_count').text().trim()).toEqual('2');
+ new app.views.Conversations();
+ expect($('#conversations_badge .badge_count').text().trim()).toEqual('1');
+ });
+
+ it('removes the badge_count in the header if there are no unread messages left', function() {
+ var badge = '<div id="conversations_badge"><div class="badge_count">2</div></div>';
+ $('header').append(badge);
+ expect($('#conversations_badge .badge_count').text().trim()).toEqual('2');
+ expect($('.conversation-wrapper > .conversation.selected .unread_message_count').text().trim()).toEqual('2');
+ new app.views.Conversations();
+ expect($('#conversations_badge .badge_count').text().trim()).toEqual('0');
+ expect($('#conversations_badge .badge_count')).toHaveClass('hidden');
+ });
+ });
+
+ context('for read conversations', function() {
+ beforeEach(function() {
+ spec.loadFixture('conversations_read');
+ });
+
+ it('does not change the badge_count in the header', function() {
+ var badge = '<div id="conversations_badge"><div class="badge_count">3</div></div>';
+ $('header').append(badge);
+ expect($('#conversations_badge .badge_count').text().trim()).toEqual('3');
+ new app.views.Conversations();
+ expect($('#conversations_badge .badge_count').text().trim()).toEqual('3');
+ });
+ });
+ });
+});
diff --git a/spec/javascripts/app/views/feedback_view_spec.js b/spec/javascripts/app/views/feedback_view_spec.js
index a8e57d8af..cc6b5da35 100644
--- a/spec/javascripts/app/views/feedback_view_spec.js
+++ b/spec/javascripts/app/views/feedback_view_spec.js
@@ -1,13 +1,14 @@
describe("app.views.Feedback", function(){
beforeEach(function(){
- loginAs({id : -1, name: "alice", avatar : {small : "http://avatar.com/photo.jpg"}});
+ this.userAttrs = _.extend(factory.userAttrs(), {guid : -1});
+ loginAs(this.userAttrs);
Diaspora.I18n.load({stream : {
'like' : "Like",
'unlike' : "Unlike",
'public' : "Public",
'limited' : "Limted"
- }})
+ }});
var posts = $.parseJSON(spec.readFixture("stream_json"));
@@ -18,130 +19,128 @@ describe("app.views.Feedback", function(){
describe("triggers", function() {
it('re-renders when the model triggers feedback', function(){
- spyOn(this.view, "postRenderTemplate")
- this.view.model.interactions.trigger("change")
- expect(this.view.postRenderTemplate).toHaveBeenCalled()
- })
- })
+ spyOn(this.view, "postRenderTemplate");
+ this.view.model.interactions.trigger("change");
+ expect(this.view.postRenderTemplate).toHaveBeenCalled();
+ });
+ });
describe(".render", function(){
beforeEach(function(){
- this.link = function(){ return this.view.$("a.like"); }
+ this.link = function(){ return this.view.$("a.like"); };
this.view.render();
- })
+ });
context("likes", function(){
it("calls 'toggleLike' on the target post", function(){
- loginAs(this.post.interactions.likes.models[0].get("author"))
+ loginAs(this.post.interactions.likes.models[0].get("author"));
this.view.render();
spyOn(this.post.interactions, "toggleLike");
this.link().click();
expect(this.post.interactions.toggleLike).toHaveBeenCalled();
- })
+ });
context("when the user likes the post", function(){
it("the like action should be 'Unlike'", function(){
- spyOn(this.post.interactions, "userLike").andReturn(factory.like());
- this.view.render()
- expect(this.link().text()).toContain(Diaspora.I18n.t('stream.unlike'))
- })
- })
+ spyOn(this.post.interactions, "userLike").and.returnValue(factory.like());
+ this.view.render();
+ expect(this.link().text()).toContain(Diaspora.I18n.t('stream.unlike'));
+ });
+ });
context("when the user doesn't yet like the post", function(){
beforeEach(function(){
this.view.model.set({user_like : null});
this.view.render();
- })
+ });
it("the like action should be 'Like'", function(){
- expect(this.link().text()).toContain(Diaspora.I18n.t('stream.like'))
- })
+ expect(this.link().text()).toContain(Diaspora.I18n.t("stream.like"));
+ });
it("allows for unliking a just-liked post", function(){
- // callback stuff.... we should fix this
-
- // expect(this.link().text()).toContain(Diaspora.I18n.t('stream.like'))
-
- // this.link().click();
- // expect(this.link().text()).toContain(Diaspora.I18n.t('stream.unlike'))
-
- // this.link().click();
- // expect(this.link().text()).toContain(Diaspora.I18n.t('stream.like'))
- })
- })
- })
+ var responseText = JSON.stringify({"author": this.userAttrs});
+ var ajax_success = { status: 201, responseText: responseText };
+ expect(this.link().text()).toContain(Diaspora.I18n.t("stream.like"));
+ this.link().click();
+ jasmine.Ajax.requests.mostRecent().respondWith(ajax_success);
+ expect(this.link().text()).toContain(Diaspora.I18n.t("stream.unlike"));
+ this.link().click();
+ expect(this.link().text()).toContain(Diaspora.I18n.t("stream.like"));
+ });
+ });
+ });
context("when the post is public", function(){
beforeEach(function(){
this.post.attributes.public = true;
this.view.render();
- })
+ });
it("shows 'Public'", function(){
- expect($(this.view.el).html()).toContain(Diaspora.I18n.t('stream.public'))
- })
+ expect($(this.view.el).html()).toContain(Diaspora.I18n.t('stream.public'));
+ });
it("shows a reshare_action link", function(){
- expect(this.view.$("a.reshare")).toExist()
+ expect(this.view.$("a.reshare")).toExist();
});
it("does not show a reshare_action link if the original post has been deleted", function(){
- this.post.set({post_type : "Reshare", root : null})
+ this.post.set({post_type : "Reshare", root : null});
this.view.render();
- expect(this.view.$("a.reshare")).not.toExist()
- })
- })
+ expect(this.view.$("a.reshare")).not.toExist();
+ });
+ });
context("when the post is not public", function(){
beforeEach(function(){
this.post.attributes.public = false;
this.post.attributes.root = {author : {name : "susan"}};
this.view.render();
- })
+ });
it("shows 'Limited'", function(){
- expect($(this.view.el).html()).toContain(Diaspora.I18n.t('stream.limited'))
- })
+ expect($(this.view.el).html()).toContain(Diaspora.I18n.t('stream.limited'));
+ });
it("does not show a reshare_action link", function(){
- expect(this.view.$("a.reshare")).not.toExist()
+ expect(this.view.$("a.reshare")).not.toExist();
});
- })
+ });
context("when the current user owns the post", function(){
beforeEach(function(){
this.post.attributes.author = app.currentUser;
this.view.render();
- })
+ });
it("does not display a reshare_action link", function(){
- this.post.attributes.public = false
+ this.post.attributes.public = false;
this.view.render();
- expect(this.view.$("a.reshare")).not.toExist()
- })
- })
- })
+ expect(this.view.$("a.reshare")).not.toExist();
+ });
+ });
+ });
describe("resharePost", function(){
beforeEach(function(){
- this.post.attributes.public = true
+ this.post.attributes.public = true;
this.post.attributes.root = {author : {name : "susan"}};
this.view.render();
- })
+ });
it("displays a confirmation dialog", function(){
- spyOn(window, "confirm")
+ spyOn(window, "confirm");
this.view.$("a.reshare").first().click();
expect(window.confirm).toHaveBeenCalled();
- })
+ });
it("reshares the model", function(){
- spyOn(window, "confirm").andReturn(true);
- spyOn(this.view.model.reshare(), "save").andReturn(new $.Deferred)
+ spyOn(window, "confirm").and.returnValue(true);
+ spyOn(this.view.model.reshare(), "save").and.returnValue(new $.Deferred());
this.view.$("a.reshare").first().click();
expect(this.view.model.reshare().save).toHaveBeenCalled();
- })
- })
-})
-
+ });
+ });
+});
diff --git a/spec/javascripts/app/views/header_view_spec.js b/spec/javascripts/app/views/header_view_spec.js
index 3b8d76ca0..384c92a59 100644
--- a/spec/javascripts/app/views/header_view_spec.js
+++ b/spec/javascripts/app/views/header_view_spec.js
@@ -1,6 +1,6 @@
describe("app.views.Header", function() {
beforeEach(function() {
- this.userAttrs = {name: "alice", avatar : {small : "http://avatar.com/photo.jpg"}}
+ this.userAttrs = {name: "alice", avatar : {small : "http://avatar.com/photo.jpg"}};
loginAs(this.userAttrs);
@@ -11,63 +11,63 @@ describe("app.views.Header", function() {
describe("render", function(){
context("notifications badge", function(){
it("displays a count when the current user has a notification", function(){
- loginAs(_.extend(this.userAttrs, {notifications_count : 1}))
+ loginAs(_.extend(this.userAttrs, {notifications_count : 1}));
this.view.render();
expect(this.view.$("#notification_badge .badge_count").hasClass('hidden')).toBe(false);
expect(this.view.$("#notification_badge .badge_count").text()).toContain("1");
- })
+ });
it("does not display a count when the current user has a notification", function(){
- loginAs(_.extend(this.userAttrs, {notifications_count : 0}))
+ loginAs(_.extend(this.userAttrs, {notifications_count : 0}));
this.view.render();
expect(this.view.$("#notification_badge .badge_count").hasClass('hidden')).toBe(true);
- })
- })
+ });
+ });
context("conversations badge", function(){
it("displays a count when the current user has a notification", function(){
- loginAs(_.extend(this.userAttrs, {unread_messages_count : 1}))
+ loginAs(_.extend(this.userAttrs, {unread_messages_count : 1}));
this.view.render();
expect(this.view.$("#conversations_badge .badge_count").hasClass('hidden')).toBe(false);
expect(this.view.$("#conversations_badge .badge_count").text()).toContain("1");
- })
+ });
it("does not display a count when the current user has a notification", function(){
- loginAs(_.extend(this.userAttrs, {unread_messages_count : 0}))
+ loginAs(_.extend(this.userAttrs, {unread_messages_count : 0}));
this.view.render();
expect(this.view.$("#conversations_badge .badge_count").hasClass('hidden')).toBe(true);
- })
- })
+ });
+ });
context("admin link", function(){
it("displays if the current user is an admin", function(){
- loginAs(_.extend(this.userAttrs, {admin : true}))
+ loginAs(_.extend(this.userAttrs, {admin : true}));
this.view.render();
expect(this.view.$("#user_menu").html()).toContain("/admins");
- })
+ });
it("does not display if the current user is not an admin", function(){
- loginAs(_.extend(this.userAttrs, {admin : false}))
+ loginAs(_.extend(this.userAttrs, {admin : false}));
this.view.render();
expect(this.view.$("#user_menu").html()).not.toContain("/admins");
- })
- })
- })
+ });
+ });
+ });
- describe("#toggleDropdown", function() {
+ describe("#toggleUserDropdown", function() {
it("adds the class 'active'", function() {
expect(this.view.$(".dropdown")).not.toHaveClass("active");
- this.view.toggleDropdown($.Event());
+ this.view.toggleUserDropdown($.Event());
expect(this.view.$(".dropdown")).toHaveClass("active");
});
});
- describe("#hideDropdown", function() {
+ describe("#hideUserDropdown", function() {
it("removes the class 'active' if the user clicks anywhere that isn't the menu element", function() {
- this.view.toggleDropdown($.Event());
+ this.view.toggleUserDropdown($.Event());
expect(this.view.$(".dropdown")).toHaveClass("active");
- this.view.hideDropdown($.Event());
+ this.view.hideUserDropdown($.Event());
expect(this.view.$(".dropdown")).not.toHaveClass("active");
});
});
@@ -82,20 +82,23 @@ describe("app.views.Header", function() {
});
describe("focus", function() {
- it("adds the class 'active' when the user focuses the text field", function() {
+ beforeEach(function(done){
input.trigger('focusin');
- waitsFor(function() {
- return input.is('.active');
- });
- runs(function() {
- expect(input).toHaveClass("active");
- });
+ done();
+ });
+
+ it("adds the class 'active' when the user focuses the text field", function() {
+ expect(input).toHaveClass("active");
});
});
describe("blur", function() {
- it("removes the class 'active' when the user blurs the text field", function() {
+ beforeEach(function(done) {
input.trigger('focusin').trigger('focusout');
+ done();
+ });
+
+ it("removes the class 'active' when the user blurs the text field", function() {
expect(input).not.toHaveClass("active");
});
});
diff --git a/spec/javascripts/app/views/help_view_spec.js b/spec/javascripts/app/views/help_view_spec.js
index 46e78bc03..7a2555a3f 100644
--- a/spec/javascripts/app/views/help_view_spec.js
+++ b/spec/javascripts/app/views/help_view_spec.js
@@ -14,7 +14,7 @@ describe("app.views.Help", function(){
});
it('should initially show getting help section', function(){
- expect(this.view.$el.find('#faq').children().first().data('template') == 'faq_getting_help').toBeTruthy();
+ expect(this.view.$el.find('#faq').children().first().data('template')).toBe('faq_getting_help');
});
it('should show account and data management section', function(){
@@ -39,7 +39,7 @@ describe("app.views.Help", function(){
it('should show posts and posting section', function(){
this.view.$el.find('a[data-section=posts_and_posting]').trigger('click');
- expect(this.view.$el.find('#faq').children().first().data('template') == 'faq_posts_and_posting').toBeTruthy();
+ expect(this.view.$el.find('#faq').children().first().data('template')).toBe('faq_posts_and_posting');
});
it('should show private posts section', function(){
@@ -69,17 +69,17 @@ describe("app.views.Help", function(){
it('should show sharing section', function(){
this.view.$el.find('a[data-section=sharing]').trigger('click');
- expect(this.view.$el.find('#faq').children().first().data('template') == 'faq_sharing').toBeTruthy();
+ expect(this.view.$el.find('#faq').children().first().data('template')).toBe('faq_sharing');
});
it('should show tags section', function(){
this.view.$el.find('a[data-section=tags]').trigger('click');
- expect(this.view.$el.find('#faq').children().first().hasClass('faq_question_tags')).toBeTruthy();
+ expect(this.view.$el.find('#faq').children().first().data('template')).toBe('faq_tags');
});
it('should show keyboard shortcuts section', function(){
this.view.$el.find('a[data-section=keyboard_shortcuts]').trigger('click');
- expect(this.view.$el.find('#faq').children().first().data('template') == 'faq_keyboard_shortcuts').toBeTruthy();
+ expect(this.view.$el.find('#faq').children().first().data('template')).toBe('faq_keyboard_shortcuts');
});
it('should show miscellaneous section', function(){
@@ -87,4 +87,77 @@ describe("app.views.Help", function(){
expect(this.view.$el.find('#faq').children().first().hasClass('faq_question_miscellaneous')).toBeTruthy();
});
});
-}); \ No newline at end of file
+
+ describe("findSection", function() {
+ beforeEach(function() {
+ this.view.render();
+ });
+
+ it('should return null for an unknown section', function() {
+ expect(this.view.findSection('you_shall_not_pass')).toBeNull();
+ });
+
+ it('should return the correct section link for existing sections', function() {
+ var sections = [
+ 'account_and_data_management',
+ 'aspects',
+ 'pods',
+ 'keyboard_shortcuts',
+ 'tags',
+ 'miscellaneous'
+ ];
+
+ var self = this;
+ _.each(sections, function(section) {
+ var el = self.view.$el.find('a[data-section=' + section + ']');
+ expect(self.view.findSection(section).html()).toBe(el.html());
+ });
+ });
+ });
+
+ describe("menuClicked", function() {
+ beforeEach(function() {
+ this.view.render();
+ });
+
+ it('should rewrite the location', function(){
+ var sections = [
+ 'account_and_data_management',
+ 'miscellaneous'
+ ];
+ spyOn(app.router, 'navigate');
+
+ var self = this;
+ _.each(sections, function(section) {
+ self.view.$el.find('a[data-section=' + section + ']').trigger('click');
+ expect(app.router.navigate).toHaveBeenCalledWith('help/' + section);
+ });
+ });
+ });
+
+ describe("chat section", function(){
+ describe("chat enabled", function(){
+ beforeEach(function(){
+ gon.chatEnabled = true;
+ this.view = new app.views.Help();
+ this.view.render();
+ });
+
+ it('should display the chat', function(){
+ expect(this.view.$el.find('a[data-section=chat]').length).toBe(1);
+ });
+ });
+
+ describe("chat disabled", function(){
+ beforeEach(function(){
+ gon.chatEnabled = false;
+ this.view = new app.views.Help();
+ this.view.render();
+ });
+
+ it('should not display the chat', function () {
+ expect(this.view.$el.find('a[data-section=chat]').length).toBe(0);
+ });
+ });
+ });
+});
diff --git a/spec/javascripts/app/views/likes_info_view_spec.js b/spec/javascripts/app/views/likes_info_view_spec.js
index 2f33d6218..9e57f6c63 100644
--- a/spec/javascripts/app/views/likes_info_view_spec.js
+++ b/spec/javascripts/app/views/likes_info_view_spec.js
@@ -7,7 +7,7 @@ describe("app.views.LikesInfo", function(){
zero : "<%= count %> Pins",
one : "<%= count %> Pin"}
}
- })
+ });
var posts = $.parseJSON(spec.readFixture("stream_json"));
this.post = new app.models.Post(posts[0]); // post with a like
@@ -16,41 +16,40 @@ describe("app.views.LikesInfo", function(){
describe(".render", function(){
it("displays a the like count if it is above zero", function() {
- spyOn(this.view.model.interactions, "likesCount").andReturn(3);
+ spyOn(this.view.model.interactions, "likesCount").and.returnValue(3);
this.view.render();
- expect($(this.view.el).find(".expand_likes").length).toBe(1)
- })
+ expect($(this.view.el).find(".expand_likes").length).toBe(1);
+ });
it("does not display the like count if it is zero", function() {
- spyOn(this.view.model.interactions, "likesCount").andReturn(0);
+ spyOn(this.view.model.interactions, "likesCount").and.returnValue(0);
this.view.render();
expect($(this.view.el).html().trim()).toBe("");
- })
+ });
it("fires on a model change", function(){
- spyOn(this.view, "postRenderTemplate")
- this.view.model.interactions.trigger('change')
- expect(this.view.postRenderTemplate).toHaveBeenCalled()
- })
- })
+ spyOn(this.view, "postRenderTemplate");
+ this.view.model.interactions.trigger('change');
+ expect(this.view.postRenderTemplate).toHaveBeenCalled();
+ });
+ });
describe("showAvatars", function(){
beforeEach(function(){
- spyOn(this.post.interactions, "fetch").andCallThrough()
- })
+ spyOn(this.post.interactions, "fetch").and.callThrough();
+ });
it("calls fetch on the model's like collection", function(){
this.view.showAvatars();
expect(this.post.interactions.fetch).toHaveBeenCalled();
- })
+ });
it("sets the fetched response to the model's likes", function(){
//placeholder... not sure how to test done functionalty here
- })
+ });
it("re-renders the view", function(){
//placeholder... not sure how to test done functionalty here
- })
- })
-})
-
+ });
+ });
+});
diff --git a/spec/javascripts/app/views/location_view_spec.js b/spec/javascripts/app/views/location_view_spec.js
index 68e5ac59b..42e04741c 100644
--- a/spec/javascripts/app/views/location_view_spec.js
+++ b/spec/javascripts/app/views/location_view_spec.js
@@ -12,6 +12,6 @@ describe("app.views.Location", function(){
expect($("#location_address")).toBeTruthy();
expect($("#location_coords")).toBeTruthy();
expect($("#hide_location")).toBeTruthy();
- })
+ });
});
});
diff --git a/spec/javascripts/app/views/notification_dropdown_view_spec.js b/spec/javascripts/app/views/notification_dropdown_view_spec.js
new file mode 100644
index 000000000..f6972c5be
--- /dev/null
+++ b/spec/javascripts/app/views/notification_dropdown_view_spec.js
@@ -0,0 +1,107 @@
+describe('app.views.NotificationDropdown', function() {
+ beforeEach(function (){
+ spec.loadFixture('notifications');
+ this.header = new app.views.Header();
+ $("header").prepend(this.header.el);
+ this.header.render();
+ this.view = new app.views.NotificationDropdown({el: '#notification_badge'});
+ });
+
+ context('showDropdown', function(){
+ it('Calls resetParam()', function(){
+ spyOn(this.view, 'resetParams');
+ this.view.showDropdown();
+ expect(this.view.resetParams).toHaveBeenCalled();
+ });
+ it('Changes CSS', function(){
+ this.view.showDropdown();
+ expect($('#notification_dropdown').css('display')).toBe('block');
+ });
+ it('Calls getNotifications()', function(){
+ spyOn(this.view, 'getNotifications');
+ this.view.showDropdown();
+ expect(this.view.getNotifications).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');
+ this.view.dropdownScroll();
+ expect(this.view.getNotifications).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');
+ 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();
+ });
+ });
+});
diff --git a/spec/javascripts/app/views/notifications_view_spec.js b/spec/javascripts/app/views/notifications_view_spec.js
index 53c5640fc..ab422515a 100644
--- a/spec/javascripts/app/views/notifications_view_spec.js
+++ b/spec/javascripts/app/views/notifications_view_spec.js
@@ -40,8 +40,8 @@ describe("app.views.Notifications", function(){
});
it('changes the "all notifications" count', function() {
- badge = $('ul.nav > li:eq(0) .badge');
- count = parseInt(badge.text());
+ var badge = $('ul.nav > li:eq(0) .badge');
+ var count = parseInt(badge.text());
this.view.updateView(this.guid, this.type, true);
expect(parseInt(badge.text())).toBe(count + 1);
@@ -51,8 +51,8 @@ describe("app.views.Notifications", function(){
});
it('changes the notification type count', function() {
- badge = $('ul.nav > li[data-type=' + this.type + '] .badge');
- count = parseInt(badge.text());
+ var badge = $('ul.nav > li[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);
@@ -63,14 +63,44 @@ describe("app.views.Notifications", function(){
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')).toBeTruethy;
- expect(this.readN.hasClass('read')).toBeFalsy;
+ expect(this.readN.hasClass('unread')).toBeTruthy();
+ expect(this.readN.hasClass('read')).toBeFalsy();
expect(this.readN.find('.unread-toggle .entypo').data('original-title')).toBe(Diaspora.I18n.t('notifications.mark_read'));
this.view.updateView(this.readN.data('guid'), this.readN.data('type'), false);
- expect(this.readN.hasClass('read')).toBeTruethy;
- expect(this.readN.hasClass('unread')).toBeFalsy;
+ expect(this.readN.hasClass('read')).toBeTruthy();
+ expect(this.readN.hasClass('unread')).toBeFalsy();
expect(this.readN.find('.unread-toggle .entypo').data('original-title')).toBe(Diaspora.I18n.t('notifications.mark_unread'));
});
+
+ context("with a header", function() {
+ beforeEach(function() {
+ loginAs({name: "alice", avatar : {small : "http://avatar.com/photo.jpg"}, notifications_count : 2});
+ this.header = new app.views.Header();
+ $("header").prepend(this.header.el);
+ this.header.render();
+ });
+
+ it("changes the header notifications count", function() {
+ var badge = $("#notification_badge .badge_count");
+ var count = parseInt(badge.text(), 10);
+
+ this.view.updateView(this.guid, this.type, true);
+ expect(parseInt(badge.text(), 10)).toBe(count + 1);
+
+ this.view.updateView(this.guid, this.type, false);
+ expect(parseInt(badge.text(), 10)).toBe(count);
+ });
+
+ context("markAllRead", function() {
+ it("calls setRead for each unread notification", function(){
+ spyOn(this.view, "setRead");
+ 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'));
+ });
+ });
+ });
});
});
diff --git a/spec/javascripts/app/views/oembed_view_spec.js b/spec/javascripts/app/views/oembed_view_spec.js
index 7af824d20..f46f8c91c 100644
--- a/spec/javascripts/app/views/oembed_view_spec.js
+++ b/spec/javascripts/app/views/oembed_view_spec.js
@@ -9,7 +9,7 @@ describe("app.views.OEmbed", function(){
}
});
- this.view = new app.views.OEmbed({model : this.statusMessage})
+ this.view = new app.views.OEmbed({model : this.statusMessage});
});
describe("rendering", function(){
@@ -27,7 +27,7 @@ describe("app.views.OEmbed", function(){
it("should set types.video on the data", function() {
this.view.render();
- expect(this.view.model.get("o_embed_cache").data.types.video).toBe(true)
+ expect(this.view.model.get("o_embed_cache").data.types.video).toBe(true);
});
it("shows the thumb with overlay", function(){
@@ -53,20 +53,20 @@ describe("app.views.OEmbed", function(){
});
it("provides oembed html from the model response", function(){
- this.view.render()
- expect(this.view.$el.html()).toContain("some html")
+ this.view.render();
+ expect(this.view.$el.html()).toContain("some html");
});
});
});
describe("presenter", function(){
it("provides oembed html from the model", function(){
- expect(this.view.presenter().o_embed_html).toContain("some html")
+ expect(this.view.presenter().o_embed_html).toContain("some html");
});
it("does not provide oembed html from the model response if none is present", function(){
- this.statusMessage.set({"o_embed_cache" : null})
+ this.statusMessage.set({"o_embed_cache" : null});
expect(this.view.presenter().o_embed_html).toBe("");
});
});
-}); \ No newline at end of file
+});
diff --git a/spec/javascripts/app/views/open_graph_view_spec.js b/spec/javascripts/app/views/open_graph_view_spec.js
index d17c345ba..77bba41a1 100644
--- a/spec/javascripts/app/views/open_graph_view_spec.js
+++ b/spec/javascripts/app/views/open_graph_view_spec.js
@@ -12,7 +12,7 @@ describe("app.views.OpenGraph", function() {
"open_graph_cache": open_graph_cache
});
- this.view = new app.views.OpenGraph({model : this.statusMessage})
+ this.view = new app.views.OpenGraph({model : this.statusMessage});
});
describe("rendering", function(){
diff --git a/spec/javascripts/app/views/photo_viewer_spec.js b/spec/javascripts/app/views/photo_viewer_spec.js
index 6f25d580b..645f50d21 100644
--- a/spec/javascripts/app/views/photo_viewer_spec.js
+++ b/spec/javascripts/app/views/photo_viewer_spec.js
@@ -5,15 +5,15 @@ describe("app.views.PhotoViewer", function(){
factory.photoAttrs({sizes : {large : "http://tieguy.org/me.jpg"}}),
factory.photoAttrs({sizes : {large : "http://whatthefuckiselizabethstarkupto.com/none_knows.gif"}}) //SIC
]
- })
- this.view = new app.views.PhotoViewer({model : this.model})
- })
+ });
+ this.view = new app.views.PhotoViewer({model : this.model});
+ });
describe("rendering", function(){
it("should have an image for each photoAttr on the model", function(){
- this.view.render()
- expect(this.view.$("img").length).toBe(2)
- expect(this.view.$("img[src='http://tieguy.org/me.jpg']")).toExist()
- })
- })
-}) \ No newline at end of file
+ this.view.render();
+ expect(this.view.$("img").length).toBe(2);
+ expect(this.view.$("img[src='http://tieguy.org/me.jpg']")).toExist();
+ });
+ });
+});
diff --git a/spec/javascripts/app/views/photos_view_spec.js b/spec/javascripts/app/views/photos_view_spec.js
index 6c24f5e6e..f01aec0c8 100644
--- a/spec/javascripts/app/views/photos_view_spec.js
+++ b/spec/javascripts/app/views/photos_view_spec.js
@@ -16,24 +16,24 @@ describe("app.views.Photos", function() {
}, this);
});
-// describe("initialize", function() {
-// it("binds an infinite scroll listener", function() {
-// spyOn($.fn, "scroll");
-// new app.views.Stream({model : this.stream});
-// expect($.fn.scroll).toHaveBeenCalled();
-// });
-// });
-//
-// describe("#render", function() {
-// beforeEach(function() {
-// this.photo = this.stream.items.models[0];
-// this.photoElement = $(this.view.$("#" + this.photo.get("guid")));
-// });
-//
-// context("when rendering a photo message", function() {
-// it("shows the photo in the content area", function() {
-// expect(this.photoElement.length).toBeGreaterThan(0); //markdown'ed
-// });
-// });
-// });
+ describe("initialize", function() {
+ it("binds an infinite scroll listener", function() {
+ spyOn($.fn, "scroll");
+ new app.views.Stream({model : this.stream});
+ expect($.fn.scroll).toHaveBeenCalled();
+ });
+ });
+
+ describe("#render", function() {
+ beforeEach(function() {
+ this.photo = this.stream.items.models[0];
+ this.photoElement = $(this.view.$("#" + this.photo.get("guid")));
+ });
+
+ context("when rendering a photo message", function() {
+ it("shows the photo in the content area", function() {
+ expect(this.photoElement.length).toBeGreaterThan(0);
+ });
+ });
+ });
});
diff --git a/spec/javascripts/app/views/poll_view_spec.js b/spec/javascripts/app/views/poll_view_spec.js
index bbb2dccad..31372dca5 100644
--- a/spec/javascripts/app/views/poll_view_spec.js
+++ b/spec/javascripts/app/views/poll_view_spec.js
@@ -10,7 +10,7 @@ describe("app.views.Poll", function(){
var percentage = (this.view.poll.poll_answers[0].vote_count / this.view.poll.participation_count)*100;
expect(this.view.$('.poll_progress_bar:first').css('width')).toBe(percentage+"%");
expect(this.view.$(".percentage:first").text()).toBe(percentage + "%");
- })
+ });
});
describe("toggleResult", function(){
@@ -18,21 +18,21 @@ describe("app.views.Poll", function(){
expect(this.view.$('.poll_progress_bar_wrapper:first').css('display')).toBe("none");
this.view.toggleResult(null);
expect(this.view.$('.poll_progress_bar_wrapper:first').css('display')).toBe("block");
- })
+ });
});
describe("vote", function(){
it("checks the ajax call for voting", function(){
- spyOn($, "ajax");
+ jasmine.Ajax.install();
var answer = this.view.poll.poll_answers[0];
var poll = this.view.poll;
this.view.vote(answer.id);
- var obj = JSON.parse($.ajax.mostRecentCall.args[0].data);
+ var obj = JSON.parse(jasmine.Ajax.requests.mostRecent().params);
expect(obj.poll_id).toBe(poll.poll_id);
expect(obj.poll_answer_id).toBe(answer.id);
- })
+ });
});
describe("render", function() {
@@ -44,16 +44,39 @@ describe("app.views.Poll", function(){
});
});
+ describe("reshared post", function(){
+ beforeEach(function(){
+ Diaspora.I18n.load({
+ poll: {
+ go_to_original_post: "You can participate in this poll on the <%= original_post_link %>.",
+ original_post: "original post"
+ }
+ });
+ this.view.model.attributes.post_type = "Reshare";
+ this.view.model.attributes.root = {id: 1};
+ this.view.render();
+ });
+
+ it("hides the vote form", function(){
+ expect(this.view.$('form').length).toBe(0);
+ });
+
+ it("shows a.root_post_link", function(){
+ var id = this.view.model.get('root').id;
+ expect(this.view.$('a.root_post_link').attr('href')).toBe('/posts/'+id);
+ });
+ });
+
describe("vote form", function(){
- it('show vote form when user is logged in and not voted before', function(){
+ it("shows vote form when user is logged in and not voted before", function(){
expect(this.view.$('form').length).toBe(1);
});
- it('hide vote form when user voted before', function(){
+ it("hides vote form when user voted before", function(){
this.view.model.attributes.already_participated_in_poll = true;
this.view.render();
expect(this.view.$('form').length).toBe(0);
});
- it("hide vote form when user not logged in", function(){
+ it("hides vote form when user not logged in", function(){
logout();
this.view.render();
expect(this.view.$('form').length).toBe(0);
diff --git a/spec/javascripts/app/views/profile_header_view_spec.js b/spec/javascripts/app/views/profile_header_view_spec.js
new file mode 100644
index 000000000..724cc7260
--- /dev/null
+++ b/spec/javascripts/app/views/profile_header_view_spec.js
@@ -0,0 +1,33 @@
+
+describe("app.views.ProfileHeader", function() {
+ beforeEach(function() {
+ this.model = factory.personWithProfile({
+ diaspora_id: "my@pod",
+ name: "User Name",
+ relationship: 'mutual',
+ profile: { tags: ['test'] }
+ });
+ this.view = new app.views.ProfileHeader({model: this.model});
+ loginAs(factory.userAttrs());
+ });
+
+ context("#presenter", function() {
+ it("contains necessary elements", function() {
+ expect(this.view.presenter()).toEqual(jasmine.objectContaining({
+ diaspora_id: "my@pod",
+ name: "User Name",
+ is_blocked: false,
+ is_own_profile: false,
+ has_tags: true,
+ show_profile_btns: true,
+ relationship: 'mutual',
+ is_sharing: true,
+ is_receiving: true,
+ is_mutual: true,
+ profile: jasmine.objectContaining({
+ tags: ['test']
+ })
+ }));
+ });
+ });
+});
diff --git a/spec/javascripts/app/views/profile_sidebar_view_spec.js b/spec/javascripts/app/views/profile_sidebar_view_spec.js
new file mode 100644
index 000000000..f648bb118
--- /dev/null
+++ b/spec/javascripts/app/views/profile_sidebar_view_spec.js
@@ -0,0 +1,36 @@
+
+describe("app.views.ProfileSidebar", function() {
+ beforeEach(function() {
+ this.model = factory.personWithProfile({
+ diaspora_id: "alice@umbrella.corp",
+ name: "Project Alice",
+ relationship: 'mutual',
+ profile: {
+ bio: "confidential",
+ location: "underground",
+ gender: "female",
+ birthday: "2012-09-14",
+ tags: ['zombies', 'evil', 'blood', 'gore']
+
+ }
+ });
+ this.view = new app.views.ProfileSidebar({model: this.model});
+
+ loginAs(factory.userAttrs());
+ });
+
+ context("#presenter", function() {
+ it("contains necessary elements", function() {
+ expect(this.view.presenter()).toEqual(jasmine.objectContaining({
+ relationship: 'mutual',
+ show_profile_info: true,
+ profile: jasmine.objectContaining({
+ bio: "confidential",
+ location: "underground",
+ gender: "female",
+ birthday: "2012-09-14"
+ })
+ }));
+ });
+ });
+});
diff --git a/spec/javascripts/app/views/publisher_poll_creator_view_spec.js b/spec/javascripts/app/views/publisher_poll_creator_view_spec.js
index 97334dc99..24720b112 100644
--- a/spec/javascripts/app/views/publisher_poll_creator_view_spec.js
+++ b/spec/javascripts/app/views/publisher_poll_creator_view_spec.js
@@ -14,17 +14,19 @@ describe('app.views.PublisherPollCreator', function(){
});
describe('#addAnswerInput', function(){
it('should add new answer input', function(){
- this.view.addAnswerInput();
expect(this.view.$(this.input_selector).length).toBe(2);
+ this.view.addAnswerInput();
+ expect(this.view.$(this.input_selector).length).toBe(3);
});
it('should change input count', function(){
this.view.addAnswerInput();
- expect(this.view.inputCount).toBe(2);
+ expect(this.view.inputCount).toBe(3);
});
});
describe('#removeAnswerInput', function(){
it('remove answer input', function(){
- var input = this.view.$('input:first');
+ var input = this.view.$(this.input_selector).first();
+ expect(this.view.$(this.input_selector).length).toBe(2);
this.view.removeAnswerInput(input);
expect(this.view.$(this.input_selector).length).toBe(1);
});
@@ -40,7 +42,7 @@ describe('app.views.PublisherPollCreator', function(){
var remove_btn = '.poll-answer .remove-answer';
it('show remove button when answer input is greater 1', function(){
this.view.addAnswerInput();
- expect(this.view.$(remove_btn).hasClass('active')).toBe(true);
+ expect(this.view.$(remove_btn).hasClass('active')).toBeFalsy;
});
it('hide remove button when is only one answer input', function(){
var input = this.view.$(this.input_selector);
@@ -48,14 +50,14 @@ describe('app.views.PublisherPollCreator', function(){
this.view.addAnswerInput();
this.view.removeAnswerInput(input);
- expect(this.view.$(remove_btn).hasClass('active')).toBe(false);
+ expect(this.view.$(remove_btn).hasClass('active')).toBeFalsy;
});
});
describe('#validateInput', function(){
it('should invalid blank value', function(){
var input = this.view.$('input');
input.val(' ');
- expect(this.view.validateInput(input)).toBe(false);
- }):
+ expect(this.view.validateInput(input)).toBeFalsy;
+ });
});
});
diff --git a/spec/javascripts/app/views/publisher_view_spec.js b/spec/javascripts/app/views/publisher_view_spec.js
index 8c0e1c6db..8390f6b83 100644
--- a/spec/javascripts/app/views/publisher_view_spec.js
+++ b/spec/javascripts/app/views/publisher_view_spec.js
@@ -4,9 +4,9 @@
*/
describe("app.views.Publisher", function() {
- describe("standalone", function() {
+ context("standalone", function() {
beforeEach(function() {
- // should be jasmine helper
+ // TODO should be jasmine helper
loginAs({name: "alice", avatar : {small : "http://avatar.com/photo.jpg"}});
spec.loadFixture("aspects_index");
@@ -22,11 +22,21 @@ describe("app.views.Publisher", function() {
it("hides the post preview button in standalone mode", function() {
expect(this.view.$('.post_preview_button').is(':visible')).toBeFalsy();
});
+
+ describe("createStatusMessage", function(){
+ it("doesn't add the status message to the stream", function() {
+ app.stream = { addNow: $.noop };
+ spyOn(app.stream, "addNow");
+ this.view.createStatusMessage($.Event());
+ jasmine.Ajax.requests.mostRecent().respondWith({ status: 200, responseText: "{\"id\": 1}" });
+ expect(app.stream.addNow).not.toHaveBeenCalled();
+ });
+ });
});
context("plain publisher", function() {
beforeEach(function() {
- // should be jasmine helper
+ // TODO should be jasmine helper
loginAs({name: "alice", avatar : {small : "http://avatar.com/photo.jpg"}});
spec.loadFixture("aspects_index");
@@ -55,7 +65,7 @@ describe("app.views.Publisher", function() {
it("removes the 'active' class from the publisher element", function(){
this.view.close($.Event());
expect($(this.view.el)).toHaveClass("closed");
- })
+ });
it("resets the element's height", function() {
$(this.view.el).find("#status_message_fake_text").height(100);
@@ -70,14 +80,14 @@ describe("app.views.Publisher", function() {
this.view.clear($.Event());
expect(this.view.close).toHaveBeenCalled();
- })
+ });
it("calls removePostPreview", function(){
spyOn(this.view, "removePostPreview");
this.view.clear($.Event());
expect(this.view.removePostPreview).toHaveBeenCalled();
- })
+ });
it("clears all textareas", function(){
_.each(this.view.$("textarea"), function(element){
@@ -90,27 +100,27 @@ describe("app.views.Publisher", function() {
_.each(this.view.$("textarea"), function(element){
expect($(element).val()).toBe("");
});
- })
+ });
it("removes all photos from the dropzone area", function(){
var self = this;
_.times(3, function(){
- self.view.el_photozone.append($("<li>"))
+ self.view.el_photozone.append($("<li>"));
});
expect(this.view.el_photozone.html()).not.toBe("");
this.view.clear($.Event());
expect(this.view.el_photozone.html()).toBe("");
- })
+ });
it("removes all photo values appended by the photo uploader", function(){
- $(this.view.el).prepend("<input name='photos[]' value='3'/>")
+ $(this.view.el).prepend("<input name='photos[]' value='3'/>");
var photoValuesInput = this.view.$("input[name='photos[]']");
- photoValuesInput.val("3")
+ photoValuesInput.val("3");
this.view.clear($.Event());
expect(this.view.$("input[name='photos[]']").length).toBe(0);
- })
+ });
it("destroy location if exists", function(){
setFixtures('<div id="location"></div>');
@@ -119,7 +129,7 @@ describe("app.views.Publisher", function() {
expect($("#location").length).toBe(1);
this.view.clear($.Event());
expect($("#location").length).toBe(0);
- })
+ });
});
describe("createStatusMessage", function(){
@@ -127,7 +137,15 @@ describe("app.views.Publisher", function() {
spyOn(this.view, "handleTextchange");
this.view.createStatusMessage($.Event());
expect(this.view.handleTextchange).toHaveBeenCalled();
- })
+ });
+
+ it("adds the status message to the stream", function() {
+ app.stream = { addNow: $.noop };
+ spyOn(app.stream, "addNow");
+ this.view.createStatusMessage($.Event());
+ jasmine.Ajax.requests.mostRecent().respondWith({ status: 200, responseText: "{\"id\": 1}" });
+ expect(app.stream.addNow).toHaveBeenCalled();
+ });
});
describe('#setText', function() {
@@ -150,8 +168,6 @@ describe("app.views.Publisher", function() {
});
it("disables submitting", function() {
- this.view.togglePollCreator();
-
this.view.setText('TESTING');
expect(this.view.el_submit.prop('disabled')).toBeFalsy();
expect(this.view.el_preview.prop('disabled')).toBeFalsy();
@@ -165,8 +181,8 @@ describe("app.views.Publisher", function() {
describe("publishing a post with keyboard", function(){
it("should submit the form when ctrl+enter is pressed", function(){
this.view.render();
- var form = this.view.$("form")
- var submitCallback = jasmine.createSpy().andReturn(false);
+ var form = this.view.$("form");
+ var submitCallback = jasmine.createSpy().and.returnValue(false);
form.submit(submitCallback);
var e = $.Event("keydown", { keyCode: 13 });
@@ -175,8 +191,34 @@ describe("app.views.Publisher", function() {
expect(submitCallback).toHaveBeenCalled();
expect($(this.view.el)).not.toHaveClass("closed");
- })
- })
+ });
+ });
+
+ describe("_beforeUnload", function(){
+ beforeEach(function(){
+ Diaspora.I18n.load({ confirm_unload: "Please confirm that you want to leave this page - data you have entered won't be saved."});
+ });
+
+ it("calls _submittable", function(){
+ spyOn(this.view, "_submittable");
+ $(window).trigger('beforeunload');
+ expect(this.view._submittable).toHaveBeenCalled();
+ });
+
+ it("returns a confirmation if the publisher is submittable", function(){
+ spyOn(this.view, "_submittable").and.returnValue(true);
+ var e = $.Event();
+ expect(this.view._beforeUnload(e)).toBe(Diaspora.I18n.t('confirm_unload'));
+ expect(e.returnValue).toBe(Diaspora.I18n.t('confirm_unload'));
+ });
+
+ it("doesn't ask for a confirmation if the publisher isn't submittable", function(){
+ spyOn(this.view, "_submittable").and.returnValue(false);
+ var e = $.Event();
+ expect(this.view._beforeUnload(e)).toBe(undefined);
+ expect(e.returnValue).toBe(undefined);
+ });
+ });
});
context("services", function(){
@@ -240,79 +282,123 @@ describe("app.views.Publisher", function() {
expect(this.view.$('input[name="services[]"][value="'+prov1+'"]').length).toBe(0);
expect(this.view.$('input[name="services[]"][value="'+prov2+'"]').length).toBe(1);
});
+
+ describe("#clear", function() {
+ it("resets the char counter", function() {
+ this.view.$(".service_icon").first().trigger("click");
+ expect(parseInt(this.view.$(".counter").text(), 10)).toBeGreaterThan(0);
+ this.view.$(".counter").text("0");
+ expect(parseInt(this.view.$(".counter").text(), 10)).not.toBeGreaterThan(0);
+ this.view.clear($.Event());
+ expect(parseInt(this.view.$(".counter").text(), 10)).toBeGreaterThan(0);
+ });
+ });
});
context("aspect selection", function(){
beforeEach( function(){
- spec.loadFixture('status_message_new');
-
- this.radio_els = $('#publisher .dropdown li.radio');
- this.check_els = $('#publisher .dropdown li.aspect_selector');
+ loginAs({name: "alice", avatar : {small : "http://avatar.com/photo.jpg"}});
+ spec.loadFixture("status_message_new");
+ Diaspora.I18n.load({ stream: { public: 'Public' }});
this.view = new app.views.Publisher();
this.view.open();
+
+ this.radio_els = this.view.$('#publisher .aspect_dropdown li.radio');
+ this.check_els = this.view.$('#publisher .aspect_dropdown li.aspect_selector');
+ this.visibility_icon = this.view.$('#visibility-icon');
});
it("initializes with 'all_aspects'", function(){
- expect(this.radio_els.first().hasClass('selected')).toBeFalsy();
- expect(this.radio_els.last().hasClass('selected')).toBeTruthy();
+ expect($('.aspect_dropdown li.public')).not.toHaveClass('selected');
+ expect($('.aspect_dropdown li.all_aspects')).toHaveClass('selected');
+ expect($('.aspect_dropdown li.aspect_selector')).not.toHaveClass('selected');
- _.each(this.check_els, function(el){
- expect($(el).hasClass('selected')).toBeFalsy();
- });
+ expect($('#publisher #visibility-icon')).not.toHaveClass('globe');
+ expect($('#publisher #visibility-icon')).toHaveClass('lock');
});
it("toggles the selected entry visually", function(){
- this.check_els.last().trigger('click');
-
- _.each(this.radio_els, function(el){
- expect($(el).hasClass('selected')).toBeFalsy();
- });
-
- expect(this.check_els.first().hasClass('selected')).toBeFalsy();
- expect(this.check_els.last().hasClass('selected')).toBeTruthy();
+ // click on the first aspect
+ var evt = $.Event("click", { target: $('.aspect_dropdown li.aspect_selector:first') });
+ this.view.view_aspect_selector.toggleAspect(evt);
+ // public and "all aspects" are deselected
+ expect($('.aspect_dropdown li.public')).not.toHaveClass('selected');
+ expect($('.aspect_dropdown li.all_aspects')).not.toHaveClass('selected');
+ // the first aspect is selected
+ expect($('.aspect_dropdown li.aspect_selector:first')).toHaveClass('selected');
+ // the last aspect is not selected
+ expect($('.aspect_dropdown li.aspect_selector:last')).not.toHaveClass('selected');
+ // visibility icon is set to the lock icon
+ expect($('#publisher #visibility-icon')).not.toHaveClass('globe');
+ expect($('#publisher #visibility-icon')).toHaveClass('lock');
+
+ // click on public
+ evt = $.Event("click", { target: $('.aspect_dropdown li.public') });
+ this.view.view_aspect_selector.toggleAspect(evt);
+ // public is selected, "all aspects" is deselected
+ expect($('.aspect_dropdown li.public').hasClass('selected')).toBeTruthy();
+ expect($('.aspect_dropdown li.all_aspects').hasClass('selected')).toBeFalsy();
+ // the aspects are deselected
+ expect($('.aspect_dropdown li.aspect_selector').hasClass('selected')).toBeFalsy();
+ // visibility icon is set to the globe icon
+ expect($('#publisher #visibility-icon').hasClass('globe')).toBeTruthy();
+ expect($('#publisher #visibility-icon').hasClass('lock')).toBeFalsy();
+
+ // click on "all aspects"
+ evt = $.Event("click", { target: $('.aspect_dropdown li.all_aspects') });
+ this.view.view_aspect_selector.toggleAspect(evt);
+ // public is deselected, "all aspects" is selected
+ expect($('.aspect_dropdown li.public').hasClass('selected')).toBeFalsy();
+ expect($('.aspect_dropdown li.all_aspects').hasClass('selected')).toBeTruthy();
+ // the aspects are deselected
+ expect($('.aspect_dropdown li.aspect_selector').hasClass('selected')).toBeFalsy();
+ // visibility icon is set to the lock icon
+ expect($('#publisher #visibility-icon').hasClass('globe')).toBeFalsy();
+ expect($('#publisher #visibility-icon').hasClass('lock')).toBeTruthy();
});
describe("hidden form elements", function(){
beforeEach(function(){
- this.li = $('<li data-aspect_id="42" />');
- this.view.$('.dropdown_list').append(this.li);
+ $('.dropdown-menu').append('<li data-aspect_id="42" class="aspect_selector" />');
});
it("removes a previous selection and inserts the current one", function() {
- var selected = this.view.$('input[name="aspect_ids[]"]');
+ var selected = $('input[name="aspect_ids[]"]');
expect(selected.length).toBe(1);
expect(selected.first().val()).toBe('all_aspects');
- this.li.trigger('click');
+ var evt = $.Event("click", { target: $('.aspect_dropdown li.aspect_selector:last') });
+ this.view.view_aspect_selector.toggleAspect(evt);
- selected = this.view.$('input[name="aspect_ids[]"]');
+ selected = $('input[name="aspect_ids[]"]');
expect(selected.length).toBe(1);
expect(selected.first().val()).toBe('42');
});
it("toggles the same item", function() {
- expect(this.view.$('input[name="aspect_ids[]"][value="42"]').length).toBe(0);
+ expect($('input[name="aspect_ids[]"][value="42"]').length).toBe(0);
- this.li.trigger('click');
- expect(this.view.$('input[name="aspect_ids[]"][value="42"]').length).toBe(1);
+ var evt = $.Event("click", { target: $('.aspect_dropdown li.aspect_selector:last') });
+ this.view.view_aspect_selector.toggleAspect(evt);
+ expect($('input[name="aspect_ids[]"][value="42"]').length).toBe(1);
- this.li.trigger('click');
- expect(this.view.$('input[name="aspect_ids[]"][value="42"]').length).toBe(0);
+ evt = $.Event("click", { target: $('.aspect_dropdown li.aspect_selector:last') });
+ this.view.view_aspect_selector.toggleAspect(evt);
+ expect($('input[name="aspect_ids[]"][value="42"]').length).toBe(0);
});
it("keeps other fields with different values", function() {
- var li2 = $("<li data-aspect_id=99></li>");
- this.view.$('.dropdown_list').append(li2);
-
- this.li.trigger('click');
- li2.trigger('click');
-
- expect(this.view.$('input[name="aspect_ids[]"][value="42"]').length).toBe(1);
- expect(this.view.$('input[name="aspect_ids[]"][value="99"]').length).toBe(1);
+ $('.dropdown-menu').append('<li data-aspect_id="99" class="aspect_selector" />');
+ var evt = $.Event("click", { target: $('.aspect_dropdown li.aspect_selector:eq(-2)') });
+ this.view.view_aspect_selector.toggleAspect(evt);
+ evt = $.Event("click", { target: $('.aspect_dropdown li.aspect_selector:eq(-1)') });
+ this.view.view_aspect_selector.toggleAspect(evt);
+
+ expect($('input[name="aspect_ids[]"][value="42"]').length).toBe(1);
+ expect($('input[name="aspect_ids[]"][value="99"]').length).toBe(1);
});
});
-
});
context("locator", function() {
@@ -342,7 +428,7 @@ describe("app.views.Publisher", function() {
// validates there is one location created
expect($("#location").length).toBe(1);
- })
+ });
});
describe('#destroyLocation', function(){
@@ -352,18 +438,18 @@ describe("app.views.Publisher", function() {
this.view.destroyLocation();
expect($("#location").length).toBe(0);
- })
+ });
});
describe('#avoidEnter', function(){
it("Avoid submitting the form when pressing enter", function(){
// simulates the event object
- evt = {};
+ var evt = {};
evt.keyCode = 13;
// should return false in order to avoid the form submition
expect(this.view.avoidEnter(evt)).toBeFalsy();
- })
+ });
});
});
@@ -384,7 +470,7 @@ describe("app.views.Publisher", function() {
it('initializes the file uploader plugin', function() {
spyOn(qq, 'FileUploaderBasic');
- var publisher = new app.views.Publisher();
+ new app.views.Publisher();
expect(qq.FileUploaderBasic).toHaveBeenCalled();
});
@@ -444,7 +530,7 @@ describe("app.views.Publisher", function() {
it('shows it in text form', function() {
var info = this.view.view_uploader.el_info;
- expect(info.text()).toBe(Diaspora.I18n.t('photo_uploader.completed', {file: 'test.jpg'}))
+ expect(info.text()).toBe(Diaspora.I18n.t('photo_uploader.completed', {file: 'test.jpg'}));
});
it('adds a hidden input to the publisher', function() {
@@ -482,7 +568,7 @@ describe("app.views.Publisher", function() {
it('shows error message', function() {
var info = this.view.view_uploader.el_info;
- expect(info.text()).toBe(Diaspora.I18n.t('photo_uploader.error', {file: 'test.jpg'}))
+ expect(info.text()).toBe(Diaspora.I18n.t('photo_uploader.error', {file: 'test.jpg'}));
});
});
});
@@ -499,7 +585,7 @@ describe("app.views.Publisher", function() {
'</li>'
);
- spyOn(jQuery, 'ajax').andCallFake(function(opts) { opts.success(); });
+ spyOn(jQuery, 'ajax').and.callFake(function(opts) { opts.success(); });
this.view.el_photozone.find('.x').click();
});
diff --git a/spec/javascripts/app/views/search_view_spec.js b/spec/javascripts/app/views/search_view_spec.js
new file mode 100644
index 000000000..ca23e6f7c
--- /dev/null
+++ b/spec/javascripts/app/views/search_view_spec.js
@@ -0,0 +1,14 @@
+describe("app.views.Search", function() {
+ beforeEach(function(){
+ spec.content().html('<form action="#" id="search_people_form"></form>');
+ this.view = new app.views.Search({ el: '#search_people_form' });
+ });
+ describe("parse", function() {
+ it("escapes a persons name", function() {
+ var person = { 'name': '</script><script>alert("xss");</script' };
+ this.view.context = this.view;
+ var result = this.view.parse([$.extend({}, person)]);
+ expect(result[0].data.name).not.toEqual(person.name);
+ });
+ });
+});
diff --git a/spec/javascripts/app/views/stream/shortcuts_spec.js b/spec/javascripts/app/views/stream/shortcuts_spec.js
index 59dcf75d7..6ce7e05fd 100644
--- a/spec/javascripts/app/views/stream/shortcuts_spec.js
+++ b/spec/javascripts/app/views/stream/shortcuts_spec.js
@@ -1,27 +1,27 @@
describe("app.views.StreamShortcuts", function () {
-
+
beforeEach(function() {
- this.post1 = factory.post({author : factory.author({name : "Rebecca Black", id : 1492})})
- this.post2 = factory.post({author : factory.author({name : "John Stamos", id : 1987})})
-
+ this.post1 = factory.post({author : factory.author({name : "Rebecca Black", id : 1492})});
+ this.post2 = factory.post({author : factory.author({name : "John Stamos", id : 1987})});
+
this.stream = new app.models.Stream();
this.stream.add([this.post1, this.post2]);
this.view = new app.views.Stream({model : this.stream});
-
+
this.view.render();
expect(this.view.$('div.stream_element.loaded').length).toBe(2);
});
-
+
describe("loading the stream", function(){
it("should setup the shortcuts", function(){
- spyOn(this.view, 'setupShortcuts');
+ spyOn(this.view, 'setupShortcuts');
this.view.initialize();
expect(this.view.setupShortcuts).toHaveBeenCalled();
});
- });
-
- describe("pressing 'j'", function(){
-
+ });
+
+ describe("pressing 'j'", function(){
+
it("should call 'gotoNext' if not pressed in an input field", function(){
spyOn(this.view, 'gotoNext');
this.view.initialize();
@@ -31,13 +31,13 @@ describe("app.views.StreamShortcuts", function () {
this.view._onHotkeyDown(e);
expect(this.view.gotoNext).toHaveBeenCalled();
});
-
+
it("'gotoNext' should call 'selectPost'", function(){
spyOn(this.view, 'selectPost');
this.view.gotoNext();
expect(this.view.selectPost).toHaveBeenCalled();
});
-
+
it("shouldn't do anything if the user types in an input field", function(){
spyOn(this.view, 'gotoNext');
spyOn(this.view, 'selectPost');
@@ -50,7 +50,7 @@ describe("app.views.StreamShortcuts", function () {
expect(this.view.selectPost).not.toHaveBeenCalled();
});
});
-
+
describe("pressing 'k'", function(){
it("should call 'gotoPrev' if not pressed in an input field", function(){
@@ -62,13 +62,13 @@ describe("app.views.StreamShortcuts", function () {
this.view._onHotkeyDown(e);
expect(this.view.gotoPrev).toHaveBeenCalled();
});
-
+
it("'gotoPrev' should call 'selectPost'", function(){
spyOn(this.view, 'selectPost');
this.view.gotoPrev();
expect(this.view.selectPost).toHaveBeenCalled();
});
-
+
it("shouldn't do anything if the user types in an input field", function(){
spyOn(this.view, 'gotoPrev');
spyOn(this.view, 'selectPost');
@@ -81,7 +81,7 @@ describe("app.views.StreamShortcuts", function () {
expect(this.view.selectPost).not.toHaveBeenCalled();
});
});
-
+
describe("pressing 'c'", function(){
it("should click on the comment-button if not pressed in an input field", function(){
@@ -93,7 +93,7 @@ describe("app.views.StreamShortcuts", function () {
this.view._onHotkeyUp(e);
expect(this.view.commentSelected).toHaveBeenCalled();
});
-
+
it("shouldn't do anything if the user types in an input field", function(){
spyOn(this.view, 'commentSelected');
this.view.initialize();
@@ -104,9 +104,9 @@ describe("app.views.StreamShortcuts", function () {
expect(this.view.commentSelected).not.toHaveBeenCalled();
});
});
-
+
describe("pressing 'l'", function(){
-
+
it("should click on the like-button if not pressed in an input field", function(){
spyOn(this.view, 'likeSelected');
this.view.initialize();
@@ -116,7 +116,7 @@ describe("app.views.StreamShortcuts", function () {
this.view._onHotkeyUp(e);
expect(this.view.likeSelected).toHaveBeenCalled();
});
-
+
it("shouldn't do anything if the user types in an input field", function(){
spyOn(this.view, 'likeSelected');
this.view.initialize();
@@ -127,4 +127,73 @@ describe("app.views.StreamShortcuts", function () {
expect(this.view.likeSelected).not.toHaveBeenCalled();
});
});
-})
+
+ describe("pressing 'r'", function(){
+
+ it("should click on the reshare-button if not pressed in an input field", function(){
+ spyOn(this.view, 'reshareSelected');
+ this.view.initialize();
+ var e = $.Event("keyup", { which: 82, target: {type: "div"} });
+ //verify that the test is correct
+ expect(String.fromCharCode( e.which ).toLowerCase()).toBe('r');
+ this.view._onHotkeyUp(e);
+ expect(this.view.reshareSelected).toHaveBeenCalled();
+ });
+
+ it("shouldn't do anything if the user types in an input field", function(){
+ spyOn(this.view, 'reshareSelected');
+ this.view.initialize();
+ var e = $.Event("keyup", { which: 82, target: {type: "textarea"} });
+ //verify that the test is correct
+ expect(String.fromCharCode( e.which ).toLowerCase()).toBe('r');
+ this.view._onHotkeyUp(e);
+ expect(this.view.reshareSelected).not.toHaveBeenCalled();
+ });
+ });
+
+ describe("pressing 'm'", function(){
+
+ it("should click on the more-button if not pressed in an input field", function(){
+ spyOn(this.view, 'expandSelected');
+ this.view.initialize();
+ var e = $.Event("keyup", { which: 77, target: {type: "div"} });
+ //verify that the test is correct
+ expect(String.fromCharCode( e.which ).toLowerCase()).toBe('m');
+ this.view._onHotkeyUp(e);
+ expect(this.view.expandSelected).toHaveBeenCalled();
+ });
+
+ it("shouldn't do anything if the user types in an input field", function(){
+ spyOn(this.view, 'expandSelected');
+ this.view.initialize();
+ var e = $.Event("keyup", { which: 77, target: {type: "textarea"} });
+ //verify that the test is correct
+ expect(String.fromCharCode( e.which ).toLowerCase()).toBe('m');
+ this.view._onHotkeyUp(e);
+ expect(this.view.expandSelected).not.toHaveBeenCalled();
+ });
+ });
+
+ describe("pressing 'o'", function(){
+
+ it("should click on the more-button if not pressed in an input field", function(){
+ spyOn(this.view, 'openFirstLinkSelected');
+ this.view.initialize();
+ var e = $.Event("keyup", { which: 79, target: {type: "div"} });
+ //verify that the test is correct
+ expect(String.fromCharCode( e.which ).toLowerCase()).toBe('o');
+ this.view._onHotkeyUp(e);
+ expect(this.view.openFirstLinkSelected).toHaveBeenCalled();
+ });
+
+ it("shouldn't do anything if the user types in an input field", function(){
+ spyOn(this.view, 'openFirstLinkSelected');
+ this.view.initialize();
+ var e = $.Event("keyup", { which: 79, target: {type: "textarea"} });
+ //verify that the test is correct
+ expect(String.fromCharCode( e.which ).toLowerCase()).toBe('o');
+ this.view._onHotkeyUp(e);
+ expect(this.view.openFirstLinkSelected).not.toHaveBeenCalled();
+ });
+ });
+});
diff --git a/spec/javascripts/app/views/stream_faces_view_spec.js b/spec/javascripts/app/views/stream_faces_view_spec.js
index 259dcd074..98d24897a 100644
--- a/spec/javascripts/app/views/stream_faces_view_spec.js
+++ b/spec/javascripts/app/views/stream_faces_view_spec.js
@@ -1,50 +1,50 @@
describe("app.views.StreamFaces", function(){
beforeEach(function(){
- var rebeccaBlack = factory.author({name : "Rebecca Black", id : 1492})
- this.post1 = factory.post({author : rebeccaBlack})
- this.post2 = factory.post({author : factory.author({name : "John Stamos", id : 1987})})
- this.post3 = factory.post({author : factory.author({name : "Michelle Tanner", id : 1986})})
- this.post4 = factory.post({author : factory.author({name : "Barack Obama", id : 2000})})
- this.post5 = factory.post({author : factory.author({name : "Obi-wan Kenobi", id : 2020})})
- this.post6 = factory.post({author : rebeccaBlack})
- this.post7 = factory.post({author : rebeccaBlack})
-
- app.stream = new app.models.Stream()
+ var rebeccaBlack = factory.author({name : "Rebecca Black", id : 1492});
+ this.post1 = factory.post({author : rebeccaBlack});
+ this.post2 = factory.post({author : factory.author({name : "John Stamos", id : 1987})});
+ this.post3 = factory.post({author : factory.author({name : "Michelle Tanner", id : 1986})});
+ this.post4 = factory.post({author : factory.author({name : "Barack Obama", id : 2000})});
+ this.post5 = factory.post({author : factory.author({name : "Obi-wan Kenobi", id : 2020})});
+ this.post6 = factory.post({author : rebeccaBlack});
+ this.post7 = factory.post({author : rebeccaBlack});
+
+ app.stream = new app.models.Stream();
app.stream.add([this.post1, this.post2, this.post3, this.post4, this.post5, this.post6, this.post7]);
- this.posts = app.stream.items
+ this.posts = app.stream.items;
- this.view = new app.views.StreamFaces({collection : this.posts})
- })
+ this.view = new app.views.StreamFaces({collection : this.posts});
+ });
it("should take them unique", function(){
- this.view.render()
- expect(this.view.people.length).toBe(5)
- })
+ this.view.render();
+ expect(this.view.people.length).toBe(5);
+ });
it("findsPeople when the collection changes", function(){
- this.posts.add(factory.post({author : factory.author({name : "Harriet Tubman"})}))
- expect(this.view.people.length).toBe(6)
- })
+ this.posts.add(factory.post({author : factory.author({name : "Harriet Tubman"})}));
+ expect(this.view.people.length).toBe(6);
+ });
describe(".render", function(){
beforeEach(function(){
- this.view.render()
- })
+ this.view.render();
+ });
it("appends the people's avatars", function(){
- expect(this.view.$("img").length).toBe(5)
- })
+ expect(this.view.$("img").length).toBe(5);
+ });
it("links to the people", function(){
- expect(this.view.$("a").length).toBe(5)
- })
+ expect(this.view.$("a").length).toBe(5);
+ });
it("rerenders when people are added, but caps to 15 people", function(){
- var posts = _.map(_.range(20), function(){ return factory.post()})
- this.posts.reset(posts) //add 20 posts silently to the collection
- this.posts.add(factory.post()) //trigger an update
- expect(this.view.$("img").length).toBe(15)
- })
- })
-})
+ var posts = _.map(_.range(20), function(){ return factory.post()});
+ this.posts.reset(posts); //add 20 posts silently to the collection
+ this.posts.add(factory.post()); //trigger an update
+ expect(this.view.$("img").length).toBe(15);
+ });
+ });
+});
diff --git a/spec/javascripts/app/views/stream_post_spec.js b/spec/javascripts/app/views/stream_post_spec.js
index 7f7de9b5e..e660db727 100644
--- a/spec/javascripts/app/views/stream_post_spec.js
+++ b/spec/javascripts/app/views/stream_post_spec.js
@@ -1,16 +1,16 @@
describe("app.views.StreamPost", function(){
beforeEach(function(){
- this.PostViewClass = app.views.StreamPost
+ this.PostViewClass = app.views.StreamPost;
var posts = $.parseJSON(spec.readFixture("stream_json"));
this.collection = new app.collections.Posts(posts);
this.statusMessage = this.collection.models[0];
this.reshare = this.collection.models[1];
- })
+ });
describe("events", function(){
- var _PostViewClass = undefined;
- var author_id = undefined;
+ var _PostViewClass,
+ authorId;
beforeEach(function(){
_PostViewClass = this.PostViewClass;
@@ -20,7 +20,7 @@ describe("app.views.StreamPost", function(){
describe("remove posts for blocked person", function(){
it("setup remove:author:posts:#{id} to #remove", function(){
spyOn(_PostViewClass.prototype, 'remove');
- view = new _PostViewClass({model : this.statusMessage});
+ new _PostViewClass({model : this.statusMessage});
app.events.trigger('person:block:'+authorId);
expect(_PostViewClass.prototype.remove).toHaveBeenCalled();
});
@@ -42,6 +42,14 @@ describe("app.views.StreamPost", function(){
"ob_type": "article"
};
+ var open_graph_cache_extralong = {
+ "url": "http://example.com/articles/123",
+ "title": "Example title",
+ "description": Array(62).join("Test description"), // 992 chars
+ "image": "http://example.com/thumb.jpg",
+ "ob_type": "article"
+ };
+
beforeEach(function(){
loginAs({name: "alice", avatar : {small : "http://avatar.com/photo.jpg"}});
@@ -55,8 +63,8 @@ describe("app.views.StreamPost", function(){
one : "<%= count %> Like",
other : "<%= count %> Likes"
}
- }})
- })
+ }});
+ });
context("reshare", function(){
it("displays a reshare count", function(){
@@ -76,34 +84,34 @@ describe("app.views.StreamPost", function(){
context("likes", function(){
it("displays a like count", function(){
- this.statusMessage.interactions.set({likes_count : 1})
+ this.statusMessage.interactions.set({likes_count : 1});
var view = new this.PostViewClass({model : this.statusMessage}).render();
- expect($(view.el).html()).toContain(Diaspora.I18n.t('stream.likes', {count: 1}))
- })
+ expect($(view.el).html()).toContain(Diaspora.I18n.t('stream.likes', {count: 1}));
+ });
it("does not display a like count for 'zero'", function(){
- this.statusMessage.interactions.set({likes_count : 0})
+ this.statusMessage.interactions.set({likes_count : 0});
var view = new this.PostViewClass({model : this.statusMessage}).render();
- expect($(view.el).html()).not.toContain("0 Likes")
- })
- })
+ expect($(view.el).html()).not.toContain("0 Likes");
+ });
+ });
context("embed_html", function(){
it("provides oembed html from the model response", function(){
- this.statusMessage.set({"o_embed_cache" : o_embed_cache})
+ this.statusMessage.set({"o_embed_cache" : o_embed_cache});
var view = new app.views.StreamPost({model : this.statusMessage}).render();
- expect(view.$el.html()).toContain(o_embed_cache.data.html)
- })
- })
+ expect(view.$el.html()).toContain(o_embed_cache.data.html);
+ });
+ });
context("og_html", function(){
it("provides opengraph preview based on the model reponse", function(){
this.statusMessage.set({"open_graph_cache" : open_graph_cache});
var view = new app.views.StreamPost({model : this.statusMessage}).render();
- expect(view.$el.html()).toContain(open_graph_cache.title)
+ expect(view.$el.html()).toContain(open_graph_cache.title);
});
it("does not provide opengraph preview, when oembed is available", function(){
this.statusMessage.set({
@@ -112,17 +120,23 @@ describe("app.views.StreamPost", function(){
});
var view = new app.views.StreamPost({model : this.statusMessage}).render();
- expect(view.$el.html()).not.toContain(open_graph_cache.title)
- })
- })
+ expect(view.$el.html()).not.toContain(open_graph_cache.title);
+ });
+ it("truncates long opengraph descriptions in stream view to be 250 chars or less", function() {
+ this.statusMessage.set({"open_graph_cache" : open_graph_cache_extralong});
+
+ var view = new app.views.StreamPost({model : this.statusMessage}).render();
+ expect(view.$el.find('.og-description').html().length).toBeLessThan(251);
+ });
+ });
context("user not signed in", function(){
it("does not provide a Feedback view", function(){
- logout()
+ logout();
var view = new this.PostViewClass({model : this.statusMessage}).render();
expect(view.feedbackView()).toBeFalsy();
- })
- })
+ });
+ });
context("NSFW", function(){
beforeEach(function(){
@@ -130,19 +144,19 @@ describe("app.views.StreamPost", function(){
this.view = new this.PostViewClass({model : this.statusMessage}).render();
this.hiddenPosts = function(){
- return this.view.$(".nsfw-shield")
- }
+ return this.view.$(".nsfw-shield");
+ };
});
it("contains a shield element", function(){
- expect(this.hiddenPosts().length).toBe(1)
+ expect(this.hiddenPosts().length).toBe(1);
});
it("does not contain a shield element when nsfw is false", function(){
this.statusMessage.set({nsfw: false});
this.view.render();
expect(this.hiddenPosts()).not.toExist();
- })
+ });
context("showing a single post", function(){
it("removes the shields when the post is clicked", function(){
@@ -154,12 +168,12 @@ describe("app.views.StreamPost", function(){
context("clicking the toggle nsfw link toggles it on the user", function(){
it("calls toggleNsfw on the user", function(){
- spyOn(app.user(), "toggleNsfwState")
+ spyOn(app.user(), "toggleNsfwState");
this.view.$(".toggle_nsfw_state").first().click();
expect(app.user().toggleNsfwState).toHaveBeenCalled();
});
- })
- })
+ });
+ });
context("user views their own post", function(){
beforeEach(function(){
@@ -167,21 +181,21 @@ describe("app.views.StreamPost", function(){
id : app.user().id
}});
this.view = new this.PostViewClass({model : this.statusMessage}).render();
- })
+ });
it("contains remove post", function(){
expect(this.view.$(".remove_post")).toExist();
- })
+ });
it("destroys the view when they delete a their post from the show page", function(){
- spyOn(window, "confirm").andReturn(true);
+ spyOn(window, "confirm").and.returnValue(true);
this.view.$(".remove_post").click();
expect(window.confirm).toHaveBeenCalled();
- expect(this.view).not.toExist();
- })
- })
+ expect(this.view.el).not.toBeInDOM();
+ });
+ });
- })
+ });
});
diff --git a/spec/javascripts/app/views/stream_view_spec.js b/spec/javascripts/app/views/stream_view_spec.js
index dac66b2fc..412728222 100644
--- a/spec/javascripts/app/views/stream_view_spec.js
+++ b/spec/javascripts/app/views/stream_view_spec.js
@@ -40,21 +40,22 @@ describe("app.views.Stream", function() {
describe("infScroll", function() {
// NOTE: inf scroll happens at 500px
beforeEach(function(){
- spyOn($.fn, "height").andReturn(0);
- spyOn($.fn, "scrollTop").andReturn(100);
+ spyOn($.fn, "height").and.returnValue(0);
+ spyOn($.fn, "scrollTop").and.returnValue(100);
spyOn(this.view.model, "fetch");
});
- it("fetches moar when the user is at the bottom of the page", function() {
- this.view.infScroll();
-
- waitsFor(function(){
- return this.view.model.fetch.wasCalled
- }, "the infinite scroll function didn't fetch the stream");
+ describe('fetching more', function() {
+ beforeEach(function(done) {
+ this.view.on('loadMore', function() {
+ done();
+ });
+ this.view.infScroll();
+ });
- runs(function(){
- expect(this.view.model.fetch).toHaveBeenCalled()
+ it("fetches moar when the user is at the bottom of the page", function() {
+ expect(this.view.model.fetch).toHaveBeenCalled();
});
});
diff --git a/spec/javascripts/app/views/tag_following_action_view_spec.js b/spec/javascripts/app/views/tag_following_action_view_spec.js
index f82d60bb3..8639ee5fa 100644
--- a/spec/javascripts/app/views/tag_following_action_view_spec.js
+++ b/spec/javascripts/app/views/tag_following_action_view_spec.js
@@ -2,22 +2,22 @@ describe("app.views.TagFollowingAction", function(){
beforeEach(function(){
app.tagFollowings = new app.collections.TagFollowings();
this.tagName = "test_tag";
- this.view = new app.views.TagFollowingAction({tagName : this.tagName})
- })
+ this.view = new app.views.TagFollowingAction({tagName : this.tagName});
+ });
describe("render", function(){
it("shows the output of followString", function(){
- spyOn(this.view, "tag_is_followed").andReturn(false)
- spyOn(this.view, "followString").andReturn("a_follow_string")
- expect(this.view.render().$('input').val()).toMatch(/^a_follow_string$/)
- })
+ spyOn(this.view, "tag_is_followed").and.returnValue(false);
+ spyOn(this.view, "followString").and.returnValue("a_follow_string");
+ expect(this.view.render().$('input').val()).toMatch(/^a_follow_string$/);
+ });
it("should have the extra classes if the tag is followed", function(){
- spyOn(this.view, "tag_is_followed").andReturn(true)
- expect(this.view.render().$('input').hasClass("red_on_hover")).toBe(true)
- expect(this.view.render().$('input').hasClass("in_aspects")).toBe(true)
- })
- })
+ spyOn(this.view, "tag_is_followed").and.returnValue(true);
+ expect(this.view.render().$('input').hasClass("followed")).toBe(true);
+ expect(this.view.render().$('input').hasClass("green")).toBe(true);
+ });
+ });
describe("tagAction", function(){
it("toggles the tagFollowed from followed to unfollowed", function(){
@@ -26,25 +26,25 @@ describe("app.views.TagFollowingAction", function(){
this.view.model.set("id", 3);
expect(this.view.tag_is_followed()).toBe(true);
- spyOn(this.view.model, "destroy").andCallFake(_.bind(function(){
+ spyOn(this.view.model, "destroy").and.callFake(_.bind(function(){
// model.destroy leads to collection.remove, which is bound to getTagFollowing
this.view.getTagFollowing();
- }, this) )
+ }, this) );
this.view.tagAction();
- expect(origModel.destroy).toHaveBeenCalled()
+ expect(origModel.destroy).toHaveBeenCalled();
expect(this.view.tag_is_followed()).toBe(false);
- })
+ });
it("toggles the tagFollowed from unfollowed to followed", function(){
expect(this.view.tag_is_followed()).toBe(false);
- spyOn(app.tagFollowings, "create").andCallFake(function(model){
+ spyOn(app.tagFollowings, "create").and.callFake(function(model){
// 'save' the model by giving it an id
- model.set("id", 3)
- })
+ model.set("id", 3);
+ });
this.view.tagAction();
expect(this.view.tag_is_followed()).toBe(true);
- })
- })
-})
+ });
+ });
+});
diff --git a/spec/javascripts/app/views_spec.js b/spec/javascripts/app/views_spec.js
index e26eba16a..ec8861577 100644
--- a/spec/javascripts/app/views_spec.js
+++ b/spec/javascripts/app/views_spec.js
@@ -1,22 +1,22 @@
describe("app.views.Base", function(){
describe("#render", function(){
beforeEach(function(){
- var staticTemplateClass = app.views.Base.extend({ templateName : "static-text" })
+ var staticTemplateClass = app.views.Base.extend({ templateName : "static-text" });
- this.model = new Backbone.Model({text : "model attributes are in the default presenter"})
- this.view = new staticTemplateClass({model: this.model})
- this.view.render()
- })
+ this.model = new Backbone.Model({text : "model attributes are in the default presenter"});
+ this.view = new staticTemplateClass({model: this.model});
+ this.view.render();
+ });
it("renders the template with the presenter", function(){
- expect($(this.view.el).text().trim()).toBe("model attributes are in the default presenter")
- })
+ expect($(this.view.el).text().trim()).toBe("model attributes are in the default presenter");
+ });
it("it evaluates the presenter every render", function(){
- this.model.set({text : "OMG It's a party" })
- this.view.render()
- expect($(this.view.el).text().trim()).toBe("OMG It's a party")
- })
+ this.model.set({text : "OMG It's a party" });
+ this.view.render();
+ expect($(this.view.el).text().trim()).toBe("OMG It's a party");
+ });
context("subViewRendering", function(){
beforeEach(function(){
@@ -28,7 +28,7 @@ describe("app.views.Base", function(){
},
initialize : function(){
- this.subview1 = stubView("OMG First Subview")
+ this.subview1 = stubView("OMG First Subview");
},
presenter: {
@@ -36,47 +36,47 @@ describe("app.views.Base", function(){
},
postRenderTemplate : function(){
- $(this.el).append("<div class=subview1/>")
- $(this.el).append("<div class=subview2/>")
+ $(this.el).append("<div class=subview1/>");
+ $(this.el).append("<div class=subview2/>");
},
createSubview2 : function(){
- return stubView("furreal this is the Second Subview")
+ return stubView("furreal this is the Second Subview");
}
- })
+ });
- this.view = new viewClass().render()
- })
+ this.view = new viewClass().render();
+ });
it("repsects the respects the template rendered with the presenter", function(){
- expect(this.view.$('.text').text().trim()).toBe("this comes through on the original render")
- })
+ expect(this.view.$('.text').text().trim()).toBe("this comes through on the original render");
+ });
it("renders subviews from views that are properties of the object", function(){
- expect(this.view.$('.subview1').text().trim()).toBe("OMG First Subview")
- })
+ expect(this.view.$('.subview1').text().trim()).toBe("OMG First Subview");
+ });
it("renders the sub views from functions", function(){
- expect(this.view.$('.subview2').text().trim()).toBe("furreal this is the Second Subview")
- })
- })
+ expect(this.view.$('.subview2').text().trim()).toBe("furreal this is the Second Subview");
+ });
+ });
context("calling out to third party plugins", function(){
it("replaces .time with relative time ago in words", function(){
- spyOn($.fn, "timeago")
- this.view.render()
- expect($.fn.timeago).toHaveBeenCalled()
- expect($.fn.timeago.mostRecentCall.object.selector).toBe("time")
- })
+ spyOn($.fn, "timeago");
+ this.view.render();
+ expect($.fn.timeago).toHaveBeenCalled();
+ expect($.fn.timeago.calls.mostRecent().object.selector).toBe("time");
+ });
it("initializes tooltips declared with the view's tooltipSelector property", function(){
- this.view.tooltipSelector = ".christopher_columbus, .barrack_obama, .block_user"
-
- spyOn($.fn, "tooltip")
- this.view.render()
- expect($.fn.tooltip.mostRecentCall.object.selector).toBe(".christopher_columbus, .barrack_obama, .block_user")
- })
- })
- })
-})
+ this.view.tooltipSelector = ".christopher_columbus, .barrack_obama, .block_user";
+
+ spyOn($.fn, "tooltip");
+ this.view.render();
+ expect($.fn.tooltip.calls.mostRecent().object.selector).toBe(".christopher_columbus, .barrack_obama, .block_user");
+ });
+ });
+ });
+});
diff --git a/spec/javascripts/contact-list-spec.js b/spec/javascripts/contact-list-spec.js
deleted file mode 100644
index cd15181a4..000000000
--- a/spec/javascripts/contact-list-spec.js
+++ /dev/null
@@ -1,19 +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.
-*/
-
-describe("Contact List", function() {
- describe("disconnectUser", function() {
- it("does an ajax call to person delete with the passed in id", function(){
- var id = '3';
- spyOn($,'ajax');
- List.disconnectUser(id);
- expect($.ajax).toHaveBeenCalled();
- var option_hash = $.ajax.mostRecentCall.args[0];
- expect(option_hash.url).toEqual("/contacts/" + id);
- expect(option_hash.type).toEqual("DELETE");
- expect(option_hash.success).toBeDefined();
- });
- });
-});
diff --git a/spec/javascripts/diaspora-spec.js b/spec/javascripts/diaspora-spec.js
index 9c85666e5..944ee6ea7 100644
--- a/spec/javascripts/diaspora-spec.js
+++ b/spec/javascripts/diaspora-spec.js
@@ -57,8 +57,8 @@ describe("Diaspora", function() {
describe("subscribe", function() {
it("will subscribe to multiple events", function() {
var firstEventCalled = false,
- secondEventCalled = false
- events = Diaspora.EventBroker.extend({});
+ secondEventCalled = false,
+ events = Diaspora.EventBroker.extend({});
events.subscribe("first/event second/event", function() {
if (firstEventCalled) {
@@ -78,8 +78,8 @@ describe("Diaspora", function() {
describe("publish", function() {
it("will publish multiple events", function() {
var firstEventCalled = false,
- secondEventCalled = false
- events = Diaspora.EventBroker.extend({});
+ secondEventCalled = false,
+ events = Diaspora.EventBroker.extend({});
events.subscribe("first/event second/event", function() {
if (firstEventCalled) {
diff --git a/spec/javascripts/helpers/SpecHelper.js b/spec/javascripts/helpers/SpecHelper.js
index a58a1b6d7..9e7ac46cc 100644
--- a/spec/javascripts/helpers/SpecHelper.js
+++ b/spec/javascripts/helpers/SpecHelper.js
@@ -1,18 +1,51 @@
-// Add custom matchers here, in a beforeEach block. Example:
-//beforeEach(function() {
-// this.addMatchers({
-// toBePlaying: function(expectedSong) {
-// var player = this.actual;
-// return player.currentlyPlayingSong === expectedSong
-// && player.isPlaying;
-// }
-// })
-//});
+// for docs, see http://jasmine.github.io
+
+var realXMLHttpRequest = window.XMLHttpRequest;
+
+// matches flash messages with success/error and contained text
+var flashMatcher = function(flash, id, text) {
+ var textContained = true;
+ if( text ) {
+ textContained = (flash.text().indexOf(text) !== -1);
+ }
+
+ return flash.is(id) &&
+ flash.hasClass('expose') &&
+ textContained;
+};
+
+// information for jshint
+/* exported context */
+var context = describe;
+
+var spec = {};
+var customMatchers = {
+ toBeSuccessFlashMessage: function() {
+ return {
+ compare: function(actual, expected) {
+ var result = {};
+ result.pass = flashMatcher(actual, '#flash_notice', expected);
+ return result;
+ }
+ };
+ },
+ toBeErrorFlashMessage: function() {
+ return {
+ compare: function(actual, expected) {
+ var result = {};
+ result.pass = flashMatcher(actual, '#flash_error', expected);
+ return result;
+ }
+ };
+ }
+};
+
beforeEach(function() {
$('#jasmine_content').html(spec.readFixture("underscore_templates"));
- jasmine.Clock.useMock();
+ jasmine.clock().install();
+ jasmine.Ajax.install();
Diaspora.Pages.TestPage = function() {
var self = this;
@@ -29,63 +62,43 @@ beforeEach(function() {
Diaspora.page = new Page();
Diaspora.page.publish("page/ready", [$(document.body)]);
-
- // matches flash messages with success/error and contained text
- var flashMatcher = function(flash, id, text) {
- textContained = true;
- if( text ) {
- textContained = (flash.text().indexOf(text) !== -1);
- }
-
- return flash.is(id) &&
- flash.hasClass('expose') &&
- textContained;
- };
-
// add custom matchers for flash messages
- this.addMatchers({
- toBeSuccessFlashMessage: function(containedText) {
- var flash = this.actual;
- return flashMatcher(flash, '#flash_notice', containedText);
- },
-
- toBeErrorFlashMessage: function(containedText) {
- var flash = this.actual;
- return flashMatcher(flash, '#flash_error', containedText);
- }
- });
-
+ jasmine.addMatchers(customMatchers);
});
afterEach(function() {
//spec.clearLiveEventBindings();
- $("#jasmine_content").empty()
+
+ jasmine.clock().uninstall();
+ jasmine.Ajax.uninstall();
+
+ $("#jasmine_content").empty();
expect(spec.loadFixtureCount).toBeLessThan(2);
spec.loadFixtureCount = 0;
});
-var context = describe;
-var spec = {};
window.stubView = function stubView(text){
var stubClass = Backbone.View.extend({
render : function(){
$(this.el).html(text);
- return this
+ return this;
}
- })
+ });
- return new stubClass
-}
+ return new stubClass();
+};
window.loginAs = function loginAs(attrs){
- return app.currentUser = app.user(factory.userAttrs(attrs))
-}
+ app.currentUser = app.user(factory.userAttrs(attrs));
+ return app.currentUser;
+};
window.logout = function logout(){
- this.app._user = undefined
- return app.currentUser = new app.models.User()
-}
+ this.app._user = undefined;
+ app.currentUser = new app.models.User();
+ return app.currentUser;
+};
window.hipsterIpsumFourParagraphs = "Mcsweeney's mumblecore irony fugiat, ex iphone brunch helvetica eiusmod retro" +
" sustainable mlkshk. Pop-up gentrify velit readymade ad exercitation 3 wolf moon. Vinyl aute laboris artisan irony, " +
@@ -112,12 +125,14 @@ window.hipsterIpsumFourParagraphs = "Mcsweeney's mumblecore irony fugiat, ex iph
"mlkshk assumenda. Typewriter terry richardson pork belly, cupidatat tempor craft beer tofu sunt qui gentrify eiusmod " +
"id. Letterpress pitchfork wayfarers, eu sunt lomo helvetica pickled dreamcatcher bicycle rights. Aliqua banksy " +
"cliche, sapiente anim chambray williamsburg vinyl cardigan. Pork belly mcsweeney's anim aliqua. DIY vice portland " +
- "thundercats est vegan etsy, gastropub helvetica aliqua. Artisan jean shorts american apparel duis esse trust fund."
+ "thundercats est vegan etsy, gastropub helvetica aliqua. Artisan jean shorts american apparel duis esse trust fund.";
spec.clearLiveEventBindings = function() {
var events = jQuery.data(document, "events");
- for (prop in events) {
- delete events[prop];
+ for (var prop in events) {
+ if(events.hasOwnProperty(prop)) {
+ delete events[prop];
+ }
}
};
@@ -159,7 +174,7 @@ spec.retrieveFixture = function(fixtureName) {
// retrieve the fixture markup via xhr request to jasmine server
try {
- xhr = new jasmine.XmlHttpRequest();
+ xhr = new realXMLHttpRequest();
xhr.open("GET", path, false);
xhr.send(null);
} catch(e) {
diff --git a/spec/javascripts/helpers/factory.js b/spec/javascripts/helpers/factory.js
index b5dd63068..c3efcafb7 100644
--- a/spec/javascripts/helpers/factory.js
+++ b/spec/javascripts/helpers/factory.js
@@ -1,13 +1,13 @@
-factory = {
+var factory = {
id : {
current : 0,
next : function(){
- return factory.id.current += 1
+ return factory.id.current += 1;
}
},
guid : function(){
- return 'omGUID' + this.id.next()
+ return 'omGUID' + this.id.next();
},
like : function(overrides){
@@ -16,9 +16,9 @@ factory = {
"author" : this.author(),
"guid" : this.guid(),
"id" : this.id.next()
- }
+ };
- return _.extend(defaultAttrs, overrides)
+ return _.extend(defaultAttrs, overrides);
},
comment : function(overrides) {
@@ -28,17 +28,17 @@ factory = {
"guid" : this.guid(),
"id" : this.id.next(),
"text" : "This is a comment!"
- }
-
- return new app.models.Comment(_.extend(defaultAttrs, overrides))
+ };
+
+ return new app.models.Comment(_.extend(defaultAttrs, overrides));
},
user : function(overrides) {
- return new app.models.User(factory.userAttrs(overrides))
+ return new app.models.User(factory.userAttrs(overrides));
},
userAttrs : function(overrides){
- var id = this.id.next()
+ var id = this.id.next();
var defaultAttrs = {
"name":"Awesome User" + id,
"id": id,
@@ -47,9 +47,9 @@ factory = {
"large":"http://localhost:3000/images/user/uma.jpg",
"medium":"http://localhost:3000/images/user/uma.jpg",
"small":"http://localhost:3000/images/user/uma.jpg"}
- }
+ };
- return _.extend(defaultAttrs, overrides)
+ return _.extend(defaultAttrs, overrides);
},
postAttrs : function(){
@@ -76,11 +76,11 @@ factory = {
"likes" : [],
"reshares" : []
}
- }
+ };
},
- profile : function(overrides) {
- var id = overrides && overrides.id || factory.id.next()
+ profileAttrs: function(overrides) {
+ var id = (overrides && overrides.id) ? overrides.id : factory.id.next();
var defaults = {
"bio": "I am a cat lover and I love to run",
"birthday": "2012-04-17",
@@ -99,9 +99,38 @@ factory = {
"person_id": "person" + id,
"searchable": true,
"updated_at": "2012-04-17T23:48:36Z"
- }
+ };
+ return _.extend({}, defaults, overrides);
+ },
+
+ profile : function(overrides) {
+ return new app.models.Profile(factory.profileAttrs(overrides));
+ },
+
+ personAttrs: function(overrides) {
+ var id = (overrides && overrides.id) ? overrides.id : factory.id.next();
+ var defaults = {
+ "id": id,
+ "guid": factory.guid(),
+ "name": "Bob Grimm",
+ "diaspora_id": "bob@localhost:3000",
+ "relationship": "sharing",
+ "is_own_profile": false
+ };
+ return _.extend({}, defaults, overrides);
+ },
- return new app.models.Profile(_.extend(defaults, overrides))
+ person: function(overrides) {
+ return new app.models.Person(factory.personAttrs(overrides));
+ },
+
+ personWithProfile: function(overrides) {
+ var profile_overrides = _.clone(overrides.profile);
+ delete overrides.profile;
+ var defaults = {
+ profile: factory.profileAttrs(profile_overrides)
+ };
+ return factory.person(_.extend({}, defaults, overrides));
},
photoAttrs : function(overrides){
@@ -116,16 +145,16 @@ factory = {
medium: "http://localhost:3000/uploads/images/thumb_medium_d85410bd19db1016894c.jpg",
small: "http://localhost:3000/uploads/images/thumb_small_d85410bd19db1016894c.jpg"
}
- }, overrides)
+ }, overrides);
},
post : function(overrides) {
- defaultAttrs = _.extend(factory.postAttrs(), {"author" : this.author()})
- return new app.models.Post(_.extend(defaultAttrs, overrides))
+ var defaultAttrs = _.extend(factory.postAttrs(), {"author" : this.author()});
+ return new app.models.Post(_.extend(defaultAttrs, overrides));
},
postWithPoll : function(overrides) {
- defaultAttrs = _.extend(factory.postAttrs(), {"author" : this.author()});
+ var defaultAttrs = _.extend(factory.postAttrs(), {"author" : this.author()});
defaultAttrs = _.extend(defaultAttrs, {"already_participated_in_poll" : false});
defaultAttrs = _.extend(defaultAttrs, {"poll" : factory.poll()});
return new app.models.Post(_.extend(defaultAttrs, overrides));
@@ -133,10 +162,10 @@ factory = {
statusMessage : function(overrides){
//intentionally doesn't have an author to mirror creation process, maybe we should change the creation process
- return new app.models.StatusMessage(_.extend(factory.postAttrs(), overrides))
+ return new app.models.StatusMessage(_.extend(factory.postAttrs(), overrides));
},
- poll: function(overrides){
+ poll: function(){
return {
"question" : "This is an awesome question",
"created_at" : "2012-01-03T19:53:13Z",
@@ -146,20 +175,31 @@ factory = {
"guid" : this.guid(),
"poll_id": this.id.next(),
"participation_count" : 10
- }
+ };
},
- comment: function(overrides) {
+ aspectAttrs: function(overrides) {
+ var names = ['Work','School','Family','Friends','Just following','People','Interesting'];
var defaultAttrs = {
- "text" : "This is an awesome comment!",
- "created_at" : "2012-01-03T19:53:13Z",
- "author" : this.author(),
- "guid" : this.guid(),
- "id": this.id.next()
- }
+ name: names[Math.floor(Math.random()*names.length)]+' '+Math.floor(Math.random()*100),
+ selected: false
+ };
+
+ return _.extend({}, defaultAttrs, overrides);
+ },
+
+ aspect: function(overrides) {
+ return new app.models.Aspect(this.aspectAttrs(overrides));
+ },
+
+ preloads: function(overrides) {
+ var defaults = {
+ aspect_ids: []
+ };
- return new app.models.Comment(_.extend(defaultAttrs, overrides))
+ window.gon = { preloads: {} };
+ _.extend(window.gon.preloads, defaults, overrides);
}
-}
+};
-factory.author = factory.userAttrs
+factory.author = factory.userAttrs;
diff --git a/spec/javascripts/helpers/jasmine-jquery.js b/spec/javascripts/helpers/jasmine-jquery.js
deleted file mode 100644
index 0096c4fc5..000000000
--- a/spec/javascripts/helpers/jasmine-jquery.js
+++ /dev/null
@@ -1,203 +0,0 @@
-var readFixtures = function() {
- return jasmine.getFixtures().proxyCallTo_('read', arguments);
-};
-
-var loadFixtures = function() {
- jasmine.getFixtures().proxyCallTo_('load', arguments);
-};
-
-var setFixtures = function(html) {
- jasmine.getFixtures().set(html);
-}
-
-var sandbox = function(attributes) {
- return jasmine.getFixtures().sandbox(attributes);
-};
-
-jasmine.getFixtures = function() {
- return jasmine.currentFixtures_ = jasmine.currentFixtures_ || new jasmine.Fixtures();
-};
-
-jasmine.Fixtures = function() {
- this.containerId = 'jasmine-fixtures';
- this.fixturesCache_ = {};
-};
-
-jasmine.Fixtures.prototype.set = function(html) {
- this.cleanUp();
- this.createContainer_(html);
-};
-
-jasmine.Fixtures.prototype.load = function() {
- this.cleanUp();
- this.createContainer_(this.read.apply(this, arguments));
-};
-
-jasmine.Fixtures.prototype.read = function() {
- var htmlChunks = [];
-
- var fixtureUrls = arguments;
- for(var urlCount = fixtureUrls.length, urlIndex = 0; urlIndex < urlCount; urlIndex++) {
- htmlChunks.push(this.getFixtureHtml_(fixtureUrls[urlIndex]));
- }
-
- return htmlChunks.join('');
-};
-
-jasmine.Fixtures.prototype.clearCache = function() {
- this.fixturesCache_ = {};
-};
-
-jasmine.Fixtures.prototype.cleanUp = function() {
- $('#' + this.containerId).remove();
-};
-
-jasmine.Fixtures.prototype.sandbox = function(attributes) {
- var attributesToSet = attributes || {};
- return $('<div id="sandbox" />').attr(attributesToSet);
-};
-
-jasmine.Fixtures.prototype.createContainer_ = function(html) {
- var container = $('<div id="' + this.containerId + '" />');
- container.html(html);
- $('body').append(container);
-};
-
-jasmine.Fixtures.prototype.getFixtureHtml_ = function(url) {
- if (typeof this.fixturesCache_[url] == 'undefined') {
- this.loadFixtureIntoCache_(url);
- }
- return this.fixturesCache_[url];
-};
-
-jasmine.Fixtures.prototype.loadFixtureIntoCache_ = function(url) {
- var self = this;
- $.ajax({
- async: false, // must be synchronous to guarantee that no tests are run before fixture is loaded
- cache: false,
- dataType: 'html',
- url: url,
- success: function(data) {
- self.fixturesCache_[url] = data;
- }
- });
-};
-
-jasmine.Fixtures.prototype.proxyCallTo_ = function(methodName, passedArguments) {
- return this[methodName].apply(this, passedArguments);
-};
-
-
-jasmine.JQuery = function() {};
-
-jasmine.JQuery.browserTagCaseIndependentHtml = function(html) {
- return $('<div/>').append(html).html();
-};
-
-jasmine.JQuery.elementToString = function(element) {
- return $('<div />').append(element.clone()).html();
-};
-
-jasmine.JQuery.matchersClass = {};
-
-
-(function(){
- var jQueryMatchers = {
- toHaveClass: function(className) {
- return this.actual.hasClass(className);
- },
-
- toBeVisible: function() {
- return this.actual.is(':visible');
- },
-
- toBeHidden: function() {
- return this.actual.is(':hidden');
- },
-
- toBeSelected: function() {
- return this.actual.is(':selected');
- },
-
- toBeChecked: function() {
- return this.actual.is(':checked');
- },
-
- toBeEmpty: function() {
- return this.actual.is(':empty');
- },
-
- toExist: function() {
- return this.actual.size() > 0;
- },
-
- toHaveAttr: function(attributeName, expectedAttributeValue) {
- return hasProperty(this.actual.attr(attributeName), expectedAttributeValue);
- },
-
- toHaveId: function(id) {
- return this.actual.attr('id') == id;
- },
-
- toHaveHtml: function(html) {
- return this.actual.html() == jasmine.JQuery.browserTagCaseIndependentHtml(html);
- },
-
- toHaveText: function(text) {
- return this.actual.text() == text;
- },
-
- toHaveValue: function(value) {
- return this.actual.val() == value;
- },
-
- toHaveData: function(key, expectedValue) {
- return hasProperty(this.actual.data(key), expectedValue);
- },
-
- toBe: function(selector) {
- return this.actual.is(selector);
- },
-
- toContain: function(selector) {
- return this.actual.find(selector).size() > 0;
- }
- };
-
- var hasProperty = function(actualValue, expectedValue) {
- if (expectedValue === undefined) {
- return actualValue !== undefined;
- }
- return actualValue == expectedValue;
- };
-
- var bindMatcher = function(methodName) {
- var builtInMatcher = jasmine.Matchers.prototype[methodName];
-
- jasmine.JQuery.matchersClass[methodName] = function() {
- if (this.actual instanceof jQuery) {
- var result = jQueryMatchers[methodName].apply(this, arguments);
- this.actual = jasmine.JQuery.elementToString(this.actual);
- return result;
- }
-
- if (builtInMatcher) {
- return builtInMatcher.apply(this, arguments);
- }
-
- return false;
- };
- };
-
- for(var methodName in jQueryMatchers) {
- bindMatcher(methodName);
- }
-})();
-
-beforeEach(function() {
- this.addMatchers(jasmine.JQuery.matchersClass);
-});
-
-afterEach(function() {
- jasmine.getFixtures().cleanUp();
-}); \ No newline at end of file
diff --git a/spec/javascripts/helpers/mock-ajax.js b/spec/javascripts/helpers/mock-ajax.js
deleted file mode 100644
index 249efc907..000000000
--- a/spec/javascripts/helpers/mock-ajax.js
+++ /dev/null
@@ -1,207 +0,0 @@
-/*
- Jasmine-Ajax : a set of helpers for testing AJAX requests under the Jasmine
- BDD framework for JavaScript.
-
- Supports both Prototype.js and jQuery.
-
- http://github.com/pivotal/jasmine-ajax
-
- Jasmine Home page: http://pivotal.github.com/jasmine
-
- Copyright (c) 2008-2010 Pivotal Labs
-
- Permission is hereby granted, free of charge, to any person obtaining
- a copy of this software and associated documentation files (the
- "Software"), to deal in the Software without restriction, including
- without limitation the rights to use, copy, modify, merge, publish,
- distribute, sublicense, and/or sell copies of the Software, and to
- permit persons to whom the Software is furnished to do so, subject to
- the following conditions:
-
- The above copyright notice and this permission notice shall be
- included in all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
- LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
- OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
- */
-
-// Jasmine-Ajax interface
-var ajaxRequests = [];
-
-function mostRecentAjaxRequest() {
- if (ajaxRequests.length > 0) {
- return ajaxRequests[ajaxRequests.length - 1];
- } else {
- return null;
- }
-}
-
-function clearAjaxRequests() {
- ajaxRequests = [];
-}
-
-// Fake XHR for mocking Ajax Requests & Responses
-function FakeXMLHttpRequest() {
- var extend = Object.extend || $.extend;
- extend(this, {
- requestHeaders: {},
-
- open: function() {
- this.method = arguments[0];
- this.url = arguments[1];
- this.readyState = 1;
- },
-
- setRequestHeader: function(header, value) {
- this.requestHeaders[header] = value;
- },
-
- abort: function() {
- this.readyState = 0;
- },
-
- readyState: 0,
-
- onreadystatechange: function(isTimeout) {
- },
-
- status: null,
-
- send: function(data) {
- this.params = data;
- this.readyState = 2;
- },
-
- getResponseHeader: function(name) {
- return this.responseHeaders[name];
- },
-
- getAllResponseHeaders: function() {
- var responseHeaders = [];
- for (var i in this.responseHeaders) {
- if (this.responseHeaders.hasOwnProperty(i)) {
- responseHeaders.push(i + ': ' + this.responseHeaders[i]);
- }
- }
- return responseHeaders.join('\r\n');
- },
-
- responseText: null,
-
- response: function(response) {
- this.status = response.status;
- this.responseText = response.responseText || "";
- this.readyState = 4;
- this.responseHeaders = response.responseHeaders ||
- {"Content-type": response.contentType || "application/json" };
- // uncomment for jquery 1.3.x support
- // jasmine.Clock.tick(20);
-
- this.onreadystatechange();
- },
- responseTimeout: function() {
- this.readyState = 4;
- jasmine.Clock.tick(jQuery.ajaxSettings.timeout || 30000);
- this.onreadystatechange('timeout');
- }
- });
-
- return this;
-}
-
-
-jasmine.Ajax = {
-
- isInstalled: function() {
- return jasmine.Ajax.installed == true;
- },
-
- assertInstalled: function() {
- if (!jasmine.Ajax.isInstalled()) {
- throw new Error("Mock ajax is not installed, use jasmine.Ajax.useMock()")
- }
- },
-
- useMock: function() {
- if (!jasmine.Ajax.isInstalled()) {
- var spec = jasmine.getEnv().currentSpec;
- spec.after(jasmine.Ajax.uninstallMock);
-
- jasmine.Ajax.installMock();
- }
- },
-
- installMock: function() {
- if (typeof jQuery != 'undefined') {
- jasmine.Ajax.installJquery();
- } else if (typeof Prototype != 'undefined') {
- jasmine.Ajax.installPrototype();
- } else {
- throw new Error("jasmine.Ajax currently only supports jQuery and Prototype");
- }
- jasmine.Ajax.installed = true;
- },
-
- installJquery: function() {
- jasmine.Ajax.mode = 'jQuery';
- jasmine.Ajax.real = jQuery.ajaxSettings.xhr;
- jQuery.ajaxSettings.xhr = jasmine.Ajax.jQueryMock;
-
- },
-
- installPrototype: function() {
- jasmine.Ajax.mode = 'Prototype';
- jasmine.Ajax.real = Ajax.getTransport;
-
- Ajax.getTransport = jasmine.Ajax.prototypeMock;
- },
-
- uninstallMock: function() {
- jasmine.Ajax.assertInstalled();
- if (jasmine.Ajax.mode == 'jQuery') {
- jQuery.ajaxSettings.xhr = jasmine.Ajax.real;
- } else if (jasmine.Ajax.mode == 'Prototype') {
- Ajax.getTransport = jasmine.Ajax.real;
- }
- jasmine.Ajax.reset();
- },
-
- reset: function() {
- jasmine.Ajax.installed = false;
- jasmine.Ajax.mode = null;
- jasmine.Ajax.real = null;
- },
-
- jQueryMock: function() {
- var newXhr = new FakeXMLHttpRequest();
- ajaxRequests.push(newXhr);
- return newXhr;
- },
-
- prototypeMock: function() {
- return new FakeXMLHttpRequest();
- },
-
- installed: false,
- mode: null
-}
-
-
-// Jasmine-Ajax Glue code for Prototype.js
-if (typeof Prototype != 'undefined' && Ajax && Ajax.Request) {
- Ajax.Request.prototype.originalRequest = Ajax.Request.prototype.request;
- Ajax.Request.prototype.request = function(url) {
- this.originalRequest(url);
- ajaxRequests.push(this);
- };
-
- Ajax.Request.prototype.response = function(responseOptions) {
- return this.transport.response(responseOptions);
- };
-} \ No newline at end of file
diff --git a/spec/javascripts/osmlocator-spec.js b/spec/javascripts/osmlocator-spec.js
index 173ea4a5b..cc982e2bb 100644
--- a/spec/javascripts/osmlocator-spec.js
+++ b/spec/javascripts/osmlocator-spec.js
@@ -1,24 +1,25 @@
describe("Locator", function(){
- navigator.geolocation['getCurrentPosition'] = function(myCallback){
- lat = 1;
- lon = 2;
- position = { coords: { latitude: lat, longitude: lon} }
+ navigator.geolocation = {};
+ navigator.geolocation.getCurrentPosition = function(myCallback){
+ var lat = 1;
+ var lon = 2;
+ var position = { coords: { latitude: lat, longitude: lon} };
return myCallback(position);
};
$.getJSON = function(url, myCallback){
- if(url == "https://nominatim.openstreetmap.org/reverse?format=json&lat=1&lon=2&addressdetails=3")
+ if(url === "https://nominatim.openstreetmap.org/reverse?format=json&lat=1&lon=2&addressdetails=3")
{
- return myCallback({ display_name: 'locator address' })
+ return myCallback({ display_name: 'locator address' });
}
- }
+ };
var osmlocator = new OSM.Locator();
it("should return address, latitude, and longitude using getAddress method", function(){
osmlocator.getAddress(function(display_name, coordinates){
- expect(display_name, 'locator address')
- expect(coordinates, { latitude: 1, longitude: 2 })
- })
+ expect(display_name, 'locator address');
+ expect(coordinates, { latitude: 1, longitude: 2 });
+ });
});
});
diff --git a/spec/javascripts/rails-spec.js b/spec/javascripts/rails-spec.js
index ae6424a21..5808daa6a 100644
--- a/spec/javascripts/rails-spec.js
+++ b/spec/javascripts/rails-spec.js
@@ -23,10 +23,10 @@ describe("rails", function() {
it('should not clear normal hidden fields', function(){
$('#form').trigger('ajax:success');
expect($('#standard_hidden').val()).toEqual("keep this value");
- })
+ });
it('should clear hidden fields marked clear_on_submit', function(){
$('#form').trigger('ajax:success');
expect($('#clearable_hidden').val()).toEqual("");
- })
+ });
});
});
diff --git a/spec/javascripts/search-spec.js b/spec/javascripts/search-spec.js
index f1c41d0ba..ba767fe88 100644
--- a/spec/javascripts/search-spec.js
+++ b/spec/javascripts/search-spec.js
@@ -4,10 +4,10 @@
*/
describe("List", function() {
+ /* global List */
describe("runDelayedSearch", function() {
beforeEach( function(){
spec.loadFixture('empty_people_search');
- List.initialize();
});
it('inserts contact html', function(){
diff --git a/spec/javascripts/support/jasmine.yml b/spec/javascripts/support/jasmine.yml
index 88ff13ea4..50f11c159 100644
--- a/spec/javascripts/support/jasmine.yml
+++ b/spec/javascripts/support/jasmine.yml
@@ -12,6 +12,7 @@
src_files:
# Precompile all scripts together for the test environment
- assets/jasmine-load-all.js
+ - assets/jasmine-jquery.js
# stylesheets
#
@@ -25,10 +26,9 @@ src_files:
# - stylesheets/*.css
#
stylesheets:
- - assets/blueprint.css
- assets/bootstrap.css
- assets/default.css
- - assets/new-templates.css
+ - assets/application.css
# helpers
#
diff --git a/spec/javascripts/widgets/back-to-top-spec.js b/spec/javascripts/widgets/back-to-top-spec.js
index ea2e5337f..35543969a 100644
--- a/spec/javascripts/widgets/back-to-top-spec.js
+++ b/spec/javascripts/widgets/back-to-top-spec.js
@@ -33,13 +33,13 @@ describe("Diaspora.Widgets.BackToTop", function() {
describe("toggleVisibility", function() {
it("adds a visibility class to the button", function() {
- var spy = spyOn(backToTop.body, "scrollTop").andReturn(999);
+ var spy = spyOn(backToTop.body, "scrollTop").and.returnValue(999);
backToTop.toggleVisibility();
expect(backToTop.button.hasClass("visible")).toBe(false);
- spy.andReturn(1001);
+ spy.and.returnValue(1001);
backToTop.toggleVisibility();
@@ -50,4 +50,4 @@ describe("Diaspora.Widgets.BackToTop", function() {
afterEach(function() {
$.fx.off = false;
});
-}); \ No newline at end of file
+});
diff --git a/spec/javascripts/widgets/flash-messages-spec.js b/spec/javascripts/widgets/flash-messages-spec.js
index 12bb2c0c2..f2e02bd9c 100644
--- a/spec/javascripts/widgets/flash-messages-spec.js
+++ b/spec/javascripts/widgets/flash-messages-spec.js
@@ -14,7 +14,7 @@ describe("Diaspora", function() {
});
it("is called when the DOM is ready", function() {
- spyOn(flashMessages, "animateMessages").andCallThrough();
+ spyOn(flashMessages, "animateMessages").and.callThrough();
flashMessages.publish("widget/ready");
expect(flashMessages.animateMessages).toHaveBeenCalled();
});
diff --git a/spec/javascripts/widgets/i18n-spec.js b/spec/javascripts/widgets/i18n-spec.js
index be404d73e..2315957ce 100644
--- a/spec/javascripts/widgets/i18n-spec.js
+++ b/spec/javascripts/widgets/i18n-spec.js
@@ -88,7 +88,7 @@ describe("Diaspora.I18n", function() {
describe("::reset", function(){
it("clears the current locale", function() {
Diaspora.I18n.load(locale, "en", locale);
- Diaspora.I18n.reset()
+ Diaspora.I18n.reset();
expect(Diaspora.I18n.locale.data).toEqual({});
});
diff --git a/spec/javascripts/widgets/lightbox-spec.js b/spec/javascripts/widgets/lightbox-spec.js
index 2ca0dfaad..52d5ee7f9 100644
--- a/spec/javascripts/widgets/lightbox-spec.js
+++ b/spec/javascripts/widgets/lightbox-spec.js
@@ -13,7 +13,7 @@ describe("Diaspora.Widgets.Lightbox", function() {
imageClass: 'stream-photo'
};
- classes = _.extend(defaults, opts);
+ var classes = _.extend(defaults, opts);
var output = $('<div/>').addClass(classes.imageParent);
_.each(photos, function(photo){
@@ -48,7 +48,7 @@ describe("Diaspora.Widgets.Lightbox", function() {
});
context("opens the lightbox correctly", function() {
- var lightbox, page, photoElement;
+ var lightbox, photoElement;
beforeEach(function() {
$("#jasmine_content").append(createDummyMarkup());
@@ -67,7 +67,7 @@ describe("Diaspora.Widgets.Lightbox", function() {
});
context("opens lightbox for differently named elements", function(){
- var lightbox, page, photoElement;
+ var lightbox, photoElement;
beforeEach(function() {
$("#jasmine_content").append(createDummyMarkup({
diff --git a/spec/javascripts/widgets/notifications-spec.js b/spec/javascripts/widgets/notifications-spec.js
deleted file mode 100644
index 84ded9b46..000000000
--- a/spec/javascripts/widgets/notifications-spec.js
+++ /dev/null
@@ -1,122 +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.
- */
-describe("Diaspora.Widgets.Notifications", function() {
- var changeNotificationCountSpy, notifications, incrementCountSpy, decrementCountSpy;
-
- beforeEach(function() {
- spec.loadFixture("aspects_index");
- this.view = new app.views.Header().render();
-
- notifications = Diaspora.BaseWidget.instantiate("Notifications", this.view.$("#notification_badge .badge_count"), this.view.$(".notifications"));
-
- changeNotificationCountSpy = spyOn(notifications, "changeNotificationCount").andCallThrough();
- incrementCountSpy = spyOn(notifications, "incrementCount").andCallThrough();
- decrementCountSpy = spyOn(notifications, "decrementCount").andCallThrough();
- });
-
- describe("clickSuccess", function(){
- it("changes the css to a read cell at stream element", function() {
- this.view.$(".notifications").html(
- '<div id="1" class="stream_element read" data-guid=1></div>' +
- '<div id="2" class="stream_element unread" data-guid=2></div>'
- );
- notifications.clickSuccess({guid:2,unread:false});
- expect( this.view.$('.stream_element#2')).toHaveClass("read");
- });
- it("changes the css to a read cell at notications element", function() {
- this.view.$(".notifications").html(
- '<div id="1" class="notification_element read" data-guid=1></div>' +
- '<div id="2" class="notification_element unread" data-guid=2></div>'
- );
- notifications.clickSuccess({guid:2,unread:false});
- expect( this.view.$('.notification_element#2')).toHaveClass("read");
- });
- it("changes the css to an unread cell at stream element", function() {
- this.view.$(".notifications").html(
- '<div id="1" class="stream_element read" data-guid=1></div>' +
- '<div id="2" class="stream_element unread" data-guid=2></div>'
- );
- notifications.clickSuccess({guid:1,unread:true});
- expect( this.view.$('.stream_element#1')).toHaveClass("unread");
- });
- it("changes the css to an unread cell at notications element", function() {
- this.view.$(".notifications").html(
- '<div id="1" class="notification_element read" data-guid=1></div>' +
- '<div id="2" class="notification_element unread" data-guid=2></div>'
- );
- notifications.clickSuccess({guid:1,unread:true});
- expect( this.view.$('.notification_element#1')).toHaveClass("unread");
- });
-
-
- it("calls Notifications.decrementCount on a read cell at stream/notification element", function() {
- notifications.clickSuccess(JSON.stringify({guid:1,unread:false}));
- expect(notifications.decrementCount).toHaveBeenCalled();
- });
- it("calls Notifications.incrementCount on a unread cell at stream/notification element", function() {
- notifications.clickSuccess({guid:1,unread:true});
- expect(notifications.incrementCount).toHaveBeenCalled();
- });
- });
-
- describe("decrementCount", function() {
- it("wont decrement Notifications.count below zero", function() {
- var originalCount = notifications.count;
- notifications.decrementCount();
- expect(originalCount).toEqual(0);
- expect(notifications.count).toEqual(0);
- });
-
- it("decrements Notifications.count", function() {
- notifications.incrementCount();
- notifications.incrementCount();
- var originalCount = notifications.count;
- notifications.decrementCount();
- expect(notifications.count).toBeLessThan(originalCount);
- });
-
- it("calls Notifications.changeNotificationCount", function() {
- notifications.decrementCount();
- expect(notifications.changeNotificationCount).toHaveBeenCalled();
- })
- });
-
- describe("incrementCount", function() {
- it("increments Notifications.count", function() {
- var originalCount = notifications.count;
- notifications.incrementCount();
- expect(notifications.count).toBeGreaterThan(originalCount);
- });
-
- it("calls Notifications.changeNotificationCount", function() {
- notifications.incrementCount();
- expect(notifications.changeNotificationCount).toHaveBeenCalled();
- });
- });
-
- describe("showNotification", function() {
- it("prepends a div to div#notifications", function() {
- expect(this.view.$(".notifications div").length).toEqual(1);
-
- notifications.showNotification({
- html: '<div class="notification_element"></div>'
- });
-
- expect(this.view.$(".notifications div").length).toEqual(2);
- });
-
- it("only increments the notification count if specified to do so", function() {
- var originalCount = notifications.count;
-
- notifications.showNotification({
- html: '<div class="notification"></div>',
- incrementCount: false
- });
-
- expect(notifications.count).toEqual(originalCount);
-
- });
- });
-});
diff --git a/spec/javascripts/widgets/search-spec.js b/spec/javascripts/widgets/search-spec.js
deleted file mode 100644
index 0e06516c2..000000000
--- a/spec/javascripts/widgets/search-spec.js
+++ /dev/null
@@ -1,12 +0,0 @@
-describe("Diaspora.Widgets.Search", function() {
- describe("parse", function() {
- it("escapes a persons name", function() {
- $("#jasmine_content").html('<form action="#" id="searchForm"></form>');
-
- var search = Diaspora.BaseWidget.instantiate("Search", $("#jasmine_content > #searchForm"));
- var person = {"name": "</script><script>alert('xss');</script"};
- result = search.parse([$.extend({}, person)]);
- expect(result[0].data.name).toNotEqual(person.name);
- });
- });
-});
diff --git a/spec/lib/account_deleter_spec.rb b/spec/lib/account_deleter_spec.rb
index 339224c48..a8d525eb8 100644
--- a/spec/lib/account_deleter_spec.rb
+++ b/spec/lib/account_deleter_spec.rb
@@ -11,8 +11,8 @@ describe AccountDeleter do
end
it "attaches the user" do
- AccountDeleter.new(bob.person.diaspora_handle).user.should == bob
- AccountDeleter.new(remote_raphael.diaspora_handle).user.should == nil
+ expect(AccountDeleter.new(bob.person.diaspora_handle).user).to eq(bob)
+ expect(AccountDeleter.new(remote_raphael.diaspora_handle).user).to eq(nil)
end
describe '#perform' do
@@ -38,11 +38,26 @@ describe AccountDeleter do
(user_removal_methods + person_removal_methods).each do |method|
it "calls ##{method.to_s}" do
- @account_deletion.should_receive(method)
+ expect(@account_deletion).to receive(method)
end
end
end
+ context "profile deletion" do
+ before do
+ @profile_deletion = AccountDeleter.new(remote_raphael.diaspora_handle)
+ @profile = remote_raphael.profile
+ end
+
+ it "nulls out fields in the profile" do
+ @profile_deletion.perform!
+ expect(@profile.reload.first_name).to be_blank
+ expect(@profile.last_name).to be_blank
+ expect(@profile.searchable).to be_falsey
+ end
+
+ end
+
context "person deletion" do
before do
@person_deletion = AccountDeleter.new(remote_raphael.diaspora_handle)
@@ -55,14 +70,14 @@ describe AccountDeleter do
(user_removal_methods).each do |method|
it "does not call ##{method.to_s}" do
- @person_deletion.should_not_receive(method)
+ expect(@person_deletion).not_to receive(method)
end
end
(person_removal_methods).each do |method|
it "calls ##{method.to_s}" do
- @person_deletion.should_receive(method)
+ expect(@person_deletion).to receive(method)
end
end
end
@@ -73,8 +88,8 @@ describe AccountDeleter do
it 'removes all standard user associaltions' do
@account_deletion.normal_ar_user_associates_to_delete.each do |asso|
association_double = double
- association_double.should_receive(:destroy)
- bob.should_receive(asso).and_return([association_double])
+ expect(association_double).to receive(:destroy)
+ expect(bob).to receive(asso).and_return([association_double])
end
@account_deletion.delete_standard_user_associations
@@ -88,8 +103,8 @@ describe AccountDeleter do
it 'removes all standard person associaltions' do
@account_deletion.normal_ar_person_associates_to_delete.each do |asso|
association_double = double
- association_double.should_receive(:destroy_all)
- bob.person.should_receive(asso).and_return(association_double)
+ expect(association_double).to receive(:destroy_all)
+ expect(bob.person).to receive(asso).and_return(association_double)
end
@account_deletion.delete_standard_person_associations
@@ -99,8 +114,8 @@ describe AccountDeleter do
describe "#disassociate_invitations" do
it "sets invitations_from_me to be admin invitations" do
invites = [double]
- bob.stub(:invitations_from_me).and_return(invites)
- invites.first.should_receive(:convert_to_admin!)
+ allow(bob).to receive(:invitations_from_me).and_return(invites)
+ expect(invites.first).to receive(:convert_to_admin!)
@account_deletion.disassociate_invitations
end
end
@@ -108,7 +123,7 @@ describe AccountDeleter do
context 'person associations' do
describe '#disconnect_contacts' do
it "deletes all of user's contacts" do
- bob.contacts.should_receive(:destroy_all)
+ expect(bob.contacts).to receive(:destroy_all)
@account_deletion.disconnect_contacts
end
end
@@ -116,28 +131,28 @@ describe AccountDeleter do
describe '#delete_contacts_of_me' do
it 'deletes all the local contact objects where deleted account is the person' do
contacts = double
- Contact.should_receive(:all_contacts_of_person).with(bob.person).and_return(contacts)
- contacts.should_receive(:destroy_all)
+ expect(Contact).to receive(:all_contacts_of_person).with(bob.person).and_return(contacts)
+ expect(contacts).to receive(:destroy_all)
@account_deletion.delete_contacts_of_me
end
end
describe '#tombstone_person_and_profile' do
it 'calls clear_profile! on person' do
- @account_deletion.person.should_receive(:clear_profile!)
+ expect(@account_deletion.person).to receive(:clear_profile!)
@account_deletion.tombstone_person_and_profile
end
it 'calls lock_access! on person' do
- @account_deletion.person.should_receive(:lock_access!)
+ expect(@account_deletion.person).to receive(:lock_access!)
@account_deletion.tombstone_person_and_profile
end
end
describe "#remove_conversation_visibilities" do
it "removes the conversation visibility for the deleted user" do
vis = double
- ConversationVisibility.should_receive(:where).with(hash_including(:person_id => bob.person.id)).and_return(vis)
- vis.should_receive(:destroy_all)
+ expect(ConversationVisibility).to receive(:where).with(hash_including(:person_id => bob.person.id)).and_return(vis)
+ expect(vis).to receive(:destroy_all)
@account_deletion.remove_conversation_visibilities
end
end
@@ -146,8 +161,8 @@ describe AccountDeleter do
describe "#remove_person_share_visibilities" do
it 'removes the share visibilities for a person ' do
@s_vis = double
- ShareVisibility.should_receive(:for_contacts_of_a_person).with(bob.person).and_return(@s_vis)
- @s_vis.should_receive(:destroy_all)
+ expect(ShareVisibility).to receive(:for_contacts_of_a_person).with(bob.person).and_return(@s_vis)
+ expect(@s_vis).to receive(:destroy_all)
@account_deletion.remove_share_visibilities_on_persons_posts
end
@@ -156,8 +171,8 @@ describe AccountDeleter do
describe "#remove_share_visibilities_by_contacts_of_user" do
it 'removes the share visibilities for a user' do
@s_vis = double
- ShareVisibility.should_receive(:for_a_users_contacts).with(bob).and_return(@s_vis)
- @s_vis.should_receive(:destroy_all)
+ expect(ShareVisibility).to receive(:for_a_users_contacts).with(bob).and_return(@s_vis)
+ expect(@s_vis).to receive(:destroy_all)
@account_deletion.remove_share_visibilities_on_contacts_posts
end
@@ -165,19 +180,19 @@ describe AccountDeleter do
describe "#tombstone_user" do
it 'calls strip_model on user' do
- bob.should_receive(:clear_account!)
+ expect(bob).to receive(:clear_account!)
@account_deletion.tombstone_user
end
end
it 'has all user association keys accounted for' do
all_keys = (@account_deletion.normal_ar_user_associates_to_delete + @account_deletion.special_ar_user_associations + @account_deletion.ignored_ar_user_associations)
- all_keys.sort{|x, y| x.to_s <=> y.to_s}.should == User.reflections.keys.sort{|x, y| x.to_s <=> y.to_s}
+ expect(all_keys.sort{|x, y| x.to_s <=> y.to_s}).to eq(User.reflections.keys.sort{|x, y| x.to_s <=> y.to_s}.map(&:to_sym))
end
it 'has all person association keys accounted for' do
all_keys = (@account_deletion.normal_ar_person_associates_to_delete + @account_deletion.ignored_or_special_ar_person_associations)
- all_keys.sort{|x, y| x.to_s <=> y.to_s}.should == Person.reflections.keys.sort{|x, y| x.to_s <=> y.to_s}
+ expect(all_keys.sort{|x, y| x.to_s <=> y.to_s}).to eq(Person.reflections.keys.sort{|x, y| x.to_s <=> y.to_s}.map(&:to_sym))
end
end
diff --git a/spec/lib/configuration_methods_spec.rb b/spec/lib/configuration_methods_spec.rb
index 654dc4933..5ca9e3ca2 100644
--- a/spec/lib/configuration_methods_spec.rb
+++ b/spec/lib/configuration_methods_spec.rb
@@ -17,37 +17,37 @@ describe Configuration::Methods do
it "properly parses the pod url" do
@settings.environment.url = "http://example.org/"
- @settings.pod_uri.scheme.should == "http"
- @settings.pod_uri.host.should == "example.org"
+ expect(@settings.pod_uri.scheme).to eq("http")
+ expect(@settings.pod_uri.host).to eq("example.org")
end
it "adds a trailing slash if there isn't one" do
@settings.environment.url = "http://example.org"
- @settings.pod_uri.to_s.should == "http://example.org/"
+ expect(@settings.pod_uri.to_s).to eq("http://example.org/")
end
it "does not add an extra trailing slash" do
@settings.environment.url = "http://example.org/"
- @settings.pod_uri.to_s.should == "http://example.org/"
+ expect(@settings.pod_uri.to_s).to eq("http://example.org/")
end
it "adds http:// on the front if it's missing" do
@settings.environment.url = "example.org/"
- @settings.pod_uri.to_s.should == "http://example.org/"
+ expect(@settings.pod_uri.to_s).to eq("http://example.org/")
end
it "does not add a prefix if there already is https:// on the front" do
@settings.environment.url = "https://example.org/"
- @settings.pod_uri.to_s.should == "https://example.org/"
+ expect(@settings.pod_uri.to_s).to eq("https://example.org/")
end
end
describe "#bare_pod_uri" do
it 'is #pod_uri.authority stripping www.' do
pod_uri = double
- @settings.stub(:pod_uri).and_return(pod_uri)
- pod_uri.should_receive(:authority).and_return("www.example.org")
- @settings.bare_pod_uri.should == 'example.org'
+ allow(@settings).to receive(:pod_uri).and_return(pod_uri)
+ expect(pod_uri).to receive(:authority).and_return("www.example.org")
+ expect(@settings.bare_pod_uri).to eq('example.org')
end
end
@@ -55,44 +55,44 @@ describe Configuration::Methods do
it "includes the enabled services only" do
services = double
enabled = double
- enabled.stub(:enable?).and_return(true)
+ allow(enabled).to receive(:enable?).and_return(true)
disabled = double
- disabled.stub(:enable?).and_return(false)
- services.stub(:twitter).and_return(enabled)
- services.stub(:tumblr).and_return(enabled)
- services.stub(:facebook).and_return(disabled)
- services.stub(:wordpress).and_return(disabled)
- @settings.stub(:services).and_return(services)
- @settings.configured_services.should include :twitter
- @settings.configured_services.should include :tumblr
- @settings.configured_services.should_not include :facebook
- @settings.configured_services.should_not include :wordpress
+ allow(disabled).to receive(:enable?).and_return(false)
+ allow(services).to receive(:twitter).and_return(enabled)
+ allow(services).to receive(:tumblr).and_return(enabled)
+ allow(services).to receive(:facebook).and_return(disabled)
+ allow(services).to receive(:wordpress).and_return(disabled)
+ allow(@settings).to receive(:services).and_return(services)
+ expect(@settings.configured_services).to include :twitter
+ expect(@settings.configured_services).to include :tumblr
+ expect(@settings.configured_services).not_to include :facebook
+ expect(@settings.configured_services).not_to include :wordpress
end
end
describe "#version_string" do
before do
@version = double
- @version.stub(:number).and_return("0.0.0.0")
- @version.stub(:release?).and_return(true)
- @settings.stub(:version).and_return(@version)
- @settings.stub(:git_available?).and_return(false)
+ allow(@version).to receive(:number).and_return("0.0.0.0")
+ allow(@version).to receive(:release?).and_return(true)
+ allow(@settings).to receive(:version).and_return(@version)
+ allow(@settings).to receive(:git_available?).and_return(false)
@settings.instance_variable_set(:@version_string, nil)
end
it "includes the version" do
- @settings.version_string.should include @version.number
+ expect(@settings.version_string).to include @version.number
end
context "with git available" do
before do
- @settings.stub(:git_available?).and_return(true)
- @settings.stub(:git_revision).and_return("1234567890")
+ allow(@settings).to receive(:git_available?).and_return(true)
+ allow(@settings).to receive(:git_revision).and_return("1234567890")
end
it "includes the 'patchlevel'" do
- @settings.version_string.should include "-p#{@settings.git_revision[0..7]}"
- @settings.version_string.should_not include @settings.git_revision[0..8]
+ expect(@settings.version_string).to include "-p#{@settings.git_revision[0..7]}"
+ expect(@settings.version_string).not_to include @settings.git_revision[0..8]
end
end
end
@@ -104,7 +104,7 @@ describe Configuration::Methods do
end
it "uses that" do
- @settings.get_redis_options[:url].should match "myserver"
+ expect(@settings.get_redis_options[:url]).to match "myserver"
end
end
@@ -115,7 +115,7 @@ describe Configuration::Methods do
end
it "uses that" do
- @settings.get_redis_options[:url].should match "yourserver"
+ expect(@settings.get_redis_options[:url]).to match "yourserver"
end
end
@@ -127,7 +127,7 @@ describe Configuration::Methods do
end
it "uses that" do
- @settings.get_redis_options[:url].should match "ourserver"
+ expect(@settings.get_redis_options[:url]).to match "ourserver"
end
end
@@ -139,7 +139,7 @@ describe Configuration::Methods do
end
it "uses that" do
- @settings.get_redis_options[:url].should match "/tmp/redis.sock"
+ expect(@settings.get_redis_options[:url]).to match "/tmp/redis.sock"
end
end
end
@@ -148,9 +148,9 @@ describe Configuration::Methods do
context "with a relative log set" do
it "joins that with Rails.root" do
path = "/some/path/"
- Rails.stub(:root).and_return(double(join: path))
+ allow(Rails).to receive(:root).and_return(double(join: path))
@settings.environment.sidekiq.log = "relative_path"
- @settings.sidekiq_log.should match path
+ expect(@settings.sidekiq_log).to match path
end
end
@@ -158,7 +158,7 @@ describe Configuration::Methods do
it "just returns that" do
path = "/foobar.log"
@settings.environment.sidekiq.log = path
- @settings.sidekiq_log.should == path
+ expect(@settings.sidekiq_log).to eq(path)
end
end
end
diff --git a/spec/lib/csv_generator_spec.rb b/spec/lib/csv_generator_spec.rb
deleted file mode 100644
index 589c879eb..000000000
--- a/spec/lib/csv_generator_spec.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-require 'spec_helper'
-#
-#describe CsvGenerator do
-# describe '.all_active_users' do
-#
-# end
-#
-# describe '.all_inactive_invited_users' do
-#
-# end
-#
-# describe '.waitlist_sent' do
-#
-# end
-#
-# describe '.waitlist_pending' do
-#
-# end
-#end
diff --git a/spec/lib/diaspora/camo_spec.rb b/spec/lib/diaspora/camo_spec.rb
new file mode 100644
index 000000000..3e970340e
--- /dev/null
+++ b/spec/lib/diaspora/camo_spec.rb
@@ -0,0 +1,55 @@
+# Copyright (c) 2010, Diaspora Inc. This file is
+# 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/'
+ AppConfig.privacy.camo.key = 'kittenpower'
+
+ @raw_image_url = 'http://example.com/kitten.jpg'
+ @camo_image_url = AppConfig.privacy.camo.root + '5bc5b9d7ebd202841ab0667c4fc8d4304278f902/687474703a2f2f6578616d706c652e636f6d2f6b697474656e2e6a7067'
+ end
+
+ describe '#image_url' do
+ it 'should not rewrite local URLs' do
+ local_image = AppConfig.environment.url + 'kitten.jpg'
+ expect(Diaspora::Camo.image_url(local_image)).to eq(local_image)
+ end
+
+ it 'should not rewrite relative URLs' do
+ relative_image = '/kitten.jpg'
+ expect(Diaspora::Camo.image_url(relative_image)).to eq(relative_image)
+ end
+
+ it 'should not rewrite already camo-fied URLs' do
+ camo_image = AppConfig.privacy.camo.root + '1234/56789abcd'
+ expect(Diaspora::Camo.image_url(camo_image)).to eq(camo_image)
+ end
+
+ it 'should rewrite external URLs' do
+ expect(Diaspora::Camo.image_url(@raw_image_url)).to eq(@camo_image_url)
+ end
+ end
+
+ describe '#from_markdown' do
+ it 'should rewrite plain markdown images' do
+ expect(Diaspora::Camo.from_markdown("![](#{@raw_image_url})")).to include(@camo_image_url)
+ end
+
+ it 'should rewrite markdown images with alt texts' do
+ expect(Diaspora::Camo.from_markdown("![a kitten](#{@raw_image_url})")).to include(@camo_image_url)
+ end
+
+ it 'should rewrite markdown images with title texts' do
+ expect(Diaspora::Camo.from_markdown("![](#{@raw_image_url}) \"title\"")).to include(@camo_image_url)
+ end
+
+ it 'should rewrite URLs inside <img/> tags' do
+ image_tag = '<img src="' + @raw_image_url + '" />'
+ expect(Diaspora::Camo.from_markdown(image_tag)).to include(@camo_image_url)
+ end
+ end
+end
diff --git a/spec/lib/diaspora/encryptable_spec.rb b/spec/lib/diaspora/encryptable_spec.rb
index 7d0e13252..7419b7f61 100644
--- a/spec/lib/diaspora/encryptable_spec.rb
+++ b/spec/lib/diaspora/encryptable_spec.rb
@@ -11,19 +11,19 @@ describe Diaspora::Encryptable do
describe '#sign_with_key' do
it 'signs the object with RSA256 signature' do
sig = @comment.sign_with_key bob.encryption_key
- bob.public_key.verify(OpenSSL::Digest::SHA256.new, Base64.decode64(sig), @comment.signable_string).should be_true
+ expect(bob.public_key.verify(OpenSSL::Digest::SHA256.new, Base64.decode64(sig), @comment.signable_string)).to be true
end
end
describe '#verify_signature' do
it 'verifies SHA256 signatures' do
sig = @comment.sign_with_key bob.encryption_key
- @comment.verify_signature(sig, bob.person).should be_true
+ expect(@comment.verify_signature(sig, bob.person)).to be true
end
it 'does not verify the fallback after rollout window' do
sig = Base64.strict_encode64(bob.encryption_key.sign( "SHA", @comment.signable_string ))
- @comment.verify_signature(sig, bob.person).should be_false
+ expect(@comment.verify_signature(sig, bob.person)).to be false
end
end
end
diff --git a/spec/lib/diaspora/exporter_spec.rb b/spec/lib/diaspora/exporter_spec.rb
index 9db71fbfe..7bb429cc8 100644
--- a/spec/lib/diaspora/exporter_spec.rb
+++ b/spec/lib/diaspora/exporter_spec.rb
@@ -9,8 +9,6 @@ describe Diaspora::Exporter do
before do
@user1 = alice
- @user2 = FactoryGirl.create(:user)
- @user3 = bob
@user1.person.profile.first_name = "<script>"
@user1.person.profile.gender = "<script>"
@@ -19,108 +17,71 @@ describe Diaspora::Exporter do
@user1.person.profile.save
@aspect = @user1.aspects.first
- @aspect1 = @user1.aspects.create(:name => "Work")
- @aspect2 = @user2.aspects.create(:name => "Family")
- @aspect3 = @user3.aspects.first
+ @aspect1 = @user1.aspects.create(:name => "Work", :contacts_visible => false)
@aspect.name = "<script>"
@aspect.save
-
- @status_message1 = @user1.post(:status_message, :text => "One", :public => true, :to => @aspect1.id)
- @status_message2 = @user1.post(:status_message, :text => "Two", :public => true, :to => @aspect1.id)
- @status_message3 = @user2.post(:status_message, :text => "Three", :public => false, :to => @aspect2.id)
- @status_message4 = @user1.post(:status_message, :text => "<script>", :public => true, :to => @aspect2.id)
- end
-
- def exported
- Nokogiri::XML(Diaspora::Exporter.new(Diaspora::Exporters::XML).execute(@user1))
- end
-
- it 'escapes xml relevant characters' do
- expect(exported.to_s).to_not include "<script>"
end
- context '<user/>' do
- let(:user_xml) { exported.xpath('//user').to_s }
+ context "json" do
- it 'includes a users private key' do
- expect(user_xml).to include @user1.serialized_private_key
+ def json
+ @json ||= JSON.parse Diaspora::Exporter.new(@user1).execute
end
- it 'includes the profile as xml' do
- expect(user_xml).to include "<profile>"
+ it { matches :version, to: '1.0' }
+ it { matches :user, :name }
+ it { matches :user, :email }
+ it { matches :user, :username }
+ it { matches :user, :language }
+ it { matches :user, :disable_mail }
+ it { matches :user, :show_community_spotlight_in_stream }
+ it { matches :user, :auto_follow_back }
+ it { matches :user, :auto_follow_back_aspect }
+ it { matches :user, :strip_exif }
+
+ it { matches :user, :profile, :first_name, root: @user1.person.profile }
+ it { matches :user, :profile, :last_name, root: @user1.person.profile }
+ it { matches :user, :profile, :gender, root: @user1.person.profile }
+ it { matches :user, :profile, :bio, root: @user1.person.profile }
+ it { matches :user, :profile, :location, root: @user1.person.profile }
+ it { matches :user, :profile, :image_url, root: @user1.person.profile }
+ it { matches :user, :profile, :diaspora_handle, root: @user1.person.profile }
+ it { matches :user, :profile, :searchable, root: @user1.person.profile }
+ it { matches :user, :profile, :nsfw, root: @user1.person.profile }
+
+ it { matches_relation :aspects, :name,
+ :contacts_visible,
+ :chat_enabled }
+
+ it { matches_relation :contacts, :sharing,
+ :receiving,
+ :person_guid,
+ :person_name,
+ :person_first_name,
+ :person_diaspora_handle }
+
+ private
+
+ def matches(*fields, to: nil, root: @user1)
+ expected = to || root.send(fields.last)
+ expect(recurse_field(json, fields)).to eq expected
end
- end
- context '<aspects/>' do
- let(:aspects_xml) { exported.xpath('//aspects').to_s }
-
- it 'includes the post_ids' do
- aspects_xml.should include @status_message1.id.to_s
- aspects_xml.should include @status_message2.id.to_s
+ def matches_relation(relation, *fields, to: nil, root: @user1)
+ array = json['user'][to || relation.to_s]
+ fields.each do |field|
+ expected = root.send(relation).map(&:"#{field}")
+ expect(array.map { |f| f[field.to_s] }).to eq expected
+ end
end
- end
- context '<contacts/>' do
-
- before do
- @aspect.name = "Safe"
- @aspect.save
- @user1.add_contact_to_aspect(@user1.contact_for(@user3.person), @aspect1)
- @user1.reload
- end
-
- let(:contacts_xml) {exported.xpath('//contacts').to_s}
- it "includes a person's guid" do
- contacts_xml.should include @user3.person.guid
+ def recurse_field(json, fields)
+ if fields.any?
+ recurse_field json[fields.shift.to_s], fields
+ else
+ json
+ end
end
- it "includes the names of all aspects they are in" do
- #contact specific xml needs to be tested
- @user1.contacts.find_by_person_id(@user3.person.id).aspects.count.should > 0
- @user1.contacts.find_by_person_id(@user3.person.id).aspects.each { |aspect|
- contacts_xml.should include aspect.name
- }
- end
- end
-
- context '<people/>' do
- let(:people_xml) {exported.xpath('//people').to_s}
-
- it 'includes their guid' do
- people_xml.should include @user3.person.guid
- end
-
- it 'includes their profile' do
- people_xml.should include @user3.person.profile.first_name
- people_xml.should include @user3.person.profile.last_name
- end
-
- it 'includes their public key' do
- people_xml.should include @user3.person.exported_key
- end
-
- it 'includes their diaspora handle' do
- people_xml.should include @user3.person.diaspora_handle
- end
- end
-
- context '<posts>' do
- let(:posts_xml) {exported.xpath('//posts').to_s}
- it "includes many posts' xml" do
- posts_xml.should include @status_message1.text
- posts_xml.should include @status_message2.text
- posts_xml.should_not include @status_message3.text
- end
-
- it "includes the post's created at time" do
- @status_message1.update_attribute(:created_at, Time.now - 1.day) # make sure they have different created at times
-
- doc = Nokogiri::XML::parse(posts_xml)
- created_at_text = doc.xpath('//posts/status_message').detect do |status|
- status.to_s.include?(@status_message1.guid)
- end.xpath('created_at').text
-
- Time.zone.parse(created_at_text).to_i.should == @status_message1.created_at.to_i
- end
end
end
diff --git a/spec/lib/diaspora/federated/relayable_retraction_spec.rb b/spec/lib/diaspora/federated/relayable_retraction_spec.rb
index ad9888e3c..6e8635a24 100644
--- a/spec/lib/diaspora/federated/relayable_retraction_spec.rb
+++ b/spec/lib/diaspora/federated/relayable_retraction_spec.rb
@@ -20,14 +20,14 @@ describe RelayableRetraction do
describe "#parent" do
it "delegates to to target" do
- @retraction.target.should_receive(:parent)
+ expect(@retraction.target).to receive(:parent)
@retraction.parent
end
end
describe "#parent_author" do
it "delegates to target" do
- @retraction.target.should_receive(:parent_author)
+ expect(@retraction.target).to receive(:parent_author)
@retraction.parent_author
end
end
@@ -35,7 +35,7 @@ describe RelayableRetraction do
describe '#subscribers' do
it 'delegates it to target' do
arg = double()
- @retraction.target.should_receive(:subscribers).with(arg)
+ expect(@retraction.target).to receive(:subscribers).with(arg)
@retraction.subscribers(arg)
end
end
@@ -48,7 +48,7 @@ describe RelayableRetraction do
@retraction.instance_variable_set(:@target, nil)
@retraction.target_guid = '135245'
- @retraction.should_not_receive(:perform)
+ expect(@retraction).not_to receive(:perform)
@retraction.receive(@local_luke, @remote_raphael)
end
@@ -60,21 +60,21 @@ describe RelayableRetraction do
end
it 'signs' do
- @retraction.should_receive(:sign_with_key) do |key|
- key.to_s.should == @recipient.encryption_key.to_s
+ expect(@retraction).to receive(:sign_with_key) do |key|
+ expect(key.to_s).to eq(@recipient.encryption_key.to_s)
end
@retraction.receive(@recipient, @comment.author)
end
it 'dispatches' do
zord = double()
- zord.should_receive(:post)
- Postzord::Dispatcher.should_receive(:build).with(@local_luke, @retraction).and_return zord
+ expect(zord).to receive(:post)
+ expect(Postzord::Dispatcher).to receive(:build).with(@local_luke, @retraction).and_return zord
@retraction.receive(@recipient, @comment.author)
end
it 'performs' do
- @retraction.should_receive(:perform).with(@local_luke)
+ expect(@retraction).to receive(:perform).with(@local_luke)
@retraction.receive(@recipient, @comment.author)
end
end
@@ -85,19 +85,26 @@ describe RelayableRetraction do
@retraction = described_class.allocate
@retraction.sender = @remote_raphael
@retraction.target = @comment
- @retraction.stub(:parent_author_signature_valid?).and_return(true)
+ allow(@retraction).to receive(:parent_author_signature_valid?).and_return(true)
@recipient = @local_luke
end
it 'performs' do
- @retraction.should_receive(:perform).with(@recipient)
+ expect(@retraction).to receive(:perform).with(@recipient)
@retraction.receive(@recipient, @remote_raphael)
end
it 'does not dispatch' do
- Postzord::Dispatcher.should_not_receive(:build)
+ expect(Postzord::Dispatcher).not_to receive(:build)
@retraction.receive(@recipient, @remote_raphael)
end
+
+ it 'performs through postzord' do
+ xml = Salmon::Slap.create_by_user_and_activity(@local_luke, @retraction.to_diaspora_xml).xml_for(nil)
+ expect {
+ Postzord::Receiver::Public.new(xml).perform!
+ }.to change(Comment, :count).by(-1)
+ end
end
end
@@ -112,20 +119,20 @@ describe RelayableRetraction do
describe '#to_xml' do
it 'serializes target_guid' do
- @xml.should include(@comment.guid)
+ expect(@xml).to include(@comment.guid)
end
it 'serializes target_type' do
- @xml.should include(@comment.class.to_s)
+ expect(@xml).to include(@comment.class.to_s)
end
it 'serializes sender_handle' do
- @xml.should include(@local_leia.diaspora_handle)
+ expect(@xml).to include(@local_leia.diaspora_handle)
end
it 'serializes signatures' do
- @xml.should include('TARGETSIGNATURE')
- @xml.should include('PARENTSIGNATURE')
+ expect(@xml).to include('TARGETSIGNATURE')
+ expect(@xml).to include('PARENTSIGNATURE')
end
end
@@ -135,16 +142,16 @@ describe RelayableRetraction do
end
it 'marshals the target' do
- @marshalled.target.should == @comment
+ expect(@marshalled.target).to eq(@comment)
end
it 'marshals the sender' do
- @marshalled.sender.should == @local_leia.person
+ expect(@marshalled.sender).to eq(@local_leia.person)
end
it 'marshals the signature' do
- @marshalled.target_author_signature.should == 'TARGETSIGNATURE'
- @marshalled.parent_author_signature.should == 'PARENTSIGNATURE'
+ expect(@marshalled.target_author_signature).to eq('TARGETSIGNATURE')
+ expect(@marshalled.parent_author_signature).to eq('PARENTSIGNATURE')
end
end
end
diff --git a/spec/lib/diaspora/federated/request_spec.rb b/spec/lib/diaspora/federated/request_spec.rb
index a0d77a237..c6b1fe1a1 100644
--- a/spec/lib/diaspora/federated/request_spec.rb
+++ b/spec/lib/diaspora/federated/request_spec.rb
@@ -15,35 +15,35 @@ describe Request do
end
it 'is valid' do
- @request.sender.should == alice.person
- @request.recipient.should == eve.person
- @request.aspect.should == @aspect
- @request.should be_valid
+ expect(@request.sender).to eq(alice.person)
+ expect(@request.recipient).to eq(eve.person)
+ expect(@request.aspect).to eq(@aspect)
+ expect(@request).to be_valid
end
it 'is from a person' do
@request.sender = nil
- @request.should_not be_valid
+ expect(@request).not_to be_valid
end
it 'is to a person' do
@request.recipient = nil
- @request.should_not be_valid
+ expect(@request).not_to be_valid
end
it 'is not necessarily into an aspect' do
@request.aspect = nil
- @request.should be_valid
+ expect(@request).to be_valid
end
it 'is not from an existing friend' do
Contact.create(:user => eve, :person => alice.person, :aspects => [eve.aspects.first])
- @request.should_not be_valid
+ expect(@request).not_to be_valid
end
it 'is not to yourself' do
@request = described_class.diaspora_initialize(:from => alice.person, :to => alice.person, :into => @aspect)
- @request.should_not be_valid
+ expect(@request).not_to be_valid
end
end
@@ -54,23 +54,23 @@ describe Request do
request = described_class.diaspora_initialize(:from => alice.person, :to => eve.person, :into => @aspect)
alice.contacts.create(:person_id => person.id)
- request.notification_type(alice, person).should == Notifications::StartedSharing
+ expect(request.notification_type(alice, person)).to eq(Notifications::StartedSharing)
end
end
describe '#subscribers' do
it 'returns an array with to field on a request' do
request = described_class.diaspora_initialize(:from => alice.person, :to => eve.person, :into => @aspect)
- request.subscribers(alice).should =~ [eve.person]
+ expect(request.subscribers(alice)).to match_array([eve.person])
end
end
describe '#receive' do
it 'creates a contact' do
request = described_class.diaspora_initialize(:from => alice.person, :to => eve.person, :into => @aspect)
- lambda{
+ expect{
request.receive(eve, alice.person)
- }.should change{
+ }.to change{
eve.contacts(true).size
}.by(1)
end
@@ -78,10 +78,10 @@ describe Request do
it 'sets mutual if a contact already exists' do
alice.share_with(eve.person, alice.aspects.first)
- lambda {
+ expect {
described_class.diaspora_initialize(:from => eve.person, :to => alice.person,
:into => eve.aspects.first).receive(alice, eve.person)
- }.should change {
+ }.to change {
alice.contacts.find_by_person_id(eve.person.id).mutual?
}.from(false).to(true)
@@ -90,7 +90,7 @@ describe Request do
it 'sets sharing' do
described_class.diaspora_initialize(:from => eve.person, :to => alice.person,
:into => eve.aspects.first).receive(alice, eve.person)
- alice.contact_for(eve.person).should be_sharing
+ expect(alice.contact_for(eve.person)).to be_sharing
end
it 'shares back if auto_following is enabled' do
@@ -101,7 +101,7 @@ describe Request do
described_class.diaspora_initialize(:from => eve.person, :to => alice.person,
:into => eve.aspects.first).receive(alice, eve.person)
- eve.contact_for( alice.person ).should be_sharing
+ expect(eve.contact_for( alice.person )).to be_sharing
end
it 'shares not back if auto_following is not enabled' do
@@ -112,7 +112,7 @@ describe Request do
described_class.diaspora_initialize(:from => eve.person, :to => alice.person,
:into => eve.aspects.first).receive(alice, eve.person)
- eve.contact_for(alice.person).should be_nil
+ expect(eve.contact_for(alice.person)).to be_nil
end
it 'shares not back if already sharing' do
@@ -124,7 +124,7 @@ describe Request do
:receiving => true, :sharing => false
contact.save
- alice.should_not_receive(:share_with)
+ expect(alice).not_to receive(:share_with)
described_class.diaspora_initialize(:from => eve.person, :to => alice.person,
:into => eve.aspects.first).receive(alice, eve.person)
@@ -139,10 +139,10 @@ describe Request do
describe 'serialization' do
it 'produces valid xml' do
- @xml.should include alice.person.diaspora_handle
- @xml.should include eve.person.diaspora_handle
- @xml.should_not include alice.person.exported_key
- @xml.should_not include alice.person.profile.first_name
+ expect(@xml).to include alice.person.diaspora_handle
+ expect(@xml).to include eve.person.diaspora_handle
+ expect(@xml).not_to include alice.person.exported_key
+ expect(@xml).not_to include alice.person.profile.first_name
end
end
@@ -150,9 +150,9 @@ describe Request do
it 'produces a request object' do
marshalled = described_class.from_xml @xml
- marshalled.sender.should == alice.person
- marshalled.recipient.should == eve.person
- marshalled.aspect.should be_nil
+ expect(marshalled.sender).to eq(alice.person)
+ expect(marshalled.recipient).to eq(eve.person)
+ expect(marshalled.aspect).to be_nil
end
end
end
diff --git a/spec/lib/diaspora/federated/retraction_spec.rb b/spec/lib/diaspora/federated/retraction_spec.rb
index 8f556d47e..11b1c49f9 100644
--- a/spec/lib/diaspora/federated/retraction_spec.rb
+++ b/spec/lib/diaspora/federated/retraction_spec.rb
@@ -15,7 +15,7 @@ describe Retraction do
it 'should have a post id after serialization' do
retraction = described_class.for(@post)
xml = retraction.to_xml.to_s
- xml.include?(@post.guid.to_s).should == true
+ expect(xml.include?(@post.guid.to_s)).to eq(true)
end
end
@@ -28,7 +28,7 @@ describe Retraction do
end
it 'returns the subscribers to the post for all objects other than person' do
- @retraction.subscribers(alice).map(&:id).should =~ @wanted_subscribers.map(&:id)
+ expect(@retraction.subscribers(alice).map(&:id)).to match_array(@wanted_subscribers.map(&:id))
end
it 'does not return the authors of reshares' do
@@ -36,7 +36,7 @@ describe Retraction do
@post.save!
@wanted_subscribers -= [bob.person]
- @retraction.subscribers(alice).map(&:id).should =~ @wanted_subscribers.map(&:id)
+ expect(@retraction.subscribers(alice).map(&:id)).to match_array(@wanted_subscribers.map(&:id))
end
end
@@ -45,15 +45,15 @@ describe Retraction do
retraction = described_class.for(alice)
obj = retraction.instance_variable_get(:@object)
- lambda {
+ expect {
retraction.subscribers(alice)
- }.should raise_error
+ }.to raise_error
end
it 'returns manually set subscribers' do
retraction = described_class.for(alice)
retraction.subscribers = "fooey"
- retraction.subscribers(alice).should == 'fooey'
+ expect(retraction.subscribers(alice)).to eq('fooey')
end
end
end
diff --git a/spec/lib/diaspora/federated/signed_retraction_spec.rb b/spec/lib/diaspora/federated/signed_retraction_spec.rb
index f6391c8b0..332e9e9c4 100644
--- a/spec/lib/diaspora/federated/signed_retraction_spec.rb
+++ b/spec/lib/diaspora/federated/signed_retraction_spec.rb
@@ -11,11 +11,11 @@ describe SignedRetraction do
it "dispatches the retraction onward to recipients of the recipient's reshare" do
retraction = described_class.build(bob, @post)
onward_retraction = retraction.dup
- retraction.should_receive(:dup).and_return(onward_retraction)
+ expect(retraction).to receive(:dup).and_return(onward_retraction)
dis = double
- Postzord::Dispatcher.should_receive(:build).with(@resharer, onward_retraction).and_return(dis)
- dis.should_receive(:post)
+ expect(Postzord::Dispatcher).to receive(:build).with(@resharer, onward_retraction).and_return(dis)
+ expect(dis).to receive(:post)
retraction.perform(@resharer)
end
@@ -28,19 +28,19 @@ describe SignedRetraction do
r.target_type = remote_post.type
r.target_guid = remote_post.guid
r.sender = remote_post.author
- r.stub(:target_author_signature_valid?).and_return(true)
+ allow(r).to receive(:target_author_signature_valid?).and_return(true)
}
remote_retraction.dup.perform(bob)
- Post.exists?(:id => remote_post.id).should be_false
+ expect(Post.exists?(:id => remote_post.id)).to be false
dis = double
- Postzord::Dispatcher.should_receive(:build){ |sender, retraction|
- sender.should == alice
- retraction.sender.should == alice.person
+ expect(Postzord::Dispatcher).to receive(:build){ |sender, retraction|
+ expect(sender).to eq(alice)
+ expect(retraction.sender).to eq(alice.person)
dis
}
- dis.should_receive(:post)
+ expect(dis).to receive(:post)
remote_retraction.perform(alice)
end
end
diff --git a/spec/lib/diaspora/federated_base_spec.rb b/spec/lib/diaspora/federated_base_spec.rb
index a3fbcbacc..a2621e3c6 100644
--- a/spec/lib/diaspora/federated_base_spec.rb
+++ b/spec/lib/diaspora/federated_base_spec.rb
@@ -13,7 +13,7 @@ describe Diaspora::Federated::Base do
f = Foo.new
- proc{ f.subscribers(1)}.should raise_error /override subscribers/
+ expect{ f.subscribers(1)}.to raise_error /override subscribers/
end
end
end
diff --git a/spec/lib/diaspora/fetcher/public_spec.rb b/spec/lib/diaspora/fetcher/public_spec.rb
index 5056e9c52..28726b2e4 100644
--- a/spec/lib/diaspora/fetcher/public_spec.rb
+++ b/spec/lib/diaspora/fetcher/public_spec.rb
@@ -19,7 +19,7 @@ describe Diaspora::Fetcher::Public do
stub_request(:get, /remote-testpod.net\/people\/.*/)
.with(headers: {
- 'Accept'=>'application/json',
+ 'Accept'=>'application/json',
'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
'User-Agent'=>'diaspora-fetcher'
}).to_return(:body => @fixture)
@@ -36,16 +36,16 @@ describe Diaspora::Fetcher::Public do
it "sets the operation status on the person" do
@person.reload
- @person.fetch_status.should_not eql(Diaspora::Fetcher::Public::Status_Initial)
- @person.fetch_status.should eql(Diaspora::Fetcher::Public::Status_Fetched)
+ expect(@person.fetch_status).not_to eql(Diaspora::Fetcher::Public::Status_Initial)
+ expect(@person.fetch_status).to eql(Diaspora::Fetcher::Public::Status_Fetched)
end
it "sets the @data variable to the parsed JSON data" do
data = @fetcher.instance_eval {
@data
}
- data.should_not be_nil
- data.size.should eql JSON.parse(@fixture).size
+ expect(data).not_to be_nil
+ expect(data.size).to eql JSON.parse(@fixture).size
end
end
@@ -66,7 +66,7 @@ describe Diaspora::Fetcher::Public do
process_posts
}
after_count = Post.count
- after_count.should eql(before_count + 10)
+ expect(after_count).to eql(before_count + 10)
end
it 'sets the operation status on the person' do
@@ -75,8 +75,8 @@ describe Diaspora::Fetcher::Public do
}
@person.reload
- @person.fetch_status.should_not eql(Diaspora::Fetcher::Public::Status_Initial)
- @person.fetch_status.should eql(Diaspora::Fetcher::Public::Status_Processed)
+ expect(@person.fetch_status).not_to eql(Diaspora::Fetcher::Public::Status_Initial)
+ expect(@person.fetch_status).to eql(Diaspora::Fetcher::Public::Status_Processed)
end
context 'created post' do
@@ -100,14 +100,14 @@ describe Diaspora::Fetcher::Public do
date = ActiveSupport::TimeZone.new('UTC').parse(post['created_at']).to_i
entry = StatusMessage.find_by_guid(post['guid'])
- entry.created_at.to_i.should eql(date)
+ expect(entry.created_at.to_i).to eql(date)
end
end
it 'copied the text correctly' do
@data.each do |post|
entry = StatusMessage.find_by_guid(post['guid'])
- entry.raw_message.should eql(post['text'])
+ expect(entry.raw_message).to eql(post['text'])
end
end
@@ -116,7 +116,7 @@ describe Diaspora::Fetcher::Public do
date = @now.to_i
entry = StatusMessage.find_by_guid(post['guid'])
- entry.interacted_at.to_i.should eql(date)
+ expect(entry.interacted_at.to_i).to eql(date)
end
end
end
@@ -127,46 +127,46 @@ describe Diaspora::Fetcher::Public do
describe '#qualifies_for_fetching?' do
it "raises an error if the person doesn't exist" do
- lambda {
+ expect {
public_fetcher.instance_eval {
@person = Person.by_account_identifier "someone@unknown.com"
qualifies_for_fetching?
}
- }.should raise_error ActiveRecord::RecordNotFound
+ }.to raise_error ActiveRecord::RecordNotFound
end
it 'returns false if the person is unfetchable' do
- public_fetcher.instance_eval {
+ expect(public_fetcher.instance_eval {
@person = FactoryGirl.create(:person, {:fetch_status => Diaspora::Fetcher::Public::Status_Unfetchable})
qualifies_for_fetching?
- }.should be_false
+ }).to be false
end
it 'returns false and sets the person unfetchable for a local account' do
user = FactoryGirl.create(:user)
- public_fetcher.instance_eval {
+ expect(public_fetcher.instance_eval {
@person = user.person
qualifies_for_fetching?
- }.should be_false
- user.person.fetch_status.should eql Diaspora::Fetcher::Public::Status_Unfetchable
+ }).to be false
+ expect(user.person.fetch_status).to eql Diaspora::Fetcher::Public::Status_Unfetchable
end
it 'returns false if the person is processing already (or has been processed)' do
person = FactoryGirl.create(:person)
person.fetch_status = Diaspora::Fetcher::Public::Status_Fetched
person.save
- public_fetcher.instance_eval {
+ expect(public_fetcher.instance_eval {
@person = person
qualifies_for_fetching?
- }.should be_false
+ }).to be false
end
it "returns true, if the user is remote and hasn't been fetched" do
person = FactoryGirl.create(:person, {:diaspora_handle => 'neo@theone.net'})
- public_fetcher.instance_eval {
+ expect(public_fetcher.instance_eval {
@person = person
qualifies_for_fetching?
- }.should be_true
+ }).to be true
end
end
@@ -177,35 +177,35 @@ describe Diaspora::Fetcher::Public do
@person = person
set_fetch_status Diaspora::Fetcher::Public::Status_Unfetchable
}
- @person.fetch_status.should eql Diaspora::Fetcher::Public::Status_Unfetchable
+ expect(@person.fetch_status).to eql Diaspora::Fetcher::Public::Status_Unfetchable
public_fetcher.instance_eval {
set_fetch_status Diaspora::Fetcher::Public::Status_Initial
}
- @person.fetch_status.should eql Diaspora::Fetcher::Public::Status_Initial
+ expect(@person.fetch_status).to eql Diaspora::Fetcher::Public::Status_Initial
end
end
describe '#validate' do
it "calls all validation helper methods" do
- public_fetcher.should_receive(:check_existing).and_return(true)
- public_fetcher.should_receive(:check_author).and_return(true)
- public_fetcher.should_receive(:check_public).and_return(true)
- public_fetcher.should_receive(:check_type).and_return(true)
+ expect(public_fetcher).to receive(:check_existing).and_return(true)
+ expect(public_fetcher).to receive(:check_author).and_return(true)
+ expect(public_fetcher).to receive(:check_public).and_return(true)
+ expect(public_fetcher).to receive(:check_type).and_return(true)
- public_fetcher.instance_eval { validate({}) }.should be_true
+ expect(public_fetcher.instance_eval { validate({}) }).to be true
end
end
describe '#check_existing' do
it 'returns false if a post with the same guid exists' do
post = {'guid' => FactoryGirl.create(:status_message).guid}
- public_fetcher.instance_eval { check_existing post }.should be_false
+ expect(public_fetcher.instance_eval { check_existing post }).to be false
end
it 'returns true if the guid cannot be found' do
post = {'guid' => SecureRandom.hex(8)}
- public_fetcher.instance_eval { check_existing post }.should be_true
+ expect(public_fetcher.instance_eval { check_existing post }).to be true
end
end
@@ -219,36 +219,36 @@ describe Diaspora::Fetcher::Public do
it "returns false if the person doesn't match" do
post = { 'author' => { 'guid' => SecureRandom.hex(8) } }
- public_fetcher.instance_eval { check_author post }.should be_false
+ expect(public_fetcher.instance_eval { check_author post }).to be false
end
it "returns true if the persons match" do
post = { 'author' => { 'guid' => some_person.guid } }
- public_fetcher.instance_eval { check_author post }.should be_true
+ expect(public_fetcher.instance_eval { check_author post }).to be true
end
end
describe '#check_public' do
it "returns false if the post is not public" do
post = {'public' => false}
- public_fetcher.instance_eval { check_public post }.should be_false
+ expect(public_fetcher.instance_eval { check_public post }).to be false
end
it "returns true if the post is public" do
post = {'public' => true}
- public_fetcher.instance_eval { check_public post }.should be_true
+ expect(public_fetcher.instance_eval { check_public post }).to be true
end
end
describe '#check_type' do
it "returns false if the type is anything other that 'StatusMessage'" do
post = {'post_type'=>'Reshare'}
- public_fetcher.instance_eval { check_type post }.should be_false
+ expect(public_fetcher.instance_eval { check_type post }).to be false
end
it "returns true if the type is 'StatusMessage'" do
post = {'post_type'=>'StatusMessage'}
- public_fetcher.instance_eval { check_type post }.should be_true
+ expect(public_fetcher.instance_eval { check_type post }).to be true
end
end
end
diff --git a/spec/lib/diaspora/markdownify_email_spec.rb b/spec/lib/diaspora/markdownify_email_spec.rb
index f27d0afb1..6a64f7f1d 100644
--- a/spec/lib/diaspora/markdownify_email_spec.rb
+++ b/spec/lib/diaspora/markdownify_email_spec.rb
@@ -8,17 +8,17 @@ describe Diaspora::Markdownify::Email do
it 'should autolink a hashtag' do
markdownified = @html.preprocess("#tag")
- markdownified.should == "[#tag](http://localhost:9887/tags/tag)"
+ expect(markdownified).to eq("[#tag](http://localhost:9887/tags/tag)")
end
it 'should autolink multiple hashtags' do
markdownified = @html.preprocess("There are #two #Tags")
- markdownified.should == "There are [#two](http://localhost:9887/tags/two) [#Tags](http://localhost:9887/tags/tags)"
+ expect(markdownified).to eq("There are [#two](http://localhost:9887/tags/two) [#Tags](http://localhost:9887/tags/tags)")
end
it 'should not autolink headers' do
markdownified = @html.preprocess("# header")
- markdownified.should == "# header"
+ expect(markdownified).to eq("# header")
end
end
@@ -30,7 +30,7 @@ describe Diaspora::Markdownify::Email do
it 'should render the message' do
rendered = @markdown.render(@sample_text).strip
- rendered.should == "<h1>Header</h1>\n\n<p><a href=\"http://localhost:9887/tags/messages\">#messages</a> containing <a href=\"http://localhost:9887/tags/hashtags\">#hashtags</a> should render properly</p>"
+ expect(rendered).to eq("<h1>Header</h1>\n\n<p><a href=\"http://localhost:9887/tags/messages\">#messages</a> containing <a href=\"http://localhost:9887/tags/hashtags\">#hashtags</a> should render properly</p>")
end
end
end \ No newline at end of file
diff --git a/spec/lib/diaspora/markdownify_spec.rb b/spec/lib/diaspora/markdownify_spec.rb
index 41e6b28a2..143a62f31 100644
--- a/spec/lib/diaspora/markdownify_spec.rb
+++ b/spec/lib/diaspora/markdownify_spec.rb
@@ -12,7 +12,7 @@ describe Diaspora::Markdownify::HTML do
link = doc.css("a")
- link.attr("target").value.should == "_blank"
+ expect(link.attr("target").value).to eq("_blank")
end
end
end \ No newline at end of file
diff --git a/spec/lib/diaspora/mentionable_spec.rb b/spec/lib/diaspora/mentionable_spec.rb
index 6e60804a0..d8f5235de 100644
--- a/spec/lib/diaspora/mentionable_spec.rb
+++ b/spec/lib/diaspora/mentionable_spec.rb
@@ -27,7 +27,7 @@ STR
fmt_msg = Diaspora::Mentionable.format(@status_msg.raw_message, @people)
@people.each do |person|
- fmt_msg.should include person_link(person, class: 'mention hovercardable')
+ expect(fmt_msg).to include person_link(person, class: 'mention hovercardable')
end
end
@@ -36,7 +36,7 @@ STR
fmt_msg = Diaspora::Mentionable.format(CGI::escapeHTML(raw_msg), @people)
@people.each do |person|
- fmt_msg.should include person_link(person, class: 'mention hovercardable')
+ expect(fmt_msg).to include person_link(person, class: 'mention hovercardable')
end
end
@@ -47,8 +47,8 @@ STR
fmt_msg = Diaspora::Mentionable.format(@status_msg.raw_message, @people)
- fmt_msg.should_not include(p.first_name)
- fmt_msg.should include("&gt;", "&lt;", "&#x27;") # ">", "<", "'"
+ expect(fmt_msg).not_to include(p.first_name)
+ expect(fmt_msg).to include("&gt;", "&lt;", "&#39;") # ">", "<", "'"
end
end
@@ -57,33 +57,33 @@ STR
fmt_msg = Diaspora::Mentionable.format(@status_msg.raw_message, @people, plain_text: true)
@people.each do |person|
- fmt_msg.should include person.first_name
+ expect(fmt_msg).to include person.first_name
end
- fmt_msg.should_not include "<a", "</a>", "hovercardable"
+ expect(fmt_msg).not_to include "<a", "</a>", "hovercardable"
end
end
it 'leaves the name of people that cannot be found' do
fmt_msg = Diaspora::Mentionable.format(@status_msg.raw_message, [])
- fmt_msg.should eql @test_txt_plain
+ expect(fmt_msg).to eql @test_txt_plain
end
end
describe '#people_from_string' do
it 'extracts the mentioned people from the text' do
ppl = Diaspora::Mentionable.people_from_string(@test_txt)
- ppl.should include(*@people)
+ expect(ppl).to include(*@people)
end
describe 'returns an empty array if nobody was found' do
it 'gets a post without mentions' do
ppl = Diaspora::Mentionable.people_from_string("post w/o mentions")
- ppl.should be_empty
+ expect(ppl).to be_empty
end
it 'gets a post with invalid handles' do
ppl = Diaspora::Mentionable.people_from_string("@{a; xxx@xxx.xx} @{b; yyy@yyyy.yyy}")
- ppl.should be_empty
+ expect(ppl).to be_empty
end
end
end
@@ -111,25 +111,25 @@ STR
aspect_id = @user_A.aspects.where(name: 'generic').first.id
txt = Diaspora::Mentionable.filter_for_aspects(@test_txt_C, @user_A, aspect_id)
- txt.should include(@user_C.person.name)
- txt.should include(local_or_remote_person_path(@user_C.person))
- txt.should_not include("href")
- txt.should_not include(@mention_C)
+ expect(txt).to include(@user_C.person.name)
+ expect(txt).to include(local_or_remote_person_path(@user_C.person))
+ expect(txt).not_to include("href")
+ expect(txt).not_to include(@mention_C)
end
it 'leaves mention, if contact is in a given aspect' do
aspect_id = @user_A.aspects.where(name: 'generic').first.id
txt = Diaspora::Mentionable.filter_for_aspects(@test_txt_B, @user_A, aspect_id)
- txt.should include("user B")
- txt.should include(@mention_B)
+ expect(txt).to include("user B")
+ expect(txt).to include(@mention_B)
end
it 'recognizes "all" as keyword for aspects' do
txt = Diaspora::Mentionable.filter_for_aspects(@test_txt_BC, @user_A, "all")
- txt.should include(@mention_B)
- txt.should include(@mention_C)
+ expect(txt).to include(@mention_B)
+ expect(txt).to include(@mention_C)
end
end
end
diff --git a/spec/lib/diaspora/message_renderer_spec.rb b/spec/lib/diaspora/message_renderer_spec.rb
index 0366720eb..9e152cdce 100644
--- a/spec/lib/diaspora/message_renderer_spec.rb
+++ b/spec/lib/diaspora/message_renderer_spec.rb
@@ -9,7 +9,7 @@ describe Diaspora::MessageRenderer do
context 'when :length is passed in parameters' do
it 'returns string of size less or equal to :length' do
string_size = 12
- title = message("## My title\n Post content...").title(length: string_size)
+ title = message("## This is a really, really, really long title\n Post content").title(length: string_size)
expect(title.size).to be <= string_size
end
end
@@ -24,6 +24,10 @@ describe Diaspora::MessageRenderer do
it 'returns setext style header' do
expect(message("My title \n======\n Post content...").title).to eq "My title"
end
+
+ it 'returns header without markdown' do
+ expect(message("## **[My title](http://diasporafoundation.org)**\n Post content...").title).to eq "My title (http://diasporafoundation.org)"
+ end
end
context 'without a Markdown header of less than 200 characters on first line ' do
@@ -50,6 +54,12 @@ describe Diaspora::MessageRenderer do
expect(message(entities).html).to eq entities
end
+ it 'normalizes' do
+ expect(
+ message("\u202a#\u200eUSA\u202c").markdownified
+ ).to eq %(<p><a class="tag" href="/tags/USA">#USA</a></p>\n)
+ end
+
context 'with mentions' do
it 'makes hovercard links for mentioned people' do
expect(
@@ -107,25 +117,31 @@ describe Diaspora::MessageRenderer do
it 'autolinks standard url links' do
expect(
- message("http://joindiaspora.com/"
- ).markdownified).to include 'href="http://joindiaspora.com/"'
+ message("http://joindiaspora.com/").markdownified
+ ).to include 'href="http://joindiaspora.com/"'
+ end
+
+ it 'normalizes' do
+ expect(
+ message("\u202a#\u200eUSA\u202c").markdownified
+ ).to eq %(<p><a class="tag" href="/tags/USA">#USA</a></p>\n)
end
context 'when formatting status messages' do
it "should leave tags intact" do
expect(
message("I love #markdown").markdownified
- ).to match %r{<a href="/tags/markdown" class="tag">#markdown</a>}
+ ).to match %r{<a class="tag" href="/tags/markdown">#markdown</a>}
end
it 'should leave multi-underscore tags intact' do
expect(
message("Here is a #multi_word tag").markdownified
- ).to match %r{Here is a <a href="/tags/multi_word" class="tag">#multi_word</a> tag}
+ ).to match %r{Here is a <a class="tag" href="/tags/multi_word">#multi_word</a> tag}
expect(
message("Here is a #multi_word_tag yo").markdownified
- ).to match %r{Here is a <a href="/tags/multi_word_tag" class="tag">#multi_word_tag</a> yo}
+ ).to match %r{Here is a <a class="tag" href="/tags/multi_word_tag">#multi_word_tag</a> yo}
end
it "should leave mentions intact" do
@@ -147,7 +163,7 @@ describe Diaspora::MessageRenderer do
it 'should process text with both a hashtag and a link' do
expect(
message("Test #tag?\nhttps://joindiaspora.com\n").markdownified
- ).to eq %{<p>Test <a href="/tags/tag" class="tag">#tag</a>?<br>\n<a href="https://joindiaspora.com" target="_blank">https://joindiaspora.com</a></p>\n}
+ ).to eq %{<p>Test <a class="tag" href="/tags/tag">#tag</a>?<br>\n<a href="https://joindiaspora.com" rel="nofollow" target="_blank">https://joindiaspora.com</a></p>\n}
end
it 'should process text with a header' do
@@ -172,4 +188,24 @@ describe Diaspora::MessageRenderer do
expect(message(text).plain_text_without_markdown).to eq text
end
end
+
+ describe "#urls" do
+ it "extracts the urls from the raw message" do
+ text = "[Perdu](http://perdu.com/) and [DuckDuckGo](https://duckduckgo.com/) can help you"
+ expect(message(text).urls).to eql ["http://perdu.com/", "https://duckduckgo.com/"]
+ end
+
+ it "extracts urls from continous markdown correctly" do
+ text = "[![Image](https://www.antifainfoblatt.de/sites/default/files/public/styles/front_full/public/jockpalfreeman.png?itok=OPjHKpmt)](https://www.antifainfoblatt.de/artikel/%E2%80%9Eschlie%C3%9Flich-waren-es-zu-viele%E2%80%9C)"
+ expect(message(text).urls).to eq ["https://www.antifainfoblatt.de/sites/default/files/public/styles/front_full/public/jockpalfreeman.png?itok=OPjHKpmt", "https://www.antifainfoblatt.de/artikel/%E2%80%9Eschlie%C3%9Flich-waren-es-zu-viele%E2%80%9C"]
+ end
+ end
+
+ describe "#plain_text_for_json" do
+ it 'normalizes' do
+ expect(
+ message("\u202a#\u200eUSA\u202c").plain_text_for_json
+ ).to eq '#USA'
+ end
+ end
end
diff --git a/spec/lib/diaspora/parser_spec.rb b/spec/lib/diaspora/parser_spec.rb
index 4a7e6cf38..c84ef4c17 100644
--- a/spec/lib/diaspora/parser_spec.rb
+++ b/spec/lib/diaspora/parser_spec.rb
@@ -24,10 +24,10 @@ describe Diaspora::Parser do
comment.delete
xml = comment.to_diaspora_xml
comment_from_xml = Diaspora::Parser.from_xml(xml)
- comment_from_xml.diaspora_handle.should == @person.diaspora_handle
- comment_from_xml.post.should == post
- comment_from_xml.text.should == "Freedom!"
- comment_from_xml.should_not be comment
+ expect(comment_from_xml.diaspora_handle).to eq(@person.diaspora_handle)
+ expect(comment_from_xml.post).to eq(post)
+ expect(comment_from_xml.text).to eq("Freedom!")
+ expect(comment_from_xml).not_to be comment
end
end
end
diff --git a/spec/lib/direction_detector_spec.rb b/spec/lib/direction_detector_spec.rb
index e24545ef9..b19e854db 100644
--- a/spec/lib/direction_detector_spec.rb
+++ b/spec/lib/direction_detector_spec.rb
@@ -26,65 +26,65 @@ describe String do
describe "#stats_with_rtl_char?" do
it 'returns true or false correctly' do
- english.starts_with_rtl_char?.should be_false
- chinese.starts_with_rtl_char?.should be_false
- arabic.starts_with_rtl_char?.should be_true
- hebrew.starts_with_rtl_char?.should be_true
- hebrew_arabic.starts_with_rtl_char?.should be_true
+ 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
- english_chinese.starts_with_rtl_char?.should be_false
- chinese_english.starts_with_rtl_char?.should be_false
- english_arabic.starts_with_rtl_char?.should be_false
- hebrew_english.starts_with_rtl_char?.should be_true
- arabic_chinese.starts_with_rtl_char?.should be_true
+ 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
- " \n \r \t".starts_with_rtl_char?.should be_false
- " #{arabic} ".starts_with_rtl_char?.should be_true
+ 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
- english.is_rtl?.should be_false
- chinese.is_rtl?.should be_false
- arabic.is_rtl?.should be_true
- hebrew.is_rtl?.should be_true
+ expect(english.is_rtl?).to be false
+ expect(chinese.is_rtl?).to be false
+ expect(arabic.is_rtl?).to be true
+ expect(hebrew.is_rtl?).to be true
end
it 'respects all words' do
- chinese_arabic.is_rtl?.should be_true
- chinese_hebrew.is_rtl?.should be_true
- english_hebrew.is_rtl?.should be_false
- hebrew_arabic.is_rtl?.should be_true
- "#{english} #{arabic} #{chinese}".is_rtl?.should be_false
- "Translated to arabic, Hello World means: #{arabic}".is_rtl?.should be_false
- "#{english} #{arabic} #{arabic}".is_rtl?.should be_true
+ expect(chinese_arabic.is_rtl?).to be true
+ expect(chinese_hebrew.is_rtl?).to be true
+ expect(english_hebrew.is_rtl?).to be false
+ expect(hebrew_arabic.is_rtl?).to be true
+ expect("#{english} #{arabic} #{chinese}".is_rtl?).to be false
+ expect("Translated to arabic, Hello World means: #{arabic}".is_rtl?).to be false
+ expect("#{english} #{arabic} #{arabic}".is_rtl?).to be true
end
it "fallbacks to the first word if there's no majority" do
- hebrew_english.is_rtl?.should be_true
- english_hebrew.is_rtl?.should be_false
- arabic_english.is_rtl?.should be_true
- english_arabic.is_rtl?.should be_false
+ 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
- " \n \r \t".is_rtl?.should be_false
- " #{arabic} ".is_rtl?.should be_true
+ expect(" \n \r \t".is_rtl?).to be false
+ expect(" #{arabic} ".is_rtl?).to be true
end
end
describe '#cleaned_is_rtl?' do
it 'should clean the string' do
- "RT: #{arabic}".cleaned_is_rtl?.should be_true
- "#{hebrew} RT: #{arabic}".cleaned_is_rtl?.should be_true
- "@foo #{arabic}".cleaned_is_rtl?.should be_true
- "#{hebrew} #example".cleaned_is_rtl?.should be_true
- "♺: #{arabic} ♻: #{hebrew}".cleaned_is_rtl?.should be_true
+ expect("RT: #{arabic}".cleaned_is_rtl?).to be true
+ expect("#{hebrew} RT: #{arabic}".cleaned_is_rtl?).to be true
+ expect("@foo #{arabic}".cleaned_is_rtl?).to be true
+ expect("#{hebrew} #example".cleaned_is_rtl?).to be true
+ expect("♺: #{arabic} ♻: #{hebrew}".cleaned_is_rtl?).to be true
end
end
end
diff --git a/spec/lib/email_inviter_spec.rb b/spec/lib/email_inviter_spec.rb
index 6220864ae..68cd1197c 100644
--- a/spec/lib/email_inviter_spec.rb
+++ b/spec/lib/email_inviter_spec.rb
@@ -9,53 +9,53 @@ describe EmailInviter do
it 'has a list of emails' do
inviter = EmailInviter.new(@emails, @user)
- inviter.emails.should_not be_empty
+ expect(inviter.emails).not_to be_empty
end
it 'should parse three emails' do
inviter = EmailInviter.new(@emails, @user)
- inviter.emails.count.should == 3
+ expect(inviter.emails.count).to eq(3)
end
it 'has an inviter' do
inviter = EmailInviter.new(@emails, @user)
- inviter.inviter.should_not be_nil
+ expect(inviter.inviter).not_to be_nil
end
it 'can have a message' do
message = "you guys suck hard"
inviter = EmailInviter.new("emails", @user, :message => message)
- inviter.message.should == message
+ expect(inviter.message).to eq(message)
end
describe '#emails' do
it 'rejects the inviter email if present' do
inviter = EmailInviter.new(@emails + " #{@user.email}", @user)
- inviter.emails.should_not include(@user.email)
+ expect(inviter.emails).not_to include(@user.email)
end
end
describe 'language' do
it 'defaults to english' do
inviter = EmailInviter.new(@emails, @user)
- inviter.locale.should == 'en'
+ expect(inviter.locale).to eq('en')
end
it 'should symbolize keys' do
inviter = EmailInviter.new(@emails, @user, 'locale' => 'es')
- inviter.locale.should == 'es'
+ expect(inviter.locale).to eq('es')
end
it 'listens to the langauge option' do
inviter = EmailInviter.new(@emails, @user, :locale => 'es')
- inviter.locale.should == 'es'
+ expect(inviter.locale).to eq('es')
end
end
describe '#invitation_code' do
it 'delegates to the user' do
inviter = EmailInviter.new(@emails, @user)
- inviter.invitation_code.should == @user.invitation_code
+ expect(inviter.invitation_code).to eq(@user.invitation_code)
end
end
end
diff --git a/spec/lib/encryptor_spec.rb b/spec/lib/encryptor_spec.rb
index afc3c6005..a4d8a709a 100644
--- a/spec/lib/encryptor_spec.rb
+++ b/spec/lib/encryptor_spec.rb
@@ -14,8 +14,8 @@ describe 'user encryption' do
it 'should encrypt a string' do
string = "Secretsauce"
ciphertext = @user.person.encrypt string
- ciphertext.include?(string).should be false
- @user.decrypt(ciphertext).should == string
+ expect(ciphertext.include?(string)).to be false
+ expect(@user.decrypt(ciphertext)).to eq(string)
end
end
end
diff --git a/spec/lib/evil_query_spec.rb b/spec/lib/evil_query_spec.rb
index f4fc94955..0e98c5c78 100644
--- a/spec/lib/evil_query_spec.rb
+++ b/spec/lib/evil_query_spec.rb
@@ -12,20 +12,22 @@ end
describe EvilQuery::Participation do
before do
@status_message = FactoryGirl.create(:status_message, :author => bob.person)
+ # done in StatusMessagesController#create
+ bob.participate!(@status_message)
end
it "includes posts liked by the user" do
alice.like!(@status_message)
- EvilQuery::Participation.new(alice).posts.should include(@status_message)
+ expect(EvilQuery::Participation.new(alice).posts).to include(@status_message)
end
it "includes posts commented by the user" do
alice.comment!(@status_message, "hey")
- EvilQuery::Participation.new(alice).posts.should include(@status_message)
+ expect(EvilQuery::Participation.new(alice).posts).to include(@status_message)
end
it "should include your statusMessages" do
- pending
+ expect(EvilQuery::Participation.new(bob).posts).to include(@status_message)
end
describe "ordering" do
@@ -55,12 +57,12 @@ describe EvilQuery::Participation do
let(:posts) {EvilQuery::Participation.new(alice).posts}
it "doesn't include Posts that aren't acted on" do
- posts.map(&:id).should_not include(@status_messageD.id)
- posts.map(&:id).should =~ [@status_messageA.id, @status_messageB.id, @status_messageE.id]
+ expect(posts.map(&:id)).not_to include(@status_messageD.id)
+ expect(posts.map(&:id)).to match_array([@status_messageA.id, @status_messageB.id, @status_messageE.id])
end
it "returns the posts that the user has commented on or liked with the most recently acted on ones first" do
- posts.map(&:id).should == [@status_messageE.id, @status_messageA.id, @status_messageB.id]
+ expect(posts.map(&:id)).to eq([@status_messageE.id, @status_messageA.id, @status_messageB.id])
end
end
end
diff --git a/spec/lib/hcard_spec.rb b/spec/lib/hcard_spec.rb
index 4a898d9fb..86cab268b 100644
--- a/spec/lib/hcard_spec.rb
+++ b/spec/lib/hcard_spec.rb
@@ -8,12 +8,12 @@ describe HCard do
it 'should parse an hcard' do
raw_hcard = hcard_response
hcard = HCard.build raw_hcard
- hcard[:family_name].include?("Hamiltom").should be true
- hcard[:given_name].include?("Alex").should be true
- hcard[:photo].include?("thumb_large").should be true
- hcard[:photo_medium].include?("thumb_medium").should be true
- hcard[:photo_small].include?("thumb_small").should be true
- hcard[:url].should == "http://localhost:3000/"
- hcard[:searchable].should == "false"
+ expect(hcard[:family_name].include?("Hamiltom")).to be true
+ expect(hcard[:given_name].include?("Alex")).to be true
+ expect(hcard[:photo].include?("thumb_large")).to be true
+ expect(hcard[:photo_medium].include?("thumb_medium")).to be true
+ expect(hcard[:photo_small].include?("thumb_small")).to be true
+ expect(hcard[:url]).to eq("http://localhost:3000/")
+ expect(hcard[:searchable]).to eq("false")
end
end
diff --git a/spec/lib/hydra_wrapper_spec.rb b/spec/lib/hydra_wrapper_spec.rb
index c40752535..5a303052e 100644
--- a/spec/lib/hydra_wrapper_spec.rb
+++ b/spec/lib/hydra_wrapper_spec.rb
@@ -17,9 +17,9 @@ describe HydraWrapper do
dispatcher_class = "Postzord::Dispatcher::Private"
wrapper = HydraWrapper.new user, @people, encoded_object_xml, dispatcher_class
- wrapper.user.should == user
- wrapper.people.should == @people
- wrapper.encoded_object_xml.should == encoded_object_xml
+ expect(wrapper.user).to eq(user)
+ expect(wrapper.people).to eq(@people)
+ expect(wrapper.encoded_object_xml).to eq(encoded_object_xml)
end
end
@@ -27,16 +27,16 @@ describe HydraWrapper do
it 'delegates #run to the @hydra' do
hydra = double.as_null_object
@wrapper.instance_variable_set :@hydra, hydra
- hydra.should_receive :run
+ expect(hydra).to receive :run
@wrapper.run
end
end
describe '#xml_factory' do
it 'calls the salmon method on the dispatcher class (and memoizes)' do
- Base64.stub(:decode64).and_return "#{@wrapper.encoded_object_xml} encoded"
+ allow(Base64).to receive(:decode64).and_return "#{@wrapper.encoded_object_xml} encoded"
decoded = Base64.decode64 @wrapper.encoded_object_xml
- @wrapper.dispatcher_class.should_receive(:salmon).with(@wrapper.user, decoded).once.and_return true
+ expect(@wrapper.dispatcher_class).to receive(:salmon).with(@wrapper.user, decoded).once.and_return true
@wrapper.send :xml_factory
@wrapper.send :xml_factory
end
@@ -44,32 +44,32 @@ describe HydraWrapper do
describe '#grouped_people' do
it 'groups people given their receive_urls' do
- @wrapper.dispatcher_class.should_receive(:receive_url_for).and_return "foo.com", "bar.com", "bar.com"
+ expect(@wrapper.dispatcher_class).to receive(:receive_url_for).and_return "foo.com", "bar.com", "bar.com"
- @wrapper.send(:grouped_people).should == {"foo.com" => [@people[0]], "bar.com" => @people[1,2]}
+ expect(@wrapper.send(:grouped_people)).to eq({"foo.com" => [@people[0]], "bar.com" => @people[1,2]})
end
end
describe '#enqueue_batch' do
it 'calls #grouped_people' do
- @wrapper.should_receive(:grouped_people).and_return []
+ expect(@wrapper).to receive(:grouped_people).and_return []
@wrapper.enqueue_batch
end
it 'inserts a job for every group of people' do
- Base64.stub(:decode64)
+ allow(Base64).to receive(:decode64)
@wrapper.dispatcher_class = double salmon: double(xml_for: "<XML>")
- @wrapper.stub(:grouped_people).and_return('https://foo.com' => @wrapper.people)
- @wrapper.people.should_receive(:first).once
- @wrapper.should_receive(:insert_job).with('https://foo.com', "<XML>", @wrapper.people).once
+ allow(@wrapper).to receive(:grouped_people).and_return('https://foo.com' => @wrapper.people)
+ expect(@wrapper.people).to receive(:first).once
+ expect(@wrapper).to receive(:insert_job).with('https://foo.com', "<XML>", @wrapper.people).once
@wrapper.enqueue_batch
end
it 'does not insert a job for a person whos xml returns false' do
- Base64.stub(:decode64)
- @wrapper.stub(:grouped_people).and_return('https://foo.com' => [double])
+ allow(Base64).to receive(:decode64)
+ allow(@wrapper).to receive(:grouped_people).and_return('https://foo.com' => [double])
@wrapper.dispatcher_class = double salmon: double(xml_for: false)
- @wrapper.should_not_receive :insert_job
+ expect(@wrapper).not_to receive :insert_job
@wrapper.enqueue_batch
end
@@ -78,7 +78,7 @@ describe HydraWrapper do
describe '#redirecting_to_https?!' do
it 'does not execute unless response has a 3xx code' do
resp = double code: 200
- @wrapper.send(:redirecting_to_https?, resp).should be_false
+ expect(@wrapper.send(:redirecting_to_https?, resp)).to be false
end
it "returns true if just the protocol is different" do
@@ -91,7 +91,7 @@ describe HydraWrapper do
}
)
- @wrapper.send(:redirecting_to_https?, resp).should be_true
+ expect(@wrapper.send(:redirecting_to_https?, resp)).to be true
end
it "returns false if not just the protocol is different" do
@@ -104,7 +104,7 @@ describe HydraWrapper do
}
)
- @wrapper.send(:redirecting_to_https?, resp).should be_false
+ expect(@wrapper.send(:redirecting_to_https?, resp)).to be false
end
end
end
diff --git a/spec/lib/i18n_interpolation_fallbacks_spec.rb b/spec/lib/i18n_interpolation_fallbacks_spec.rb
index 56a05e1c3..d8569b05a 100644
--- a/spec/lib/i18n_interpolation_fallbacks_spec.rb
+++ b/spec/lib/i18n_interpolation_fallbacks_spec.rb
@@ -7,20 +7,20 @@ require 'spec_helper'
describe "i18n interpolation fallbacks" do
describe "when string does not require interpolation arguments" do
it "works normally" do
- I18n.t('user.invalid',
+ expect(I18n.t('user.invalid',
:resource_name => "user",
:scope => "devise.failure",
- :default => [:invalid, "invalid"]).should == "Invalid username or password."
+ :default => [:invalid, "invalid"])).to eq("Invalid username or password.")
end
end
describe "when string requires interpolation arguments" do
context "current locale has no fallbacks" do
# ago: "%{time} ago" (in en.yml)
it "returns the translation when all arguments are provided" do
- I18n.t('ago', :time => "2 months").should == "2 months ago"
+ expect(I18n.t('ago', :time => "2 months")).to eq("2 months ago")
end
it "returns the translation without substitution when all arguments are omitted" do
- I18n.t('ago').should == "%{time} ago"
+ expect(I18n.t('ago')).to eq("%{time} ago")
end
it "raises a MissingInterpolationArgument when arguments are wrong" do
expect { I18n.t('ago', :not_time => "2 months") }.to raise_exception(I18n::MissingInterpolationArgument)
@@ -37,19 +37,19 @@ describe "i18n interpolation fallbacks" do
end
describe "when all arguments are provided" do
it "returns the locale's translation" do
- I18n.t('nonexistant_key', :random_key => "Hi Alex,").should == "Hi Alex, here is some Italian"
+ expect(I18n.t('nonexistant_key', :random_key => "Hi Alex,")).to eq("Hi Alex, here is some Italian")
end
end
describe "when no arguments are provided" do
it "returns the locale's translation without substitution" do
- I18n.t('nonexistant_key').should == "%{random_key} here is some Italian"
+ expect(I18n.t('nonexistant_key')).to eq("%{random_key} here is some Italian")
end
end
describe "when arguments are wrong" do
describe "when the English translation works" do
it "falls back to English" do
I18n.backend.store_translations('en', {"nonexistant_key" => "Working English translation"})
- I18n.t('nonexistant_key', :hey => "what").should == "Working English translation"
+ expect(I18n.t('nonexistant_key', :hey => "what")).to eq("Working English translation")
end
end
describe "when the English translation does not work" do
diff --git a/spec/lib/postzord/dispatcher_spec.rb b/spec/lib/postzord/dispatcher_spec.rb
index 06e45c0ea..d54d7bb81 100644
--- a/spec/lib/postzord/dispatcher_spec.rb
+++ b/spec/lib/postzord/dispatcher_spec.rb
@@ -9,31 +9,31 @@ describe Postzord::Dispatcher do
@sm = FactoryGirl.create(:status_message, :public => true, :author => alice.person)
@subscribers = []
5.times{@subscribers << FactoryGirl.create(:person)}
- @sm.stub(:subscribers).and_return(@subscribers)
+ allow(@sm).to receive(:subscribers).and_return(@subscribers)
@xml = @sm.to_diaspora_xml
end
describe '.initialize' do
it 'sets @sender, @object, @xml' do
zord = Postzord::Dispatcher.build(alice, @sm)
- zord.sender.should == alice
- zord.object.should == @sm
- zord.xml.should == @sm.to_diaspora_xml
+ expect(zord.sender).to eq(alice)
+ expect(zord.object).to eq(@sm)
+ expect(zord.xml).to eq(@sm.to_diaspora_xml)
end
context 'setting @subscribers' do
it 'sets @subscribers from object' do
- @sm.should_receive(:subscribers).and_return(@subscribers)
+ expect(@sm).to receive(:subscribers).and_return(@subscribers)
zord = Postzord::Dispatcher.build(alice, @sm)
- zord.subscribers.should == @subscribers
+ expect(zord.subscribers).to eq(@subscribers)
end
it 'accepts additional subscribers from opts' do
new_person = FactoryGirl.create(:person)
- @sm.should_receive(:subscribers).and_return(@subscribers)
+ expect(@sm).to receive(:subscribers).and_return(@subscribers)
zord = Postzord::Dispatcher.build(alice, @sm, :additional_subscribers => new_person)
- zord.subscribers.should == @subscribers | [new_person]
+ expect(zord.subscribers).to eq(@subscribers | [new_person])
end
end
@@ -55,17 +55,17 @@ describe Postzord::Dispatcher do
describe '#post' do
it 'calls Array#partition on subscribers' do
@zord.instance_variable_set(:@subscribers, @subscribers)
- @subscribers.should_receive(:partition).and_return([@remote_people, @local_people])
+ expect(@subscribers).to receive(:partition).and_return([@remote_people, @local_people])
@zord.post
end
it 'calls #deliver_to_local with local people' do
- @zord.should_receive(:deliver_to_local).with(@local_people)
+ expect(@zord).to receive(:deliver_to_local).with(@local_people)
@zord.post
end
it 'calls #deliver_to_remote with remote people' do
- @zord.should_receive(:deliver_to_remote).with(@remote_people)
+ expect(@zord).to receive(:deliver_to_remote).with(@remote_people)
@zord.post
end
end
@@ -90,17 +90,17 @@ describe Postzord::Dispatcher do
end
it 'calls deliver_to_local with local_luke' do
- @mailman.should_receive(:deliver_to_local).with([@local_luke.person])
+ expect(@mailman).to receive(:deliver_to_local).with([@local_luke.person])
@mailman.post
end
it 'calls deliver_to_remote with nobody' do
- @mailman.should_receive(:deliver_to_remote).with([])
+ expect(@mailman).to receive(:deliver_to_remote).with([])
@mailman.post
end
it 'does not call notify_users' do
- @mailman.should_not_receive(:notify_users)
+ expect(@mailman).not_to receive(:notify_users)
@mailman.post
end
end
@@ -110,17 +110,17 @@ describe Postzord::Dispatcher do
end
it 'does not call deliver_to_local' do
- @mailman.should_not_receive(:deliver_to_local)
+ expect(@mailman).not_to receive(:deliver_to_local)
@mailman.post
end
it 'calls deliver_to_remote with remote raphael' do
- @mailman.should_receive(:deliver_to_remote).with([@remote_raphael])
+ expect(@mailman).to receive(:deliver_to_remote).with([@remote_raphael])
@mailman.post
end
it 'calls notify_users' do
- @mailman.should_receive(:notify_users).with([@local_leia])
+ expect(@mailman).to receive(:notify_users).with([@local_leia])
@mailman.post
end
end
@@ -134,17 +134,17 @@ describe Postzord::Dispatcher do
end
it 'does not call deliver_to_local' do
- @mailman.should_not_receive(:deliver_to_local)
+ expect(@mailman).not_to receive(:deliver_to_local)
@mailman.post
end
it 'calls deliver_to_remote with remote_raphael' do
- @mailman.should_receive(:deliver_to_remote).with([@remote_raphael])
+ expect(@mailman).to receive(:deliver_to_remote).with([@remote_raphael])
@mailman.post
end
it 'calls notify_users' do
- @mailman.should_receive(:notify_users).with([@local_leia])
+ expect(@mailman).to receive(:notify_users).with([@local_leia])
@mailman.post
end
end
@@ -157,17 +157,17 @@ describe Postzord::Dispatcher do
end
it 'does not call deliver_to_local' do
- @mailman.should_not_receive(:deliver_to_local)
+ expect(@mailman).not_to receive(:deliver_to_local)
@mailman.post
end
it 'calls deliver_to_remote with remote_raphael' do
- @mailman.should_receive(:deliver_to_remote).with([@remote_raphael])
+ expect(@mailman).to receive(:deliver_to_remote).with([@remote_raphael])
@mailman.post
end
it 'calls notify_users' do
- @mailman.should_receive(:notify_users).with([@local_leia])
+ expect(@mailman).to receive(:notify_users).with([@local_leia])
@mailman.post
end
end
@@ -182,17 +182,17 @@ describe Postzord::Dispatcher do
end
it 'calls deliver_to_remote with remote_raphael' do
- @mailman.should_receive(:deliver_to_remote).with([@remote_raphael])
+ expect(@mailman).to receive(:deliver_to_remote).with([@remote_raphael])
@mailman.post
end
it 'calls deliver_to_local with nobody' do
- @mailman.should_receive(:deliver_to_local).with([])
+ expect(@mailman).to receive(:deliver_to_local).with([])
@mailman.post
end
it 'does not call notify_users' do
- @mailman.should_not_receive(:notify_users)
+ expect(@mailman).not_to receive(:notify_users)
@mailman.post
end
end
@@ -204,15 +204,15 @@ describe Postzord::Dispatcher do
@remote_people << alice.person
@mailman = Postzord::Dispatcher.build(alice, @sm)
@hydra = double()
- Typhoeus::Hydra.stub(:new).and_return(@hydra)
+ allow(Typhoeus::Hydra).to receive(:new).and_return(@hydra)
end
it 'should queue an HttpMultiJob for the remote people' do
- Postzord::Dispatcher::Public.any_instance.unstub(:deliver_to_remote)
- Workers::HttpMulti.should_receive(:perform_async).with(alice.id, anything, @remote_people.map{|p| p.id}, anything).once
+ allow_any_instance_of(Postzord::Dispatcher::Public).to receive(:deliver_to_remote).and_call_original
+ expect(Workers::HttpMulti).to receive(:perform_async).with(alice.id, anything, @remote_people.map{|p| p.id}, anything).once
@mailman.send(:deliver_to_remote, @remote_people)
- Postzord::Dispatcher::Public.stub(:deliver_to_remote)
+ allow(Postzord::Dispatcher::Public).to receive(:deliver_to_remote)
end
end
@@ -224,18 +224,18 @@ describe Postzord::Dispatcher do
it 'queues a batch receive' do
local_people = []
local_people << alice.person
- Workers::ReceiveLocalBatch.should_receive(:perform_async).with(@sm.class.to_s, @sm.id, [alice.id]).once
+ expect(Workers::ReceiveLocalBatch).to receive(:perform_async).with(@sm.class.to_s, @sm.id, [alice.id]).once
@mailman.send(:deliver_to_local, local_people)
end
it 'returns if people are empty' do
- Workers::ReceiveLocalBatch.should_not_receive(:perform_async)
+ expect(Workers::ReceiveLocalBatch).not_to receive(:perform_async)
@mailman.send(:deliver_to_local, [])
end
it 'returns if the object is a profile' do
@mailman.instance_variable_set(:@object, Profile.new)
- Workers::ReceiveLocalBatch.should_not_receive(:perform_async)
+ expect(Workers::ReceiveLocalBatch).not_to receive(:perform_async)
@mailman.send(:deliver_to_local, [1])
end
end
@@ -243,28 +243,28 @@ describe Postzord::Dispatcher do
describe '#object_should_be_processed_as_public?' do
it 'returns true with a comment on a public post' do
f = FactoryGirl.create(:comment, :post => FactoryGirl.build(:status_message, :public => true))
- Postzord::Dispatcher.object_should_be_processed_as_public?(f).should be_true
+ expect(Postzord::Dispatcher.object_should_be_processed_as_public?(f)).to be true
end
it 'returns false with a comment on a private post' do
f = FactoryGirl.create(:comment, :post => FactoryGirl.build(:status_message, :public => false))
- Postzord::Dispatcher.object_should_be_processed_as_public?(f).should be_false
+ expect(Postzord::Dispatcher.object_should_be_processed_as_public?(f)).to be false
end
it 'returns true with a like on a comment on a public post' do
f = FactoryGirl.create(:like, :target => FactoryGirl.build(:comment, :post => FactoryGirl.build(:status_message, :public => true)))
- Postzord::Dispatcher.object_should_be_processed_as_public?(f).should be_true
+ expect(Postzord::Dispatcher.object_should_be_processed_as_public?(f)).to be true
end
it 'returns false with a like on a comment on a private post' do
f = FactoryGirl.create(:like, :target => FactoryGirl.build(:comment, :post => FactoryGirl.build(:status_message, :public => false)))
- Postzord::Dispatcher.object_should_be_processed_as_public?(f).should be_false
+ expect(Postzord::Dispatcher.object_should_be_processed_as_public?(f)).to be false
end
it 'returns false for a relayable_retraction' do
f = RelayableRetraction.new
f.target = FactoryGirl.create(:status_message, :public => true)
- Postzord::Dispatcher.object_should_be_processed_as_public?(f).should be_false
+ expect(Postzord::Dispatcher.object_should_be_processed_as_public?(f)).to be false
end
end
@@ -277,8 +277,8 @@ describe Postzord::Dispatcher do
end
it 'queues a job to notify the hub' do
- Workers::PostToService.stub(:perform_async).with(anything, anything, anything)
- Workers::PublishToHub.should_receive(:perform_async).with(alice.public_url)
+ allow(Workers::PostToService).to receive(:perform_async).with(anything, anything, anything)
+ expect(Workers::PublishToHub).to receive(:perform_async).with(alice.public_url)
@zord.send(:deliver_to_services, nil, [])
end
@@ -286,7 +286,7 @@ describe Postzord::Dispatcher do
@sm = FactoryGirl.create(:status_message)
mailman = Postzord::Dispatcher.build(alice, @sm, :url => "http://joindiaspora.com/p/123")
- mailman.should_not_receive(:deliver_to_hub)
+ expect(mailman).not_to receive(:deliver_to_hub)
mailman.post
end
@@ -297,17 +297,17 @@ describe Postzord::Dispatcher do
alice.services << @s2
mailman = Postzord::Dispatcher.build(alice, FactoryGirl.create(:status_message), :url => "http://joindiaspora.com/p/123", :services => [@s1])
- Workers::PublishToHub.stub(:perform_async).with(anything)
- Workers::HttpMulti.stub(:perform_async).with(anything, anything, anything)
- Workers::PostToService.should_receive(:perform_async).with(@s1.id, anything, anything)
+ allow(Workers::PublishToHub).to receive(:perform_async).with(anything)
+ allow(Workers::HttpMulti).to receive(:perform_async).with(anything, anything, anything)
+ expect(Workers::PostToService).to receive(:perform_async).with(@s1.id, anything, anything)
mailman.post
end
it 'does not push to services if none are specified' do
mailman = Postzord::Dispatcher.build(alice, FactoryGirl.create(:status_message), :url => "http://joindiaspora.com/p/123")
- Workers::PublishToHub.stub(:perform_async).with(anything)
- Workers::PostToService.should_not_receive(:perform_async).with(anything, anything, anything)
+ allow(Workers::PublishToHub).to receive(:perform_async).with(anything)
+ expect(Workers::PostToService).not_to receive(:perform_async).with(anything, anything, anything)
mailman.post
end
@@ -315,7 +315,7 @@ describe Postzord::Dispatcher do
retraction = SignedRetraction.build(alice, FactoryGirl.create(:status_message))
mailman = Postzord::Dispatcher.build(alice, retraction, :url => "http://joindiaspora.com/p/123", :services => [@service])
- Workers::DeletePostFromService.should_receive(:perform_async).with(anything, anything)
+ expect(Workers::DeletePostFromService).to receive(:perform_async).with(anything, anything)
mailman.post
end
@@ -323,14 +323,14 @@ describe Postzord::Dispatcher do
describe '#and_notify_local_users' do
it 'calls notifiy_users' do
- @zord.should_receive(:notify_users).with([bob])
+ expect(@zord).to receive(:notify_users).with([bob])
@zord.send(:notify_local_users, [bob.person])
end
end
describe '#notify_users' do
it 'enqueues a NotifyLocalUsers job' do
- Workers::NotifyLocalUsers.should_receive(:perform_async).with([bob.id], @zord.object.class.to_s, @zord.object.id, @zord.object.author.id)
+ expect(Workers::NotifyLocalUsers).to receive(:perform_async).with([bob.id], @zord.object.class.to_s, @zord.object.id, @zord.object.author.id)
@zord.send(:notify_users, [bob])
end
end
diff --git a/spec/lib/postzord/receiver/local_batch_spec.rb b/spec/lib/postzord/receiver/local_batch_spec.rb
index ad1ef7115..1a6c8e2fe 100644
--- a/spec/lib/postzord/receiver/local_batch_spec.rb
+++ b/spec/lib/postzord/receiver/local_batch_spec.rb
@@ -11,31 +11,31 @@ describe Postzord::Receiver::LocalBatch do
describe '.initialize' do
it 'sets @post, @recipient_user_ids, and @user' do
[:object, :recipient_user_ids, :users].each do |instance_var|
- receiver.send(instance_var).should_not be_nil
+ expect(receiver.send(instance_var)).not_to be_nil
end
end
end
describe '#receive!' do
it 'calls .create_share_visibilities' do
- receiver.should_receive(:create_share_visibilities)
+ expect(receiver).to receive(:create_share_visibilities)
receiver.receive!
end
it 'notifies mentioned users' do
- receiver.should_receive(:notify_mentioned_users)
+ expect(receiver).to receive(:notify_mentioned_users)
receiver.receive!
end
it 'notifies users' do
- receiver.should_receive(:notify_users)
+ expect(receiver).to receive(:notify_users)
receiver.receive!
end
end
describe '#create_share_visibilities' do
it 'calls sharevisibility.batch_import with hashes' do
- ShareVisibility.should_receive(:batch_import).with(instance_of(Array), @object)
+ expect(ShareVisibility).to receive(:batch_import).with(instance_of(Array), @object)
receiver.create_share_visibilities
end
end
@@ -47,12 +47,12 @@ describe Postzord::Receiver::LocalBatch do
:text => "Hey @{Bob; #{bob.diaspora_handle}}")
receiver2 = Postzord::Receiver::LocalBatch.new(sm, @ids)
- Notification.should_receive(:notify).with(bob, anything, alice.person)
+ expect(Notification).to receive(:notify).with(bob, anything, alice.person)
receiver2.notify_mentioned_users
end
it 'does not call notify person for a non-mentioned person' do
- Notification.should_not_receive(:notify)
+ expect(Notification).not_to receive(:notify)
receiver.notify_mentioned_users
end
end
@@ -60,7 +60,7 @@ describe Postzord::Receiver::LocalBatch do
describe '#notify_users' do
it 'calls notify for posts with notification type' do
reshare = FactoryGirl.create(:reshare)
- Notification.should_receive(:notify)
+ expect(Notification).to receive(:notify)
receiver = Postzord::Receiver::LocalBatch.new(reshare, @ids)
receiver.notify_users
end
@@ -68,7 +68,7 @@ describe Postzord::Receiver::LocalBatch do
it 'calls notify for posts with notification type' do
sm = FactoryGirl.create(:status_message, :author => alice.person)
receiver = Postzord::Receiver::LocalBatch.new(sm, @ids)
- Notification.should_not_receive(:notify)
+ expect(Notification).not_to receive(:notify)
receiver.notify_users
end
end
@@ -80,13 +80,13 @@ describe Postzord::Receiver::LocalBatch do
end
it 'calls notify_users' do
- receiver.should_receive(:notify_users)
+ expect(receiver).to receive(:notify_users)
receiver.perform!
end
it 'does not call create_visibilities and notify_mentioned_users' do
- receiver.should_not_receive(:notify_mentioned_users)
- receiver.should_not_receive(:create_share_visibilities)
+ expect(receiver).not_to receive(:notify_mentioned_users)
+ expect(receiver).not_to receive(:create_share_visibilities)
receiver.perform!
end
end
diff --git a/spec/lib/postzord/receiver/private_spec.rb b/spec/lib/postzord/receiver/private_spec.rb
index 352c91d40..645cc7d00 100644
--- a/spec/lib/postzord/receiver/private_spec.rb
+++ b/spec/lib/postzord/receiver/private_spec.rb
@@ -13,27 +13,27 @@ describe Postzord::Receiver::Private do
describe '.initialize' do
it 'valid for local' do
- Webfinger.should_not_receive(:new)
- Salmon::EncryptedSlap.should_not_receive(:from_xml)
+ expect(Webfinger).not_to receive(:new)
+ expect(Salmon::EncryptedSlap).not_to receive(:from_xml)
zord = Postzord::Receiver::Private.new(bob, :person => alice.person, :object => @alices_post)
- zord.instance_variable_get(:@user).should_not be_nil
- zord.instance_variable_get(:@sender).should_not be_nil
- zord.instance_variable_get(:@object).should_not be_nil
+ expect(zord.instance_variable_get(:@user)).not_to be_nil
+ expect(zord.instance_variable_get(:@sender)).not_to be_nil
+ expect(zord.instance_variable_get(:@object)).not_to be_nil
end
it 'valid for remote' do
salmon_double = double()
web_double = double()
- web_double.should_receive(:fetch).and_return true
- salmon_double.should_receive(:author_id).and_return(true)
- Salmon::EncryptedSlap.should_receive(:from_xml).with(@salmon_xml, bob).and_return(salmon_double)
- Webfinger.should_receive(:new).and_return(web_double)
+ expect(web_double).to receive(:fetch).and_return true
+ expect(salmon_double).to receive(:author_id).and_return(true)
+ expect(Salmon::EncryptedSlap).to receive(:from_xml).with(@salmon_xml, bob).and_return(salmon_double)
+ expect(Webfinger).to receive(:new).and_return(web_double)
zord = Postzord::Receiver::Private.new(bob, :salmon_xml => @salmon_xml)
- zord.instance_variable_get(:@user).should_not be_nil
- zord.instance_variable_get(:@sender).should_not be_nil
- zord.instance_variable_get(:@salmon_xml).should_not be_nil
+ expect(zord.instance_variable_get(:@user)).not_to be_nil
+ expect(zord.instance_variable_get(:@sender)).not_to be_nil
+ expect(zord.instance_variable_get(:@salmon_xml)).not_to be_nil
end
end
@@ -46,24 +46,24 @@ describe Postzord::Receiver::Private do
context 'returns false' do
it 'if the salmon author does not exist' do
@zord.instance_variable_set(:@sender, nil)
- @zord.receive!.should == false
+ expect(@zord.receive!).to eq(false)
end
it 'if the author does not match the signature' do
@zord.instance_variable_set(:@sender, FactoryGirl.create(:person))
- @zord.receive!.should == false
+ expect(@zord.receive!).to eq(false)
end
end
context 'returns the sent object' do
it 'returns the received object on success' do
@zord.receive!
- @zord.instance_variable_get(:@object).should respond_to(:to_diaspora_xml)
+ expect(@zord.instance_variable_get(:@object)).to respond_to(:to_diaspora_xml)
end
end
it 'parses the salmon object' do
- Diaspora::Parser.should_receive(:from_xml).with(@salmon.parsed_data).and_return(@alices_post)
+ expect(Diaspora::Parser).to receive(:from_xml).with(@salmon.parsed_data).and_return(@alices_post)
@zord.receive!
end
end
@@ -76,20 +76,20 @@ describe Postzord::Receiver::Private do
it 'calls Notification.notify if object responds to notification_type' do
cm = Comment.new
- cm.stub(:receive).and_return(cm)
+ allow(cm).to receive(:receive).and_return(cm)
- Notification.should_receive(:notify).with(bob, cm, alice.person)
+ expect(Notification).to receive(:notify).with(bob, cm, alice.person)
zord = Postzord::Receiver::Private.new(bob, :person => alice.person, :object => cm)
zord.receive_object
end
it 'does not call Notification.notify if object does not respond to notification_type' do
- Notification.should_not_receive(:notify)
+ expect(Notification).not_to receive(:notify)
@zord.receive_object
end
it 'calls receive on @object' do
- obj = @zord.instance_variable_get(:@object).should_receive(:receive)
+ obj = expect(@zord.instance_variable_get(:@object)).to receive(:receive)
@zord.receive_object
end
end
diff --git a/spec/lib/postzord/receiver/public_spec.rb b/spec/lib/postzord/receiver/public_spec.rb
index c291b14c5..a1eaab462 100644
--- a/spec/lib/postzord/receiver/public_spec.rb
+++ b/spec/lib/postzord/receiver/public_spec.rb
@@ -22,7 +22,7 @@ describe Postzord::Receiver::Public do
bob.destroy
comment.destroy
expect{
- receiver = Postzord::Receiver::Public.new(xml)
+ receiver = Postzord::Receiver::Public.new(xml)
receiver.perform!
}.to change(Comment, :count).by(1)
end
@@ -31,7 +31,7 @@ describe Postzord::Receiver::Public do
describe '#initialize' do
it 'creates a Salmon instance variable' do
receiver = Postzord::Receiver::Public.new(@xml)
- receiver.salmon.should_not be_nil
+ expect(receiver.salmon).not_to be_nil
end
end
@@ -41,28 +41,28 @@ describe Postzord::Receiver::Public do
end
it 'calls verify_signature' do
- @receiver.should_receive(:verified_signature?)
+ expect(@receiver).to receive(:verified_signature?)
@receiver.perform!
end
it 'returns false if signature is not verified' do
- @receiver.should_receive(:verified_signature?).and_return(false)
- @receiver.perform!.should be_false
+ expect(@receiver).to receive(:verified_signature?).and_return(false)
+ expect(@receiver.perform!).to be false
end
context 'if signature is valid' do
it 'calls recipient_user_ids' do
- @receiver.should_receive(:recipient_user_ids)
+ expect(@receiver).to receive(:recipient_user_ids)
@receiver.perform!
end
it 'saves the parsed object' do
- @receiver.should_receive(:save_object)
+ expect(@receiver).to receive(:save_object)
@receiver.perform!
end
- it 'enqueues a Workers::ReceiveLocalBatch' do
- Workers::ReceiveLocalBatch.should_receive(:perform_async).with(anything, anything, anything)
+ it 'enqueues a Workers::ReceiveLocalBatch' do
+ expect(Workers::ReceiveLocalBatch).to receive(:perform_async).with(anything, anything, anything)
@receiver.perform!
end
@@ -77,20 +77,20 @@ describe Postzord::Receiver::Public do
describe '#verify_signature?' do
it 'calls Slap#verified_for_key?' do
receiver = Postzord::Receiver::Public.new(@xml)
- receiver.salmon.should_receive(:verified_for_key?).with(instance_of(OpenSSL::PKey::RSA))
+ expect(receiver.salmon).to receive(:verified_for_key?).with(instance_of(OpenSSL::PKey::RSA))
receiver.verified_signature?
end
end
describe '#recipient_user_ids' do
it 'calls User.all_sharing_with_person' do
- User.should_receive(:all_sharing_with_person).and_return(double(:select => []))
+ expect(User).to receive(:all_sharing_with_person).and_return(double(:pluck => []))
receiver = Postzord::Receiver::Public.new(@xml)
receiver.perform!
end
end
- describe '#receive_relayable' do
+ describe '#receive_relayable' do
before do
@comment = bob.build_comment(:text => 'yo', :post => FactoryGirl.create(:status_message))
@comment.save
@@ -104,7 +104,7 @@ describe Postzord::Receiver::Public do
comment = double.as_null_object
@receiver.instance_variable_set(:@object, comment)
- comment.should_receive(:receive)
+ expect(comment).to receive(:receive)
@receiver.receive_relayable
end
@@ -113,8 +113,8 @@ describe Postzord::Receiver::Public do
@receiver.instance_variable_set(:@object, comment)
local_batch_receiver = double.as_null_object
- Postzord::Receiver::LocalBatch.stub(:new).and_return(local_batch_receiver)
- local_batch_receiver.should_receive(:notify_users)
+ allow(Postzord::Receiver::LocalBatch).to receive(:new).and_return(local_batch_receiver)
+ expect(local_batch_receiver).to receive(:notify_users)
@receiver.receive_relayable
end
end
diff --git a/spec/lib/postzord/receiver_spec.rb b/spec/lib/postzord/receiver_spec.rb
index 5ac6dbf9a..a7dca6b1d 100644
--- a/spec/lib/postzord/receiver_spec.rb
+++ b/spec/lib/postzord/receiver_spec.rb
@@ -11,11 +11,11 @@ describe Postzord::Receiver do
describe "#perform!" do
before do
- @receiver.stub(:receive!).and_return(true)
+ allow(@receiver).to receive(:receive!).and_return(true)
end
it 'calls receive!' do
- @receiver.should_receive(:receive!)
+ expect(@receiver).to receive(:receive!)
@receiver.perform!
end
end
diff --git a/spec/lib/publisher_spec.rb b/spec/lib/publisher_spec.rb
index c638235ff..7bb7a7c5d 100644
--- a/spec/lib/publisher_spec.rb
+++ b/spec/lib/publisher_spec.rb
@@ -8,29 +8,29 @@ describe Publisher do
describe "#prefill" do
it 'defaults to nothing' do
- @publisher.prefill.should be_blank
+ expect(@publisher.prefill).to be_blank
end
it 'is settable' do
- Publisher.new(alice, :prefill => "party!").prefill.should == "party!"
+ expect(Publisher.new(alice, :prefill => "party!").prefill).to eq("party!")
end
end
describe '#text' do
it 'is a formatted version of the prefill' do
p = Publisher.new(alice, :prefill => "@{alice; alice@pod.com}")
- p.text.should == "alice"
+ expect(p.text).to eq("alice")
end
end
["open", "public", "explain"].each do |property|
describe "##{property}?" do
it 'defaults to closed' do
- @publisher.send("#{property}?".to_sym).should be_false
+ expect(@publisher.send("#{property}?".to_sym)).to be_falsey
end
it 'listens to the opts' do
- Publisher.new(alice, {property.to_sym => true}).send("#{property}?".to_sym).should be_true
+ expect(Publisher.new(alice, {property.to_sym => true}).send("#{property}?".to_sym)).to be true
end
end
end
diff --git a/spec/lib/pubsubhubbub_spec.rb b/spec/lib/pubsubhubbub_spec.rb
index c486f0377..896e08279 100644
--- a/spec/lib/pubsubhubbub_spec.rb
+++ b/spec/lib/pubsubhubbub_spec.rb
@@ -12,7 +12,7 @@ describe Pubsubhubbub do
body = {'hub.url' => feed, 'hub.mode' => 'publish'}
stub_request(:post, "http://hubzord.com/").to_return(:status => [202, 'you are awesome'])
- Pubsubhubbub.new(hub).publish(feed).should be_success
+ expect(Pubsubhubbub.new(hub).publish(feed)).to be_success
end
end
end
diff --git a/spec/lib/rack/chrome_frame_spec.rb b/spec/lib/rack/chrome_frame_spec.rb
index 12643a95c..e3ae4a714 100644
--- a/spec/lib/rack/chrome_frame_spec.rb
+++ b/spec/lib/rack/chrome_frame_spec.rb
@@ -18,30 +18,38 @@ describe Rack::ChromeFrame do
context "non-IE browser" do
let(:ua_string) { "another browser chromeframe" }
- its(:body) { should_not =~ /chrome=1/ }
- its(:body) { should_not =~ /Diaspora doesn't support your version of Internet Explorer/ }
+ it "shouldn't complain about the browser" do
+ expect(subject.body).not_to match(/chrome=1/)
+ expect(subject.body).not_to match(/Diaspora doesn't support your version of Internet Explorer/)
+ end
end
context "IE8 without chromeframe" do
let(:ua_string) { "MSIE 8" }
-
- its(:body) { should_not =~ /chrome=1/ }
- its(:body) { should_not =~ /Diaspora doesn't support your version of Internet Explorer/ }
+
+ it "shouldn't complain about the browser" do
+ expect(subject.body).not_to match(/chrome=1/)
+ expect(subject.body).not_to match(/Diaspora doesn't support your version of Internet Explorer/)
+ end
end
context "IE7 without chromeframe" do
let(:ua_string) { "MSIE 7" }
-
- its(:body) { should_not =~ /chrome=1/ }
- its(:body) { should =~ /Diaspora doesn't support your version of Internet Explorer/ }
- specify {@response.headers["Content-Length"].should == @response.body.length.to_s}
+
+ it "shouldn't complain about the browser" do
+ expect(subject.body).not_to match(/chrome=1/)
+ expect(subject.body).to match(/Diaspora doesn't support your version of Internet Explorer/)
+ end
+ specify {expect(@response.headers["Content-Length"]).to eq(@response.body.length.to_s)}
end
context "any IE with chromeframe" do
let(:ua_string) { "MSIE number chromeframe" }
-
- its(:body) { should =~ /chrome=1/ }
- its(:body) { should_not =~ /Diaspora doesn't support your version of Internet Explorer/ }
- specify {@response.headers["Content-Length"].should == @response.body.length.to_s}
+
+ it "shouldn't complain about the browser" do
+ expect(subject.body).to match(/chrome=1/)
+ expect(subject.body).not_to match(/Diaspora doesn't support your version of Internet Explorer/)
+ end
+ specify {expect(@response.headers["Content-Length"]).to eq(@response.body.length.to_s)}
end
end
diff --git a/spec/lib/rake_helper_spec.rb b/spec/lib/rake_helper_spec.rb
index 1f8001fbd..c0db62701 100644
--- a/spec/lib/rake_helper_spec.rb
+++ b/spec/lib/rake_helper_spec.rb
@@ -10,20 +10,15 @@ describe RakeHelpers do
before do
@csv = Rails.root.join('spec', 'fixtures', 'test.csv')
end
+
describe '#process_emails' do
before do
Devise.mailer.deliveries = []
- @old_admin = AppConfig.admins.account.get
AppConfig.admins.account = FactoryGirl.create(:user).username
end
- after do
- AppConfig.admins.account = @old_admin
- end
-
it 'should send emails to each email' do
-
- EmailInviter.should_receive(:new).exactly(3).times.and_return(double.as_null_object)
+ expect(EmailInviter).to receive(:new).exactly(3).times.and_return(double.as_null_object)
process_emails(@csv, 100, 1, false)
end
end
diff --git a/spec/lib/salmon/encrypted_slap_spec.rb b/spec/lib/salmon/encrypted_slap_spec.rb
index 90ed786a7..ba297edcf 100644
--- a/spec/lib/salmon/encrypted_slap_spec.rb
+++ b/spec/lib/salmon/encrypted_slap_spec.rb
@@ -14,12 +14,12 @@ describe Salmon::EncryptedSlap do
it 'makes the data in the signature encrypted with that key' do
key_hash = {'key' => @created_salmon.aes_key, 'iv' => @created_salmon.iv}
decoded_string = Salmon::EncryptedSlap.decode64url(@created_salmon.magic_sig.data)
- alice.aes_decrypt(decoded_string, key_hash).should == @post.to_diaspora_xml
+ expect(alice.aes_decrypt(decoded_string, key_hash)).to eq(@post.to_diaspora_xml)
end
it 'sets aes and iv key' do
- @created_salmon.aes_key.should_not be_nil
- @created_salmon.iv.should_not be_nil
+ expect(@created_salmon.aes_key).not_to be_nil
+ expect(@created_salmon.iv).not_to be_nil
end
end
@@ -30,15 +30,15 @@ describe Salmon::EncryptedSlap do
end
it 'sets the author id' do
- @new_slap.author_id.should == alice.diaspora_handle
+ expect(@new_slap.author_id).to eq(alice.diaspora_handle)
end
it 'sets the aes_key' do
- @new_slap.aes_key.should == @created_salmon.aes_key
+ expect(@new_slap.aes_key).to eq(@created_salmon.aes_key)
end
it 'sets the aes_key' do
- @new_slap.iv.should == @created_salmon.iv
+ expect(@new_slap.iv).to eq(@created_salmon.iv)
end
end
@@ -47,15 +47,15 @@ describe Salmon::EncryptedSlap do
let(:parsed_salmon) { Salmon::EncryptedSlap.from_xml(xml, alice)}
it 'should parse out the aes key' do
- parsed_salmon.aes_key.should == @created_salmon.aes_key
+ expect(parsed_salmon.aes_key).to eq(@created_salmon.aes_key)
end
it 'should parse out the iv' do
- parsed_salmon.iv.should == @created_salmon.iv
+ expect(parsed_salmon.iv).to eq(@created_salmon.iv)
end
it 'contains the original data' do
- parsed_salmon.parsed_data.should == @post.to_diaspora_xml
+ expect(parsed_salmon.parsed_data).to eq(@post.to_diaspora_xml)
end
end
@@ -66,7 +66,7 @@ describe Salmon::EncryptedSlap do
it 'has a encrypted header field' do
doc = Nokogiri::XML(@xml)
- doc.find("encrypted_header").should_not be_blank
+ expect(doc.find("encrypted_header")).not_to be_blank
end
context "encrypted header" do
@@ -77,15 +77,15 @@ describe Salmon::EncryptedSlap do
end
it 'contains the aes key' do
- @dh_doc.search('aes_key').map(&:text).should == [@created_salmon.aes_key]
+ expect(@dh_doc.search('aes_key').map(&:text)).to eq([@created_salmon.aes_key])
end
it 'contains the initialization vector' do
- @dh_doc.search('iv').map(&:text).should == [@created_salmon.iv]
+ expect(@dh_doc.search('iv').map(&:text)).to eq([@created_salmon.iv])
end
it 'contains the author id' do
- @dh_doc.search('author_id').map(&:text).should == [alice.diaspora_handle]
+ expect(@dh_doc.search('author_id').map(&:text)).to eq([alice.diaspora_handle])
end
end
end
diff --git a/spec/lib/salmon/slap_spec.rb b/spec/lib/salmon/slap_spec.rb
index 885d2ca3e..d3a6851af 100644
--- a/spec/lib/salmon/slap_spec.rb
+++ b/spec/lib/salmon/slap_spec.rb
@@ -8,11 +8,11 @@ describe Salmon::Slap do
describe '#create' do
it 'has data in the magic envelope' do
- @created_salmon.magic_sig.data.should_not be nil
+ expect(@created_salmon.magic_sig.data).not_to be nil
end
it 'has no parsed_data' do
- @created_salmon.parsed_data.should be nil
+ expect(@created_salmon.parsed_data).to be nil
end
end
@@ -20,13 +20,13 @@ describe Salmon::Slap do
it 'works' do
salmon_string = @created_salmon.xml_for(nil)
salmon = Salmon::Slap.from_xml(salmon_string)
- salmon.author.should == alice.person
- salmon.parsed_data.should == @post.to_diaspora_xml
+ expect(salmon.author).to eq(alice.person)
+ expect(salmon.parsed_data).to eq(@post.to_diaspora_xml)
end
describe '#from_xml' do
it 'procsses the header' do
- Salmon::Slap.any_instance.should_receive(:process_header)
+ expect_any_instance_of(Salmon::Slap).to receive(:process_header)
Salmon::Slap.from_xml(@created_salmon.xml_for(eve.person))
end
end
@@ -35,7 +35,7 @@ describe Salmon::Slap do
it 'sets the author id' do
slap = Salmon::Slap.new
slap.process_header(Nokogiri::XML(@created_salmon.plaintext_header))
- slap.author_id.should == alice.diaspora_handle
+ expect(slap.author_id).to eq(alice.diaspora_handle)
end
end
@@ -44,7 +44,7 @@ describe Salmon::Slap do
let(:parsed_salmon) { Salmon::Slap.from_xml(xml, alice)}
it 'should reference a local author' do
- parsed_salmon.author.should == alice.person
+ expect(parsed_salmon.author).to eq(alice.person)
end
it 'should fail if no author is found' do
@@ -60,19 +60,19 @@ describe Salmon::Slap do
let(:parsed_salmon) { Salmon::Slap.from_xml(xml)}
it 'should parse out the authors diaspora_handle' do
- parsed_salmon.author_id.should == alice.person.diaspora_handle
+ expect(parsed_salmon.author_id).to eq(alice.person.diaspora_handle)
end
it 'verifies the signature for the sender' do
- parsed_salmon.verified_for_key?(alice.public_key).should be_true
+ expect(parsed_salmon.verified_for_key?(alice.public_key)).to be true
end
it 'verifies the signature for the sender' do
- parsed_salmon.verified_for_key?(FactoryGirl.create(:person).public_key).should be_false
+ expect(parsed_salmon.verified_for_key?(FactoryGirl.create(:person).public_key)).to be false
end
it 'contains the original data' do
- parsed_salmon.parsed_data.should == @post.to_diaspora_xml
+ expect(parsed_salmon.parsed_data).to eq(@post.to_diaspora_xml)
end
end
@@ -83,12 +83,12 @@ describe Salmon::Slap do
it "has diaspora as the root" do
doc = Nokogiri::XML(@xml)
- doc.root.name.should == "diaspora"
+ expect(doc.root.name).to eq("diaspora")
end
it "it has the descrypted header" do
doc = Nokogiri::XML(@xml)
- doc.search("header").should_not be_blank
+ expect(doc.search("header")).not_to be_blank
end
context "header" do
@@ -96,14 +96,14 @@ describe Salmon::Slap do
it "it has author_id node " do
doc = Nokogiri::XML(@xml)
search = doc.search("header").search("author_id")
- search.map(&:text).should == [alice.diaspora_handle]
+ expect(search.map(&:text)).to eq([alice.diaspora_handle])
end
end
it "it has the magic envelope " do
doc = Nokogiri::XML(@xml)
- doc.find("/me:env").should_not be_blank
+ expect(doc.find("/me:env")).not_to be_blank
end
end
end
diff --git a/spec/lib/statistics_spec.rb b/spec/lib/statistics_spec.rb
index b0dc46c9b..87597f062 100644
--- a/spec/lib/statistics_spec.rb
+++ b/spec/lib/statistics_spec.rb
@@ -3,12 +3,12 @@ require 'spec_helper'
describe Statistics do
def result_should_equal( actual )
- actual.count.should == @result.count
+ expect(actual.count).to eq(@result.count)
@result.each do |expected_hash|
- actual.find { |actual_hash|
+ expect(actual.find { |actual_hash|
actual_hash['id'].to_i == expected_hash['id'].to_i &&
actual_hash['count'].to_i == expected_hash['count'].to_i
- }.should_not be_nil
+ }).not_to be_nil
end
end
@@ -19,7 +19,8 @@ describe Statistics do
{"id" => bob.id , "count" => 1 },
{"id" => eve.id , "count" => 0 },
{"id" => local_luke.id , "count" => 0 },
- {"id" => local_leia.id , "count" => 0 }]
+ {"id" => local_leia.id , "count" => 0 },
+ {"id" => peter.id , "count" => 0 }]
end
describe '#posts_count_sql' do
@@ -68,7 +69,8 @@ describe Statistics do
{"id" => bob.id , "count" => 2 },
{"id" => eve.id , "count" => 1 },
{"id" => local_luke.id , "count" => 2 },
- {"id" => local_leia.id , "count" => 2 }]
+ {"id" => local_leia.id , "count" => 2 },
+ {"id" => peter.id , "count" => 1 }]
result_should_equal User.connection.select_all(@stats.contacts_sharing_with_count_sql)
end
@@ -96,9 +98,10 @@ describe Statistics do
{"id" => bob.id , "count" => 1, "connected" => 1 },
{"id" => eve.id , "count" => 0, "connected" => 1 },
{"id" => local_luke.id , "count" => 0, "connected" => 0 },
- {"id" => local_leia.id , "count" => 0, "connected" => 0 }]
+ {"id" => local_leia.id , "count" => 0, "connected" => 0 },
+ {"id" => peter.id , "count" => 0, "connected" => 0 }]
- @stats.fb_connected_distribution.should =~ @result
+ expect(@stats.fb_connected_distribution).to match_array(@result)
end
end
@@ -106,15 +109,15 @@ describe Statistics do
"mentions_count", "sign_in_count", "contacts_sharing_with_count" ].each do |method|
it "#{method}_sql calls where_sql" do
- @stats.should_receive(:where_clause_sql)
+ expect(@stats).to receive(:where_clause_sql)
@stats.send("#{method}_sql".to_sym)
end
if !["sign_in_count", "tags_followed_count"].include?(method)
it "#generate_correlations calls correlate with #{method} and sign_in_count" do
- @stats.stub(:correlate).and_return(0.5)
- @stats.should_receive(:correlate).with(method.to_sym,:sign_in_count).and_return(0.75)
+ allow(@stats).to receive(:correlate).and_return(0.5)
+ expect(@stats).to receive(:correlate).with(method.to_sym,:sign_in_count).and_return(0.75)
@stats.generate_correlations
end
end
@@ -123,8 +126,8 @@ describe Statistics do
describe "#correlation" do
it 'returns the correlation coefficient' do
- @stats.correlation([1,2],[1,2]).to_s.should == 1.0.to_s
- @stats.correlation([1,2,1,2],[1,1,2,2]).to_s.should == 0.0.to_s
+ expect(@stats.correlation([1,2],[1,2]).to_s).to eq(1.0.to_s)
+ expect(@stats.correlation([1,2,1,2],[1,1,2,2]).to_s).to eq(0.0.to_s)
end
end
describe "#generate_correlations" do
@@ -133,21 +136,21 @@ describe Statistics do
bob.post(:status_message, :text => "here is a message")
bob.save!
- c = @stats.generate_correlations[:posts_count].round(1).should == 1.0
+ c = expect(@stats.generate_correlations[:posts_count].round(1)).to eq(1.0)
end
end
describe "#correlate" do
it 'calls correlation with post' do
- User.connection.should_receive(:select_all).and_return([{"id"=> 1, "count" => 7},
+ expect(User.connection).to receive(:select_all).and_return([{"id"=> 1, "count" => 7},
{"id" => 2, "count" => 8},
{"id" => 3, "count" => 9}],
[{"id"=> 1, "count" => 17},
{"id" => 3, "count" => 19}]
)
- @stats.should_receive(:correlation).with([7,9],[17,19]).and_return(0.5)
- @stats.correlate(:posts_count,:sign_in_count).should == 0.5
+ expect(@stats).to receive(:correlation).with([7,9],[17,19]).and_return(0.5)
+ expect(@stats.correlate(:posts_count,:sign_in_count)).to eq(0.5)
end
end
@@ -156,7 +159,7 @@ describe Statistics do
context 'todos' do
before do
- pending
+ skip
end
# requires a threshold
diff --git a/spec/lib/stream/activity_spec.rb b/spec/lib/stream/activity_spec.rb
index fc77feeca..bb066a3f8 100644
--- a/spec/lib/stream/activity_spec.rb
+++ b/spec/lib/stream/activity_spec.rb
@@ -3,10 +3,19 @@ require Rails.root.join('spec', 'shared_behaviors', 'stream')
describe Stream::Activity do
before do
- @stream = Stream::Activity.new(alice, :max_time => Time.now, :order => 'updated_at')
+ @stream = Stream::Activity.new(alice)
end
describe 'shared behaviors' do
it_should_behave_like 'it is a stream'
end
+
+ describe "#posts" do
+ it "calls EvilQuery::Participation with correct parameters" do
+ expect(::EvilQuery::Participation).to receive(:new)
+ .with(alice)
+ .and_return(double.tap { |m| allow(m).to receive(:posts)})
+ @stream.posts
+ end
+ end
end
diff --git a/spec/lib/stream/aspect_spec.rb b/spec/lib/stream/aspect_spec.rb
index 1ec82d1bd..96c8ce7c4 100644
--- a/spec/lib/stream/aspect_spec.rb
+++ b/spec/lib/stream/aspect_spec.rb
@@ -10,7 +10,7 @@ describe Stream::Aspect do
alice = double.as_null_object
stream = Stream::Aspect.new(alice, [1,2,3])
- alice.aspects.should_receive(:where)
+ expect(alice.aspects).to receive(:where)
stream.aspects
end
@@ -18,16 +18,16 @@ describe Stream::Aspect do
alice = double.as_null_object
stream = Stream::Aspect.new(alice, [])
- alice.aspects.should_not_receive(:where)
+ expect(alice.aspects).not_to receive(:where)
stream.aspects
end
it 'filters aspects given a user' do
alice = double(:aspects => [double(:id => 1)])
- alice.aspects.stub(:where).and_return(alice.aspects)
+ allow(alice.aspects).to receive(:where).and_return(alice.aspects)
stream = Stream::Aspect.new(alice, [1,2,3])
- stream.aspects.should == alice.aspects
+ expect(stream.aspects).to eq(alice.aspects)
end
end
@@ -38,8 +38,8 @@ describe Stream::Aspect do
stream = Stream::Aspect.new(alice, [1,2])
- stream.should_receive(:aspects).and_return(aspects)
- aspects.should_receive(:map)
+ expect(stream).to receive(:aspects).and_return(aspects)
+ expect(aspects).to receive(:map)
stream.aspect_ids
end
end
@@ -52,33 +52,33 @@ describe Stream::Aspect do
it 'calls visible posts for the given user' do
stream = Stream::Aspect.new(@alice, [1,2])
- @alice.should_receive(:visible_shareables).and_return(double.as_null_object)
+ expect(@alice).to receive(:visible_shareables).and_return(double.as_null_object)
stream.posts
end
it 'is called with 2 types' do
stream = Stream::Aspect.new(@alice, [1,2], :order => 'created_at')
- @alice.should_receive(:visible_shareables).with(Post, hash_including(:type=> ['StatusMessage', 'Reshare'])).and_return(double.as_null_object)
+ expect(@alice).to receive(:visible_shareables).with(Post, hash_including(:type=> ['StatusMessage', 'Reshare'])).and_return(double.as_null_object)
stream.posts
end
it 'respects ordering' do
stream = Stream::Aspect.new(@alice, [1,2], :order => 'created_at')
- @alice.should_receive(:visible_shareables).with(Post, hash_including(:order => 'created_at DESC')).and_return(double.as_null_object)
+ expect(@alice).to receive(:visible_shareables).with(Post, hash_including(:order => 'created_at DESC')).and_return(double.as_null_object)
stream.posts
end
it 'respects max_time' do
stream = Stream::Aspect.new(@alice, [1,2], :max_time => 123)
- @alice.should_receive(:visible_shareables).with(Post, hash_including(:max_time => instance_of(Time))).and_return(double.as_null_object)
+ expect(@alice).to receive(:visible_shareables).with(Post, hash_including(:max_time => instance_of(Time))).and_return(double.as_null_object)
stream.posts
end
it 'passes for_all_aspects to visible posts' do
stream = Stream::Aspect.new(@alice, [1,2], :max_time => 123)
all_aspects = double
- stream.stub(:for_all_aspects?).and_return(all_aspects)
- @alice.should_receive(:visible_shareables).with(Post, hash_including(:all_aspects? => all_aspects)).and_return(double.as_null_object)
+ allow(stream).to receive(:for_all_aspects?).and_return(all_aspects)
+ expect(@alice).to receive(:visible_shareables).with(Post, hash_including(:all_aspects? => all_aspects)).and_return(double.as_null_object)
stream.posts
end
end
@@ -91,8 +91,8 @@ describe Stream::Aspect do
aspect_ids = [1,2,3]
stream = Stream::Aspect.new(alice, [])
- stream.stub(:aspect_ids).and_return(aspect_ids)
- Person.should_receive(:unique_from_aspects).with(stream.aspect_ids, alice).and_return(double(:includes => :profile))
+ allow(stream).to receive(:aspect_ids).and_return(aspect_ids)
+ expect(Person).to receive(:unique_from_aspects).with(stream.aspect_ids, alice).and_return(double(:includes => :profile))
stream.people
end
end
@@ -104,31 +104,31 @@ describe Stream::Aspect do
end
it "returns an aspect if the stream is not for all the user's aspects" do
- @stream.stub(:for_all_aspects?).and_return(false)
- @stream.aspect.should_not be_nil
+ allow(@stream).to receive(:for_all_aspects?).and_return(false)
+ expect(@stream.aspect).not_to be_nil
end
it "returns nothing if the stream is not for all the user's aspects" do
- @stream.stub(:for_all_aspects?).and_return(true)
- @stream.aspect.should be_nil
+ allow(@stream).to receive(:for_all_aspects?).and_return(true)
+ expect(@stream.aspect).to be_nil
end
end
describe 'for_all_aspects?' do
before do
alice = double.as_null_object
- alice.aspects.stub(:size).and_return(2)
+ allow(alice.aspects).to receive(:size).and_return(2)
@stream = Stream::Aspect.new(alice, [1,2])
end
it "is true if the count of aspect_ids is equal to the size of the user's aspect count" do
- @stream.aspect_ids.stub(:length).and_return(2)
- @stream.should be_for_all_aspects
+ allow(@stream.aspect_ids).to receive(:length).and_return(2)
+ expect(@stream).to be_for_all_aspects
end
it "is false if the count of aspect_ids is not equal to the size of the user's aspect count" do
- @stream.aspect_ids.stub(:length).and_return(1)
- @stream.should_not be_for_all_aspects
+ allow(@stream.aspect_ids).to receive(:length).and_return(1)
+ expect(@stream).not_to be_for_all_aspects
end
end
diff --git a/spec/lib/stream/base_spec.rb b/spec/lib/stream/base_spec.rb
index 584c15c7d..2f5c2435e 100644
--- a/spec/lib/stream/base_spec.rb
+++ b/spec/lib/stream/base_spec.rb
@@ -8,17 +8,17 @@ describe Stream::Base do
describe '#contacts_link' do
it 'should default to your contacts page' do
- @stream.contacts_link.should =~ /contacts/
+ expect(@stream.contacts_link).to match(/contacts/)
end
end
describe '#stream_posts' do
it "should returns the posts.for_a_stream" do
posts = double
- @stream.stub(:posts).and_return(posts)
- @stream.stub(:like_posts_for_stream!)
+ allow(@stream).to receive(:posts).and_return(posts)
+ allow(@stream).to receive(:like_posts_for_stream!)
- posts.should_receive(:for_a_stream).with(anything, anything, alice).and_return(posts)
+ expect(posts).to receive(:for_a_stream).with(anything, anything, alice).and_return(posts)
@stream.stream_posts
end
@@ -30,7 +30,7 @@ describe Stream::Base do
end
it "marks the posts as liked" do
- @stream.stream_posts.first.user_like.id.should == @like.id
+ expect(@stream.stream_posts.first.user_like.id).to eq(@like.id)
end
end
end
@@ -38,39 +38,39 @@ describe Stream::Base do
describe '.can_comment?' do
before do
@person = FactoryGirl.create(:person)
- @stream.stub(:people).and_return([bob.person, eve.person, @person])
+ allow(@stream).to receive(:people).and_return([bob.person, eve.person, @person])
end
it 'allows me to comment on my local contacts post' do
post = FactoryGirl.create(:status_message, :author => bob.person)
- @stream.can_comment?(post).should be_true
+ expect(@stream.can_comment?(post)).to be true
end
it 'allows me to comment on my own post' do
post = FactoryGirl.create(:status_message, :author => alice.person)
- @stream.can_comment?(post).should be_true
+ expect(@stream.can_comment?(post)).to be true
end
it 'allows me to comment on any local public post' do
post = FactoryGirl.create(:status_message, :author => eve.person)
- @stream.can_comment?(post).should be_true
+ expect(@stream.can_comment?(post)).to be true
end
it 'allows me to comment on a remote contacts post' do
Contact.create!(:user => @stream.user, :person => @person)
post = FactoryGirl.create(:status_message, :author => @person)
- @stream.can_comment?(post).should be_true
+ expect(@stream.can_comment?(post)).to be true
end
it 'returns false if person is remote and not a contact' do
post = FactoryGirl.create(:status_message, :author => @person)
- @stream.can_comment?(post).should be_false
+ expect(@stream.can_comment?(post)).to be false
end
end
describe '#people' do
it 'excludes blocked people' do
- @stream.should_receive(:stream_posts).and_return(double.as_null_object)
+ expect(@stream).to receive(:stream_posts).and_return(double.as_null_object)
@stream.people
end
end
diff --git a/spec/lib/stream/followed_tag_spec.rb b/spec/lib/stream/followed_tag_spec.rb
index 832847d32..f46d49a70 100644
--- a/spec/lib/stream/followed_tag_spec.rb
+++ b/spec/lib/stream/followed_tag_spec.rb
@@ -4,7 +4,7 @@ require Rails.root.join('spec', 'shared_behaviors', 'stream')
describe Stream::FollowedTag do
before do
@stream = Stream::FollowedTag.new(alice, :max_time => Time.now, :order => 'updated_at')
- @stream.stub(:tag_string).and_return("foo")
+ allow(@stream).to receive(:tag_string).and_return("foo")
end
describe 'shared behaviors' do
diff --git a/spec/lib/stream/multi_spec.rb b/spec/lib/stream/multi_spec.rb
index 6b13c046f..2f77fc180 100644
--- a/spec/lib/stream/multi_spec.rb
+++ b/spec/lib/stream/multi_spec.rb
@@ -12,11 +12,11 @@ describe Stream::Multi do
describe "#posts" do
it "calls EvilQuery::MultiStream with correct parameters" do
- ::EvilQuery::MultiStream.should_receive(:new)
+ expect(::EvilQuery::MultiStream).to receive(:new)
.with(alice, 'updated_at', @stream.max_time,
AppConfig.settings.community_spotlight.enable? &&
alice.show_community_spotlight_in_stream?)
- .and_return(double.tap { |m| m.stub(:make_relation!)})
+ .and_return(double.tap { |m| allow(m).to receive(:make_relation!)})
@stream.posts
end
end
@@ -24,34 +24,34 @@ describe Stream::Multi do
describe '#publisher_opts' do
it 'prefills, sets public, and autoexpands if welcome? is set' do
prefill_text = "sup?"
- @stream.stub(:welcome?).and_return(true)
- @stream.stub(:publisher_prefill).and_return(prefill_text)
- @stream.send(:publisher_opts).should == {:open => true,
+ allow(@stream).to receive(:welcome?).and_return(true)
+ allow(@stream).to receive(:publisher_prefill).and_return(prefill_text)
+ expect(@stream.send(:publisher_opts)).to eq({:open => true,
:prefill => prefill_text,
- :public => true}
+ :public => true})
end
it 'provides no opts if welcome? is not set' do
prefill_text = "sup?"
- @stream.stub(:welcome?).and_return(false)
- @stream.send(:publisher_opts).should == {}
+ allow(@stream).to receive(:welcome?).and_return(false)
+ expect(@stream.send(:publisher_opts)).to eq({})
end
end
describe "#publisher_prefill" do
before do
- @tag = ActsAsTaggableOn::Tag.find_or_create_by_name("cats")
+ @tag = ActsAsTaggableOn::Tag.find_or_create_by(name: "cats")
@tag_following = alice.tag_followings.create(:tag_id => @tag.id)
@stream = Stream::Multi.new(alice)
end
it 'returns includes new user hashtag' do
- @stream.send(:publisher_prefill).should match(/#NewHere/i)
+ expect(@stream.send(:publisher_prefill)).to match(/#NewHere/i)
end
it 'includes followed hashtags' do
- @stream.send(:publisher_prefill).should include("#cats")
+ expect(@stream.send(:publisher_prefill)).to include("#cats")
end
context 'when invited by another user' do
@@ -64,7 +64,7 @@ describe Stream::Multi do
it 'includes a mention of the inviter' do
mention = "@{#{@inviter.name} ; #{@inviter.diaspora_handle}}"
- @stream.send(:publisher_prefill).should include(mention)
+ expect(@stream.send(:publisher_prefill)).to include(mention)
end
end
end
@@ -76,12 +76,12 @@ describe Stream::Multi do
it 'returns true if user is getting started' do
alice.getting_started = true
- @stream.send(:welcome?).should be_true
+ expect(@stream.send(:welcome?)).to be true
end
it 'returns false if user is getting started' do
alice.getting_started = false
- @stream.send(:welcome?).should be_false
+ expect(@stream.send(:welcome?)).to be false
end
end
end
diff --git a/spec/lib/stream/person_spec.rb b/spec/lib/stream/person_spec.rb
index c1c07f7cd..f5eb10224 100644
--- a/spec/lib/stream/person_spec.rb
+++ b/spec/lib/stream/person_spec.rb
@@ -11,7 +11,7 @@ describe Stream::Person do
end
it "returns the most recent posts" do
- pending # this randomly fails on postgres
+ skip # this randomly fails on postgres
posts = []
fetched_posts = []
@@ -28,7 +28,7 @@ describe Stream::Person do
posts = posts.reverse.slice(0..14)
fetched_posts = fetched_posts.slice(0..14)
- fetched_posts.should == posts
+ expect(fetched_posts).to eq(posts)
end
end
diff --git a/spec/lib/stream/tag_spec.rb b/spec/lib/stream/tag_spec.rb
index 0b3da4762..5e1205c83 100644
--- a/spec/lib/stream/tag_spec.rb
+++ b/spec/lib/stream/tag_spec.rb
@@ -14,31 +14,24 @@ describe Stream::Tag do
it 'displays your own post' do
my_post = alice.post(:status_message, :text => "#what", :to => 'all')
- @stream.posts.should == [my_post]
+ expect(@stream.posts).to eq([my_post])
end
it "displays a friend's post" do
other_post = bob.post(:status_message, :text => "#what", :to => 'all')
- @stream.posts.should == [other_post]
+ expect(@stream.posts).to eq([other_post])
end
it 'displays a public post' do
other_post = eve.post(:status_message, :text => "#what", :public => true, :to => 'all')
- @stream.posts.should == [other_post]
+ expect(@stream.posts).to eq([other_post])
end
it 'displays a public post that was sent to no one' do
stranger = FactoryGirl.create(:user_with_aspect)
stranger_post = stranger.post(:status_message, :text => "#what", :public => true, :to => 'all')
- @stream.posts.should == [stranger_post]
+ expect(@stream.posts).to eq([stranger_post])
end
-
- it 'displays a post with a comment containing the tag search' do
- pending "this code is way too slow. need to re-implement in a way that doesn't suck"
- other_post = bob.post(:status_message, :text => "sup y'all", :to => 'all')
- FactoryGirl.create(:comment, :text => "#what", :post => other_post)
- @stream.posts.should == [other_post]
- end
end
context 'without a user' do
@@ -50,7 +43,7 @@ describe Stream::Tag do
it "displays only public posts with the tag" do
stream = Stream::Tag.new(nil, "what")
- stream.posts.should == [@post]
+ expect(stream.posts).to eq([@post])
end
end
@@ -58,7 +51,7 @@ describe Stream::Tag do
it "assigns the set of people who authored a post containing the tag" do
alice.post(:status_message, :text => "#what", :public => true, :to => 'all')
stream = Stream::Tag.new(nil, "what")
- stream.people.should == [alice.person]
+ expect(stream.people).to eq([alice.person])
end
end
@@ -68,7 +61,7 @@ describe Stream::Tag do
alice.profile.tag_string = "#whatevs"
alice.profile.build_tags
alice.profile.save!
- stream.tagged_people.should == [alice.person]
+ expect(stream.tagged_people).to eq([alice.person])
end
end
@@ -81,7 +74,7 @@ describe Stream::Tag do
it 'returns posts regardless of the tag case' do
stream = Stream::Tag.new(nil, "newhere")
- stream.posts.should =~ [@post_lc, @post_uc, @post_cp]
+ expect(stream.posts).to match_array([@post_lc, @post_uc, @post_cp])
end
end
@@ -95,18 +88,18 @@ describe Stream::Tag do
describe '#tag_name=' do
it 'downcases the tag' do
stream = Stream::Tag.new(nil, "WHAT")
- stream.tag_name.should == 'what'
+ expect(stream.tag_name).to eq('what')
end
it 'removes #es' do
stream = Stream::Tag.new(nil, "#WHAT")
- stream.tag_name.should == 'what'
+ expect(stream.tag_name).to eq('what')
end
end
describe "#publisher" do
it 'creates a publisher with the tag prefill' do
- Publisher.should_receive(:new).with(anything(), anything)
+ expect(Publisher).to receive(:new).with(anything(), anything)
@stream = Stream::Tag.new(alice, "what")
end
end
diff --git a/spec/lib/webfinger_profile_spec.rb b/spec/lib/webfinger_profile_spec.rb
index aa42d2d64..51991f084 100644
--- a/spec/lib/webfinger_profile_spec.rb
+++ b/spec/lib/webfinger_profile_spec.rb
@@ -11,22 +11,22 @@ describe WebfingerProfile do
describe '#valid_diaspora_profile?' do
it 'should check all of the required fields' do
- manual_nil_check(profile).should == profile.valid_diaspora_profile?
+ expect(manual_nil_check(profile)).to eq(profile.valid_diaspora_profile?)
end
end
describe '#set_fields' do
it 'should check to make sure it has a the right webfinger profile' do
- proc{ WebfingerProfile.new("nottom@tom.joindiaspora.com", webfinger_profile)}.should raise_error
+ expect{ WebfingerProfile.new("nottom@tom.joindiaspora.com", webfinger_profile)}.to raise_error
end
it 'should handle a non-diaspora profile without blowing up' do
- proc{ WebfingerProfile.new("evan@status.net", not_diaspora_webfinger)}.should_not raise_error
+ expect{ WebfingerProfile.new("evan@status.net", not_diaspora_webfinger)}.not_to raise_error
end
[:links, :hcard, :guid, :seed_location, :public_key].each do |field|
it 'should sets the #{field} field' do
- profile.send(field).should be_present
+ expect(profile.send(field)).to be_present
end
end
end
diff --git a/spec/lib/webfinger_spec.rb b/spec/lib/webfinger_spec.rb
index 453535020..c3515bebe 100644
--- a/spec/lib/webfinger_spec.rb
+++ b/spec/lib/webfinger_spec.rb
@@ -16,36 +16,36 @@ describe Webfinger do
describe '#intialize' do
it 'sets account ' do
n = Webfinger.new("mbs348@gmail.com")
- n.account.should_not be nil
+ expect(n.account).not_to be nil
end
it "downcases account and strips whitespace, and gsub 'acct:'" do
n = Webfinger.new("acct:BIGBOY@Example.Org ")
- n.account.should == 'bigboy@example.org'
+ expect(n.account).to eq('bigboy@example.org')
end
it 'should set ssl as the default' do
foo = Webfinger.new(account)
- foo.ssl.should be true
+ expect(foo.ssl).to be true
end
end
describe '.in_background' do
it 'enqueues a Workers::FetchWebfinger job' do
- Workers::FetchWebfinger.should_receive(:perform_async).with(account)
+ expect(Workers::FetchWebfinger).to receive(:perform_async).with(account)
Webfinger.in_background(account)
end
end
-
+
describe '#fetch' do
it 'works' do
finger = Webfinger.new(account_in_fixtures)
- finger.stub(:host_meta_xrd).and_return(host_meta_xrd)
- finger.stub(:hcard_xrd).and_return(hcard_xml)
- finger.stub(:webfinger_profile_xrd).and_return(webfinger_xrd)
+ allow(finger).to receive(:host_meta_xrd).and_return(host_meta_xrd)
+ allow(finger).to receive(:hcard_xrd).and_return(hcard_xml)
+ allow(finger).to receive(:webfinger_profile_xrd).and_return(webfinger_xrd)
person = finger.fetch
- person.should be_valid
- person.should be_a Person
+ expect(person).to be_valid
+ expect(person).to be_a Person
end
end
@@ -56,7 +56,7 @@ describe Webfinger do
stub_request(:get, url).
to_return(:status => 200, :body => host_meta_xrd)
- finger.get(url).should == host_meta_xrd
+ expect(finger.get(url)).to eq(host_meta_xrd)
end
it 'follows redirects' do
@@ -70,44 +70,45 @@ describe Webfinger do
finger.host_meta_xrd
- a_request(:get, redirect_url).should have_been_made
+ expect(a_request(:get, redirect_url)).to have_been_made
end
-
- it 'returns false on 404' do
+
+ it 'raises on 404' do
url ="https://bar.com/.well-known/host-meta"
stub_request(:get, url).
to_return(:status => 404, :body => nil)
- finger.get(url).should_not == nil
- finger.get(url).should == false
+ expect {
+ expect(finger.get(url)).to eq(false)
+ }.to raise_error
end
end
describe 'existing_person_with_profile?' do
it 'returns true if cached_person is present and has a profile' do
- finger.should_receive(:cached_person).twice.and_return(FactoryGirl.create(:person))
- finger.existing_person_with_profile?.should be_true
+ expect(finger).to receive(:cached_person).twice.and_return(FactoryGirl.create(:person))
+ expect(finger.existing_person_with_profile?).to be true
end
it 'returns false if it has no person' do
- finger.stub(:cached_person).and_return false
- finger.existing_person_with_profile?.should be_false
+ allow(finger).to receive(:cached_person).and_return false
+ expect(finger.existing_person_with_profile?).to be false
end
it 'returns false if the person has no profile' do
p = FactoryGirl.create(:person)
p.profile = nil
- finger.stub(:cached_person).and_return(p)
- finger.existing_person_with_profile?.should be_false
+ allow(finger).to receive(:cached_person).and_return(p)
+ expect(finger.existing_person_with_profile?).to be false
end
end
describe 'cached_person' do
it 'sets the person by looking up the account from Person.by_account_identifier' do
person = double
- Person.should_receive(:by_account_identifier).with(account).and_return(person)
- finger.cached_person.should == person
- finger.person.should == person
+ expect(Person).to receive(:by_account_identifier).with(account).and_return(person)
+ expect(finger.cached_person).to eq(person)
+ expect(finger.person).to eq(person)
end
end
@@ -116,16 +117,16 @@ describe Webfinger do
context 'with a cached_person' do
it 'calls Person#assign_new_profile_from_hcard with the fetched hcard' do
finger.hcard_xrd = hcard_xml
- finger.stub(:person).and_return(bob.person)
- bob.person.should_receive(:assign_new_profile_from_hcard).with(finger.hcard)
+ allow(finger).to receive(:person).and_return(bob.person)
+ expect(bob.person).to receive(:assign_new_profile_from_hcard).with(finger.hcard)
finger.create_or_update_person_from_webfinger_profile!
end
end
context 'with no cached person' do
it 'sets person based on make_person_from_webfinger' do
- finger.stub(:person).and_return(nil)
- finger.should_receive(:make_person_from_webfinger)
+ allow(finger).to receive(:person).and_return(nil)
+ expect(finger).to receive(:make_person_from_webfinger)
finger.create_or_update_person_from_webfinger_profile!
end
end
@@ -133,67 +134,67 @@ describe Webfinger do
describe '#host_meta_xrd' do
it 'calls #get with host_meta_url' do
- finger.stub(:host_meta_url).and_return('meta')
- finger.should_receive(:get).with('meta')
+ allow(finger).to receive(:host_meta_url).and_return('meta')
+ expect(finger).to receive(:get).with('meta')
finger.host_meta_xrd
end
it 'should retry with ssl off a second time' do
- finger.should_receive(:get).and_raise(StandardError)
- finger.should_receive(:get)
+ expect(finger).to receive(:get).and_raise(StandardError)
+ expect(finger).to receive(:get)
finger.host_meta_xrd
- finger.ssl.should be false
+ expect(finger.ssl).to be false
end
end
describe '#hcard' do
it 'calls HCard.build' do
- finger.stub(:hcard_xrd).and_return(hcard_xml)
- HCard.should_receive(:build).with(hcard_xml).and_return true
- finger.hcard.should_not be_nil
+ allow(finger).to receive(:hcard_xrd).and_return(hcard_xml)
+ expect(HCard).to receive(:build).with(hcard_xml).and_return true
+ expect(finger.hcard).not_to be_nil
end
end
describe '#webfinger_profile' do
it 'constructs a new WebfingerProfile object' do
- finger.stub(:webfinger_profile_xrd).and_return(webfinger_xrd)
- WebfingerProfile.should_receive(:new).with(account, webfinger_xrd)
+ allow(finger).to receive(:webfinger_profile_xrd).and_return(webfinger_xrd)
+ expect(WebfingerProfile).to receive(:new).with(account, webfinger_xrd)
finger.webfinger_profile
end
end
describe '#webfinger_profile_url' do
it 'returns the llrd link for a valid host meta' do
- finger.stub(:host_meta_xrd).and_return(host_meta_xrd)
- finger.webfinger_profile_url.should_not be_nil
+ allow(finger).to receive(:host_meta_xrd).and_return(host_meta_xrd)
+ expect(finger.webfinger_profile_url).not_to be_nil
end
it 'returns nil if no link is found' do
- finger.stub(:host_meta_xrd).and_return(nil)
- finger.webfinger_profile_url.should be_nil
+ allow(finger).to receive(:host_meta_xrd).and_return(nil)
+ expect(finger.webfinger_profile_url).to be_nil
end
end
describe '#webfinger_profile_xrd' do
it 'calls #get with the hcard_url' do
- finger.stub(:hcard_url).and_return("url")
- finger.should_receive(:get).with("url")
+ allow(finger).to receive(:hcard_url).and_return("url")
+ expect(finger).to receive(:get).with("url")
finger.hcard_xrd
end
end
describe '#make_person_from_webfinger' do
it 'with an hcard and a webfinger_profile, it calls Person.create_from_webfinger' do
- finger.stub(:hcard).and_return("hcard")
- finger.stub(:webfinger_profile_xrd).and_return("webfinger_profile_xrd")
- finger.stub(:webfinger_profile).and_return("webfinger_profile")
- Person.should_receive(:create_from_webfinger).with("webfinger_profile", "hcard")
+ allow(finger).to receive(:hcard).and_return("hcard")
+ allow(finger).to receive(:webfinger_profile_xrd).and_return("webfinger_profile_xrd")
+ allow(finger).to receive(:webfinger_profile).and_return("webfinger_profile")
+ expect(Person).to receive(:create_from_webfinger).with("webfinger_profile", "hcard")
finger.make_person_from_webfinger
end
-
+
it 'with an false xrd it does not call Person.create_from_webfinger' do
- finger.stub(:webfinger_profile_xrd).and_return(false)
- Person.should_not_receive(:create_from_webfinger)
+ allow(finger).to receive(:webfinger_profile_xrd).and_return(false)
+ expect(Person).not_to receive(:create_from_webfinger)
finger.make_person_from_webfinger
end
end
@@ -203,18 +204,18 @@ describe Webfinger do
describe '#host_meta_url' do
it 'should return canonical host-meta url for http' do
finger.ssl = false
- finger.host_meta_url.should == "http://bar.com/.well-known/host-meta"
+ expect(finger.host_meta_url).to eq("http://bar.com/.well-known/host-meta")
end
it 'can return the https version' do
- finger.host_meta_url.should == "https://bar.com/.well-known/host-meta"
+ expect(finger.host_meta_url).to eq("https://bar.com/.well-known/host-meta")
end
end
describe 'swizzle' do
it 'gsubs out {uri} for the account' do
string = "{uri} is the coolest"
- finger.swizzle(string).should == "#{finger.account} is the coolest"
+ expect(finger.swizzle(string)).to eq("#{finger.account} is the coolest")
end
end
end
diff --git a/spec/locale_spec.rb b/spec/locale_spec.rb
index 0ba8c31cd..18ee1864c 100644
--- a/spec/locale_spec.rb
+++ b/spec/locale_spec.rb
@@ -4,15 +4,15 @@ describe 'locale files' do
describe "cldr/plurals.rb" do
AVAILABLE_LANGUAGE_CODES.each do |locale|
describe "#{locale} plural rules" do
- it "defines the keys" do
+ it "defines the keys for #{locale}" do
I18n.with_locale locale do
expect {
I18n.t 'i18n.plural.keys'
}.to_not raise_error
end
end
-
- it "defines a valid pluralization function" do
+
+ it "defines a valid pluralization function for #{locale}" do
I18n.with_locale locale do
expect {
rule = I18n.t 'i18n.plural.rule', resolve: false
@@ -20,8 +20,8 @@ describe 'locale files' do
}.to_not raise_error
end
end
-
- it "defines a valid javascript pluralization function" do
+
+ it "defines a valid javascript pluralization function for #{locale}" do
I18n.with_locale locale do
expect {
ExecJS.eval I18n.t('i18n.plural.js_rule')
@@ -31,7 +31,7 @@ describe 'locale files' do
end
end
end
-
+
AVAILABLE_LANGUAGE_CODES.each do |locale|
["diaspora/#{locale}.yml",
"devise/devise.#{locale}.yml",
@@ -39,7 +39,7 @@ describe 'locale files' do
describe file do
it "has no syntax errors if it exists" do
file = Rails.root.join("config", "locales", file)
- pending "Not yet available" unless File.exists? file
+ skip "Not yet available" unless File.exists? file
expect {
YAML.load_file file
}.to_not raise_error
diff --git a/spec/mailers/export_spec.rb b/spec/mailers/export_spec.rb
new file mode 100644
index 000000000..24b10753b
--- /dev/null
+++ b/spec/mailers/export_spec.rb
@@ -0,0 +1,67 @@
+# 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 ExportMailer, :type => :mailer do
+ describe '#export_complete_for' do
+ it "should deliver successfully" do
+ expect { ExportMailer.export_complete_for(alice).deliver_now }.to_not raise_error
+ end
+
+ it "should be added to the delivery queue" do
+ expect { ExportMailer.export_complete_for(alice).deliver_now }.to change(ActionMailer::Base.deliveries, :size).by(1)
+ end
+
+ it "should include correct recipient" do
+ ExportMailer.export_complete_for(alice).deliver_now
+ expect(ActionMailer::Base.deliveries[0].to[0]).to include(alice.email)
+ end
+ end
+
+ describe '#export_failure_for' do
+ it "should deliver successfully" do
+ expect { ExportMailer.export_failure_for(alice).deliver_now }.to_not raise_error
+ end
+
+ it "should be added to the delivery queue" do
+ expect { ExportMailer.export_failure_for(alice).deliver_now }.to change(ActionMailer::Base.deliveries, :size).by(1)
+ end
+
+ it "should include correct recipient" do
+ ExportMailer.export_failure_for(alice).deliver_now
+ expect(ActionMailer::Base.deliveries[0].to[0]).to include(alice.email)
+ end
+ end
+
+ describe '#export_photos_complete_for' do
+ it "should deliver successfully" do
+ expect { ExportMailer.export_photos_complete_for(alice).deliver_now }.to_not raise_error
+ end
+
+ it "should be added to the delivery queue" do
+ expect { ExportMailer.export_photos_complete_for(alice).deliver_now }.to change(ActionMailer::Base.deliveries, :size).by(1)
+ end
+
+ it "should include correct recipient" do
+ ExportMailer.export_photos_complete_for(alice).deliver_now
+ expect(ActionMailer::Base.deliveries[0].to[0]).to include(alice.email)
+ end
+ end
+
+ describe '#export_photos_failure_for' do
+ it "should deliver successfully" do
+ expect { ExportMailer.export_photos_failure_for(alice).deliver_now }.to_not raise_error
+ end
+
+ it "should be added to the delivery queue" do
+ expect { ExportMailer.export_photos_failure_for(alice).deliver_now }.to change(ActionMailer::Base.deliveries, :size).by(1)
+ end
+
+ it "should include correct recipient" do
+ ExportMailer.export_photos_failure_for(alice).deliver_now
+ expect(ActionMailer::Base.deliveries[0].to[0]).to include(alice.email)
+ end
+ end
+end
diff --git a/spec/mailers/maintenance_spec.rb b/spec/mailers/maintenance_spec.rb
new file mode 100644
index 000000000..a0df04683
--- /dev/null
+++ b/spec/mailers/maintenance_spec.rb
@@ -0,0 +1,41 @@
+# 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 Maintenance, :type => :mailer do
+ describe 'create warning' do
+ before do
+ @removal_timestamp = Time.now + 3.days
+ @user = FactoryGirl.create(:user_with_aspect, :username => "local", :remove_after => @removal_timestamp)
+ end
+
+ it "#should deliver successfully" do
+ expect {
+ Maintenance.account_removal_warning(@user).deliver_now
+ }.to_not raise_error
+ end
+
+ it "#should be added to the delivery queue" do
+ expect {
+ Maintenance.account_removal_warning(@user).deliver_now
+ }.to change(ActionMailer::Base.deliveries, :size).by(1)
+ end
+
+ it "#should include correct recipient" do
+ Maintenance.account_removal_warning(@user).deliver_now
+ expect(ActionMailer::Base.deliveries.last.to[0]).to include(@user.email)
+ end
+
+ it "#should include after inactivity days from settings" do
+ Maintenance.account_removal_warning(@user).deliver_now
+ expect(ActionMailer::Base.deliveries.last.body.parts[0].body.raw_source).to include("for #{AppConfig.settings.maintenance.remove_old_users.after_days} days")
+ end
+
+ it "#should include timestamp for account removal" do
+ Maintenance.account_removal_warning(@user).deliver_now
+ expect(ActionMailer::Base.deliveries.last.body.parts[0].body.raw_source).to include("sign in to your account before #{@removal_timestamp.utc}")
+ end
+ end
+end
diff --git a/spec/mailers/notifier_spec.rb b/spec/mailers/notifier_spec.rb
index 1f59a4bb2..ce99f6a15 100644
--- a/spec/mailers/notifier_spec.rb
+++ b/spec/mailers/notifier_spec.rb
@@ -1,6 +1,6 @@
require 'spec_helper'
-describe Notifier do
+describe Notifier, :type => :mailer do
let(:person) { FactoryGirl.create(:person) }
before do
@@ -10,11 +10,11 @@ describe Notifier do
describe '.administrative' do
it 'mails a user' do
mails = Notifier.admin("Welcome to bureaucracy!", [bob])
- mails.length.should == 1
+ expect(mails.length).to eq(1)
mail = mails.first
- mail.to.should == [bob.email]
- mail.body.encoded.should match /Welcome to bureaucracy!/
- mail.body.encoded.should match /#{bob.username}/
+ expect(mail.to).to eq([bob.email])
+ expect(mail.body.encoded).to match /Welcome to bureaucracy!/
+ expect(mail.body.encoded).to match /#{bob.username}/
end
context 'mails a bunch of users' do
@@ -26,19 +26,19 @@ describe Notifier do
end
it 'has a body' do
mails = Notifier.admin("Welcome to bureaucracy!", @users)
- mails.length.should == 5
+ expect(mails.length).to eq(5)
mails.each{|mail|
this_user = @users.detect{|u| mail.to == [u.email]}
- mail.body.encoded.should match /Welcome to bureaucracy!/
- mail.body.encoded.should match /#{this_user.username}/
+ expect(mail.body.encoded).to match /Welcome to bureaucracy!/
+ expect(mail.body.encoded).to match /#{this_user.username}/
}
end
it "has attachments" do
mails = Notifier.admin("Welcome to bureaucracy!", @users, :attachments => [{:name => "retention stats", :file => "here is some file content"}])
- mails.length.should == 5
+ expect(mails.length).to eq(5)
mails.each{|mail|
- mail.attachments.count.should == 1
+ expect(mail.attachments.count).to eq(1)
}
end
end
@@ -47,19 +47,19 @@ describe Notifier do
describe '.single_admin' do
it 'mails a user' do
mail = Notifier.single_admin("Welcome to bureaucracy!", bob)
- mail.to.should == [bob.email]
- mail.body.encoded.should match /Welcome to bureaucracy!/
- mail.body.encoded.should match /#{bob.username}/
+ expect(mail.to).to eq([bob.email])
+ expect(mail.body.encoded).to match /Welcome to bureaucracy!/
+ expect(mail.body.encoded).to match /#{bob.username}/
end
it 'has the layout' do
mail = Notifier.single_admin("Welcome to bureaucracy!", bob)
- mail.body.encoded.should match /change your notification settings/
+ expect(mail.body.encoded).to match /change your notification settings/
end
it 'has an optional attachment' do
mail = Notifier.single_admin("Welcome to bureaucracy!", bob, :attachments => [{:name => "retention stats", :file => "here is some file content"}])
- mail.attachments.length.should == 1
+ expect(mail.attachments.length).to eq(1)
end
end
@@ -67,11 +67,11 @@ describe Notifier do
let!(:request_mail) { Notifier.started_sharing(bob.id, person.id) }
it 'goes to the right person' do
- request_mail.to.should == [bob.email]
+ expect(request_mail.to).to eq([bob.email])
end
it 'has the name of person sending the request' do
- request_mail.body.encoded.include?(person.name).should be true
+ expect(request_mail.body.encoded.include?(person.name)).to be true
end
it 'has the css' do
@@ -82,50 +82,50 @@ describe Notifier do
describe ".mentioned" do
before do
@user = alice
- @sm = FactoryGirl.create(:status_message)
- @m = Mention.create(:person => @user.person, :post=> @sm)
+ @post = FactoryGirl.create(:status_message, public: true)
+ @mention = Mention.create(:person => @user.person, :post => @post)
- @mail = Notifier.mentioned(@user.id, @sm.author.id, @m.id)
+ @mail = Notifier.mentioned(@user.id, @post.author.id, @mention.id)
end
it 'TO: goes to the right person' do
- @mail.to.should == [@user.email]
+ expect(@mail.to).to eq([@user.email])
end
it 'SUBJECT: has the name of person mentioning in the subject' do
- @mail.subject.should include(@sm.author.name)
+ expect(@mail.subject).to include(@post.author.name)
end
it 'has the post text in the body' do
- @mail.body.encoded.should include(@sm.text)
+ expect(@mail.body.encoded).to include(@post.text)
end
it 'should not include translation fallback' do
- @mail.body.encoded.should_not include(I18n.translate 'notifier.a_post_you_shared')
+ expect(@mail.body.encoded).not_to include(I18n.translate 'notifier.a_post_you_shared')
end
end
describe ".liked" do
before do
- @sm = FactoryGirl.create(:status_message, :author => alice.person)
- @like = @sm.likes.create!(:author => bob.person)
+ @post = FactoryGirl.create(:status_message, :author => alice.person, :public => true)
+ @like = @post.likes.create!(:author => bob.person)
@mail = Notifier.liked(alice.id, @like.author.id, @like.id)
end
it 'TO: goes to the right person' do
- @mail.to.should == [alice.email]
+ expect(@mail.to).to eq([alice.email])
end
- it 'BODY: contains the truncated original post' do
- @mail.body.encoded.should include(@sm.message.plain_text)
+ it 'BODY: contains the original post' do
+ expect(@mail.body.encoded).to include(@post.message.plain_text)
end
it 'BODY: contains the name of person liking' do
- @mail.body.encoded.should include(@like.author.name)
+ expect(@mail.body.encoded).to include(@like.author.name)
end
it 'should not include translation fallback' do
- @mail.body.encoded.should_not include(I18n.translate 'notifier.a_post_you_shared')
+ expect(@mail.body.encoded).not_to include(I18n.translate 'notifier.a_post_you_shared')
end
it 'can handle a reshare' do
@@ -137,25 +137,25 @@ describe Notifier do
describe ".reshared" do
before do
- @sm = FactoryGirl.create(:status_message, :author => alice.person, :public => true)
- @reshare = FactoryGirl.create(:reshare, :root => @sm, :author => bob.person)
+ @post = FactoryGirl.create(:status_message, :author => alice.person, :public => true)
+ @reshare = FactoryGirl.create(:reshare, :root => @post, :author => bob.person)
@mail = Notifier.reshared(alice.id, @reshare.author.id, @reshare.id)
end
it 'TO: goes to the right person' do
- @mail.to.should == [alice.email]
+ expect(@mail.to).to eq([alice.email])
end
it 'BODY: contains the truncated original post' do
- @mail.body.encoded.should include(@sm.message.plain_text)
+ expect(@mail.body.encoded).to include(@post.message.plain_text)
end
it 'BODY: contains the name of person liking' do
- @mail.body.encoded.should include(@reshare.author.name)
+ expect(@mail.body.encoded).to include(@reshare.author.name)
end
it 'should not include translation fallback' do
- @mail.body.encoded.should_not include(I18n.translate 'notifier.a_post_you_shared')
+ expect(@mail.body.encoded).not_to include(I18n.translate 'notifier.a_post_you_shared')
end
end
@@ -178,63 +178,63 @@ describe Notifier do
end
it 'TO: goes to the right person' do
- @mail.to.should == [bob.email]
+ expect(@mail.to).to eq([bob.email])
end
it "FROM: contains the sender's name" do
- @mail["From"].to_s.should == "\"#{@cnv.author.name} (diaspora*)\" <#{AppConfig.mail.sender_address}>"
+ expect(@mail["From"].to_s).to eq("\"#{@cnv.author.name} (diaspora*)\" <#{AppConfig.mail.sender_address}>")
end
it 'SUBJECT: has a snippet of the post contents' do
- @mail.subject.should == @cnv.subject
+ expect(@mail.subject).to eq(@cnv.subject)
end
it 'SUBJECT: has "Re:" if not the first message in a conversation' do
@cnv.messages << Message.new(:text => 'yo', :author => eve.person)
@mail = Notifier.private_message(bob.id, @cnv.author.id, @cnv.messages.last.id)
- @mail.subject.should == "Re: #{@cnv.subject}"
+ expect(@mail.subject).to eq("Re: #{@cnv.subject}")
end
- it 'BODY: contains the message text' do
- @mail.body.encoded.should include(@cnv.messages.first.text)
+ it 'BODY: does not contain the message text' do
+ expect(@mail.body.encoded).not_to include(@cnv.messages.first.text)
end
it 'should not include translation fallback' do
- @mail.body.encoded.should_not include(I18n.translate 'notifier.a_post_you_shared')
+ expect(@mail.body.encoded).not_to include(I18n.translate 'notifier.a_post_you_shared')
end
end
context "comments" do
- let(:commented_post) {bob.post(:status_message, :text => "### Headline \r\n It's **really** sunny outside today, and this is a super long status message! #notreally", :to => :all)}
+ let(:commented_post) {bob.post(:status_message, :text => "### Headline \r\n It's **really** sunny outside today, and this is a super long status message! #notreally", :to => :all, :public => true)}
let(:comment) { eve.comment!(commented_post, "Totally is")}
describe ".comment_on_post" do
- let(:comment_mail) {Notifier.comment_on_post(bob.id, person.id, comment.id).deliver}
+ let(:comment_mail) {Notifier.comment_on_post(bob.id, person.id, comment.id).deliver_now}
it 'TO: goes to the right person' do
- comment_mail.to.should == [bob.email]
+ expect(comment_mail.to).to eq([bob.email])
end
it "FROM: contains the sender's name" do
- comment_mail["From"].to_s.should == "\"#{eve.name} (diaspora*)\" <#{AppConfig.mail.sender_address}>"
+ expect(comment_mail["From"].to_s).to eq("\"#{eve.name} (diaspora*)\" <#{AppConfig.mail.sender_address}>")
end
it 'SUBJECT: has a snippet of the post contents, without markdown and without newlines' do
- comment_mail.subject.should == "Re: Headline"
+ expect(comment_mail.subject).to eq("Re: Headline")
end
context 'BODY' do
it "contains the comment" do
- comment_mail.body.encoded.should include(comment.text)
+ expect(comment_mail.body.encoded).to include(comment.text)
end
it "contains the original post's link" do
- comment_mail.body.encoded.include?("#{comment.post.id.to_s}").should be true
+ expect(comment_mail.body.encoded.include?("#{comment.post.id.to_s}")).to be true
end
it 'should not include translation fallback' do
- comment_mail.body.encoded.should_not include(I18n.translate 'notifier.a_post_you_shared')
+ expect(comment_mail.body.encoded).not_to include(I18n.translate 'notifier.a_post_you_shared')
end
end
@@ -242,9 +242,9 @@ describe Notifier do
context post_type.to_s do
let(:commented_post) { FactoryGirl.create(post_type, :author => bob.person) }
it 'succeeds' do
- proc {
+ expect {
comment_mail
- }.should_not raise_error
+ }.not_to raise_error
end
end
end
@@ -254,37 +254,37 @@ describe Notifier do
let(:comment_mail) { Notifier.also_commented(bob.id, person.id, comment.id) }
it 'TO: goes to the right person' do
- comment_mail.to.should == [bob.email]
+ expect(comment_mail.to).to eq([bob.email])
end
it 'FROM: has the name of person commenting as the sender' do
- comment_mail["From"].to_s.should == "\"#{eve.name} (diaspora*)\" <#{AppConfig.mail.sender_address}>"
+ expect(comment_mail["From"].to_s).to eq("\"#{eve.name} (diaspora*)\" <#{AppConfig.mail.sender_address}>")
end
it 'SUBJECT: has a snippet of the post contents, without markdown and without newlines' do
- comment_mail.subject.should == "Re: Headline"
+ expect(comment_mail.subject).to eq("Re: Headline")
end
context 'BODY' do
it "contains the comment" do
- comment_mail.body.encoded.should include(comment.text)
+ expect(comment_mail.body.encoded).to include(comment.text)
end
it "contains the original post's link" do
- comment_mail.body.encoded.include?("#{comment.post.id.to_s}").should be true
+ expect(comment_mail.body.encoded).to include("#{comment.post.id.to_s}")
end
it 'should not include translation fallback' do
- comment_mail.body.encoded.should_not include(I18n.translate 'notifier.a_post_you_shared')
+ expect(comment_mail.body.encoded).not_to include(I18n.translate 'notifier.a_post_you_shared')
end
end
[:reshare].each do |post_type|
context post_type.to_s do
let(:commented_post) { FactoryGirl.create(post_type, :author => bob.person) }
it 'succeeds' do
- proc {
+ expect {
comment_mail
- }.should_not raise_error
+ }.not_to raise_error
end
end
end
@@ -297,23 +297,23 @@ describe Notifier do
end
it 'goes to the right person' do
- @confirm_email.to.should == [bob.unconfirmed_email]
+ expect(@confirm_email.to).to eq([bob.unconfirmed_email])
end
it 'has the unconfirmed emil in the subject' do
- @confirm_email.subject.should include(bob.unconfirmed_email)
+ expect(@confirm_email.subject).to include(bob.unconfirmed_email)
end
it 'has the unconfirmed emil in the body' do
- @confirm_email.body.encoded.should include(bob.unconfirmed_email)
+ expect(@confirm_email.body.encoded).to include(bob.unconfirmed_email)
end
it 'has the receivers name in the body' do
- @confirm_email.body.encoded.should include(bob.person.profile.first_name)
+ expect(@confirm_email.body.encoded).to include(bob.person.profile.first_name)
end
it 'has the activation link in the body' do
- @confirm_email.body.encoded.should include(confirm_email_url(:token => bob.confirm_email_token))
+ expect(@confirm_email.body.encoded).to include(confirm_email_url(:token => bob.confirm_email_token))
end
end
end
@@ -321,9 +321,19 @@ describe Notifier do
describe 'hashtags' do
it 'escapes hashtags' do
mails = Notifier.admin("#Welcome to bureaucracy!", [bob])
- mails.length.should == 1
+ expect(mails.length).to eq(1)
mail = mails.first
- mail.body.encoded.should match "<p><a href=\"http://localhost:9887/tags/welcome\">#Welcome</a> to bureaucracy!</p>"
+ expect(mail.body.encoded).to match "<p><a href=\"http://localhost:9887/tags/welcome\">#Welcome</a> to bureaucracy!</p>"
+ end
+ end
+
+ describe "base" do
+ it "handles idn addresses" do
+ # user = FactoryGirl.create(:user, email: "ŧoo@ŧexample.com")
+ bob.update_attribute(:email, "ŧoo@ŧexample.com")
+ expect {
+ Notifier.started_sharing(bob.id, person.id)
+ }.to_not raise_error
end
end
end
diff --git a/spec/mailers/report_spec.rb b/spec/mailers/report_spec.rb
index 9b41750a5..b5ec54642 100644
--- a/spec/mailers/report_spec.rb
+++ b/spec/mailers/report_spec.rb
@@ -4,7 +4,7 @@
require 'spec_helper'
-describe Report do
+describe Report, :type => :mailer do
describe '#make_notification' do
before do
@remote = FactoryGirl.create(:person, :diaspora_handle => "remote@remote.net")
@@ -14,18 +14,18 @@ describe Report do
it "should deliver successfully" do
expect {
- ReportMailer.new_report('post', 666)
+ ReportMailer.new_report('post', 666).deliver_now
}.to_not raise_error
end
it "should be added to the delivery queue" do
expect {
- ReportMailer.new_report('post', 666)
+ ReportMailer.new_report('post', 666).deliver_now
}.to change(ActionMailer::Base.deliveries, :size).by(1)
end
it "should include correct recipient" do
- ReportMailer.new_report('post', 666)
+ ReportMailer.new_report('post', 666).deliver_now
expect(ActionMailer::Base.deliveries[0].to[0]).to include(@user.email)
end
end
diff --git a/spec/misc_spec.rb b/spec/misc_spec.rb
index a7a0d6c3b..e714d839d 100644
--- a/spec/misc_spec.rb
+++ b/spec/misc_spec.rb
@@ -8,12 +8,12 @@ describe 'making sure the spec runner works' do
it 'factory creates a user with a person saved' do
user = FactoryGirl.create(:user)
loaded_user = User.find(user.id)
- loaded_user.person.owner_id.should == user.id
+ expect(loaded_user.person.owner_id).to eq(user.id)
end
describe 'fixtures' do
it 'loads fixtures' do
- User.count.should_not == 0
+ expect(User.count).not_to eq(0)
end
end
@@ -30,31 +30,31 @@ describe 'making sure the spec runner works' do
it 'connects the first user to the second' do
contact = @user1.contact_for @user2.person
- contact.should_not be_nil
- @user1.contacts.reload.include?(contact).should be_true
- @aspect1.contacts.include?(contact).should be_true
- contact.aspects.include?(@aspect1).should be_true
+ expect(contact).not_to be_nil
+ expect(@user1.contacts.reload.include?(contact)).to be true
+ expect(@aspect1.contacts.include?(contact)).to be true
+ expect(contact.aspects.include?(@aspect1)).to be true
end
it 'connects the second user to the first' do
contact = @user2.contact_for @user1.person
- contact.should_not be_nil
- @user2.contacts.reload.include?(contact).should be_true
- @aspect2.contacts.include?(contact).should be_true
- contact.aspects.include?(@aspect2).should be_true
+ expect(contact).not_to be_nil
+ expect(@user2.contacts.reload.include?(contact)).to be true
+ expect(@aspect2.contacts.include?(contact)).to be true
+ expect(contact.aspects.include?(@aspect2)).to be true
end
it 'allows posting after running' do
message = @user1.post(:status_message, :text => "Connection!", :to => @aspect1.id)
- @user2.reload.visible_shareables(Post).should include message
+ expect(@user2.reload.visible_shareables(Post)).to include message
end
end
describe '#post' do
it 'creates a notification with a mention' do
- lambda{
+ expect{
alice.post(:status_message, :text => "@{Bob Grimn; #{bob.person.diaspora_handle}} you are silly", :to => alice.aspects.find_by_name('generic'))
- }.should change(Notification, :count).by(1)
+ }.to change(Notification, :count).by(1)
end
end
@@ -62,9 +62,9 @@ describe 'making sure the spec runner works' do
it 'creates a conversation and a message' do
conversation = create_conversation_with_message(alice, bob.person, "Subject", "Hey Bob")
- conversation.participants.should == [alice.person, bob.person]
- conversation.subject.should == "Subject"
- conversation.messages.first.text.should == "Hey Bob"
+ expect(conversation.participants).to eq([alice.person, bob.person])
+ expect(conversation.subject).to eq("Subject")
+ expect(conversation.messages.first.text).to eq("Hey Bob")
end
end
end
diff --git a/spec/models/account_deletion_spec.rb b/spec/models/account_deletion_spec.rb
index 9515e3794..576d58c57 100644
--- a/spec/models/account_deletion_spec.rb
+++ b/spec/models/account_deletion_spec.rb
@@ -4,14 +4,14 @@
require 'spec_helper'
-describe AccountDeletion do
+describe AccountDeletion, :type => :model do
it 'assigns the diaspora_handle from the person object' do
a = AccountDeletion.new(:person => alice.person)
- a.diaspora_handle.should == alice.person.diaspora_handle
+ expect(a.diaspora_handle).to eq(alice.person.diaspora_handle)
end
it 'fires a job after creation'do
- Workers::DeleteAccount.should_receive(:perform_async).with(anything)
+ expect(Workers::DeleteAccount).to receive(:perform_async).with(anything)
AccountDeletion.create(:person => alice.person)
end
@@ -22,20 +22,26 @@ describe AccountDeletion do
end
it 'creates a deleter' do
- AccountDeleter.should_receive(:new).with(alice.person.diaspora_handle).and_return(double(:perform! => true))
+ expect(AccountDeleter).to receive(:new).with(alice.person.diaspora_handle).and_return(double(:perform! => true))
@ad.perform!
end
it 'dispatches the account deletion if the user exists' do
- @ad.should_receive(:dispatch)
+ expect(@ad).to receive(:dispatch)
@ad.perform!
end
it 'does not dispatch an account deletion for non-local people' do
- deletion = AccountDeletion.new(:person => remote_raphael)
- deletion.should_not_receive(:dispatch)
+ deletion = AccountDeletion.new(:person => remote_raphael)
+ expect(deletion).not_to receive(:dispatch)
deletion.perform!
end
+
+ it 'marks an AccountDeletion as completed when successful' do
+ ad = AccountDeletion.create(:person => alice.person)
+ ad.perform!
+ expect(ad.reload.completed_at).not_to be_nil
+ end
end
describe '#dispatch' do
@@ -45,7 +51,7 @@ describe AccountDeletion do
end
it 'creates a public postzord' do
- Postzord::Dispatcher::Public.should_receive(:new).and_return(double.as_null_object)
+ expect(Postzord::Dispatcher::Public).to receive(:new).and_return(double.as_null_object)
@ad = AccountDeletion.new(:person => alice.person)
@ad.send(:dispatch)
end
@@ -56,7 +62,7 @@ describe AccountDeletion do
@ad = AccountDeletion.new(:person => alice.person)
alice.share_with(remote_raphael, alice.aspects.first)
- @ad.subscribers(alice).should == [remote_raphael]
+ expect(@ad.subscribers(alice)).to eq([remote_raphael])
end
it 'includes remote resharers' do
@@ -65,7 +71,7 @@ describe AccountDeletion do
r1 = FactoryGirl.create( :reshare, :author => remote_raphael, :root => sm)
r2 = FactoryGirl.create( :reshare, :author => local_luke.person, :root => sm)
- @ad.subscribers(alice).should == [remote_raphael]
+ expect(@ad.subscribers(alice)).to eq([remote_raphael])
end
end
@@ -76,11 +82,11 @@ describe AccountDeletion do
end
it 'should have a diaspora_handle' do
- @xml.include?(alice.person.diaspora_handle).should == true
+ expect(@xml.include?(alice.person.diaspora_handle)).to eq(true)
end
it 'marshals the xml' do
- AccountDeletion.from_xml(@xml).should be_valid
+ expect(AccountDeletion.from_xml(@xml)).to be_valid
end
end
end
diff --git a/spec/models/acts_as_taggable_on_tag_spec.rb b/spec/models/acts_as_taggable_on_tag_spec.rb
index a54276661..159c7c035 100644
--- a/spec/models/acts_as_taggable_on_tag_spec.rb
+++ b/spec/models/acts_as_taggable_on_tag_spec.rb
@@ -1,23 +1,23 @@
require 'spec_helper'
-describe ActsAsTaggableOn::Tag do
+describe ActsAsTaggableOn::Tag, :type => :model do
describe '.autocomplete' do
before do
@tag = ActsAsTaggableOn::Tag.create(:name => "cats")
end
it 'downcases the tag name' do
- ActsAsTaggableOn::Tag.autocomplete("CATS").should == [@tag]
+ expect(ActsAsTaggableOn::Tag.autocomplete("CATS")).to eq([@tag])
end
it 'does an end where on tags' do
- ActsAsTaggableOn::Tag.autocomplete("CAT").should == [@tag]
+ expect(ActsAsTaggableOn::Tag.autocomplete("CAT")).to eq([@tag])
end
end
describe ".normalize" do
it "removes leading hash symbols" do
- ActsAsTaggableOn::Tag.normalize("#mytag").should == "mytag"
+ expect(ActsAsTaggableOn::Tag.normalize("#mytag")).to eq("mytag")
end
it "removes punctuation and whitespace" do
@@ -33,13 +33,13 @@ describe ActsAsTaggableOn::Tag do
'hash#inside' => 'hashinside',
'f!u@n#k$y%-<c>^h&a*r(a)c{t}e[r]s' => 'funky-characters'
}.each do |invalid, normalized|
- ActsAsTaggableOn::Tag.normalize(invalid).should == normalized
+ expect(ActsAsTaggableOn::Tag.normalize(invalid)).to eq(normalized)
end
end
it 'allows for love' do
- ActsAsTaggableOn::Tag.normalize("<3").should == "<3"
- ActsAsTaggableOn::Tag.normalize("#<3").should == "<3"
+ expect(ActsAsTaggableOn::Tag.normalize("<3")).to eq("<3")
+ expect(ActsAsTaggableOn::Tag.normalize("#<3")).to eq("<3")
end
end
end
diff --git a/spec/models/aspect_membership_spec.rb b/spec/models/aspect_membership_spec.rb
index 7f4bc65f3..12b01fe24 100644
--- a/spec/models/aspect_membership_spec.rb
+++ b/spec/models/aspect_membership_spec.rb
@@ -4,7 +4,7 @@
#
require 'spec_helper'
-describe AspectMembership do
+describe AspectMembership, :type => :model do
describe '#before_destroy' do
before do
@@ -12,17 +12,17 @@ describe AspectMembership do
@contact = alice.contact_for(bob.person)
@am = alice.aspects.where(:name => "generic").first.aspect_memberships.first
- @am.stub(:user).and_return(alice)
+ allow(@am).to receive(:user).and_return(alice)
end
it 'calls disconnect if its the last aspect for the contact' do
- alice.should_receive(:disconnect).with(@contact)
+ expect(alice).to receive(:disconnect).with(@contact)
@am.destroy
end
it 'does not call disconnect if its not the last aspect for the contact' do
- alice.should_not_receive(:disconnect)
+ expect(alice).not_to receive(:disconnect)
alice.add_contact_to_aspect(@contact, @aspect)
@am.destroy
diff --git a/spec/models/aspect_spec.rb b/spec/models/aspect_spec.rb
index 70fe8ef6e..4315345ae 100644
--- a/spec/models/aspect_spec.rb
+++ b/spec/models/aspect_spec.rb
@@ -4,40 +4,40 @@
require 'spec_helper'
-describe Aspect do
+describe Aspect, :type => :model do
describe 'creation' do
before do
@name = alice.aspects.first.name
end
it 'does not allow duplicate names' do
- lambda {
+ expect {
invalid_aspect = alice.aspects.create(:name => @name)
- }.should_not change(Aspect, :count)
+ }.not_to change(Aspect, :count)
end
it 'validates case insensitiveness on names' do
- lambda {
+ expect {
invalid_aspect = alice.aspects.create(:name => @name.titleize)
- }.should_not change(Aspect, :count)
+ }.not_to change(Aspect, :count)
end
it 'has a 20 character limit on names' do
aspect = Aspect.new(:name => "this name is really too too too too too long")
- aspect.valid?.should == false
+ expect(aspect.valid?).to eq(false)
end
it 'is able to have other users as contacts' do
aspect = alice.aspects.create(:name => 'losers')
Contact.create(:user => alice, :person => eve.person, :aspects => [aspect])
- aspect.contacts.where(:person_id => alice.person.id).should be_empty
- aspect.contacts.where(:person_id => eve.person.id).should_not be_empty
- aspect.contacts.size.should == 1
+ expect(aspect.contacts.where(:person_id => alice.person.id)).to be_empty
+ expect(aspect.contacts.where(:person_id => eve.person.id)).not_to be_empty
+ expect(aspect.contacts.size).to eq(1)
end
it 'has a contacts_visible? method' do
- alice.aspects.first.contacts_visible?.should be_true
+ expect(alice.aspects.first.contacts_visible?).to be true
end
end
@@ -45,7 +45,7 @@ describe Aspect do
it 'has no uniqueness of name between users' do
aspect = alice.aspects.create(:name => "New Aspect")
aspect2 = eve.aspects.create(:name => aspect.name)
- aspect2.should be_valid
+ expect(aspect2).to be_valid
end
end
end
diff --git a/spec/models/block_spec.rb b/spec/models/block_spec.rb
index a6b598c06..e8b3683a6 100644
--- a/spec/models/block_spec.rb
+++ b/spec/models/block_spec.rb
@@ -1,11 +1,10 @@
require 'spec_helper'
-describe Block do
+describe Block, :type => :model do
describe 'validations' do
it 'doesnt allow you to block yourself' do
block = alice.blocks.create(:person => alice.person)
-
- block.should have(1).error_on(:person_id)
+ expect(block.errors[:person_id].size).to eq(1)
end
end
end \ No newline at end of file
diff --git a/spec/models/comment_spec.rb b/spec/models/comment_spec.rb
index 3564a9d11..2e2a91205 100644
--- a/spec/models/comment_spec.rb
+++ b/spec/models/comment_spec.rb
@@ -5,21 +5,27 @@
require 'spec_helper'
require Rails.root.join("spec", "shared_behaviors", "relayable")
-describe Comment do
+describe Comment, :type => :model do
before do
@alices_aspect = alice.aspects.first
@status = bob.post(:status_message, :text => "hello", :to => bob.aspects.first.id)
end
describe 'comment#notification_type' do
+ let (:comment) { alice.comment!(@status, "why so formal?") }
+
it "returns 'comment_on_post' if the comment is on a post you own" do
- comment = alice.comment!(@status, "why so formal?")
- comment.notification_type(bob, alice.person).should == Notifications::CommentOnPost
+ expect(comment.notification_type(bob, alice.person)).to eq(Notifications::CommentOnPost)
+ end
+
+ it "returns 'also_commented' if the comment is on a post you participate to" do
+ eve.participate! @status
+ expect(comment.notification_type(eve, alice.person)).to eq(Notifications::AlsoCommented)
end
it 'returns false if the comment is not on a post you own and no one "also_commented"' do
comment = alice.comment!(@status, "I simply felt like issuing a greeting. Do step off.")
- comment.notification_type(eve, alice.person).should be_false
+ expect(comment.notification_type(eve, alice.person)).to be false
end
context "also commented" do
@@ -29,11 +35,11 @@ describe Comment do
end
it 'does not return also commented if the user commented' do
- @comment.notification_type(eve, alice.person).should == false
+ expect(@comment.notification_type(eve, alice.person)).to eq(false)
end
it "returns 'also_commented' if another person commented on a post you commented on" do
- @comment.notification_type(alice, alice.person).should == Notifications::AlsoCommented
+ expect(@comment.notification_type(alice, alice.person)).to eq(Notifications::AlsoCommented)
end
end
end
@@ -41,26 +47,26 @@ describe Comment do
describe 'User#comment' do
it "should be able to comment on one's own status" do
alice.comment!(@status, "Yeah, it was great")
- @status.reload.comments.first.text.should == "Yeah, it was great"
+ expect(@status.reload.comments.first.text).to eq("Yeah, it was great")
end
it "should be able to comment on a contact's status" do
bob.comment!(@status, "sup dog")
- @status.reload.comments.first.text.should == "sup dog"
+ expect(@status.reload.comments.first.text).to eq("sup dog")
end
it 'does not multi-post a comment' do
- lambda {
+ expect {
alice.comment!(@status, 'hello')
- }.should change { Comment.count }.by(1)
+ }.to change { Comment.count }.by(1)
end
end
describe 'counter cache' do
it 'increments the counter cache on its post' do
- lambda {
+ expect {
alice.comment!(@status, "oh yeah")
- }.should change{
+ }.to change{
@status.reload.comments_count
}.by(1)
end
@@ -77,11 +83,11 @@ describe Comment do
end
it 'serializes the sender handle' do
- @xml.include?(@commenter.diaspora_handle).should be_true
+ expect(@xml.include?(@commenter.diaspora_handle)).to be true
end
it 'serializes the post_guid' do
- @xml.should include(@post.guid)
+ expect(@xml).to include(@post.guid)
end
describe 'marshalling' do
@@ -90,11 +96,18 @@ describe Comment do
end
it 'marshals the author' do
- @marshalled_comment.author.should == @commenter.person
+ expect(@marshalled_comment.author).to eq(@commenter.person)
end
it 'marshals the post' do
- @marshalled_comment.post.should == @post
+ expect(@marshalled_comment.post).to eq(@post)
+ end
+
+ it 'tries to fetch a missing parent' do
+ guid = @post.guid
+ @post.destroy
+ expect_any_instance_of(Comment).to receive(:fetch_parent).with(guid).and_return(nil)
+ Comment.from_xml(@xml)
end
end
end
diff --git a/spec/models/contact_spec.rb b/spec/models/contact_spec.rb
index 6facf6492..9f8370952 100644
--- a/spec/models/contact_spec.rb
+++ b/spec/models/contact_spec.rb
@@ -4,12 +4,12 @@
require 'spec_helper'
-describe Contact do
+describe Contact, :type => :model do
describe 'aspect_memberships' do
it 'deletes dependent aspect memberships' do
- lambda{
+ expect{
alice.contact_for(bob.person).destroy
- }.should change(AspectMembership, :count).by(-1)
+ }.to change(AspectMembership, :count).by(-1)
end
end
@@ -18,12 +18,12 @@ describe Contact do
it 'requires a user' do
contact.valid?
- contact.errors.full_messages.should include "User can't be blank"
+ expect(contact.errors.full_messages).to include "User can't be blank"
end
it 'requires a person' do
contact.valid?
- contact.errors.full_messages.should include "Person can't be blank"
+ expect(contact.errors.full_messages).to include "Person can't be blank"
end
it 'ensures user is not making a contact for himself' do
@@ -31,18 +31,18 @@ describe Contact do
contact.user = alice
contact.valid?
- contact.errors.full_messages.should include "Cannot create self-contact"
+ expect(contact.errors.full_messages).to include "Cannot create self-contact"
end
it 'validates uniqueness' do
person = FactoryGirl.create(:person)
contact2 = alice.contacts.create(:person=>person)
- contact2.should be_valid
+ expect(contact2).to be_valid
contact.user = alice
contact.person = person
- contact.should_not be_valid
+ expect(contact).not_to be_valid
end
it "validates that the person's account is not closed" do
@@ -50,18 +50,18 @@ describe Contact do
contact = alice.contacts.new(:person=>person)
- contact.should_not be_valid
- contact.errors.full_messages.should include "Cannot be in contact with a closed account"
+ expect(contact).not_to be_valid
+ expect(contact.errors.full_messages).to include "Cannot be in contact with a closed account"
end
end
context 'scope' do
describe 'sharing' do
it 'returns contacts with sharing true' do
- lambda {
+ expect {
alice.contacts.create!(:sharing => true, :person => FactoryGirl.create(:person))
alice.contacts.create!(:sharing => false, :person => FactoryGirl.create(:person))
- }.should change{
+ }.to change{
Contact.sharing.count
}.by(1)
end
@@ -69,10 +69,10 @@ describe Contact do
describe 'receiving' do
it 'returns contacts with sharing true' do
- lambda {
+ expect {
alice.contacts.create!(:receiving => true, :person => FactoryGirl.build(:person))
alice.contacts.create!(:receiving => false, :person => FactoryGirl.build(:person))
- }.should change{
+ }.to change{
Contact.receiving.count
}.by(1)
end
@@ -80,12 +80,12 @@ describe Contact do
describe 'only_sharing' do
it 'returns contacts with sharing true and receiving false' do
- lambda {
+ expect {
alice.contacts.create!(:receiving => true, :sharing => true, :person => FactoryGirl.build(:person))
alice.contacts.create!(:receiving => false, :sharing => true, :person => FactoryGirl.build(:person))
alice.contacts.create!(:receiving => false, :sharing => true, :person => FactoryGirl.build(:person))
alice.contacts.create!(:receiving => true, :sharing => false, :person => FactoryGirl.build(:person))
- }.should change{
+ }.to change{
Contact.receiving.count
}.by(2)
end
@@ -97,7 +97,7 @@ describe Contact do
contact1 = FactoryGirl.create(:contact, :person => person)
contact2 = FactoryGirl.create(:contact)
contacts = Contact.all_contacts_of_person(person)
- contacts.should == [contact1]
+ expect(contacts).to eq([contact1])
end
end
end
@@ -137,19 +137,19 @@ describe Contact do
end
it "returns the target local user's contacts that are in the same aspect" do
- @contact.contacts.map{|p| p.id}.should =~ [@eve.person].concat(@people1).map{|p| p.id}
+ expect(@contact.contacts.map{|p| p.id}).to match_array([@eve.person].concat(@people1).map{|p| p.id})
end
it 'returns nothing if contacts_visible is false in that aspect' do
@original_aspect.contacts_visible = false
@original_aspect.save
- @contact.contacts.should == []
+ expect(@contact.contacts).to eq([])
end
it 'returns no duplicate contacts' do
[@alice, @eve].each {|c| @bob.add_contact_to_aspect(@bob.contact_for(c.person), @bob.aspects.last)}
contact_ids = @contact.contacts.map{|p| p.id}
- contact_ids.uniq.should == contact_ids
+ expect(contact_ids.uniq).to eq(contact_ids)
end
end
@@ -158,7 +158,7 @@ describe Contact do
@contact = @bob.contact_for @people1.first
end
it 'returns an empty array' do
- @contact.contacts.should == []
+ expect(@contact.contacts).to eq([])
end
end
end
@@ -175,20 +175,20 @@ describe Contact do
describe '#generate_request' do
it 'makes a request' do
- @contact.stub(:user).and_return(@user)
+ allow(@contact).to receive(:user).and_return(@user)
request = @contact.generate_request
- request.sender.should == @user.person
- request.recipient.should == @person
+ expect(request.sender).to eq(@user.person)
+ expect(request.recipient).to eq(@person)
end
end
describe '#dispatch_request' do
it 'pushes to people' do
- @contact.stub(:user).and_return(@user)
+ allow(@contact).to receive(:user).and_return(@user)
m = double()
- m.should_receive(:post)
- Postzord::Dispatcher.should_receive(:build).and_return(m)
+ expect(m).to receive(:post)
+ expect(Postzord::Dispatcher).to receive(:build).and_return(m)
@contact.dispatch_request
end
end
@@ -200,7 +200,7 @@ describe Contact do
end
it "is called on validate" do
- @contact.should_receive(:not_blocked_user)
+ expect(@contact).to receive(:not_blocked_user)
@contact.valid?
end
@@ -209,11 +209,11 @@ describe Contact do
block = alice.blocks.create(:person => person)
bad_contact = alice.contacts.create(:person => person)
- bad_contact.send(:not_blocked_user).should be_false
+ expect(bad_contact.send(:not_blocked_user)).to be false
end
it "does not add to errors" do
- @contact.send(:not_blocked_user).should be_true
+ expect(@contact.send(:not_blocked_user)).to be true
end
end
end
diff --git a/spec/models/conversation_spec.rb b/spec/models/conversation_spec.rb
index 90a852aa0..4e555bf2e 100644
--- a/spec/models/conversation_spec.rb
+++ b/spec/models/conversation_spec.rb
@@ -4,7 +4,7 @@
require 'spec_helper'
-describe Conversation do
+describe Conversation, :type => :model do
before do
@user1 = alice
@user2 = bob
@@ -19,33 +19,49 @@ describe Conversation do
end
it 'creates a message on create' do
- lambda{
+ expect{
Conversation.create(@create_hash)
- }.should change(Message, :count).by(1)
+ }.to change(Message, :count).by(1)
end
describe '#last_author' do
it 'returns the last author to a conversation' do
cnv = Conversation.create(@create_hash)
Message.create(:author => @user2.person, :created_at => Time.now + 100, :text => "last", :conversation_id => cnv.id)
- cnv.reload.last_author.id.should == @user2.person.id
+ expect(cnv.reload.last_author.id).to eq(@user2.person.id)
end
end
- describe '#first_unread_message' do
+ describe '#first_unread_message' do
before do
@cnv = Conversation.create(@create_hash)
@message = Message.create(:author => @user2.person, :created_at => Time.now + 100, :text => "last", :conversation_id => @cnv.id)
- @message.increase_unread(@user1)
+ @message.increase_unread(@user1)
end
-
+
it 'returns the first unread message if there are unread messages in a conversation' do
@cnv.first_unread_message(@user1) == @message
- end
+ end
it 'returns nil if there are no unread messages in a conversation' do
@cnv.conversation_visibilities.where(:person_id => @user1.person.id).first.tap { |cv| cv.unread = 0 }.save
- @cnv.first_unread_message(@user1).should be_nil
+ expect(@cnv.first_unread_message(@user1)).to be_nil
+ end
+ end
+
+ describe '#set_read' do
+ before do
+ @cnv = Conversation.create(@create_hash)
+ Message.create(:author => @user2.person, :created_at => Time.now + 100, :text => "first", :conversation_id => @cnv.id)
+ .increase_unread(@user1)
+ Message.create(:author => @user2.person, :created_at => Time.now + 200, :text => "last", :conversation_id => @cnv.id)
+ .increase_unread(@user1)
+ end
+
+ it 'sets the unread counter to 0' do
+ expect(@cnv.conversation_visibilities.where(:person_id => @user1.person.id).first.unread).to eq(2)
+ @cnv.set_read(@user1)
+ expect(@cnv.conversation_visibilities.where(:person_id => @user1.person.id).first.unread).to eq(0)
end
end
@@ -58,23 +74,23 @@ describe Conversation do
describe 'serialization' do
it 'serializes the message' do
- @xml.gsub(/\s/, '').should include(@message.to_xml.to_s.gsub(/\s/, ''))
+ expect(@xml.gsub(/\s/, '')).to include(@message.to_xml.to_s.gsub(/\s/, ''))
end
it 'serializes the participants' do
@create_hash[:participant_ids].each{|id|
- @xml.should include(Person.find(id).diaspora_handle)
+ expect(@xml).to include(Person.find(id).diaspora_handle)
}
end
it 'serializes the created_at time' do
- @xml.should include(@message.created_at.to_s)
+ expect(@xml).to include(@message.created_at.to_s)
end
end
describe '#subscribers' do
it 'returns the recipients for the post owner' do
- @cnv.subscribers(@user1).should == @user1.contacts.map{|c| c.person}
+ expect(@cnv.subscribers(@user1)).to eq(@user1.contacts.map{|c| c.person})
end
end
@@ -85,27 +101,43 @@ describe Conversation do
end
it 'creates a message' do
- lambda{
+ expect{
Diaspora::Parser.from_xml(@xml).receive(@user1, @user2.person)
- }.should change(Message, :count).by(1)
+ }.to change(Message, :count).by(1)
end
it 'creates a conversation' do
- lambda{
+ expect{
Diaspora::Parser.from_xml(@xml).receive(@user1, @user2.person)
- }.should change(Conversation, :count).by(1)
+ }.to change(Conversation, :count).by(1)
end
it 'creates appropriate visibilities' do
- lambda{
+ expect{
Diaspora::Parser.from_xml(@xml).receive(@user1, @user2.person)
- }.should change(ConversationVisibility, :count).by(@participant_ids.size)
+ }.to change(ConversationVisibility, :count).by(@participant_ids.size)
end
it 'does not save before receive' do
- Diaspora::Parser.from_xml(@xml).persisted?.should be_false
+ expect(Diaspora::Parser.from_xml(@xml).persisted?).to be false
end
it 'notifies for the message' do
- Notification.should_receive(:notify).once
+ expect(Notification).to receive(:notify).once
Diaspora::Parser.from_xml(@xml).receive(@user1, @user2.person)
end
end
end
+
+ describe '#invalid parameters' do
+ before do
+ @invalid_hash = {
+ :author => peter.person,
+ :participant_ids => [peter.person.id, @user1.person.id],
+ :subject => "cool stuff",
+ :messages_attributes => [ {:author => peter.person, :text => 'hey'} ]
+ }
+ end
+
+ it 'with invalid recipient' do
+ conversation = Conversation.create(@invalid_hash)
+ expect(conversation).to be_invalid
+ end
+ end
end
diff --git a/spec/models/conversation_visibilities_spec.rb b/spec/models/conversation_visibilities_spec.rb
new file mode 100644
index 000000000..da15b8743
--- /dev/null
+++ b/spec/models/conversation_visibilities_spec.rb
@@ -0,0 +1,28 @@
+# 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 ConversationVisibility, :type => :model do
+ before do
+ @user1 = alice
+ @participant_ids = [@user1.contacts.first.person.id, @user1.person.id]
+
+ @create_hash = {
+ :author => @user1.person,
+ :participant_ids => @participant_ids,
+ :subject => "cool stuff",
+ :messages_attributes => [ {:author => @user1.person, :text => 'hey'} ]
+ }
+ @conversation = Conversation.create(@create_hash)
+ end
+
+ it 'destroy conversation when no participant' do
+ @conversation.conversation_visibilities.each do |visibility|
+ visibility.destroy
+ end
+
+ expect(Conversation).not_to exist(@conversation.id)
+ end
+end
diff --git a/spec/models/invitation_code_spec.rb b/spec/models/invitation_code_spec.rb
index 9596952dd..61d90583e 100644
--- a/spec/models/invitation_code_spec.rb
+++ b/spec/models/invitation_code_spec.rb
@@ -1,13 +1,13 @@
require 'spec_helper'
-describe InvitationCode do
+describe InvitationCode, :type => :model do
it 'has a valid factory' do
- FactoryGirl.build(:invitation_code).should be_valid
+ expect(FactoryGirl.build(:invitation_code)).to be_valid
end
it 'sets the count to a default value' do
code = FactoryGirl.create(:invitation_code)
- code.count.should > 0
+ expect(code.count).to be > 0
end
describe '#use!' do
@@ -21,22 +21,14 @@ describe InvitationCode do
end
describe '.default_inviter_or' do
- before do
- @old_account = AppConfig.admins.account.get
- AppConfig.admins.account = 'bob'
- end
-
- after do
- AppConfig.admins.account = @old_account
- end
-
it 'grabs the set admin account for the pod...' do
- InvitationCode.default_inviter_or(alice).username.should == 'bob'
+ AppConfig.admins.account = 'bob'
+ expect(InvitationCode.default_inviter_or(alice).username).to eq('bob')
end
it '..or the given user' do
AppConfig.admins.account = ''
- InvitationCode.default_inviter_or(alice).username.should == 'alice'
+ expect(InvitationCode.default_inviter_or(alice).username).to eq('alice')
end
end
end
diff --git a/spec/models/invitation_spec.rb b/spec/models/invitation_spec.rb
index 8e69666aa..539b61582 100644
--- a/spec/models/invitation_spec.rb
+++ b/spec/models/invitation_spec.rb
@@ -4,7 +4,7 @@
require 'spec_helper'
-describe Invitation do
+describe Invitation, :type => :model do
let(:user) { alice }
before do
@@ -17,35 +17,35 @@ describe Invitation do
end
it 'is valid' do
- @invitation.sender.should == user
- @invitation.recipient.should == nil
- @invitation.aspect.should == user.aspects.first
- @invitation.language.should == "de"
- @invitation.should be_valid
+ expect(@invitation.sender).to eq(user)
+ expect(@invitation.recipient).to eq(nil)
+ expect(@invitation.aspect).to eq(user.aspects.first)
+ expect(@invitation.language).to eq("de")
+ expect(@invitation).to be_valid
end
it 'ensures the sender is placing the recipient into one of his aspects' do
@invitation.aspect = FactoryGirl.build(:aspect)
- @invitation.should_not be_valid
+ expect(@invitation).not_to be_valid
end
end
describe '#language' do
it 'returns the correct language if the language is set' do
@invitation = FactoryGirl.build(:invitation, :sender => user, :recipient => eve, :aspect => user.aspects.first, :language => "de")
- @invitation.language.should == "de"
+ expect(@invitation.language).to eq("de")
end
it 'returns en if no language is set' do
@invitation = FactoryGirl.build(:invitation, :sender => user, :recipient => eve, :aspect => user.aspects.first)
- @invitation.language.should == "en"
+ expect(@invitation.language).to eq("en")
end
end
it 'has a message' do
@invitation = FactoryGirl.build(:invitation, :sender => user, :recipient => eve, :aspect => user.aspects.first, :language => user.language)
@invitation.message = "!"
- @invitation.message.should == "!"
+ expect(@invitation.message).to eq("!")
end
@@ -57,8 +57,8 @@ describe Invitation do
it 'returns an array of invites based on the emails passed in' do
invites = Invitation.batch_invite(@emails, @opts)
- invites.count.should be 2
- invites.all?{|x| x.persisted?}.should be_true
+ expect(invites.count).to be 2
+ expect(invites.all?{|x| x.persisted?}).to be true
end
it 'shares with people who are already on the pod' do
@@ -67,7 +67,7 @@ describe Invitation do
expect{
invites = Invitation.batch_invite(@emails, @opts)
}.to change(eve.contacts, :count).by(1)
- invites.count.should be 2
+ expect(invites.count).to be 2
end
end
diff --git a/spec/models/like_spec.rb b/spec/models/like_spec.rb
index 28bfff28a..11532bff6 100644
--- a/spec/models/like_spec.rb
+++ b/spec/models/like_spec.rb
@@ -5,13 +5,13 @@
require 'spec_helper'
require Rails.root.join("spec", "shared_behaviors", "relayable")
-describe Like do
+describe Like, :type => :model do
before do
@status = bob.post(:status_message, :text => "hello", :to => bob.aspects.first.id)
end
it 'has a valid factory' do
- FactoryGirl.build(:like).should be_valid
+ expect(FactoryGirl.build(:like)).to be_valid
end
describe '#notification_type' do
@@ -20,30 +20,30 @@ describe Like do
end
it 'should be notifications liked if you are the post owner' do
- @like.notification_type(bob, alice.person).should be Notifications::Liked
+ expect(@like.notification_type(bob, alice.person)).to be Notifications::Liked
end
it 'should not notify you if you are the like-r' do
- @like.notification_type(alice, alice.person).should be_nil
+ expect(@like.notification_type(alice, alice.person)).to be_nil
end
it 'should not notify you if you did not create the post' do
- @like.notification_type(eve, alice.person).should be_nil
+ expect(@like.notification_type(eve, alice.person)).to be_nil
end
end
describe 'counter cache' do
it 'increments the counter cache on its post' do
- lambda {
+ expect {
alice.like!(@status)
- }.should change{ @status.reload.likes_count }.by(1)
+ }.to change{ @status.reload.likes_count }.by(1)
end
it 'increments the counter cache on its comment' do
comment = FactoryGirl.create(:comment, :post => @status)
- lambda {
+ expect {
alice.like!(comment)
- }.should change{ comment.reload.likes_count }.by(1)
+ }.to change{ comment.reload.likes_count }.by(1)
end
end
@@ -59,20 +59,20 @@ describe Like do
@xml = @like.to_xml.to_s
end
it 'serializes the sender handle' do
- @xml.include?(@liker.diaspora_handle).should be_true
+ expect(@xml.include?(@liker.diaspora_handle)).to be true
end
it' serializes the post_guid' do
- @xml.should include(@post.guid)
+ expect(@xml).to include(@post.guid)
end
describe 'marshalling' do
before do
@marshalled_like = Like.from_xml(@xml)
end
it 'marshals the author' do
- @marshalled_like.author.should == @liker.person
+ expect(@marshalled_like.author).to eq(@liker.person)
end
it 'marshals the post' do
- @marshalled_like.target.should == @post
+ expect(@marshalled_like.target).to eq(@post)
end
end
end
diff --git a/spec/models/location_spec.rb b/spec/models/location_spec.rb
index f3c45d654..94eb12a08 100644
--- a/spec/models/location_spec.rb
+++ b/spec/models/location_spec.rb
@@ -1,15 +1,15 @@
require 'spec_helper'
-describe Location do
+describe Location, :type => :model do
describe 'before validation' do
it 'should create new location when it has coordinates' do
location = Location.new(coordinates:'1,2')
- location.save.should be true
+ expect(location.save).to be true
end
it 'should not create new location when it does not have coordinates' do
location = Location.new()
- location.save.should be false
+ expect(location.save).to be false
end
end
end
diff --git a/spec/models/mention_spec.rb b/spec/models/mention_spec.rb
index bb4b9e507..27444cbc5 100644
--- a/spec/models/mention_spec.rb
+++ b/spec/models/mention_spec.rb
@@ -4,7 +4,7 @@
require 'spec_helper'
-describe Mention do
+describe Mention, :type => :model do
describe "#notify_recipient" do
before do
@user = alice
@@ -14,12 +14,12 @@ describe Mention do
it 'notifies the person being mentioned' do
sm = @user.build_post(:status_message, :text => "hi @{#{bob.name}; #{bob.diaspora_handle}}", :to => @user.aspects.first)
- Notification.should_receive(:notify).with(bob, anything(), sm.author)
+ expect(Notification).to receive(:notify).with(bob, anything(), sm.author)
sm.receive(bob, alice.person)
end
it 'should not notify a user if they do not see the message' do
- Notification.should_not_receive(:notify).with(alice, anything(), bob.person)
+ expect(Notification).not_to receive(:notify).with(alice, anything(), bob.person)
sm2 = bob.build_post(:status_message, :text => "stuff @{#{alice.name}; #{alice.diaspora_handle}}", :to => bob.aspects.first)
sm2.receive(eve, bob.person)
end
@@ -27,7 +27,7 @@ describe Mention do
describe '#notification_type' do
it "returns 'mentioned'" do
- Mention.new.notification_type.should == Notifications::Mentioned
+ expect(Mention.new.notification_type).to eq(Notifications::Mentioned)
end
end
@@ -40,9 +40,9 @@ describe Mention do
@m = Mention.create!(:person => @mentioned_user.person, :post => @sm)
@m.notify_recipient
- lambda{
+ expect{
@m.destroy
- }.should change(Notification, :count).by(-1)
+ }.to change(Notification, :count).by(-1)
end
end
end
diff --git a/spec/models/message_spec.rb b/spec/models/message_spec.rb
index 08b718c69..327348125 100644
--- a/spec/models/message_spec.rb
+++ b/spec/models/message_spec.rb
@@ -5,7 +5,7 @@
require 'spec_helper'
require Rails.root.join("spec", "shared_behaviors", "relayable")
-describe Message do
+describe Message, :type => :model do
before do
@create_hash = {
:author => bob.person,
@@ -21,44 +21,44 @@ describe Message do
it 'validates that the author is a participant in the conversation' do
message = Message.new(:text => 'yo', :author => eve.person, :conversation_id => @conversation.id)
- message.should_not be_valid
+ expect(message).not_to be_valid
end
describe '#notification_type' do
it 'does not return anything for the author' do
- @message.notification_type(bob, bob.person).should be_nil
+ expect(@message.notification_type(bob, bob.person)).to be_nil
end
it 'returns private mesage for an actual receiver' do
- @message.notification_type(alice, bob.person).should == Notifications::PrivateMessage
+ expect(@message.notification_type(alice, bob.person)).to eq(Notifications::PrivateMessage)
end
end
describe '#before_create' do
it 'signs the message' do
- @message.author_signature.should_not be_blank
+ expect(@message.author_signature).not_to be_blank
end
it 'signs the message author if author of conversation' do
- @message.parent_author_signature.should_not be_blank
+ expect(@message.parent_author_signature).not_to be_blank
end
end
describe 'serialization' do
it 'serializes the text' do
- @xml.should include(@message.text)
+ expect(@xml).to include(@message.text)
end
it 'serializes the author_handle' do
- @xml.should include(@message.author.diaspora_handle)
+ expect(@xml).to include(@message.author.diaspora_handle)
end
it 'serializes the created_at time' do
- @xml.should include(@message.created_at.to_s)
+ expect(@xml).to include(@message.created_at.to_s)
end
it 'serializes the conversation_guid time' do
- @xml.should include(@message.conversation.guid)
+ expect(@xml).to include(@message.conversation.guid)
end
end
@@ -98,12 +98,12 @@ describe Message do
describe '#increase_unread' do
it 'increments the conversation visiblity for the conversation' do
- ConversationVisibility.where(:conversation_id => @object_by_recipient.reload.conversation.id,
- :person_id => @local_luke.person.id).first.unread.should == 0
+ expect(ConversationVisibility.where(:conversation_id => @object_by_recipient.reload.conversation.id,
+ :person_id => @local_luke.person.id).first.unread).to eq(0)
@object_by_recipient.increase_unread(@local_luke)
- ConversationVisibility.where(:conversation_id => @object_by_recipient.reload.conversation.id,
- :person_id => @local_luke.person.id).first.unread.should == 1
+ expect(ConversationVisibility.where(:conversation_id => @object_by_recipient.reload.conversation.id,
+ :person_id => @local_luke.person.id).first.unread).to eq(1)
end
end
end
diff --git a/spec/models/notification_spec.rb b/spec/models/notification_spec.rb
index a0ec2c641..e3644db8c 100644
--- a/spec/models/notification_spec.rb
+++ b/spec/models/notification_spec.rb
@@ -4,7 +4,7 @@
require 'spec_helper'
-describe Notification do
+describe Notification, :type => :model do
before do
@sm = FactoryGirl.create(:status_message)
@person = FactoryGirl.create(:person)
@@ -21,7 +21,7 @@ describe Notification do
it 'destoys the associated notification_actor' do
@note.save
- lambda{@note.destroy}.should change(NotificationActor, :count).by(-1)
+ expect{@note.destroy}.to change(NotificationActor, :count).by(-1)
end
describe '.for' do
@@ -34,7 +34,7 @@ describe Notification do
@opts.delete(:recipient_id)
Notification.create(@opts.merge(:recipient_id => user2.id))
- Notification.for(@user).count.should == 4
+ expect(Notification.for(@user).count).to eq(4)
end
end
@@ -42,12 +42,12 @@ describe Notification do
it "should set an unread notification to read" do
@note.unread = true
@note.set_read_state( true )
- @note.unread.should == false
+ expect(@note.unread).to eq(false)
end
it "should set an read notification to unread" do
@note.unread = false
@note.set_read_state( false )
- @note.unread.should == true
+ expect(@note.unread).to eq(true)
end
end
@@ -57,9 +57,9 @@ describe Notification do
it 'creates a new notificiation if the notification does not exist, or if it is unread' do
@note.unread = false
@note.save
- Notification.count.should == 1
+ expect(Notification.count).to eq(1)
Notification.concatenate_or_create(@note.recipient, @note.target, @note.actors.first, Notifications::CommentOnPost)
- Notification.count.should == 2
+ expect(Notification.count).to eq(2)
end
end
describe '.notify' do
@@ -69,7 +69,7 @@ describe Notification do
end
it 'calls Notification.create if the object has a notification_type' do
- Notification.should_receive(:make_notification).once
+ expect(Notification).to receive(:make_notification).once
Notification.notify(@user, @request, @person)
end
@@ -80,9 +80,9 @@ describe Notification do
:recipient_id => @user.id}
n = Notifications::StartedSharing.new(opts)
- n.stub(:recipient).and_return @user
+ allow(n).to receive(:recipient).and_return @user
- @user.should_receive(:mail)
+ expect(@user).to receive(:mail)
n.email_the_user(@request, @person)
end
end
@@ -93,7 +93,7 @@ describe Notification do
person2 = FactoryGirl.build(:person)
notification = Notification.notify(@user, FactoryGirl.build(:like, :author => @person, :target => p), @person)
notification2 = Notification.notify(@user, FactoryGirl.build(:like, :author => person2, :target => p), person2)
- notification.id.should == notification2.id
+ expect(notification.id).to eq(notification2.id)
end
end
@@ -103,7 +103,7 @@ describe Notification do
person2 = FactoryGirl.build(:person)
notification = Notification.notify(@user, FactoryGirl.build(:comment, :author => @person, :post => p), @person)
notification2 = Notification.notify(@user, FactoryGirl.build(:comment, :author => person2, :post => p), person2)
- notification.id.should == notification2.id
+ expect(notification.id).to eq(notification2.id)
end
end
@@ -116,12 +116,12 @@ describe Notification do
end
it "updates the notification with a more people if one already exists" do
- Notification.where(:recipient_id => @user3.id, :target_type => @sm.class.base_class, :target_id => @sm.id).first.actors.count.should == 2
+ expect(Notification.where(:recipient_id => @user3.id, :target_type => @sm.class.base_class, :target_id => @sm.id).first.actors.count).to eq(2)
end
it 'handles double comments from the same person without raising' do
Postzord::Receiver::Private.new(@user3, :person => @user2.person, :object => @user2.comment!(@sm, "hey")).receive_object
- Notification.where(:recipient_id => @user3.id, :target_type => @sm.class.base_class, :target_id => @sm.id).first.actors.count.should == 2
+ expect(Notification.where(:recipient_id => @user3.id, :target_type => @sm.class.base_class, :target_id => @sm.id).first.actors.count).to eq(2)
end
end
end
diff --git a/spec/models/notifications/private_message_spec.rb b/spec/models/notifications/private_message_spec.rb
index f9ccffd14..60c62b8aa 100644
--- a/spec/models/notifications/private_message_spec.rb
+++ b/spec/models/notifications/private_message_spec.rb
@@ -4,7 +4,7 @@
require 'spec_helper'
-describe Notifications::PrivateMessage do
+describe Notifications::PrivateMessage, :type => :model do
before do
@user1 = alice
@user2 = bob
@@ -22,9 +22,9 @@ describe Notifications::PrivateMessage do
describe '#make_notifiaction' do
it 'does not save the notification' do
- lambda{
+ expect{
Notification.notify(@user2, @msg, @user1.person)
- }.should_not change(Notification, :count)
+ }.not_to change(Notification, :count)
end
it 'does email the user' do
@@ -33,11 +33,11 @@ describe Notifications::PrivateMessage do
:recipient_id => @user2.id}
n = Notifications::PrivateMessage.new(opts)
- Notifications::PrivateMessage.stub(:make_notification).and_return(n)
+ allow(Notifications::PrivateMessage).to receive(:make_notification).and_return(n)
Notification.notify(@user2, @msg, @user1.person)
- n.stub(:recipient).and_return @user2
+ allow(n).to receive(:recipient).and_return @user2
- @user2.should_receive(:mail)
+ expect(@user2).to receive(:mail)
n.email_the_user(@msg, @user1.person)
end
@@ -49,8 +49,8 @@ describe Notifications::PrivateMessage do
message.save
n = Notifications::PrivateMessage.make_notification(@user2, message, @user1.person, Notifications::PrivateMessage)
- ConversationVisibility.where(:conversation_id => message.reload.conversation.id,
- :person_id => @user2.person.id).first.unread.should == 1
+ expect(ConversationVisibility.where(:conversation_id => message.reload.conversation.id,
+ :person_id => @user2.person.id).first.unread).to eq(1)
end
it 'increases user unread count - author user 2' do
@@ -61,8 +61,8 @@ describe Notifications::PrivateMessage do
message.save
n = Notifications::PrivateMessage.make_notification(@user1, message, @user2.person, Notifications::PrivateMessage)
- ConversationVisibility.where(:conversation_id => message.reload.conversation.id,
- :person_id => @user1.person.id).first.unread.should == 1
+ expect(ConversationVisibility.where(:conversation_id => message.reload.conversation.id,
+ :person_id => @user1.person.id).first.unread).to eq(1)
end
end
diff --git a/spec/models/notifications/reshared_spec.rb b/spec/models/notifications/reshared_spec.rb
index fdd709f82..58836069c 100644
--- a/spec/models/notifications/reshared_spec.rb
+++ b/spec/models/notifications/reshared_spec.rb
@@ -4,7 +4,7 @@
require 'spec_helper'
-describe Notifications::Reshared do
+describe Notifications::Reshared, :type => :model do
before do
@sm = FactoryGirl.build(:status_message, :author => alice.person, :public => true)
@reshare1 = FactoryGirl.build(:reshare, :root => @sm)
@@ -13,7 +13,7 @@ describe Notifications::Reshared do
describe 'Notification.notify' do
it 'calls concatenate_or_create with root post' do
- Notifications::Reshared.should_receive(:concatenate_or_create).with(alice, @reshare1.root, @reshare1.author, Notifications::Reshared)
+ expect(Notifications::Reshared).to receive(:concatenate_or_create).with(alice, @reshare1.root, @reshare1.author, Notifications::Reshared)
Notification.notify(alice, @reshare1, @reshare1.author)
end
@@ -21,23 +21,23 @@ describe Notifications::Reshared do
describe '#mail_job' do
it "does not raise" do
- lambda{
+ expect{
Notifications::Reshared.new.mail_job
- }.should_not raise_error
+ }.not_to raise_error
end
end
describe '#concatenate_or_create' do
it 'creates a new notification if one does not already exist' do
- Notifications::Reshared.should_receive(:make_notification).with(alice, @reshare1.root, @reshare1.author, Notifications::Reshared)
+ expect(Notifications::Reshared).to receive(:make_notification).with(alice, @reshare1.root, @reshare1.author, Notifications::Reshared)
Notifications::Reshared.concatenate_or_create(alice, @reshare1.root, @reshare1.author, Notifications::Reshared)
end
it "appends the actors to the aldeady existing notification" do
note = Notifications::Reshared.make_notification(alice, @reshare1.root, @reshare1.author, Notifications::Reshared)
- lambda{
+ expect{
Notifications::Reshared.concatenate_or_create(alice, @reshare2.root, @reshare2.author, Notifications::Reshared)
- }.should change(note.actors, :count).by(1)
+ }.to change(note.actors, :count).by(1)
end
end
end
diff --git a/spec/models/participation_spec.rb b/spec/models/participation_spec.rb
index af93bc105..658c0cc8e 100644
--- a/spec/models/participation_spec.rb
+++ b/spec/models/participation_spec.rb
@@ -1,6 +1,6 @@
require "spec_helper"
-describe Participation do
+describe Participation, :type => :model do
describe 'it is relayable' do
before do
@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 8f86b193e..f6bc6f123 100644
--- a/spec/models/person_spec.rb
+++ b/spec/models/person_spec.rb
@@ -4,7 +4,7 @@
require 'spec_helper'
-describe Person do
+describe Person, :type => :model do
before do
@user = bob
@@ -12,20 +12,20 @@ describe Person do
end
it 'always has a profile' do
- Person.new.profile.should_not be_nil
+ expect(Person.new.profile).not_to be_nil
end
it 'does not save automatically' do
- Person.new.persisted?.should be_false
- Person.new.profile.persisted?.should be_false
+ expect(Person.new.persisted?).to be false
+ expect(Person.new.profile.persisted?).to be false
end
context 'scopes' do
describe '.for_json' do
it 'does not select public keys' do
- proc {
+ expect {
Person.for_json.first.serialized_public_key
- }.should raise_error ActiveModel::MissingAttributeError
+ }.to raise_error ActiveModel::MissingAttributeError
end
it 'selects distinct people' do
@@ -35,7 +35,7 @@ describe Person do
where(:contacts => {:user_id => bob.id},
:aspect_memberships => {:aspect_id => bob.aspect_ids}).map{|p| p.id}
- person_ids.uniq.should == person_ids
+ expect(person_ids.uniq).to eq(person_ids)
end
end
@@ -53,11 +53,11 @@ describe Person do
describe '.find_person_from_guid_or_username' do
it 'searchs for a person if id is passed' do
- Person.find_from_guid_or_username(:id => @person.guid).id.should == @person.id
+ expect(Person.find_from_guid_or_username(:id => @person.guid).id).to eq(@person.id)
end
it 'searchs a person from a user if username is passed' do
- Person.find_from_guid_or_username(:username => @user.username).id.should == @user.person.id
+ expect(Person.find_from_guid_or_username(:username => @user.username).id).to eq(@user.person.id)
end
it 'throws active record not found exceptions if no person is found via id' do
@@ -76,17 +76,17 @@ describe Person do
describe '.all_from_aspects' do
it "pulls back the right people given all a user's aspects" do
aspect_ids = bob.aspects.map(&:id)
- Person.all_from_aspects(aspect_ids, bob).map(&:id).should =~ bob.contacts.includes(:person).map{|c| c.person.id}
+ expect(Person.all_from_aspects(aspect_ids, bob).map(&:id)).to match_array(bob.contacts.includes(:person).map{|c| c.person.id})
end
it "pulls back the right people given a subset of aspects" do
aspect_ids = bob.aspects.first.id
- Person.all_from_aspects(aspect_ids, bob).map(&:id).should =~ bob.aspects.first.contacts.includes(:person).map{|c| c.person.id}
+ expect(Person.all_from_aspects(aspect_ids, bob).map(&:id)).to match_array(bob.aspects.first.contacts.includes(:person).map{|c| c.person.id})
end
it "respects aspects given a user" do
aspect_ids = alice.aspects.map(&:id)
- Person.all_from_aspects(aspect_ids, bob).map(&:id).should == []
+ expect(Person.all_from_aspects(aspect_ids, bob).map(&:id)).to eq([])
end
end
@@ -94,33 +94,33 @@ describe Person do
it 'pulls back users who reshared the status message of a user' do
sm = FactoryGirl.create(:status_message, :author => alice.person, :public => true)
reshare = FactoryGirl.create(:reshare, :root => sm)
- Person.who_have_reshared_a_users_posts(alice).should == [reshare.author]
+ expect(Person.who_have_reshared_a_users_posts(alice)).to eq([reshare.author])
end
end
end
describe "delegating" do
it "delegates last_name to the profile" do
- @person.last_name.should == @person.profile.last_name
+ expect(@person.last_name).to eq(@person.profile.last_name)
@person.profile.update_attributes(:last_name => "Heathers")
- @person.reload.last_name.should == "Heathers"
+ expect(@person.reload.last_name).to eq("Heathers")
end
end
describe "valid url" do
it 'should allow for https urls' do
person = FactoryGirl.build(:person, :url => "https://example.com")
- person.should be_valid
+ expect(person).to be_valid
end
it 'should always return the correct receive url' do
person = FactoryGirl.build(:person, :url => "https://example.com/a/bit/messed/up")
- person.receive_url.should == "https://example.com/receive/users/#{person.guid}/"
+ expect(person.receive_url).to eq("https://example.com/receive/users/#{person.guid}/")
end
it 'should allow ports in the url' do
person = FactoryGirl.build(:person, :url => "https://example.com:3000/")
- person.url.should == "https://example.com:3000/"
+ expect(person.url).to eq("https://example.com:3000/")
end
end
@@ -128,31 +128,31 @@ describe Person do
context 'local people' do
it 'uses the pod config url to set the diaspora_handle' do
new_person = User.build(:username => "foo123", :email => "foo123@example.com", :password => "password", :password_confirmation => "password").person
- new_person.diaspora_handle.should == "foo123#{User.diaspora_id_host}"
+ expect(new_person.diaspora_handle).to eq("foo123#{User.diaspora_id_host}")
end
it 'does not include www if it is set in app config' do
- AppConfig.stub(:pod_uri).and_return(Addressable::URI.parse('https://www.foobar.com/'))
+ allow(AppConfig).to receive(:pod_uri).and_return(Addressable::URI.parse('https://www.foobar.com/'))
new_person = User.build(:username => "foo123", :email => "foo123@example.com", :password => "password", :password_confirmation => "password").person
- new_person.diaspora_handle.should == "foo123@foobar.com"
+ expect(new_person.diaspora_handle).to eq("foo123@foobar.com")
end
end
context 'remote people' do
it 'stores the diaspora_handle in the database' do
- @person.diaspora_handle.include?(AppConfig.pod_uri.host).should be false
+ expect(@person.diaspora_handle.include?(AppConfig.pod_uri.host)).to be false
end
end
describe 'validation' do
it 'is unique' do
person_two = FactoryGirl.build(:person, :diaspora_handle => @person.diaspora_handle)
- person_two.should_not be_valid
+ expect(person_two).not_to be_valid
end
it 'is case insensitive' do
person_two = FactoryGirl.build(:person, :diaspora_handle => @person.diaspora_handle.upcase)
- person_two.should_not be_valid
+ expect(person_two).not_to be_valid
end
end
end
@@ -165,25 +165,25 @@ describe Person do
context 'with only first name' do
it 'should return their first name for name' do
- Person.name_from_attrs(@profile.first_name, nil, @profile.diaspora_handle).should == @profile.first_name.strip
+ expect(Person.name_from_attrs(@profile.first_name, nil, @profile.diaspora_handle)).to eq(@profile.first_name.strip)
end
end
context 'with only last name' do
it 'should return their last name for name' do
- Person.name_from_attrs(nil, @profile.last_name, @profile.diaspora_handle).should == @profile.last_name.strip
+ expect(Person.name_from_attrs(nil, @profile.last_name, @profile.diaspora_handle)).to eq(@profile.last_name.strip)
end
end
context 'with both first and last name' do
it 'should return their composed name for name' do
- Person.name_from_attrs(@profile.first_name, @profile.last_name, @profile.diaspora_handle).should == "#{@profile.first_name.strip} #{@profile.last_name.strip}"
+ expect(Person.name_from_attrs(@profile.first_name, @profile.last_name, @profile.diaspora_handle)).to eq("#{@profile.first_name.strip} #{@profile.last_name.strip}")
end
end
context 'without first nor last name' do
it 'should display their diaspora handle' do
- Person.name_from_attrs(nil, nil, @profile.diaspora_handle).should == @profile.diaspora_handle
+ expect(Person.name_from_attrs(nil, nil, @profile.diaspora_handle)).to eq(@profile.diaspora_handle)
end
end
end
@@ -191,7 +191,7 @@ describe Person do
describe '#name' do
it 'calls Person.name_from_attrs' do
profile = alice.person.profile
- Person.should_receive(:name_from_attrs).with(profile.first_name, profile.last_name, profile.person.diaspora_handle)
+ expect(Person).to receive(:name_from_attrs).with(profile.first_name, profile.last_name, profile.person.diaspora_handle)
alice.name
end
@@ -199,7 +199,7 @@ describe Person do
profile = alice.person.profile
profile.first_name = "maxwell "
profile.last_name = "salzberg "
- alice.name.should == "maxwell salzberg"
+ expect(alice.name).to eq("maxwell salzberg")
end
end
@@ -209,11 +209,11 @@ describe Person do
end
it 'should serialize to xml' do
- @xml.include?("person").should == true
+ expect(@xml.include?("person")).to eq(true)
end
it 'should have a profile in its xml' do
- @xml.include?("first_name").should == true
+ expect(@xml.include?("first_name")).to eq(true)
end
end
@@ -222,8 +222,8 @@ describe Person do
person_message = FactoryGirl.create(:status_message, :author => @person)
person_two = FactoryGirl.create(:person)
- @person.owns?(person_message).should be true
- person_two.owns?(person_message).should be false
+ expect(@person.owns?(person_message)).to be true
+ expect(person_two.owns?(person_message)).to be false
end
describe "disconnecting" do
@@ -235,31 +235,31 @@ describe Person do
it 'should not delete an orphaned contact' do
@user.contacts.create(:person => @person, :aspects => [@aspect])
- lambda { @user.disconnect(@user.contact_for(@person)) }.should_not change(Person, :count)
+ expect { @user.disconnect(@user.contact_for(@person)) }.not_to change(Person, :count)
end
it 'should not delete an un-orphaned contact' do
@user.contacts.create(:person => @person, :aspects => [@aspect])
@user2.contacts.create(:person => @person, :aspects => [@aspect2])
- lambda { @user.disconnect(@user.contact_for(@person)) }.should_not change(Person, :count)
+ expect { @user.disconnect(@user.contact_for(@person)) }.not_to change(Person, :count)
end
end
describe "#first_name" do
it 'returns username if first_name is not present in profile' do
alice.person.profile.update_attributes(:first_name => "")
- alice.person.first_name.should == alice.username
+ expect(alice.person.first_name).to eq(alice.username)
end
it 'returns first words in first_name if first_name is present' do
alice.person.profile.update_attributes(:first_name => "First Mid Last")
- alice.person.first_name.should == "First Mid"
+ expect(alice.person.first_name).to eq("First Mid")
end
it 'returns first word in first_name if first_name is present' do
alice.person.profile.update_attributes(:first_name => "Alice")
- alice.person.first_name.should == "Alice"
+ expect(alice.person.first_name).to eq("Alice")
end
end
@@ -311,49 +311,49 @@ describe Person do
@casey_grippi.profile.save!
people = Person.search("AAA", @user)
- people.map { |p| p.name }.should == [@yevgeniy_dodis, @robert_grimm, @casey_grippi, @eugene_weinstein].map { |p| p.name }
+ expect(people.map { |p| p.name }).to eq([@yevgeniy_dodis, @robert_grimm, @casey_grippi, @eugene_weinstein].map { |p| p.name })
end
it 'returns nothing on an empty query' do
people = Person.search("", @user)
- people.should be_empty
+ expect(people).to be_empty
end
it 'returns nothing on a one-character query' do
people = Person.search("i", @user)
- people.should be_empty
+ expect(people).to be_empty
end
it 'returns results for partial names' do
people = Person.search("Eug", @user)
- people.count.should == 1
- people.first.should == @eugene_weinstein
+ expect(people.count).to eq(1)
+ expect(people.first).to eq(@eugene_weinstein)
people = Person.search("wEi", @user)
- people.count.should == 1
- people.first.should == @eugene_weinstein
+ expect(people.count).to eq(1)
+ expect(people.first).to eq(@eugene_weinstein)
people = Person.search("gri", @user)
- people.count.should == 2
- people.first.should == @robert_grimm
- people.second.should == @casey_grippi
+ expect(people.count).to eq(2)
+ expect(people.first).to eq(@robert_grimm)
+ expect(people.second).to eq(@casey_grippi)
end
it 'returns results for full names' do
people = Person.search("Casey Grippi", @user)
- people.count.should == 1
- people.first.should == @casey_grippi
+ expect(people.count).to eq(1)
+ expect(people.first).to eq(@casey_grippi)
end
it 'only displays searchable people' do
invisible_person = FactoryGirl.build(:person, :profile => FactoryGirl.build(:profile, :searchable => false, :first_name => "johnson"))
- Person.search("johnson", @user).should_not include invisible_person
- Person.search("", @user).should_not include invisible_person
+ expect(Person.search("johnson", @user)).not_to include invisible_person
+ expect(Person.search("", @user)).not_to include invisible_person
end
it 'returns results for Diaspora handles' do
people = Person.search(@robert_grimm.diaspora_handle, @user)
- people.should == [@robert_grimm]
+ expect(people).to eq([@robert_grimm])
end
it "puts the searching user's contacts first" do
@@ -372,7 +372,7 @@ describe Person do
@user.contacts.create(:person => @casey_grippi, :aspects => [@user.aspects.first])
people = Person.search("AAA", @user)
- people.map { |p| p.name }.should == [@casey_grippi, @yevgeniy_dodis, @robert_grimm, @eugene_weinstein].map { |p| p.name }
+ expect(people.map { |p| p.name }).to eq([@casey_grippi, @yevgeniy_dodis, @robert_grimm, @eugene_weinstein].map { |p| p.name })
end
end
@@ -383,29 +383,29 @@ describe Person do
describe '.by_account_identifier' do
it 'should find a local users person' do
p = Person.by_account_identifier(user.diaspora_handle)
- p.should == user.person
+ expect(p).to eq(user.person)
end
it 'should find remote users person' do
p = Person.by_account_identifier(person.diaspora_handle)
- p.should == person
+ expect(p).to eq(person)
end
it 'should downcase and strip the diaspora_handle' do
dh_upper = " " + user.diaspora_handle.upcase + " "
- Person.by_account_identifier(dh_upper).should == user.person
+ expect(Person.by_account_identifier(dh_upper)).to eq(user.person)
end
it "finds a local person with a mixed-case username" do
user = FactoryGirl.create(:user, :username => "SaMaNtHa")
person = Person.by_account_identifier(user.person.diaspora_handle)
- person.should == user.person
+ expect(person).to eq(user.person)
end
it "is case insensitive" do
user1 = FactoryGirl.create(:user, :username => "SaMaNtHa")
person = Person.by_account_identifier(user1.person.diaspora_handle.upcase)
- person.should == user1.person
+ expect(person).to eq(user1.person)
end
it 'should only find people who are exact matches (1/2)' do
@@ -413,14 +413,14 @@ describe Person do
person = FactoryGirl.create(:person, :diaspora_handle => "tomtom@tom.joindiaspora.com")
user.person.diaspora_handle = "tom@tom.joindiaspora.com"
user.person.save
- Person.by_account_identifier("tom@tom.joindiaspora.com").diaspora_handle.should == "tom@tom.joindiaspora.com"
+ expect(Person.by_account_identifier("tom@tom.joindiaspora.com").diaspora_handle).to eq("tom@tom.joindiaspora.com")
end
it 'should only find people who are exact matches (2/2)' do
person = FactoryGirl.create(:person, :diaspora_handle => "tomtom@tom.joindiaspora.com")
person1 = FactoryGirl.create(:person, :diaspora_handle => "tom@tom.joindiaspora.comm")
f = Person.by_account_identifier("tom@tom.joindiaspora.com")
- f.should be nil
+ expect(f).to be nil
end
@@ -429,46 +429,46 @@ describe Person do
describe '.local_by_account_identifier' do
it 'should find local users people' do
p = Person.local_by_account_identifier(user.diaspora_handle)
- p.should == user.person
+ expect(p).to eq(user.person)
end
it 'should not find a remote person' do
p = Person.local_by_account_identifier(@person.diaspora_handle)
- p.should be nil
+ expect(p).to be nil
end
it 'should call .by_account_identifier' do
- Person.should_receive(:by_account_identifier)
+ expect(Person).to receive(:by_account_identifier)
Person.local_by_account_identifier(@person.diaspora_handle)
end
end
end
describe '#has_photos?' do
it 'returns false if the user has no photos' do
- alice.person.has_photos?.should be_false
+ expect(alice.person.has_photos?).to be false
end
it 'returns true if the user has photos' do
alice.post(:photo, :user_file => uploaded_photo, :to => alice.aspects.first.id)
- alice.person.has_photos?.should be_true
+ expect(alice.person.has_photos?).to be true
end
end
describe '#as_json' do
it 'returns a hash representation of a person' do
- @person.as_json.should == {
+ expect(@person.as_json).to eq({
:id => @person.id,
:guid => @person.guid,
:name => @person.name,
:avatar => @person.profile.image_url(:thumb_medium),
:handle => @person.diaspora_handle,
:url => Rails.application.routes.url_helpers.person_path(@person),
- }
+ })
end
it 'return tags if asked' do
- @person.as_json(:includes => "tags").
- should == @person.as_json.merge(:tags => @person.profile.tags.map { |t| "##{t.name}" })
+ expect(@person.as_json(:includes => "tags")).
+ to eq(@person.as_json.merge(:tags => @person.profile.tags.map { |t| "##{t.name}" }))
end
end
@@ -476,11 +476,11 @@ describe Person do
describe "when the pod owner hasn't set up any community spotlight members" do
it 'returns people with the community spotlight role' do
Role.add_spotlight(bob.person)
- Person.community_spotlight.should be_present
+ expect(Person.community_spotlight).to be_present
end
it "returns an empty array" do
- Person.community_spotlight.should == []
+ expect(Person.community_spotlight).to eq([])
end
end
end
@@ -494,7 +494,7 @@ describe Person do
it "calls #update_person_url given an array of users and a url" do
people = [double.as_null_object, double.as_null_object, double.as_null_object]
people.each do |person|
- person.should_receive(:update_url).with(@url)
+ expect(person).to receive(:update_url).with(@url)
end
Person.url_batch_update(people, @url)
end
@@ -514,7 +514,7 @@ describe Person do
describe '#lock_access!' do
it 'sets the closed_account flag' do
@person.lock_access!
- @person.reload.closed_account.should be_true
+ expect(@person.reload.closed_account).to be true
end
end
@@ -524,7 +524,7 @@ describe Person do
end
it 'calls Profile#tombstone!' do
- @person.profile.should_receive(:tombstone!)
+ expect(@person.profile).to receive(:tombstone!)
@person.clear_profile!
end
end
diff --git a/spec/models/photo_spec.rb b/spec/models/photo_spec.rb
index aa7cdf192..df2ca276a 100644
--- a/spec/models/photo_spec.rb
+++ b/spec/models/photo_spec.rb
@@ -11,7 +11,7 @@ def with_carrierwave_processing(&block)
val
end
-describe Photo do
+describe Photo, :type => :model do
before do
@user = alice
@aspect = @user.aspects.first
@@ -28,18 +28,18 @@ describe Photo do
describe 'after_create' do
it 'calls #queue_processing_job' do
- @photo.should_receive(:queue_processing_job)
+ expect(@photo).to receive(:queue_processing_job)
@photo.save!
end
end
it 'is mutable' do
- @photo.mutable?.should == true
+ expect(@photo.mutable?).to eq(true)
end
it 'has a random string key' do
- @photo2.random_string.should_not be nil
+ expect(@photo2.random_string).not_to be nil
end
describe '#diaspora_initialize' do
@@ -50,13 +50,13 @@ describe Photo do
end
it 'sets the persons diaspora handle' do
- @photo.diaspora_handle.should == @user.person.diaspora_handle
+ expect(@photo.diaspora_handle).to eq(@user.person.diaspora_handle)
end
it 'sets the random prefix' do
photo_double = double.as_null_object
- photo_double.should_receive(:random_string=)
- Photo.stub(:new).and_return(photo_double)
+ expect(photo_double).to receive(:random_string=)
+ allow(Photo).to receive(:new).and_return(photo_double)
Photo.diaspora_initialize(
:author => @user.person, :user_file => @image)
@@ -64,8 +64,8 @@ describe Photo do
context "with user file" do
it 'builds the photo without saving' do
- @photo.created_at.nil?.should be_true
- @photo.unprocessed_image.read.nil?.should be_false
+ expect(@photo.created_at.nil?).to be true
+ expect(@photo.unprocessed_image.read.nil?).to be false
end
end
@@ -74,8 +74,8 @@ describe Photo do
url = "https://service.com/user/profile_image"
photo_double = double.as_null_object
- photo_double.should_receive(:remote_unprocessed_image_url=).with(url)
- Photo.stub(:new).and_return(photo_double)
+ expect(photo_double).to receive(:remote_unprocessed_image_url=).with(url)
+ allow(Photo).to receive(:new).and_return(photo_double)
Photo.diaspora_initialize(
:author => @user.person, :image_url => url)
@@ -94,19 +94,19 @@ describe Photo do
it 'sets a remote url' do
@photo.update_remote_path
- @photo.remote_photo_path.should include("http")
- @photo.remote_photo_name.should include(".png")
+ expect(@photo.remote_photo_path).to include("http")
+ expect(@photo.remote_photo_name).to include(".png")
end
end
it 'should save a photo' do
@photo.unprocessed_image.store! File.open(@fixture_name)
- @photo.save.should == true
+ expect(@photo.save).to eq(true)
binary = @photo.unprocessed_image.read.force_encoding('BINARY')
fixture_binary = File.read(@fixture_name).force_encoding('BINARY')
- binary.should == fixture_binary
+ expect(binary).to eq(fixture_binary)
end
context 'with a saved photo' do
@@ -117,7 +117,7 @@ describe Photo do
end
it 'should have text' do
@photo.text= "cool story, bro"
- @photo.save.should be_true
+ expect(@photo.save).to be true
end
it 'should remove its reference in user profile if it is referred' do
@@ -126,26 +126,59 @@ describe Photo do
@user.profile.image_url = @photo.url(:thumb_large)
@user.person.save
@photo.destroy
- Person.find(@user.person.id).profile[:image_url].should be_nil
+ expect(Person.find(@user.person.id).profile[:image_url]).to be_nil
end
it 'should not use the imported filename as the url' do
- @photo.url.should_not include @fixture_filename
- @photo.url(:thumb_medium).should_not include ("/" + @fixture_filename)
+ expect(@photo.url).not_to include @fixture_filename
+ expect(@photo.url(:thumb_medium)).not_to include ("/" + @fixture_filename)
end
it 'should save the image dimensions' do
- @photo.width.should == 40
- @photo.height.should == 40
+ expect(@photo.width).to eq(40)
+ expect(@photo.height).to eq(40)
end
end
+ context 'with a saved photo containing EXIF data' do
+ before do
+ @exif_filename = 'exif.jpg'
+ @exif_name = File.join(File.dirname(__FILE__), '..', 'fixtures', @exif_filename)
+ end
+
+ it 'should contain EXIF data if user prefer' do
+ @alice_photo = alice.build_post(:photo, :user_file => File.open(@exif_name), :to => alice.aspects.first.id)
+
+ with_carrierwave_processing do
+ @alice_photo.unprocessed_image.store! File.open(@exif_name)
+ @alice_photo.save
+ end
+
+ new_filename = File.join(File.dirname(__FILE__), '../../public/', @alice_photo.unprocessed_image.store_dir, @alice_photo.unprocessed_image.filename)
+ image = MiniMagick::Image.new(new_filename)
+ expect(image.exif.length).not_to eq(0)
+ end
+
+ it 'should not contain EXIF data if user prefer' do
+ @bob_photo = bob.build_post(:photo, :user_file => File.open(@exif_name), :to => @aspect.id)
+
+ with_carrierwave_processing do
+ @bob_photo.unprocessed_image.store! File.open(@exif_name)
+ @bob_photo.save
+ end
+
+ new_filename = File.join(File.dirname(__FILE__), '../../public/', @bob_photo.unprocessed_image.store_dir, @bob_photo.unprocessed_image.filename)
+ image = MiniMagick::Image.new(new_filename)
+ expect(image.exif.length).to eq(0)
+ end
+ end
+
describe 'non-image files' do
it 'should not store' do
file = File.open(@fail_fixture_name)
- lambda {
+ expect {
@photo.unprocessed_image.store! file
- }.should raise_error CarrierWave::IntegrityError, 'You are not allowed to upload "xml" files, allowed types: jpg, jpeg, png, gif'
+ }.to raise_error CarrierWave::IntegrityError, 'You are not allowed to upload "xml" files, allowed types: jpg, jpeg, png, gif'
end
end
@@ -159,18 +192,18 @@ describe Photo do
end
it 'serializes the url' do
- @xml.include?(@saved_photo.remote_photo_path).should be true
- @xml.include?(@saved_photo.remote_photo_name).should be true
+ expect(@xml.include?(@saved_photo.remote_photo_path)).to be true
+ expect(@xml.include?(@saved_photo.remote_photo_name)).to be true
end
it 'serializes the diaspora_handle' do
- @xml.include?(@user.diaspora_handle).should be true
+ expect(@xml.include?(@user.diaspora_handle)).to be true
end
it 'serializes the height and width' do
- @xml.should include 'height'
- @xml.include?('width').should be true
- @xml.include?('40').should be true
+ expect(@xml).to include 'height'
+ expect(@xml.include?('width')).to be true
+ expect(@xml.include?('40')).to be true
end
end
@@ -195,21 +228,21 @@ describe Photo do
zord.parse_and_receive(xml)
new_photo = Photo.where(:guid => @saved_photo.guid).first
- new_photo.url.nil?.should be false
- new_photo.url.include?(url).should be true
- new_photo.url(:thumb_medium).include?(thumb_url).should be true
+ expect(new_photo.url.nil?).to be false
+ expect(new_photo.url.include?(url)).to be true
+ expect(new_photo.url(:thumb_medium).include?(thumb_url)).to be true
end
end
context "commenting" do
it "accepts comments if there is no parent status message" do
- proc{ @user.comment!(@photo, "big willy style") }.should change(@photo.comments, :count).by(1)
+ expect{ @user.comment!(@photo, "big willy style") }.to change(@photo.comments, :count).by(1)
end
end
describe '#queue_processing_job' do
it 'should queue a job to process the images' do
- Workers::ProcessPhoto.should_receive(:perform_async).with(@photo.id)
+ expect(Workers::ProcessPhoto).to receive(:perform_async).with(@photo.id)
@photo.queue_processing_job
end
end
diff --git a/spec/models/pod_spec.rb b/spec/models/pod_spec.rb
index 5cee347e9..7aee2dfa2 100644
--- a/spec/models/pod_spec.rb
+++ b/spec/models/pod_spec.rb
@@ -1,15 +1,15 @@
require 'spec_helper'
-describe Pod do
- describe '.find_or_create_by_url' do
+describe Pod, :type => :model do
+ describe '.find_or_create_by' do
it 'takes a url, and makes one by host' do
- pod = Pod.find_or_create_by_url('https://joindiaspora.com/maxwell')
- pod.host.should == 'joindiaspora.com'
+ pod = Pod.find_or_create_by(url: 'https://joindiaspora.com/maxwell')
+ expect(pod.host).to eq('joindiaspora.com')
end
it 'sets ssl boolean(side-effect)' do
- pod = Pod.find_or_create_by_url('https://joindiaspora.com/maxwell')
- pod.ssl.should be_true
+ pod = Pod.find_or_create_by(url: 'https://joindiaspora.com/maxwell')
+ expect(pod.ssl).to be true
end
end
end
diff --git a/spec/models/poll_answer_spec.rb b/spec/models/poll_answer_spec.rb
index 2f592fc05..4249a6af9 100644
--- a/spec/models/poll_answer_spec.rb
+++ b/spec/models/poll_answer_spec.rb
@@ -1,6 +1,6 @@
require 'spec_helper'
-describe PollAnswer do
+describe PollAnswer, :type => :model do
before do
@status = FactoryGirl.create(:status_message_with_poll)
@user = alice
@@ -9,9 +9,9 @@ describe PollAnswer do
describe 'counter cache' do
it 'increments the counter cache on the answer' do
- lambda {
+ expect {
alice.participate_in_poll!(@status, @answer)
- }.should change{
+ }.to change{
@answer.reload.vote_count
}.by(1)
end
@@ -22,12 +22,12 @@ describe PollAnswer do
it 'should validate pressence of answer' do
answer = PollAnswer.new
answer.valid?
- answer.errors.should have_key(:answer)
+ expect(answer.errors).to have_key(:answer)
end
it 'answer should not empty' do
answer = PollAnswer.new answer: ' '
answer.valid?
- answer.errors.should have_key(:answer)
+ expect(answer.errors).to have_key(:answer)
end
end
diff --git a/spec/models/poll_participation_spec.rb b/spec/models/poll_participation_spec.rb
index fc4713cb8..3caa16e25 100644
--- a/spec/models/poll_participation_spec.rb
+++ b/spec/models/poll_participation_spec.rb
@@ -1,7 +1,7 @@
require 'spec_helper'
require Rails.root.join("spec", "shared_behaviors", "relayable")
-describe PollParticipation do
+describe PollParticipation, :type => :model do
before do
@alices_aspect = alice.aspects.first
@@ -44,19 +44,19 @@ describe PollParticipation do
end
it 'serializes the class name' do
- @xml.include?(PollParticipation.name.underscore.to_s).should be_true
+ expect(@xml.include?(PollParticipation.name.underscore.to_s)).to be true
end
it 'serializes the sender handle' do
- @xml.include?(@poll_participation.diaspora_handle).should be_true
+ expect(@xml.include?(@poll_participation.diaspora_handle)).to be true
end
it 'serializes the poll_guid' do
- @xml.should include(@poll.guid)
+ expect(@xml).to include(@poll.guid)
end
it 'serializes the poll_answer_guid' do
- @xml.should include(@poll_participation.poll_answer.guid)
+ expect(@xml).to include(@poll_participation.poll_answer.guid)
end
describe 'marshalling' do
@@ -65,15 +65,15 @@ describe PollParticipation do
end
it 'marshals the author' do
- @marshalled_poll_participation.author.should == @poll_participant.person
+ expect(@marshalled_poll_participation.author).to eq(@poll_participant.person)
end
it 'marshals the answer' do
- @marshalled_poll_participation.poll_answer.should == @poll_participation.poll_answer
+ expect(@marshalled_poll_participation.poll_answer).to eq(@poll_participation.poll_answer)
end
it 'marshals the poll' do
- @marshalled_poll_participation.poll.should == @poll
+ expect(@marshalled_poll_participation.poll).to eq(@poll)
end
end
end
@@ -94,8 +94,8 @@ describe PollParticipation do
it 'is saved without errors in a simulated A-B node environment' do
#stubs needed because the poll participation is already saved in the test db. This is just a simulated federation!
- PollParticipation.any_instance.stub(:save!).and_return(true)
- Person.any_instance.stub(:local?).and_return(false)
+ allow_any_instance_of(PollParticipation).to receive(:save!).and_return(true)
+ allow_any_instance_of(Person).to receive(:local?).and_return(false)
expect{
salmon = Salmon::Slap.create_by_user_and_activity(alice, @poll_participation_alice.to_diaspora_xml).xml_for(@poll_participant)
Postzord::Receiver::Public.new(salmon).save_object
diff --git a/spec/models/poll_spec.rb b/spec/models/poll_spec.rb
index 8970fe0ff..14e7af31a 100644
--- a/spec/models/poll_spec.rb
+++ b/spec/models/poll_spec.rb
@@ -1,6 +1,6 @@
require 'spec_helper'
-describe Poll do
+describe Poll, :type => :model do
before do
@poll = Poll.new(:question => "What do you think about apples?")
end
@@ -8,19 +8,19 @@ describe Poll do
describe 'validation' do
it 'should not create a poll when it has less than two answers' do
@poll.poll_answers.build(:answer => '1')
- @poll.should_not be_valid
+ expect(@poll).not_to be_valid
end
it 'should create a poll when it has more than two answers' do
@poll.poll_answers.build(:answer => '1')
@poll.poll_answers.build(:answer => '2')
- @poll.should be_valid
+ expect(@poll).to be_valid
end
it 'should not create a poll when question in blank' do
@poll.question = ' '
@poll.valid?
- @poll.errors.should have_key(:question)
+ expect(@poll.errors).to have_key(:question)
end
end
end
diff --git a/spec/models/post_spec.rb b/spec/models/post_spec.rb
index 9d9f5f7b7..da641ff26 100644
--- a/spec/models/post_spec.rb
+++ b/spec/models/post_spec.rb
@@ -4,7 +4,7 @@
require 'spec_helper'
-describe Post do
+describe Post, :type => :model do
before do
@user = alice
@aspect = @user.aspects.create(:name => "winners")
@@ -21,29 +21,29 @@ describe Post do
end
it 'returns post from your contacts' do
- StatusMessage.owned_or_visible_by_user(@you).should include(@post_from_contact)
+ expect(StatusMessage.owned_or_visible_by_user(@you)).to include(@post_from_contact)
end
it 'returns your posts' do
- StatusMessage.owned_or_visible_by_user(@you).should include(@your_post)
+ expect(StatusMessage.owned_or_visible_by_user(@you)).to include(@your_post)
end
it 'returns public posts' do
- StatusMessage.owned_or_visible_by_user(@you).should include(@public_post)
+ expect(StatusMessage.owned_or_visible_by_user(@you)).to include(@public_post)
end
it 'returns public post from your contact' do
sm = FactoryGirl.create(:status_message, :author => eve.person, :public => true)
- StatusMessage.owned_or_visible_by_user(@you).should include(sm)
+ expect(StatusMessage.owned_or_visible_by_user(@you)).to include(sm)
end
it 'does not return non contacts, non-public post' do
- StatusMessage.owned_or_visible_by_user(@you).should_not include(@post_from_stranger)
+ expect(StatusMessage.owned_or_visible_by_user(@you)).not_to include(@post_from_stranger)
end
it 'should return the three visible posts' do
- StatusMessage.owned_or_visible_by_user(@you).count.should == 3
+ expect(StatusMessage.owned_or_visible_by_user(@you).count(:all)).to eq(3)
end
end
@@ -51,17 +51,17 @@ describe Post do
describe '.for_a_stream' do
it 'calls #for_visible_shareable_sql' do
time, order = double, double
- Post.should_receive(:for_visible_shareable_sql).with(time, order).and_return(Post)
+ expect(Post).to receive(:for_visible_shareable_sql).with(time, order).and_return(Post)
Post.for_a_stream(time, order)
end
it 'calls includes_for_a_stream' do
- Post.should_receive(:includes_for_a_stream)
+ expect(Post).to receive(:includes_for_a_stream)
Post.for_a_stream(double, double)
end
it 'calls excluding_blocks if a user is present' do
- Post.should_receive(:excluding_blocks).with(alice).and_return(Post)
+ expect(Post).to receive(:excluding_blocks).with(alice).and_return(Post)
Post.for_a_stream(double, double, alice)
end
end
@@ -75,15 +75,15 @@ describe Post do
end
it 'does not included blocked users posts' do
- Post.excluding_blocks(bob).should_not include(@post)
+ expect(Post.excluding_blocks(bob)).not_to include(@post)
end
it 'includes not blocked users posts' do
- Post.excluding_blocks(bob).should include(@other_post)
+ expect(Post.excluding_blocks(bob)).to include(@other_post)
end
it 'returns posts if you dont have any blocks' do
- Post.excluding_blocks(alice).count.should == 2
+ expect(Post.excluding_blocks(alice).count).to eq(2)
end
end
@@ -94,17 +94,17 @@ describe Post do
bob.toggle_hidden_shareable(@post)
end
it 'excludes posts the user has hidden' do
- Post.excluding_hidden_shareables(bob).should_not include(@post)
+ expect(Post.excluding_hidden_shareables(bob)).not_to include(@post)
end
it 'includes posts the user has not hidden' do
- Post.excluding_hidden_shareables(bob).should include(@other_post)
+ expect(Post.excluding_hidden_shareables(bob)).to include(@other_post)
end
end
describe '.excluding_hidden_content' do
it 'calls excluding_blocks and excluding_hidden_shareables' do
- Post.should_receive(:excluding_blocks).and_return(Post)
- Post.should_receive(:excluding_hidden_shareables)
+ expect(Post).to receive(:excluding_blocks).and_return(Post)
+ expect(Post).to receive(:excluding_hidden_shareables)
Post.excluding_hidden_content(bob)
end
end
@@ -127,8 +127,8 @@ describe Post do
describe '.by_max_time' do
it 'returns the posts ordered and limited by unix time' do
- Post.for_a_stream(Time.now + 1, "created_at").should == @posts
- Post.for_a_stream(Time.now + 1, "updated_at").should == @posts.reverse
+ expect(Post.for_a_stream(Time.now + 1, "created_at")).to eq(@posts)
+ expect(Post.for_a_stream(Time.now + 1, "updated_at")).to eq(@posts.reverse)
end
end
@@ -136,15 +136,15 @@ describe Post do
describe '.for_visible_shareable_sql' do
it 'calls max_time' do
time = Time.now + 1
- Post.should_receive(:by_max_time).with(time, 'created_at').and_return(Post)
+ expect(Post).to receive(:by_max_time).with(time, 'created_at').and_return(Post)
Post.for_visible_shareable_sql(time, 'created_at')
end
it 'defaults to 15 posts' do
chain = double.as_null_object
- Post.stub(:by_max_time).and_return(chain)
- chain.should_receive(:limit).with(15).and_return(Post)
+ allow(Post).to receive(:by_max_time).and_return(chain)
+ expect(chain).to receive(:limit).with(15).and_return(Post)
Post.for_visible_shareable_sql(Time.now + 1, "created_at")
end
@@ -153,15 +153,15 @@ describe Post do
# @posts[0] is the newest, @posts[5] is the oldest
describe ".newer" do
it 'returns the next post in the array' do
- @posts[3].created_at.should < @posts[2].created_at #post 2 is newer
- Post.newer(@posts[3]).created_at.to_s.should == @posts[2].created_at.to_s #its the newer post, not the newest
+ expect(@posts[3].created_at).to be < @posts[2].created_at #post 2 is newer
+ expect(Post.newer(@posts[3]).created_at.to_s).to eq(@posts[2].created_at.to_s) #its the newer post, not the newest
end
end
describe ".older" do
it 'returns the previous post in the array' do
- Post.older(@posts[3]).created_at.to_s.should == @posts[4].created_at.to_s #its the older post, not the oldest
- @posts[3].created_at.should > @posts[4].created_at #post 4 is older
+ expect(Post.older(@posts[3]).created_at.to_s).to eq(@posts[4].created_at.to_s) #its the older post, not the oldest
+ expect(@posts[3].created_at).to be > @posts[4].created_at #post 4 is older
end
end
end
@@ -170,14 +170,14 @@ describe Post do
describe 'validations' do
it 'validates uniqueness of guid and does not throw a db error' do
message = FactoryGirl.create(:status_message)
- FactoryGirl.build(:status_message, :guid => message.guid).should_not be_valid
+ expect(FactoryGirl.build(:status_message, :guid => message.guid)).not_to be_valid
end
end
describe 'post_type' do
it 'returns the class constant' do
status_message = FactoryGirl.create(:status_message)
- status_message.post_type.should == "StatusMessage"
+ expect(status_message.post_type).to eq("StatusMessage")
end
end
@@ -186,8 +186,8 @@ describe Post do
post = FactoryGirl.create(:status_message, :author => @user.person)
@user.comment!(post, "hey")
post.destroy
- Post.where(:id => post.id).empty?.should == true
- Comment.where(:text => "hey").empty?.should == true
+ expect(Post.where(:id => post.id).empty?).to eq(true)
+ expect(Comment.where(:text => "hey").empty?).to eq(true)
end
end
@@ -196,22 +196,22 @@ describe Post do
post = @user.post :status_message, :text => "hello", :to => @aspect.id
xml = post.to_diaspora_xml
- xml.include?("person_id").should be false
- xml.include?(@user.person.diaspora_handle).should be true
+ expect(xml.include?("person_id")).to be false
+ expect(xml.include?(@user.person.diaspora_handle)).to be true
end
end
describe '.diaspora_initialize' do
it 'takes provider_display_name' do
sm = FactoryGirl.create(:status_message, :provider_display_name => 'mobile')
- StatusMessage.diaspora_initialize(sm.attributes.merge(:author => bob.person)).provider_display_name.should == 'mobile'
+ expect(StatusMessage.diaspora_initialize(sm.attributes.merge(:author => bob.person)).provider_display_name).to eq('mobile')
end
end
describe '#mutable?' do
it 'should be false by default' do
post = @user.post :status_message, :text => "hello", :to => @aspect.id
- post.mutable?.should == false
+ expect(post.mutable?).to eq(false)
end
end
@@ -219,13 +219,13 @@ describe Post do
it 'returns the people contained in the aspects the post appears in' do
post = @user.post :status_message, :text => "hello", :to => @aspect.id
- post.subscribers(@user).should == []
+ expect(post.subscribers(@user)).to eq([])
end
it 'returns all a users contacts if the post is public' do
post = @user.post :status_message, :text => "hello", :to => @aspect.id, :public => true
- post.subscribers(@user).to_set.should == @user.contact_people.to_set
+ expect(post.subscribers(@user).to_set).to eq(@user.contact_people.to_set)
end
end
@@ -237,17 +237,17 @@ describe Post do
it 'does not update updated_at' do
old_time = Time.zone.now - 10000
Post.where(:id => @post.id).update_all(:updated_at => old_time)
- @post.reload.updated_at.to_i.should == old_time.to_i
+ expect(@post.reload.updated_at.to_i).to eq(old_time.to_i)
@post.update_likes_counter
- @post.reload.updated_at.to_i.should == old_time.to_i
+ expect(@post.reload.updated_at.to_i).to eq(old_time.to_i)
end
end
describe "#receive" do
it 'returns false if the post does not verify' do
@post = FactoryGirl.create(:status_message, :author => bob.person)
- @post.should_receive(:verify_persisted_shareable).and_return(false)
- @post.receive(bob, eve.person).should == false
+ expect(@post).to receive(:verify_persisted_shareable).and_return(false)
+ expect(@post.receive(bob, eve.person)).to eq(false)
end
end
@@ -255,42 +255,42 @@ describe Post do
before do
@post = FactoryGirl.create(:status_message, :author => bob.person)
@known_post = Post.new
- bob.stub(:contact_for).with(eve.person).and_return(double(:receive_shareable => true))
+ allow(bob).to receive(:contact_for).with(eve.person).and_return(double(:receive_shareable => true))
end
context "user knows about the post" do
before do
- bob.stub(:find_visible_shareable_by_id).and_return(@known_post)
+ allow(bob).to receive(:find_visible_shareable_by_id).and_return(@known_post)
end
it 'updates attributes only if mutable' do
- @known_post.stub(:mutable?).and_return(true)
- @known_post.should_receive(:update_attributes)
- @post.send(:receive_persisted, bob, eve.person, @known_post).should == true
+ allow(@known_post).to receive(:mutable?).and_return(true)
+ expect(@known_post).to receive(:update_attributes)
+ expect(@post.send(:receive_persisted, bob, eve.person, @known_post)).to eq(true)
end
it 'returns false if trying to update a non-mutable object' do
- @known_post.stub(:mutable?).and_return(false)
- @known_post.should_not_receive(:update_attributes)
- @post.send(:receive_persisted, bob, eve.person, @known_post).should == false
+ allow(@known_post).to receive(:mutable?).and_return(false)
+ expect(@known_post).not_to receive(:update_attributes)
+ expect(@post.send(:receive_persisted, bob, eve.person, @known_post)).to eq(false)
end
end
context "the user does not know about the post" do
before do
- bob.stub(:find_visible_shareable_by_id).and_return(nil)
- bob.stub(:notify_if_mentioned).and_return(true)
+ allow(bob).to receive(:find_visible_shareable_by_id).and_return(nil)
+ allow(bob).to receive(:notify_if_mentioned).and_return(true)
end
it "receives the post from the contact of the author" do
- @post.send(:receive_persisted, bob, eve.person, @known_post).should == true
+ expect(@post.send(:receive_persisted, bob, eve.person, @known_post)).to eq(true)
end
it 'notifies the user if they are mentioned' do
- bob.stub(:contact_for).with(eve.person).and_return(double(:receive_shareable => true))
- bob.should_receive(:notify_if_mentioned).and_return(true)
+ allow(bob).to receive(:contact_for).with(eve.person).and_return(double(:receive_shareable => true))
+ expect(bob).to receive(:notify_if_mentioned).and_return(true)
- @post.send(:receive_persisted, bob, eve.person, @known_post).should == true
+ expect(@post.send(:receive_persisted, bob, eve.person, @known_post)).to eq(true)
end
end
end
@@ -299,25 +299,25 @@ describe Post do
context "the user does not know about the post" do
before do
@post = FactoryGirl.create(:status_message, :author => bob.person)
- bob.stub(:find_visible_shareable_by_id).and_return(nil)
- bob.stub(:notify_if_mentioned).and_return(true)
+ allow(bob).to receive(:find_visible_shareable_by_id).and_return(nil)
+ allow(bob).to receive(:notify_if_mentioned).and_return(true)
end
it "it receives the post from the contact of the author" do
- bob.should_receive(:contact_for).with(eve.person).and_return(double(:receive_shareable => true))
- @post.send(:receive_non_persisted, bob, eve.person).should == true
+ expect(bob).to receive(:contact_for).with(eve.person).and_return(double(:receive_shareable => true))
+ expect(@post.send(:receive_non_persisted, bob, eve.person)).to eq(true)
end
it 'notifies the user if they are mentioned' do
- bob.stub(:contact_for).with(eve.person).and_return(double(:receive_shareable => true))
- bob.should_receive(:notify_if_mentioned).and_return(true)
+ allow(bob).to receive(:contact_for).with(eve.person).and_return(double(:receive_shareable => true))
+ expect(bob).to receive(:notify_if_mentioned).and_return(true)
- @post.send(:receive_non_persisted, bob, eve.person).should == true
+ expect(@post.send(:receive_non_persisted, bob, eve.person)).to eq(true)
end
it 'returns false if the post does not save' do
- @post.stub(:save).and_return(false)
- @post.send(:receive_non_persisted, bob, eve.person).should == false
+ allow(@post).to receive(:save).and_return(false)
+ expect(@post.send(:receive_non_persisted, bob, eve.person)).to eq(false)
end
end
end
@@ -325,40 +325,40 @@ describe Post do
describe '#reshares_count' do
before :each do
@post = @user.post :status_message, :text => "hello", :to => @aspect.id, :public => true
- @post.reshares.size.should == 0
+ expect(@post.reshares.size).to eq(0)
end
describe 'when post has not been reshared' do
it 'returns zero' do
- @post.reshares_count.should == 0
+ expect(@post.reshares_count).to eq(0)
end
end
describe 'when post has been reshared exactly 1 time' do
before :each do
- @post.reshares.size.should == 0
+ expect(@post.reshares.size).to eq(0)
@reshare = FactoryGirl.create(:reshare, :root => @post)
@post.reload
- @post.reshares.size.should == 1
+ expect(@post.reshares.size).to eq(1)
end
it 'returns 1' do
- @post.reshares_count.should == 1
+ expect(@post.reshares_count).to eq(1)
end
end
describe 'when post has been reshared more than once' do
before :each do
- @post.reshares.size.should == 0
+ expect(@post.reshares.size).to eq(0)
FactoryGirl.create(:reshare, :root => @post)
FactoryGirl.create(:reshare, :root => @post)
FactoryGirl.create(:reshare, :root => @post)
@post.reload
- @post.reshares.size.should == 3
+ expect(@post.reshares.size).to eq(3)
end
it 'returns the number of reshares' do
- @post.reshares_count.should == 3
+ expect(@post.reshares_count).to eq(3)
end
end
end
@@ -366,25 +366,25 @@ describe Post do
describe "#after_create" do
it "sets #interacted_at" do
post = FactoryGirl.create(:status_message)
- post.interacted_at.should_not be_blank
+ expect(post.interacted_at).not_to be_blank
end
end
describe "#find_by_guid_or_id_with_user" do
it "succeeds with an id" do
post = FactoryGirl.create :status_message, public: true
- Post.find_by_guid_or_id_with_user(post.id).should == post
+ expect(Post.find_by_guid_or_id_with_user(post.id)).to eq(post)
end
it "succeeds with an guid" do
post = FactoryGirl.create :status_message, public: true
- Post.find_by_guid_or_id_with_user(post.guid).should == post
+ expect(Post.find_by_guid_or_id_with_user(post.guid)).to eq(post)
end
it "looks up on the passed user object if it's non-nil" do
post = FactoryGirl.create :status_message
user = double
- user.should_receive(:find_visible_shareable_by_id).with(Post, post.id, key: :id).and_return(post)
+ expect(user).to receive(:find_visible_shareable_by_id).with(Post, post.id, key: :id).and_return(post)
Post.find_by_guid_or_id_with_user post.id, user
end
@@ -396,7 +396,7 @@ describe Post do
end
it "raises Diaspora::NonPublic for a non-existing id without a user" do
- Post.stub where: double(includes: double(first: nil))
+ allow(Post).to receive_messages where: double(includes: double(first: nil))
expect {
Post.find_by_guid_or_id_with_user 123
}.to raise_error Diaspora::NonPublic
diff --git a/spec/models/profile_spec.rb b/spec/models/profile_spec.rb
index 4d152589d..f62b43ce8 100644
--- a/spec/models/profile_spec.rb
+++ b/spec/models/profile_spec.rb
@@ -4,28 +4,28 @@
require 'spec_helper'
-describe Profile do
+describe Profile, :type => :model do
describe 'validation' do
describe "of first_name" do
it "strips leading and trailing whitespace" do
profile = FactoryGirl.build(:profile, :first_name => " Shelly ")
- profile.should be_valid
- profile.first_name.should == "Shelly"
+ expect(profile).to be_valid
+ expect(profile.first_name).to eq("Shelly")
end
it "can be 32 characters long" do
profile = FactoryGirl.build(:profile, :first_name => "Hexagoooooooooooooooooooooooooon")
- profile.should be_valid
+ expect(profile).to be_valid
end
it "cannot be 33 characters" do
profile = FactoryGirl.build(:profile, :first_name => "Hexagooooooooooooooooooooooooooon")
- profile.should_not be_valid
+ expect(profile).not_to be_valid
end
it 'cannot have ;' do
profile = FactoryGirl.build(:profile, :first_name => "Hex;agon")
- profile.should_not be_valid
+ expect(profile).not_to be_valid
end
end
@@ -36,19 +36,19 @@ describe Profile do
it 'outputs a hash that can update a diaspora profile' do
profile = Profile.new
- profile.from_omniauth_hash(@from_omniauth)['bio'].should == 'this is my bio'
+ expect(profile.from_omniauth_hash(@from_omniauth)['bio']).to eq('this is my bio')
end
it 'does not overwrite any exsisting profile fields' do
profile = Profile.new(:first_name => 'maxwell')
- profile.from_omniauth_hash(@from_omniauth)['first_name'].should == 'maxwell'
+ expect(profile.from_omniauth_hash(@from_omniauth)['first_name']).to eq('maxwell')
end
it 'sets full name to first name' do
@from_omniauth = {'name' => 'bob jones', 'description' => 'this is my bio', 'location' => 'sf', 'image' => 'http://cats.com/gif.gif'}
profile = Profile.new
- profile.from_omniauth_hash(@from_omniauth)['first_name'].should == 'bob jones'
+ expect(profile.from_omniauth_hash(@from_omniauth)['first_name']).to eq('bob jones')
end
end
@@ -58,9 +58,9 @@ describe Profile do
profile.first_name = "casimiro"
profile.last_name = nil
- profile.full_name.should_not == "casimiro"
+ expect(profile.full_name).not_to eq("casimiro")
profile.save
- profile.full_name.should == "casimiro"
+ expect(profile.full_name).to eq("casimiro")
end
it 'generates a full name given only last name' do
@@ -68,9 +68,9 @@ describe Profile do
profile.first_name = nil
profile.last_name = "grippi"
- profile.full_name.should_not == "grippi"
+ expect(profile.full_name).not_to eq("grippi")
profile.save
- profile.full_name.should == "grippi"
+ expect(profile.full_name).to eq("grippi")
end
it 'generates a full name given first and last names' do
@@ -78,40 +78,52 @@ describe Profile do
profile.first_name = "casimiro"
profile.last_name = "grippi"
- profile.full_name.should_not == "casimiro grippi"
+ expect(profile.full_name).not_to eq("casimiro grippi")
profile.save
- profile.full_name.should == "casimiro grippi"
+ expect(profile.full_name).to eq("casimiro grippi")
end
end
describe "of last_name" do
it "strips leading and trailing whitespace" do
profile = FactoryGirl.build(:profile, :last_name => " Ohba ")
- profile.should be_valid
- profile.last_name.should == "Ohba"
+ expect(profile).to be_valid
+ expect(profile.last_name).to eq("Ohba")
end
it "can be 32 characters long" do
profile = FactoryGirl.build(:profile, :last_name => "Hexagoooooooooooooooooooooooooon")
- profile.should be_valid
+ expect(profile).to be_valid
end
it "cannot be 33 characters" do
profile = FactoryGirl.build(:profile, :last_name => "Hexagooooooooooooooooooooooooooon")
- profile.should_not be_valid
+ expect(profile).not_to be_valid
end
it 'cannot have ;' do
profile = FactoryGirl.build(:profile, :last_name => "Hex;agon")
- profile.should_not be_valid
+ expect(profile).not_to be_valid
end
it 'disallows ; with a newline in the string' do
profile = FactoryGirl.build(:profile, :last_name => "H\nex;agon")
- profile.should_not be_valid
+ expect(profile).not_to be_valid
end
end
end
+ describe "of location" do
+ it "can be 255 characters long" do
+ profile = FactoryGirl.build(:profile, :location => "a"*255)
+ expect(profile).to be_valid
+ end
+
+ it "cannot be 256 characters" do
+ profile = FactoryGirl.build(:profile, :location => "a"*256)
+ expect(profile).not_to be_valid
+ end
+ end
+
describe '#image_url=' do
before do
@profile = FactoryGirl.build(:profile)
@@ -120,17 +132,17 @@ describe Profile do
end
it 'ignores an empty string' do
- lambda {@profile.image_url = ""}.should_not change(@profile, :image_url)
+ expect {@profile.image_url = ""}.not_to change(@profile, :image_url)
end
it 'makes relative urls absolute' do
@profile.image_url = "/relative/url"
- @profile.image_url.should == "#{@pod_url}/relative/url"
+ expect(@profile.image_url).to eq("#{@pod_url}/relative/url")
end
it "doesn't change absolute urls" do
@profile.image_url = "http://not/a/relative/url"
- @profile.image_url.should == "http://not/a/relative/url"
+ expect(@profile.image_url).to eq("http://not/a/relative/url")
end
end
@@ -141,8 +153,8 @@ describe Profile do
xml = @profile.to_xml
new_profile = Profile.from_xml(xml.to_s)
- new_profile.tag_string.should_not be_blank
- new_profile.tag_string.should include('#rafi')
+ expect(new_profile.tag_string).not_to be_blank
+ expect(new_profile.tag_string).to include('#rafi')
end
end
@@ -151,7 +163,7 @@ describe Profile do
it 'should include persons diaspora handle' do
xml = person.profile.to_diaspora_xml
- xml.should include "foobar"
+ expect(xml).to include "foobar"
end
it 'includes tags' do
@@ -159,14 +171,14 @@ describe Profile do
person.profile.build_tags
person.profile.save
xml = person.profile.to_diaspora_xml
- xml.should include "#one"
+ expect(xml).to include "#one"
end
it 'includes location' do
person.profile.location = 'Dark Side, Moon'
person.profile.save
xml = person.profile.to_diaspora_xml
- xml.should include "Dark Side, Moon"
+ expect(xml).to include "Dark Side, Moon"
end
end
@@ -177,7 +189,7 @@ describe Profile do
it 'returns a default rather than nil' do
@profile.image_url = nil
- @profile.image_url.should_not be_nil
+ expect(@profile.image_url).not_to be_nil
end
it 'falls back to the large thumbnail if the small thumbnail is nil' do
@@ -185,14 +197,14 @@ describe Profile do
@profile[:image_url] = 'large'
@profile[:image_url_small] = nil
@profile[:image_url_medium] = nil
- @profile.image_url(:thumb_small).should == 'large'
- @profile.image_url(:thumb_medium).should == 'large'
+ expect(@profile.image_url(:thumb_small)).to eq('large')
+ expect(@profile.image_url(:thumb_medium)).to eq('large')
end
end
describe '#subscribers' do
it 'returns all non-pending contacts for a user' do
- bob.profile.subscribers(bob).map{|s| s.id}.should =~ [alice.person, eve.person].map{|s| s.id}
+ expect(bob.profile.subscribers(bob).map{|s| s.id}).to match_array([alice.person, eve.person].map{|s| s.id})
end
end
@@ -202,43 +214,43 @@ describe Profile do
it 'accepts form data' do
profile.birthday = nil
profile.date = { 'year' => '2000', 'month' => '01', 'day' => '01' }
- profile.birthday.year.should == 2000
- profile.birthday.month.should == 1
- profile.birthday.day.should == 1
+ expect(profile.birthday.year).to eq(2000)
+ expect(profile.birthday.month).to eq(1)
+ expect(profile.birthday.day).to eq(1)
end
it 'unsets the birthday' do
profile.birthday = Date.new(2000, 1, 1)
profile.date = { 'year' => '', 'month' => '', 'day' => ''}
- profile.birthday.should == nil
+ expect(profile.birthday).to eq(nil)
end
it 'does not change with blank month and day values' do
profile.birthday = Date.new(2000, 1, 1)
profile.date = { 'year' => '2001', 'month' => '', 'day' => ''}
- profile.birthday.year.should == 2000
- profile.birthday.month.should == 1
- profile.birthday.day.should == 1
+ expect(profile.birthday.year).to eq(2000)
+ expect(profile.birthday.month).to eq(1)
+ expect(profile.birthday.day).to eq(1)
end
it 'does not accept blank initial values' do
profile.birthday = nil
profile.date = { 'year' => '2001', 'month' => '', 'day' => ''}
- profile.birthday.should == nil
+ expect(profile.birthday).to eq(nil)
end
it 'does not accept invalid dates' do
profile.birthday = nil
profile.date = { 'year' => '2001', 'month' => '02', 'day' => '31' }
- profile.birthday.should == nil
+ expect(profile.birthday).to eq(nil)
end
it 'does not change with invalid dates' do
profile.birthday = Date.new(2000, 1, 1)
profile.date = { 'year' => '2001', 'month' => '02', 'day' => '31' }
- profile.birthday.year.should == 2000
- profile.birthday.month.should == 1
- profile.birthday.day.should == 1
+ expect(profile.birthday.year).to eq(2000)
+ expect(profile.birthday.month).to eq(1)
+ expect(profile.birthday.day).to eq(1)
end
end
@@ -253,12 +265,17 @@ describe Profile do
@object.valid?
@object.errors.full_messages
- @object.should be_valid
+ expect(@object).to be_valid
end
it 'strips more than 5 tags' do
@object.tag_string = '#one #two #three #four #five #six'
@object.save
- @object.tags.count.should == 5
+ expect(@object.tags.count).to eq(5)
+ end
+ it 'should require tag name not be more than 255 characters long' do
+ @object.tag_string = "##{'a' * (255+1)}"
+ @object.save
+ expect(@object).not_to be_valid
end
it_should_behave_like 'it is taggable'
end
@@ -271,18 +288,18 @@ describe Profile do
end
it 'returns a formatted date' do
- @profile.formatted_birthday.should == "January 1, 2000"
+ expect(@profile.formatted_birthday).to eq("January 1, 2000")
end
it 'removes nil year birthdays' do
@profile_hash.delete('year')
@profile.date = @profile_hash
- @profile.formatted_birthday.should == 'January 1'
+ expect(@profile.formatted_birthday).to eq('January 1')
end
it 'retuns nil if no birthday is set' do
@profile.date = {}
- @profile.formatted_birthday.should == nil
+ expect(@profile.formatted_birthday).to eq(nil)
end
end
@@ -291,10 +308,10 @@ describe Profile do
it 'updates the profile in place' do
local_luke, local_leia, remote_raphael = set_up_friends
new_profile = FactoryGirl.build :profile
- lambda{
+ expect{
new_profile.receive(local_leia, remote_raphael)
- }.should_not change(Profile, :count)
- remote_raphael.last_name.should == new_profile.last_name
+ }.not_to change(Profile, :count)
+ expect(remote_raphael.last_name).to eq(new_profile.last_name)
end
end
@@ -309,12 +326,12 @@ describe Profile do
@profile.tombstone!
@profile.reload
attributes.each{ |attr|
- @profile[attr.to_sym].should be_blank
+ expect(@profile[attr.to_sym]).to be_blank
}
end
it 'removes all the tags from the profile' do
- @profile.taggings.should_receive(:delete_all)
+ expect(@profile.taggings).to receive(:delete_all)
@profile.tombstone!
end
end
@@ -322,7 +339,7 @@ describe Profile do
describe "#clearable_fields" do
it 'returns the current profile fields' do
profile = FactoryGirl.build :profile
- profile.send(:clearable_fields).sort.should ==
+ expect(profile.send(:clearable_fields).sort).to eq(
["diaspora_handle",
"first_name",
"last_name",
@@ -336,6 +353,7 @@ describe Profile do
"nsfw",
"location",
"full_name"].sort
+ )
end
end
end
diff --git a/spec/models/report_spec.rb b/spec/models/report_spec.rb
index 3595a6a1a..bdfc17d38 100644
--- a/spec/models/report_spec.rb
+++ b/spec/models/report_spec.rb
@@ -4,7 +4,7 @@
require 'spec_helper'
-describe Report do
+describe Report, :type => :model do
before do
#:report => { :item_id => @message.id, :item_type => 'post', :text => 'offensive content' }
@user = bob
@@ -27,34 +27,34 @@ describe Report do
it 'validates that post ID is required' do
report = @valid_post_report
report.delete(:item_id)
- @user.reports.build(report).should_not be_valid
+ expect(@user.reports.build(report)).not_to be_valid
end
-
+
it 'validates that post type is required' do
report = @valid_post_report
- report.delete(:item_type)
- @user.reports.build(report).should_not be_valid
+ report[:item_type] = nil
+ expect(@user.reports.build(report)).not_to be_valid
end
it 'validates that post does exist' do
report = @valid_post_report
- report[:item_id] = 666;
- @user.reports.build(report).should_not be_valid
+ report[:item_id] = 0;
+ expect(@user.reports.build(report)).not_to be_valid
end
it 'validates that comment does exist' do
report = @valid_comment_report
- report[:item_id] = 666;
- @user.reports.build(report).should_not be_valid
+ report[:item_id] = 0;
+ expect(@user.reports.build(report)).not_to be_valid
end
it 'validates that entry does not exist' do
- @user.reports.build(@valid_post_report).should be_valid
+ expect(@user.reports.build(@valid_post_report)).to be_valid
end
-
+
it 'validates that entry does exist' do
@user.reports.create(@valid_post_report)
- @user.reports.build(@valid_post_report).should_not be_valid
+ expect(@user.reports.build(@valid_post_report)).not_to be_valid
end
end
diff --git a/spec/models/reshare_spec.rb b/spec/models/reshare_spec.rb
index 63e4295b8..155ac527d 100644
--- a/spec/models/reshare_spec.rb
+++ b/spec/models/reshare_spec.rb
@@ -1,25 +1,23 @@
require 'spec_helper'
-describe Reshare do
- include Rails.application.routes.url_helpers
-
+describe Reshare, :type => :model do
it 'has a valid Factory' do
- FactoryGirl.build(:reshare).should be_valid
+ expect(FactoryGirl.build(:reshare)).to be_valid
end
it 'requires root' do
reshare = FactoryGirl.build(:reshare, :root => nil)
- reshare.should_not be_valid
+ expect(reshare).not_to be_valid
end
it 'require public root' do
reshare = FactoryGirl.build(:reshare, :root => FactoryGirl.create(:status_message, :public => false))
- reshare.should_not be_valid
- reshare.errors[:base].should include('Only posts which are public may be reshared.')
+ expect(reshare).not_to be_valid
+ expect(reshare.errors[:base]).to include('Only posts which are public may be reshared.')
end
it 'forces public' do
- FactoryGirl.create(:reshare, :public => false).public.should be_true
+ expect(FactoryGirl.create(:reshare, :public => false).public).to be true
end
describe "#receive" do
@@ -32,20 +30,20 @@ describe Reshare do
it 'increments the reshare count' do
receive_reshare
- @root.resharers.count.should == 1
+ expect(@root.resharers.count).to eq(1)
end
it 'adds the resharer to the re-sharers of the post' do
receive_reshare
- @root.resharers.should include(@reshare.author)
+ expect(@root.resharers).to include(@reshare.author)
end
it 'does not error if the root author has a contact for the resharer' do
bob.share_with @reshare.author, bob.aspects.first
- proc {
+ expect {
Timeout.timeout(5) do
receive_reshare #This doesn't ever terminate on my machine before it was fixed.
end
- }.should_not raise_error
+ }.not_to raise_error
end
end
@@ -58,8 +56,19 @@ describe Reshare do
end
it 'deletates #nsfw to the root post' do
- @sfw_reshare.nsfw.should_not be_true
- @nsfw_reshare.nsfw.should be_true
+ expect(@sfw_reshare.nsfw).not_to be true
+ expect(@nsfw_reshare.nsfw).to be_truthy
+ end
+ end
+
+ describe '#poll' do
+ before do
+ @root_post = FactoryGirl.create(:status_message_with_poll, public: true)
+ @reshare = FactoryGirl.create(:reshare, root: @root_post)
+ end
+
+ it 'contains root poll' do
+ expect(@reshare.poll).to eq @root_post.poll
end
end
@@ -69,11 +78,18 @@ describe Reshare do
@reshare = FactoryGirl.build(:reshare, :root => sm)
end
it 'does not return anything for non-author of the original post' do
- @reshare.notification_type(bob, @reshare.author).should be_nil
+ expect(@reshare.notification_type(bob, @reshare.author)).to be_nil
end
it 'returns "Reshared" for the original post author' do
- @reshare.notification_type(alice, @reshare.author).should == Notifications::Reshared
+ expect(@reshare.notification_type(alice, @reshare.author)).to eq(Notifications::Reshared)
+ end
+
+ it 'does not error out if the root was deleted' do
+ @reshare.root = nil
+ expect {
+ @reshare.notification_type(alice, @reshare.author)
+ }.to_not raise_error
end
end
@@ -83,7 +99,7 @@ describe Reshare do
rs1 = FactoryGirl.build(:reshare, :root=>@sm)
rs2 = FactoryGirl.build(:reshare, :root=>rs1)
@rs3 = FactoryGirl.build(:reshare, :root=>rs2)
-
+
sm = FactoryGirl.create(:status_message, :author => alice.person, :public => true)
rs1 = FactoryGirl.create(:reshare, :root => sm)
@of_deleted = FactoryGirl.build(:reshare, :root => rs1)
@@ -92,7 +108,7 @@ describe Reshare do
end
it 'resolves root posts to the top level' do
- @rs3.absolute_root.should == @sm
+ expect(@rs3.absolute_root).to eq(@sm)
end
it 'can handle deleted reshares' do
@@ -125,13 +141,13 @@ describe Reshare do
context 'serialization' do
it 'serializes root_diaspora_id' do
- @xml.should include("root_diaspora_id")
- @xml.should include(@reshare.author.diaspora_handle)
+ expect(@xml).to include("root_diaspora_id")
+ expect(@xml).to include(@reshare.author.diaspora_handle)
end
it 'serializes root_guid' do
- @xml.should include("root_guid")
- @xml.should include(@reshare.root.guid)
+ expect(@xml).to include("root_guid")
+ expect(@xml).to include(@reshare.root.guid)
end
end
@@ -143,15 +159,15 @@ describe Reshare do
end
it 'marshals the guid' do
- Reshare.from_xml(@xml).root_guid.should == @root_object.guid
+ expect(Reshare.from_xml(@xml).root_guid).to eq(@root_object.guid)
end
it 'fetches the root post from root_guid' do
- Reshare.from_xml(@xml).root.should == @root_object
+ expect(Reshare.from_xml(@xml).root).to eq(@root_object)
end
it 'fetches the root author from root_diaspora_id' do
- Reshare.from_xml(@xml).root.author.should == @original_author
+ expect(Reshare.from_xml(@xml).root.author).to eq(@original_author)
end
end
@@ -171,8 +187,8 @@ describe Reshare do
@root_object = @reshare.root
@root_object.delete
@response = double
- @response.stub(:status).and_return(200)
- @response.stub(:success?).and_return(true)
+ allow(@response).to receive(:status).and_return(200)
+ allow(@response).to receive(:success?).and_return(true)
end
it 'fetches the root author from root_diaspora_id' do
@@ -184,29 +200,37 @@ describe Reshare do
@original_author.profile = @original_profile
wf_prof_double = double
- wf_prof_double.should_receive(:fetch).and_return(@original_author)
- Webfinger.should_receive(:new).and_return(wf_prof_double)
-
- @response.stub(:body).and_return(@root_object.to_diaspora_xml)
-
- Faraday.default_connection.should_receive(:get).with(@original_author.url + short_post_path(@root_object.guid, :format => "xml")).and_return(@response)
+ expect(wf_prof_double).to receive(:fetch).and_return(@original_author)
+ expect(Webfinger).to receive(:new).and_return(wf_prof_double)
+
+ allow(@response).to receive(:body).and_return(@root_object.to_diaspora_xml)
+
+ expect(Faraday.default_connection).to receive(:get).with(
+ URI.join(
+ @original_author.url,
+ Rails.application.routes.url_helpers.short_post_path(
+ @root_object.guid,
+ format: "xml"
+ )
+ )
+ ).and_return(@response)
Reshare.from_xml(@xml)
end
context "fetching post" do
- it "doesn't error out if the post is not found" do
- @response.stub(:status).and_return(404)
- Faraday.default_connection.should_receive(:get).and_return(@response)
+ it "raises if the post is not found" do
+ allow(@response).to receive(:status).and_return(404)
+ expect(Faraday.default_connection).to receive(:get).and_return(@response)
expect {
Reshare.from_xml(@xml)
- }.to_not raise_error
+ }.to raise_error(Diaspora::PostNotFetchable)
end
it "raises if there's another error receiving the post" do
- @response.stub(:status).and_return(500)
- @response.stub(:success?).and_return(false)
- Faraday.default_connection.should_receive(:get).and_return(@response)
+ allow(@response).to receive(:status).and_return(500)
+ allow(@response).to receive(:success?).and_return(false)
+ expect(Faraday.default_connection).to receive(:get).and_return(@response)
expect {
Reshare.from_xml(@xml)
@@ -216,25 +240,33 @@ describe Reshare do
context 'saving the post' do
before do
- @response.stub(:body).and_return(@root_object.to_diaspora_xml)
- Faraday.default_connection.stub(:get).with(@reshare.root.author.url + short_post_path(@root_object.guid, :format => "xml")).and_return(@response)
+ allow(@response).to receive(:body).and_return(@root_object.to_diaspora_xml)
+ allow(Faraday.default_connection).to receive(:get).with(
+ URI.join(
+ @reshare.root.author.url,
+ Rails.application.routes.url_helpers.short_post_path(
+ @root_object.guid,
+ format: "xml"
+ )
+ )
+ ).and_return(@response)
end
it 'fetches the root post from root_guid' do
root = Reshare.from_xml(@xml).root
[:text, :guid, :diaspora_handle, :type, :public].each do |attr|
- root.send(attr).should == @reshare.root.send(attr)
+ expect(root.send(attr)).to eq(@reshare.root.send(attr))
end
end
it 'correctly saves the type' do
- Reshare.from_xml(@xml).root.reload.type.should == "StatusMessage"
+ expect(Reshare.from_xml(@xml).root.reload.type).to eq("StatusMessage")
end
it 'correctly sets the author' do
@original_author = @reshare.root.author
- Reshare.from_xml(@xml).root.reload.author.reload.should == @original_author
+ expect(Reshare.from_xml(@xml).root.reload.author.reload).to eq(@original_author)
end
it 'verifies that the author of the post received is the same as the author in the reshare xml' do
@@ -244,14 +276,14 @@ describe Reshare do
different_person = FactoryGirl.build(:person)
wf_prof_double = double
- wf_prof_double.should_receive(:fetch).and_return(different_person)
- Webfinger.should_receive(:new).and_return(wf_prof_double)
+ expect(wf_prof_double).to receive(:fetch).and_return(different_person)
+ expect(Webfinger).to receive(:new).and_return(wf_prof_double)
- different_person.stub(:url).and_return(@original_author.url)
+ allow(different_person).to receive(:url).and_return(@original_author.url)
- lambda{
+ expect{
Reshare.from_xml(@xml)
- }.should raise_error /^Diaspora ID \(.+\) in the root does not match the Diaspora ID \(.+\) specified in the reshare!$/
+ }.to raise_error /^Diaspora ID \(.+\) in the root does not match the Diaspora ID \(.+\) specified in the reshare!$/
end
end
end
diff --git a/spec/models/role_spec.rb b/spec/models/role_spec.rb
index b575576c3..82a95a8ff 100644
--- a/spec/models/role_spec.rb
+++ b/spec/models/role_spec.rb
@@ -1,5 +1,54 @@
-require 'spec_helper'
+require "spec_helper"
describe Role do
- pending "add some examples to (or delete) #{__FILE__}"
+ let(:person) { create(:person) }
+
+ describe "validations" do
+ it { should validate_presence_of(:person) }
+ it { should validate_uniqueness_of(:name).scoped_to(:person_id) }
+ it { should validate_inclusion_of(:name).in_array(%w(admin spotlight)) }
+ end
+
+ describe "associations" do
+ it { should belong_to(:person) }
+ end
+
+ describe "scopes" do
+ let!(:admin_role) { person.roles.create(name: "admin") }
+ let!(:spotlight_role) { person.roles.create(name: "spotlight") }
+
+ describe ".admins" do
+ it "includes admin roles" do
+ expect(Role.admins).to match_array([admin_role])
+ end
+ end
+ end
+
+ describe ".is_admin?" do
+ it "defaults to false" do
+ expect(Role.is_admin?(person)).to be false
+ end
+
+ context "when the person is an admin" do
+ before { person.roles.create(name: "admin") }
+
+ it "is true" do
+ expect(Role.is_admin?(person)).to be true
+ end
+ end
+ end
+
+ describe ".add_admin" do
+ it "creates the admin role" do
+ Role.add_admin(person)
+ expect(person.roles.where(name: "admin")).to exist
+ end
+ end
+
+ describe ".add_spotlight" do
+ it "creates the spotlight role" do
+ Role.add_spotlight(person)
+ expect(person.roles.where(name: "spotlight")).to exist
+ end
+ end
end
diff --git a/spec/models/service_spec.rb b/spec/models/service_spec.rb
index 069c8811a..a7aa8a3e6 100644
--- a/spec/models/service_spec.rb
+++ b/spec/models/service_spec.rb
@@ -1,6 +1,6 @@
require 'spec_helper'
-describe Service do
+describe Service, :type => :model do
before do
@post = alice.post(:status_message, :text => "hello", :to => alice.aspects.first.id)
@@ -15,7 +15,7 @@ describe Service do
alice.services << second_service
alice.services.last.save
- alice.services.last.should be_invalid
+ expect(alice.services.last).to be_invalid
end
it 'by default has no profile photo url' do
diff --git a/spec/models/services/facebook_spec.rb b/spec/models/services/facebook_spec.rb
index 221ea5a3c..022a42e24 100644
--- a/spec/models/services/facebook_spec.rb
+++ b/spec/models/services/facebook_spec.rb
@@ -1,6 +1,6 @@
require 'spec_helper'
-describe Services::Facebook do
+describe Services::Facebook, :type => :model do
before do
@user = alice
@@ -17,7 +17,7 @@ describe Services::Facebook do
end
it 'swallows exception raised by facebook always being down' do
- pending "temporarily disabled to figure out while some requests are failing"
+ skip "temporarily disabled to figure out while some requests are failing"
stub_request(:post,"https://graph.facebook.com/me/feed").
to_raise(StandardError)
@@ -25,24 +25,24 @@ describe Services::Facebook do
end
it 'removes text formatting markdown from post text' do
- message = double
- message.should_receive(:plain_text_without_markdown).and_return("")
+ message = double(urls: [])
+ expect(message).to receive(:plain_text_without_markdown).and_return("")
post = double(message: message, photos: [])
post_params = @service.create_post_params(post)
end
it 'does not add post link when no photos' do
message = "Some text."
- post = double(message: double(plain_text_without_markdown: message), photos: [])
+ post = double(message: double(plain_text_without_markdown: message, urls: []), photos: [])
post_params = @service.create_post_params(post)
- post_params[:message].should_not include "http"
+ expect(post_params[:message]).not_to include "http"
end
it 'sets facebook id on post' do
stub_request(:post, "https://graph.facebook.com/me/feed").
to_return(:status => 200, :body => '{"id": "12345"}', :headers => {})
@service.post(@post)
- @post.facebook_id.should match "12345"
+ expect(@post.facebook_id).to match "12345"
end
end
@@ -63,7 +63,7 @@ describe Services::Facebook do
it "should include post url in message with photos" do
post_params = @service.create_post_params(@status_message)
- post_params[:message].should include 'http'
+ expect(post_params[:message]).to include 'http'
end
end
@@ -72,8 +72,9 @@ describe Services::Facebook do
it 'returns a large profile photo url' do
@service.uid = "abc123"
@service.access_token = "token123"
- @service.profile_photo_url.should ==
+ expect(@service.profile_photo_url).to eq(
"https://graph.facebook.com/abc123/picture?type=large&access_token=token123"
+ )
end
end
@@ -82,7 +83,7 @@ describe Services::Facebook do
@post.facebook_id = "2345"
url="https://graph.facebook.com/#{@post.facebook_id}/"
stub_request(:delete, "#{url}?access_token=#{@service.access_token}").to_return(:status => 200)
- @service.should_receive(:delete_from_facebook).with(url, {access_token: @service.access_token})
+ expect(@service).to receive(:delete_from_facebook).with(url, {access_token: @service.access_token})
@service.delete_post(@post)
end
diff --git a/spec/models/services/tumblr_spec.rb b/spec/models/services/tumblr_spec.rb
index f60c2c32a..c6ecb9c3e 100644
--- a/spec/models/services/tumblr_spec.rb
+++ b/spec/models/services/tumblr_spec.rb
@@ -1,6 +1,6 @@
require 'spec_helper'
-describe Services::Tumblr do
+describe Services::Tumblr, :type => :model do
before do
@user = alice
@@ -12,16 +12,16 @@ describe Services::Tumblr do
describe '#post' do
it 'posts a status message to tumblr and saves the returned ids' do
response = double(body: '{"response": {"user": {"blogs": [{"url": "http://foo.tumblr.com"}]}}}')
- OAuth::AccessToken.any_instance.should_receive(:get)
+ expect_any_instance_of(OAuth::AccessToken).to receive(:get)
.with("/v2/user/info")
.and_return(response)
response = double(code: "201", body: '{"response": {"id": "bla"}}')
- OAuth::AccessToken.any_instance.should_receive(:post)
+ expect_any_instance_of(OAuth::AccessToken).to receive(:post)
.with("/v2/blog/foo.tumblr.com/post", @service.build_tumblr_post(@post, ''))
.and_return(response)
- @post.should_receive(:tumblr_ids=).with({"foo.tumblr.com" => "bla"}.to_json)
+ expect(@post).to receive(:tumblr_ids=).with({"foo.tumblr.com" => "bla"}.to_json)
@service.post(@post)
end
diff --git a/spec/models/services/twitter_spec.rb b/spec/models/services/twitter_spec.rb
index 5a6bfecbd..c111f6c34 100644
--- a/spec/models/services/twitter_spec.rb
+++ b/spec/models/services/twitter_spec.rb
@@ -1,6 +1,6 @@
require 'spec_helper'
-describe Services::Twitter do
+describe Services::Twitter, :type => :model do
before do
@user = alice
@@ -12,34 +12,34 @@ describe Services::Twitter do
describe '#post' do
before do
- Twitter::Client.any_instance.stub(:update) { Twitter::Tweet.new(id: "1234") }
+ allow_any_instance_of(Twitter::Client).to receive(:update) { Twitter::Tweet.new(id: "1234") }
end
it 'posts a status message to twitter' do
- Twitter::Client.any_instance.should_receive(:update).with(instance_of(String))
+ expect_any_instance_of(Twitter::Client).to receive(:update).with(instance_of(String))
@service.post(@post)
end
it 'sets the tweet_id on the post' do
@service.post(@post)
- @post.tweet_id.should match "1234"
+ expect(@post.tweet_id).to match "1234"
end
it 'swallows exception raised by twitter always being down' do
- pending
- Twitter::Client.any_instance.should_receive(:update).and_raise(StandardError)
+ skip
+ expect_any_instance_of(Twitter::Client).to receive(:update).and_raise(StandardError)
@service.post(@post)
end
it 'should call build_twitter_post' do
url = "foo"
- @service.should_receive(:build_twitter_post).with(@post, 0)
+ expect(@service).to receive(:build_twitter_post).with(@post, 0)
@service.post(@post, url)
end
it 'removes text formatting markdown from post text' do
message = double
- message.should_receive(:plain_text_without_markdown).and_return("")
+ expect(message).to receive(:plain_text_without_markdown).and_return("")
post = double(message: message, photos: [])
@service.send(:build_twitter_post, post)
end
@@ -55,13 +55,13 @@ describe Services::Twitter do
it "should not truncate a short message" do
short_message = SecureRandom.hex(20)
short_post = double(message: double(plain_text_without_markdown: short_message), photos: [])
- @service.send(:build_twitter_post, short_post).should match short_message
+ expect(@service.send(:build_twitter_post, short_post)).to match short_message
end
it "should truncate a long message" do
long_message = SecureRandom.hex(220)
long_post = double(message: double(plain_text_without_markdown: long_message), id: 1, photos: [])
- @service.send(:build_twitter_post, long_post).length.should be < long_message.length
+ expect(@service.send(:build_twitter_post, long_post).length).to be < long_message.length
end
it "should not truncate a long message with an http url" do
@@ -70,7 +70,7 @@ describe Services::Twitter do
@post.text = long_message
answer = @service.send(:build_twitter_post, @post)
- answer.should_not match /\.\.\./
+ expect(answer).not_to match /\.\.\./
end
it "should not cut links when truncating a post" do
@@ -78,8 +78,8 @@ describe Services::Twitter do
long_post = double(message: double(plain_text_without_markdown: long_message), id: 1, photos: [])
answer = @service.send(:build_twitter_post, long_post)
- answer.should match /\.\.\./
- answer.should match /shortened\.html/
+ expect(answer).to match /\.\.\./
+ expect(answer).to match /shortened\.html/
end
it "should append the otherwise-cut link when truncating a post" do
@@ -87,15 +87,15 @@ describe Services::Twitter do
long_post = double(message: double(plain_text_without_markdown: long_message), id: 1, photos: [])
answer = @service.send(:build_twitter_post, long_post)
- answer.should match /\.\.\./
- answer.should match /shortened\.html/
+ expect(answer).to match /\.\.\./
+ expect(answer).to match /shortened\.html/
end
it "should not truncate a long message with an https url" do
long_message = " https://joindiaspora.com/a-very-long-url-name-that-will-be-shortened.html " + @long_message_end
@post.text = long_message
answer = @service.send(:build_twitter_post, @post)
- answer.should_not match /\.\.\./
+ expect(answer).not_to match /\.\.\./
end
it "should truncate a long message with an ftp url" do
@@ -103,7 +103,7 @@ describe Services::Twitter do
long_post = double(message: double(plain_text_without_markdown: long_message), id: 1, photos: [])
answer = @service.send(:build_twitter_post, long_post)
- answer.should match /\.\.\./
+ expect(answer).to match /\.\.\./
end
it "should not truncate a message of maximum length" do
@@ -111,7 +111,7 @@ describe Services::Twitter do
exact_size_post = double(message: double(plain_text_without_markdown: exact_size_message), id: 1, photos: [])
answer = @service.send(:build_twitter_post, exact_size_post)
- answer.should match exact_size_message
+ expect(answer).to match exact_size_message
end
end
@@ -132,7 +132,7 @@ describe Services::Twitter do
it "should include post url in short message with photos" do
answer = @service.send(:build_twitter_post, @status_message)
- answer.should include 'http'
+ expect(answer).to include 'http'
end
end
@@ -140,11 +140,11 @@ describe Services::Twitter do
describe "#profile_photo_url" do
it 'returns the original profile photo url' do
user_double = double
- user_double.should_receive(:profile_image_url_https).with("original").and_return("http://a2.twimg.com/profile_images/uid/avatar.png")
- Twitter::Client.any_instance.should_receive(:user).with("joindiaspora").and_return(user_double)
+ expect(user_double).to receive(:profile_image_url_https).with("original").and_return("http://a2.twimg.com/profile_images/uid/avatar.png")
+ expect_any_instance_of(Twitter::Client).to receive(:user).with("joindiaspora").and_return(user_double)
@service.nickname = "joindiaspora"
- @service.profile_photo_url.should == "http://a2.twimg.com/profile_images/uid/avatar.png"
+ expect(@service.profile_photo_url).to eq("http://a2.twimg.com/profile_images/uid/avatar.png")
end
end
end
diff --git a/spec/models/services/wordpress_spec.rb b/spec/models/services/wordpress_spec.rb
index fd970d839..945285979 100644
--- a/spec/models/services/wordpress_spec.rb
+++ b/spec/models/services/wordpress_spec.rb
@@ -1,6 +1,6 @@
require 'spec_helper'
-describe Services::Wordpress do
+describe Services::Wordpress, :type => :model do
before do
@user = alice
@@ -23,10 +23,10 @@ describe Services::Wordpress do
describe "#post_body" do
it "truncates content for use in title" do
- @service.post_body(@post)[:title].should eq("Hello there. This is a Wordpress post...")
+ expect(@service.post_body(@post)[:title]).to eq("Hello there. This is a Wordpress post...")
end
it "converts markdown tags" do
- @service.post_body(@post)[:content].should match("<strong>Wordpress</strong>")
+ expect(@service.post_body(@post)[:content]).to match("<strong>Wordpress</strong>")
end
end
diff --git a/spec/models/share_visibility_spec.rb b/spec/models/share_visibility_spec.rb
index 94aa0f832..fe2674fe3 100644
--- a/spec/models/share_visibility_spec.rb
+++ b/spec/models/share_visibility_spec.rb
@@ -4,7 +4,7 @@
require 'spec_helper'
-describe ShareVisibility do
+describe ShareVisibility, :type => :model do
describe '.batch_import' do
before do
@post = FactoryGirl.create(:status_message, :author => alice.person)
@@ -14,22 +14,22 @@ describe ShareVisibility do
it 'returns false if share is public' do
@post.public = true
@post.save
- ShareVisibility.batch_import([@contact.id], @post).should be_false
+ expect(ShareVisibility.batch_import([@contact.id], @post)).to be false
end
it 'creates a visibility for each user' do
- lambda {
+ expect {
ShareVisibility.batch_import([@contact.id], @post)
- }.should change {
+ }.to change {
ShareVisibility.exists?(:contact_id => @contact.id, :shareable_id => @post.id, :shareable_type => 'Post')
}.from(false).to(true)
end
it 'does not raise if a visibility already exists' do
ShareVisibility.create!(:contact_id => @contact.id, :shareable_id => @post.id, :shareable_type => 'Post')
- lambda {
+ expect {
ShareVisibility.batch_import([@contact.id], @post)
- }.should_not raise_error
+ }.not_to raise_error
end
context "scopes" do
@@ -39,18 +39,18 @@ describe ShareVisibility do
end
it 'searches for share visibilies for all users contacts' do
- contact_ids = alice.contacts.map{|c| c.id}
- ShareVisibility.for_a_users_contacts(alice).should == ShareVisibility.where(:contact_id => contact_ids).all
+ contact_ids = alice.contacts.map(&:id)
+ expect(ShareVisibility.for_a_users_contacts(alice)).to eq(ShareVisibility.where(:contact_id => contact_ids).to_a)
end
end
describe '.for_contacts_of_a_person' do
it 'searches for share visibilties generated by a person' do
- contact_ids = alice.person.contacts.map{|c| c.id}
-
- ShareVisibility.for_contacts_of_a_person(alice.person) == ShareVisibility.where(:contact_id => contact_ids).all
-
+ contact_ids = alice.person.contacts.map(&:id)
+
+ ShareVisibility.for_contacts_of_a_person(alice.person) == ShareVisibility.where(:contact_id => contact_ids).to_a
+
end
end
end
diff --git a/spec/models/status_message_spec.rb b/spec/models/status_message_spec.rb
index ec102db4c..605b6ede0 100644
--- a/spec/models/status_message_spec.rb
+++ b/spec/models/status_message_spec.rb
@@ -4,7 +4,7 @@
require 'spec_helper'
-describe StatusMessage do
+describe StatusMessage, :type => :model do
include PeopleHelper
before do
@@ -22,7 +22,7 @@ describe StatusMessage do
FactoryGirl.create(:status_message, :text => @test_string )
FactoryGirl.create(:status_message)
- StatusMessage.where_person_is_mentioned(@bo).count.should == 2
+ expect(StatusMessage.where_person_is_mentioned(@bo).count).to eq(2)
end
end
@@ -39,21 +39,22 @@ describe StatusMessage do
describe '.tag_steam' do
it 'returns status messages tagged with the tag' do
tag_stream = StatusMessage.send(:tag_stream, [@tag_id])
- tag_stream.should include @sm1
- tag_stream.should include @sm2
+ expect(tag_stream).to include @sm1
+ expect(tag_stream).to include @sm2
end
end
describe '.public_tag_stream' do
it 'returns public status messages tagged with the tag' do
- StatusMessage.public_tag_stream([@tag_id]).should == [@sm1]
+ expect(StatusMessage.public_tag_stream([@tag_id])).to eq([@sm1])
end
end
describe '.user_tag_stream' do
- it 'returns tag stream thats owned or visibile by' do
- StatusMessage.should_receive(:owned_or_visible_by_user).with(bob).and_return(StatusMessage)
- StatusMessage.should_receive(:tag_stream).with([@tag_id])
+ it 'returns tag stream thats owned or visible by' do
+ relation = double
+ expect(StatusMessage).to receive(:owned_or_visible_by_user).with(bob).and_return(relation)
+ expect(relation).to receive(:tag_stream).with([@tag_id])
StatusMessage.user_tag_stream(bob, [@tag_id])
end
@@ -66,20 +67,28 @@ describe StatusMessage do
sm1 = FactoryGirl.create(:status_message, :author => alice.person)
sm2 = FactoryGirl.create(:status_message, :author => bob.person)
guids = StatusMessage.guids_for_author(alice.person)
- guids.should == [sm1.guid]
+ expect(guids).to eq([sm1.guid])
+ end
+ end
+
+ describe '.before_validation' do
+ it 'calls build_tags' do
+ status = FactoryGirl.build(:status_message)
+ expect(status).to receive(:build_tags)
+ status.save
end
end
describe '.before_create' do
it 'calls build_tags' do
status = FactoryGirl.build(:status_message)
- status.should_receive(:build_tags)
+ expect(status).to receive(:build_tags)
status.save
end
it 'calls filter_mentions' do
status = FactoryGirl.build(:status_message)
- status.should_receive(:filter_mentions)
+ expect(status).to receive(:filter_mentions)
status.save
end
end
@@ -87,7 +96,7 @@ describe StatusMessage do
describe '.after_create' do
it 'calls create_mentions' do
status = FactoryGirl.build(:status_message, text: "text @{Test; #{alice.diaspora_handle}}")
- status.should_receive(:create_mentions).and_call_original
+ expect(status).to receive(:create_mentions).and_call_original
status.save
end
end
@@ -97,33 +106,33 @@ describe StatusMessage do
person = FactoryGirl.create(:person)
post = FactoryGirl.build(:status_message, :author => @user.person)
post.diaspora_handle = person.diaspora_handle
- post.author.should == person
+ expect(post.author).to eq(person)
end
end
context "emptyness" do
it "needs either a message or at least one photo" do
n = @user.build_post(:status_message, :text => nil)
- n.should_not be_valid
+ expect(n).not_to be_valid
n.text = ""
- n.should_not be_valid
+ expect(n).not_to be_valid
n.text = "wales"
- n.should be_valid
+ expect(n).to be_valid
n.text = nil
photo = @user.build_post(:photo, :user_file => uploaded_photo, :to => @aspect.id)
photo.save!
n.photos << photo
- n.should be_valid
- n.errors.full_messages.should == []
+ expect(n).to be_valid
+ expect(n.errors.full_messages).to eq([])
end
it "doesn't check for content when author is remote (federation...)" do
p = FactoryGirl.build(:status_message, text: nil)
- p.should be_valid
+ expect(p).to be_valid
end
end
@@ -131,13 +140,13 @@ describe StatusMessage do
message = "Users do things"
status = @user.post(:status_message, :text => message, :to => @aspect.id)
db_status = StatusMessage.find(status.id)
- db_status.text.should == message
+ expect(db_status.text).to eq(message)
end
it 'should require status messages not be more than 65535 characters long' do
message = 'a' * (65535+1)
status_message = FactoryGirl.build(:status_message, :text => message)
- status_message.should_not be_valid
+ expect(status_message).not_to be_valid
end
describe 'mentions' do
@@ -152,10 +161,10 @@ STR
describe '#create_mentions' do
it 'creates a mention for everyone mentioned in the message' do
- Diaspora::Mentionable.should_receive(:people_from_string).and_return(@people)
+ expect(Diaspora::Mentionable).to receive(:people_from_string).and_return(@people)
@sm.mentions.delete_all
@sm.create_mentions
- @sm.mentions(true).map{|m| m.person}.to_set.should == @people.to_set
+ expect(@sm.mentions(true).map{|m| m.person}.to_set).to eq(@people.to_set)
end
it 'does not barf if it gets called twice' do
@@ -170,32 +179,32 @@ STR
describe '#mentioned_people' do
it 'calls create_mentions if there are no mentions in the db' do
@sm.mentions.delete_all
- @sm.should_receive(:create_mentions)
+ expect(@sm).to receive(:create_mentions)
@sm.mentioned_people
end
it 'returns the mentioned people' do
@sm.mentions.delete_all
- @sm.mentioned_people.to_set.should == @people.to_set
+ expect(@sm.mentioned_people.to_set).to eq(@people.to_set)
end
it 'does not call create_mentions if there are mentions in the db' do
- @sm.should_not_receive(:create_mentions)
+ expect(@sm).not_to receive(:create_mentions)
@sm.mentioned_people
end
end
describe "#mentions?" do
it 'returns true if the person was mentioned' do
- @sm.mentions?(@people[0]).should be_true
+ expect(@sm.mentions?(@people[0])).to be true
end
it 'returns false if the person was not mentioned' do
- @sm.mentions?(FactoryGirl.build(:person)).should be_false
+ expect(@sm.mentions?(FactoryGirl.build(:person))).to be false
end
end
describe "#notify_person" do
it 'notifies the person mentioned' do
- Notification.should_receive(:notify).with(alice, anything, anything)
+ expect(Notification).to receive(:notify).with(alice, anything, anything)
@sm.notify_person(alice.person)
end
end
@@ -208,7 +217,7 @@ STR
author_usr = msg.author.owner
aspect_id = author_usr.aspects.first.id
- Diaspora::Mentionable.should_receive(:filter_for_aspects)
+ expect(Diaspora::Mentionable).to receive(:filter_for_aspects)
.with(msg_txt, author_usr, aspect_id)
msg.send(:filter_mentions)
@@ -216,7 +225,7 @@ STR
it "doesn't do anything when public" do
msg = FactoryGirl.build(:status_message, public: true)
- Diaspora::Mentionable.should_not_receive(:filter_for_aspects)
+ expect(Diaspora::Mentionable).not_to receive(:filter_for_aspects)
msg.send(:filter_mentions)
end
@@ -226,12 +235,12 @@ STR
describe "#nsfw" do
it 'returns MatchObject (true) if the post contains #nsfw (however capitalised)' do
status = FactoryGirl.build(:status_message, :text => "This message is #nSFw")
- status.nsfw.should be_true
+ expect(status.nsfw).to be_truthy
end
it 'returns nil (false) if the post does not contain #nsfw' do
status = FactoryGirl.build(:status_message, :text => "This message is #sFW")
- status.nsfw.should be_false
+ expect(status.nsfw).to be false
end
end
@@ -254,119 +263,113 @@ STR
expect(msg_uc.tags).to match_array(tag_array)
expect(msg_cp.tags).to match_array(tag_array)
end
+
+ it 'should require tag name not be more than 255 characters long' do
+ message = "##{'a' * (255+1)}"
+ status_message = FactoryGirl.build(:status_message, :text => message)
+ expect(status_message).not_to be_valid
+ end
end
describe "XML" do
- before do
- @message = FactoryGirl.build(:status_message, :text => "I hate WALRUSES!", :author => @user.person)
- @xml = @message.to_xml.to_s
- end
+ let(:message) { FactoryGirl.build(:status_message, text: "I hate WALRUSES!", author: @user.person) }
+ let(:xml) { message.to_xml.to_s }
+ let(:marshalled) { StatusMessage.from_xml(xml) }
+
it 'serializes the escaped, unprocessed message' do
text = "[url](http://example.org)<script> alert('xss should be federated');</script>"
- @message.text = text
- @message.to_xml.to_s.should include Builder::XChar.encode(text)
+ message.text = text
+ expect(xml).to include Builder::XChar.encode(text)
end
it 'serializes the message' do
- @xml.should include "<raw_message>I hate WALRUSES!</raw_message>"
+ expect(xml).to include "<raw_message>I hate WALRUSES!</raw_message>"
end
it 'serializes the author address' do
- @xml.should include(@user.person.diaspora_handle)
+ expect(xml).to include(@user.person.diaspora_handle)
end
describe '.from_xml' do
- before do
- @marshalled = StatusMessage.from_xml(@xml)
- end
it 'marshals the message' do
- @marshalled.text.should == "I hate WALRUSES!"
+ expect(marshalled.text).to eq("I hate WALRUSES!")
end
+
it 'marshals the guid' do
- @marshalled.guid.should == @message.guid
+ expect(marshalled.guid).to eq(message.guid)
end
+
it 'marshals the author' do
- @marshalled.author.should == @message.author
+ expect(marshalled.author).to eq(message.author)
end
+
it 'marshals the diaspora_handle' do
- @marshalled.diaspora_handle.should == @message.diaspora_handle
+ expect(marshalled.diaspora_handle).to eq(message.diaspora_handle)
end
end
context 'with some photos' do
before do
- @message.photos << FactoryGirl.build(:photo)
- @message.photos << FactoryGirl.build(:photo)
- @xml = @message.to_xml.to_s
+ message.photos << FactoryGirl.build(:photo)
+ message.photos << FactoryGirl.build(:photo)
end
it 'serializes the photos' do
- @xml.should include "photo"
- @xml.should include @message.photos.first.remote_photo_path
+ expect(xml).to include "photo"
+ expect(xml).to include message.photos.first.remote_photo_path
end
describe '.from_xml' do
- before do
- @marshalled = StatusMessage.from_xml(@xml)
+ it 'marshals the photos' do
+ expect(marshalled.photos.size).to eq(2)
end
- it 'marshals the photos' do
- @marshalled.photos.size.should == 2
+ it 'handles existing photos' do
+ message.photos.each(&:save!)
+ expect(marshalled).to be_valid
end
end
end
context 'with a location' do
before do
- @message.location = Location.new(coordinates: "1, 2").tap(&:save)
- @xml = @message.to_xml.to_s
+ message.location = FactoryGirl.build(:location)
end
it 'serializes the location' do
- @xml.should include "location"
- @xml.should include "lat"
- @xml.should include "lng"
+ expect(xml).to include "location"
+ expect(xml).to include "lat"
+ expect(xml).to include "lng"
end
describe ".from_xml" do
- before do
- @marshalled = StatusMessage.from_xml(@xml)
- end
-
it 'marshals the location' do
- @marshalled.location.should be_present
+ expect(marshalled.location).to be_present
end
end
end
context 'with a poll' do
before do
- @message.poll = FactoryGirl.create(:poll, :status_message => @message)
- @xml = @message.to_xml.to_s
+ message.poll = FactoryGirl.build(:poll)
end
it 'serializes the poll' do
- @xml.should include "poll"
- @xml.should include "question"
- @xml.should include "poll_answer"
+ expect(xml).to include "poll"
+ expect(xml).to include "question"
+ expect(xml).to include "poll_answer"
end
describe ".from_xml" do
- before do
- @marshalled = StatusMessage.from_xml(@xml)
- end
-
it 'marshals the poll' do
- @marshalled.poll.should be_present
+ expect(marshalled.poll).to be_present
end
it 'marshals the poll answers' do
- @marshalled.poll.poll_answers.size.should == 2
+ expect(marshalled.poll.poll_answers.size).to eq(2)
end
end
end
-
-
end
describe '#after_dispatch' do
@@ -384,10 +387,10 @@ STR
end
it 'sets pending to false on any attached photos' do
@status_message.after_dispatch(alice)
- @photos.all?{|p| p.reload.pending}.should be_false
+ expect(@photos.all?{|p| p.reload.pending}).to be false
end
it 'dispatches any attached photos' do
- alice.should_receive(:dispatch_post).twice
+ expect(alice).to receive(:dispatch_post).twice
@status_message.after_dispatch(alice)
end
end
@@ -400,15 +403,15 @@ STR
it 'should queue a GatherOembedData if it includes a link' do
sm = FactoryGirl.build(:status_message, :text => @message_text)
- Workers::GatherOEmbedData.should_receive(:perform_async).with(instance_of(Fixnum), instance_of(String))
+ expect(Workers::GatherOEmbedData).to receive(:perform_async).with(instance_of(Fixnum), instance_of(String))
sm.save
end
describe '#contains_oembed_url_in_text?' do
it 'returns the oembed urls found in the raw message' do
sm = FactoryGirl.build(:status_message, :text => @message_text)
- sm.contains_oembed_url_in_text?.should_not be_nil
- sm.oembed_url.should == @youtube_url
+ expect(sm.contains_oembed_url_in_text?).not_to be_nil
+ expect(sm.oembed_url).to eq(@youtube_url)
end
end
end
@@ -423,20 +426,20 @@ STR
it 'should queue a GatherOpenGraphData if it includes a link' do
sm = FactoryGirl.build(:status_message, :text => @message_text)
- Workers::GatherOpenGraphData.should_receive(:perform_async).with(instance_of(Fixnum), instance_of(String))
+ expect(Workers::GatherOpenGraphData).to receive(:perform_async).with(instance_of(Fixnum), instance_of(String))
sm.save
end
describe '#contains_open_graph_url_in_text?' do
it 'returns the opengraph urls found in the raw message' do
sm = FactoryGirl.build(:status_message, :text => @message_text)
- sm.contains_open_graph_url_in_text?.should_not be_nil
- sm.open_graph_url.should == @ninegag_url
+ expect(sm.contains_open_graph_url_in_text?).not_to be_nil
+ expect(sm.open_graph_url).to eq(@ninegag_url)
end
it 'returns nil if the link is from trusted oembed provider' do
sm = FactoryGirl.build(:status_message, :text => @oemessage_text)
- sm.contains_open_graph_url_in_text?.should be_nil
- sm.open_graph_url.should be_nil
+ expect(sm.contains_open_graph_url_in_text?).to be_nil
+ expect(sm.open_graph_url).to be_nil
end
end
end
diff --git a/spec/models/tag_following_spec.rb b/spec/models/tag_following_spec.rb
index a3b1e63b6..af7879215 100644
--- a/spec/models/tag_following_spec.rb
+++ b/spec/models/tag_following_spec.rb
@@ -1,25 +1,25 @@
require 'spec_helper'
-describe TagFollowing do
+describe TagFollowing, :type => :model do
before do
@tag = FactoryGirl.build(:tag)
TagFollowing.create!(:tag => @tag, :user => alice)
end
it 'validates uniqueness of tag_following scoped through user' do
- TagFollowing.new(:tag => @tag, :user => alice).valid?.should be_false
+ expect(TagFollowing.new(:tag => @tag, :user => alice).valid?).to be false
end
it 'allows multiple tag followings for different users' do
- TagFollowing.new(:tag => @tag, :user => bob).valid?.should be_true
+ expect(TagFollowing.new(:tag => @tag, :user => bob).valid?).to be true
end
it 'user is following a tag' do
- TagFollowing.user_is_following?(alice, @tag.name).should be_true
+ expect(TagFollowing.user_is_following?(alice, @tag.name)).to be true
end
it 'user not following a tag' do
- TagFollowing.user_is_following?(bob, @tag.name).should be_false
+ expect(TagFollowing.user_is_following?(bob, @tag.name)).to be false
end
end
diff --git a/spec/models/user/connecting_spec.rb b/spec/models/user/connecting_spec.rb
index e01e679e8..155dff64b 100644
--- a/spec/models/user/connecting_spec.rb
+++ b/spec/models/user/connecting_spec.rb
@@ -4,7 +4,7 @@
require 'spec_helper'
-describe User::Connecting do
+describe User::Connecting, :type => :model do
let(:aspect) { alice.aspects.first }
let(:aspect1) { alice.aspects.create(:name => 'other') }
@@ -20,37 +20,37 @@ describe User::Connecting do
describe '#remove_contact' do
it 'removed non mutual contacts' do
alice.share_with(eve.person, alice.aspects.first)
- lambda {
+ expect {
alice.remove_contact alice.contact_for(eve.person)
- }.should change {
+ }.to change {
alice.contacts(true).count
}.by(-1)
end
it 'removes a contacts receiving flag' do
- bob.contacts.find_by_person_id(alice.person.id).should be_receiving
+ expect(bob.contacts.find_by_person_id(alice.person.id)).to be_receiving
bob.remove_contact(bob.contact_for(alice.person))
- bob.contacts(true).find_by_person_id(alice.person.id).should_not be_receiving
+ expect(bob.contacts(true).find_by_person_id(alice.person.id)).not_to be_receiving
end
end
describe '#disconnected_by' do
it 'calls remove contact' do
- bob.should_receive(:remove_contact).with(bob.contact_for(alice.person), :retracted => true)
+ expect(bob).to receive(:remove_contact).with(bob.contact_for(alice.person), :retracted => true)
bob.disconnected_by(alice.person)
end
it 'removes contact sharing flag' do
- bob.contacts.find_by_person_id(alice.person.id).should be_sharing
+ expect(bob.contacts.find_by_person_id(alice.person.id)).to be_sharing
bob.disconnected_by(alice.person)
- bob.contacts.find_by_person_id(alice.person.id).should_not be_sharing
+ expect(bob.contacts.find_by_person_id(alice.person.id)).not_to be_sharing
end
it 'removes notitications' do
alice.share_with(eve.person, alice.aspects.first)
- Notifications::StartedSharing.where(:recipient_id => eve.id).first.should_not be_nil
+ expect(Notifications::StartedSharing.where(:recipient_id => eve.id).first).not_to be_nil
eve.disconnected_by(alice.person)
- Notifications::StartedSharing.where(:recipient_id => eve.id).first.should be_nil
+ expect(Notifications::StartedSharing.where(:recipient_id => eve.id).first).to be_nil
end
end
@@ -58,14 +58,14 @@ describe User::Connecting do
it 'calls remove contact' do
contact = bob.contact_for(alice.person)
- bob.should_receive(:remove_contact).with(contact, {})
+ expect(bob).to receive(:remove_contact).with(contact, {})
bob.disconnect(contact)
end
it 'dispatches a retraction' do
p = double()
- Postzord::Dispatcher.should_receive(:build).and_return(p)
- p.should_receive(:post)
+ expect(Postzord::Dispatcher).to receive(:build).and_return(p)
+ expect(p).to receive(:post)
bob.disconnect bob.contact_for(eve.person)
end
@@ -75,16 +75,16 @@ describe User::Connecting do
new_aspect = alice.aspects.create(:name => 'new')
alice.add_contact_to_aspect(contact, new_aspect)
- lambda {
+ expect {
alice.disconnect(contact)
- }.should change(contact.aspects(true), :count).from(2).to(0)
+ }.to change(contact.aspects(true), :count).from(2).to(0)
end
end
end
describe '#register_share_visibilities' do
it 'creates post visibilites for up to 100 posts' do
- Post.stub_chain(:where, :limit).and_return([FactoryGirl.create(:status_message)])
+ allow(Post).to receive_message_chain(:where, :limit).and_return([FactoryGirl.create(:status_message)])
c = Contact.create!(:user_id => alice.id, :person_id => eve.person.id)
expect{
alice.register_share_visibilities(c)
@@ -94,43 +94,43 @@ describe User::Connecting do
describe '#share_with' do
it 'finds or creates a contact' do
- lambda {
+ expect {
alice.share_with(eve.person, alice.aspects.first)
- }.should change(alice.contacts, :count).by(1)
+ }.to change(alice.contacts, :count).by(1)
end
it 'does not set mutual on intial share request' do
alice.share_with(eve.person, alice.aspects.first)
- alice.contacts.find_by_person_id(eve.person.id).should_not be_mutual
+ expect(alice.contacts.find_by_person_id(eve.person.id)).not_to be_mutual
end
it 'does set mutual on share-back request' do
eve.share_with(alice.person, eve.aspects.first)
alice.share_with(eve.person, alice.aspects.first)
- alice.contacts.find_by_person_id(eve.person.id).should be_mutual
+ expect(alice.contacts.find_by_person_id(eve.person.id)).to be_mutual
end
it 'adds a contact to an aspect' do
contact = alice.contacts.create(:person => eve.person)
- alice.contacts.stub(:find_or_initialize_by_person_id).and_return(contact)
+ allow(alice.contacts).to receive(:find_or_initialize_by).and_return(contact)
- lambda {
+ expect {
alice.share_with(eve.person, alice.aspects.first)
- }.should change(contact.aspects, :count).by(1)
+ }.to change(contact.aspects, :count).by(1)
end
it 'calls #register_share_visibilities with a contact' do
- eve.should_receive(:register_share_visibilities)
+ expect(eve).to receive(:register_share_visibilities)
eve.share_with(alice.person, eve.aspects.first)
end
context 'dispatching' do
it 'dispatches a request on initial request' do
contact = alice.contacts.new(:person => eve.person)
- alice.contacts.stub(:find_or_initialize_by_person_id).and_return(contact)
+ allow(alice.contacts).to receive(:find_or_initialize_by).and_return(contact)
- contact.should_receive(:dispatch_request)
+ expect(contact).to receive(:dispatch_request)
alice.share_with(eve.person, alice.aspects.first)
end
@@ -138,9 +138,9 @@ describe User::Connecting do
eve.share_with(alice.person, eve.aspects.first)
contact = alice.contact_for(eve.person)
- alice.contacts.stub(:find_or_initialize_by_person_id).and_return(contact)
+ allow(alice.contacts).to receive(:find_or_initialize_by).and_return(contact)
- contact.should_receive(:dispatch_request)
+ expect(contact).to receive(:dispatch_request)
alice.share_with(eve.person, alice.aspects.first)
end
@@ -148,31 +148,31 @@ describe User::Connecting do
a2 = alice.aspects.create(:name => "two")
contact = alice.contacts.create(:person => eve.person, :receiving => true)
- alice.contacts.stub(:find_or_initialize_by_person_id).and_return(contact)
+ allow(alice.contacts).to receive(:find_or_initialize_by).and_return(contact)
- contact.should_not_receive(:dispatch_request)
+ expect(contact).not_to receive(:dispatch_request)
alice.share_with(eve.person, a2)
end
it 'posts profile' do
m = double()
- Postzord::Dispatcher.should_receive(:build).twice.and_return(m)
- m.should_receive(:post).twice
+ expect(Postzord::Dispatcher).to receive(:build).twice.and_return(m)
+ expect(m).to receive(:post).twice
alice.share_with(eve.person, alice.aspects.first)
end
end
it 'sets receiving' do
alice.share_with(eve.person, alice.aspects.first)
- alice.contact_for(eve.person).should be_receiving
+ expect(alice.contact_for(eve.person)).to be_receiving
end
it "should mark the corresponding notification as 'read'" do
notification = FactoryGirl.create(:notification, :target => eve.person)
- Notification.where(:target_id => eve.person.id).first.unread.should be_true
+ expect(Notification.where(:target_id => eve.person.id).first.unread).to be true
alice.share_with(eve.person, aspect)
- Notification.where(:target_id => eve.person.id).first.unread.should be_false
+ expect(Notification.where(:target_id => eve.person.id).first.unread).to be false
end
end
end
diff --git a/spec/models/user/posting_spec.rb b/spec/models/user/posting_spec.rb
index 08544e024..5966ba2bf 100644
--- a/spec/models/user/posting_spec.rb
+++ b/spec/models/user/posting_spec.rb
@@ -4,7 +4,7 @@
require 'spec_helper'
-describe User do
+describe User, :type => :model do
before do
@aspect = alice.aspects.first
@aspect1 = alice.aspects.create(:name => 'other')
@@ -20,48 +20,49 @@ describe User do
end
it 'saves post into visible post ids' do
- lambda {
+ expect {
alice.add_to_streams(@post, @aspects)
- }.should change{alice.visible_shareables(Post, :by_members_of => @aspects).length}.by(1)
- alice.visible_shareables(Post, :by_members_of => @aspects).should include @post
+ }.to change{alice.visible_shareables(Post, :by_members_of => @aspects).length}.by(1)
+ expect(alice.visible_shareables(Post, :by_members_of => @aspects)).to include @post
end
it 'saves post into each aspect in aspect_ids' do
alice.add_to_streams(@post, @aspects)
- @aspect.reload.post_ids.should include @post.id
- @aspect1.reload.post_ids.should include @post.id
+ expect(@aspect.reload.post_ids).to include @post.id
+ expect(@aspect1.reload.post_ids).to include @post.id
end
end
describe '#aspects_from_ids' do
it 'returns a list of all valid aspects a alice can post to' do
aspect_ids = Aspect.all.map(&:id)
- alice.aspects_from_ids(aspect_ids).map{|a| a}.should ==
- alice.aspects.map{|a| a} #RSpec matchers ftw
+ expect(alice.aspects_from_ids(aspect_ids).map{|a| a}).to eq(
+ alice.aspects.map{|a| a}
+ ) #RSpec matchers ftw
end
it "lets you post to your own aspects" do
- alice.aspects_from_ids([@aspect.id]).should == [@aspect]
- alice.aspects_from_ids([@aspect1.id]).should == [@aspect1]
+ expect(alice.aspects_from_ids([@aspect.id])).to eq([@aspect])
+ expect(alice.aspects_from_ids([@aspect1.id])).to eq([@aspect1])
end
it 'removes aspects that are not yours' do
- alice.aspects_from_ids(eve.aspects.first.id).should == []
+ expect(alice.aspects_from_ids(eve.aspects.first.id)).to eq([])
end
end
describe '#build_post' do
it 'sets status_message#text' do
post = alice.build_post(:status_message, :text => "hey", :to => @aspect.id)
- post.text.should == "hey"
+ expect(post.text).to eq("hey")
end
it 'does not save a status_message' do
post = alice.build_post(:status_message, :text => "hey", :to => @aspect.id)
- post.should_not be_persisted
+ expect(post).not_to be_persisted
end
it 'does not save a photo' do
post = alice.build_post(:photo, :user_file => uploaded_photo, :to => @aspect.id)
- post.should_not be_persisted
+ expect(post).not_to be_persisted
end
end
@@ -71,7 +72,7 @@ describe User do
update_hash = {:text => "New caption"}
alice.update_post(photo, update_hash)
- photo.text.should match(/New/)
+ expect(photo.text).to match(/New/)
end
end
end
diff --git a/spec/models/user/querying_spec.rb b/spec/models/user/querying_spec.rb
index b24a3be00..9d8a0ff14 100644
--- a/spec/models/user/querying_spec.rb
+++ b/spec/models/user/querying_spec.rb
@@ -4,7 +4,7 @@
require 'spec_helper'
-describe User::Querying do
+describe User::Querying, :type => :model do
before do
@alices_aspect = alice.aspects.where(:name => "generic").first
@eves_aspect = eve.aspects.where(:name => "generic").first
@@ -14,12 +14,12 @@ describe User::Querying do
describe "#visible_shareable_ids" do
it "contains your public posts" do
public_post = alice.post(:status_message, :text => "hi", :to => @alices_aspect.id, :public => true)
- alice.visible_shareable_ids(Post).should include(public_post.id)
+ expect(alice.visible_shareable_ids(Post)).to include(public_post.id)
end
it "contains your non-public posts" do
private_post = alice.post(:status_message, :text => "hi", :to => @alices_aspect.id, :public => false)
- alice.visible_shareable_ids(Post).should include(private_post.id)
+ expect(alice.visible_shareable_ids(Post)).to include(private_post.id)
end
it "contains public posts from people you're following" do
@@ -30,37 +30,37 @@ describe User::Querying do
eves_public_post = eve.post(:status_message, :text => "hello", :to => 'all', :public => true)
# Alice should see it
- alice.visible_shareable_ids(Post).should include(eves_public_post.id)
+ expect(alice.visible_shareable_ids(Post)).to include(eves_public_post.id)
end
it "does not contain non-public posts from people who are following you" do
eve.share_with(alice.person, @eves_aspect)
eves_post = eve.post(:status_message, :text => "hello", :to => @eves_aspect.id)
- alice.visible_shareable_ids(Post).should_not include(eves_post.id)
+ expect(alice.visible_shareable_ids(Post)).not_to include(eves_post.id)
end
it "does not contain non-public posts from aspects you're not in" do
dogs = bob.aspects.create(:name => "dogs")
invisible_post = bob.post(:status_message, :text => "foobar", :to => dogs.id)
- alice.visible_shareable_ids(Post).should_not include(invisible_post.id)
+ expect(alice.visible_shareable_ids(Post)).not_to include(invisible_post.id)
end
it "does not contain pending posts" do
pending_post = bob.post(:status_message, :text => "hey", :public => true, :to => @bobs_aspect.id, :pending => true)
- pending_post.should be_pending
- alice.visible_shareable_ids(Post).should_not include pending_post.id
+ expect(pending_post).to be_pending
+ expect(alice.visible_shareable_ids(Post)).not_to include pending_post.id
end
it "does not contain pending photos" do
pending_photo = bob.post(:photo, :pending => true, :user_file=> File.open(photo_fixture_name), :to => @bobs_aspect)
- alice.visible_shareable_ids(Photo).should_not include pending_photo.id
+ expect(alice.visible_shareable_ids(Photo)).not_to include pending_photo.id
end
it "respects the :type option" do
post = bob.post(:status_message, :text => "hey", :public => true, :to => @bobs_aspect.id, :pending => false)
reshare = bob.post(:reshare, :pending => false, :root_guid => post.guid, :to => @bobs_aspect)
- alice.visible_shareable_ids(Post, :type => "Reshare").should include(reshare.id)
- alice.visible_shareable_ids(Post, :type => 'StatusMessage').should_not include(reshare.id)
+ expect(alice.visible_shareable_ids(Post, :type => "Reshare")).to include(reshare.id)
+ expect(alice.visible_shareable_ids(Post, :type => 'StatusMessage')).not_to include(reshare.id)
end
it "does not contain duplicate posts" do
@@ -70,8 +70,8 @@ describe User::Querying do
bobs_post = bob.post(:status_message, :text => "hai to all my people", :to => [@bobs_aspect.id, bobs_other_aspect.id])
- alice.visible_shareable_ids(Post).length.should == 1
- alice.visible_shareable_ids(Post).should include(bobs_post.id)
+ expect(alice.visible_shareable_ids(Post).length).to eq(1)
+ expect(alice.visible_shareable_ids(Post)).to include(bobs_post.id)
end
describe 'hidden posts' do
@@ -81,13 +81,13 @@ describe User::Querying do
end
it "pulls back non hidden posts" do
- alice.visible_shareable_ids(Post).include?(@status.id).should be_true
+ expect(alice.visible_shareable_ids(Post).include?(@status.id)).to be true
end
it "does not pull back hidden posts" do
visibility = @status.share_visibilities(Post).where(:contact_id => alice.contact_for(bob.person).id).first
visibility.update_attributes(:hidden => true)
- alice.visible_shareable_ids(Post).include?(@status.id).should be_false
+ expect(alice.visible_shareable_ids(Post).include?(@status.id)).to be false
end
end
end
@@ -95,8 +95,8 @@ describe User::Querying do
describe "#prep_opts" do
it "defaults the opts" do
time = Time.now
- Time.stub(:now).and_return(time)
- alice.send(:prep_opts, Post, {}).should == {
+ allow(Time).to receive(:now).and_return(time)
+ expect(alice.send(:prep_opts, Post, {})).to eq({
:type => Stream::Base::TYPES_OF_POST_IN_STREAM,
:order => 'created_at DESC',
:limit => 15,
@@ -104,14 +104,14 @@ describe User::Querying do
:order_field => :created_at,
:order_with_table => "posts.created_at DESC",
:max_time => time + 1
- }
+ })
end
end
describe "#visible_shareables" do
it 'never contains posts from people not in your aspects' do
FactoryGirl.create(:status_message, :public => true)
- bob.visible_shareables(Post).count.should == 0
+ expect(bob.visible_shareables(Post).count(:all)).to eq(0)
end
context 'with two posts with the same timestamp' do
@@ -124,8 +124,8 @@ describe User::Querying do
end
it "returns them in reverse creation order" do
- bob.visible_shareables(Post).first.text.should == "second"
- bob.visible_shareables(Post).last.text.should == "first"
+ expect(bob.visible_shareables(Post).first.text).to eq("second")
+ expect(bob.visible_shareables(Post).last.text).to eq("first")
end
end
@@ -146,40 +146,40 @@ describe User::Querying do
end
it 'works' do # The set up takes a looong time, so to save time we do several tests in one
- bob.visible_shareables(Post).length.should == 15 #it returns 15 by default
- bob.visible_shareables(Post).map(&:id).should == bob.visible_shareables(Post, :by_members_of => bob.aspects.map { |a| a.id }).map(&:id) # it is the same when joining through aspects
+ expect(bob.visible_shareables(Post).length).to eq(15) #it returns 15 by default
+ expect(bob.visible_shareables(Post).map(&:id)).to eq(bob.visible_shareables(Post, :by_members_of => bob.aspects.map { |a| a.id }).map(&:id)) # it is the same when joining through aspects
# checks the default sort order
- bob.visible_shareables(Post).sort_by { |p| p.created_at }.map { |p| p.id }.should == bob.visible_shareables(Post).map { |p| p.id }.reverse #it is sorted updated_at desc by default
+ expect(bob.visible_shareables(Post).sort_by { |p| p.created_at }.map { |p| p.id }).to eq(bob.visible_shareables(Post).map { |p| p.id }.reverse) #it is sorted updated_at desc by default
# It should respect the order option
opts = {:order => 'created_at DESC'}
- bob.visible_shareables(Post, opts).first.created_at.should > bob.visible_shareables(Post, opts).last.created_at
+ expect(bob.visible_shareables(Post, opts).first.created_at).to be > bob.visible_shareables(Post, opts).last.created_at
# It should respect the order option
opts = {:order => 'updated_at DESC'}
- bob.visible_shareables(Post, opts).first.updated_at.should > bob.visible_shareables(Post, opts).last.updated_at
+ expect(bob.visible_shareables(Post, opts).first.updated_at).to be > bob.visible_shareables(Post, opts).last.updated_at
# It should respect the limit option
opts = {:limit => 40}
- bob.visible_shareables(Post, opts).length.should == 40
- bob.visible_shareables(Post, opts).map(&:id).should == bob.visible_shareables(Post, opts.merge(:by_members_of => bob.aspects.map { |a| a.id })).map(&:id)
- bob.visible_shareables(Post, opts).sort_by { |p| p.created_at }.map { |p| p.id }.should == bob.visible_shareables(Post, opts).map { |p| p.id }.reverse
+ expect(bob.visible_shareables(Post, opts).length).to eq(40)
+ expect(bob.visible_shareables(Post, opts).map(&:id)).to eq(bob.visible_shareables(Post, opts.merge(:by_members_of => bob.aspects.map { |a| a.id })).map(&:id))
+ expect(bob.visible_shareables(Post, opts).sort_by { |p| p.created_at }.map { |p| p.id }).to eq(bob.visible_shareables(Post, opts).map { |p| p.id }.reverse)
# It should paginate using a datetime timestamp
last_time_of_last_page = bob.visible_shareables(Post).last.created_at
opts = {:max_time => last_time_of_last_page}
- bob.visible_shareables(Post, opts).length.should == 15
- bob.visible_shareables(Post, opts).map { |p| p.id }.should == bob.visible_shareables(Post, opts.merge(:by_members_of => bob.aspects.map { |a| a.id })).map { |p| p.id }
- bob.visible_shareables(Post, opts).sort_by { |p| p.created_at}.map { |p| p.id }.should == bob.visible_shareables(Post, opts).map { |p| p.id }.reverse
- bob.visible_shareables(Post, opts).map { |p| p.id }.should == bob.visible_shareables(Post, :limit => 40)[15...30].map { |p| p.id } #pagination should return the right posts
+ expect(bob.visible_shareables(Post, opts).length).to eq(15)
+ expect(bob.visible_shareables(Post, opts).map { |p| p.id }).to eq(bob.visible_shareables(Post, opts.merge(:by_members_of => bob.aspects.map { |a| a.id })).map { |p| p.id })
+ expect(bob.visible_shareables(Post, opts).sort_by { |p| p.created_at}.map { |p| p.id }).to eq(bob.visible_shareables(Post, opts).map { |p| p.id }.reverse)
+ expect(bob.visible_shareables(Post, opts).map { |p| p.id }).to eq(bob.visible_shareables(Post, :limit => 40)[15...30].map { |p| p.id }) #pagination should return the right posts
# It should paginate using an integer timestamp
opts = {:max_time => last_time_of_last_page.to_i}
- bob.visible_shareables(Post, opts).length.should == 15
- bob.visible_shareables(Post, opts).map { |p| p.id }.should == bob.visible_shareables(Post, opts.merge(:by_members_of => bob.aspects.map { |a| a.id })).map { |p| p.id }
- bob.visible_shareables(Post, opts).sort_by { |p| p.created_at}.map { |p| p.id }.should == bob.visible_shareables(Post, opts).map { |p| p.id }.reverse
- bob.visible_shareables(Post, opts).map { |p| p.id }.should == bob.visible_shareables(Post, :limit => 40)[15...30].map { |p| p.id } #pagination should return the right posts
+ expect(bob.visible_shareables(Post, opts).length).to eq(15)
+ expect(bob.visible_shareables(Post, opts).map { |p| p.id }).to eq(bob.visible_shareables(Post, opts.merge(:by_members_of => bob.aspects.map { |a| a.id })).map { |p| p.id })
+ expect(bob.visible_shareables(Post, opts).sort_by { |p| p.created_at}.map { |p| p.id }).to eq(bob.visible_shareables(Post, opts).map { |p| p.id }.reverse)
+ expect(bob.visible_shareables(Post, opts).map { |p| p.id }).to eq(bob.visible_shareables(Post, :limit => 40)[15...30].map { |p| p.id }) #pagination should return the right posts
end
end
end
@@ -187,19 +187,19 @@ describe User::Querying do
describe '#find_visible_shareable_by_id' do
it "returns a post if you can see it" do
bobs_post = bob.post(:status_message, :text => "hi", :to => @bobs_aspect.id, :public => false)
- alice.find_visible_shareable_by_id(Post, bobs_post.id).should == bobs_post
+ expect(alice.find_visible_shareable_by_id(Post, bobs_post.id)).to eq(bobs_post)
end
it "returns nil if you can't see that post" do
dogs = bob.aspects.create(:name => "dogs")
invisible_post = bob.post(:status_message, :text => "foobar", :to => dogs.id)
- alice.find_visible_shareable_by_id(Post, invisible_post.id).should be_nil
+ expect(alice.find_visible_shareable_by_id(Post, invisible_post.id)).to be_nil
end
end
context 'with two users' do
describe '#people_in_aspects' do
it 'returns people objects for a users contact in each aspect' do
- alice.people_in_aspects([@alices_aspect]).should == [bob.person]
+ expect(alice.people_in_aspects([@alices_aspect])).to eq([bob.person])
end
it 'returns local/remote people objects for a users contact in each aspect' do
@@ -220,22 +220,22 @@ describe User::Querying do
local_person.save
local_person.reload
- alice.people_in_aspects([@alices_aspect]).count.should == 4
- alice.people_in_aspects([@alices_aspect], :type => 'remote').count.should == 1
- alice.people_in_aspects([@alices_aspect], :type => 'local').count.should == 3
+ expect(alice.people_in_aspects([@alices_aspect]).count).to eq(4)
+ expect(alice.people_in_aspects([@alices_aspect], :type => 'remote').count).to eq(1)
+ expect(alice.people_in_aspects([@alices_aspect], :type => 'local').count).to eq(3)
end
it 'does not return people not connected to user on same pod' do
3.times { FactoryGirl.create(:user) }
- alice.people_in_aspects([@alices_aspect]).count.should == 1
+ expect(alice.people_in_aspects([@alices_aspect]).count).to eq(1)
end
it "only returns non-pending contacts" do
- alice.people_in_aspects([@alices_aspect]).should == [bob.person]
+ expect(alice.people_in_aspects([@alices_aspect])).to eq([bob.person])
end
it "returns an empty array when passed an aspect the user doesn't own" do
- alice.people_in_aspects([@eves_aspect]).should == []
+ expect(alice.people_in_aspects([@eves_aspect])).to eq([])
end
end
end
@@ -250,7 +250,7 @@ describe User::Querying do
it 'returns a contact' do
contact = Contact.create(:user => alice, :person => person_one, :aspects => [aspect])
alice.contacts << contact
- alice.contact_for_person_id(person_one.id).should be_true
+ expect(alice.contact_for_person_id(person_one.id)).to be_truthy
end
it 'returns the correct contact' do
@@ -263,28 +263,28 @@ describe User::Querying do
contact3 = Contact.create(:user => alice, :person => person_three, :aspects => [aspect])
alice.contacts << contact3
- alice.contact_for_person_id(person_two.id).person.should == person_two
+ expect(alice.contact_for_person_id(person_two.id).person).to eq(person_two)
end
it 'returns nil for a non-contact' do
- alice.contact_for_person_id(person_one.id).should be_nil
+ expect(alice.contact_for_person_id(person_one.id)).to be_nil
end
it 'returns nil when someone else has contact with the target' do
contact = Contact.create(:user => alice, :person => person_one, :aspects => [aspect])
alice.contacts << contact
- eve.contact_for_person_id(person_one.id).should be_nil
+ expect(eve.contact_for_person_id(person_one.id)).to be_nil
end
end
describe '#contact_for' do
it 'takes a person_id and returns a contact' do
- alice.should_receive(:contact_for_person_id).with(person_one.id)
+ expect(alice).to receive(:contact_for_person_id).with(person_one.id)
alice.contact_for(person_one)
end
it 'returns nil if the input is nil' do
- alice.contact_for(nil).should be_nil
+ expect(alice.contact_for(nil)).to be_nil
end
end
@@ -294,7 +294,7 @@ describe User::Querying do
end
it 'should return the aspects with given contact' do
- alice.aspects_with_person(@connected_person).should == [@alices_aspect]
+ expect(alice.aspects_with_person(@connected_person)).to eq([@alices_aspect])
end
it 'returns multiple aspects if the person is there' do
@@ -302,11 +302,25 @@ describe User::Querying do
contact = alice.contact_for(@connected_person)
alice.add_contact_to_aspect(contact, aspect2)
- alice.aspects_with_person(@connected_person).to_set.should == alice.aspects.to_set
+ expect(alice.aspects_with_person(@connected_person).to_set).to eq(alice.aspects.to_set)
end
end
end
+ describe "#block_for" do
+ let(:person) { FactoryGirl.create :person }
+
+ before do
+ eve.blocks.create({person: person})
+ end
+
+ it 'returns the block' do
+ block = eve.block_for(person)
+ expect(block).to be_present
+ expect(block.person.id).to be person.id
+ end
+ end
+
describe '#posts_from' do
before do
@user3 = FactoryGirl.create(:user)
@@ -317,11 +331,11 @@ describe User::Querying do
end
it 'displays public posts for a non-contact' do
- alice.posts_from(@user3.person).should include @public_message
+ expect(alice.posts_from(@user3.person)).to include @public_message
end
it 'does not display private posts for a non-contact' do
- alice.posts_from(@user3.person).should_not include @private_message
+ expect(alice.posts_from(@user3.person)).not_to include @private_message
end
it 'displays private and public posts for a non-contact after connecting' do
@@ -330,8 +344,8 @@ describe User::Querying do
alice.reload
- alice.posts_from(@user3.person).should include @public_message
- alice.posts_from(@user3.person).should include new_message
+ expect(alice.posts_from(@user3.person)).to include @public_message
+ expect(alice.posts_from(@user3.person)).to include new_message
end
it 'displays recent posts first' do
@@ -342,7 +356,7 @@ describe User::Querying do
msg4.created_at = Time.now+14
msg4.save!
- alice.posts_from(@user3.person).map { |p| p.id }.should == [msg4, msg3, @public_message].map { |p| p.id }
+ expect(alice.posts_from(@user3.person).map { |p| p.id }).to eq([msg4, msg3, @public_message].map { |p| p.id })
end
end
end
diff --git a/spec/models/user/social_actions_spec.rb b/spec/models/user/social_actions_spec.rb
index de486010d..74a67608b 100644
--- a/spec/models/user/social_actions_spec.rb
+++ b/spec/models/user/social_actions_spec.rb
@@ -1,6 +1,6 @@
require "spec_helper"
-describe User::SocialActions do
+describe User::SocialActions, :type => :model do
before do
@bobs_aspect = bob.aspects.where(:name => "generic").first
@status = bob.post(:status_message, :text => "hello", :to => @bobs_aspect.id)
@@ -8,39 +8,39 @@ describe User::SocialActions do
describe 'User#comment!' do
it "sets the comment text" do
- alice.comment!(@status, "unicorn_mountain").text.should == "unicorn_mountain"
+ expect(alice.comment!(@status, "unicorn_mountain").text).to eq("unicorn_mountain")
end
it "creates a partcipation" do
- lambda{ alice.comment!(@status, "bro") }.should change(Participation, :count).by(1)
- alice.participations.last.target.should == @status
+ expect{ alice.comment!(@status, "bro") }.to change(Participation, :count).by(1)
+ expect(alice.participations.last.target).to eq(@status)
end
it "creates the comment" do
- lambda{ alice.comment!(@status, "bro") }.should change(Comment, :count).by(1)
+ expect{ alice.comment!(@status, "bro") }.to change(Comment, :count).by(1)
end
it "federates" do
- Participation::Generator.any_instance.stub(:create!)
- Postzord::Dispatcher.should_receive(:defer_build_and_post)
+ allow_any_instance_of(Participation::Generator).to receive(:create!)
+ expect(Postzord::Dispatcher).to receive(:defer_build_and_post)
alice.comment!(@status, "omg")
end
end
describe 'User#like!' do
it "creates a partcipation" do
- lambda{ alice.like!(@status) }.should change(Participation, :count).by(1)
- alice.participations.last.target.should == @status
+ expect{ alice.like!(@status) }.to change(Participation, :count).by(1)
+ expect(alice.participations.last.target).to eq(@status)
end
it "creates the like" do
- lambda{ alice.like!(@status) }.should change(Like, :count).by(1)
+ expect{ alice.like!(@status) }.to change(Like, :count).by(1)
end
it "federates" do
#participation and like
- Participation::Generator.any_instance.stub(:create!)
- Postzord::Dispatcher.should_receive(:defer_build_and_post)
+ allow_any_instance_of(Participation::Generator).to receive(:create!)
+ expect(Postzord::Dispatcher).to receive(:defer_build_and_post)
alice.like!(@status)
end
end
@@ -52,27 +52,27 @@ describe User::SocialActions do
end
it "creates a partcipation" do
- lambda{ alice.like!(@status) }.should change(Participation, :count).by(1)
+ expect{ alice.like!(@status) }.to change(Participation, :count).by(1)
end
it "creates the like" do
- lambda{ alice.like!(@status) }.should change(Like, :count).by(1)
+ expect{ alice.like!(@status) }.to change(Like, :count).by(1)
end
it "federates" do
#participation and like
- Postzord::Dispatcher.should_receive(:defer_build_and_post).twice
+ expect(Postzord::Dispatcher).to receive(:defer_build_and_post).twice
alice.like!(@status)
end
it "should be able to like on one's own status" do
like = alice.like!(@status)
- @status.reload.likes.first.should == like
+ expect(@status.reload.likes.first).to eq(like)
end
it "should be able to like on a contact's status" do
like = bob.like!(@status)
- @status.reload.likes.first.should == like
+ expect(@status.reload.likes.first).to eq(like)
end
it "does not allow multiple likes" do
@@ -80,7 +80,7 @@ describe User::SocialActions do
likes = @status.likes
expect { alice.like!(@status) }.to raise_error
- @status.reload.likes.should == likes
+ expect(@status.reload.likes).to eq(likes)
end
end
@@ -93,21 +93,21 @@ describe User::SocialActions do
end
it "federates" do
- Participation::Generator.any_instance.stub(:create!)
- Postzord::Dispatcher.should_receive(:defer_build_and_post)
+ allow_any_instance_of(Participation::Generator).to receive(:create!)
+ expect(Postzord::Dispatcher).to receive(:defer_build_and_post)
alice.participate_in_poll!(@status, @answer)
end
it "creates a partcipation" do
- lambda{ alice.participate_in_poll!(@status, @answer) }.should change(Participation, :count).by(1)
+ expect{ alice.participate_in_poll!(@status, @answer) }.to change(Participation, :count).by(1)
end
it "creates the poll participation" do
- lambda{ alice.participate_in_poll!(@status, @answer) }.should change(PollParticipation, :count).by(1)
+ expect{ alice.participate_in_poll!(@status, @answer) }.to change(PollParticipation, :count).by(1)
end
it "sets the poll answer id" do
- alice.participate_in_poll!(@status, @answer).poll_answer.should == @answer
+ expect(alice.participate_in_poll!(@status, @answer).poll_answer).to eq(@answer)
end
end
end \ No newline at end of file
diff --git a/spec/models/user_preference_spec.rb b/spec/models/user_preference_spec.rb
index 25bbe15d2..022b54db8 100644
--- a/spec/models/user_preference_spec.rb
+++ b/spec/models/user_preference_spec.rb
@@ -1,9 +1,9 @@
require 'spec_helper'
-describe UserPreference do
+describe UserPreference, :type => :model do
it 'should only allow valid email types to exist' do
pref = alice.user_preferences.new(:email_type => 'not_valid')
- pref.should_not be_valid
+ expect(pref).not_to be_valid
end
end
diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb
index d56bd6932..fc5a94404 100644
--- a/spec/models/user_spec.rb
+++ b/spec/models/user_spec.rb
@@ -4,18 +4,18 @@
require 'spec_helper'
-describe User do
+describe User, :type => :model do
context "relations" do
context "#conversations" do
it "doesn't find anything when there is nothing to find" do
u = FactoryGirl.create(:user)
- u.conversations.should be_empty
+ expect(u.conversations).to be_empty
end
it "finds the users conversations" do
c = FactoryGirl.create(:conversation, { author: alice.person })
- alice.conversations.should include c
+ expect(alice.conversations).to include c
end
it "doesn't find other users conversations" do
@@ -23,23 +23,23 @@ describe User do
c2 = FactoryGirl.create(:conversation)
c_own = FactoryGirl.create(:conversation, { author: alice.person })
- alice.conversations.should include c_own
- alice.conversations.should_not include c1
- alice.conversations.should_not include c2
+ expect(alice.conversations).to include c_own
+ expect(alice.conversations).not_to include c1
+ expect(alice.conversations).not_to include c2
end
end
end
describe "private key" do
it 'has a key' do
- alice.encryption_key.should_not be nil
+ expect(alice.encryption_key).not_to be nil
end
it 'marshalls the key to and from the db correctly' do
user = User.build(:username => 'max', :email => 'foo@bar.com', :password => 'password', :password_confirmation => 'password')
user.save!
- user.serialized_private_key.should be_present
+ expect(user.serialized_private_key).to be_present
expect{
user.reload.encryption_key
@@ -52,14 +52,14 @@ describe User do
user = FactoryGirl.build(:user)
user.last_seen = Time.now - 1.month
user.save
- User.yearly_actives.should include user
+ expect(User.yearly_actives).to include user
end
it 'returns list which does not include users seen within last year' do
user = FactoryGirl.build(:user)
user.last_seen = Time.now - 2.year
user.save
- User.yearly_actives.should_not include user
+ expect(User.yearly_actives).not_to include user
end
end
@@ -68,14 +68,14 @@ describe User do
user = FactoryGirl.build(:user)
user.last_seen = Time.now - 1.day
user.save
- User.monthly_actives.should include user
+ expect(User.monthly_actives).to include user
end
it 'returns list which does not include users seen within last month' do
user = FactoryGirl.build(:user)
user.last_seen = Time.now - 2.month
user.save
- User.monthly_actives.should_not include user
+ expect(User.monthly_actives).not_to include user
end
end
@@ -84,14 +84,14 @@ describe User do
user = FactoryGirl.build(:user)
user.last_seen = Time.now - 1.hour
user.save
- User.daily_actives.should include(user)
+ expect(User.daily_actives).to include(user)
end
it 'returns list which does not include users seen within last day' do
user = FactoryGirl.build(:user)
user.last_seen = Time.now - 2.day
user.save
- User.daily_actives.should_not include(user)
+ expect(User.daily_actives).not_to include(user)
end
end
@@ -100,14 +100,14 @@ describe User do
user = FactoryGirl.build(:user)
user.last_seen = Time.now - 4.month
user.save
- User.halfyear_actives.should include user
+ expect(User.halfyear_actives).to include user
end
it 'returns list which does not include users seen within the last half a year' do
user = FactoryGirl.build(:user)
user.last_seen = Time.now - 7.month
user.save
- User.halfyear_actives.should_not include user
+ expect(User.halfyear_actives).not_to include user
end
end
@@ -115,12 +115,12 @@ describe User do
describe '#save_person!' do
it 'saves the corresponding user if it has changed' do
alice.person.url = "http://stuff.com"
- Person.any_instance.should_receive(:save)
+ expect_any_instance_of(Person).to receive(:save)
alice.save
end
it 'does not save the corresponding user if it has not changed' do
- Person.any_instance.should_not_receive(:save)
+ expect_any_instance_of(Person).not_to receive(:save)
alice.save
end
end
@@ -134,13 +134,13 @@ describe User do
end
it 'is a hash' do
- alice.hidden_shareables.should == {}
+ expect(alice.hidden_shareables).to eq({})
end
describe '#add_hidden_shareable' do
it 'adds the share id to an array which is keyed by the objects class' do
alice.add_hidden_shareable(@sm_class, @sm_id)
- alice.hidden_shareables['Post'].should == [@sm_id]
+ expect(alice.hidden_shareables['Post']).to eq([@sm_id])
end
it 'handles having multiple posts' do
@@ -148,7 +148,7 @@ describe User do
alice.add_hidden_shareable(@sm_class, @sm_id)
alice.add_hidden_shareable(sm2.class.base_class.to_s, sm2.id.to_s)
- alice.hidden_shareables['Post'].should =~ [@sm_id, sm2.id.to_s]
+ expect(alice.hidden_shareables['Post']).to match_array([@sm_id, sm2.id.to_s])
end
it 'handles having multiple shareable types' do
@@ -156,7 +156,7 @@ describe User do
alice.add_hidden_shareable(photo.class.base_class.to_s, photo.id.to_s)
alice.add_hidden_shareable(@sm_class, @sm_id)
- alice.hidden_shareables['Photo'].should == [photo.id.to_s]
+ expect(alice.hidden_shareables['Photo']).to eq([photo.id.to_s])
end
end
@@ -164,20 +164,20 @@ describe User do
it 'removes the id from the hash if it is there' do
alice.add_hidden_shareable(@sm_class, @sm_id)
alice.remove_hidden_shareable(@sm_class, @sm_id)
- alice.hidden_shareables['Post'].should == []
+ expect(alice.hidden_shareables['Post']).to eq([])
end
end
describe 'toggle_hidden_shareable' do
it 'calls add_hidden_shareable if the key does not exist, and returns true' do
- alice.should_receive(:add_hidden_shareable).with(@sm_class, @sm_id)
- alice.toggle_hidden_shareable(@sm).should be_true
+ expect(alice).to receive(:add_hidden_shareable).with(@sm_class, @sm_id)
+ expect(alice.toggle_hidden_shareable(@sm)).to be true
end
it 'calls remove_hidden_shareable if the key exists' do
- alice.should_receive(:remove_hidden_shareable).with(@sm_class, @sm_id)
+ expect(alice).to receive(:remove_hidden_shareable).with(@sm_class, @sm_id)
alice.add_hidden_shareable(@sm_class, @sm_id)
- alice.toggle_hidden_shareable(@sm).should be_false
+ expect(alice.toggle_hidden_shareable(@sm)).to be false
end
end
@@ -185,12 +185,12 @@ describe User do
it 'returns true if the shareable is hidden' do
post = FactoryGirl.create(:status_message)
bob.toggle_hidden_shareable(post)
- bob.is_shareable_hidden?(post).should be_true
+ expect(bob.is_shareable_hidden?(post)).to be true
end
it 'returns false if the shareable is not present' do
post = FactoryGirl.create(:status_message)
- bob.is_shareable_hidden?(post).should be_false
+ expect(bob.is_shareable_hidden?(post)).to be false
end
end
end
@@ -198,9 +198,9 @@ describe User do
describe 'overwriting people' do
it 'does not overwrite old users with factory' do
- lambda {
+ expect {
new_user = FactoryGirl.create(:user, :id => alice.id)
- }.should raise_error ActiveRecord::StatementInvalid
+ }.to raise_error ActiveRecord::StatementInvalid
end
it 'does not overwrite old users with create' do
@@ -217,8 +217,8 @@ describe User do
params[:id] = alice.id
new_user = User.build(params)
new_user.save
- new_user.persisted?.should be_true
- new_user.id.should_not == alice.id
+ expect(new_user.persisted?).to be true
+ expect(new_user.id).not_to eq(alice.id)
end
end
@@ -226,81 +226,81 @@ describe User do
describe "of associated person" do
it "fails if person is not valid" do
user = alice
- user.should be_valid
+ expect(user).to be_valid
user.person.serialized_public_key = nil
- user.person.should_not be_valid
- user.should_not be_valid
+ expect(user.person).not_to be_valid
+ expect(user).not_to be_valid
- user.errors.full_messages.count.should == 1
- user.errors.full_messages.first.should =~ /Person is invalid/i
+ expect(user.errors.full_messages.count).to eq(1)
+ expect(user.errors.full_messages.first).to match(/Person is invalid/i)
end
end
describe "of username" do
it "requires presence" do
alice.username = nil
- alice.should_not be_valid
+ expect(alice).not_to be_valid
end
it "requires uniqueness" do
alice.username = eve.username
- alice.should_not be_valid
+ expect(alice).not_to be_valid
end
it 'requires uniqueness also amount Person objects with diaspora handle' do
p = FactoryGirl.create(:person, :diaspora_handle => "jimmy#{User.diaspora_id_host}")
alice.username = 'jimmy'
- alice.should_not be_valid
+ expect(alice).not_to be_valid
end
it "downcases username" do
user = FactoryGirl.build(:user, :username => "WeIrDcAsE")
- user.should be_valid
- user.username.should == "weirdcase"
+ expect(user).to be_valid
+ expect(user.username).to eq("weirdcase")
end
it "fails if the requested username is only different in case from an existing username" do
alice.username = eve.username.upcase
- alice.should_not be_valid
+ expect(alice).not_to be_valid
end
it "strips leading and trailing whitespace" do
user = FactoryGirl.build(:user, :username => " janie ")
- user.should be_valid
- user.username.should == "janie"
+ expect(user).to be_valid
+ expect(user.username).to eq("janie")
end
it "fails if there's whitespace in the middle" do
alice.username = "bobby tables"
- alice.should_not be_valid
+ expect(alice).not_to be_valid
end
it 'can not contain non url safe characters' do
alice.username = "kittens;"
- alice.should_not be_valid
+ expect(alice).not_to be_valid
end
it 'should not contain periods' do
alice.username = "kittens."
- alice.should_not be_valid
+ expect(alice).not_to be_valid
end
it "can be 32 characters long" do
alice.username = "hexagoooooooooooooooooooooooooon"
- alice.should be_valid
+ expect(alice).to be_valid
end
it "cannot be 33 characters" do
alice.username = "hexagooooooooooooooooooooooooooon"
- alice.should_not be_valid
+ expect(alice).not_to be_valid
end
it "cannot be one of the blacklist names" do
['hostmaster', 'postmaster', 'root', 'webmaster'].each do |username|
alice.username = username
- alice.should_not be_valid
+ expect(alice).not_to be_valid
end
end
end
@@ -308,37 +308,37 @@ describe User do
describe "of email" do
it "requires email address" do
alice.email = nil
- alice.should_not be_valid
+ expect(alice).not_to be_valid
end
it "requires a unique email address" do
alice.email = eve.email
- alice.should_not be_valid
+ expect(alice).not_to be_valid
end
it "requires a valid email address" do
alice.email = "somebody@anywhere"
- alice.should_not be_valid
+ expect(alice).not_to be_valid
end
end
describe "of unconfirmed_email" do
it "unconfirmed_email address can be nil/blank" do
alice.unconfirmed_email = nil
- alice.should be_valid
+ expect(alice).to be_valid
alice.unconfirmed_email = ""
- alice.should be_valid
+ expect(alice).to be_valid
end
it "does NOT require a unique unconfirmed_email address" do
eve.update_attribute :unconfirmed_email, "new@email.com"
alice.unconfirmed_email = "new@email.com"
- alice.should be_valid
+ expect(alice).to be_valid
end
it "requires a valid unconfirmed_email address" do
alice.unconfirmed_email = "somebody@anywhere"
- alice.should_not be_valid
+ expect(alice).not_to be_valid
end
end
@@ -349,19 +349,19 @@ describe User do
it "requires availability" do
alice.language = 'some invalid language'
- alice.should_not be_valid
+ expect(alice).not_to be_valid
end
it "should save with current language if blank" do
I18n.locale = :fr
user = User.build(:username => 'max', :email => 'foo@bar.com', :password => 'password', :password_confirmation => 'password')
- user.language.should == 'fr'
+ expect(user.language).to eq('fr')
end
it "should save with language what is set" do
I18n.locale = :fr
user = User.build(:username => 'max', :email => 'foo@bar.com', :password => 'password', :password_confirmation => 'password', :language => 'de')
- user.language.should == 'de'
+ expect(user.language).to eq('de')
end
end
end
@@ -384,17 +384,17 @@ describe User do
end
it "does not save" do
- @user.persisted?.should be_false
- @user.person.persisted?.should be_false
- User.find_by_username("ohai").should be_nil
+ expect(@user.persisted?).to be false
+ expect(@user.person.persisted?).to be false
+ expect(User.find_by_username("ohai")).to be_nil
end
it 'saves successfully' do
- @user.should be_valid
- @user.save.should be_true
- @user.persisted?.should be_true
- @user.person.persisted?.should be_true
- User.find_by_username("ohai").should == @user
+ expect(@user).to be_valid
+ expect(@user.save).to be true
+ expect(@user.persisted?).to be true
+ expect(@user.person.persisted?).to be true
+ expect(User.find_by_username("ohai")).to eq(@user)
end
end
@@ -409,19 +409,19 @@ describe User do
end
it "raises no error" do
- lambda { User.build(@invalid_params) }.should_not raise_error
+ expect { User.build(@invalid_params) }.not_to raise_error
end
it "does not save" do
- User.build(@invalid_params).save.should be_false
+ expect(User.build(@invalid_params).save).to be false
end
it 'does not save a person' do
- lambda { User.build(@invalid_params) }.should_not change(Person, :count)
+ expect { User.build(@invalid_params) }.not_to change(Person, :count)
end
it 'does not generate a key' do
- User.should_receive(:generate_key).exactly(0).times
+ expect(User).to receive(:generate_key).exactly(0).times
User.build(@invalid_params)
end
end
@@ -443,7 +443,7 @@ describe User do
end
it "does not assign it to the person" do
- User.build(@invalid_params).person.id.should_not == person.id
+ expect(User.build(@invalid_params).person.id).not_to eq(person.id)
end
end
end
@@ -453,7 +453,7 @@ describe User do
inv = InvitationCode.create(:user => bob)
user = FactoryGirl.build(:user)
user.process_invite_acceptence(inv)
- user.invited_by_id.should == bob.id
+ expect(user.invited_by_id).to eq(bob.id)
end
end
@@ -474,27 +474,27 @@ describe User do
expect {
alice.update_user_preferences({'mentioned' => false})
}.to change(alice.user_preferences, :count).by(@pref_count-1)
- alice.reload.disable_mail.should be_false
+ expect(alice.reload.disable_mail).to be false
end
end
describe ".find_for_database_authentication" do
it 'finds a user' do
- User.find_for_database_authentication(:username => alice.username).should == alice
+ expect(User.find_for_database_authentication(:username => alice.username)).to eq(alice)
end
it 'finds a user by email' do
- User.find_for_database_authentication(:username => alice.email).should == alice
+ expect(User.find_for_database_authentication(:username => alice.email)).to eq(alice)
end
it "does not preserve case" do
- User.find_for_database_authentication(:username => alice.username.upcase).should == alice
+ expect(User.find_for_database_authentication(:username => alice.username.upcase)).to eq(alice)
end
it 'errors out when passed a non-hash' do
- lambda {
+ expect {
User.find_for_database_authentication(alice.username)
- }.should raise_error
+ }.to raise_error
end
end
@@ -509,26 +509,26 @@ describe User do
it 'dispatches the profile when tags are set' do
@params = {:tag_string => '#what #hey'}
mailman = Postzord::Dispatcher.build(alice, Profile.new)
- Postzord::Dispatcher.should_receive(:build).and_return(mailman)
- alice.update_profile(@params).should be_true
+ expect(Postzord::Dispatcher).to receive(:build).and_return(mailman)
+ expect(alice.update_profile(@params)).to be true
end
it 'sends a profile to their contacts' do
mailman = Postzord::Dispatcher.build(alice, Profile.new)
- Postzord::Dispatcher.should_receive(:build).and_return(mailman)
- alice.update_profile(@params).should be_true
+ expect(Postzord::Dispatcher).to receive(:build).and_return(mailman)
+ expect(alice.update_profile(@params)).to be true
end
it 'updates names' do
- alice.update_profile(@params).should be_true
- alice.reload.profile.first_name.should == 'bob'
+ expect(alice.update_profile(@params)).to be true
+ expect(alice.reload.profile.first_name).to eq('bob')
end
it 'updates image_url' do
params = {:image_url => "http://clown.com"}
- alice.update_profile(params).should be_true
- alice.reload.profile.image_url.should == "http://clown.com"
+ expect(alice.update_profile(params)).to be true
+ expect(alice.reload.profile.image_url).to eq("http://clown.com")
end
context 'passing in a photo' do
@@ -542,20 +542,20 @@ describe User do
end
it 'updates image_url' do
- alice.update_profile(@params).should be_true
+ expect(alice.update_profile(@params)).to be true
alice.reload
- alice.profile.image_url.should =~ Regexp.new(@photo.url(:thumb_large))
- alice.profile.image_url_medium.should =~ Regexp.new(@photo.url(:thumb_medium))
- alice.profile.image_url_small.should =~ Regexp.new(@photo.url(:thumb_small))
+ expect(alice.profile.image_url).to match(Regexp.new(@photo.url(:thumb_large)))
+ expect(alice.profile.image_url_medium).to match(Regexp.new(@photo.url(:thumb_medium)))
+ expect(alice.profile.image_url_small).to match(Regexp.new(@photo.url(:thumb_small)))
end
it 'unpends the photo' do
@photo.pending = true
@photo.save!
@photo.reload
- alice.update_profile(@params).should be true
- @photo.reload.pending.should be_false
+ expect(alice.update_profile(@params)).to be true
+ expect(@photo.reload.pending).to be false
end
end
end
@@ -563,7 +563,7 @@ describe User do
describe '#update_post' do
it 'should dispatch post' do
photo = alice.build_post(:photo, :user_file => uploaded_photo, :text => "hello", :to => alice.aspects.first.id)
- alice.should_receive(:dispatch_post).with(photo)
+ expect(alice).to receive(:dispatch_post).with(photo)
alice.update_post(photo, :text => 'hellp')
end
end
@@ -574,23 +574,23 @@ describe User do
end
it 'notifies the user if the incoming post mentions them' do
- @post.should_receive(:mentions?).with(alice.person).and_return(true)
- @post.should_receive(:notify_person).with(alice.person)
+ expect(@post).to receive(:mentions?).with(alice.person).and_return(true)
+ expect(@post).to receive(:notify_person).with(alice.person)
alice.notify_if_mentioned(@post)
end
it 'does not notify the user if the incoming post does not mention them' do
- @post.should_receive(:mentions?).with(alice.person).and_return(false)
- @post.should_not_receive(:notify_person)
+ expect(@post).to receive(:mentions?).with(alice.person).and_return(false)
+ expect(@post).not_to receive(:notify_person)
alice.notify_if_mentioned(@post)
end
it 'does not notify the user if the post author is not a contact' do
@post = FactoryGirl.build(:status_message, :author => eve.person)
- @post.stub(:mentions?).and_return(true)
- @post.should_not_receive(:notify_person)
+ allow(@post).to receive(:mentions?).and_return(true)
+ expect(@post).not_to receive(:notify_person)
alice.notify_if_mentioned(@post)
end
@@ -600,23 +600,23 @@ describe User do
describe '#destroy' do
it 'removes invitations from the user' do
FactoryGirl.create(:invitation, :sender => alice)
- lambda {
+ expect {
alice.destroy
- }.should change {alice.invitations_from_me(true).count }.by(-1)
+ }.to change {alice.invitations_from_me(true).count }.by(-1)
end
it 'removes invitations to the user' do
Invitation.new(:sender => eve, :recipient => alice, :identifier => alice.email, :aspect => eve.aspects.first).save(:validate => false)
- lambda {
+ expect {
alice.destroy
- }.should change {alice.invitations_to_me(true).count }.by(-1)
+ }.to change {alice.invitations_to_me(true).count }.by(-1)
end
it 'removes all service connections' do
Services::Facebook.create(:access_token => 'what', :user_id => alice.id)
- lambda {
+ expect {
alice.destroy
- }.should change {
+ }.to change {
alice.services.count
}.by(-1)
end
@@ -628,13 +628,13 @@ describe User do
alice.disable_mail = false
alice.save
- Workers::Mail::StartedSharing.should_receive(:perform_async).with(alice.id, 'contactrequestid').once
+ expect(Workers::Mail::StartedSharing).to receive(:perform_async).with(alice.id, 'contactrequestid').once
alice.mail(Workers::Mail::StartedSharing, alice.id, 'contactrequestid')
end
it 'does not enqueue a mail job if the correct corresponding job has a preference entry' do
alice.user_preferences.create(:email_type => 'started_sharing')
- Workers::Mail::StartedSharing.should_not_receive(:perform_async)
+ expect(Workers::Mail::StartedSharing).not_to receive(:perform_async)
alice.mail(Workers::Mail::StartedSharing, alice.id, 'contactrequestid')
end
@@ -642,7 +642,7 @@ describe User do
alice.disable_mail = true
alice.save
alice.reload
- Workers::Mail::StartedSharing.should_not_receive(:perform_async)
+ expect(Workers::Mail::StartedSharing).not_to receive(:perform_async)
alice.mail(Workers::Mail::StartedSharing, alice.id, 'contactrequestid')
end
end
@@ -656,13 +656,13 @@ describe User do
describe "#add_contact_to_aspect" do
it 'adds the contact to the aspect' do
- lambda {
+ expect {
alice.add_contact_to_aspect(@contact, @new_aspect)
- }.should change(@new_aspect.contacts, :count).by(1)
+ }.to change(@new_aspect.contacts, :count).by(1)
end
it 'returns true if they are already in the aspect' do
- alice.add_contact_to_aspect(@contact, @original_aspect).should be_true
+ expect(alice.add_contact_to_aspect(@contact, @original_aspect)).to be true
end
end
end
@@ -679,23 +679,23 @@ describe User do
describe '#like_for' do
it 'returns the correct like' do
- alice.like_for(@message).should == @like
- bob.like_for(@message).should == @like2
+ expect(alice.like_for(@message)).to eq(@like)
+ expect(bob.like_for(@message)).to eq(@like2)
end
it "returns nil if there's no like" do
- alice.like_for(@message2).should be_nil
+ expect(alice.like_for(@message2)).to be_nil
end
end
describe '#liked?' do
it "returns true if there's a like" do
- alice.liked?(@message).should be_true
- bob.liked?(@message).should be_true
+ expect(alice.liked?(@message)).to be true
+ expect(bob.liked?(@message)).to be true
end
it "returns false if there's no like" do
- alice.liked?(@message2).should be_false
+ expect(alice.liked?(@message2)).to be false
end
end
end
@@ -705,47 +705,47 @@ describe User do
describe "#unconfirmed_email" do
it "is nil by default" do
- user.unconfirmed_email.should eql(nil)
+ expect(user.unconfirmed_email).to eql(nil)
end
it "forces blank to nil" do
user.unconfirmed_email = ""
user.save!
- user.unconfirmed_email.should eql(nil)
+ expect(user.unconfirmed_email).to eql(nil)
end
it "is ignored if it equals email" do
user.unconfirmed_email = user.email
user.save!
- user.unconfirmed_email.should eql(nil)
+ expect(user.unconfirmed_email).to eql(nil)
end
it "allows change to valid new email" do
user.unconfirmed_email = "alice@newmail.com"
user.save!
- user.unconfirmed_email.should eql("alice@newmail.com")
+ expect(user.unconfirmed_email).to eql("alice@newmail.com")
end
end
describe "#confirm_email_token" do
it "is nil by default" do
- user.confirm_email_token.should eql(nil)
+ expect(user.confirm_email_token).to eql(nil)
end
it "is autofilled when unconfirmed_email is set to new email" do
user.unconfirmed_email = "alice@newmail.com"
user.save!
- user.confirm_email_token.should_not be_blank
- user.confirm_email_token.size.should eql(30)
+ expect(user.confirm_email_token).not_to be_blank
+ expect(user.confirm_email_token.size).to eql(30)
end
it "is set back to nil when unconfirmed_email is empty" do
user.unconfirmed_email = "alice@newmail.com"
user.save!
- user.confirm_email_token.should_not be_blank
+ expect(user.confirm_email_token).not_to be_blank
user.unconfirmed_email = nil
user.save!
- user.confirm_email_token.should eql(nil)
+ expect(user.confirm_email_token).to eql(nil)
end
it "generates new token on every new unconfirmed_email" do
@@ -754,21 +754,21 @@ describe User do
first_token = user.confirm_email_token
user.unconfirmed_email = "alice@andanotherone.com"
user.save!
- user.confirm_email_token.should_not eql(first_token)
- user.confirm_email_token.size.should eql(30)
+ expect(user.confirm_email_token).not_to eql(first_token)
+ expect(user.confirm_email_token.size).to eql(30)
end
end
describe '#mail_confirm_email' do
it 'enqueues a mail job on user with unconfirmed email' do
user.update_attribute(:unconfirmed_email, "alice@newmail.com")
- Workers::Mail::ConfirmEmail.should_receive(:perform_async).with(alice.id).once
- alice.mail_confirm_email.should eql(true)
+ expect(Workers::Mail::ConfirmEmail).to receive(:perform_async).with(alice.id).once
+ expect(alice.mail_confirm_email).to eql(true)
end
it 'enqueues NO mail job on user without unconfirmed email' do
- Workers::Mail::ConfirmEmail.should_not_receive(:perform_async).with(alice.id)
- alice.mail_confirm_email.should eql(false)
+ expect(Workers::Mail::ConfirmEmail).not_to receive(:perform_async).with(alice.id)
+ expect(alice.mail_confirm_email).to eql(false)
end
end
@@ -779,54 +779,54 @@ describe User do
end
it 'confirms email and set the unconfirmed_email to email on valid token' do
- user.confirm_email(user.confirm_email_token).should eql(true)
- user.email.should eql("alice@newmail.com")
- user.unconfirmed_email.should eql(nil)
- user.confirm_email_token.should eql(nil)
+ expect(user.confirm_email(user.confirm_email_token)).to eql(true)
+ expect(user.email).to eql("alice@newmail.com")
+ expect(user.unconfirmed_email).to eql(nil)
+ expect(user.confirm_email_token).to eql(nil)
end
it 'returns false and does not change anything on wrong token' do
- user.confirm_email(user.confirm_email_token.reverse).should eql(false)
- user.email.should_not eql("alice@newmail.com")
- user.unconfirmed_email.should_not eql(nil)
- user.confirm_email_token.should_not eql(nil)
+ expect(user.confirm_email(user.confirm_email_token.reverse)).to eql(false)
+ expect(user.email).not_to eql("alice@newmail.com")
+ expect(user.unconfirmed_email).not_to eql(nil)
+ expect(user.confirm_email_token).not_to eql(nil)
end
it 'returns false and does not change anything on blank token' do
- user.confirm_email("").should eql(false)
- user.email.should_not eql("alice@newmail.com")
- user.unconfirmed_email.should_not eql(nil)
- user.confirm_email_token.should_not eql(nil)
+ expect(user.confirm_email("")).to eql(false)
+ expect(user.email).not_to eql("alice@newmail.com")
+ expect(user.unconfirmed_email).not_to eql(nil)
+ expect(user.confirm_email_token).not_to eql(nil)
end
it 'returns false and does not change anything on blank token' do
- user.confirm_email(nil).should eql(false)
- user.email.should_not eql("alice@newmail.com")
- user.unconfirmed_email.should_not eql(nil)
- user.confirm_email_token.should_not eql(nil)
+ expect(user.confirm_email(nil)).to eql(false)
+ expect(user.email).not_to eql("alice@newmail.com")
+ expect(user.unconfirmed_email).not_to eql(nil)
+ expect(user.confirm_email_token).not_to eql(nil)
end
end
context 'on user without unconfirmed email' do
it 'returns false and does not change anything on any token' do
- user.confirm_email("12345"*6).should eql(false)
- user.email.should_not eql("alice@newmail.com")
- user.unconfirmed_email.should eql(nil)
- user.confirm_email_token.should eql(nil)
+ expect(user.confirm_email("12345"*6)).to eql(false)
+ expect(user.email).not_to eql("alice@newmail.com")
+ expect(user.unconfirmed_email).to eql(nil)
+ expect(user.confirm_email_token).to eql(nil)
end
it 'returns false and does not change anything on blank token' do
- user.confirm_email("").should eql(false)
- user.email.should_not eql("alice@newmail.com")
- user.unconfirmed_email.should eql(nil)
- user.confirm_email_token.should eql(nil)
+ expect(user.confirm_email("")).to eql(false)
+ expect(user.email).not_to eql("alice@newmail.com")
+ expect(user.unconfirmed_email).to eql(nil)
+ expect(user.confirm_email_token).to eql(nil)
end
it 'returns false and does not change anything on blank token' do
- user.confirm_email(nil).should eql(false)
- user.email.should_not eql("alice@newmail.com")
- user.unconfirmed_email.should eql(nil)
- user.confirm_email_token.should eql(nil)
+ expect(user.confirm_email(nil)).to eql(false)
+ expect(user.email).not_to eql("alice@newmail.com")
+ expect(user.unconfirmed_email).to eql(nil)
+ expect(user.confirm_email_token).to eql(nil)
end
end
end
@@ -841,14 +841,14 @@ describe User do
context "posts" do
before do
- SignedRetraction.stub(:build).and_return(@retraction)
- @retraction.stub(:perform)
+ allow(SignedRetraction).to receive(:build).and_return(@retraction)
+ allow(@retraction).to receive(:perform)
end
it 'sends a retraction' do
dispatcher = double
- Postzord::Dispatcher.should_receive(:build).with(bob, @retraction, anything()).and_return(dispatcher)
- dispatcher.should_receive(:post)
+ expect(Postzord::Dispatcher).to receive(:build).with(bob, @retraction, anything()).and_return(dispatcher)
+ expect(dispatcher).to receive(:post)
bob.retract(@post)
end
@@ -859,8 +859,8 @@ describe User do
@post.reshares << reshare
dispatcher = double
- Postzord::Dispatcher.should_receive(:build).with(bob, @retraction, {:additional_subscribers => [person], :services => anything}).and_return(dispatcher)
- dispatcher.should_receive(:post)
+ expect(Postzord::Dispatcher).to receive(:build).with(bob, @retraction, {:additional_subscribers => [person], :services => anything}).and_return(dispatcher)
+ expect(dispatcher).to receive(:post)
bob.retract(@post)
end
@@ -870,7 +870,7 @@ describe User do
describe "#send_reset_password_instructions" do
it "queues up a job to send the reset password instructions" do
user = FactoryGirl.create :user
- Workers::ResetPassword.should_receive(:perform_async).with(user.id)
+ expect(Workers::ResetPassword).to receive(:perform_async).with(user.id)
user.send_reset_password_instructions
end
end
@@ -886,7 +886,7 @@ describe User do
[I18n.t('aspects.seed.family'), I18n.t('aspects.seed.friends'),
I18n.t('aspects.seed.work'), I18n.t('aspects.seed.acquaintances')].each do |aspect_name|
it "creates an aspect named #{aspect_name} for the user" do
- user.aspects.find_by_name(aspect_name).should_not be_nil
+ expect(user.aspects.find_by_name(aspect_name)).not_to be_nil
end
end
end
@@ -896,24 +896,14 @@ describe User do
FactoryGirl.create(:user)
}
- before(:each) do
- @old_autofollow_value = AppConfig.settings.autofollow_on_join?
- @old_autofollow_user = AppConfig.settings.autofollow_on_join_user
- end
-
- after(:each) do
- AppConfig.settings.autofollow_on_join = @old_followhq_value
- AppConfig.settings.autofollow_on_join_user = @old_autofollow_user
- end
-
context "with autofollow sharing enabled" do
it "should start sharing with autofollow account" do
AppConfig.settings.autofollow_on_join = true
AppConfig.settings.autofollow_on_join_user = 'one'
wf_double = double
- wf_double.should_receive(:fetch)
- Webfinger.should_receive(:new).with('one').and_return(wf_double)
+ expect(wf_double).to receive(:fetch)
+ expect(Webfinger).to receive(:new).with('one').and_return(wf_double)
user.seed_aspects
end
@@ -923,7 +913,7 @@ describe User do
it "should not start sharing with the diasporahq account" do
AppConfig.settings.autofollow_on_join = false
- Webfinger.should_not_receive(:new)
+ expect(Webfinger).not_to receive(:new)
user.seed_aspects
end
@@ -939,7 +929,7 @@ describe User do
describe "#close_account!" do
it 'locks the user out' do
@user.close_account!
- @user.reload.access_locked?.should be_true
+ expect(@user.reload.access_locked?).to be true
end
it 'creates an account deletion' do
@@ -949,7 +939,7 @@ describe User do
end
it 'calls person#lock_access!' do
- @user.person.should_receive(:lock_access!)
+ expect(@user.person).to receive(:lock_access!)
@user.close_account!
end
end
@@ -957,7 +947,7 @@ describe User do
describe "#clear_account!" do
it 'resets the password to a random string' do
random_pass = "12345678909876543210"
- SecureRandom.should_receive(:hex).and_return(random_pass)
+ expect(SecureRandom).to receive(:hex).and_return(random_pass)
@user.clear_account!
@user.valid_password?(random_pass)
end
@@ -969,15 +959,27 @@ describe User do
@user.reload
attributes.each do |attr|
- @user.send(attr.to_sym).should be_blank
+ expect(@user.send(attr.to_sym)).to be_blank
end
end
+
+ it 'disables mail' do
+ @user.disable_mail = false
+ @user.clear_account!
+ expect(@user.reload.disable_mail).to be true
+ end
+
+ it 'sets getting_started and show_community_spotlight_in_stream fields to false' do
+ @user.clear_account!
+ expect(@user.reload.getting_started).to be false
+ expect(@user.reload.show_community_spotlight_in_stream).to be false
+ end
end
describe "#clearable_attributes" do
it 'returns the clearable fields' do
user = FactoryGirl.create :user
- user.send(:clearable_fields).sort.should == %w{
+ expect(user.send(:clearable_fields).sort).to eq(%w{
language
invitation_token
invitation_sent_at
@@ -1001,11 +1003,73 @@ describe User do
unconfirmed_email
confirm_email_token
last_seen
- }.sort
+ }.sort)
end
end
end
-
+
+ describe "queue_export" do
+ it "queues up a job to perform the export" do
+ user = FactoryGirl.create :user
+ expect(Workers::ExportUser).to receive(:perform_async).with(user.id)
+ user.queue_export
+ expect(user.exporting).to be_truthy
+ end
+ end
+
+ describe "perform_export!" do
+ it "saves a json export to the user" do
+ user = FactoryGirl.create :user, exporting: true
+ user.perform_export!
+ expect(user.export).to be_present
+ expect(user.exported_at).to be_present
+ expect(user.exporting).to be_falsey
+ expect(user.export.filename).to match /.json/
+ expect(ActiveSupport::Gzip.decompress(user.export.file.read)).to include user.username
+ end
+
+ it "compresses the result" do
+ user = FactoryGirl.create :user, exporting: true
+ expect(ActiveSupport::Gzip).to receive :compress
+ user.perform_export!
+ end
+ end
+
+ describe "queue_export_photos" do
+ it "queues up a job to perform the export photos" do
+ user = FactoryGirl.create :user
+ expect(Workers::ExportPhotos).to receive(:perform_async).with(user.id)
+ user.queue_export_photos
+ expect(user.exporting_photos).to be_truthy
+ end
+ end
+
+ describe "perform_export_photos!" do
+ before do
+ @user = alice
+ filename = 'button.png'
+ image = File.join(File.dirname(__FILE__), '..', 'fixtures', filename)
+ @saved_image = @user.build_post(:photo, :user_file => File.open(image), :to => alice.aspects.first.id)
+ @saved_image.save!
+ end
+
+ it "saves a zip export to the user" do
+ @user.perform_export_photos!
+ expect(@user.exported_photos_file).to be_present
+ expect(@user.exported_photos_at).to be_present
+ expect(@user.exporting_photos).to be_falsey
+ expect(@user.exported_photos_file.filename).to match /.zip/
+ expect(Zip::ZipFile.open(@user.exported_photos_file.path).entries.count).to eq(1)
+ end
+
+ it "does not add empty entries when photo not found" do
+ File.unlink @user.photos.first.unprocessed_image.path
+ @user.perform_export_photos!
+ expect(@user.exported_photos_file.filename).to match /.zip/
+ expect(Zip::ZipFile.open(@user.exported_photos_file.path).entries.count).to eq(0)
+ end
+ end
+
describe "sign up" do
before do
params = {:username => "ohai",
@@ -1013,7 +1077,7 @@ describe User do
:password => "password",
:password_confirmation => "password",
:captcha => "12345",
-
+
:person =>
{:profile =>
{:first_name => "O",
@@ -1025,14 +1089,55 @@ describe User do
it "saves with captcha off" do
AppConfig.settings.captcha.enable = false
- @user.should_receive(:save).and_return(true)
+ expect(@user).to receive(:save).and_return(true)
@user.sign_up
end
it "saves with captcha on" do
AppConfig.settings.captcha.enable = true
- @user.should_receive(:save_with_captcha).and_return(true)
+ expect(@user).to receive(:save_with_captcha).and_return(true)
@user.sign_up
end
end
+
+ describe "maintenance" do
+ before do
+ @user = bob
+ AppConfig.settings.maintenance.remove_old_users.enable = true
+ end
+
+ it "#flags user for removal" do
+ remove_at = Time.now+5.days
+ @user.flag_for_removal(remove_at)
+ expect(@user.remove_after).to eq(remove_at)
+ end
+ end
+
+ describe "#auth database auth maintenance" do
+ before do
+ @user = bob
+ @user.remove_after = Time.now
+ @user.save
+ end
+
+ it "remove_after is cleared" do
+ @user.after_database_authentication
+ expect(@user.remove_after).to eq(nil)
+ end
+ end
+
+ describe "active" do
+ before do
+ invited_user = FactoryGirl.build(:user, username: nil)
+ invited_user.save(validate: false)
+
+ closed_account = FactoryGirl.create(:user)
+ closed_account.person.closed_account = true
+ closed_account.save
+ end
+
+ it "returns total_users excluding closed accounts & users without usernames" do
+ expect(User.active.count).to eq 6 # 6 users from fixtures
+ end
+ end
end
diff --git a/spec/presenters/aspect_membership_presenter_spec.rb b/spec/presenters/aspect_membership_presenter_spec.rb
new file mode 100644
index 000000000..86d25de66
--- /dev/null
+++ b/spec/presenters/aspect_membership_presenter_spec.rb
@@ -0,0 +1,15 @@
+require 'spec_helper'
+
+describe AspectMembershipPresenter do
+ before do
+ @am = alice.aspects.where(:name => "generic").first.aspect_memberships.first
+ @presenter = AspectMembershipPresenter.new(@am)
+ end
+
+ describe '#base_hash' do
+ it 'works' do
+ expect(@presenter.base_hash).to be_present
+ end
+ end
+
+end
diff --git a/spec/presenters/aspect_presenter_spec.rb b/spec/presenters/aspect_presenter_spec.rb
index d38b97f42..ba2bb5b4a 100644
--- a/spec/presenters/aspect_presenter_spec.rb
+++ b/spec/presenters/aspect_presenter_spec.rb
@@ -7,7 +7,7 @@ describe AspectPresenter do
describe '#to_json' do
it 'works' do
- @presenter.to_json.should be_present
+ expect(@presenter.to_json).to be_present
end
end
end \ No newline at end of file
diff --git a/spec/presenters/base_presenter_spec.rb b/spec/presenters/base_presenter_spec.rb
new file mode 100644
index 000000000..561d1993f
--- /dev/null
+++ b/spec/presenters/base_presenter_spec.rb
@@ -0,0 +1,25 @@
+require "spec_helper"
+
+describe BasePresenter do
+ it "falls back to nil" do
+ p = BasePresenter.new(nil)
+ expect(p.anything).to be(nil)
+ expect { p.otherthing }.not_to raise_error
+ end
+
+ it "calls methods on the wrapped object" do
+ obj = double(hello: "world")
+ p = BasePresenter.new(obj)
+
+ expect(p.hello).to eql("world")
+ expect(obj).to have_received(:hello)
+ end
+
+ describe "#as_collection" do
+ it "returns an array of data" do
+ coll = [double(data: "one"), double(data: "two"), double(data: "three")]
+ res = BasePresenter.as_collection(coll, :data)
+ expect(res).to eql(["one", "two", "three"])
+ end
+ end
+end
diff --git a/spec/presenters/contact_presenter_spec.rb b/spec/presenters/contact_presenter_spec.rb
new file mode 100644
index 000000000..2a1e0cefa
--- /dev/null
+++ b/spec/presenters/contact_presenter_spec.rb
@@ -0,0 +1,26 @@
+require 'spec_helper'
+
+describe ContactPresenter do
+ before do
+ @presenter = ContactPresenter.new(alice.contact_for(bob.person))
+ end
+
+ describe '#base_hash' do
+ it 'works' do
+ expect(@presenter.base_hash).to be_present
+ end
+ end
+
+ describe '#full_hash' do
+ it 'works' do
+ expect(@presenter.full_hash).to be_present
+ end
+ end
+
+ describe '#full_hash_with_person' do
+ it 'works' do
+ expect(@presenter.full_hash_with_person).to be_present
+ end
+ end
+
+end
diff --git a/spec/presenters/o_embed_presenter_spec.rb b/spec/presenters/o_embed_presenter_spec.rb
index d343ba96c..bf8192675 100644
--- a/spec/presenters/o_embed_presenter_spec.rb
+++ b/spec/presenters/o_embed_presenter_spec.rb
@@ -5,31 +5,31 @@ describe OEmbedPresenter do
end
it 'is a hash' do
- @oembed.as_json.should be_a Hash
+ expect(@oembed.as_json).to be_a Hash
end
context 'required options from oembed spec' do
it 'supports maxheight + maxwidth(required)' do
oembed = OEmbedPresenter.new(FactoryGirl.create(:status_message), :maxwidth => 200, :maxheight => 300).as_json
- oembed[:width].should == 200
- oembed[:height].should == 300
+ expect(oembed[:width]).to eq(200)
+ expect(oembed[:height]).to eq(300)
end
end
describe '#iframe_html' do
it 'passes the height options to post_iframe_url' do
- @oembed.should_receive(:post_iframe_url).with(instance_of(Fixnum), instance_of(Hash))
+ expect(@oembed).to receive(:post_iframe_url).with(instance_of(Fixnum), instance_of(Hash))
@oembed.iframe_html
end
end
describe '.id_from_url' do
it 'takes a long post url and gives you the id' do
- OEmbedPresenter.id_from_url('http://localhost:400/posts/1').should == "1"
+ expect(OEmbedPresenter.id_from_url('http://localhost:400/posts/1')).to eq("1")
end
it 'takes a short post url and gives you the id' do
- OEmbedPresenter.id_from_url('http://localhost:400/p/1').should == "1"
+ expect(OEmbedPresenter.id_from_url('http://localhost:400/p/1')).to eq("1")
end
end
end \ No newline at end of file
diff --git a/spec/presenters/person_presenter_spec.rb b/spec/presenters/person_presenter_spec.rb
index 4eb502f0a..97f01887c 100644
--- a/spec/presenters/person_presenter_spec.rb
+++ b/spec/presenters/person_presenter_spec.rb
@@ -7,7 +7,7 @@ describe PersonPresenter do
describe "#as_json" do
context "with no current_user" do
it "returns the user's public information if a user is not logged in" do
- PersonPresenter.new(person, nil).as_json.should include(person.as_api_response(:backbone))
+ expect(PersonPresenter.new(person, nil).as_json).to include(person.as_api_response(:backbone).except(:avatar))
end
end
@@ -16,17 +16,57 @@ describe PersonPresenter do
let(:presenter){ PersonPresenter.new(person, current_user) }
it "doesn't share private information when the users aren't connected" do
- presenter.as_json.should_not have_key(:location)
+ expect(presenter.as_json).not_to have_key(:location)
end
it "has private information when the person is sharing with the current user" do
- person.should_receive(:shares_with).with(current_user).and_return(true)
- presenter.as_json.should have_key(:location)
+ expect(person).to receive(:shares_with).with(current_user).and_return(true)
+ expect(presenter.as_json).to have_key(:location)
end
it "returns the user's private information if a user is logged in as herself" do
- PersonPresenter.new(current_user.person, current_user).as_json.should have_key(:location)
+ expect(PersonPresenter.new(current_user.person, current_user).as_json).to have_key(:location)
end
end
end
-end \ No newline at end of file
+
+ describe "#full_hash" do
+ let(:current_user) { FactoryGirl.create(:user) }
+ let(:mutual_contact) { double(:id => 1, :mutual? => true, :sharing? => true, :receiving? => true ) }
+ let(:receiving_contact) { double(:id => 1, :mutual? => false, :sharing? => false, :receiving? => true) }
+ let(:sharing_contact) { double(:id => 1, :mutual? => false, :sharing? => true, :receiving? => false) }
+ let(:non_contact) { double(:id => 1, :mutual? => false, :sharing? => false, :receiving? => false) }
+
+ before do
+ @p = PersonPresenter.new(person, current_user)
+ end
+
+ context "relationship" do
+ it "is blocked?" do
+ allow(current_user).to receive(:block_for) { double(id: 1) }
+ allow(current_user).to receive(:contact_for) { non_contact }
+ expect(@p.full_hash[:relationship]).to be(:blocked)
+ end
+
+ it "is mutual?" do
+ allow(current_user).to receive(:contact_for) { mutual_contact }
+ expect(@p.full_hash[:relationship]).to be(:mutual)
+ end
+
+ it "is receiving?" do
+ allow(current_user).to receive(:contact_for) { receiving_contact }
+ expect(@p.full_hash[:relationship]).to be(:receiving)
+ end
+
+ it "is sharing?" do
+ allow(current_user).to receive(:contact_for) { sharing_contact }
+ expect(@p.full_hash[:relationship]).to be(:sharing)
+ end
+
+ it "isn't sharing?" do
+ allow(current_user).to receive(:contact_for) { non_contact }
+ expect(@p.full_hash[:relationship]).to be(:not_sharing)
+ end
+ end
+ end
+end
diff --git a/spec/presenters/post_presenter_spec.rb b/spec/presenters/post_presenter_spec.rb
index e487465e1..293f0337c 100644
--- a/spec/presenters/post_presenter_spec.rb
+++ b/spec/presenters/post_presenter_spec.rb
@@ -9,38 +9,38 @@ describe PostPresenter do
end
it 'takes a post and an optional user' do
- @presenter.should_not be_nil
+ expect(@presenter).not_to be_nil
end
describe '#as_json' do
it 'works with a user' do
- @presenter.as_json.should be_a Hash
+ expect(@presenter.as_json).to be_a Hash
end
it 'works without a user' do
- @unauthenticated_presenter.as_json.should be_a Hash
+ expect(@unauthenticated_presenter.as_json).to be_a Hash
end
end
describe '#user_like' do
it 'includes the users like' do
bob.like!(@sm)
- @presenter.user_like.should be_present
+ expect(@presenter.user_like).to be_present
end
it 'is nil if the user is not authenticated' do
- @unauthenticated_presenter.user_like.should be_nil
+ expect(@unauthenticated_presenter.user_like).to be_nil
end
end
describe '#user_reshare' do
it 'includes the users reshare' do
bob.reshare!(@sm)
- @presenter.user_reshare.should be_present
+ expect(@presenter.user_reshare).to be_present
end
it 'is nil if the user is not authenticated' do
- @unauthenticated_presenter.user_reshare.should be_nil
+ expect(@unauthenticated_presenter.user_reshare).to be_nil
end
end
@@ -68,7 +68,7 @@ describe PostPresenter do
context 'with posts with text' do
it "delegates to message.title" do
message = double(present?: true)
- message.should_receive(:title)
+ expect(message).to receive(:title)
@presenter.post = double(message: message)
@presenter.title
end
@@ -78,7 +78,7 @@ describe PostPresenter do
it ' displays a messaage with the post class' do
@sm = double(message: double(present?: false), author: bob.person, author_name: bob.person.name)
@presenter.post = @sm
- @presenter.title.should == "A post from #{@sm.author.name}"
+ expect(@presenter.title).to eq("A post from #{@sm.author.name}")
end
end
end
@@ -86,7 +86,7 @@ describe PostPresenter do
describe '#poll' do
it 'works without a user' do
presenter = PostPresenter.new(@sm_with_poll)
- presenter.as_json.should be_a(Hash)
+ expect(presenter.as_json).to be_a(Hash)
end
end
end
diff --git a/spec/presenters/service_presenter_spec.rb b/spec/presenters/service_presenter_spec.rb
index 62c959af9..046645552 100644
--- a/spec/presenters/service_presenter_spec.rb
+++ b/spec/presenters/service_presenter_spec.rb
@@ -4,7 +4,7 @@ describe ServicePresenter do
describe '#as_json' do
it 'includes the provider name of the json' do
presenter = ServicePresenter.new(double(:provider => "fakebook"))
- presenter.as_json[:provider].should == 'fakebook'
+ expect(presenter.as_json[:provider]).to eq('fakebook')
end
end
end \ No newline at end of file
diff --git a/spec/presenters/statistics_presenter_spec.rb b/spec/presenters/statistics_presenter_spec.rb
index e1d17103b..40661f123 100644
--- a/spec/presenters/statistics_presenter_spec.rb
+++ b/spec/presenters/statistics_presenter_spec.rb
@@ -7,57 +7,72 @@ describe StatisticsPresenter do
describe '#as_json' do
it 'works' do
- @presenter.as_json.should be_present
- @presenter.as_json.should be_a Hash
+ expect(@presenter.as_json).to be_present
+ expect(@presenter.as_json).to be_a Hash
end
end
describe '#statistics contents' do
-
- it 'provides generic pod data in json' do
+ before do
AppConfig.privacy.statistics.user_counts = false
AppConfig.privacy.statistics.post_counts = false
AppConfig.privacy.statistics.comment_counts = false
- AppConfig.services = {"facebook" => nil}
- @presenter.as_json.should == {
+ end
+
+ it 'provides generic pod data in json' do
+ expect(@presenter.as_json).to eq({
"name" => AppConfig.settings.pod_name,
+ "network" => "Diaspora",
"version" => AppConfig.version_string,
- "registrations_open" => AppConfig.settings.enable_registrations,
- "facebook" => false
- }
+ "registrations_open" => AppConfig.settings.enable_registrations?,
+ "services"=> ["facebook",],
+ "facebook" => true,
+ "tumblr" => false,
+ "twitter" => false,
+ "wordpress" => false,
+ })
end
-
+
context 'when services are enabled' do
before do
AppConfig.privacy.statistics.user_counts = true
AppConfig.privacy.statistics.post_counts = true
AppConfig.privacy.statistics.comment_counts = true
AppConfig.services = {
- "facebook" => {"enable" => true},
- "twitter" => {"enable" => true},
+ "facebook" => {"enable" => true},
+ "twitter" => {"enable" => true},
"wordpress" => {"enable" => false},
"tumblr" => {"enable" => false}
}
end
it 'provides generic pod data and counts in json' do
- @presenter.as_json.should == {
+ expect(@presenter.as_json).to eq({
"name" => AppConfig.settings.pod_name,
+ "network" => "Diaspora",
"version" => AppConfig.version_string,
- "registrations_open" => AppConfig.settings.enable_registrations,
- "total_users" => User.count,
+ "registrations_open" => AppConfig.settings.enable_registrations?,
+ "total_users" => User.active.count,
"active_users_halfyear" => User.halfyear_actives.count,
"active_users_monthly" => User.monthly_actives.count,
"local_posts" => @presenter.local_posts,
"local_comments" => @presenter.local_comments,
+ "services" => ["twitter","facebook"],
"facebook" => true,
"twitter" => true,
"tumblr" => false,
"wordpress" => false
- }
+ })
end
end
+ context 'when registrations are closed' do
+ before do
+ AppConfig.settings.enable_registrations = false
+ end
+ it 'should mark open_registrations to be false' do
+ expect(@presenter.open_registrations?).to be false
+ end
+ end
end
-
end
diff --git a/spec/presenters/user_presenter_spec.rb b/spec/presenters/user_presenter_spec.rb
index 04b57b4c1..aa9ecf7ce 100644
--- a/spec/presenters/user_presenter_spec.rb
+++ b/spec/presenters/user_presenter_spec.rb
@@ -7,31 +7,31 @@ describe UserPresenter do
describe '#to_json' do
it 'works' do
- @presenter.to_json.should be_present
+ expect(@presenter.to_json).to be_present
end
end
describe '#aspects' do
it 'provides an array of the jsonified aspects' do
aspect = bob.aspects.first
- @presenter.aspects.first[:id].should == aspect.id
- @presenter.aspects.first[:name].should == aspect.name
+ expect(@presenter.aspects.first[:id]).to eq(aspect.id)
+ expect(@presenter.aspects.first[:name]).to eq(aspect.name)
end
end
describe '#services' do
it 'provides an array of jsonifed services' do
fakebook = double(:provider => 'fakebook')
- bob.stub(:services).and_return([fakebook])
- @presenter.services.should include(:provider => 'fakebook')
+ allow(bob).to receive(:services).and_return([fakebook])
+ expect(@presenter.services).to include(:provider => 'fakebook')
end
end
describe '#configured_services' do
it 'displays a list of the users configured services' do
fakebook = double(:provider => 'fakebook')
- bob.stub(:services).and_return([fakebook])
- @presenter.configured_services.should include("fakebook")
+ allow(bob).to receive(:services).and_return([fakebook])
+ expect(@presenter.configured_services).to include("fakebook")
end
end
end
diff --git a/spec/shared_behaviors/account_deletion.rb b/spec/shared_behaviors/account_deletion.rb
index 50ecf251e..027442b14 100644
--- a/spec/shared_behaviors/account_deletion.rb
+++ b/spec/shared_behaviors/account_deletion.rb
@@ -6,34 +6,34 @@ require 'spec_helper'
shared_examples_for 'it removes the person associations' do
it "removes all of the person's posts" do
- Post.where(:author_id => @person.id).count.should == 0
+ expect(Post.where(:author_id => @person.id).count).to eq(0)
end
it 'deletes all person contacts' do
- Contact.where(:person_id => @person.id).should be_empty
+ expect(Contact.where(:person_id => @person.id)).to be_empty
end
it 'deletes all mentions' do
- @person.mentions.should be_empty
+ expect(@person.mentions).to be_empty
end
it "removes all of the person's photos" do
- Photo.where(:author_id => @person.id).should be_empty
+ expect(Photo.where(:author_id => @person.id)).to be_empty
end
it 'sets the person object as closed and the profile is cleared' do
- @person.reload.closed_account.should be_true
+ expect(@person.reload.closed_account).to be true
- @person.profile.reload.first_name.should be_blank
- @person.profile.reload.last_name.should be_blank
+ expect(@person.profile.reload.first_name).to be_blank
+ expect(@person.profile.reload.last_name).to be_blank
end
it 'deletes only the converersation visibility for the deleted user' do
- ConversationVisibility.where(:person_id => alice.person.id).should_not be_empty
- ConversationVisibility.where(:person_id => @person.id).should be_empty
+ expect(ConversationVisibility.where(:person_id => alice.person.id)).not_to be_empty
+ expect(ConversationVisibility.where(:person_id => @person.id)).to be_empty
end
it "deletes the share visibilities on the person's posts" do
- ShareVisibility.for_contacts_of_a_person(@person).should be_empty
+ expect(ShareVisibility.for_contacts_of_a_person(@person)).to be_empty
end
end
diff --git a/spec/shared_behaviors/relayable.rb b/spec/shared_behaviors/relayable.rb
index 1b3dc9766..6973f6e1f 100644
--- a/spec/shared_behaviors/relayable.rb
+++ b/spec/shared_behaviors/relayable.rb
@@ -12,7 +12,7 @@ shared_examples_for "it is relayable" do
relayable = build_object
relayable.save
if relayable.parent.respond_to?(:interacted_at) #I'm sorry.
- relayable.parent.interacted_at.to_i.should == relayable.created_at.to_i
+ expect(relayable.parent.interacted_at.to_i).to eq(relayable.created_at.to_i)
end
end
end
@@ -27,14 +27,14 @@ shared_examples_for "it is relayable" do
end
it "is invalid" do
- @relayable.should_not be_valid
- @relayable.should have(1).error_on(:author_id)
+ expect(@relayable).not_to be_valid
+ expect(@relayable.errors[:author_id].size).to eq(1)
end
it "sends a retraction for the object" do
- pending 'need to figure out how to test this'
- RelayableRetraction.should_receive(:build)
- Postzord::Dispatcher.should_receive(:build)
+ skip 'need to figure out how to test this'
+ expect(RelayableRetraction).to receive(:build)
+ expect(Postzord::Dispatcher).to receive(:build)
@relayable.valid?
end
@@ -49,7 +49,7 @@ shared_examples_for "it is relayable" do
relayable = build_object
relayable.save!
bob.blocks.create(:person => alice.person)
- relayable.should be_valid
+ expect(relayable).to be_valid
end
end
end
@@ -58,26 +58,26 @@ shared_examples_for "it is relayable" do
context 'encryption' do
describe '#parent_author_signature' do
it 'should sign the object if the user is the post author' do
- @object_by_parent_author.verify_parent_author_signature.should be_true
+ expect(@object_by_parent_author.verify_parent_author_signature).to be true
end
it 'does not sign as the parent author is not parent' do
@object_by_recipient.author_signature = @object_by_recipient.send(:sign_with_key, @local_leia.encryption_key)
- @object_by_recipient.verify_parent_author_signature.should be_false
+ expect(@object_by_recipient.verify_parent_author_signature).to be false
end
it 'should verify a object made on a remote post by a different contact' do
@object_by_recipient.author_signature = @object_by_recipient.send(:sign_with_key, @local_leia.encryption_key)
@object_by_recipient.parent_author_signature = @object_by_recipient.send(:sign_with_key, @local_luke.encryption_key)
- @object_by_recipient.verify_parent_author_signature.should be_true
+ expect(@object_by_recipient.verify_parent_author_signature).to be true
end
end
describe '#author_signature' do
it 'should sign as the object author' do
- @object_on_remote_parent.signature_valid?.should be_true
- @object_by_parent_author.signature_valid?.should be_true
- @object_by_recipient.signature_valid?.should be_true
+ expect(@object_on_remote_parent.signature_valid?).to be true
+ expect(@object_by_parent_author.signature_valid?).to be true
+ expect(@object_by_recipient.signature_valid?).to be true
end
end
end
@@ -93,36 +93,36 @@ shared_examples_for "it is relayable" do
it 'does not process if post_creator_signature is invalid' do
@object_by_parent_author.delete # remove object from db so we set a creator sig
@dup_object_by_parent_author.parent_author_signature = "dsfadsfdsa"
- @dup_object_by_parent_author.receive(@local_leia, @local_luke.person).should == nil
+ expect(@dup_object_by_parent_author.receive(@local_leia, @local_luke.person)).to eq(nil)
end
it 'signs when the person receiving is the parent author' do
@object_by_recipient.save
@object_by_recipient.receive(@local_luke, @local_leia.person)
- @object_by_recipient.reload.parent_author_signature.should_not be_blank
+ expect(@object_by_recipient.reload.parent_author_signature).not_to be_blank
end
it 'dispatches when the person receiving is the parent author' do
p = Postzord::Dispatcher.build(@local_luke, @object_by_recipient)
- p.should_receive(:post)
- p.class.stub(:new).and_return(p)
+ expect(p).to receive(:post)
+ allow(p.class).to receive(:new).and_return(p)
@object_by_recipient.receive(@local_luke, @local_leia.person)
end
it 'calls after_receive callback' do
- @object_by_recipient.should_receive(:after_receive)
- @object_by_recipient.class.stub(:where).and_return([@object_by_recipient])
+ expect(@object_by_recipient).to receive(:after_receive)
+ allow(@object_by_recipient.class).to receive(:where).and_return([@object_by_recipient])
@object_by_recipient.receive(@local_luke, @local_leia.person)
end
end
describe '#subscribers' do
it 'returns the posts original audience, if the post is owned by the user' do
- @object_by_parent_author.subscribers(@local_luke).map(&:id).should =~ [@local_leia.person, @remote_raphael].map(&:id)
+ expect(@object_by_parent_author.subscribers(@local_luke).map(&:id)).to match_array([@local_leia.person, @remote_raphael].map(&:id))
end
it 'returns the owner of the original post, if the user owns the object' do
- @object_by_recipient.subscribers(@local_leia).map(&:id).should =~ [@local_luke.person].map(&:id)
+ expect(@object_by_recipient.subscribers(@local_leia).map(&:id)).to match_array([@local_luke.person].map(&:id))
end
end
end
diff --git a/spec/shared_behaviors/stream.rb b/spec/shared_behaviors/stream.rb
index 9207be34e..d49233588 100644
--- a/spec/shared_behaviors/stream.rb
+++ b/spec/shared_behaviors/stream.rb
@@ -3,41 +3,41 @@ require 'spec_helper'
shared_examples_for 'it is a stream' do
context 'required methods for display' do
it '#title' do
- @stream.title.should_not be_nil
+ expect(@stream.title).not_to be_nil
end
it '#posts' do
- @stream.posts.should_not be_nil
+ expect(@stream.posts).not_to be_nil
end
it '#people' do
- @stream.people.should_not be_nil
+ expect(@stream.people).not_to be_nil
end
it '#publisher_opts' do
- @stream.send(:publisher_opts).should_not be_nil
+ expect(@stream.send(:publisher_opts)).not_to be_nil
end
it 'has a #contacts title' do
- @stream.contacts_title.should_not be_nil
+ expect(@stream.contacts_title).not_to be_nil
end
it 'has a contacts link' do
- @stream.contacts_link.should_not be_nil
+ expect(@stream.contacts_link).not_to be_nil
end
it 'should make the stream a time object' do
@stream.max_time = 123
- @stream.max_time.should be_a(Time)
+ expect(@stream.max_time).to be_a(Time)
end
it 'should always have an order (default created_at)' do
@stream.order=nil
- @stream.order.should_not be_nil
+ expect(@stream.order).not_to be_nil
end
it 'initializes a publisher' do
- @stream.publisher.should be_a(Publisher)
+ expect(@stream.publisher).to be_a(Publisher)
end
end
end
diff --git a/spec/shared_behaviors/taggable.rb b/spec/shared_behaviors/taggable.rb
index 339556bf2..ccec40e7d 100644
--- a/spec/shared_behaviors/taggable.rb
+++ b/spec/shared_behaviors/taggable.rb
@@ -21,18 +21,18 @@ shared_examples_for "it is taggable" do
end
it "supports non-ascii characters" do
- @object.tags(true).map(&:name).should include('vöglein')
+ expect(@object.tags(true).map(&:name)).to include('vöglein')
end
it 'links each tag' do
formatted_string = Diaspora::Taggable.format_tags(@str)
- formatted_string.should include(tag_link('what'))
- formatted_string.should include(tag_link('hey'))
- formatted_string.should include(tag_link('vöglein'))
+ expect(formatted_string).to include(tag_link('what'))
+ expect(formatted_string).to include(tag_link('hey'))
+ expect(formatted_string).to include(tag_link('vöglein'))
end
it 'responds to plain_text' do
- Diaspora::Taggable.format_tags(@str, :plain_text => true).should == @str
+ expect(Diaspora::Taggable.format_tags(@str, :plain_text => true)).to eq(@str)
end
it "doesn't mangle text when tags are involved" do
@@ -52,9 +52,9 @@ shared_examples_for "it is taggable" do
'#12345 tag' => "#{tag_link('12345')} tag",
'#12cde tag' => "#{tag_link('12cde')} tag",
'#abc45 tag' => "#{tag_link('abc45')} tag",
- '#<3' => %{<a href="/tags/<3" class="tag">#&lt;3</a>},
- 'i #<3' => %{i <a href="/tags/<3" class="tag">#&lt;3</a>},
- 'i #<3 you' => %{i <a href="/tags/<3" class="tag">#&lt;3</a> you},
+ '#<3' => %{<a class="tag" href="/tags/<3">#&lt;3</a>},
+ 'i #<3' => %{i <a class="tag" href="/tags/<3">#&lt;3</a>},
+ 'i #<3 you' => %{i <a class="tag" href="/tags/<3">#&lt;3</a> you},
'#<4' => '#&lt;4',
'test#foo test' => 'test#foo test',
'test.#joo bar' => 'test.#joo bar',
@@ -78,7 +78,7 @@ shared_examples_for "it is taggable" do
}
expected.each do |input,output|
- Diaspora::Taggable.format_tags(input).should == output
+ expect(Diaspora::Taggable.format_tags(input)).to eq(output)
end
end
end
@@ -87,10 +87,10 @@ shared_examples_for "it is taggable" do
it 'builds the tags' do
@object.send(@object.class.field_with_tags_setter, '#what')
@object.build_tags
- @object.tag_list.should == ['what']
- lambda {
+ expect(@object.tag_list).to eq(['what'])
+ expect {
@object.save
- }.should change{@object.tags.count}.by(1)
+ }.to change{@object.tags.count}.by(1)
end
end
@@ -100,7 +100,7 @@ shared_examples_for "it is taggable" do
arr = ['what', 'hey', 'that', 'THATWASMYBIKE', 'vöglein', '135440we', 'abc', 'h', 'ok', 'see', 're']
@object.send(@object.class.field_with_tags_setter, str)
- @object.tag_strings.should =~ arr
+ expect(@object.tag_strings).to match_array(arr)
end
it 'extracts tags despite surrounding text' do
@@ -139,11 +139,12 @@ shared_examples_for "it is taggable" do
'#-initialhyphen' => '-initialhyphen',
'#-initialhyphen tag' => '-initialhyphen',
'#-initial-hyphen' => '-initial-hyphen',
+ "\u202a#\u200eUSA\u202c" => 'USA'
}
expected.each do |text,hashtag|
@object.send @object.class.field_with_tags_setter, text
- @object.tag_strings.should == [hashtag].compact
+ expect(@object.tag_strings).to eq([hashtag].compact)
end
end
@@ -152,7 +153,7 @@ shared_examples_for "it is taggable" do
arr = ['what','whaaaaaaaaaat']
@object.send(@object.class.field_with_tags_setter, str)
- @object.tag_strings.should =~ arr
+ expect(@object.tag_strings).to match_array(arr)
end
it 'is case insensitive' do
@@ -160,7 +161,7 @@ shared_examples_for "it is taggable" do
arr = ['what']
@object.send(@object.class.field_with_tags_setter, str)
- @object.tag_strings.should =~ arr
+ expect(@object.tag_strings).to match_array(arr)
end
end
end
diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb
index 2f375e9e4..32937f978 100644
--- a/spec/spec_helper.rb
+++ b/spec/spec_helper.rb
@@ -2,114 +2,107 @@
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
-prefork = proc do
- # Loading more in this block will cause your tests to run faster. However,
- # if you change any configuration or code from libraries loaded here, you'll
- # need to restart spork for it take effect.
-
- #require "rails/application"
- #Spork.trap_method(Rails::Application::RoutesReloader, :reload!)
-
- ENV["RAILS_ENV"] ||= 'test'
- require File.join(File.dirname(__FILE__), '..', 'config', 'environment')
- require Rails.root.join('spec', 'helper_methods')
- require Rails.root.join('spec', 'spec-doc')
- require 'rspec/rails'
- require 'webmock/rspec'
- require 'factory_girl'
- require 'sidekiq/testing'
-
- include HelperMethods
-
- Dir["#{File.dirname(__FILE__)}/shared_behaviors/**/*.rb"].each do |f|
- require f
- end
-
- ProcessedImage.enable_processing = false
- UnprocessedImage.enable_processing = false
-
- def set_up_friends
- [local_luke, local_leia, remote_raphael]
- end
-
- def alice
- @alice ||= User.where(:username => 'alice').first
- end
+ENV["RAILS_ENV"] ||= "test"
+require File.join(File.dirname(__FILE__), "..", "config", "environment")
+require Rails.root.join("spec", "helper_methods")
+require Rails.root.join("spec", "spec-doc")
+require "rspec/rails"
+require "webmock/rspec"
+require "factory_girl"
+require "sidekiq/testing"
+require "shoulda/matchers"
+
+include HelperMethods
+
+Dir["#{File.dirname(__FILE__)}/shared_behaviors/**/*.rb"].each do |f|
+ require f
+end
- def bob
- @bob ||= User.where(:username => 'bob').first
- end
+ProcessedImage.enable_processing = false
+UnprocessedImage.enable_processing = false
+Rails.application.routes.default_url_options[:host] = AppConfig.pod_uri.host
+Rails.application.routes.default_url_options[:port] = AppConfig.pod_uri.port
- def eve
- @eve ||= User.where(:username => 'eve').first
- end
-
- def local_luke
- @local_luke ||= User.where(:username => 'luke').first
- end
+def set_up_friends
+ [local_luke, local_leia, remote_raphael]
+end
- def local_leia
- @local_leia ||= User.where(:username => 'leia').first
- end
+def alice
+ @alice ||= User.find_by(username: "alice")
+end
- def remote_raphael
- @remote_raphael ||= Person.where(:diaspora_handle => 'raphael@remote.net').first
- end
+def bob
+ @bob ||= User.find_by(username: "bob")
+end
- def photo_fixture_name
- @photo_fixture_name = File.join(File.dirname(__FILE__), 'fixtures', 'button.png')
- end
+def eve
+ @eve ||= User.find_by(username: "eve")
+end
- # Force fixture rebuild
- FileUtils.rm_f(Rails.root.join('tmp', 'fixture_builder.yml'))
+def local_luke
+ @local_luke ||= User.find_by(username: "luke")
+end
- # Requires supporting files with custom matchers and macros, etc,
- # in ./support/ and its subdirectories.
- fixture_builder_file = "#{File.dirname(__FILE__)}/support/fixture_builder.rb"
- support_files = Dir["#{File.dirname(__FILE__)}/support/**/*.rb"] - [fixture_builder_file]
- support_files.each {|f| require f }
- require fixture_builder_file
+def local_leia
+ @local_leia ||= User.find_by(username: "leia")
+end
- RSpec.configure do |config|
- config.include Devise::TestHelpers, :type => :controller
- config.mock_with :rspec
+def remote_raphael
+ @remote_raphael ||= Person.find_by(diaspora_handle: "raphael@remote.net")
+end
- config.render_views
- config.use_transactional_fixtures = true
+def peter
+ @peter ||= User.find_by(username: "peter")
+end
- config.before(:each) do
- I18n.locale = :en
- stub_request(:post, "https://pubsubhubbub.appspot.com/")
- disable_typhoeus
- $process_queue = false
- Postzord::Dispatcher::Public.any_instance.stub(:deliver_to_remote)
- Postzord::Dispatcher::Private.any_instance.stub(:deliver_to_remote)
- end
+def photo_fixture_name
+ @photo_fixture_name = File.join(File.dirname(__FILE__), "fixtures", "button.png")
+end
+# Force fixture rebuild
+FileUtils.rm_f(Rails.root.join("tmp", "fixture_builder.yml"))
+# Requires supporting files with custom matchers and macros, etc,
+# in ./support/ and its subdirectories.
+fixture_builder_file = "#{File.dirname(__FILE__)}/support/fixture_builder.rb"
+support_files = Dir["#{File.dirname(__FILE__)}/support/**/*.rb"] - [fixture_builder_file]
+support_files.each {|f| require f }
+require fixture_builder_file
- config.after(:all) do
- `rm -rf #{Rails.root}/tmp/uploads/*`
- end
+RSpec.configure do |config|
+ config.include Devise::TestHelpers, :type => :controller
+ config.mock_with :rspec
+
+ config.render_views
+ config.use_transactional_fixtures = true
+ config.infer_spec_type_from_file_location!
+
+ config.before(:each) do
+ I18n.locale = :en
+ stub_request(:post, "https://pubsubhubbub.appspot.com/")
+ disable_typhoeus
+ $process_queue = false
+ allow_any_instance_of(Postzord::Dispatcher::Public).to receive(:deliver_to_remote)
+ allow_any_instance_of(Postzord::Dispatcher::Private).to receive(:deliver_to_remote)
end
-end
-begin
- require 'spork'
- #uncomment the following line to use spork with the debugger
- #require 'spork/ext/ruby-debug'
+ config.expect_with :rspec do |expect_config|
+ expect_config.syntax = :expect
+ end
- Spork.prefork(&prefork)
-rescue LoadError
- prefork.call
-end
+ config.after(:all) do
+ `rm -rf #{Rails.root}/tmp/uploads/*`
+ end
-# https://makandracards.com/makandra/950-speed-up-rspec-by-deferring-garbage-collection
-RSpec.configure do |config|
- config.before(:all) do
- DeferredGarbageCollection.start
+ # Reset overridden settings
+ config.after(:each) do
+ AppConfig.reset_dynamic!
end
- config.after(:all) do
- DeferredGarbageCollection.reconsider
+
+ # Reset test mails
+ config.after(:each) do
+ ActionMailer::Base.deliveries.clear
end
+
+ config.include FactoryGirl::Syntax::Methods
end
diff --git a/spec/support/deferred_garbage_collection.rb b/spec/support/deferred_garbage_collection.rb
deleted file mode 100644
index 85a59a8d8..000000000
--- a/spec/support/deferred_garbage_collection.rb
+++ /dev/null
@@ -1,41 +0,0 @@
-
-# https://makandracards.com/makandra/950-speed-up-rspec-by-deferring-garbage-collection
-class DeferredGarbageCollection
-
- DEFERRED_GC_THRESHOLD = (ENV['DEFER_GC'] || 10.0).to_f #used to be 10.0
-
- @@last_gc_run = Time.now
-
- def self.start
- return if unsupported_environment
- GC.disable if DEFERRED_GC_THRESHOLD > 0
- end
-
- def self.memory_threshold
- @mem = %x(free 2>/dev/null).to_s.split(" ")
- return nil if @mem.empty?
- @mem[15].to_i / (@mem[7].to_i/100)
- end
-
- def self.reconsider
- return if unsupported_environment
-
- if (percent_used = self.memory_threshold)
- running_out_of_memory = percent_used > 90
- else
- running_out_of_memory = false
- end
-
- if( (DEFERRED_GC_THRESHOLD > 0 && Time.now - @@last_gc_run >= DEFERRED_GC_THRESHOLD) || running_out_of_memory )
- GC.enable
- GC.start
- GC.disable
- @@last_gc_run = Time.now
- end
- end
-
- def self.unsupported_environment
- ENV['TRAVIS'] # TODO: enable for ruby 1.9.3 or more RAM
- end
-
-end
diff --git a/spec/support/fixture_builder.rb b/spec/support/fixture_builder.rb
index b327c26d4..34f981a33 100644
--- a/spec/support/fixture_builder.rb
+++ b/spec/support/fixture_builder.rb
@@ -8,7 +8,7 @@ FixtureBuilder.configure do |fbuilder|
# now declare objects
fbuilder.factory do
# Users
- alice = FactoryGirl.create(:user_with_aspect, :username => "alice")
+ alice = FactoryGirl.create(:user_with_aspect, :username => "alice", :strip_exif => false)
alices_aspect = alice.aspects.where(:name => "generic").first
eve = FactoryGirl.create(:user_with_aspect, :username => "eve")
@@ -34,5 +34,14 @@ FixtureBuilder.configure do |fbuilder|
local_leia.contacts.create(:person => remote_raphael, :aspects => [leias_aspect])
local_luke.contacts.create(:person => remote_raphael, :aspects => [lukes_aspect])
+
+ # Set up a follower
+ peter = FactoryGirl.create(:user_with_aspect, :username => "peter")
+ peters_aspect = peter.aspects.where(:name => "generic").first
+
+ peter.contacts.create!(:person => alice.person,
+ :aspects => [peters_aspect],
+ :sharing => false,
+ :receiving => true)
end
-end \ No newline at end of file
+end
diff --git a/spec/support/user_methods.rb b/spec/support/user_methods.rb
index 2f2c4ea46..85f0068f7 100644
--- a/spec/support/user_methods.rb
+++ b/spec/support/user_methods.rb
@@ -1,9 +1,4 @@
class User
- include Rails.application.routes.url_helpers
- def default_url_options
- {:host => AppConfig.pod_uri.host}
- end
-
alias_method :share_with_original, :share_with
def share_with(*args)
@@ -18,12 +13,11 @@ class User
p = build_post(class_name, opts)
p.aspects = aspects
-
if p.save!
self.aspects.reload
add_to_streams(p, aspects)
- dispatch_opts = {:url => post_url(p), :to => opts[:to]}
+ dispatch_opts = {url: Rails.application.routes.url_helpers.post_url(p), to: opts[:to]}
dispatch_opts.merge!(:additional_subscribers => p.root.author) if class_name == :reshare
dispatch_post(p, dispatch_opts)
end
diff --git a/spec/workers/deferred_dispatch_spec.rb b/spec/workers/deferred_dispatch_spec.rb
new file mode 100644
index 000000000..f0a20d768
--- /dev/null
+++ b/spec/workers/deferred_dispatch_spec.rb
@@ -0,0 +1,9 @@
+require 'spec_helper'
+
+describe Workers::DeferredDispatch do
+ it "handles non existing records gracefully" do
+ expect {
+ described_class.new.perform(alice.id, 'Comment', 0, {})
+ }.to_not raise_error
+ end
+end
diff --git a/spec/workers/delete_account_spec.rb b/spec/workers/delete_account_spec.rb
index 5f374cfd3..dd604f7d8 100644
--- a/spec/workers/delete_account_spec.rb
+++ b/spec/workers/delete_account_spec.rb
@@ -8,8 +8,8 @@ describe Workers::DeleteAccount do
describe '#perform' do
it 'performs the account deletion' do
account_deletion = double
- AccountDeletion.stub(:find).and_return(account_deletion)
- account_deletion.should_receive(:perform!)
+ allow(AccountDeletion).to receive(:find).and_return(account_deletion)
+ expect(account_deletion).to receive(:perform!)
Workers::DeleteAccount.new.perform(1)
end
diff --git a/spec/workers/delete_post_from_service_spec.rb b/spec/workers/delete_post_from_service_spec.rb
index b941335c1..75e902034 100644
--- a/spec/workers/delete_post_from_service_spec.rb
+++ b/spec/workers/delete_post_from_service_spec.rb
@@ -9,8 +9,8 @@ describe Workers::DeletePostFromService do
it 'calls service#delete_post with given service' do
m = double()
url = "foobar"
- m.should_receive(:delete_post)
- Service.stub(:find_by_id).and_return(m)
+ expect(m).to receive(:delete_post)
+ allow(Service).to receive(:find_by_id).and_return(m)
Workers::DeletePostFromService.new.perform("123", @post.id.to_s)
end
end
diff --git a/spec/workers/export_photos_spec.rb b/spec/workers/export_photos_spec.rb
new file mode 100644
index 000000000..15db9eee4
--- /dev/null
+++ b/spec/workers/export_photos_spec.rb
@@ -0,0 +1,26 @@
+require 'spec_helper'
+
+describe Workers::ExportPhotos do
+
+ before do
+ allow(User).to receive(:find).with(alice.id).and_return(alice)
+ end
+
+ it 'calls export_photos! on user with given id' do
+ expect(alice).to receive(:perform_export_photos!)
+ Workers::ExportPhotos.new.perform(alice.id)
+ end
+
+ it 'sends a success message when the export photos is successful' do
+ allow(alice).to receive(:exported_photos_file).and_return(OpenStruct.new)
+ expect(ExportMailer).to receive(:export_photos_complete_for).with(alice).and_call_original
+ Workers::ExportPhotos.new.perform(alice.id)
+ end
+
+ it 'sends a failure message when the export photos fails' do
+ allow(alice).to receive(:exported_photos_file).and_return(nil)
+ expect(alice).to receive(:perform_export_photos!).and_return(false)
+ expect(ExportMailer).to receive(:export_photos_failure_for).with(alice).and_call_original
+ Workers::ExportPhotos.new.perform(alice.id)
+ end
+end
diff --git a/spec/workers/export_user_spec.rb b/spec/workers/export_user_spec.rb
new file mode 100644
index 000000000..795a9f6b8
--- /dev/null
+++ b/spec/workers/export_user_spec.rb
@@ -0,0 +1,26 @@
+require 'spec_helper'
+
+describe Workers::ExportUser do
+
+ before do
+ allow(User).to receive(:find).with(alice.id).and_return(alice)
+ end
+
+ it 'calls export! on user with given id' do
+ expect(alice).to receive(:perform_export!)
+ Workers::ExportUser.new.perform(alice.id)
+ end
+
+ it 'sends a success message when the export is successful' do
+ allow(alice).to receive(:export).and_return(OpenStruct.new)
+ expect(ExportMailer).to receive(:export_complete_for).with(alice).and_call_original
+ Workers::ExportUser.new.perform(alice.id)
+ end
+
+ it 'sends a failure message when the export fails' do
+ allow(alice).to receive(:export).and_return(nil)
+ expect(alice).to receive(:perform_export!).and_return(false)
+ expect(ExportMailer).to receive(:export_failure_for).with(alice).and_call_original
+ Workers::ExportUser.new.perform(alice.id)
+ end
+end
diff --git a/spec/workers/fetch_profile_photo_spec.rb b/spec/workers/fetch_profile_photo_spec.rb
index 24afa1d70..0b118ce7e 100644
--- a/spec/workers/fetch_profile_photo_spec.rb
+++ b/spec/workers/fetch_profile_photo_spec.rb
@@ -7,36 +7,36 @@ describe Workers::FetchProfilePhoto do
@url = "https://service.com/user/profile_image"
- @service.stub(:profile_photo_url).and_return(@url)
- @user.stub(:update_profile)
+ allow(@service).to receive(:profile_photo_url).and_return(@url)
+ allow(@user).to receive(:update_profile)
- User.stub(:find).and_return(@user)
- Service.stub(:find).and_return(@service)
+ allow(User).to receive(:find).and_return(@user)
+ allow(Service).to receive(:find).and_return(@service)
@photo_double = double
- @photo_double.stub(:save!).and_return(true)
- @photo_double.stub(:url).and_return("image.jpg")
+ allow(@photo_double).to receive(:save!).and_return(true)
+ allow(@photo_double).to receive(:url).and_return("image.jpg")
end
it 'saves the profile image' do
- @photo_double.should_receive(:save!).and_return(true)
- Photo.should_receive(:diaspora_initialize).with(hash_including(:author => @user.person, :image_url => @url, :pending => true)).and_return(@photo_double)
+ expect(@photo_double).to receive(:save!).and_return(true)
+ expect(Photo).to receive(:diaspora_initialize).with(hash_including(:author => @user.person, :image_url => @url, :pending => true)).and_return(@photo_double)
Workers::FetchProfilePhoto.new.perform(@user.id, @service.id)
end
context "service does not have a profile_photo_url" do
it "does nothing without fallback" do
- @service.stub(:profile_photo_url).and_return(nil)
- Photo.should_not_receive(:diaspora_initialize)
+ allow(@service).to receive(:profile_photo_url).and_return(nil)
+ expect(Photo).not_to receive(:diaspora_initialize)
Workers::FetchProfilePhoto.new.perform(@user.id, @service.id)
end
it "fetches fallback if it's provided" do
- @photo_double.should_receive(:save!).and_return(true)
- @service.stub(:profile_photo_url).and_return(nil)
- Photo.should_receive(:diaspora_initialize).with(hash_including(:author => @user.person, :image_url => "https://service.com/fallback_lowres.jpg", :pending => true)).and_return(@photo_double)
+ expect(@photo_double).to receive(:save!).and_return(true)
+ allow(@service).to receive(:profile_photo_url).and_return(nil)
+ expect(Photo).to receive(:diaspora_initialize).with(hash_including(:author => @user.person, :image_url => "https://service.com/fallback_lowres.jpg", :pending => true)).and_return(@photo_double)
Workers::FetchProfilePhoto.new.perform(@user.id, @service.id, "https://service.com/fallback_lowres.jpg")
end
@@ -44,10 +44,10 @@ describe Workers::FetchProfilePhoto do
it 'updates the profile' do
- @photo_double.stub(:url).and_return("large.jpg", "medium.jpg", "small.jpg")
+ allow(@photo_double).to receive(:url).and_return("large.jpg", "medium.jpg", "small.jpg")
- Photo.should_receive(:diaspora_initialize).and_return(@photo_double)
- @user.should_receive(:update_profile).with(hash_including({
+ expect(Photo).to receive(:diaspora_initialize).and_return(@photo_double)
+ expect(@user).to receive(:update_profile).with(hash_including({
:image_url => "large.jpg",
:image_url_medium => "medium.jpg",
:image_url_small => "small.jpg"
diff --git a/spec/workers/gather_o_embed_data_spec.rb b/spec/workers/gather_o_embed_data_spec.rb
index 361502c0e..97177d7de 100644
--- a/spec/workers/gather_o_embed_data_spec.rb
+++ b/spec/workers/gather_o_embed_data_spec.rb
@@ -32,7 +32,7 @@ describe Workers::GatherOEmbedData do
it 'requests not data from the internet' do
Workers::GatherOEmbedData.new.perform(@status_message.id, @flickr_photo_url)
- a_request(:get, @flickr_oembed_get_request).should have_been_made
+ expect(a_request(:get, @flickr_oembed_get_request)).to have_been_made
end
it 'requests not data from the internet only once' do
@@ -40,7 +40,7 @@ describe Workers::GatherOEmbedData do
Workers::GatherOEmbedData.new.perform(@status_message.id, @flickr_photo_url)
end
- a_request(:get, @flickr_oembed_get_request).should have_been_made.times(1)
+ expect(a_request(:get, @flickr_oembed_get_request)).to have_been_made.times(1)
end
it 'creates one cache entry' do
@@ -48,16 +48,16 @@ describe Workers::GatherOEmbedData do
expected_data = @flickr_oembed_data
expected_data['trusted_endpoint_url'] = @flickr_oembed_url
- OEmbedCache.find_by_url(@flickr_photo_url).data.should == expected_data
+ expect(OEmbedCache.find_by_url(@flickr_photo_url).data).to eq(expected_data)
Workers::GatherOEmbedData.new.perform(@status_message.id, @flickr_photo_url)
- OEmbedCache.count(:conditions => {:url => @flickr_photo_url}).should == 1
+ expect(OEmbedCache.where(url: @flickr_photo_url).count).to eq(1)
end
it 'creates no cache entry for unsupported pages' do
Workers::GatherOEmbedData.new.perform(@status_message.id, @no_oembed_url)
- OEmbedCache.find_by_url(@no_oembed_url).should be_nil
+ expect(OEmbedCache.find_by_url(@no_oembed_url)).to be_nil
end
it 'gracefully handles a deleted post' do
diff --git a/spec/workers/gather_open_graph_data_spec.rb b/spec/workers/gather_open_graph_data_spec.rb
index c7a2a8f2b..ac7c4eecd 100644
--- a/spec/workers/gather_open_graph_data_spec.rb
+++ b/spec/workers/gather_open_graph_data_spec.rb
@@ -3,7 +3,7 @@ describe Workers::GatherOpenGraphData do
before do
@ogsite_title = 'Homepage'
@ogsite_type = 'website'
- @ogsite_image = '/img/something.png'
+ @ogsite_image = 'http://www.we-support-open-graph.com/img/something.png'
@ogsite_url = 'http://www.we-support-open-graph.com'
@ogsite_description = 'Homepage'
@@ -16,19 +16,35 @@ describe Workers::GatherOpenGraphData do
<meta property=\"og:description\" content=\"#{@ogsite_description}\" />
</head><body></body></html>"
+ @oglong_title = "D" * 256
+ @oglong_url = 'http://www.we-are-too-long.com'
+ @oglong_body =
+ "<html><head><title>#{@oglong_title}</title>
+ <meta property=\"og:title\" content=\"#{@oglong_title}\"/>
+ <meta property=\"og:type\" content=\"#{@ogsite_type}\" />
+ <meta property=\"og:image\" content=\"#{@ogsite_image}\" />
+ <meta property=\"og:url\" content=\"#{@oglong_url}\" />
+ <meta property=\"og:description\" content=\"#{@ogsite_description}\" />
+ </head><body></body></html>"
+
@no_open_graph_url = 'http://www.we-do-not-support-open-graph.com/index.html'
@status_message = FactoryGirl.create(:status_message)
- stub_request(:get, @ogsite_url).to_return(:status => 200, :body => @ogsite_body)
- stub_request(:get, @no_open_graph_url).to_return(:status => 200, :body => '<html><body>hello there</body></html>')
+ stub_request(:head, @ogsite_url).to_return(status: 200, body: "", headers: {'Content-Type' => 'text/html; utf-8'})
+ stub_request(:get, @ogsite_url).to_return(status: 200, body: @ogsite_body, headers: {'Content-Type' => 'text/html; utf-8'})
+ stub_request(:head, @no_open_graph_url).to_return(status: 200, body: "", headers: {'Content-Type' => 'text/html; utf-8'})
+ stub_request(:get, @no_open_graph_url).to_return(:status => 200, :body => '<html><head><title>Hi</title><body>hello there</body></html>', headers: {'Content-Type' => 'text/html; utf-8'})
+ stub_request(:head, @oglong_url).to_return(status: 200, body: "", headers: {'Content-Type' => 'text/html; utf-8'})
+ stub_request(:get, @oglong_url).to_return(status: 200, body: @oglong_body, headers: {'Content-Type' => 'text/html; utf-8'})
+
end
describe '.perform' do
it 'requests not data from the internet' do
Workers::GatherOpenGraphData.new.perform(@status_message.id, @ogsite_url)
- a_request(:get, @ogsite_url).should have_been_made
+ expect(a_request(:get, @ogsite_url)).to have_been_made
end
it 'requests not data from the internet only once' do
@@ -36,7 +52,7 @@ describe Workers::GatherOpenGraphData do
Workers::GatherOpenGraphData.new.perform(@status_message.id, @ogsite_url)
end
- a_request(:get, @ogsite_url).should have_been_made.times(1)
+ expect(a_request(:get, @ogsite_url)).to have_been_made.times(1)
end
it 'creates one cache entry' do
@@ -44,20 +60,20 @@ describe Workers::GatherOpenGraphData do
ogc = OpenGraphCache.find_by_url(@ogsite_url)
- ogc.title.should == @ogsite_title
- ogc.ob_type.should == @ogsite_type
- ogc.image.should == @ogsite_url + @ogsite_image
- ogc.url.should == @ogsite_url
- ogc.description.should == @ogsite_description
+ expect(ogc.title).to eq(@ogsite_title)
+ expect(ogc.ob_type).to eq(@ogsite_type)
+ expect(ogc.image).to eq(@ogsite_image)
+ expect(ogc.url).to eq(@ogsite_url)
+ expect(ogc.description).to eq(@ogsite_description)
Workers::GatherOpenGraphData.new.perform(@status_message.id, @ogsite_url)
- OpenGraphCache.count(:conditions => {:url => @ogsite_url}).should == 1
+ expect(OpenGraphCache.where(url: @ogsite_url).count).to eq(1)
end
it 'creates no cache entry for unsupported pages' do
Workers::GatherOpenGraphData.new.perform(@status_message.id, @no_open_graph_url)
- OpenGraphCache.find_by_url(@no_open_graph_url).should be_nil
+ expect(OpenGraphCache.find_by_url(@no_open_graph_url)).to be_nil
end
it 'gracefully handles a deleted post' do
@@ -65,5 +81,11 @@ describe Workers::GatherOpenGraphData do
Workers::GatherOpenGraphData.new.perform(0, @ogsite_url)
}.to_not raise_error
end
+ it 'truncates + inserts titles that are too long' do
+ Workers::GatherOpenGraphData.new.perform(@status_message.id, @oglong_url)
+ ogc = OpenGraphCache.find_by_url(@oglong_url)
+ expect(ogc).to be_truthy
+ expect(ogc.title.length).to be <= 255
+ end
end
end
diff --git a/spec/workers/http_multi_spec.rb b/spec/workers/http_multi_spec.rb
index b78088e8f..594f107eb 100644
--- a/spec/workers/http_multi_spec.rb
+++ b/spec/workers/http_multi_spec.rb
@@ -16,11 +16,11 @@ describe Workers::HttpMulti do
@post_xml = Base64.encode64 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH"
@hydra = Typhoeus::Hydra.new
- Typhoeus::Hydra.stub(:new).and_return(@hydra)
+ allow(Typhoeus::Hydra).to receive(:new).and_return(@hydra)
@salmon = Salmon::EncryptedSlap.create_by_user_and_activity bob, Base64.decode64(@post_xml)
- Salmon::EncryptedSlap.stub(:create_by_user_and_activity).and_return @salmon
+ allow(Salmon::EncryptedSlap).to receive(:create_by_user_and_activity).and_return @salmon
@body = "encrypted things"
- @salmon.stub(:xml_for).and_return @body
+ allow(@salmon).to receive(:xml_for).and_return @body
@response = Typhoeus::Response.new(
code: 200,
@@ -57,8 +57,8 @@ describe Workers::HttpMulti do
Typhoeus.stub(person.receive_url).and_return @response
end
- @hydra.should_receive(:queue).twice
- @hydra.should_receive(:run).once
+ expect(@hydra).to receive(:queue).twice
+ expect(@hydra).to receive(:run).once
Workers::HttpMulti.new.perform bob.id, @post_xml, @people.map(&:id), "Postzord::Dispatcher::Private"
end
@@ -68,7 +68,7 @@ describe Workers::HttpMulti do
Typhoeus.stub(person.receive_url).and_return @failed_response
- Workers::HttpMulti.should_receive(:perform_in).with(1.hour, bob.id, @post_xml, [person.id], anything, 1).once
+ expect(Workers::HttpMulti).to receive(:perform_in).with(1.hour, bob.id, @post_xml, [person.id], anything, 1).once
Workers::HttpMulti.new.perform bob.id, @post_xml, [person.id], "Postzord::Dispatcher::Private"
end
@@ -77,7 +77,7 @@ describe Workers::HttpMulti do
Typhoeus.stub(person.receive_url).and_return @unable_to_resolve_response
- Workers::HttpMulti.should_receive(:perform_in).with(1.hour, bob.id, @post_xml, [person.id], anything, 1).once
+ expect(Workers::HttpMulti).to receive(:perform_in).with(1.hour, bob.id, @post_xml, [person.id], anything, 1).once
Workers::HttpMulti.new.perform bob.id, @post_xml, [person.id], "Postzord::Dispatcher::Private"
end
@@ -86,7 +86,7 @@ describe Workers::HttpMulti do
Typhoeus.stub(person.receive_url).and_return @ssl_error_response
- Workers::HttpMulti.should_not_receive(:perform_in)
+ expect(Workers::HttpMulti).not_to receive(:perform_in)
Workers::HttpMulti.new.perform bob.id, @post_xml, [person.id], "Postzord::Dispatcher::Private"
end
@@ -95,7 +95,7 @@ describe Workers::HttpMulti do
Typhoeus.stub(person.receive_url).and_return @failed_response
- Workers::HttpMulti.should_not_receive :perform_in
+ expect(Workers::HttpMulti).not_to receive :perform_in
Workers::HttpMulti.new.perform bob.id, @post_xml, [person.id], "Postzord::Dispatcher::Private", 3
end
@@ -103,7 +103,7 @@ describe Workers::HttpMulti do
person = @people.first
Typhoeus.stub(person.receive_url).and_return @response
- @salmon.should_receive(:xml_for).and_return @body
+ expect(@salmon).to receive(:xml_for).and_return @body
Workers::HttpMulti.new.perform bob.id, @post_xml, [person.id], "Postzord::Dispatcher::Private"
end
@@ -124,7 +124,7 @@ describe Workers::HttpMulti do
Workers::HttpMulti.new.perform bob.id, @post_xml, [person.id], "Postzord::Dispatcher::Private"
person.reload
- person.url.should == "https://remote.net/"
+ expect(person.url).to eq("https://remote.net/")
end
it 'only sends to users with valid RSA keys' do
@@ -132,13 +132,12 @@ describe Workers::HttpMulti do
person.serialized_public_key = "-----BEGIN RSA PUBLIC KEY-----\nPsych!\n-----END RSA PUBLIC KEY-----"
person.save
- # Should be possible to drop when converting should_receive to expect(...).to
- RSpec::Mocks.proxy_for(Salmon::EncryptedSlap).reset
+ allow(@salmon).to receive(:xml_for).and_call_original
Typhoeus.stub(person.receive_url).and_return @response
Typhoeus.stub(@people[1].receive_url).and_return @response
- @hydra.should_receive(:queue).once
+ expect(@hydra).to receive(:queue).once
Workers::HttpMulti.new.perform bob.id, @post_xml, @people.map(&:id), "Postzord::Dispatcher::Private"
end
end
diff --git a/spec/workers/mail/invite_email_spec.rb b/spec/workers/mail/invite_email_spec.rb
index ca0a2d6e2..ef0ca75c7 100644
--- a/spec/workers/mail/invite_email_spec.rb
+++ b/spec/workers/mail/invite_email_spec.rb
@@ -6,9 +6,9 @@ describe Workers::Mail::InviteEmail do
let(:email_inviter) { double('EmailInviter') }
it 'creates a new email inviter' do
- EmailInviter.should_receive(:new).with(emails, alice, message: message)
+ expect(EmailInviter).to receive(:new).with(emails, alice, message: message)
.and_return(email_inviter)
- email_inviter.should_receive(:send!)
- Workers::Mail::InviteEmail.new.perform(emails, alice, message: message)
+ expect(email_inviter).to receive(:send!)
+ Workers::Mail::InviteEmail.new.perform(emails, alice.id, message: message)
end
end
diff --git a/spec/workers/mail/mentioned_spec.rb b/spec/workers/mail/mentioned_spec.rb
index 332f8cdda..32ab738eb 100644
--- a/spec/workers/mail/mentioned_spec.rb
+++ b/spec/workers/mail/mentioned_spec.rb
@@ -12,8 +12,8 @@ describe Workers::Mail::Mentioned do
m = Mention.new(:person => user.person, :post=> sm)
mail_double = double()
- mail_double.should_receive(:deliver)
- Notifier.should_receive(:mentioned).with(user.id, sm.author.id, m.id).and_return(mail_double)
+ expect(mail_double).to receive(:deliver_now)
+ expect(Notifier).to receive(:mentioned).with(user.id, sm.author.id, m.id).and_return(mail_double)
Workers::Mail::Mentioned.new.perform(user.id, sm.author.id, m.id)
end
diff --git a/spec/workers/mail/private_message_spec.rb b/spec/workers/mail/private_message_spec.rb
index 3fa271342..311f7cdce 100644
--- a/spec/workers/mail/private_message_spec.rb
+++ b/spec/workers/mail/private_message_spec.rb
@@ -18,8 +18,8 @@ describe Workers::Mail::PrivateMessage do
message = cnv.messages.first
mail_double = double()
- mail_double.should_receive(:deliver)
- Notifier.should_receive(:mentioned).with(user2.id, user1.person.id, message.id).and_return(mail_double)
+ expect(mail_double).to receive(:deliver_now)
+ expect(Notifier).to receive(:mentioned).with(user2.id, user1.person.id, message.id).and_return(mail_double)
Workers::Mail::Mentioned.new.perform(user2.id, user1.person.id, message.id)
end
diff --git a/spec/workers/mail/reshared_spec.rb b/spec/workers/mail/reshared_spec.rb
index 478cd5a96..74b5c43ec 100644
--- a/spec/workers/mail/reshared_spec.rb
+++ b/spec/workers/mail/reshared_spec.rb
@@ -11,8 +11,8 @@ describe Workers::Mail::Reshared do
reshare = FactoryGirl.build(:reshare, :author => alice.person, :root=> sm)
mail_double = double()
- mail_double.should_receive(:deliver)
- Notifier.should_receive(:reshared).with(bob.id, reshare.author.id, reshare.id).and_return(mail_double)
+ expect(mail_double).to receive(:deliver_now)
+ expect(Notifier).to receive(:reshared).with(bob.id, reshare.author.id, reshare.id).and_return(mail_double)
Workers::Mail::Reshared.new.perform(bob.id, reshare.author.id, reshare.id)
end
diff --git a/spec/workers/notify_local_users_spec.rb b/spec/workers/notify_local_users_spec.rb
index b058d0f77..f49383e46 100644
--- a/spec/workers/notify_local_users_spec.rb
+++ b/spec/workers/notify_local_users_spec.rb
@@ -7,14 +7,13 @@ require 'spec_helper'
describe Workers::NotifyLocalUsers do
describe '#perfom' do
it 'should call Notification.notify for each participant user' do
- person = FactoryGirl.create :person
- post = FactoryGirl.create :status_message
+ post = double(id: 1234, author: double(diaspora_handle: "foo@bar"))
+ klass_name = double(constantize: double(find_by_id: post))
+ person = double(id: 4321)
+ allow(Person).to receive(:find_by_id).and_return(person)
+ expect(Notification).to receive(:notify).with(instance_of(User), post, person).twice
- StatusMessage.should_receive(:find_by_id).with(post.id).and_return(post)
- #User.should_receive(:where).and_return([alice, eve])
- Notification.should_receive(:notify).with(instance_of(User), instance_of(StatusMessage), instance_of(Person)).twice
-
- Workers::NotifyLocalUsers.new.perform([alice.id, eve.id], post.class.to_s, post.id, person.id)
+ Workers::NotifyLocalUsers.new.perform([alice.id, eve.id], klass_name, post.id, person.id)
end
end
end
diff --git a/spec/workers/post_to_service_spec.rb b/spec/workers/post_to_service_spec.rb
index 4ba8c4767..e75578079 100644
--- a/spec/workers/post_to_service_spec.rb
+++ b/spec/workers/post_to_service_spec.rb
@@ -5,11 +5,11 @@ describe Workers::PostToService do
user = alice
aspect = user.aspects.create(:name => "yeah")
post = user.post(:status_message, :text => 'foo', :to => aspect.id)
- User.stub(:find_by_id).with(user.id.to_s).and_return(user)
+ allow(User).to receive(:find_by_id).with(user.id.to_s).and_return(user)
m = double()
url = "foobar"
- m.should_receive(:post).with(anything, url)
- Service.stub(:find_by_id).and_return(m)
+ expect(m).to receive(:post).with(anything, url)
+ allow(Service).to receive(:find_by_id).and_return(m)
Workers::PostToService.new.perform("123", post.id.to_s, url)
end
end
diff --git a/spec/workers/process_photo_spec.rb b/spec/workers/process_photo_spec.rb
index 5b07b4316..8e28fba74 100644
--- a/spec/workers/process_photo_spec.rb
+++ b/spec/workers/process_photo_spec.rb
@@ -12,14 +12,14 @@ describe Workers::ProcessPhoto do
end
it 'saves the processed image' do
- @saved_photo.processed_image.path.should be_nil
+ expect(@saved_photo.processed_image.path).to be_nil
result = Workers::ProcessPhoto.new.perform(@saved_photo.id)
@saved_photo.reload
- @saved_photo.processed_image.path.should_not be_nil
- result.should be true
+ expect(@saved_photo.processed_image.path).not_to be_nil
+ expect(result).to be true
end
context 'when trying to process a photo that has already been processed' do
@@ -35,8 +35,8 @@ describe Workers::ProcessPhoto do
@saved_photo.reload
- @saved_photo.processed_image.path.should == processed_image_path
- result.should be false
+ expect(@saved_photo.processed_image.path).to eq(processed_image_path)
+ expect(result).to be false
end
end
@@ -50,8 +50,8 @@ describe Workers::ProcessPhoto do
it 'does not process the gif' do
result = Workers::ProcessPhoto.new.perform(@saved_gif.id)
- @saved_gif.reload.processed_image.path.should be_nil
- result.should be false
+ expect(@saved_gif.reload.processed_image.path).to be_nil
+ expect(result).to be false
end
end
@@ -61,6 +61,12 @@ describe Workers::ProcessPhoto do
expect{
result = Workers::ProcessPhoto.new.perform(p.id)
}.to_not raise_error
-
+
+ end
+
+ it 'handles already deleted photos gracefully' do
+ expect {
+ Workers::ProcessPhoto.new.perform(0)
+ }.to_not raise_error
end
end
diff --git a/spec/workers/publish_to_hub_spec.rb b/spec/workers/publish_to_hub_spec.rb
index 47cb4a9a4..d864ae2c9 100644
--- a/spec/workers/publish_to_hub_spec.rb
+++ b/spec/workers/publish_to_hub_spec.rb
@@ -10,8 +10,8 @@ describe Workers::PublishToHub do
url = "http://publiczone.com/"
m = double()
- m.should_receive(:publish).with(url+'.atom')
- Pubsubhubbub.should_receive(:new).with(AppConfig.environment.pubsub_server).and_return(m)
+ expect(m).to receive(:publish).with(url+'.atom')
+ expect(Pubsubhubbub).to receive(:new).with(AppConfig.environment.pubsub_server).and_return(m)
Workers::PublishToHub.new.perform(url)
end
end
diff --git a/spec/workers/queue_users_for_removal_spec.rb b/spec/workers/queue_users_for_removal_spec.rb
new file mode 100644
index 000000000..6e00fe76c
--- /dev/null
+++ b/spec/workers/queue_users_for_removal_spec.rb
@@ -0,0 +1,82 @@
+require 'spec_helper'
+
+describe Workers::QueueUsersForRemoval do
+ describe 'remove_old_users is active' do
+ before do
+ AppConfig.settings.maintenance.remove_old_users.enable = true
+ ActionMailer::Base.deliveries = nil
+ Timecop.freeze
+ end
+
+ it '#does not queue user that is not inactive' do
+ user = FactoryGirl.create(:user, :last_seen => Time.now-728.days, :sign_in_count => 5)
+ Workers::QueueUsersForRemoval.new.perform
+ user.reload
+ expect(user.remove_after).to eq(nil)
+ expect(ActionMailer::Base.deliveries.count).to eq(0)
+ end
+
+ it '#queues user that is inactive' do
+ removal_date = Time.now + (AppConfig.settings.maintenance.remove_old_users.warn_days.to_i).days
+ user = FactoryGirl.create(:user, :last_seen => Time.now-732.days, :sign_in_count => 5)
+ Workers::QueueUsersForRemoval.new.perform
+ user.reload
+ expect(user.remove_after.to_i).to eq(removal_date.utc.to_i)
+ expect(ActionMailer::Base.deliveries.count).to eq(1)
+ end
+
+ it '#queues user that is inactive and has not logged in' do
+ removal_date = Time.now
+ user = FactoryGirl.create(:user, :last_seen => Time.now-735.days, :sign_in_count => 0)
+ Workers::QueueUsersForRemoval.new.perform
+ user.reload
+ expect(user.remove_after.to_i).to eq(removal_date.utc.to_i)
+ expect(ActionMailer::Base.deliveries.count).to eq(0) # no email sent
+ end
+
+ it '#does not queue user that is not inactive and has not logged in' do
+ user = FactoryGirl.create(:user, :last_seen => Time.now-728.days, :sign_in_count => 0)
+ Workers::QueueUsersForRemoval.new.perform
+ user.reload
+ expect(user.remove_after).to eq(nil)
+ expect(ActionMailer::Base.deliveries.count).to eq(0)
+ end
+
+ it '#does not queue user that has already been flagged for removal' do
+ removal_date = Date.today + 5.days
+ user = FactoryGirl.create(:user, :last_seen => Time.now-735.days, :sign_in_count => 5, :remove_after => removal_date)
+ Workers::QueueUsersForRemoval.new.perform
+ user.reload
+ expect(user.remove_after).to eq(removal_date)
+ expect(ActionMailer::Base.deliveries.count).to eq(0)
+ end
+
+ after do
+ Timecop.return
+ end
+ end
+
+ describe 'remove_old_users is inactive' do
+ before do
+ AppConfig.settings.maintenance.remove_old_users.enable = false
+ ActionMailer::Base.deliveries = nil
+ end
+
+ it '#does not queue user that is not inactive' do
+ user = FactoryGirl.create(:user, :last_seen => Time.now-728.days, :sign_in_count => 5)
+ Workers::QueueUsersForRemoval.new.perform
+ user.reload
+ expect(user.remove_after).to eq(nil)
+ expect(ActionMailer::Base.deliveries.count).to eq(0)
+ end
+
+ it '#does not queue user that is inactive' do
+ user = FactoryGirl.create(:user, :last_seen => Time.now-735.days, :sign_in_count => 5)
+ Workers::QueueUsersForRemoval.new.perform
+ user.reload
+ expect(user.remove_after).to eq(nil)
+ expect(ActionMailer::Base.deliveries.count).to eq(0)
+ end
+
+ end
+end
diff --git a/spec/workers/receive_local_batch_spec.rb b/spec/workers/receive_local_batch_spec.rb
new file mode 100644
index 000000000..acd841cf3
--- /dev/null
+++ b/spec/workers/receive_local_batch_spec.rb
@@ -0,0 +1,14 @@
+require "spec_helper"
+
+describe Workers::ReceiveLocalBatch do
+ it "calls the postzord" do
+ post = double
+ allow(Post).to receive(:find).with(1).and_return(post)
+
+ zord = double
+ expect(Postzord::Receiver::LocalBatch).to receive(:new).with(post, [2]).and_return(zord)
+ expect(zord).to receive(:perform!)
+
+ Workers::ReceiveLocalBatch.new.perform("Post", 1, [2])
+ end
+end
diff --git a/spec/workers/receive_salmon_spec.rb b/spec/workers/receive_salmon_spec.rb
index 84e598e33..a57bc6fbc 100644
--- a/spec/workers/receive_salmon_spec.rb
+++ b/spec/workers/receive_salmon_spec.rb
@@ -4,7 +4,7 @@ describe Workers::ReceiveEncryptedSalmon do
before do
@user = alice
@xml = '<xml></xml>'
- User.stub(:find){ |id|
+ allow(User).to receive(:find){ |id|
if id == @user.id
@user
else
@@ -15,8 +15,8 @@ describe Workers::ReceiveEncryptedSalmon do
it 'calls receive_salmon' do
zord = double
- zord.should_receive(:perform!)
- Postzord::Receiver::Private.should_receive(:new).with(@user, hash_including(:salmon_xml => @xml)).and_return(zord)
+ expect(zord).to receive(:perform!)
+ expect(Postzord::Receiver::Private).to receive(:new).with(@user, hash_including(:salmon_xml => @xml)).and_return(zord)
Workers::ReceiveEncryptedSalmon.new.perform(@user.id, @xml)
end
diff --git a/spec/workers/receive_spec.rb b/spec/workers/receive_spec.rb
index dda95c890..0ee0b0a53 100644
--- a/spec/workers/receive_spec.rb
+++ b/spec/workers/receive_spec.rb
@@ -5,7 +5,7 @@ describe Workers::Receive do
@user = alice
@person = FactoryGirl.create(:person)
@xml = '<xml></xml>'
- User.stub(:find){ |id|
+ allow(User).to receive(:find){ |id|
if id == @user.id
@user
else
@@ -16,8 +16,8 @@ describe Workers::Receive do
it 'calls receive' do
zord_double = double()
- zord_double.should_receive(:parse_and_receive).with(@xml)
- Postzord::Receiver::Private.should_receive(:new).with(@user, anything).and_return(zord_double)
+ expect(zord_double).to receive(:parse_and_receive).with(@xml)
+ expect(Postzord::Receiver::Private).to receive(:new).with(@user, anything).and_return(zord_double)
Workers::Receive.new.perform(@user.id, @xml, @person.id)
end
end
diff --git a/spec/workers/remove_old_user_spec.rb b/spec/workers/remove_old_user_spec.rb
new file mode 100644
index 000000000..12e0fad57
--- /dev/null
+++ b/spec/workers/remove_old_user_spec.rb
@@ -0,0 +1,52 @@
+require 'spec_helper'
+
+describe Workers::RemoveOldUser do
+ describe 'remove_old_users is active' do
+ before do
+ AppConfig.settings.maintenance.remove_old_users.enable = true
+ end
+
+ it '#removes user whose remove_after timestamp has passed' do
+ user = double(id: 1, remove_after: 1.day.ago, last_seen: 1000.days.ago)
+ allow(User).to receive(:find).with(user.id).and_return(user)
+ expect(user).to receive(:close_account!)
+ Workers::RemoveOldUser.new.perform(user.id)
+ end
+
+ it '#doesnt remove user whose remove_after timestamp hasnt passed' do
+ user = double(id: 1, remove_after: 1.day.from_now, last_seen: 1000.days.ago)
+ allow(User).to receive(:find).with(user.id).and_return(user)
+ expect(user).to_not receive(:close_account!)
+ Workers::RemoveOldUser.new.perform(user.id)
+ end
+
+ it '#doesnt remove user whose remove_after timestamp has passed but last_seen is recent' do
+ user = double(id: 1, remove_after: 1.day.ago, last_seen: 1.day.ago)
+ allow(User).to receive(:find).with(user.id).and_return(user)
+ expect(user).to_not receive(:close_account!)
+ Workers::RemoveOldUser.new.perform(user.id)
+ end
+
+ end
+
+ describe 'remove_old_users is inactive' do
+ before do
+ AppConfig.settings.maintenance.remove_old_users.enable = false
+ end
+
+ it '#doesnt remove user whose remove_after timestamp has passed' do
+ user = double(id: 1, remove_after: 1.day.ago, last_seen: 1000.days.ago)
+ allow(User).to receive(:find).with(user.id).and_return(user)
+ expect(user).to_not receive(:close_account!)
+ Workers::RemoveOldUser.new.perform(user.id)
+ end
+
+ it '#doesnt remove user whose remove_after timestamp hasnt passed' do
+ user = double(id: 1, remove_after: 1.day.from_now, last_seen: 1000.days.ago)
+ allow(User).to receive(:find).with(user.id).and_return(user)
+ expect(user).to_not receive(:close_account!)
+ Workers::RemoveOldUser.new.perform(user.id)
+ end
+
+ end
+end
diff --git a/spec/workers/resend_invitation_spec.rb b/spec/workers/resend_invitation_spec.rb
index a0e0afd33..002cf78a5 100644
--- a/spec/workers/resend_invitation_spec.rb
+++ b/spec/workers/resend_invitation_spec.rb
@@ -9,8 +9,8 @@ describe Workers::ResendInvitation do
it 'should call .resend on the object' do
invite = FactoryGirl.build(:invitation, :service => 'email', :identifier => 'foo@bar.com')
- Invitation.stub(:find).and_return(invite)
- invite.should_receive(:resend)
+ allow(Invitation).to receive(:find).and_return(invite)
+ expect(invite).to receive(:resend)
Workers::ResendInvitation.new.perform(invite.id)
end
end
diff --git a/spec/workers/reset_password_spec.rb b/spec/workers/reset_password_spec.rb
index eed8697d7..f0f393f75 100644
--- a/spec/workers/reset_password_spec.rb
+++ b/spec/workers/reset_password_spec.rb
@@ -11,8 +11,8 @@ describe Workers::ResetPassword do
it "correctly sets the message parameters" do
Workers::ResetPassword.new.perform(alice.id)
mail = Devise.mailer.deliveries.last
- mail.to.should == [alice.email]
- mail.body.should include("change your password")
+ expect(mail.to).to eq([alice.email])
+ expect(mail.body).to include("change your password")
end
end
end
diff --git a/vendor/assets/javascripts/handlebars-1.0.0.beta.6.js b/vendor/assets/javascripts/handlebars-1.0.0.beta.6.js
deleted file mode 100644
index 83119ff88..000000000
--- a/vendor/assets/javascripts/handlebars-1.0.0.beta.6.js
+++ /dev/null
@@ -1,1550 +0,0 @@
-// lib/handlebars/base.js
-var Handlebars = {};
-
-Handlebars.VERSION = "1.0.beta.6";
-
-Handlebars.helpers = {};
-Handlebars.partials = {};
-
-Handlebars.registerHelper = function(name, fn, inverse) {
- if(inverse) { fn.not = inverse; }
- this.helpers[name] = fn;
-};
-
-Handlebars.registerPartial = function(name, str) {
- this.partials[name] = str;
-};
-
-Handlebars.registerHelper('helperMissing', function(arg) {
- if(arguments.length === 2) {
- return undefined;
- } else {
- throw new Error("Could not find property '" + arg + "'");
- }
-});
-
-var toString = Object.prototype.toString, functionType = "[object Function]";
-
-Handlebars.registerHelper('blockHelperMissing', function(context, options) {
- var inverse = options.inverse || function() {}, fn = options.fn;
-
-
- var ret = "";
- var type = toString.call(context);
-
- if(type === functionType) { context = context.call(this); }
-
- if(context === true) {
- return fn(this);
- } else if(context === false || context == null) {
- return inverse(this);
- } else if(type === "[object Array]") {
- if(context.length > 0) {
- for(var i=0, j=context.length; i<j; i++) {
- ret = ret + fn(context[i]);
- }
- } else {
- ret = inverse(this);
- }
- return ret;
- } else {
- return fn(context);
- }
-});
-
-Handlebars.registerHelper('each', function(context, options) {
- var fn = options.fn, inverse = options.inverse;
- var ret = "";
-
- if(context && context.length > 0) {
- for(var i=0, j=context.length; i<j; i++) {
- ret = ret + fn(context[i]);
- }
- } else {
- ret = inverse(this);
- }
- return ret;
-});
-
-Handlebars.registerHelper('if', function(context, options) {
- var type = toString.call(context);
- if(type === functionType) { context = context.call(this); }
-
- if(!context || Handlebars.Utils.isEmpty(context)) {
- return options.inverse(this);
- } else {
- return options.fn(this);
- }
-});
-
-Handlebars.registerHelper('unless', function(context, options) {
- var fn = options.fn, inverse = options.inverse;
- options.fn = inverse;
- options.inverse = fn;
-
- return Handlebars.helpers['if'].call(this, context, options);
-});
-
-Handlebars.registerHelper('with', function(context, options) {
- return options.fn(context);
-});
-
-Handlebars.registerHelper('log', function(context) {
- Handlebars.log(context);
-});
-;
-// lib/handlebars/compiler/parser.js
-/* Jison generated parser */
-var handlebars = (function(){
-
-var parser = {trace: function trace() { },
-yy: {},
-symbols_: {"error":2,"root":3,"program":4,"EOF":5,"statements":6,"simpleInverse":7,"statement":8,"openInverse":9,"closeBlock":10,"openBlock":11,"mustache":12,"partial":13,"CONTENT":14,"COMMENT":15,"OPEN_BLOCK":16,"inMustache":17,"CLOSE":18,"OPEN_INVERSE":19,"OPEN_ENDBLOCK":20,"path":21,"OPEN":22,"OPEN_UNESCAPED":23,"OPEN_PARTIAL":24,"params":25,"hash":26,"param":27,"STRING":28,"INTEGER":29,"BOOLEAN":30,"hashSegments":31,"hashSegment":32,"ID":33,"EQUALS":34,"pathSegments":35,"SEP":36,"$accept":0,"$end":1},
-terminals_: {2:"error",5:"EOF",14:"CONTENT",15:"COMMENT",16:"OPEN_BLOCK",18:"CLOSE",19:"OPEN_INVERSE",20:"OPEN_ENDBLOCK",22:"OPEN",23:"OPEN_UNESCAPED",24:"OPEN_PARTIAL",28:"STRING",29:"INTEGER",30:"BOOLEAN",33:"ID",34:"EQUALS",36:"SEP"},
-productions_: [0,[3,2],[4,3],[4,1],[4,0],[6,1],[6,2],[8,3],[8,3],[8,1],[8,1],[8,1],[8,1],[11,3],[9,3],[10,3],[12,3],[12,3],[13,3],[13,4],[7,2],[17,3],[17,2],[17,2],[17,1],[25,2],[25,1],[27,1],[27,1],[27,1],[27,1],[26,1],[31,2],[31,1],[32,3],[32,3],[32,3],[32,3],[21,1],[35,3],[35,1]],
-performAction: function anonymous(yytext,yyleng,yylineno,yy,yystate,$$,_$) {
-
-var $0 = $$.length - 1;
-switch (yystate) {
-case 1: return $$[$0-1]
-break;
-case 2: this.$ = new yy.ProgramNode($$[$0-2], $$[$0])
-break;
-case 3: this.$ = new yy.ProgramNode($$[$0])
-break;
-case 4: this.$ = new yy.ProgramNode([])
-break;
-case 5: this.$ = [$$[$0]]
-break;
-case 6: $$[$0-1].push($$[$0]); this.$ = $$[$0-1]
-break;
-case 7: this.$ = new yy.InverseNode($$[$0-2], $$[$0-1], $$[$0])
-break;
-case 8: this.$ = new yy.BlockNode($$[$0-2], $$[$0-1], $$[$0])
-break;
-case 9: this.$ = $$[$0]
-break;
-case 10: this.$ = $$[$0]
-break;
-case 11: this.$ = new yy.ContentNode($$[$0])
-break;
-case 12: this.$ = new yy.CommentNode($$[$0])
-break;
-case 13: this.$ = new yy.MustacheNode($$[$0-1][0], $$[$0-1][1])
-break;
-case 14: this.$ = new yy.MustacheNode($$[$0-1][0], $$[$0-1][1])
-break;
-case 15: this.$ = $$[$0-1]
-break;
-case 16: this.$ = new yy.MustacheNode($$[$0-1][0], $$[$0-1][1])
-break;
-case 17: this.$ = new yy.MustacheNode($$[$0-1][0], $$[$0-1][1], true)
-break;
-case 18: this.$ = new yy.PartialNode($$[$0-1])
-break;
-case 19: this.$ = new yy.PartialNode($$[$0-2], $$[$0-1])
-break;
-case 20:
-break;
-case 21: this.$ = [[$$[$0-2]].concat($$[$0-1]), $$[$0]]
-break;
-case 22: this.$ = [[$$[$0-1]].concat($$[$0]), null]
-break;
-case 23: this.$ = [[$$[$0-1]], $$[$0]]
-break;
-case 24: this.$ = [[$$[$0]], null]
-break;
-case 25: $$[$0-1].push($$[$0]); this.$ = $$[$0-1];
-break;
-case 26: this.$ = [$$[$0]]
-break;
-case 27: this.$ = $$[$0]
-break;
-case 28: this.$ = new yy.StringNode($$[$0])
-break;
-case 29: this.$ = new yy.IntegerNode($$[$0])
-break;
-case 30: this.$ = new yy.BooleanNode($$[$0])
-break;
-case 31: this.$ = new yy.HashNode($$[$0])
-break;
-case 32: $$[$0-1].push($$[$0]); this.$ = $$[$0-1]
-break;
-case 33: this.$ = [$$[$0]]
-break;
-case 34: this.$ = [$$[$0-2], $$[$0]]
-break;
-case 35: this.$ = [$$[$0-2], new yy.StringNode($$[$0])]
-break;
-case 36: this.$ = [$$[$0-2], new yy.IntegerNode($$[$0])]
-break;
-case 37: this.$ = [$$[$0-2], new yy.BooleanNode($$[$0])]
-break;
-case 38: this.$ = new yy.IdNode($$[$0])
-break;
-case 39: $$[$0-2].push($$[$0]); this.$ = $$[$0-2];
-break;
-case 40: this.$ = [$$[$0]]
-break;
-}
-},
-table: [{3:1,4:2,5:[2,4],6:3,8:4,9:5,11:6,12:7,13:8,14:[1,9],15:[1,10],16:[1,12],19:[1,11],22:[1,13],23:[1,14],24:[1,15]},{1:[3]},{5:[1,16]},{5:[2,3],7:17,8:18,9:5,11:6,12:7,13:8,14:[1,9],15:[1,10],16:[1,12],19:[1,19],20:[2,3],22:[1,13],23:[1,14],24:[1,15]},{5:[2,5],14:[2,5],15:[2,5],16:[2,5],19:[2,5],20:[2,5],22:[2,5],23:[2,5],24:[2,5]},{4:20,6:3,8:4,9:5,11:6,12:7,13:8,14:[1,9],15:[1,10],16:[1,12],19:[1,11],20:[2,4],22:[1,13],23:[1,14],24:[1,15]},{4:21,6:3,8:4,9:5,11:6,12:7,13:8,14:[1,9],15:[1,10],16:[1,12],19:[1,11],20:[2,4],22:[1,13],23:[1,14],24:[1,15]},{5:[2,9],14:[2,9],15:[2,9],16:[2,9],19:[2,9],20:[2,9],22:[2,9],23:[2,9],24:[2,9]},{5:[2,10],14:[2,10],15:[2,10],16:[2,10],19:[2,10],20:[2,10],22:[2,10],23:[2,10],24:[2,10]},{5:[2,11],14:[2,11],15:[2,11],16:[2,11],19:[2,11],20:[2,11],22:[2,11],23:[2,11],24:[2,11]},{5:[2,12],14:[2,12],15:[2,12],16:[2,12],19:[2,12],20:[2,12],22:[2,12],23:[2,12],24:[2,12]},{17:22,21:23,33:[1,25],35:24},{17:26,21:23,33:[1,25],35:24},{17:27,21:23,33:[1,25],35:24},{17:28,21:23,33:[1,25],35:24},{21:29,33:[1,25],35:24},{1:[2,1]},{6:30,8:4,9:5,11:6,12:7,13:8,14:[1,9],15:[1,10],16:[1,12],19:[1,11],22:[1,13],23:[1,14],24:[1,15]},{5:[2,6],14:[2,6],15:[2,6],16:[2,6],19:[2,6],20:[2,6],22:[2,6],23:[2,6],24:[2,6]},{17:22,18:[1,31],21:23,33:[1,25],35:24},{10:32,20:[1,33]},{10:34,20:[1,33]},{18:[1,35]},{18:[2,24],21:40,25:36,26:37,27:38,28:[1,41],29:[1,42],30:[1,43],31:39,32:44,33:[1,45],35:24},{18:[2,38],28:[2,38],29:[2,38],30:[2,38],33:[2,38],36:[1,46]},{18:[2,40],28:[2,40],29:[2,40],30:[2,40],33:[2,40],36:[2,40]},{18:[1,47]},{18:[1,48]},{18:[1,49]},{18:[1,50],21:51,33:[1,25],35:24},{5:[2,2],8:18,9:5,11:6,12:7,13:8,14:[1,9],15:[1,10],16:[1,12],19:[1,11],20:[2,2],22:[1,13],23:[1,14],24:[1,15]},{14:[2,20],15:[2,20],16:[2,20],19:[2,20],22:[2,20],23:[2,20],24:[2,20]},{5:[2,7],14:[2,7],15:[2,7],16:[2,7],19:[2,7],20:[2,7],22:[2,7],23:[2,7],24:[2,7]},{21:52,33:[1,25],35:24},{5:[2,8],14:[2,8],15:[2,8],16:[2,8],19:[2,8],20:[2,8],22:[2,8],23:[2,8],24:[2,8]},{14:[2,14],15:[2,14],16:[2,14],19:[2,14],20:[2,14],22:[2,14],23:[2,14],24:[2,14]},{18:[2,22],21:40,26:53,27:54,28:[1,41],29:[1,42],30:[1,43],31:39,32:44,33:[1,45],35:24},{18:[2,23]},{18:[2,26],28:[2,26],29:[2,26],30:[2,26],33:[2,26]},{18:[2,31],32:55,33:[1,56]},{18:[2,27],28:[2,27],29:[2,27],30:[2,27],33:[2,27]},{18:[2,28],28:[2,28],29:[2,28],30:[2,28],33:[2,28]},{18:[2,29],28:[2,29],29:[2,29],30:[2,29],33:[2,29]},{18:[2,30],28:[2,30],29:[2,30],30:[2,30],33:[2,30]},{18:[2,33],33:[2,33]},{18:[2,40],28:[2,40],29:[2,40],30:[2,40],33:[2,40],34:[1,57],36:[2,40]},{33:[1,58]},{14:[2,13],15:[2,13],16:[2,13],19:[2,13],20:[2,13],22:[2,13],23:[2,13],24:[2,13]},{5:[2,16],14:[2,16],15:[2,16],16:[2,16],19:[2,16],20:[2,16],22:[2,16],23:[2,16],24:[2,16]},{5:[2,17],14:[2,17],15:[2,17],16:[2,17],19:[2,17],20:[2,17],22:[2,17],23:[2,17],24:[2,17]},{5:[2,18],14:[2,18],15:[2,18],16:[2,18],19:[2,18],20:[2,18],22:[2,18],23:[2,18],24:[2,18]},{18:[1,59]},{18:[1,60]},{18:[2,21]},{18:[2,25],28:[2,25],29:[2,25],30:[2,25],33:[2,25]},{18:[2,32],33:[2,32]},{34:[1,57]},{21:61,28:[1,62],29:[1,63],30:[1,64],33:[1,25],35:24},{18:[2,39],28:[2,39],29:[2,39],30:[2,39],33:[2,39],36:[2,39]},{5:[2,19],14:[2,19],15:[2,19],16:[2,19],19:[2,19],20:[2,19],22:[2,19],23:[2,19],24:[2,19]},{5:[2,15],14:[2,15],15:[2,15],16:[2,15],19:[2,15],20:[2,15],22:[2,15],23:[2,15],24:[2,15]},{18:[2,34],33:[2,34]},{18:[2,35],33:[2,35]},{18:[2,36],33:[2,36]},{18:[2,37],33:[2,37]}],
-defaultActions: {16:[2,1],37:[2,23],53:[2,21]},
-parseError: function parseError(str, hash) {
- throw new Error(str);
-},
-parse: function parse(input) {
- var self = this, stack = [0], vstack = [null], lstack = [], table = this.table, yytext = "", yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;
- this.lexer.setInput(input);
- this.lexer.yy = this.yy;
- this.yy.lexer = this.lexer;
- if (typeof this.lexer.yylloc == "undefined")
- this.lexer.yylloc = {};
- var yyloc = this.lexer.yylloc;
- lstack.push(yyloc);
- if (typeof this.yy.parseError === "function")
- this.parseError = this.yy.parseError;
- function popStack(n) {
- stack.length = stack.length - 2 * n;
- vstack.length = vstack.length - n;
- lstack.length = lstack.length - n;
- }
- function lex() {
- var token;
- token = self.lexer.lex() || 1;
- if (typeof token !== "number") {
- token = self.symbols_[token] || token;
- }
- return token;
- }
- var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;
- while (true) {
- state = stack[stack.length - 1];
- if (this.defaultActions[state]) {
- action = this.defaultActions[state];
- } else {
- if (symbol == null)
- symbol = lex();
- action = table[state] && table[state][symbol];
- }
- if (typeof action === "undefined" || !action.length || !action[0]) {
- if (!recovering) {
- expected = [];
- for (p in table[state])
- if (this.terminals_[p] && p > 2) {
- expected.push("'" + this.terminals_[p] + "'");
- }
- var errStr = "";
- if (this.lexer.showPosition) {
- errStr = "Parse error on line " + (yylineno + 1) + ":\n" + this.lexer.showPosition() + "\nExpecting " + expected.join(", ") + ", got '" + this.terminals_[symbol] + "'";
- } else {
- errStr = "Parse error on line " + (yylineno + 1) + ": Unexpected " + (symbol == 1?"end of input":"'" + (this.terminals_[symbol] || symbol) + "'");
- }
- this.parseError(errStr, {text: this.lexer.match, token: this.terminals_[symbol] || symbol, line: this.lexer.yylineno, loc: yyloc, expected: expected});
- }
- }
- if (action[0] instanceof Array && action.length > 1) {
- throw new Error("Parse Error: multiple actions possible at state: " + state + ", token: " + symbol);
- }
- switch (action[0]) {
- case 1:
- stack.push(symbol);
- vstack.push(this.lexer.yytext);
- lstack.push(this.lexer.yylloc);
- stack.push(action[1]);
- symbol = null;
- if (!preErrorSymbol) {
- yyleng = this.lexer.yyleng;
- yytext = this.lexer.yytext;
- yylineno = this.lexer.yylineno;
- yyloc = this.lexer.yylloc;
- if (recovering > 0)
- recovering--;
- } else {
- symbol = preErrorSymbol;
- preErrorSymbol = null;
- }
- break;
- case 2:
- len = this.productions_[action[1]][1];
- yyval.$ = vstack[vstack.length - len];
- yyval._$ = {first_line: lstack[lstack.length - (len || 1)].first_line, last_line: lstack[lstack.length - 1].last_line, first_column: lstack[lstack.length - (len || 1)].first_column, last_column: lstack[lstack.length - 1].last_column};
- r = this.performAction.call(yyval, yytext, yyleng, yylineno, this.yy, action[1], vstack, lstack);
- if (typeof r !== "undefined") {
- return r;
- }
- if (len) {
- stack = stack.slice(0, -1 * len * 2);
- vstack = vstack.slice(0, -1 * len);
- lstack = lstack.slice(0, -1 * len);
- }
- stack.push(this.productions_[action[1]][0]);
- vstack.push(yyval.$);
- lstack.push(yyval._$);
- newState = table[stack[stack.length - 2]][stack[stack.length - 1]];
- stack.push(newState);
- break;
- case 3:
- return true;
- }
- }
- return true;
-}
-};/* Jison generated lexer */
-var lexer = (function(){
-
-var lexer = ({EOF:1,
-parseError:function parseError(str, hash) {
- if (this.yy.parseError) {
- this.yy.parseError(str, hash);
- } else {
- throw new Error(str);
- }
- },
-setInput:function (input) {
- this._input = input;
- this._more = this._less = this.done = false;
- this.yylineno = this.yyleng = 0;
- this.yytext = this.matched = this.match = '';
- this.conditionStack = ['INITIAL'];
- this.yylloc = {first_line:1,first_column:0,last_line:1,last_column:0};
- return this;
- },
-input:function () {
- var ch = this._input[0];
- this.yytext+=ch;
- this.yyleng++;
- this.match+=ch;
- this.matched+=ch;
- var lines = ch.match(/\n/);
- if (lines) this.yylineno++;
- this._input = this._input.slice(1);
- return ch;
- },
-unput:function (ch) {
- this._input = ch + this._input;
- return this;
- },
-more:function () {
- this._more = true;
- return this;
- },
-pastInput:function () {
- var past = this.matched.substr(0, this.matched.length - this.match.length);
- return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\n/g, "");
- },
-upcomingInput:function () {
- var next = this.match;
- if (next.length < 20) {
- next += this._input.substr(0, 20-next.length);
- }
- return (next.substr(0,20)+(next.length > 20 ? '...':'')).replace(/\n/g, "");
- },
-showPosition:function () {
- var pre = this.pastInput();
- var c = new Array(pre.length + 1).join("-");
- return pre + this.upcomingInput() + "\n" + c+"^";
- },
-next:function () {
- if (this.done) {
- return this.EOF;
- }
- if (!this._input) this.done = true;
-
- var token,
- match,
- col,
- lines;
- if (!this._more) {
- this.yytext = '';
- this.match = '';
- }
- var rules = this._currentRules();
- for (var i=0;i < rules.length; i++) {
- match = this._input.match(this.rules[rules[i]]);
- if (match) {
- lines = match[0].match(/\n.*/g);
- if (lines) this.yylineno += lines.length;
- this.yylloc = {first_line: this.yylloc.last_line,
- last_line: this.yylineno+1,
- first_column: this.yylloc.last_column,
- last_column: lines ? lines[lines.length-1].length-1 : this.yylloc.last_column + match[0].length}
- this.yytext += match[0];
- this.match += match[0];
- this.matches = match;
- this.yyleng = this.yytext.length;
- this._more = false;
- this._input = this._input.slice(match[0].length);
- this.matched += match[0];
- token = this.performAction.call(this, this.yy, this, rules[i],this.conditionStack[this.conditionStack.length-1]);
- if (token) return token;
- else return;
- }
- }
- if (this._input === "") {
- return this.EOF;
- } else {
- this.parseError('Lexical error on line '+(this.yylineno+1)+'. Unrecognized text.\n'+this.showPosition(),
- {text: "", token: null, line: this.yylineno});
- }
- },
-lex:function lex() {
- var r = this.next();
- if (typeof r !== 'undefined') {
- return r;
- } else {
- return this.lex();
- }
- },
-begin:function begin(condition) {
- this.conditionStack.push(condition);
- },
-popState:function popState() {
- return this.conditionStack.pop();
- },
-_currentRules:function _currentRules() {
- return this.conditions[this.conditionStack[this.conditionStack.length-1]].rules;
- },
-topState:function () {
- return this.conditionStack[this.conditionStack.length-2];
- },
-pushState:function begin(condition) {
- this.begin(condition);
- }});
-lexer.performAction = function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {
-
-var YYSTATE=YY_START
-switch($avoiding_name_collisions) {
-case 0:
- if(yy_.yytext.slice(-1) !== "\\") this.begin("mu");
- if(yy_.yytext.slice(-1) === "\\") yy_.yytext = yy_.yytext.substr(0,yy_.yyleng-1), this.begin("emu");
- if(yy_.yytext) return 14;
-
-break;
-case 1: return 14;
-break;
-case 2: this.popState(); return 14;
-break;
-case 3: return 24;
-break;
-case 4: return 16;
-break;
-case 5: return 20;
-break;
-case 6: return 19;
-break;
-case 7: return 19;
-break;
-case 8: return 23;
-break;
-case 9: return 23;
-break;
-case 10: yy_.yytext = yy_.yytext.substr(3,yy_.yyleng-5); this.popState(); return 15;
-break;
-case 11: return 22;
-break;
-case 12: return 34;
-break;
-case 13: return 33;
-break;
-case 14: return 33;
-break;
-case 15: return 36;
-break;
-case 16: /*ignore whitespace*/
-break;
-case 17: this.popState(); return 18;
-break;
-case 18: this.popState(); return 18;
-break;
-case 19: yy_.yytext = yy_.yytext.substr(1,yy_.yyleng-2).replace(/\\"/g,'"'); return 28;
-break;
-case 20: return 30;
-break;
-case 21: return 30;
-break;
-case 22: return 29;
-break;
-case 23: return 33;
-break;
-case 24: yy_.yytext = yy_.yytext.substr(1, yy_.yyleng-2); return 33;
-break;
-case 25: return 'INVALID';
-break;
-case 26: return 5;
-break;
-}
-};
-lexer.rules = [/^[^\x00]*?(?=(\{\{))/,/^[^\x00]+/,/^[^\x00]{2,}?(?=(\{\{))/,/^\{\{>/,/^\{\{#/,/^\{\{\//,/^\{\{\^/,/^\{\{\s*else\b/,/^\{\{\{/,/^\{\{&/,/^\{\{![\s\S]*?\}\}/,/^\{\{/,/^=/,/^\.(?=[} ])/,/^\.\./,/^[\/.]/,/^\s+/,/^\}\}\}/,/^\}\}/,/^"(\\["]|[^"])*"/,/^true(?=[}\s])/,/^false(?=[}\s])/,/^[0-9]+(?=[}\s])/,/^[a-zA-Z0-9_$-]+(?=[=}\s\/.])/,/^\[[^\]]*\]/,/^./,/^$/];
-lexer.conditions = {"mu":{"rules":[3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26],"inclusive":false},"emu":{"rules":[2],"inclusive":false},"INITIAL":{"rules":[0,1,26],"inclusive":true}};return lexer;})()
-parser.lexer = lexer;
-return parser;
-})();
-if (typeof require !== 'undefined' && typeof exports !== 'undefined') {
-exports.parser = handlebars;
-exports.parse = function () { return handlebars.parse.apply(handlebars, arguments); }
-exports.main = function commonjsMain(args) {
- if (!args[1])
- throw new Error('Usage: '+args[0]+' FILE');
- if (typeof process !== 'undefined') {
- var source = require('fs').readFileSync(require('path').join(process.cwd(), args[1]), "utf8");
- } else {
- var cwd = require("file").path(require("file").cwd());
- var source = cwd.join(args[1]).read({charset: "utf-8"});
- }
- return exports.parser.parse(source);
-}
-if (typeof module !== 'undefined' && require.main === module) {
- exports.main(typeof process !== 'undefined' ? process.argv.slice(1) : require("system").args);
-}
-};
-;
-// lib/handlebars/compiler/base.js
-Handlebars.Parser = handlebars;
-
-Handlebars.parse = function(string) {
- Handlebars.Parser.yy = Handlebars.AST;
- return Handlebars.Parser.parse(string);
-};
-
-Handlebars.print = function(ast) {
- return new Handlebars.PrintVisitor().accept(ast);
-};
-
-Handlebars.logger = {
- DEBUG: 0, INFO: 1, WARN: 2, ERROR: 3, level: 3,
-
- // override in the host environment
- log: function(level, str) {}
-};
-
-Handlebars.log = function(level, str) { Handlebars.logger.log(level, str); };
-;
-// lib/handlebars/compiler/ast.js
-(function() {
-
- Handlebars.AST = {};
-
- Handlebars.AST.ProgramNode = function(statements, inverse) {
- this.type = "program";
- this.statements = statements;
- if(inverse) { this.inverse = new Handlebars.AST.ProgramNode(inverse); }
- };
-
- Handlebars.AST.MustacheNode = function(params, hash, unescaped) {
- this.type = "mustache";
- this.id = params[0];
- this.params = params.slice(1);
- this.hash = hash;
- this.escaped = !unescaped;
- };
-
- Handlebars.AST.PartialNode = function(id, context) {
- this.type = "partial";
-
- // TODO: disallow complex IDs
-
- this.id = id;
- this.context = context;
- };
-
- var verifyMatch = function(open, close) {
- if(open.original !== close.original) {
- throw new Handlebars.Exception(open.original + " doesn't match " + close.original);
- }
- };
-
- Handlebars.AST.BlockNode = function(mustache, program, close) {
- verifyMatch(mustache.id, close);
- this.type = "block";
- this.mustache = mustache;
- this.program = program;
- };
-
- Handlebars.AST.InverseNode = function(mustache, program, close) {
- verifyMatch(mustache.id, close);
- this.type = "inverse";
- this.mustache = mustache;
- this.program = program;
- };
-
- Handlebars.AST.ContentNode = function(string) {
- this.type = "content";
- this.string = string;
- };
-
- Handlebars.AST.HashNode = function(pairs) {
- this.type = "hash";
- this.pairs = pairs;
- };
-
- Handlebars.AST.IdNode = function(parts) {
- this.type = "ID";
- this.original = parts.join(".");
-
- var dig = [], depth = 0;
-
- for(var i=0,l=parts.length; i<l; i++) {
- var part = parts[i];
-
- if(part === "..") { depth++; }
- else if(part === "." || part === "this") { this.isScoped = true; }
- else { dig.push(part); }
- }
-
- this.parts = dig;
- this.string = dig.join('.');
- this.depth = depth;
- this.isSimple = (dig.length === 1) && (depth === 0);
- };
-
- Handlebars.AST.StringNode = function(string) {
- this.type = "STRING";
- this.string = string;
- };
-
- Handlebars.AST.IntegerNode = function(integer) {
- this.type = "INTEGER";
- this.integer = integer;
- };
-
- Handlebars.AST.BooleanNode = function(bool) {
- this.type = "BOOLEAN";
- this.bool = bool;
- };
-
- Handlebars.AST.CommentNode = function(comment) {
- this.type = "comment";
- this.comment = comment;
- };
-
-})();;
-// lib/handlebars/utils.js
-Handlebars.Exception = function(message) {
- var tmp = Error.prototype.constructor.apply(this, arguments);
-
- for (var p in tmp) {
- if (tmp.hasOwnProperty(p)) { this[p] = tmp[p]; }
- }
-
- this.message = tmp.message;
-};
-Handlebars.Exception.prototype = new Error;
-
-// Build out our basic SafeString type
-Handlebars.SafeString = function(string) {
- this.string = string;
-};
-Handlebars.SafeString.prototype.toString = function() {
- return this.string.toString();
-};
-
-(function() {
- var escape = {
- "<": "&lt;",
- ">": "&gt;",
- '"': "&quot;",
- "'": "&#x27;",
- "`": "&#x60;"
- };
-
- var badChars = /&(?!\w+;)|[<>"'`]/g;
- var possible = /[&<>"'`]/;
-
- var escapeChar = function(chr) {
- return escape[chr] || "&amp;";
- };
-
- Handlebars.Utils = {
- escapeExpression: function(string) {
- // don't escape SafeStrings, since they're already safe
- if (string instanceof Handlebars.SafeString) {
- return string.toString();
- } else if (string == null || string === false) {
- return "";
- }
-
- if(!possible.test(string)) { return string; }
- return string.replace(badChars, escapeChar);
- },
-
- isEmpty: function(value) {
- if (typeof value === "undefined") {
- return true;
- } else if (value === null) {
- return true;
- } else if (value === false) {
- return true;
- } else if(Object.prototype.toString.call(value) === "[object Array]" && value.length === 0) {
- return true;
- } else {
- return false;
- }
- }
- };
-})();;
-// lib/handlebars/compiler/compiler.js
-Handlebars.Compiler = function() {};
-Handlebars.JavaScriptCompiler = function() {};
-
-(function(Compiler, JavaScriptCompiler) {
- Compiler.OPCODE_MAP = {
- appendContent: 1,
- getContext: 2,
- lookupWithHelpers: 3,
- lookup: 4,
- append: 5,
- invokeMustache: 6,
- appendEscaped: 7,
- pushString: 8,
- truthyOrFallback: 9,
- functionOrFallback: 10,
- invokeProgram: 11,
- invokePartial: 12,
- push: 13,
- assignToHash: 15,
- pushStringParam: 16
- };
-
- Compiler.MULTI_PARAM_OPCODES = {
- appendContent: 1,
- getContext: 1,
- lookupWithHelpers: 2,
- lookup: 1,
- invokeMustache: 3,
- pushString: 1,
- truthyOrFallback: 1,
- functionOrFallback: 1,
- invokeProgram: 3,
- invokePartial: 1,
- push: 1,
- assignToHash: 1,
- pushStringParam: 1
- };
-
- Compiler.DISASSEMBLE_MAP = {};
-
- for(var prop in Compiler.OPCODE_MAP) {
- var value = Compiler.OPCODE_MAP[prop];
- Compiler.DISASSEMBLE_MAP[value] = prop;
- }
-
- Compiler.multiParamSize = function(code) {
- return Compiler.MULTI_PARAM_OPCODES[Compiler.DISASSEMBLE_MAP[code]];
- };
-
- Compiler.prototype = {
- compiler: Compiler,
-
- disassemble: function() {
- var opcodes = this.opcodes, opcode, nextCode;
- var out = [], str, name, value;
-
- for(var i=0, l=opcodes.length; i<l; i++) {
- opcode = opcodes[i];
-
- if(opcode === 'DECLARE') {
- name = opcodes[++i];
- value = opcodes[++i];
- out.push("DECLARE " + name + " = " + value);
- } else {
- str = Compiler.DISASSEMBLE_MAP[opcode];
-
- var extraParams = Compiler.multiParamSize(opcode);
- var codes = [];
-
- for(var j=0; j<extraParams; j++) {
- nextCode = opcodes[++i];
-
- if(typeof nextCode === "string") {
- nextCode = "\"" + nextCode.replace("\n", "\\n") + "\"";
- }
-
- codes.push(nextCode);
- }
-
- str = str + " " + codes.join(" ");
-
- out.push(str);
- }
- }
-
- return out.join("\n");
- },
-
- guid: 0,
-
- compile: function(program, options) {
- this.children = [];
- this.depths = {list: []};
- this.options = options;
-
- // These changes will propagate to the other compiler components
- var knownHelpers = this.options.knownHelpers;
- this.options.knownHelpers = {
- 'helperMissing': true,
- 'blockHelperMissing': true,
- 'each': true,
- 'if': true,
- 'unless': true,
- 'with': true,
- 'log': true
- };
- if (knownHelpers) {
- for (var name in knownHelpers) {
- this.options.knownHelpers[name] = knownHelpers[name];
- }
- }
-
- return this.program(program);
- },
-
- accept: function(node) {
- return this[node.type](node);
- },
-
- program: function(program) {
- var statements = program.statements, statement;
- this.opcodes = [];
-
- for(var i=0, l=statements.length; i<l; i++) {
- statement = statements[i];
- this[statement.type](statement);
- }
- this.isSimple = l === 1;
-
- this.depths.list = this.depths.list.sort(function(a, b) {
- return a - b;
- });
-
- return this;
- },
-
- compileProgram: function(program) {
- var result = new this.compiler().compile(program, this.options);
- var guid = this.guid++;
-
- this.usePartial = this.usePartial || result.usePartial;
-
- this.children[guid] = result;
-
- for(var i=0, l=result.depths.list.length; i<l; i++) {
- depth = result.depths.list[i];
-
- if(depth < 2) { continue; }
- else { this.addDepth(depth - 1); }
- }
-
- return guid;
- },
-
- block: function(block) {
- var mustache = block.mustache;
- var depth, child, inverse, inverseGuid;
-
- var params = this.setupStackForMustache(mustache);
-
- var programGuid = this.compileProgram(block.program);
-
- if(block.program.inverse) {
- inverseGuid = this.compileProgram(block.program.inverse);
- this.declare('inverse', inverseGuid);
- }
-
- this.opcode('invokeProgram', programGuid, params.length, !!mustache.hash);
- this.declare('inverse', null);
- this.opcode('append');
- },
-
- inverse: function(block) {
- var params = this.setupStackForMustache(block.mustache);
-
- var programGuid = this.compileProgram(block.program);
-
- this.declare('inverse', programGuid);
-
- this.opcode('invokeProgram', null, params.length, !!block.mustache.hash);
- this.declare('inverse', null);
- this.opcode('append');
- },
-
- hash: function(hash) {
- var pairs = hash.pairs, pair, val;
-
- this.opcode('push', '{}');
-
- for(var i=0, l=pairs.length; i<l; i++) {
- pair = pairs[i];
- val = pair[1];
-
- this.accept(val);
- this.opcode('assignToHash', pair[0]);
- }
- },
-
- partial: function(partial) {
- var id = partial.id;
- this.usePartial = true;
-
- if(partial.context) {
- this.ID(partial.context);
- } else {
- this.opcode('push', 'depth0');
- }
-
- this.opcode('invokePartial', id.original);
- this.opcode('append');
- },
-
- content: function(content) {
- this.opcode('appendContent', content.string);
- },
-
- mustache: function(mustache) {
- var params = this.setupStackForMustache(mustache);
-
- this.opcode('invokeMustache', params.length, mustache.id.original, !!mustache.hash);
-
- if(mustache.escaped && !this.options.noEscape) {
- this.opcode('appendEscaped');
- } else {
- this.opcode('append');
- }
- },
-
- ID: function(id) {
- this.addDepth(id.depth);
-
- this.opcode('getContext', id.depth);
-
- this.opcode('lookupWithHelpers', id.parts[0] || null, id.isScoped || false);
-
- for(var i=1, l=id.parts.length; i<l; i++) {
- this.opcode('lookup', id.parts[i]);
- }
- },
-
- STRING: function(string) {
- this.opcode('pushString', string.string);
- },
-
- INTEGER: function(integer) {
- this.opcode('push', integer.integer);
- },
-
- BOOLEAN: function(bool) {
- this.opcode('push', bool.bool);
- },
-
- comment: function() {},
-
- // HELPERS
- pushParams: function(params) {
- var i = params.length, param;
-
- while(i--) {
- param = params[i];
-
- if(this.options.stringParams) {
- if(param.depth) {
- this.addDepth(param.depth);
- }
-
- this.opcode('getContext', param.depth || 0);
- this.opcode('pushStringParam', param.string);
- } else {
- this[param.type](param);
- }
- }
- },
-
- opcode: function(name, val1, val2, val3) {
- this.opcodes.push(Compiler.OPCODE_MAP[name]);
- if(val1 !== undefined) { this.opcodes.push(val1); }
- if(val2 !== undefined) { this.opcodes.push(val2); }
- if(val3 !== undefined) { this.opcodes.push(val3); }
- },
-
- declare: function(name, value) {
- this.opcodes.push('DECLARE');
- this.opcodes.push(name);
- this.opcodes.push(value);
- },
-
- addDepth: function(depth) {
- if(depth === 0) { return; }
-
- if(!this.depths[depth]) {
- this.depths[depth] = true;
- this.depths.list.push(depth);
- }
- },
-
- setupStackForMustache: function(mustache) {
- var params = mustache.params;
-
- this.pushParams(params);
-
- if(mustache.hash) {
- this.hash(mustache.hash);
- }
-
- this.ID(mustache.id);
-
- return params;
- }
- };
-
- JavaScriptCompiler.prototype = {
- // PUBLIC API: You can override these methods in a subclass to provide
- // alternative compiled forms for name lookup and buffering semantics
- nameLookup: function(parent, name, type) {
- if (/^[0-9]+$/.test(name)) {
- return parent + "[" + name + "]";
- } else if (JavaScriptCompiler.isValidJavaScriptVariableName(name)) {
- return parent + "." + name;
- }
- else {
- return parent + "['" + name + "']";
- }
- },
-
- appendToBuffer: function(string) {
- if (this.environment.isSimple) {
- return "return " + string + ";";
- } else {
- return "buffer += " + string + ";";
- }
- },
-
- initializeBuffer: function() {
- return this.quotedString("");
- },
-
- namespace: "Handlebars",
- // END PUBLIC API
-
- compile: function(environment, options, context, asObject) {
- this.environment = environment;
- this.options = options || {};
-
- this.name = this.environment.name;
- this.isChild = !!context;
- this.context = context || {
- programs: [],
- aliases: { self: 'this' },
- registers: {list: []}
- };
-
- this.preamble();
-
- this.stackSlot = 0;
- this.stackVars = [];
-
- this.compileChildren(environment, options);
-
- var opcodes = environment.opcodes, opcode;
-
- this.i = 0;
-
- for(l=opcodes.length; this.i<l; this.i++) {
- opcode = this.nextOpcode(0);
-
- if(opcode[0] === 'DECLARE') {
- this.i = this.i + 2;
- this[opcode[1]] = opcode[2];
- } else {
- this.i = this.i + opcode[1].length;
- this[opcode[0]].apply(this, opcode[1]);
- }
- }
-
- return this.createFunctionContext(asObject);
- },
-
- nextOpcode: function(n) {
- var opcodes = this.environment.opcodes, opcode = opcodes[this.i + n], name, val;
- var extraParams, codes;
-
- if(opcode === 'DECLARE') {
- name = opcodes[this.i + 1];
- val = opcodes[this.i + 2];
- return ['DECLARE', name, val];
- } else {
- name = Compiler.DISASSEMBLE_MAP[opcode];
-
- extraParams = Compiler.multiParamSize(opcode);
- codes = [];
-
- for(var j=0; j<extraParams; j++) {
- codes.push(opcodes[this.i + j + 1 + n]);
- }
-
- return [name, codes];
- }
- },
-
- eat: function(opcode) {
- this.i = this.i + opcode.length;
- },
-
- preamble: function() {
- var out = [];
-
- // this register will disambiguate helper lookup from finding a function in
- // a context. This is necessary for mustache compatibility, which requires
- // that context functions in blocks are evaluated by blockHelperMissing, and
- // then proceed as if the resulting value was provided to blockHelperMissing.
- this.useRegister('foundHelper');
-
- if (!this.isChild) {
- var namespace = this.namespace;
- var copies = "helpers = helpers || " + namespace + ".helpers;";
- if(this.environment.usePartial) { copies = copies + " partials = partials || " + namespace + ".partials;"; }
- out.push(copies);
- } else {
- out.push('');
- }
-
- if (!this.environment.isSimple) {
- out.push(", buffer = " + this.initializeBuffer());
- } else {
- out.push("");
- }
-
- // track the last context pushed into place to allow skipping the
- // getContext opcode when it would be a noop
- this.lastContext = 0;
- this.source = out;
- },
-
- createFunctionContext: function(asObject) {
- var locals = this.stackVars;
- if (!this.isChild) {
- locals = locals.concat(this.context.registers.list);
- }
-
- if(locals.length > 0) {
- this.source[1] = this.source[1] + ", " + locals.join(", ");
- }
-
- // Generate minimizer alias mappings
- if (!this.isChild) {
- var aliases = []
- for (var alias in this.context.aliases) {
- this.source[1] = this.source[1] + ', ' + alias + '=' + this.context.aliases[alias];
- }
- }
-
- if (this.source[1]) {
- this.source[1] = "var " + this.source[1].substring(2) + ";";
- }
-
- // Merge children
- if (!this.isChild) {
- this.source[1] += '\n' + this.context.programs.join('\n') + '\n';
- }
-
- if (!this.environment.isSimple) {
- this.source.push("return buffer;");
- }
-
- var params = this.isChild ? ["depth0", "data"] : ["Handlebars", "depth0", "helpers", "partials", "data"];
-
- for(var i=0, l=this.environment.depths.list.length; i<l; i++) {
- params.push("depth" + this.environment.depths.list[i]);
- }
-
- if (asObject) {
- params.push(this.source.join("\n "));
-
- return Function.apply(this, params);
- } else {
- var functionSource = 'function ' + (this.name || '') + '(' + params.join(',') + ') {\n ' + this.source.join("\n ") + '}';
- Handlebars.log(Handlebars.logger.DEBUG, functionSource + "\n\n");
- return functionSource;
- }
- },
-
- appendContent: function(content) {
- this.source.push(this.appendToBuffer(this.quotedString(content)));
- },
-
- append: function() {
- var local = this.popStack();
- this.source.push("if(" + local + " || " + local + " === 0) { " + this.appendToBuffer(local) + " }");
- if (this.environment.isSimple) {
- this.source.push("else { " + this.appendToBuffer("''") + " }");
- }
- },
-
- appendEscaped: function() {
- var opcode = this.nextOpcode(1), extra = "";
- this.context.aliases.escapeExpression = 'this.escapeExpression';
-
- if(opcode[0] === 'appendContent') {
- extra = " + " + this.quotedString(opcode[1][0]);
- this.eat(opcode);
- }
-
- this.source.push(this.appendToBuffer("escapeExpression(" + this.popStack() + ")" + extra));
- },
-
- getContext: function(depth) {
- if(this.lastContext !== depth) {
- this.lastContext = depth;
- }
- },
-
- lookupWithHelpers: function(name, isScoped) {
- if(name) {
- var topStack = this.nextStack();
-
- this.usingKnownHelper = false;
-
- var toPush;
- if (!isScoped && this.options.knownHelpers[name]) {
- toPush = topStack + " = " + this.nameLookup('helpers', name, 'helper');
- this.usingKnownHelper = true;
- } else if (isScoped || this.options.knownHelpersOnly) {
- toPush = topStack + " = " + this.nameLookup('depth' + this.lastContext, name, 'context');
- } else {
- this.register('foundHelper', this.nameLookup('helpers', name, 'helper'));
- toPush = topStack + " = foundHelper || " + this.nameLookup('depth' + this.lastContext, name, 'context');
- }
-
- toPush += ';';
- this.source.push(toPush);
- } else {
- this.pushStack('depth' + this.lastContext);
- }
- },
-
- lookup: function(name) {
- var topStack = this.topStack();
- this.source.push(topStack + " = (" + topStack + " === null || " + topStack + " === undefined || " + topStack + " === false ? " +
- topStack + " : " + this.nameLookup(topStack, name, 'context') + ");");
- },
-
- pushStringParam: function(string) {
- this.pushStack('depth' + this.lastContext);
- this.pushString(string);
- },
-
- pushString: function(string) {
- this.pushStack(this.quotedString(string));
- },
-
- push: function(name) {
- this.pushStack(name);
- },
-
- invokeMustache: function(paramSize, original, hasHash) {
- this.populateParams(paramSize, this.quotedString(original), "{}", null, hasHash, function(nextStack, helperMissingString, id) {
- if (!this.usingKnownHelper) {
- this.context.aliases.helperMissing = 'helpers.helperMissing';
- this.context.aliases.undef = 'void 0';
- this.source.push("else if(" + id + "=== undef) { " + nextStack + " = helperMissing.call(" + helperMissingString + "); }");
- if (nextStack !== id) {
- this.source.push("else { " + nextStack + " = " + id + "; }");
- }
- }
- });
- },
-
- invokeProgram: function(guid, paramSize, hasHash) {
- var inverse = this.programExpression(this.inverse);
- var mainProgram = this.programExpression(guid);
-
- this.populateParams(paramSize, null, mainProgram, inverse, hasHash, function(nextStack, helperMissingString, id) {
- if (!this.usingKnownHelper) {
- this.context.aliases.blockHelperMissing = 'helpers.blockHelperMissing';
- this.source.push("else { " + nextStack + " = blockHelperMissing.call(" + helperMissingString + "); }");
- }
- });
- },
-
- populateParams: function(paramSize, helperId, program, inverse, hasHash, fn) {
- var needsRegister = hasHash || this.options.stringParams || inverse || this.options.data;
- var id = this.popStack(), nextStack;
- var params = [], param, stringParam, stringOptions;
-
- if (needsRegister) {
- this.register('tmp1', program);
- stringOptions = 'tmp1';
- } else {
- stringOptions = '{ hash: {} }';
- }
-
- if (needsRegister) {
- var hash = (hasHash ? this.popStack() : '{}');
- this.source.push('tmp1.hash = ' + hash + ';');
- }
-
- if(this.options.stringParams) {
- this.source.push('tmp1.contexts = [];');
- }
-
- for(var i=0; i<paramSize; i++) {
- param = this.popStack();
- params.push(param);
-
- if(this.options.stringParams) {
- this.source.push('tmp1.contexts.push(' + this.popStack() + ');');
- }
- }
-
- if(inverse) {
- this.source.push('tmp1.fn = tmp1;');
- this.source.push('tmp1.inverse = ' + inverse + ';');
- }
-
- if(this.options.data) {
- this.source.push('tmp1.data = data;');
- }
-
- params.push(stringOptions);
-
- this.populateCall(params, id, helperId || id, fn, program !== '{}');
- },
-
- populateCall: function(params, id, helperId, fn, program) {
- var paramString = ["depth0"].concat(params).join(", ");
- var helperMissingString = ["depth0"].concat(helperId).concat(params).join(", ");
-
- var nextStack = this.nextStack();
-
- if (this.usingKnownHelper) {
- this.source.push(nextStack + " = " + id + ".call(" + paramString + ");");
- } else {
- this.context.aliases.functionType = '"function"';
- var condition = program ? "foundHelper && " : ""
- this.source.push("if(" + condition + "typeof " + id + " === functionType) { " + nextStack + " = " + id + ".call(" + paramString + "); }");
- }
- fn.call(this, nextStack, helperMissingString, id);
- this.usingKnownHelper = false;
- },
-
- invokePartial: function(context) {
- params = [this.nameLookup('partials', context, 'partial'), "'" + context + "'", this.popStack(), "helpers", "partials"];
-
- if (this.options.data) {
- params.push("data");
- }
-
- this.pushStack("self.invokePartial(" + params.join(", ") + ");");
- },
-
- assignToHash: function(key) {
- var value = this.popStack();
- var hash = this.topStack();
-
- this.source.push(hash + "['" + key + "'] = " + value + ";");
- },
-
- // HELPERS
-
- compiler: JavaScriptCompiler,
-
- compileChildren: function(environment, options) {
- var children = environment.children, child, compiler;
-
- for(var i=0, l=children.length; i<l; i++) {
- child = children[i];
- compiler = new this.compiler();
-
- this.context.programs.push(''); // Placeholder to prevent name conflicts for nested children
- var index = this.context.programs.length;
- child.index = index;
- child.name = 'program' + index;
- this.context.programs[index] = compiler.compile(child, options, this.context);
- }
- },
-
- programExpression: function(guid) {
- if(guid == null) { return "self.noop"; }
-
- var child = this.environment.children[guid],
- depths = child.depths.list;
- var programParams = [child.index, child.name, "data"];
-
- for(var i=0, l = depths.length; i<l; i++) {
- depth = depths[i];
-
- if(depth === 1) { programParams.push("depth0"); }
- else { programParams.push("depth" + (depth - 1)); }
- }
-
- if(depths.length === 0) {
- return "self.program(" + programParams.join(", ") + ")";
- } else {
- programParams.shift();
- return "self.programWithDepth(" + programParams.join(", ") + ")";
- }
- },
-
- register: function(name, val) {
- this.useRegister(name);
- this.source.push(name + " = " + val + ";");
- },
-
- useRegister: function(name) {
- if(!this.context.registers[name]) {
- this.context.registers[name] = true;
- this.context.registers.list.push(name);
- }
- },
-
- pushStack: function(item) {
- this.source.push(this.nextStack() + " = " + item + ";");
- return "stack" + this.stackSlot;
- },
-
- nextStack: function() {
- this.stackSlot++;
- if(this.stackSlot > this.stackVars.length) { this.stackVars.push("stack" + this.stackSlot); }
- return "stack" + this.stackSlot;
- },
-
- popStack: function() {
- return "stack" + this.stackSlot--;
- },
-
- topStack: function() {
- return "stack" + this.stackSlot;
- },
-
- quotedString: function(str) {
- return '"' + str
- .replace(/\\/g, '\\\\')
- .replace(/"/g, '\\"')
- .replace(/\n/g, '\\n')
- .replace(/\r/g, '\\r') + '"';
- }
- };
-
- var reservedWords = (
- "break else new var" +
- " case finally return void" +
- " catch for switch while" +
- " continue function this with" +
- " default if throw" +
- " delete in try" +
- " do instanceof typeof" +
- " abstract enum int short" +
- " boolean export interface static" +
- " byte extends long super" +
- " char final native synchronized" +
- " class float package throws" +
- " const goto private transient" +
- " debugger implements protected volatile" +
- " double import public let yield"
- ).split(" ");
-
- var compilerWords = JavaScriptCompiler.RESERVED_WORDS = {};
-
- for(var i=0, l=reservedWords.length; i<l; i++) {
- compilerWords[reservedWords[i]] = true;
- }
-
- JavaScriptCompiler.isValidJavaScriptVariableName = function(name) {
- if(!JavaScriptCompiler.RESERVED_WORDS[name] && /^[a-zA-Z_$][0-9a-zA-Z_$]+$/.test(name)) {
- return true;
- }
- return false;
- }
-
-})(Handlebars.Compiler, Handlebars.JavaScriptCompiler);
-
-Handlebars.precompile = function(string, options) {
- options = options || {};
-
- var ast = Handlebars.parse(string);
- var environment = new Handlebars.Compiler().compile(ast, options);
- return new Handlebars.JavaScriptCompiler().compile(environment, options);
-};
-
-Handlebars.compile = function(string, options) {
- options = options || {};
-
- var compiled;
- function compile() {
- var ast = Handlebars.parse(string);
- var environment = new Handlebars.Compiler().compile(ast, options);
- var templateSpec = new Handlebars.JavaScriptCompiler().compile(environment, options, undefined, true);
- return Handlebars.template(templateSpec);
- }
-
- // Template is only compiled on first use and cached after that point.
- return function(context, options) {
- if (!compiled) {
- compiled = compile();
- }
- return compiled.call(this, context, options);
- };
-};
-;
-// lib/handlebars/runtime.js
-Handlebars.VM = {
- template: function(templateSpec) {
- // Just add water
- var container = {
- escapeExpression: Handlebars.Utils.escapeExpression,
- invokePartial: Handlebars.VM.invokePartial,
- programs: [],
- program: function(i, fn, data) {
- var programWrapper = this.programs[i];
- if(data) {
- return Handlebars.VM.program(fn, data);
- } else if(programWrapper) {
- return programWrapper;
- } else {
- programWrapper = this.programs[i] = Handlebars.VM.program(fn);
- return programWrapper;
- }
- },
- programWithDepth: Handlebars.VM.programWithDepth,
- noop: Handlebars.VM.noop
- };
-
- return function(context, options) {
- options = options || {};
- return templateSpec.call(container, Handlebars, context, options.helpers, options.partials, options.data);
- };
- },
-
- programWithDepth: function(fn, data, $depth) {
- var args = Array.prototype.slice.call(arguments, 2);
-
- return function(context, options) {
- options = options || {};
-
- return fn.apply(this, [context, options.data || data].concat(args));
- };
- },
- program: function(fn, data) {
- return function(context, options) {
- options = options || {};
-
- return fn(context, options.data || data);
- };
- },
- noop: function() { return ""; },
- invokePartial: function(partial, name, context, helpers, partials, data) {
- options = { helpers: helpers, partials: partials, data: data };
-
- if(partial === undefined) {
- throw new Handlebars.Exception("The partial " + name + " could not be found");
- } else if(partial instanceof Function) {
- return partial(context, options);
- } else if (!Handlebars.compile) {
- throw new Handlebars.Exception("The partial " + name + " could not be compiled when running in runtime-only mode");
- } else {
- partials[name] = Handlebars.compile(partial);
- return partials[name](context, options);
- }
- }
-};
-
-Handlebars.template = Handlebars.VM.template;
-;
diff --git a/vendor/assets/javascripts/jquery.hotkeys.js b/vendor/assets/javascripts/jquery.hotkeys.js
deleted file mode 100644
index 5c9d557fd..000000000
--- a/vendor/assets/javascripts/jquery.hotkeys.js
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * jQuery Hotkeys Plugin
- * Copyright 2010, John Resig
- * Dual licensed under the MIT or GPL Version 2 licenses.
- *
- * Based upon the plugin by Tzury Bar Yochay:
- * http://github.com/tzuryby/hotkeys
- *
- * Original idea by:
- * Binny V A, http://www.openjs.com/scripts/events/keyboard_shortcuts/
-*/
-
-(function(jQuery){
-
- jQuery.hotkeys = {
- version: "0.8",
-
- specialKeys: {
- 8: "backspace", 9: "tab", 13: "return", 16: "shift", 17: "ctrl", 18: "alt", 19: "pause",
- 20: "capslock", 27: "esc", 32: "space", 33: "pageup", 34: "pagedown", 35: "end", 36: "home",
- 37: "left", 38: "up", 39: "right", 40: "down", 45: "insert", 46: "del",
- 96: "0", 97: "1", 98: "2", 99: "3", 100: "4", 101: "5", 102: "6", 103: "7",
- 104: "8", 105: "9", 106: "*", 107: "+", 109: "-", 110: ".", 111 : "/",
- 112: "f1", 113: "f2", 114: "f3", 115: "f4", 116: "f5", 117: "f6", 118: "f7", 119: "f8",
- 120: "f9", 121: "f10", 122: "f11", 123: "f12", 144: "numlock", 145: "scroll", 191: "/", 224: "meta"
- },
-
- shiftNums: {
- "`": "~", "1": "!", "2": "@", "3": "#", "4": "$", "5": "%", "6": "^", "7": "&",
- "8": "*", "9": "(", "0": ")", "-": "_", "=": "+", ";": ": ", "'": "\"", ",": "<",
- ".": ">", "/": "?", "\\": "|"
- }
- };
-
- function keyHandler( handleObj ) {
- // Only care when a possible input has been specified
- if ( typeof handleObj.data !== "string" ) {
- return;
- }
-
- var origHandler = handleObj.handler,
- keys = handleObj.data.toLowerCase().split(" ");
-
- handleObj.handler = function( event ) {
- // Don't fire in text-accepting inputs that we didn't directly bind to
- if ( this !== event.target && (/textarea|select/i.test( event.target.nodeName ) ||
- event.target.type === "text") ) {
- return;
- }
-
- // Keypress represents characters, not special keys
- var special = event.type !== "keypress" && jQuery.hotkeys.specialKeys[ event.which ],
- character = String.fromCharCode( event.which ).toLowerCase(),
- key, modif = "", possible = {};
-
- // check combinations (alt|ctrl|shift+anything)
- if ( event.altKey && special !== "alt" ) {
- modif += "alt+";
- }
-
- if ( event.ctrlKey && special !== "ctrl" ) {
- modif += "ctrl+";
- }
-
- // TODO: Need to make sure this works consistently across platforms
- if ( event.metaKey && !event.ctrlKey && special !== "meta" ) {
- modif += "meta+";
- }
-
- if ( event.shiftKey && special !== "shift" ) {
- modif += "shift+";
- }
-
- if ( special ) {
- possible[ modif + special ] = true;
-
- } else {
- possible[ modif + character ] = true;
- possible[ modif + jQuery.hotkeys.shiftNums[ character ] ] = true;
-
- // "$" can be triggered as "Shift+4" or "Shift+$" or just "$"
- if ( modif === "shift+" ) {
- possible[ jQuery.hotkeys.shiftNums[ character ] ] = true;
- }
- }
-
- for ( var i = 0, l = keys.length; i < l; i++ ) {
- if ( possible[ keys[i] ] ) {
- return origHandler.apply( this, arguments );
- }
- }
- };
- }
-
- jQuery.each([ "keydown", "keyup", "keypress" ], function() {
- jQuery.event.special[ this ] = { add: keyHandler };
- });
-
-})( jQuery );
diff --git a/vendor/assets/javascripts/jquery.idle-timer.js b/vendor/assets/javascripts/jquery.idle-timer.js
deleted file mode 100644
index 8df88d61e..000000000
--- a/vendor/assets/javascripts/jquery.idle-timer.js
+++ /dev/null
@@ -1,246 +0,0 @@
-/*!
- * jQuery idleTimer plugin
- * version 0.9.100511
- * by Paul Irish.
- * http://github.com/paulirish/yui-misc/tree/
- * MIT license
-
- * adapted from YUI idle timer by nzakas:
- * http://github.com/nzakas/yui-misc/
-*/
-/*
- * Copyright (c) 2009 Nicholas C. Zakas
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-/* updated to fix Chrome setTimeout issue by Zaid Zawaideh */
-
- // API available in <= v0.8
- /*******************************
-
- // idleTimer() takes an optional argument that defines the idle timeout
- // timeout is in milliseconds; defaults to 30000
- $.idleTimer(10000);
-
-
- $(document).bind("idle.idleTimer", function(){
- // function you want to fire when the user goes idle
- });
-
-
- $(document).bind("active.idleTimer", function(){
- // function you want to fire when the user becomes active again
- });
-
- // pass the string 'destroy' to stop the timer
- $.idleTimer('destroy');
-
- // you can query if the user is idle or not with data()
- $.data(document,'idleTimer'); // 'idle' or 'active'
-
- // you can get time elapsed since user when idle/active
- $.idleTimer('getElapsedTime'); // time since state change in ms
-
- ********/
-
-
-
- // API available in >= v0.9
- /*************************
-
- // bind to specific elements, allows for multiple timer instances
- $(elem).idleTimer(timeout|'destroy'|'getElapsedTime');
- $.data(elem,'idleTimer'); // 'idle' or 'active'
-
- // if you're using the old $.idleTimer api, you should not do $(document).idleTimer(...)
-
- // element bound timers will only watch for events inside of them.
- // you may just want page-level activity, in which case you may set up
- // your timers on document, document.documentElement, and document.body
-
-
- ********/
-
-(function($){
-
-$.idleTimer = function(newTimeout, elem){
-
- // defaults that are to be stored as instance props on the elem
-
- var idle = false, //indicates if the user is idle
- enabled = true, //indicates if the idle timer is enabled
- timeout = 30000, //the amount of time (ms) before the user is considered idle
- events = 'mousemove keydown DOMMouseScroll mousewheel mousedown touchstart touchmove'; // activity is one of these events
-
-
- elem = elem || document;
-
-
-
- /* (intentionally not documented)
- * Toggles the idle state and fires an appropriate event.
- * @return {void}
- */
- var toggleIdleState = function(myelem){
-
- // curse you, mozilla setTimeout lateness bug!
- if (typeof myelem === 'number'){
- myelem = undefined;
- }
-
- var obj = $.data(myelem || elem,'idleTimerObj');
-
- //toggle the state
- obj.idle = !obj.idle;
-
- // reset timeout
- var elapsed = (+new Date()) - obj.olddate;
- obj.olddate = +new Date();
-
- // handle Chrome always triggering idle after js alert or comfirm popup
- if (obj.idle && (elapsed < timeout)) {
- obj.idle = false;
- clearTimeout($.idleTimer.tId);
- if (enabled)
- $.idleTimer.tId = setTimeout(toggleIdleState, timeout);
- return;
- }
-
- //fire appropriate event
-
- // create a custom event, but first, store the new state on the element
- // and then append that string to a namespace
- var event = jQuery.Event( $.data(elem,'idleTimer', obj.idle ? "idle" : "active" ) + '.idleTimer' );
-
- // we do want this to bubble, at least as a temporary fix for jQuery 1.7
- // event.stopPropagation();
- $(elem).trigger(event);
- },
-
- /**
- * Stops the idle timer. This removes appropriate event handlers
- * and cancels any pending timeouts.
- * @return {void}
- * @method stop
- * @static
- */
- stop = function(elem){
-
- var obj = $.data(elem,'idleTimerObj') || {};
-
- //set to disabled
- obj.enabled = false;
-
- //clear any pending timeouts
- clearTimeout(obj.tId);
-
- //detach the event handlers
- $(elem).off('.idleTimer');
- },
-
-
- /* (intentionally not documented)
- * Handles a user event indicating that the user isn't idle.
- * @param {Event} event A DOM2-normalized event object.
- * @return {void}
- */
- handleUserEvent = function(){
-
- var obj = $.data(this,'idleTimerObj');
-
- //clear any existing timeout
- clearTimeout(obj.tId);
-
-
-
- //if the idle timer is enabled
- if (obj.enabled){
-
-
- //if it's idle, that means the user is no longer idle
- if (obj.idle){
- toggleIdleState(this);
- }
-
- //set a new timeout
- obj.tId = setTimeout(toggleIdleState, obj.timeout);
-
- }
- };
-
-
- /**
- * Starts the idle timer. This adds appropriate event handlers
- * and starts the first timeout.
- * @param {int} newTimeout (Optional) A new value for the timeout period in ms.
- * @return {void}
- * @method $.idleTimer
- * @static
- */
-
-
- var obj = $.data(elem,'idleTimerObj') || {};
-
- obj.olddate = obj.olddate || +new Date();
-
- //assign a new timeout if necessary
- if (typeof newTimeout === "number"){
- timeout = newTimeout;
- } else if (newTimeout === 'destroy') {
- stop(elem);
- return this;
- } else if (newTimeout === 'getElapsedTime'){
- return (+new Date()) - obj.olddate;
- }
-
- //assign appropriate event handlers
- $(elem).on($.trim((events+' ').split(' ').join('.idleTimer ')),handleUserEvent);
-
-
- obj.idle = idle;
- obj.enabled = enabled;
- obj.timeout = timeout;
-
-
- //set a timeout to toggle state
- obj.tId = setTimeout(toggleIdleState, obj.timeout);
-
- // assume the user is active for the first x seconds.
- $.data(elem,'idleTimer',"active");
-
- // store our instance on the object
- $.data(elem,'idleTimerObj',obj);
-
-
-
-}; // end of $.idleTimer()
-
-
-// v0.9 API for defining multiple timers.
-$.fn.idleTimer = function(newTimeout){
- if(this[0]){
- $.idleTimer(newTimeout,this[0]);
- }
-
- return this;
-};
-
-
-})(jQuery);
diff --git a/vendor/assets/javascripts/jquery.placeholder.js b/vendor/assets/javascripts/jquery.placeholder.js
deleted file mode 100644
index b4bbc7cbe..000000000
--- a/vendor/assets/javascripts/jquery.placeholder.js
+++ /dev/null
@@ -1,104 +0,0 @@
-/*! http://mths.be/placeholder v1.8.7 by @mathias */
-;(function(window, document, $) {
-
- var isInputSupported = 'placeholder' in document.createElement('input'),
- isTextareaSupported = 'placeholder' in document.createElement('textarea'),
- prototype = $.fn,
- placeholder;
-
- if (isInputSupported && isTextareaSupported) {
-
- placeholder = prototype.placeholder = function() {
- return this;
- };
-
- placeholder.input = placeholder.textarea = true;
-
- } else {
-
- placeholder = prototype.placeholder = function() {
- return this
- .filter((isInputSupported ? 'textarea' : ':input') + '[placeholder]')
- .not('.placeholder')
- .bind('focus.placeholder', clearPlaceholder)
- .bind('blur.placeholder', setPlaceholder)
- .trigger('blur.placeholder').end();
- };
-
- placeholder.input = isInputSupported;
- placeholder.textarea = isTextareaSupported;
-
- $(function() {
- // Look for forms
- $(document).delegate('form', 'submit.placeholder', function() {
- // Clear the placeholder values so they don’t get submitted
- var $inputs = $('.placeholder', this).each(clearPlaceholder);
- setTimeout(function() {
- $inputs.each(setPlaceholder);
- }, 10);
- });
- });
-
- // Clear placeholder values upon page reload
- $(window).bind('unload.placeholder', function() {
- $('.placeholder').val('');
- });
-
- }
-
- function args(elem) {
- // Return an object of element attributes
- var newAttrs = {},
- rinlinejQuery = /^jQuery\d+$/;
- $.each(elem.attributes, function(i, attr) {
- if (attr.specified && !rinlinejQuery.test(attr.name)) {
- newAttrs[attr.name] = attr.value;
- }
- });
- return newAttrs;
- }
-
- function clearPlaceholder() {
- var $input = $(this);
- if ($input.val() === $input.attr('placeholder') && $input.hasClass('placeholder')) {
- if ($input.data('placeholder-password')) {
- $input.hide().next().show().focus().attr('id', $input.removeAttr('id').data('placeholder-id'));
- } else {
- $input.val('').removeClass('placeholder');
- }
- }
- }
-
- function setPlaceholder() {
- var $replacement,
- $input = $(this),
- $origInput = $input,
- id = this.id;
- if ($input.val() === '') {
- if ($input.is(':password')) {
- if (!$input.data('placeholder-textinput')) {
- try {
- $replacement = $input.clone().attr({ 'type': 'text' });
- } catch(e) {
- $replacement = $('<input>').attr($.extend(args(this), { 'type': 'text' }));
- }
- $replacement
- .removeAttr('name')
- // We could just use the `.data(obj)` syntax here, but that wouldn’t work in pre-1.4.3 jQueries
- .data('placeholder-password', true)
- .data('placeholder-id', id)
- .bind('focus.placeholder', clearPlaceholder);
- $input
- .data('placeholder-textinput', $replacement)
- .data('placeholder-id', id)
- .before($replacement);
- }
- $input = $input.removeAttr('id').hide().prev().attr('id', id).show();
- }
- $input.addClass('placeholder').val($input.attr('placeholder'));
- } else {
- $input.removeClass('placeholder');
- }
- }
-
-}(this, document, jQuery)); \ No newline at end of file
diff --git a/vendor/assets/javascripts/jquery.textchange.js b/vendor/assets/javascripts/jquery.textchange.js
deleted file mode 100644
index 3affea18e..000000000
--- a/vendor/assets/javascripts/jquery.textchange.js
+++ /dev/null
@@ -1,76 +0,0 @@
-/*!
- * jQuery TextChange Plugin
- * http://www.zurb.com/playground/jquery-text-change-custom-event
- *
- * Copyright 2010, ZURB
- * Released under the MIT License
- */
-(function ($) {
-
- $.event.special.textchange = {
-
- setup: function (data, namespaces) {
- $(this).data('lastValue', this.contentEditable === 'true' ? $(this).html() : $(this).val());
- $(this).bind('keyup.textchange', $.event.special.textchange.handler);
- $(this).bind('cut.textchange paste.textchange input.textchange', $.event.special.textchange.delayedHandler);
- },
-
- teardown: function (namespaces) {
- $(this).unbind('.textchange');
- },
-
- handler: function (event) {
- $.event.special.textchange.triggerIfChanged($(this));
- },
-
- delayedHandler: function (event) {
- var element = $(this);
- setTimeout(function () {
- $.event.special.textchange.triggerIfChanged(element);
- }, 25);
- },
-
- triggerIfChanged: function (element) {
- var current = element[0].contentEditable === 'true' ? element.html() : element.val();
- if (current !== element.data('lastValue')) {
- element.trigger('textchange', [element.data('lastValue')]);
- element.data('lastValue', current);
- }
- }
- };
-
- $.event.special.hastext = {
-
- setup: function (data, namespaces) {
- $(this).bind('textchange', $.event.special.hastext.handler);
- },
-
- teardown: function (namespaces) {
- $(this).unbind('textchange', $.event.special.hastext.handler);
- },
-
- handler: function (event, lastValue) {
- if ((lastValue === '') && lastValue !== $(this).val()) {
- $(this).trigger('hastext');
- }
- }
- };
-
- $.event.special.notext = {
-
- setup: function (data, namespaces) {
- $(this).bind('textchange', $.event.special.notext.handler);
- },
-
- teardown: function (namespaces) {
- $(this).unbind('textchange', $.event.special.notext.handler);
- },
-
- handler: function (event, lastValue) {
- if ($(this).val() === '' && $(this).val() !== lastValue) {
- $(this).trigger('notext');
- }
- }
- };
-
-})(jQuery); \ No newline at end of file
diff --git a/vendor/assets/javascripts/mailchimp/jquery.form.js b/vendor/assets/javascripts/mailchimp/jquery.form.js
deleted file mode 100644
index 2ee5c9626..000000000
--- a/vendor/assets/javascripts/mailchimp/jquery.form.js
+++ /dev/null
@@ -1,872 +0,0 @@
-/*
- * jQuery Form Plugin
- * version: 2.02 (12/16/2007)
- * @requires jQuery v1.1 or later
- *
- * Examples at: http://malsup.com/jquery/form/
- * Dual licensed under the MIT and GPL licenses:
- * http://www.opensource.org/licenses/mit-license.php
- * http://www.gnu.org/licenses/gpl.html
- *
- * Revision: $Id$
- */
- (function($) {
-/**
- * ajaxSubmit() provides a mechanism for submitting an HTML form using AJAX.
- *
- * ajaxSubmit accepts a single argument which can be either a success callback function
- * or an options Object. If a function is provided it will be invoked upon successful
- * completion of the submit and will be passed the response from the server.
- * If an options Object is provided, the following attributes are supported:
- *
- * target: Identifies the element(s) in the page to be updated with the server response.
- * This value may be specified as a jQuery selection string, a jQuery object,
- * or a DOM element.
- * default value: null
- *
- * url: URL to which the form data will be submitted.
- * default value: value of form's 'action' attribute
- *
- * type: The method in which the form data should be submitted, 'GET' or 'POST'.
- * default value: value of form's 'method' attribute (or 'GET' if none found)
- *
- * data: Additional data to add to the request, specified as key/value pairs (see $.ajax).
- *
- * beforeSubmit: Callback method to be invoked before the form is submitted.
- * default value: null
- *
- * success: Callback method to be invoked after the form has been successfully submitted
- * and the response has been returned from the server
- * default value: null
- *
- * dataType: Expected dataType of the response. One of: null, 'xml', 'script', or 'json'
- * default value: null
- *
- * semantic: Boolean flag indicating whether data must be submitted in semantic order (slower).
- * default value: false
- *
- * resetForm: Boolean flag indicating whether the form should be reset if the submit is successful
- *
- * clearForm: Boolean flag indicating whether the form should be cleared if the submit is successful
- *
- *
- * The 'beforeSubmit' callback can be provided as a hook for running pre-submit logic or for
- * validating the form data. If the 'beforeSubmit' callback returns false then the form will
- * not be submitted. The 'beforeSubmit' callback is invoked with three arguments: the form data
- * in array format, the jQuery object, and the options object passed into ajaxSubmit.
- * The form data array takes the following form:
- *
- * [ { name: 'username', value: 'jresig' }, { name: 'password', value: 'secret' } ]
- *
- * If a 'success' callback method is provided it is invoked after the response has been returned
- * from the server. It is passed the responseText or responseXML value (depending on dataType).
- * See jQuery.ajax for further details.
- *
- *
- * The dataType option provides a means for specifying how the server response should be handled.
- * This maps directly to the jQuery.httpData method. The following values are supported:
- *
- * 'xml': if dataType == 'xml' the server response is treated as XML and the 'success'
- * callback method, if specified, will be passed the responseXML value
- * 'json': if dataType == 'json' the server response will be evaluted and passed to
- * the 'success' callback, if specified
- * 'script': if dataType == 'script' the server response is evaluated in the global context
- *
- *
- * Note that it does not make sense to use both the 'target' and 'dataType' options. If both
- * are provided the target will be ignored.
- *
- * The semantic argument can be used to force form serialization in semantic order.
- * This is normally true anyway, unless the form contains input elements of type='image'.
- * If your form must be submitted with name/value pairs in semantic order and your form
- * contains an input of type='image" then pass true for this arg, otherwise pass false
- * (or nothing) to avoid the overhead for this logic.
- *
- *
- * When used on its own, ajaxSubmit() is typically bound to a form's submit event like this:
- *
- * $("#form-id").submit(function() {
- * $(this).ajaxSubmit(options);
- * return false; // cancel conventional submit
- * });
- *
- * When using ajaxForm(), however, this is done for you.
- *
- * @example
- * $('#myForm').ajaxSubmit(function(data) {
- * alert('Form submit succeeded! Server returned: ' + data);
- * });
- * @desc Submit form and alert server response
- *
- *
- * @example
- * var options = {
- * target: '#myTargetDiv'
- * };
- * $('#myForm').ajaxSubmit(options);
- * @desc Submit form and update page element with server response
- *
- *
- * @example
- * var options = {
- * success: function(responseText) {
- * alert(responseText);
- * }
- * };
- * $('#myForm').ajaxSubmit(options);
- * @desc Submit form and alert the server response
- *
- *
- * @example
- * var options = {
- * beforeSubmit: function(formArray, jqForm) {
- * if (formArray.length == 0) {
- * alert('Please enter data.');
- * return false;
- * }
- * }
- * };
- * $('#myForm').ajaxSubmit(options);
- * @desc Pre-submit validation which aborts the submit operation if form data is empty
- *
- *
- * @example
- * var options = {
- * url: myJsonUrl.php,
- * dataType: 'json',
- * success: function(data) {
- * // 'data' is an object representing the the evaluated json data
- * }
- * };
- * $('#myForm').ajaxSubmit(options);
- * @desc json data returned and evaluated
- *
- *
- * @example
- * var options = {
- * url: myXmlUrl.php,
- * dataType: 'xml',
- * success: function(responseXML) {
- * // responseXML is XML document object
- * var data = $('myElement', responseXML).text();
- * }
- * };
- * $('#myForm').ajaxSubmit(options);
- * @desc XML data returned from server
- *
- *
- * @example
- * var options = {
- * resetForm: true
- * };
- * $('#myForm').ajaxSubmit(options);
- * @desc submit form and reset it if successful
- *
- * @example
- * $('#myForm).submit(function() {
- * $(this).ajaxSubmit();
- * return false;
- * });
- * @desc Bind form's submit event to use ajaxSubmit
- *
- *
- * @name ajaxSubmit
- * @type jQuery
- * @param options object literal containing options which control the form submission process
- * @cat Plugins/Form
- * @return jQuery
- */
-$.fn.ajaxSubmit = function(options) {
- if (typeof options == 'function')
- options = { success: options };
-
- options = $.extend({
- url: this.attr('action') || window.location.toString(),
- type: this.attr('method') || 'GET'
- }, options || {});
-
- // hook for manipulating the form data before it is extracted;
- // convenient for use with rich editors like tinyMCE or FCKEditor
- var veto = {};
- $.event.trigger('form.pre.serialize', [this, options, veto]);
- if (veto.veto) return this;
-
- var a = this.formToArray(options.semantic);
- if (options.data) {
- for (var n in options.data)
- a.push( { name: n, value: options.data[n] } );
- }
-
- // give pre-submit callback an opportunity to abort the submit
- if (options.beforeSubmit && options.beforeSubmit(a, this, options) === false) return this;
-
- // fire vetoable 'validate' event
- $.event.trigger('form.submit.validate', [a, this, options, veto]);
- if (veto.veto) return this;
-
- var q = $.param(a);//.replace(/%20/g,'+');
-
- if (options.type.toUpperCase() == 'GET') {
- options.url += (options.url.indexOf('?') >= 0 ? '&' : '?') + q;
- options.data = null; // data is null for 'get'
- }
- else
- options.data = q; // data is the query string for 'post'
-
- var $form = this, callbacks = [];
- if (options.resetForm) callbacks.push(function() { $form.resetForm(); });
- if (options.clearForm) callbacks.push(function() { $form.clearForm(); });
-
- // perform a load on the target only if dataType is not provided
- if (!options.dataType && options.target) {
- var oldSuccess = options.success || function(){};
- callbacks.push(function(data) {
- if (this.evalScripts)
- $(options.target).attr("innerHTML", data).evalScripts().each(oldSuccess, arguments);
- else // jQuery v1.1.4
- $(options.target).html(data).each(oldSuccess, arguments);
- });
- }
- else if (options.success)
- callbacks.push(options.success);
-
- options.success = function(data, status) {
- for (var i=0, max=callbacks.length; i < max; i++)
- callbacks[i](data, status, $form);
- };
-
- // are there files to upload?
- var files = $('input:file', this).fieldValue();
- var found = false;
- for (var j=0; j < files.length; j++)
- if (files[j])
- found = true;
-
- // options.iframe allows user to force iframe mode
- if (options.iframe || found) {
- // hack to fix Safari hang (thanks to Tim Molendijk for this)
- // see: http://groups.google.com/group/jquery-dev/browse_thread/thread/36395b7ab510dd5d
- if ($.browser.safari && options.closeKeepAlive)
- $.get(options.closeKeepAlive, fileUpload);
- else
- fileUpload();
- }
- else
- $.ajax(options);
-
- // fire 'notify' event
- $.event.trigger('form.submit.notify', [this, options]);
- return this;
-
-
- // private function for handling file uploads (hat tip to YAHOO!)
- function fileUpload() {
- var form = $form[0];
- var opts = $.extend({}, $.ajaxSettings, options);
-
- var id = 'jqFormIO' + $.fn.ajaxSubmit.counter++;
- var $io = $('<iframe id="' + id + '" name="' + id + '" />');
- var io = $io[0];
- var op8 = $.browser.opera && window.opera.version() < 9;
- if ($.browser.msie || op8) io.src = 'javascript:false;document.write("");';
- $io.css({ position: 'absolute', top: '-1000px', left: '-1000px' });
-
- var xhr = { // mock object
- responseText: null,
- responseXML: null,
- status: 0,
- statusText: 'n/a',
- getAllResponseHeaders: function() {},
- getResponseHeader: function() {},
- setRequestHeader: function() {}
- };
-
- var g = opts.global;
- // trigger ajax global events so that activity/block indicators work like normal
- if (g && ! $.active++) $.event.trigger("ajaxStart");
- if (g) $.event.trigger("ajaxSend", [xhr, opts]);
-
- var cbInvoked = 0;
- var timedOut = 0;
-
- // take a breath so that pending repaints get some cpu time before the upload starts
- setTimeout(function() {
- // make sure form attrs are set
- var encAttr = form.encoding ? 'encoding' : 'enctype';
- var t = $form.attr('target');
- $form.attr({
- target: id,
- method: 'POST',
- action: opts.url
- });
- form[encAttr] = 'multipart/form-data';
-
- // support timout
- if (opts.timeout)
- setTimeout(function() { timedOut = true; cb(); }, opts.timeout);
-
- // add iframe to doc and submit the form
- $io.appendTo('body');
- io.attachEvent ? io.attachEvent('onload', cb) : io.addEventListener('load', cb, false);
- form.submit();
- $form.attr('target', t); // reset target
- }, 10);
-
- function cb() {
- if (cbInvoked++) return;
-
- io.detachEvent ? io.detachEvent('onload', cb) : io.removeEventListener('load', cb, false);
-
- var ok = true;
- try {
- if (timedOut) throw 'timeout';
- // extract the server response from the iframe
- var data, doc;
- doc = io.contentWindow ? io.contentWindow.document : io.contentDocument ? io.contentDocument : io.document;
- xhr.responseText = doc.body ? doc.body.innerHTML : null;
- xhr.responseXML = doc.XMLDocument ? doc.XMLDocument : doc;
-
- if (opts.dataType == 'json' || opts.dataType == 'script') {
- var ta = doc.getElementsByTagName('textarea')[0];
- data = ta ? ta.value : xhr.responseText;
- if (opts.dataType == 'json')
- eval("data = " + data);
- else
- $.globalEval(data);
- }
- else if (opts.dataType == 'xml') {
- data = xhr.responseXML;
- if (!data && xhr.responseText != null)
- data = toXml(xhr.responseText);
- }
- else {
- data = xhr.responseText;
- }
- }
- catch(e){
- ok = false;
- $.handleError(opts, xhr, 'error', e);
- }
-
- // ordering of these callbacks/triggers is odd, but that's how $.ajax does it
- if (ok) {
- opts.success(data, 'success');
- if (g) $.event.trigger("ajaxSuccess", [xhr, opts]);
- }
- if (g) $.event.trigger("ajaxComplete", [xhr, opts]);
- if (g && ! --$.active) $.event.trigger("ajaxStop");
- if (opts.complete) opts.complete(xhr, ok ? 'success' : 'error');
-
- // clean up
- setTimeout(function() {
- $io.remove();
- xhr.responseXML = null;
- }, 100);
- };
-
- function toXml(s, doc) {
- if (window.ActiveXObject) {
- doc = new ActiveXObject('Microsoft.XMLDOM');
- doc.async = 'false';
- doc.loadXML(s);
- }
- else
- doc = (new DOMParser()).parseFromString(s, 'text/xml');
- return (doc && doc.documentElement && doc.documentElement.tagName != 'parsererror') ? doc : null;
- };
- };
-};
-$.fn.ajaxSubmit.counter = 0; // used to create unique iframe ids
-
-/**
- * ajaxForm() provides a mechanism for fully automating form submission.
- *
- * The advantages of using this method instead of ajaxSubmit() are:
- *
- * 1: This method will include coordinates for <input type="image" /> elements (if the element
- * is used to submit the form).
- * 2. This method will include the submit element's name/value data (for the element that was
- * used to submit the form).
- * 3. This method binds the submit() method to the form for you.
- *
- * Note that for accurate x/y coordinates of image submit elements in all browsers
- * you need to also use the "dimensions" plugin (this method will auto-detect its presence).
- *
- * The options argument for ajaxForm works exactly as it does for ajaxSubmit. ajaxForm merely
- * passes the options argument along after properly binding events for submit elements and
- * the form itself. See ajaxSubmit for a full description of the options argument.
- *
- *
- * @example
- * var options = {
- * target: '#myTargetDiv'
- * };
- * $('#myForm').ajaxSForm(options);
- * @desc Bind form's submit event so that 'myTargetDiv' is updated with the server response
- * when the form is submitted.
- *
- *
- * @example
- * var options = {
- * success: function(responseText) {
- * alert(responseText);
- * }
- * };
- * $('#myForm').ajaxSubmit(options);
- * @desc Bind form's submit event so that server response is alerted after the form is submitted.
- *
- *
- * @example
- * var options = {
- * beforeSubmit: function(formArray, jqForm) {
- * if (formArray.length == 0) {
- * alert('Please enter data.');
- * return false;
- * }
- * }
- * };
- * $('#myForm').ajaxSubmit(options);
- * @desc Bind form's submit event so that pre-submit callback is invoked before the form
- * is submitted.
- *
- *
- * @name ajaxForm
- * @param options object literal containing options which control the form submission process
- * @return jQuery
- * @cat Plugins/Form
- * @type jQuery
- */
-$.fn.ajaxForm = function(options) {
- return this.ajaxFormUnbind().submit(submitHandler).each(function() {
- // store options in hash
- this.formPluginId = $.fn.ajaxForm.counter++;
- $.fn.ajaxForm.optionHash[this.formPluginId] = options;
- $(":submit,input:image", this).click(clickHandler);
- });
-};
-
-$.fn.ajaxForm.counter = 1;
-$.fn.ajaxForm.optionHash = {};
-
-function clickHandler(e) {
- var $form = this.form;
- $form.clk = this;
- if (this.type == 'image') {
- if (e.offsetX != undefined) {
- $form.clk_x = e.offsetX;
- $form.clk_y = e.offsetY;
- } else if (typeof $.fn.offset == 'function') { // try to use dimensions plugin
- var offset = $(this).offset();
- $form.clk_x = e.pageX - offset.left;
- $form.clk_y = e.pageY - offset.top;
- } else {
- $form.clk_x = e.pageX - this.offsetLeft;
- $form.clk_y = e.pageY - this.offsetTop;
- }
- }
- // clear form vars
- setTimeout(function() { $form.clk = $form.clk_x = $form.clk_y = null; }, 10);
-};
-
-function submitHandler() {
- // retrieve options from hash
- var id = this.formPluginId;
- var options = $.fn.ajaxForm.optionHash[id];
- $(this).ajaxSubmit(options);
- return false;
-};
-
-/**
- * ajaxFormUnbind unbinds the event handlers that were bound by ajaxForm
- *
- * @name ajaxFormUnbind
- * @return jQuery
- * @cat Plugins/Form
- * @type jQuery
- */
-$.fn.ajaxFormUnbind = function() {
- this.unbind('submit', submitHandler);
- return this.each(function() {
- $(":submit,input:image", this).unbind('click', clickHandler);
- });
-
-};
-
-/**
- * formToArray() gathers form element data into an array of objects that can
- * be passed to any of the following ajax functions: $.get, $.post, or load.
- * Each object in the array has both a 'name' and 'value' property. An example of
- * an array for a simple login form might be:
- *
- * [ { name: 'username', value: 'jresig' }, { name: 'password', value: 'secret' } ]
- *
- * It is this array that is passed to pre-submit callback functions provided to the
- * ajaxSubmit() and ajaxForm() methods.
- *
- * The semantic argument can be used to force form serialization in semantic order.
- * This is normally true anyway, unless the form contains input elements of type='image'.
- * If your form must be submitted with name/value pairs in semantic order and your form
- * contains an input of type='image" then pass true for this arg, otherwise pass false
- * (or nothing) to avoid the overhead for this logic.
- *
- * @example var data = $("#myForm").formToArray();
- * $.post( "myscript.cgi", data );
- * @desc Collect all the data from a form and submit it to the server.
- *
- * @name formToArray
- * @param semantic true if serialization must maintain strict semantic ordering of elements (slower)
- * @type Array<Object>
- * @cat Plugins/Form
- */
-$.fn.formToArray = function(semantic) {
- var a = [];
- if (this.length == 0) return a;
-
- var form = this[0];
- var els = semantic ? form.getElementsByTagName('*') : form.elements;
- if (!els) return a;
- for(var i=0, max=els.length; i < max; i++) {
- var el = els[i];
- var n = el.name;
- if (!n) continue;
-
- if (semantic && form.clk && el.type == "image") {
- // handle image inputs on the fly when semantic == true
- if(!el.disabled && form.clk == el)
- a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
- continue;
- }
-
- var v = $.fieldValue(el, true);
- if (v && v.constructor == Array) {
- for(var j=0, jmax=v.length; j < jmax; j++)
- a.push({name: n, value: v[j]});
- }
- else if (v !== null && typeof v != 'undefined')
- a.push({name: n, value: v});
- }
-
- if (!semantic && form.clk) {
- // input type=='image' are not found in elements array! handle them here
- var inputs = form.getElementsByTagName("input");
- for(var i=0, max=inputs.length; i < max; i++) {
- var input = inputs[i];
- var n = input.name;
- if(n && !input.disabled && input.type == "image" && form.clk == input)
- a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
- }
- }
- return a;
-};
-
-
-/**
- * Serializes form data into a 'submittable' string. This method will return a string
- * in the format: name1=value1&amp;name2=value2
- *
- * The semantic argument can be used to force form serialization in semantic order.
- * If your form must be submitted with name/value pairs in semantic order then pass
- * true for this arg, otherwise pass false (or nothing) to avoid the overhead for
- * this logic (which can be significant for very large forms).
- *
- * @example var data = $("#myForm").formSerialize();
- * $.ajax('POST', "myscript.cgi", data);
- * @desc Collect all the data from a form into a single string
- *
- * @name formSerialize
- * @param semantic true if serialization must maintain strict semantic ordering of elements (slower)
- * @type String
- * @cat Plugins/Form
- */
-$.fn.formSerialize = function(semantic) {
- //hand off to jQuery.param for proper encoding
- return $.param(this.formToArray(semantic));
-};
-
-
-/**
- * Serializes all field elements in the jQuery object into a query string.
- * This method will return a string in the format: name1=value1&amp;name2=value2
- *
- * The successful argument controls whether or not serialization is limited to
- * 'successful' controls (per http://www.w3.org/TR/html4/interact/forms.html#successful-controls).
- * The default value of the successful argument is true.
- *
- * @example var data = $("input").formSerialize();
- * @desc Collect the data from all successful input elements into a query string
- *
- * @example var data = $(":radio").formSerialize();
- * @desc Collect the data from all successful radio input elements into a query string
- *
- * @example var data = $("#myForm :checkbox").formSerialize();
- * @desc Collect the data from all successful checkbox input elements in myForm into a query string
- *
- * @example var data = $("#myForm :checkbox").formSerialize(false);
- * @desc Collect the data from all checkbox elements in myForm (even the unchecked ones) into a query string
- *
- * @example var data = $(":input").formSerialize();
- * @desc Collect the data from all successful input, select, textarea and button elements into a query string
- *
- * @name fieldSerialize
- * @param successful true if only successful controls should be serialized (default is true)
- * @type String
- * @cat Plugins/Form
- */
-$.fn.fieldSerialize = function(successful) {
- var a = [];
- this.each(function() {
- var n = this.name;
- if (!n) return;
- var v = $.fieldValue(this, successful);
- if (v && v.constructor == Array) {
- for (var i=0,max=v.length; i < max; i++)
- a.push({name: n, value: v[i]});
- }
- else if (v !== null && typeof v != 'undefined')
- a.push({name: this.name, value: v});
- });
- //hand off to jQuery.param for proper encoding
- return $.param(a);
-};
-
-
-/**
- * Returns the value(s) of the element in the matched set. For example, consider the following form:
- *
- * <form><fieldset>
- * <input name="A" type="text" />
- * <input name="A" type="text" />
- * <input name="B" type="checkbox" value="B1" />
- * <input name="B" type="checkbox" value="B2"/>
- * <input name="C" type="radio" value="C1" />
- * <input name="C" type="radio" value="C2" />
- * </fieldset></form>
- *
- * var v = $(':text').fieldValue();
- * // if no values are entered into the text inputs
- * v == ['','']
- * // if values entered into the text inputs are 'foo' and 'bar'
- * v == ['foo','bar']
- *
- * var v = $(':checkbox').fieldValue();
- * // if neither checkbox is checked
- * v === undefined
- * // if both checkboxes are checked
- * v == ['B1', 'B2']
- *
- * var v = $(':radio').fieldValue();
- * // if neither radio is checked
- * v === undefined
- * // if first radio is checked
- * v == ['C1']
- *
- * The successful argument controls whether or not the field element must be 'successful'
- * (per http://www.w3.org/TR/html4/interact/forms.html#successful-controls).
- * The default value of the successful argument is true. If this value is false the value(s)
- * for each element is returned.
- *
- * Note: This method *always* returns an array. If no valid value can be determined the
- * array will be empty, otherwise it will contain one or more values.
- *
- * @example var data = $("#myPasswordElement").fieldValue();
- * alert(data[0]);
- * @desc Alerts the current value of the myPasswordElement element
- *
- * @example var data = $("#myForm :input").fieldValue();
- * @desc Get the value(s) of the form elements in myForm
- *
- * @example var data = $("#myForm :checkbox").fieldValue();
- * @desc Get the value(s) for the successful checkbox element(s) in the jQuery object.
- *
- * @example var data = $("#mySingleSelect").fieldValue();
- * @desc Get the value(s) of the select control
- *
- * @example var data = $(':text').fieldValue();
- * @desc Get the value(s) of the text input or textarea elements
- *
- * @example var data = $("#myMultiSelect").fieldValue();
- * @desc Get the values for the select-multiple control
- *
- * @name fieldValue
- * @param Boolean successful true if only the values for successful controls should be returned (default is true)
- * @type Array<String>
- * @cat Plugins/Form
- */
-$.fn.fieldValue = function(successful) {
- for (var val=[], i=0, max=this.length; i < max; i++) {
- var el = this[i];
- var v = $.fieldValue(el, successful);
- if (v === null || typeof v == 'undefined' || (v.constructor == Array && !v.length))
- continue;
- v.constructor == Array ? $.merge(val, v) : val.push(v);
- }
- return val;
-};
-
-/**
- * Returns the value of the field element.
- *
- * The successful argument controls whether or not the field element must be 'successful'
- * (per http://www.w3.org/TR/html4/interact/forms.html#successful-controls).
- * The default value of the successful argument is true. If the given element is not
- * successful and the successful arg is not false then the returned value will be null.
- *
- * Note: If the successful flag is true (default) but the element is not successful, the return will be null
- * Note: The value returned for a successful select-multiple element will always be an array.
- * Note: If the element has no value the return value will be undefined.
- *
- * @example var data = jQuery.fieldValue($("#myPasswordElement")[0]);
- * @desc Gets the current value of the myPasswordElement element
- *
- * @name fieldValue
- * @param Element el The DOM element for which the value will be returned
- * @param Boolean successful true if value returned must be for a successful controls (default is true)
- * @type String or Array<String> or null or undefined
- * @cat Plugins/Form
- */
-$.fieldValue = function(el, successful) {
- var n = el.name, t = el.type, tag = el.tagName.toLowerCase();
- if (typeof successful == 'undefined') successful = true;
-
- if (successful && (!n || el.disabled || t == 'reset' || t == 'button' ||
- (t == 'checkbox' || t == 'radio') && !el.checked ||
- (t == 'submit' || t == 'image') && el.form && el.form.clk != el ||
- tag == 'select' && el.selectedIndex == -1))
- return null;
-
- if (tag == 'select') {
- var index = el.selectedIndex;
- if (index < 0) return null;
- var a = [], ops = el.options;
- var one = (t == 'select-one');
- var max = (one ? index+1 : ops.length);
- for(var i=(one ? index : 0); i < max; i++) {
- var op = ops[i];
- if (op.selected) {
- // extra pain for IE...
- var v = $.browser.msie && !(op.attributes['value'].specified) ? op.text : op.value;
- if (one) return v;
- a.push(v);
- }
- }
- return a;
- }
- return el.value;
-};
-
-
-/**
- * Clears the form data. Takes the following actions on the form's input fields:
- * - input text fields will have their 'value' property set to the empty string
- * - select elements will have their 'selectedIndex' property set to -1
- * - checkbox and radio inputs will have their 'checked' property set to false
- * - inputs of type submit, button, reset, and hidden will *not* be effected
- * - button elements will *not* be effected
- *
- * @example $('form').clearForm();
- * @desc Clears all forms on the page.
- *
- * @name clearForm
- * @type jQuery
- * @cat Plugins/Form
- */
-$.fn.clearForm = function() {
- return this.each(function() {
- $('input,select,textarea', this).clearFields();
- });
-};
-
-/**
- * Clears the selected form elements. Takes the following actions on the matched elements:
- * - input text fields will have their 'value' property set to the empty string
- * - select elements will have their 'selectedIndex' property set to -1
- * - checkbox and radio inputs will have their 'checked' property set to false
- * - inputs of type submit, button, reset, and hidden will *not* be effected
- * - button elements will *not* be effected
- *
- * @example $('.myInputs').clearFields();
- * @desc Clears all inputs with class myInputs
- *
- * @name clearFields
- * @type jQuery
- * @cat Plugins/Form
- */
-$.fn.clearFields = $.fn.clearInputs = function() {
- return this.each(function() {
- var t = this.type, tag = this.tagName.toLowerCase();
- if (t == 'text' || t == 'password' || tag == 'textarea')
- this.value = '';
- else if (t == 'checkbox' || t == 'radio')
- this.checked = false;
- else if (tag == 'select')
- this.selectedIndex = -1;
- });
-};
-
-
-/**
- * Resets the form data. Causes all form elements to be reset to their original value.
- *
- * @example $('form').resetForm();
- * @desc Resets all forms on the page.
- *
- * @name resetForm
- * @type jQuery
- * @cat Plugins/Form
- */
-$.fn.resetForm = function() {
- return this.each(function() {
- // guard against an input with the name of 'reset'
- // note that IE reports the reset function as an 'object'
- if (typeof this.reset == 'function' || (typeof this.reset == 'object' && !this.reset.nodeType))
- this.reset();
- });
-};
-
-
-/**
- * Enables or disables any matching elements.
- *
- * @example $(':radio').enabled(false);
- * @desc Disables all radio buttons
- *
- * @name select
- * @type jQuery
- * @cat Plugins/Form
- */
-$.fn.enable = function(b) {
- if (b == undefined) b = true;
- return this.each(function() {
- this.disabled = !b
- });
-};
-
-/**
- * Checks/unchecks any matching checkboxes or radio buttons and
- * selects/deselects and matching option elements.
- *
- * @example $(':checkbox').selected();
- * @desc Checks all checkboxes
- *
- * @name select
- * @type jQuery
- * @cat Plugins/Form
- */
-$.fn.select = function(select) {
- if (select == undefined) select = true;
- return this.each(function() {
- var t = this.type;
- if (t == 'checkbox' || t == 'radio')
- this.checked = select;
- else if (this.tagName.toLowerCase() == 'option') {
- var $sel = $(this).parent('select');
- if (select && $sel[0] && $sel[0].type == 'select-one') {
- // deselect all other options
- $sel.find('option').select(false);
- }
- this.selected = select;
- }
- });
-};
-
-})(jQuery);
diff --git a/vendor/assets/javascripts/mailchimp/jquery.validate.js b/vendor/assets/javascripts/mailchimp/jquery.validate.js
deleted file mode 100644
index e0ac96b3f..000000000
--- a/vendor/assets/javascripts/mailchimp/jquery.validate.js
+++ /dev/null
@@ -1,1118 +0,0 @@
-/*
- * jQuery validation plug-in 1.5.1
- *
- * http://bassistance.de/jquery-plugins/jquery-plugin-validation/
- * http://docs.jquery.com/Plugins/Validation
- *
- * Copyright (c) 2006 - 2008 Jörn Zaefferer
- *
- * $Id: jquery.validate.js 6096 2009-01-12 14:12:04Z joern.zaefferer $
- *
- * Dual licensed under the MIT and GPL licenses:
- * http://www.opensource.org/licenses/mit-license.php
- * http://www.gnu.org/licenses/gpl.html
- */
-
-(function($) {
-
-$.extend($.fn, {
- // http://docs.jquery.com/Plugins/Validation/validate
- validate: function( options ) {
-
- // if nothing is selected, return nothing; can't chain anyway
- if (!this.length) {
- options && options.debug && window.console && console.warn( "nothing selected, can't validate, returning nothing" );
- return;
- }
-
- // check if a validator for this form was already created
- var validator = $.data(this[0], 'validator');
- if ( validator ) {
- return validator;
- }
-
- validator = new $.validator( options, this[0] );
- $.data(this[0], 'validator', validator);
-
- if ( validator.settings.onsubmit ) {
-
- // allow suppresing validation by adding a cancel class to the submit button
- this.find("input, button").filter(".cancel").click(function() {
- validator.cancelSubmit = true;
- });
-
- // validate the form on submit
- this.submit( function( event ) {
- if ( validator.settings.debug )
- // prevent form submit to be able to see console output
- event.preventDefault();
-
- function handle() {
- if ( validator.settings.submitHandler ) {
- validator.settings.submitHandler.call( validator, validator.currentForm );
- return false;
- }
- return true;
- }
-
- // prevent submit for invalid forms or custom submit handlers
- if ( validator.cancelSubmit ) {
- validator.cancelSubmit = false;
- return handle();
- }
- if ( validator.form() ) {
- if ( validator.pendingRequest ) {
- validator.formSubmitted = true;
- return false;
- }
- return handle();
- } else {
- validator.focusInvalid();
- return false;
- }
- });
- }
-
- return validator;
- },
- // http://docs.jquery.com/Plugins/Validation/valid
- valid: function() {
- if ( $(this[0]).is('form')) {
- return this.validate().form();
- } else {
- var valid = false;
- var validator = $(this[0].form).validate();
- this.each(function() {
- valid |= validator.element(this);
- });
- return valid;
- }
- },
- // attributes: space seperated list of attributes to retrieve and remove
- removeAttrs: function(attributes) {
- var result = {},
- $element = this;
- $.each(attributes.split(/\s/), function(index, value) {
- result[value] = $element.attr(value);
- $element.removeAttr(value);
- });
- return result;
- },
- // http://docs.jquery.com/Plugins/Validation/rules
- rules: function(command, argument) {
- var element = this[0];
-
- if (command) {
- var settings = $.data(element.form, 'validator').settings;
- var staticRules = settings.rules;
- var existingRules = $.validator.staticRules(element);
- switch(command) {
- case "add":
- $.extend(existingRules, $.validator.normalizeRule(argument));
- staticRules[element.name] = existingRules;
- if (argument.messages)
- settings.messages[element.name] = $.extend( settings.messages[element.name], argument.messages );
- break;
- case "remove":
- if (!argument) {
- delete staticRules[element.name];
- return existingRules;
- }
- var filtered = {};
- $.each(argument.split(/\s/), function(index, method) {
- filtered[method] = existingRules[method];
- delete existingRules[method];
- });
- return filtered;
- }
- }
-
- var data = $.validator.normalizeRules(
- $.extend(
- {},
- $.validator.metadataRules(element),
- $.validator.classRules(element),
- $.validator.attributeRules(element),
- $.validator.staticRules(element)
- ), element);
-
- // make sure required is at front
- if (data.required) {
- var param = data.required;
- delete data.required;
- data = $.extend({required: param}, data);
- }
-
- return data;
- }
-});
-
-// Custom selectors
-$.extend($.expr[":"], {
- // http://docs.jquery.com/Plugins/Validation/blank
- blank: function(a) {return !$.trim(a.value);},
- // http://docs.jquery.com/Plugins/Validation/filled
- filled: function(a) {return !!$.trim(a.value);},
- // http://docs.jquery.com/Plugins/Validation/unchecked
- unchecked: function(a) {return !a.checked;}
-});
-
-
-$.format = function(source, params) {
- if ( arguments.length == 1 )
- return function() {
- var args = $.makeArray(arguments);
- args.unshift(source);
- return $.format.apply( this, args );
- };
- if ( arguments.length > 2 && params.constructor != Array ) {
- params = $.makeArray(arguments).slice(1);
- }
- if ( params.constructor != Array ) {
- params = [ params ];
- }
- $.each(params, function(i, n) {
- source = source.replace(new RegExp("\\{" + i + "\\}", "g"), n);
- });
- return source;
-};
-
-// constructor for validator
-$.validator = function( options, form ) {
- this.settings = $.extend( {}, $.validator.defaults, options );
- this.currentForm = form;
- this.init();
-};
-
-$.extend($.validator, {
-
- defaults: {
- messages: {},
- groups: {},
- rules: {},
- errorClass: "error",
- errorElement: "label",
- errorStyle: "",
- focusInvalid: true,
- errorContainer: $( [] ),
- errorLabelContainer: $( [] ),
- onsubmit: true,
- ignore: [],
- ignoreTitle: false,
- onfocusin: function(element) {
- this.lastActive = element;
-
- // hide error label and remove error class on focus if enabled
- if ( this.settings.focusCleanup && !this.blockFocusCleanup ) {
- this.settings.unhighlight && this.settings.unhighlight.call( this, element, this.settings.errorClass );
- this.errorsFor(element).hide();
- }
- },
- onfocusout: function(element) {
- if ( !this.checkable(element) && (element.name in this.submitted || !this.optional(element)) ) {
- this.element(element);
- }
- },
- onkeyup: function(element) {
- if ( element.name in this.submitted || element == this.lastElement ) {
- this.element(element);
- }
- },
- onclick: function(element) {
- if ( element.name in this.submitted )
- this.element(element);
- },
- highlight: function( element, errorClass ) {
- $( element ).addClass( errorClass );
- },
- unhighlight: function( element, errorClass ) {
- $( element ).removeClass( errorClass );
- }
- },
-
- // http://docs.jquery.com/Plugins/Validation/Validator/setDefaults
- setDefaults: function(settings) {
- $.extend( $.validator.defaults, settings );
- },
-
- messages: {
- required: "This field is required.",
- remote: "Please fix this field.",
- email: "Please enter a valid email address.",
- url: "Please enter a valid URL.",
- date: "Please enter a valid date.",
- dateISO: "Please enter a valid date (ISO).",
- dateDE: "Bitte geben Sie ein gültiges Datum ein.",
- number: "Please enter a valid number.",
- numberDE: "Bitte geben Sie eine Nummer ein.",
- digits: "Please enter only digits",
- creditcard: "Please enter a valid credit card number.",
- equalTo: "Please enter the same value again.",
- accept: "Please enter a value with a valid extension.",
- maxlength: $.format("Please enter no more than {0} characters."),
- minlength: $.format("Please enter at least {0} characters."),
- rangelength: $.format("Please enter a value between {0} and {1} characters long."),
- range: $.format("Please enter a value between {0} and {1}."),
- max: $.format("Please enter a value less than or equal to {0}."),
- min: $.format("Please enter a value greater than or equal to {0}.")
- },
-
- autoCreateRanges: false,
-
- prototype: {
-
- init: function() {
- this.labelContainer = $(this.settings.errorLabelContainer);
- this.errorContext = this.labelContainer.length && this.labelContainer || $(this.currentForm);
- this.containers = $(this.settings.errorContainer).add( this.settings.errorLabelContainer );
- this.submitted = {};
- this.valueCache = {};
- this.pendingRequest = 0;
- this.pending = {};
- this.invalid = {};
- this.reset();
-
- var groups = (this.groups = {});
- $.each(this.settings.groups, function(key, value) {
- $.each(value.split(/\s/), function(index, name) {
- groups[name] = key;
- });
- });
- var rules = this.settings.rules;
- $.each(rules, function(key, value) {
- rules[key] = $.validator.normalizeRule(value);
- });
-
- function delegate(event) {
- var validator = $.data(this[0].form, "validator");
- validator.settings["on" + event.type] && validator.settings["on" + event.type].call(validator, this[0] );
- }
- $(this.currentForm)
- .delegate("focusin focusout keyup", ":text, :password, :file, select, textarea", delegate)
- .delegate("click", ":radio, :checkbox", delegate);
-
- if (this.settings.invalidHandler)
- $(this.currentForm).bind("invalid-form.validate", this.settings.invalidHandler);
- },
-
- // http://docs.jquery.com/Plugins/Validation/Validator/form
- form: function() {
- this.checkForm();
- $.extend(this.submitted, this.errorMap);
- this.invalid = $.extend({}, this.errorMap);
- if (!this.valid())
- $(this.currentForm).triggerHandler("invalid-form", [this]);
- this.showErrors();
- return this.valid();
- },
-
- checkForm: function() {
- this.prepareForm();
- for ( var i = 0, elements = (this.currentElements = this.elements()); elements[i]; i++ ) {
- this.check( elements[i] );
- }
- return this.valid();
- },
-
- // http://docs.jquery.com/Plugins/Validation/Validator/element
- element: function( element ) {
- element = this.clean( element );
- this.lastElement = element;
- this.prepareElement( element );
- this.currentElements = $(element);
- var result = this.check( element );
- if ( result ) {
- delete this.invalid[element.name];
- } else {
- this.invalid[element.name] = true;
- }
- if ( !this.numberOfInvalids() ) {
- // Hide error containers on last error
- this.toHide = this.toHide.add( this.containers );
- }
- this.showErrors();
- return result;
- },
-
- // http://docs.jquery.com/Plugins/Validation/Validator/showErrors
- showErrors: function(errors) {
- if(errors) {
- // add items to error list and map
- $.extend( this.errorMap, errors );
- this.errorList = [];
- for ( var name in errors ) {
- this.errorList.push({
- message: errors[name],
- element: this.findByName(name)[0]
- });
- }
- // remove items from success list
- this.successList = $.grep( this.successList, function(element) {
- return !(element.name in errors);
- });
- }
- this.settings.showErrors
- ? this.settings.showErrors.call( this, this.errorMap, this.errorList )
- : this.defaultShowErrors();
- },
-
- // http://docs.jquery.com/Plugins/Validation/Validator/resetForm
- resetForm: function() {
- if ( $.fn.resetForm )
- $( this.currentForm ).resetForm();
- this.submitted = {};
- this.prepareForm();
- this.hideErrors();
- this.elements().removeClass( this.settings.errorClass );
- },
-
- numberOfInvalids: function() {
- return this.objectLength(this.invalid);
- },
-
- objectLength: function( obj ) {
- var count = 0;
- for ( var i in obj )
- count++;
- return count;
- },
-
- hideErrors: function() {
- this.addWrapper( this.toHide ).hide();
- },
-
- valid: function() {
- return this.size() == 0;
- },
-
- size: function() {
- return this.errorList.length;
- },
-
- focusInvalid: function() {
- if( this.settings.focusInvalid ) {
- try {
- $(this.findLastActive() || this.errorList.length && this.errorList[0].element || []).filter(":visible").focus();
- } catch(e) {
- // ignore IE throwing errors when focusing hidden elements
- }
- }
- },
-
- findLastActive: function() {
- var lastActive = this.lastActive;
- return lastActive && $.grep(this.errorList, function(n) {
- return n.element.name == lastActive.name;
- }).length == 1 && lastActive;
- },
-
- elements: function() {
- var validator = this,
- rulesCache = {};
-
- // select all valid inputs inside the form (no submit or reset buttons)
- // workaround $Query([]).add until http://dev.jquery.com/ticket/2114 is solved
- return $([]).add(this.currentForm.elements)
- .filter(":input")
- .not(":submit, :reset, :image, [disabled]")
- .not( this.settings.ignore )
- .filter(function() {
- !this.name && validator.settings.debug && window.console && console.error( "%o has no name assigned", this);
-
- // select only the first element for each name, and only those with rules specified
- if ( this.name in rulesCache || !validator.objectLength($(this).rules()) )
- return false;
-
- rulesCache[this.name] = true;
- return true;
- });
- },
-
- clean: function( selector ) {
- return $( selector )[0];
- },
-
- errors: function() {
- return $( this.settings.errorElement + "." + this.settings.errorClass, this.errorContext );
- },
-
- reset: function() {
- this.successList = [];
- this.errorList = [];
- this.errorMap = {};
- this.toShow = $([]);
- this.toHide = $([]);
- this.formSubmitted = false;
- this.currentElements = $([]);
- },
-
- prepareForm: function() {
- this.reset();
- this.toHide = this.errors().add( this.containers );
- },
-
- prepareElement: function( element ) {
- this.reset();
- this.toHide = this.errorsFor(element);
- },
-
- check: function( element ) {
- element = this.clean( element );
-
- // if radio/checkbox, validate first element in group instead
- if (this.checkable(element)) {
- element = this.findByName( element.name )[0];
- }
-
- var rules = $(element).rules();
- var dependencyMismatch = false;
- for( method in rules ) {
- var rule = { method: method, parameters: rules[method] };
- try {
- var result = $.validator.methods[method].call( this, element.value, element, rule.parameters );
-
- // if a method indicates that the field is optional and therefore valid,
- // don't mark it as valid when there are no other rules
- if ( result == "dependency-mismatch" ) {
- dependencyMismatch = true;
- continue;
- }
- dependencyMismatch = false;
-
- if ( result == "pending" ) {
- this.toHide = this.toHide.not( this.errorsFor(element) );
- return;
- }
-
- if( !result ) {
- this.formatAndAdd( element, rule );
- return false;
- }
- } catch(e) {
- this.settings.debug && window.console && console.log("exception occured when checking element " + element.id
- + ", check the '" + rule.method + "' method");
- throw e;
- }
- }
- if (dependencyMismatch)
- return;
- if ( this.objectLength(rules) )
- this.successList.push(element);
- return true;
- },
-
- // return the custom message for the given element and validation method
- // specified in the element's "messages" metadata
- customMetaMessage: function(element, method) {
- if (!$.metadata)
- return;
-
- var meta = this.settings.meta
- ? $(element).metadata()[this.settings.meta]
- : $(element).metadata();
-
- return meta && meta.messages && meta.messages[method];
- },
-
- // return the custom message for the given element name and validation method
- customMessage: function( name, method ) {
- var m = this.settings.messages[name];
- return m && (m.constructor == String
- ? m
- : m[method]);
- },
-
- // return the first defined argument, allowing empty strings
- findDefined: function() {
- for(var i = 0; i < arguments.length; i++) {
- if (arguments[i] !== undefined)
- return arguments[i];
- }
- return undefined;
- },
-
- defaultMessage: function( element, method) {
- return this.findDefined(
- this.customMessage( element.name, method ),
- this.customMetaMessage( element, method ),
- // title is never undefined, so handle empty string as undefined
- !this.settings.ignoreTitle && element.title || undefined,
- $.validator.messages[method],
- "<strong>Warning: No message defined for " + element.name + "</strong>"
- );
- },
-
- formatAndAdd: function( element, rule ) {
- var message = this.defaultMessage( element, rule.method );
- if ( typeof message == "function" )
- message = message.call(this, rule.parameters, element);
- this.errorList.push({
- message: message,
- element: element
- });
- this.errorMap[element.name] = message;
- this.submitted[element.name] = message;
- },
-
- addWrapper: function(toToggle) {
- if ( this.settings.wrapper )
- toToggle = toToggle.add( toToggle.parents( this.settings.wrapper ) );
- return toToggle;
- },
-
- defaultShowErrors: function() {
- for ( var i = 0; this.errorList[i]; i++ ) {
- var error = this.errorList[i];
- this.settings.highlight && this.settings.highlight.call( this, error.element, this.settings.errorClass );
- this.showLabel( error.element, error.message );
- }
- if( this.errorList.length ) {
- this.toShow = this.toShow.add( this.containers );
- }
- if (this.settings.success) {
- for ( var i = 0; this.successList[i]; i++ ) {
- this.showLabel( this.successList[i] );
- }
- }
- if (this.settings.unhighlight) {
- for ( var i = 0, elements = this.validElements(); elements[i]; i++ ) {
- this.settings.unhighlight.call( this, elements[i], this.settings.errorClass );
- }
- }
- this.toHide = this.toHide.not( this.toShow );
- this.hideErrors();
- this.addWrapper( this.toShow ).show();
- },
-
- validElements: function() {
- return this.currentElements.not(this.invalidElements());
- },
-
- invalidElements: function() {
- return $(this.errorList).map(function() {
- return this.element;
- });
- },
-
- showLabel: function(element, message) {
- var label = this.errorsFor( element );
- if ( label.length ) {
- // refresh error/success class
- label.removeClass().addClass( this.settings.errorClass );
- label.attr('style', this.settings.errorStyle );
-
- // check if we have a generated label, replace the message then
- label.attr("generated") && label.html(message);
- } else {
- // create label
- label = $("<" + this.settings.errorElement + "/>")
- .attr({"for": this.idOrName(element), generated: true})
- .addClass(this.settings.errorClass)
- .attr('style', this.settings.errorStyle )
- .html(message || "");
- if ( this.settings.wrapper ) {
- // make sure the element is visible, even in IE
- // actually showing the wrapped element is handled elsewhere
- label = label.hide().show().wrap("<" + this.settings.wrapper + "/>").parent();
- }
- if ( !this.labelContainer.append(label).length )
- this.settings.errorPlacement
- ? this.settings.errorPlacement(label, $(element) )
- : label.insertAfter(element);
- }
- if ( !message && this.settings.success ) {
- label.text("");
- typeof this.settings.success == "string"
- ? label.addClass( this.settings.success )
- : this.settings.success( label );
- }
- this.toShow = this.toShow.add(label);
- },
-
- errorsFor: function(element) {
- return this.errors().filter("[for='" + this.idOrName(element) + "']");
- },
-
- idOrName: function(element) {
- return this.groups[element.name] || (this.checkable(element) ? element.name : element.id || element.name);
- },
-
- checkable: function( element ) {
- return /radio|checkbox/i.test(element.type);
- },
-
- findByName: function( name ) {
- // select by name and filter by form for performance over form.find("[name=...]")
- var form = this.currentForm;
- return $(document.getElementsByName(name)).map(function(index, element) {
- return element.form == form && element.name == name && element || null;
- });
- },
-
- getLength: function(value, element) {
- switch( element.nodeName.toLowerCase() ) {
- case 'select':
- return $("option:selected", element).length;
- case 'input':
- if( this.checkable( element) )
- return this.findByName(element.name).filter(':checked').length;
- }
- return value.length;
- },
-
- depend: function(param, element) {
- return this.dependTypes[typeof param]
- ? this.dependTypes[typeof param](param, element)
- : true;
- },
-
- dependTypes: {
- "boolean": function(param, element) {
- return param;
- },
- "string": function(param, element) {
- return !!$(param, element.form).length;
- },
- "function": function(param, element) {
- return param(element);
- }
- },
-
- optional: function(element) {
- return !$.validator.methods.required.call(this, $.trim(element.value), element) && "dependency-mismatch";
- },
-
- startRequest: function(element) {
- if (!this.pending[element.name]) {
- this.pendingRequest++;
- this.pending[element.name] = true;
- }
- },
-
- stopRequest: function(element, valid) {
- this.pendingRequest--;
- // sometimes synchronization fails, make sure pendingRequest is never < 0
- if (this.pendingRequest < 0)
- this.pendingRequest = 0;
- delete this.pending[element.name];
- if ( valid && this.pendingRequest == 0 && this.formSubmitted && this.form() ) {
- $(this.currentForm).submit();
- } else if (!valid && this.pendingRequest == 0 && this.formSubmitted) {
- $(this.currentForm).triggerHandler("invalid-form", [this]);
- }
- },
-
- previousValue: function(element) {
- return $.data(element, "previousValue") || $.data(element, "previousValue", previous = {
- old: null,
- valid: true,
- message: this.defaultMessage( element, "remote" )
- });
- }
-
- },
-
- classRuleSettings: {
- required: {required: true},
- email: {email: true},
- url: {url: true},
- date: {date: true},
- dateISO: {dateISO: true},
- dateDE: {dateDE: true},
- number: {number: true},
- numberDE: {numberDE: true},
- digits: {digits: true},
- creditcard: {creditcard: true}
- },
-
- addClassRules: function(className, rules) {
- className.constructor == String ?
- this.classRuleSettings[className] = rules :
- $.extend(this.classRuleSettings, className);
- },
-
- classRules: function(element) {
- var rules = {};
- var classes = $(element).attr('class');
- classes && $.each(classes.split(' '), function() {
- if (this in $.validator.classRuleSettings) {
- $.extend(rules, $.validator.classRuleSettings[this]);
- }
- });
- return rules;
- },
-
- attributeRules: function(element) {
- var rules = {};
- var $element = $(element);
-
- for (method in $.validator.methods) {
- var value = $element.attr(method);
- if (value) {
- rules[method] = value;
- }
- }
-
- // maxlength may be returned as -1, 2147483647 (IE) and 524288 (safari) for text inputs
- if (rules.maxlength && /-1|2147483647|524288/.test(rules.maxlength)) {
- delete rules.maxlength;
- }
-
- return rules;
- },
-
- metadataRules: function(element) {
- if (!$.metadata) return {};
-
- var meta = $.data(element.form, 'validator').settings.meta;
- return meta ?
- $(element).metadata()[meta] :
- $(element).metadata();
- },
-
- staticRules: function(element) {
- var rules = {};
- var validator = $.data(element.form, 'validator');
- if (validator.settings.rules) {
- rules = $.validator.normalizeRule(validator.settings.rules[element.name]) || {};
- }
- return rules;
- },
-
- normalizeRules: function(rules, element) {
- // handle dependency check
- $.each(rules, function(prop, val) {
- // ignore rule when param is explicitly false, eg. required:false
- if (val === false) {
- delete rules[prop];
- return;
- }
- if (val.param || val.depends) {
- var keepRule = true;
- switch (typeof val.depends) {
- case "string":
- keepRule = !!$(val.depends, element.form).length;
- break;
- case "function":
- keepRule = val.depends.call(element, element);
- break;
- }
- if (keepRule) {
- rules[prop] = val.param !== undefined ? val.param : true;
- } else {
- delete rules[prop];
- }
- }
- });
-
- // evaluate parameters
- $.each(rules, function(rule, parameter) {
- rules[rule] = $.isFunction(parameter) ? parameter(element) : parameter;
- });
-
- // clean number parameters
- $.each(['minlength', 'maxlength', 'min', 'max'], function() {
- if (rules[this]) {
- rules[this] = Number(rules[this]);
- }
- });
- $.each(['rangelength', 'range'], function() {
- if (rules[this]) {
- rules[this] = [Number(rules[this][0]), Number(rules[this][1])];
- }
- });
-
- if ($.validator.autoCreateRanges) {
- // auto-create ranges
- if (rules.min && rules.max) {
- rules.range = [rules.min, rules.max];
- delete rules.min;
- delete rules.max;
- }
- if (rules.minlength && rules.maxlength) {
- rules.rangelength = [rules.minlength, rules.maxlength];
- delete rules.minlength;
- delete rules.maxlength;
- }
- }
-
- // To support custom messages in metadata ignore rule methods titled "messages"
- if (rules.messages) {
- delete rules.messages
- }
-
- return rules;
- },
-
- // Converts a simple string to a {string: true} rule, e.g., "required" to {required:true}
- normalizeRule: function(data) {
- if( typeof data == "string" ) {
- var transformed = {};
- $.each(data.split(/\s/), function() {
- transformed[this] = true;
- });
- data = transformed;
- }
- return data;
- },
-
- // http://docs.jquery.com/Plugins/Validation/Validator/addMethod
- addMethod: function(name, method, message) {
- $.validator.methods[name] = method;
- $.validator.messages[name] = message;
- if (method.length < 3) {
- $.validator.addClassRules(name, $.validator.normalizeRule(name));
- }
- },
-
- methods: {
-
- // http://docs.jquery.com/Plugins/Validation/Methods/required
- required: function(value, element, param) {
- // check if dependency is met
- if ( !this.depend(param, element) )
- return "dependency-mismatch";
- switch( element.nodeName.toLowerCase() ) {
- case 'select':
- var options = $("option:selected", element);
- return options.length > 0 && ( element.type == "select-multiple" || ($.browser.msie && !(options[0].attributes['value'].specified) ? options[0].text : options[0].value).length > 0);
- case 'input':
- if ( this.checkable(element) )
- return this.getLength(value, element) > 0;
- default:
- return $.trim(value).length > 0;
- }
- },
-
- // http://docs.jquery.com/Plugins/Validation/Methods/remote
- remote: function(value, element, param) {
- if ( this.optional(element) )
- return "dependency-mismatch";
-
- var previous = this.previousValue(element);
-
- if (!this.settings.messages[element.name] )
- this.settings.messages[element.name] = {};
- this.settings.messages[element.name].remote = typeof previous.message == "function" ? previous.message(value) : previous.message;
-
- param = typeof param == "string" && {url:param} || param;
-
- if ( previous.old !== value ) {
- previous.old = value;
- var validator = this;
- this.startRequest(element);
- var data = {};
- data[element.name] = value;
- $.ajax($.extend(true, {
- url: param,
- mode: "abort",
- port: "validate" + element.name,
- dataType: "json",
- data: data,
- success: function(response) {
- if ( response ) {
- var submitted = validator.formSubmitted;
- validator.prepareElement(element);
- validator.formSubmitted = submitted;
- validator.successList.push(element);
- validator.showErrors();
- } else {
- var errors = {};
- errors[element.name] = response || validator.defaultMessage( element, "remote" );
- validator.showErrors(errors);
- }
- previous.valid = response;
- validator.stopRequest(element, response);
- }
- }, param));
- return "pending";
- } else if( this.pending[element.name] ) {
- return "pending";
- }
- return previous.valid;
- },
-
- // http://docs.jquery.com/Plugins/Validation/Methods/minlength
- minlength: function(value, element, param) {
- return this.optional(element) || this.getLength($.trim(value), element) >= param;
- },
-
- // http://docs.jquery.com/Plugins/Validation/Methods/maxlength
- maxlength: function(value, element, param) {
- return this.optional(element) || this.getLength($.trim(value), element) <= param;
- },
-
- // http://docs.jquery.com/Plugins/Validation/Methods/rangelength
- rangelength: function(value, element, param) {
- var length = this.getLength($.trim(value), element);
- return this.optional(element) || ( length >= param[0] && length <= param[1] );
- },
-
- // http://docs.jquery.com/Plugins/Validation/Methods/min
- min: function( value, element, param ) {
- return this.optional(element) || value >= param;
- },
-
- // http://docs.jquery.com/Plugins/Validation/Methods/max
- max: function( value, element, param ) {
- return this.optional(element) || value <= param;
- },
-
- // http://docs.jquery.com/Plugins/Validation/Methods/range
- range: function( value, element, param ) {
- return this.optional(element) || ( value >= param[0] && value <= param[1] );
- },
-
- // http://docs.jquery.com/Plugins/Validation/Methods/email
- email: function(value, element) {
- // contributed by Scott Gonzalez: http://projects.scottsplayground.com/email_address_validation/
- return this.optional(element) || /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i.test(value);
- },
-
- // http://docs.jquery.com/Plugins/Validation/Methods/url
- url: function(value, element) {
- // contributed by Scott Gonzalez: http://projects.scottsplayground.com/iri/
- return this.optional(element) || /^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(value);
- },
-
- // http://docs.jquery.com/Plugins/Validation/Methods/date
- date: function(value, element) {
- //ES - Chrome does not use the locale when new Date objects instantiated:
- // http://geekswithblogs.net/EltonStoneman/archive/2009/10/29/jquery-date-validation-in-chrome.aspx
- //return this.optional(element) || !/Invalid|NaN/.test(new Date(value));
- var d = new Date();
- return this.optional(element) || !/Invalid|NaN/.test(new Date(d.toLocaleDateString(value)));
- },
- // http://docs.jquery.com/Plugins/Validation/Methods/dateISO
- dateISO: function(value, element) {
- return this.optional(element) || /^\d{4}[\/-]\d{1,2}[\/-]\d{1,2}$/.test(value);
- },
-
- // http://docs.jquery.com/Plugins/Validation/Methods/dateDE
- dateDE: function(value, element) {
- return this.optional(element) || /^\d\d?\.\d\d?\.\d\d\d?\d?$/.test(value);
- },
-
- // http://docs.jquery.com/Plugins/Validation/Methods/number
- number: function(value, element) {
- return this.optional(element) || /^-?(?:\d+|\d{1,3}(?:,\d{3})+)(?:\.\d+)?$/.test(value);
- },
-
- // http://docs.jquery.com/Plugins/Validation/Methods/numberDE
- numberDE: function(value, element) {
- return this.optional(element) || /^-?(?:\d+|\d{1,3}(?:\.\d{3})+)(?:,\d+)?$/.test(value);
- },
-
- // http://docs.jquery.com/Plugins/Validation/Methods/digits
- digits: function(value, element) {
- return this.optional(element) || /^\d+$/.test(value);
- },
-
- // http://docs.jquery.com/Plugins/Validation/Methods/creditcard
- // based on http://en.wikipedia.org/wiki/Luhn
- creditcard: function(value, element) {
- if ( this.optional(element) )
- return "dependency-mismatch";
- // accept only digits and dashes
- if (/[^0-9-]+/.test(value))
- return false;
- var nCheck = 0,
- nDigit = 0,
- bEven = false;
-
- value = value.replace(/\D/g, "");
-
- for (n = value.length - 1; n >= 0; n--) {
- var cDigit = value.charAt(n);
- var nDigit = parseInt(cDigit, 10);
- if (bEven) {
- if ((nDigit *= 2) > 9)
- nDigit -= 9;
- }
- nCheck += nDigit;
- bEven = !bEven;
- }
-
- return (nCheck % 10) == 0;
- },
-
- // http://docs.jquery.com/Plugins/Validation/Methods/accept
- accept: function(value, element, param) {
- param = typeof param == "string" ? param : "png|jpe?g|gif";
- return this.optional(element) || value.match(new RegExp(".(" + param + ")$", "i"));
- },
-
- // http://docs.jquery.com/Plugins/Validation/Methods/equalTo
- equalTo: function(value, element, param) {
- return value == $(param).val();
- }
-
- }
-
-});
-
-})(jQuery);
-
-// ajax mode: abort
-// usage: $.ajax({ mode: "abort"[, port: "uniqueport"]});
-// if mode:"abort" is used, the previous request on that port (port can be undefined) is aborted via XMLHttpRequest.abort()
-;(function($) {
- var ajax = $.ajax;
- var pendingRequests = {};
- $.ajax = function(settings) {
- // create settings for compatibility with ajaxSetup
- settings = $.extend(settings, $.extend({}, $.ajaxSettings, settings));
- var port = settings.port;
- if (settings.mode == "abort") {
- if ( pendingRequests[port] ) {
- pendingRequests[port].abort();
- }
- return (pendingRequests[port] = ajax.apply(this, arguments));
- }
- return ajax.apply(this, arguments);
- };
-})(jQuery);
-
-// provides cross-browser focusin and focusout events
-// IE has native support, in other browsers, use event caputuring (neither bubbles)
-
-// provides delegate(type: String, delegate: Selector, handler: Callback) plugin for easier event delegation
-// handler is only called when $(event.target).is(delegate), in the scope of the jquery-object for event.target
-
-// provides triggerEvent(type: String, target: Element) to trigger delegated events
-;(function($) {
- $.each({
- focus: 'focusin',
- blur: 'focusout'
- }, function( original, fix ){
- $.event.special[fix] = {
- setup:function() {
- if ( $.browser.msie ) return false;
- this.addEventListener( original, $.event.special[fix].handler, true );
- },
- teardown:function() {
- if ( $.browser.msie ) return false;
- this.removeEventListener( original,
- $.event.special[fix].handler, true );
- },
- handler: function(e) {
- arguments[0] = $.event.fix(e);
- arguments[0].type = fix;
- return $.event.handle.apply(this, arguments);
- }
- };
- });
- $.extend($.fn, {
- delegate: function(type, delegate, handler) {
- return this.bind(type, function(event) {
- var target = $(event.target);
- if (target.is(delegate)) {
- return handler.apply(target, arguments);
- }
- });
- },
- triggerEvent: function(type, target) {
- return this.triggerHandler(type, [$.event.fix({ type: type, target: target })]);
- }
- })
-})(jQuery);
diff --git a/vendor/assets/javascripts/mailchimp/jquery126.min.js b/vendor/assets/javascripts/mailchimp/jquery126.min.js
deleted file mode 100644
index 6289c9943..000000000
--- a/vendor/assets/javascripts/mailchimp/jquery126.min.js
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * jQuery 1.2.6 - New Wave Javascript
- *
- * Copyright (c) 2008 John Resig (jquery.com)
- * Dual licensed under the MIT (MIT-LICENSE.txt)
- * and GPL (GPL-LICENSE.txt) licenses.
- *
- * $Date: 2008/05/26 $
- * $Rev: 5685 $
- */
-(function(){var _jQuery=window.jQuery,_$=window.$;var jQuery=window.jQuery=window.$=function(selector,context){return new jQuery.fn.init(selector,context);};var quickExpr=/^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/,isSimple=/^.[^:#\[\.]*$/,undefined;jQuery.fn=jQuery.prototype={init:function(selector,context){selector=selector||document;if(selector.nodeType){this[0]=selector;this.length=1;return this;}if(typeof selector=="string"){var match=quickExpr.exec(selector);if(match&&(match[1]||!context)){if(match[1])selector=jQuery.clean([match[1]],context);else{var elem=document.getElementById(match[3]);if(elem){if(elem.id!=match[3])return jQuery().find(selector);return jQuery(elem);}selector=[];}}else
-return jQuery(context).find(selector);}else if(jQuery.isFunction(selector))return jQuery(document)[jQuery.fn.ready?"ready":"load"](selector);return this.setArray(jQuery.makeArray(selector));},jquery:"1.2.6",size:function(){return this.length;},length:0,get:function(num){return num==undefined?jQuery.makeArray(this):this[num];},pushStack:function(elems){var ret=jQuery(elems);ret.prevObject=this;return ret;},setArray:function(elems){this.length=0;Array.prototype.push.apply(this,elems);return this;},each:function(callback,args){return jQuery.each(this,callback,args);},index:function(elem){var ret=-1;return jQuery.inArray(elem&&elem.jquery?elem[0]:elem,this);},attr:function(name,value,type){var options=name;if(name.constructor==String)if(value===undefined)return this[0]&&jQuery[type||"attr"](this[0],name);else{options={};options[name]=value;}return this.each(function(i){for(name in options)jQuery.attr(type?this.style:this,name,jQuery.prop(this,options[name],type,i,name));});},css:function(key,value){if((key=='width'||key=='height')&&parseFloat(value)<0)value=undefined;return this.attr(key,value,"curCSS");},text:function(text){if(typeof text!="object"&&text!=null)return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(text));var ret="";jQuery.each(text||this,function(){jQuery.each(this.childNodes,function(){if(this.nodeType!=8)ret+=this.nodeType!=1?this.nodeValue:jQuery.fn.text([this]);});});return ret;},wrapAll:function(html){if(this[0])jQuery(html,this[0].ownerDocument).clone().insertBefore(this[0]).map(function(){var elem=this;while(elem.firstChild)elem=elem.firstChild;return elem;}).append(this);return this;},wrapInner:function(html){return this.each(function(){jQuery(this).contents().wrapAll(html);});},wrap:function(html){return this.each(function(){jQuery(this).wrapAll(html);});},append:function(){return this.domManip(arguments,true,false,function(elem){if(this.nodeType==1)this.appendChild(elem);});},prepend:function(){return this.domManip(arguments,true,true,function(elem){if(this.nodeType==1)this.insertBefore(elem,this.firstChild);});},before:function(){return this.domManip(arguments,false,false,function(elem){this.parentNode.insertBefore(elem,this);});},after:function(){return this.domManip(arguments,false,true,function(elem){this.parentNode.insertBefore(elem,this.nextSibling);});},end:function(){return this.prevObject||jQuery([]);},find:function(selector){var elems=jQuery.map(this,function(elem){return jQuery.find(selector,elem);});return this.pushStack(/[^+>] [^+>]/.test(selector)||selector.indexOf("..")>-1?jQuery.unique(elems):elems);},clone:function(events){var ret=this.map(function(){if(jQuery.browser.msie&&!jQuery.isXMLDoc(this)){var clone=this.cloneNode(true),container=document.createElement("div");container.appendChild(clone);return jQuery.clean([container.innerHTML])[0];}else
-return this.cloneNode(true);});var clone=ret.find("*").andSelf().each(function(){if(this[expando]!=undefined)this[expando]=null;});if(events===true)this.find("*").andSelf().each(function(i){if(this.nodeType==3)return;var events=jQuery.data(this,"events");for(var type in events)for(var handler in events[type])jQuery.event.add(clone[i],type,events[type][handler],events[type][handler].data);});return ret;},filter:function(selector){return this.pushStack(jQuery.isFunction(selector)&&jQuery.grep(this,function(elem,i){return selector.call(elem,i);})||jQuery.multiFilter(selector,this));},not:function(selector){if(selector.constructor==String)if(isSimple.test(selector))return this.pushStack(jQuery.multiFilter(selector,this,true));else
-selector=jQuery.multiFilter(selector,this);var isArrayLike=selector.length&&selector[selector.length-1]!==undefined&&!selector.nodeType;return this.filter(function(){return isArrayLike?jQuery.inArray(this,selector)<0:this!=selector;});},add:function(selector){return this.pushStack(jQuery.unique(jQuery.merge(this.get(),typeof selector=='string'?jQuery(selector):jQuery.makeArray(selector))));},is:function(selector){return!!selector&&jQuery.multiFilter(selector,this).length>0;},hasClass:function(selector){return this.is("."+selector);},val:function(value){if(value==undefined){if(this.length){var elem=this[0];if(jQuery.nodeName(elem,"select")){var index=elem.selectedIndex,values=[],options=elem.options,one=elem.type=="select-one";if(index<0)return null;for(var i=one?index:0,max=one?index+1:options.length;i<max;i++){var option=options[i];if(option.selected){value=jQuery.browser.msie&&!option.attributes.value.specified?option.text:option.value;if(one)return value;values.push(value);}}return values;}else
-return(this[0].value||"").replace(/\r/g,"");}return undefined;}if(value.constructor==Number)value+='';return this.each(function(){if(this.nodeType!=1)return;if(value.constructor==Array&&/radio|checkbox/.test(this.type))this.checked=(jQuery.inArray(this.value,value)>=0||jQuery.inArray(this.name,value)>=0);else if(jQuery.nodeName(this,"select")){var values=jQuery.makeArray(value);jQuery("option",this).each(function(){this.selected=(jQuery.inArray(this.value,values)>=0||jQuery.inArray(this.text,values)>=0);});if(!values.length)this.selectedIndex=-1;}else
-this.value=value;});},html:function(value){return value==undefined?(this[0]?this[0].innerHTML:null):this.empty().append(value);},replaceWith:function(value){return this.after(value).remove();},eq:function(i){return this.slice(i,i+1);},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments));},map:function(callback){return this.pushStack(jQuery.map(this,function(elem,i){return callback.call(elem,i,elem);}));},andSelf:function(){return this.add(this.prevObject);},data:function(key,value){var parts=key.split(".");parts[1]=parts[1]?"."+parts[1]:"";if(value===undefined){var data=this.triggerHandler("getData"+parts[1]+"!",[parts[0]]);if(data===undefined&&this.length)data=jQuery.data(this[0],key);return data===undefined&&parts[1]?this.data(parts[0]):data;}else
-return this.trigger("setData"+parts[1]+"!",[parts[0],value]).each(function(){jQuery.data(this,key,value);});},removeData:function(key){return this.each(function(){jQuery.removeData(this,key);});},domManip:function(args,table,reverse,callback){var clone=this.length>1,elems;return this.each(function(){if(!elems){elems=jQuery.clean(args,this.ownerDocument);if(reverse)elems.reverse();}var obj=this;if(table&&jQuery.nodeName(this,"table")&&jQuery.nodeName(elems[0],"tr"))obj=this.getElementsByTagName("tbody")[0]||this.appendChild(this.ownerDocument.createElement("tbody"));var scripts=jQuery([]);jQuery.each(elems,function(){var elem=clone?jQuery(this).clone(true)[0]:this;if(jQuery.nodeName(elem,"script"))scripts=scripts.add(elem);else{if(elem.nodeType==1)scripts=scripts.add(jQuery("script",elem).remove());callback.call(obj,elem);}});scripts.each(evalScript);});}};jQuery.fn.init.prototype=jQuery.fn;function evalScript(i,elem){if(elem.src)jQuery.ajax({url:elem.src,async:false,dataType:"script"});else
-jQuery.globalEval(elem.text||elem.textContent||elem.innerHTML||"");if(elem.parentNode)elem.parentNode.removeChild(elem);}function now(){return+new Date;}jQuery.extend=jQuery.fn.extend=function(){var target=arguments[0]||{},i=1,length=arguments.length,deep=false,options;if(target.constructor==Boolean){deep=target;target=arguments[1]||{};i=2;}if(typeof target!="object"&&typeof target!="function")target={};if(length==i){target=this;--i;}for(;i<length;i++)if((options=arguments[i])!=null)for(var name in options){var src=target[name],copy=options[name];if(target===copy)continue;if(deep&&copy&&typeof copy=="object"&&!copy.nodeType)target[name]=jQuery.extend(deep,src||(copy.length!=null?[]:{}),copy);else if(copy!==undefined)target[name]=copy;}return target;};var expando="jQuery"+now(),uuid=0,windowData={},exclude=/z-?index|font-?weight|opacity|zoom|line-?height/i,defaultView=document.defaultView||{};jQuery.extend({noConflict:function(deep){window.$=_$;if(deep)window.jQuery=_jQuery;return jQuery;},isFunction:function(fn){return!!fn&&typeof fn!="string"&&!fn.nodeName&&fn.constructor!=Array&&/^[\s[]?function/.test(fn+"");},isXMLDoc:function(elem){return elem.documentElement&&!elem.body||elem.tagName&&elem.ownerDocument&&!elem.ownerDocument.body;},globalEval:function(data){data=jQuery.trim(data);if(data){var head=document.getElementsByTagName("head")[0]||document.documentElement,script=document.createElement("script");script.type="text/javascript";if(jQuery.browser.msie)script.text=data;else
-script.appendChild(document.createTextNode(data));head.insertBefore(script,head.firstChild);head.removeChild(script);}},nodeName:function(elem,name){return elem.nodeName&&elem.nodeName.toUpperCase()==name.toUpperCase();},cache:{},data:function(elem,name,data){elem=elem==window?windowData:elem;var id=elem[expando];if(!id)id=elem[expando]=++uuid;if(name&&!jQuery.cache[id])jQuery.cache[id]={};if(data!==undefined)jQuery.cache[id][name]=data;return name?jQuery.cache[id][name]:id;},removeData:function(elem,name){elem=elem==window?windowData:elem;var id=elem[expando];if(name){if(jQuery.cache[id]){delete jQuery.cache[id][name];name="";for(name in jQuery.cache[id])break;if(!name)jQuery.removeData(elem);}}else{try{delete elem[expando];}catch(e){if(elem.removeAttribute)elem.removeAttribute(expando);}delete jQuery.cache[id];}},each:function(object,callback,args){var name,i=0,length=object.length;if(args){if(length==undefined){for(name in object)if(callback.apply(object[name],args)===false)break;}else
-for(;i<length;)if(callback.apply(object[i++],args)===false)break;}else{if(length==undefined){for(name in object)if(callback.call(object[name],name,object[name])===false)break;}else
-for(var value=object[0];i<length&&callback.call(value,i,value)!==false;value=object[++i]){}}return object;},prop:function(elem,value,type,i,name){if(jQuery.isFunction(value))value=value.call(elem,i);return value&&value.constructor==Number&&type=="curCSS"&&!exclude.test(name)?value+"px":value;},className:{add:function(elem,classNames){jQuery.each((classNames||"").split(/\s+/),function(i,className){if(elem.nodeType==1&&!jQuery.className.has(elem.className,className))elem.className+=(elem.className?" ":"")+className;});},remove:function(elem,classNames){if(elem.nodeType==1)elem.className=classNames!=undefined?jQuery.grep(elem.className.split(/\s+/),function(className){return!jQuery.className.has(classNames,className);}).join(" "):"";},has:function(elem,className){return jQuery.inArray(className,(elem.className||elem).toString().split(/\s+/))>-1;}},swap:function(elem,options,callback){var old={};for(var name in options){old[name]=elem.style[name];elem.style[name]=options[name];}callback.call(elem);for(var name in options)elem.style[name]=old[name];},css:function(elem,name,force){if(name=="width"||name=="height"){var val,props={position:"absolute",visibility:"hidden",display:"block"},which=name=="width"?["Left","Right"]:["Top","Bottom"];function getWH(){val=name=="width"?elem.offsetWidth:elem.offsetHeight;var padding=0,border=0;jQuery.each(which,function(){padding+=parseFloat(jQuery.curCSS(elem,"padding"+this,true))||0;border+=parseFloat(jQuery.curCSS(elem,"border"+this+"Width",true))||0;});val-=Math.round(padding+border);}if(jQuery(elem).is(":visible"))getWH();else
-jQuery.swap(elem,props,getWH);return Math.max(0,val);}return jQuery.curCSS(elem,name,force);},curCSS:function(elem,name,force){var ret,style=elem.style;function color(elem){if(!jQuery.browser.safari)return false;var ret=defaultView.getComputedStyle(elem,null);return!ret||ret.getPropertyValue("color")=="";}if(name=="opacity"&&jQuery.browser.msie){ret=jQuery.attr(style,"opacity");return ret==""?"1":ret;}if(jQuery.browser.opera&&name=="display"){var save=style.outline;style.outline="0 solid black";style.outline=save;}if(name.match(/float/i))name=styleFloat;if(!force&&style&&style[name])ret=style[name];else if(defaultView.getComputedStyle){if(name.match(/float/i))name="float";name=name.replace(/([A-Z])/g,"-$1").toLowerCase();var computedStyle=defaultView.getComputedStyle(elem,null);if(computedStyle&&!color(elem))ret=computedStyle.getPropertyValue(name);else{var swap=[],stack=[],a=elem,i=0;for(;a&&color(a);a=a.parentNode)stack.unshift(a);for(;i<stack.length;i++)if(color(stack[i])){swap[i]=stack[i].style.display;stack[i].style.display="block";}ret=name=="display"&&swap[stack.length-1]!=null?"none":(computedStyle&&computedStyle.getPropertyValue(name))||"";for(i=0;i<swap.length;i++)if(swap[i]!=null)stack[i].style.display=swap[i];}if(name=="opacity"&&ret=="")ret="1";}else if(elem.currentStyle){var camelCase=name.replace(/\-(\w)/g,function(all,letter){return letter.toUpperCase();});ret=elem.currentStyle[name]||elem.currentStyle[camelCase];if(!/^\d+(px)?$/i.test(ret)&&/^\d/.test(ret)){var left=style.left,rsLeft=elem.runtimeStyle.left;elem.runtimeStyle.left=elem.currentStyle.left;style.left=ret||0;ret=style.pixelLeft+"px";style.left=left;elem.runtimeStyle.left=rsLeft;}}return ret;},clean:function(elems,context){var ret=[];context=context||document;if(typeof context.createElement=='undefined')context=context.ownerDocument||context[0]&&context[0].ownerDocument||document;jQuery.each(elems,function(i,elem){if(!elem)return;if(elem.constructor==Number)elem+='';if(typeof elem=="string"){elem=elem.replace(/(<(\w+)[^>]*?)\/>/g,function(all,front,tag){return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?all:front+"></"+tag+">";});var tags=jQuery.trim(elem).toLowerCase(),div=context.createElement("div");var wrap=!tags.indexOf("<opt")&&[1,"<select multiple='multiple'>","</select>"]||!tags.indexOf("<leg")&&[1,"<fieldset>","</fieldset>"]||tags.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"<table>","</table>"]||!tags.indexOf("<tr")&&[2,"<table><tbody>","</tbody></table>"]||(!tags.indexOf("<td")||!tags.indexOf("<th"))&&[3,"<table><tbody><tr>","</tr></tbody></table>"]||!tags.indexOf("<col")&&[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"]||jQuery.browser.msie&&[1,"div<div>","</div>"]||[0,"",""];div.innerHTML=wrap[1]+elem+wrap[2];while(wrap[0]--)div=div.lastChild;if(jQuery.browser.msie){var tbody=!tags.indexOf("<table")&&tags.indexOf("<tbody")<0?div.firstChild&&div.firstChild.childNodes:wrap[1]=="<table>"&&tags.indexOf("<tbody")<0?div.childNodes:[];for(var j=tbody.length-1;j>=0;--j)if(jQuery.nodeName(tbody[j],"tbody")&&!tbody[j].childNodes.length)tbody[j].parentNode.removeChild(tbody[j]);if(/^\s/.test(elem))div.insertBefore(context.createTextNode(elem.match(/^\s*/)[0]),div.firstChild);}elem=jQuery.makeArray(div.childNodes);}if(elem.length===0&&(!jQuery.nodeName(elem,"form")&&!jQuery.nodeName(elem,"select")))return;if(elem[0]==undefined||jQuery.nodeName(elem,"form")||elem.options)ret.push(elem);else
-ret=jQuery.merge(ret,elem);});return ret;},attr:function(elem,name,value){if(!elem||elem.nodeType==3||elem.nodeType==8)return undefined;var notxml=!jQuery.isXMLDoc(elem),set=value!==undefined,msie=jQuery.browser.msie;name=notxml&&jQuery.props[name]||name;if(elem.tagName){var special=/href|src|style/.test(name);if(name=="selected"&&jQuery.browser.safari)elem.parentNode.selectedIndex;if(name in elem&&notxml&&!special){if(set){if(name=="type"&&jQuery.nodeName(elem,"input")&&elem.parentNode)throw"type property can't be changed";elem[name]=value;}if(jQuery.nodeName(elem,"form")&&elem.getAttributeNode(name))return elem.getAttributeNode(name).nodeValue;return elem[name];}if(msie&&notxml&&name=="style")return jQuery.attr(elem.style,"cssText",value);if(set)elem.setAttribute(name,""+value);var attr=msie&&notxml&&special?elem.getAttribute(name,2):elem.getAttribute(name);return attr===null?undefined:attr;}if(msie&&name=="opacity"){if(set){elem.zoom=1;elem.filter=(elem.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(value)+''=="NaN"?"":"alpha(opacity="+value*100+")");}return elem.filter&&elem.filter.indexOf("opacity=")>=0?(parseFloat(elem.filter.match(/opacity=([^)]*)/)[1])/100)+'':"";}name=name.replace(/-([a-z])/ig,function(all,letter){return letter.toUpperCase();});if(set)elem[name]=value;return elem[name];},trim:function(text){return(text||"").replace(/^\s+|\s+$/g,"");},makeArray:function(array){var ret=[];if(array!=null){var i=array.length;if(i==null||array.split||array.setInterval||array.call)ret[0]=array;else
-while(i)ret[--i]=array[i];}return ret;},inArray:function(elem,array){for(var i=0,length=array.length;i<length;i++)if(array[i]===elem)return i;return-1;},merge:function(first,second){var i=0,elem,pos=first.length;if(jQuery.browser.msie){while(elem=second[i++])if(elem.nodeType!=8)first[pos++]=elem;}else
-while(elem=second[i++])first[pos++]=elem;return first;},unique:function(array){var ret=[],done={};try{for(var i=0,length=array.length;i<length;i++){var id=jQuery.data(array[i]);if(!done[id]){done[id]=true;ret.push(array[i]);}}}catch(e){ret=array;}return ret;},grep:function(elems,callback,inv){var ret=[];for(var i=0,length=elems.length;i<length;i++)if(!inv!=!callback(elems[i],i))ret.push(elems[i]);return ret;},map:function(elems,callback){var ret=[];for(var i=0,length=elems.length;i<length;i++){var value=callback(elems[i],i);if(value!=null)ret[ret.length]=value;}return ret.concat.apply([],ret);}});var userAgent=navigator.userAgent.toLowerCase();jQuery.browser={version:(userAgent.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[])[1],safari:/webkit/.test(userAgent),opera:/opera/.test(userAgent),msie:/msie/.test(userAgent)&&!/opera/.test(userAgent),mozilla:/mozilla/.test(userAgent)&&!/(compatible|webkit)/.test(userAgent)};var styleFloat=jQuery.browser.msie?"styleFloat":"cssFloat";jQuery.extend({boxModel:!jQuery.browser.msie||document.compatMode=="CSS1Compat",props:{"for":"htmlFor","class":"className","float":styleFloat,cssFloat:styleFloat,styleFloat:styleFloat,readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing"}});jQuery.each({parent:function(elem){return elem.parentNode;},parents:function(elem){return jQuery.dir(elem,"parentNode");},next:function(elem){return jQuery.nth(elem,2,"nextSibling");},prev:function(elem){return jQuery.nth(elem,2,"previousSibling");},nextAll:function(elem){return jQuery.dir(elem,"nextSibling");},prevAll:function(elem){return jQuery.dir(elem,"previousSibling");},siblings:function(elem){return jQuery.sibling(elem.parentNode.firstChild,elem);},children:function(elem){return jQuery.sibling(elem.firstChild);},contents:function(elem){return jQuery.nodeName(elem,"iframe")?elem.contentDocument||elem.contentWindow.document:jQuery.makeArray(elem.childNodes);}},function(name,fn){jQuery.fn[name]=function(selector){var ret=jQuery.map(this,fn);if(selector&&typeof selector=="string")ret=jQuery.multiFilter(selector,ret);return this.pushStack(jQuery.unique(ret));};});jQuery.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(name,original){jQuery.fn[name]=function(){var args=arguments;return this.each(function(){for(var i=0,length=args.length;i<length;i++)jQuery(args[i])[original](this);});};});jQuery.each({removeAttr:function(name){jQuery.attr(this,name,"");if(this.nodeType==1)this.removeAttribute(name);},addClass:function(classNames){jQuery.className.add(this,classNames);},removeClass:function(classNames){jQuery.className.remove(this,classNames);},toggleClass:function(classNames){jQuery.className[jQuery.className.has(this,classNames)?"remove":"add"](this,classNames);},remove:function(selector){if(!selector||jQuery.filter(selector,[this]).r.length){jQuery("*",this).add(this).each(function(){jQuery.event.remove(this);jQuery.removeData(this);});if(this.parentNode)this.parentNode.removeChild(this);}},empty:function(){jQuery(">*",this).remove();while(this.firstChild)this.removeChild(this.firstChild);}},function(name,fn){jQuery.fn[name]=function(){return this.each(fn,arguments);};});jQuery.each(["Height","Width"],function(i,name){var type=name.toLowerCase();jQuery.fn[type]=function(size){return this[0]==window?jQuery.browser.opera&&document.body["client"+name]||jQuery.browser.safari&&window["inner"+name]||document.compatMode=="CSS1Compat"&&document.documentElement["client"+name]||document.body["client"+name]:this[0]==document?Math.max(Math.max(document.body["scroll"+name],document.documentElement["scroll"+name]),Math.max(document.body["offset"+name],document.documentElement["offset"+name])):size==undefined?(this.length?jQuery.css(this[0],type):null):this.css(type,size.constructor==String?size:size+"px");};});function num(elem,prop){return elem[0]&&parseInt(jQuery.curCSS(elem[0],prop,true),10)||0;}var chars=jQuery.browser.safari&&parseInt(jQuery.browser.version)<417?"(?:[\\w*_-]|\\\\.)":"(?:[\\w\u0128-\uFFFF*_-]|\\\\.)",quickChild=new RegExp("^>\\s*("+chars+"+)"),quickID=new RegExp("^("+chars+"+)(#)("+chars+"+)"),quickClass=new RegExp("^([#.]?)("+chars+"*)");jQuery.extend({expr:{"":function(a,i,m){return m[2]=="*"||jQuery.nodeName(a,m[2]);},"#":function(a,i,m){return a.getAttribute("id")==m[2];},":":{lt:function(a,i,m){return i<m[3]-0;},gt:function(a,i,m){return i>m[3]-0;},nth:function(a,i,m){return m[3]-0==i;},eq:function(a,i,m){return m[3]-0==i;},first:function(a,i){return i==0;},last:function(a,i,m,r){return i==r.length-1;},even:function(a,i){return i%2==0;},odd:function(a,i){return i%2;},"first-child":function(a){return a.parentNode.getElementsByTagName("*")[0]==a;},"last-child":function(a){return jQuery.nth(a.parentNode.lastChild,1,"previousSibling")==a;},"only-child":function(a){return!jQuery.nth(a.parentNode.lastChild,2,"previousSibling");},parent:function(a){return a.firstChild;},empty:function(a){return!a.firstChild;},contains:function(a,i,m){return(a.textContent||a.innerText||jQuery(a).text()||"").indexOf(m[3])>=0;},visible:function(a){return"hidden"!=a.type&&jQuery.css(a,"display")!="none"&&jQuery.css(a,"visibility")!="hidden";},hidden:function(a){return"hidden"==a.type||jQuery.css(a,"display")=="none"||jQuery.css(a,"visibility")=="hidden";},enabled:function(a){return!a.disabled;},disabled:function(a){return a.disabled;},checked:function(a){return a.checked;},selected:function(a){return a.selected||jQuery.attr(a,"selected");},text:function(a){return"text"==a.type;},radio:function(a){return"radio"==a.type;},checkbox:function(a){return"checkbox"==a.type;},file:function(a){return"file"==a.type;},password:function(a){return"password"==a.type;},submit:function(a){return"submit"==a.type;},image:function(a){return"image"==a.type;},reset:function(a){return"reset"==a.type;},button:function(a){return"button"==a.type||jQuery.nodeName(a,"button");},input:function(a){return/input|select|textarea|button/i.test(a.nodeName);},has:function(a,i,m){return jQuery.find(m[3],a).length;},header:function(a){return/h\d/i.test(a.nodeName);},animated:function(a){return jQuery.grep(jQuery.timers,function(fn){return a==fn.elem;}).length;}}},parse:[/^(\[) *@?([\w-]+) *([!*$^~=]*) *('?"?)(.*?)\4 *\]/,/^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/,new RegExp("^([:.#]*)("+chars+"+)")],multiFilter:function(expr,elems,not){var old,cur=[];while(expr&&expr!=old){old=expr;var f=jQuery.filter(expr,elems,not);expr=f.t.replace(/^\s*,\s*/,"");cur=not?elems=f.r:jQuery.merge(cur,f.r);}return cur;},find:function(t,context){if(typeof t!="string")return[t];if(context&&context.nodeType!=1&&context.nodeType!=9)return[];context=context||document;var ret=[context],done=[],last,nodeName;while(t&&last!=t){var r=[];last=t;t=jQuery.trim(t);var foundToken=false,re=quickChild,m=re.exec(t);if(m){nodeName=m[1].toUpperCase();for(var i=0;ret[i];i++)for(var c=ret[i].firstChild;c;c=c.nextSibling)if(c.nodeType==1&&(nodeName=="*"||c.nodeName.toUpperCase()==nodeName))r.push(c);ret=r;t=t.replace(re,"");if(t.indexOf(" ")==0)continue;foundToken=true;}else{re=/^([>+~])\s*(\w*)/i;if((m=re.exec(t))!=null){r=[];var merge={};nodeName=m[2].toUpperCase();m=m[1];for(var j=0,rl=ret.length;j<rl;j++){var n=m=="~"||m=="+"?ret[j].nextSibling:ret[j].firstChild;for(;n;n=n.nextSibling)if(n.nodeType==1){var id=jQuery.data(n);if(m=="~"&&merge[id])break;if(!nodeName||n.nodeName.toUpperCase()==nodeName){if(m=="~")merge[id]=true;r.push(n);}if(m=="+")break;}}ret=r;t=jQuery.trim(t.replace(re,""));foundToken=true;}}if(t&&!foundToken){if(!t.indexOf(",")){if(context==ret[0])ret.shift();done=jQuery.merge(done,ret);r=ret=[context];t=" "+t.substr(1,t.length);}else{var re2=quickID;var m=re2.exec(t);if(m){m=[0,m[2],m[3],m[1]];}else{re2=quickClass;m=re2.exec(t);}m[2]=m[2].replace(/\\/g,"");var elem=ret[ret.length-1];if(m[1]=="#"&&elem&&elem.getElementById&&!jQuery.isXMLDoc(elem)){var oid=elem.getElementById(m[2]);if((jQuery.browser.msie||jQuery.browser.opera)&&oid&&typeof oid.id=="string"&&oid.id!=m[2])oid=jQuery('[@id="'+m[2]+'"]',elem)[0];ret=r=oid&&(!m[3]||jQuery.nodeName(oid,m[3]))?[oid]:[];}else{for(var i=0;ret[i];i++){var tag=m[1]=="#"&&m[3]?m[3]:m[1]!=""||m[0]==""?"*":m[2];if(tag=="*"&&ret[i].nodeName.toLowerCase()=="object")tag="param";r=jQuery.merge(r,ret[i].getElementsByTagName(tag));}if(m[1]==".")r=jQuery.classFilter(r,m[2]);if(m[1]=="#"){var tmp=[];for(var i=0;r[i];i++)if(r[i].getAttribute("id")==m[2]){tmp=[r[i]];break;}r=tmp;}ret=r;}t=t.replace(re2,"");}}if(t){var val=jQuery.filter(t,r);ret=r=val.r;t=jQuery.trim(val.t);}}if(t)ret=[];if(ret&&context==ret[0])ret.shift();done=jQuery.merge(done,ret);return done;},classFilter:function(r,m,not){m=" "+m+" ";var tmp=[];for(var i=0;r[i];i++){var pass=(" "+r[i].className+" ").indexOf(m)>=0;if(!not&&pass||not&&!pass)tmp.push(r[i]);}return tmp;},filter:function(t,r,not){var last;while(t&&t!=last){last=t;var p=jQuery.parse,m;for(var i=0;p[i];i++){m=p[i].exec(t);if(m){t=t.substring(m[0].length);m[2]=m[2].replace(/\\/g,"");break;}}if(!m)break;if(m[1]==":"&&m[2]=="not")r=isSimple.test(m[3])?jQuery.filter(m[3],r,true).r:jQuery(r).not(m[3]);else if(m[1]==".")r=jQuery.classFilter(r,m[2],not);else if(m[1]=="["){var tmp=[],type=m[3];for(var i=0,rl=r.length;i<rl;i++){var a=r[i],z=a[jQuery.props[m[2]]||m[2]];if(z==null||/href|src|selected/.test(m[2]))z=jQuery.attr(a,m[2])||'';if((type==""&&!!z||type=="="&&z==m[5]||type=="!="&&z!=m[5]||type=="^="&&z&&!z.indexOf(m[5])||type=="$="&&z.substr(z.length-m[5].length)==m[5]||(type=="*="||type=="~=")&&z.indexOf(m[5])>=0)^not)tmp.push(a);}r=tmp;}else if(m[1]==":"&&m[2]=="nth-child"){var merge={},tmp=[],test=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(m[3]=="even"&&"2n"||m[3]=="odd"&&"2n+1"||!/\D/.test(m[3])&&"0n+"+m[3]||m[3]),first=(test[1]+(test[2]||1))-0,last=test[3]-0;for(var i=0,rl=r.length;i<rl;i++){var node=r[i],parentNode=node.parentNode,id=jQuery.data(parentNode);if(!merge[id]){var c=1;for(var n=parentNode.firstChild;n;n=n.nextSibling)if(n.nodeType==1)n.nodeIndex=c++;merge[id]=true;}var add=false;if(first==0){if(node.nodeIndex==last)add=true;}else if((node.nodeIndex-last)%first==0&&(node.nodeIndex-last)/first>=0)add=true;if(add^not)tmp.push(node);}r=tmp;}else{var fn=jQuery.expr[m[1]];if(typeof fn=="object")fn=fn[m[2]];if(typeof fn=="string")fn=eval("false||function(a,i){return "+fn+";}");r=jQuery.grep(r,function(elem,i){return fn(elem,i,m,r);},not);}}return{r:r,t:t};},dir:function(elem,dir){var matched=[],cur=elem[dir];while(cur&&cur!=document){if(cur.nodeType==1)matched.push(cur);cur=cur[dir];}return matched;},nth:function(cur,result,dir,elem){result=result||1;var num=0;for(;cur;cur=cur[dir])if(cur.nodeType==1&&++num==result)break;return cur;},sibling:function(n,elem){var r=[];for(;n;n=n.nextSibling){if(n.nodeType==1&&n!=elem)r.push(n);}return r;}});jQuery.event={add:function(elem,types,handler,data){if(elem.nodeType==3||elem.nodeType==8)return;if(jQuery.browser.msie&&elem.setInterval)elem=window;if(!handler.guid)handler.guid=this.guid++;if(data!=undefined){var fn=handler;handler=this.proxy(fn,function(){return fn.apply(this,arguments);});handler.data=data;}var events=jQuery.data(elem,"events")||jQuery.data(elem,"events",{}),handle=jQuery.data(elem,"handle")||jQuery.data(elem,"handle",function(){if(typeof jQuery!="undefined"&&!jQuery.event.triggered)return jQuery.event.handle.apply(arguments.callee.elem,arguments);});handle.elem=elem;jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];handler.type=parts[1];var handlers=events[type];if(!handlers){handlers=events[type]={};if(!jQuery.event.special[type]||jQuery.event.special[type].setup.call(elem)===false){if(elem.addEventListener)elem.addEventListener(type,handle,false);else if(elem.attachEvent)elem.attachEvent("on"+type,handle);}}handlers[handler.guid]=handler;jQuery.event.global[type]=true;});elem=null;},guid:1,global:{},remove:function(elem,types,handler){if(elem.nodeType==3||elem.nodeType==8)return;var events=jQuery.data(elem,"events"),ret,index;if(events){if(types==undefined||(typeof types=="string"&&types.charAt(0)=="."))for(var type in events)this.remove(elem,type+(types||""));else{if(types.type){handler=types.handler;types=types.type;}jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];if(events[type]){if(handler)delete events[type][handler.guid];else
-for(handler in events[type])if(!parts[1]||events[type][handler].type==parts[1])delete events[type][handler];for(ret in events[type])break;if(!ret){if(!jQuery.event.special[type]||jQuery.event.special[type].teardown.call(elem)===false){if(elem.removeEventListener)elem.removeEventListener(type,jQuery.data(elem,"handle"),false);else if(elem.detachEvent)elem.detachEvent("on"+type,jQuery.data(elem,"handle"));}ret=null;delete events[type];}}});}for(ret in events)break;if(!ret){var handle=jQuery.data(elem,"handle");if(handle)handle.elem=null;jQuery.removeData(elem,"events");jQuery.removeData(elem,"handle");}}},trigger:function(type,data,elem,donative,extra){data=jQuery.makeArray(data);if(type.indexOf("!")>=0){type=type.slice(0,-1);var exclusive=true;}if(!elem){if(this.global[type])jQuery("*").add([window,document]).trigger(type,data);}else{if(elem.nodeType==3||elem.nodeType==8)return undefined;var val,ret,fn=jQuery.isFunction(elem[type]||null),event=!data[0]||!data[0].preventDefault;if(event){data.unshift({type:type,target:elem,preventDefault:function(){},stopPropagation:function(){},timeStamp:now()});data[0][expando]=true;}data[0].type=type;if(exclusive)data[0].exclusive=true;var handle=jQuery.data(elem,"handle");if(handle)val=handle.apply(elem,data);if((!fn||(jQuery.nodeName(elem,'a')&&type=="click"))&&elem["on"+type]&&elem["on"+type].apply(elem,data)===false)val=false;if(event)data.shift();if(extra&&jQuery.isFunction(extra)){ret=extra.apply(elem,val==null?data:data.concat(val));if(ret!==undefined)val=ret;}if(fn&&donative!==false&&val!==false&&!(jQuery.nodeName(elem,'a')&&type=="click")){this.triggered=true;try{elem[type]();}catch(e){}}this.triggered=false;}return val;},handle:function(event){var val,ret,namespace,all,handlers;event=arguments[0]=jQuery.event.fix(event||window.event);namespace=event.type.split(".");event.type=namespace[0];namespace=namespace[1];all=!namespace&&!event.exclusive;handlers=(jQuery.data(this,"events")||{})[event.type];for(var j in handlers){var handler=handlers[j];if(all||handler.type==namespace){event.handler=handler;event.data=handler.data;ret=handler.apply(this,arguments);if(val!==false)val=ret;if(ret===false){event.preventDefault();event.stopPropagation();}}}return val;},fix:function(event){if(event[expando]==true)return event;var originalEvent=event;event={originalEvent:originalEvent};var props="altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target timeStamp toElement type view wheelDelta which".split(" ");for(var i=props.length;i;i--)event[props[i]]=originalEvent[props[i]];event[expando]=true;event.preventDefault=function(){if(originalEvent.preventDefault)originalEvent.preventDefault();originalEvent.returnValue=false;};event.stopPropagation=function(){if(originalEvent.stopPropagation)originalEvent.stopPropagation();originalEvent.cancelBubble=true;};event.timeStamp=event.timeStamp||now();if(!event.target)event.target=event.srcElement||document;if(event.target.nodeType==3)event.target=event.target.parentNode;if(!event.relatedTarget&&event.fromElement)event.relatedTarget=event.fromElement==event.target?event.toElement:event.fromElement;if(event.pageX==null&&event.clientX!=null){var doc=document.documentElement,body=document.body;event.pageX=event.clientX+(doc&&doc.scrollLeft||body&&body.scrollLeft||0)-(doc.clientLeft||0);event.pageY=event.clientY+(doc&&doc.scrollTop||body&&body.scrollTop||0)-(doc.clientTop||0);}if(!event.which&&((event.charCode||event.charCode===0)?event.charCode:event.keyCode))event.which=event.charCode||event.keyCode;if(!event.metaKey&&event.ctrlKey)event.metaKey=event.ctrlKey;if(!event.which&&event.button)event.which=(event.button&1?1:(event.button&2?3:(event.button&4?2:0)));return event;},proxy:function(fn,proxy){proxy.guid=fn.guid=fn.guid||proxy.guid||this.guid++;return proxy;},special:{ready:{setup:function(){bindReady();return;},teardown:function(){return;}},mouseenter:{setup:function(){if(jQuery.browser.msie)return false;jQuery(this).bind("mouseover",jQuery.event.special.mouseenter.handler);return true;},teardown:function(){if(jQuery.browser.msie)return false;jQuery(this).unbind("mouseover",jQuery.event.special.mouseenter.handler);return true;},handler:function(event){if(withinElement(event,this))return true;event.type="mouseenter";return jQuery.event.handle.apply(this,arguments);}},mouseleave:{setup:function(){if(jQuery.browser.msie)return false;jQuery(this).bind("mouseout",jQuery.event.special.mouseleave.handler);return true;},teardown:function(){if(jQuery.browser.msie)return false;jQuery(this).unbind("mouseout",jQuery.event.special.mouseleave.handler);return true;},handler:function(event){if(withinElement(event,this))return true;event.type="mouseleave";return jQuery.event.handle.apply(this,arguments);}}}};jQuery.fn.extend({bind:function(type,data,fn){return type=="unload"?this.one(type,data,fn):this.each(function(){jQuery.event.add(this,type,fn||data,fn&&data);});},one:function(type,data,fn){var one=jQuery.event.proxy(fn||data,function(event){jQuery(this).unbind(event,one);return(fn||data).apply(this,arguments);});return this.each(function(){jQuery.event.add(this,type,one,fn&&data);});},unbind:function(type,fn){return this.each(function(){jQuery.event.remove(this,type,fn);});},trigger:function(type,data,fn){return this.each(function(){jQuery.event.trigger(type,data,this,true,fn);});},triggerHandler:function(type,data,fn){return this[0]&&jQuery.event.trigger(type,data,this[0],false,fn);},toggle:function(fn){var args=arguments,i=1;while(i<args.length)jQuery.event.proxy(fn,args[i++]);return this.click(jQuery.event.proxy(fn,function(event){this.lastToggle=(this.lastToggle||0)%i;event.preventDefault();return args[this.lastToggle++].apply(this,arguments)||false;}));},hover:function(fnOver,fnOut){return this.bind('mouseenter',fnOver).bind('mouseleave',fnOut);},ready:function(fn){bindReady();if(jQuery.isReady)fn.call(document,jQuery);else
-jQuery.readyList.push(function(){return fn.call(this,jQuery);});return this;}});jQuery.extend({isReady:false,readyList:[],ready:function(){if(!jQuery.isReady){jQuery.isReady=true;if(jQuery.readyList){jQuery.each(jQuery.readyList,function(){this.call(document);});jQuery.readyList=null;}jQuery(document).triggerHandler("ready");}}});var readyBound=false;function bindReady(){if(readyBound)return;readyBound=true;if(document.addEventListener&&!jQuery.browser.opera)document.addEventListener("DOMContentLoaded",jQuery.ready,false);if(jQuery.browser.msie&&window==top)(function(){if(jQuery.isReady)return;try{document.documentElement.doScroll("left");}catch(error){setTimeout(arguments.callee,0);return;}jQuery.ready();})();if(jQuery.browser.opera)document.addEventListener("DOMContentLoaded",function(){if(jQuery.isReady)return;for(var i=0;i<document.styleSheets.length;i++)if(document.styleSheets[i].disabled){setTimeout(arguments.callee,0);return;}jQuery.ready();},false);if(jQuery.browser.safari){var numStyles;(function(){if(jQuery.isReady)return;if(document.readyState!="loaded"&&document.readyState!="complete"){setTimeout(arguments.callee,0);return;}if(numStyles===undefined)numStyles=jQuery("style, link[rel=stylesheet]").length;if(document.styleSheets.length!=numStyles){setTimeout(arguments.callee,0);return;}jQuery.ready();})();}jQuery.event.add(window,"load",jQuery.ready);}jQuery.each(("blur,focus,load,resize,scroll,unload,click,dblclick,"+"mousedown,mouseup,mousemove,mouseover,mouseout,change,select,"+"submit,keydown,keypress,keyup,error").split(","),function(i,name){jQuery.fn[name]=function(fn){return fn?this.bind(name,fn):this.trigger(name);};});var withinElement=function(event,elem){var parent=event.relatedTarget;while(parent&&parent!=elem)try{parent=parent.parentNode;}catch(error){parent=elem;}return parent==elem;};jQuery(window).bind("unload",function(){jQuery("*").add(document).unbind();});jQuery.fn.extend({_load:jQuery.fn.load,load:function(url,params,callback){if(typeof url!='string')return this._load(url);var off=url.indexOf(" ");if(off>=0){var selector=url.slice(off,url.length);url=url.slice(0,off);}callback=callback||function(){};var type="GET";if(params)if(jQuery.isFunction(params)){callback=params;params=null;}else{params=jQuery.param(params);type="POST";}var self=this;jQuery.ajax({url:url,type:type,dataType:"html",data:params,complete:function(res,status){if(status=="success"||status=="notmodified")self.html(selector?jQuery("<div/>").append(res.responseText.replace(/<script(.|\s)*?\/script>/g,"")).find(selector):res.responseText);self.each(callback,[res.responseText,status,res]);}});return this;},serialize:function(){return jQuery.param(this.serializeArray());},serializeArray:function(){return this.map(function(){return jQuery.nodeName(this,"form")?jQuery.makeArray(this.elements):this;}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password/i.test(this.type));}).map(function(i,elem){var val=jQuery(this).val();return val==null?null:val.constructor==Array?jQuery.map(val,function(val,i){return{name:elem.name,value:val};}):{name:elem.name,value:val};}).get();}});jQuery.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(i,o){jQuery.fn[o]=function(f){return this.bind(o,f);};});var jsc=now();jQuery.extend({get:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data=null;}return jQuery.ajax({type:"GET",url:url,data:data,success:callback,dataType:type});},getScript:function(url,callback){return jQuery.get(url,null,callback,"script");},getJSON:function(url,data,callback){return jQuery.get(url,data,callback,"json");},post:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data={};}return jQuery.ajax({type:"POST",url:url,data:data,success:callback,dataType:type});},ajaxSetup:function(settings){jQuery.extend(jQuery.ajaxSettings,settings);},ajaxSettings:{url:location.href,global:true,type:"GET",timeout:0,contentType:"application/x-www-form-urlencoded",processData:true,async:true,data:null,username:null,password:null,accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(s){s=jQuery.extend(true,s,jQuery.extend(true,{},jQuery.ajaxSettings,s));var jsonp,jsre=/=\?(&|$)/g,status,data,type=s.type.toUpperCase();if(s.data&&s.processData&&typeof s.data!="string")s.data=jQuery.param(s.data);if(s.dataType=="jsonp"){if(type=="GET"){if(!s.url.match(jsre))s.url+=(s.url.match(/\?/)?"&":"?")+(s.jsonp||"callback")+"=?";}else if(!s.data||!s.data.match(jsre))s.data=(s.data?s.data+"&":"")+(s.jsonp||"callback")+"=?";s.dataType="json";}if(s.dataType=="json"&&(s.data&&s.data.match(jsre)||s.url.match(jsre))){jsonp="jsonp"+jsc++;if(s.data)s.data=(s.data+"").replace(jsre,"="+jsonp+"$1");s.url=s.url.replace(jsre,"="+jsonp+"$1");s.dataType="script";window[jsonp]=function(tmp){data=tmp;success();complete();window[jsonp]=undefined;try{delete window[jsonp];}catch(e){}if(head)head.removeChild(script);};}if(s.dataType=="script"&&s.cache==null)s.cache=false;if(s.cache===false&&type=="GET"){var ts=now();var ret=s.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+ts+"$2");s.url=ret+((ret==s.url)?(s.url.match(/\?/)?"&":"?")+"_="+ts:"");}if(s.data&&type=="GET"){s.url+=(s.url.match(/\?/)?"&":"?")+s.data;s.data=null;}if(s.global&&!jQuery.active++)jQuery.event.trigger("ajaxStart");var remote=/^(?:\w+:)?\/\/([^\/?#]+)/;if(s.dataType=="script"&&type=="GET"&&remote.test(s.url)&&remote.exec(s.url)[1]!=location.host){var head=document.getElementsByTagName("head")[0];var script=document.createElement("script");script.src=s.url;if(s.scriptCharset)script.charset=s.scriptCharset;if(!jsonp){var done=false;script.onload=script.onreadystatechange=function(){if(!done&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){done=true;success();complete();head.removeChild(script);}};}head.appendChild(script);return undefined;}var requestDone=false;var xhr=window.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest();if(s.username)xhr.open(type,s.url,s.async,s.username,s.password);else
-xhr.open(type,s.url,s.async);try{if(s.data)xhr.setRequestHeader("Content-Type",s.contentType);if(s.ifModified)xhr.setRequestHeader("If-Modified-Since",jQuery.lastModified[s.url]||"Thu, 01 Jan 1970 00:00:00 GMT");xhr.setRequestHeader("X-Requested-With","XMLHttpRequest");xhr.setRequestHeader("Accept",s.dataType&&s.accepts[s.dataType]?s.accepts[s.dataType]+", */*":s.accepts._default);}catch(e){}if(s.beforeSend&&s.beforeSend(xhr,s)===false){s.global&&jQuery.active--;xhr.abort();return false;}if(s.global)jQuery.event.trigger("ajaxSend",[xhr,s]);var onreadystatechange=function(isTimeout){if(!requestDone&&xhr&&(xhr.readyState==4||isTimeout=="timeout")){requestDone=true;if(ival){clearInterval(ival);ival=null;}status=isTimeout=="timeout"&&"timeout"||!jQuery.httpSuccess(xhr)&&"error"||s.ifModified&&jQuery.httpNotModified(xhr,s.url)&&"notmodified"||"success";if(status=="success"){try{data=jQuery.httpData(xhr,s.dataType,s.dataFilter);}catch(e){status="parsererror";}}if(status=="success"){var modRes;try{modRes=xhr.getResponseHeader("Last-Modified");}catch(e){}if(s.ifModified&&modRes)jQuery.lastModified[s.url]=modRes;if(!jsonp)success();}else
-jQuery.handleError(s,xhr,status);complete();if(s.async)xhr=null;}};if(s.async){var ival=setInterval(onreadystatechange,13);if(s.timeout>0)setTimeout(function(){if(xhr){xhr.abort();if(!requestDone)onreadystatechange("timeout");}},s.timeout);}try{xhr.send(s.data);}catch(e){jQuery.handleError(s,xhr,null,e);}if(!s.async)onreadystatechange();function success(){if(s.success)s.success(data,status);if(s.global)jQuery.event.trigger("ajaxSuccess",[xhr,s]);}function complete(){if(s.complete)s.complete(xhr,status);if(s.global)jQuery.event.trigger("ajaxComplete",[xhr,s]);if(s.global&&!--jQuery.active)jQuery.event.trigger("ajaxStop");}return xhr;},handleError:function(s,xhr,status,e){if(s.error)s.error(xhr,status,e);if(s.global)jQuery.event.trigger("ajaxError",[xhr,s,e]);},active:0,httpSuccess:function(xhr){try{return!xhr.status&&location.protocol=="file:"||(xhr.status>=200&&xhr.status<300)||xhr.status==304||xhr.status==1223||jQuery.browser.safari&&xhr.status==undefined;}catch(e){}return false;},httpNotModified:function(xhr,url){try{var xhrRes=xhr.getResponseHeader("Last-Modified");return xhr.status==304||xhrRes==jQuery.lastModified[url]||jQuery.browser.safari&&xhr.status==undefined;}catch(e){}return false;},httpData:function(xhr,type,filter){var ct=xhr.getResponseHeader("content-type"),xml=type=="xml"||!type&&ct&&ct.indexOf("xml")>=0,data=xml?xhr.responseXML:xhr.responseText;if(xml&&data.documentElement.tagName=="parsererror")throw"parsererror";if(filter)data=filter(data,type);if(type=="script")jQuery.globalEval(data);if(type=="json")data=eval("("+data+")");return data;},param:function(a){var s=[];if(a.constructor==Array||a.jquery)jQuery.each(a,function(){s.push(encodeURIComponent(this.name)+"="+encodeURIComponent(this.value));});else
-for(var j in a)if(a[j]&&a[j].constructor==Array)jQuery.each(a[j],function(){s.push(encodeURIComponent(j)+"="+encodeURIComponent(this));});else
-s.push(encodeURIComponent(j)+"="+encodeURIComponent(jQuery.isFunction(a[j])?a[j]():a[j]));return s.join("&").replace(/%20/g,"+");}});jQuery.fn.extend({show:function(speed,callback){return speed?this.animate({height:"show",width:"show",opacity:"show"},speed,callback):this.filter(":hidden").each(function(){this.style.display=this.oldblock||"";if(jQuery.css(this,"display")=="none"){var elem=jQuery("<"+this.tagName+" />").appendTo("body");this.style.display=elem.css("display");if(this.style.display=="none")this.style.display="block";elem.remove();}}).end();},hide:function(speed,callback){return speed?this.animate({height:"hide",width:"hide",opacity:"hide"},speed,callback):this.filter(":visible").each(function(){this.oldblock=this.oldblock||jQuery.css(this,"display");this.style.display="none";}).end();},_toggle:jQuery.fn.toggle,toggle:function(fn,fn2){return jQuery.isFunction(fn)&&jQuery.isFunction(fn2)?this._toggle.apply(this,arguments):fn?this.animate({height:"toggle",width:"toggle",opacity:"toggle"},fn,fn2):this.each(function(){jQuery(this)[jQuery(this).is(":hidden")?"show":"hide"]();});},slideDown:function(speed,callback){return this.animate({height:"show"},speed,callback);},slideUp:function(speed,callback){return this.animate({height:"hide"},speed,callback);},slideToggle:function(speed,callback){return this.animate({height:"toggle"},speed,callback);},fadeIn:function(speed,callback){return this.animate({opacity:"show"},speed,callback);},fadeOut:function(speed,callback){return this.animate({opacity:"hide"},speed,callback);},fadeTo:function(speed,to,callback){return this.animate({opacity:to},speed,callback);},animate:function(prop,speed,easing,callback){var optall=jQuery.speed(speed,easing,callback);return this[optall.queue===false?"each":"queue"](function(){if(this.nodeType!=1)return false;var opt=jQuery.extend({},optall),p,hidden=jQuery(this).is(":hidden"),self=this;for(p in prop){if(prop[p]=="hide"&&hidden||prop[p]=="show"&&!hidden)return opt.complete.call(this);if(p=="height"||p=="width"){opt.display=jQuery.css(this,"display");opt.overflow=this.style.overflow;}}if(opt.overflow!=null)this.style.overflow="hidden";opt.curAnim=jQuery.extend({},prop);jQuery.each(prop,function(name,val){var e=new jQuery.fx(self,opt,name);if(/toggle|show|hide/.test(val))e[val=="toggle"?hidden?"show":"hide":val](prop);else{var parts=val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),start=e.cur(true)||0;if(parts){var end=parseFloat(parts[2]),unit=parts[3]||"px";if(unit!="px"){self.style[name]=(end||1)+unit;start=((end||1)/e.cur(true))*start;self.style[name]=start+unit;}if(parts[1])end=((parts[1]=="-="?-1:1)*end)+start;e.custom(start,end,unit);}else
-e.custom(start,val,"");}});return true;});},queue:function(type,fn){if(jQuery.isFunction(type)||(type&&type.constructor==Array)){fn=type;type="fx";}if(!type||(typeof type=="string"&&!fn))return queue(this[0],type);return this.each(function(){if(fn.constructor==Array)queue(this,type,fn);else{queue(this,type).push(fn);if(queue(this,type).length==1)fn.call(this);}});},stop:function(clearQueue,gotoEnd){var timers=jQuery.timers;if(clearQueue)this.queue([]);this.each(function(){for(var i=timers.length-1;i>=0;i--)if(timers[i].elem==this){if(gotoEnd)timers[i](true);timers.splice(i,1);}});if(!gotoEnd)this.dequeue();return this;}});var queue=function(elem,type,array){if(elem){type=type||"fx";var q=jQuery.data(elem,type+"queue");if(!q||array)q=jQuery.data(elem,type+"queue",jQuery.makeArray(array));}return q;};jQuery.fn.dequeue=function(type){type=type||"fx";return this.each(function(){var q=queue(this,type);q.shift();if(q.length)q[0].call(this);});};jQuery.extend({speed:function(speed,easing,fn){var opt=speed&&speed.constructor==Object?speed:{complete:fn||!fn&&easing||jQuery.isFunction(speed)&&speed,duration:speed,easing:fn&&easing||easing&&easing.constructor!=Function&&easing};opt.duration=(opt.duration&&opt.duration.constructor==Number?opt.duration:jQuery.fx.speeds[opt.duration])||jQuery.fx.speeds.def;opt.old=opt.complete;opt.complete=function(){if(opt.queue!==false)jQuery(this).dequeue();if(jQuery.isFunction(opt.old))opt.old.call(this);};return opt;},easing:{linear:function(p,n,firstNum,diff){return firstNum+diff*p;},swing:function(p,n,firstNum,diff){return((-Math.cos(p*Math.PI)/2)+0.5)*diff+firstNum;}},timers:[],timerId:null,fx:function(elem,options,prop){this.options=options;this.elem=elem;this.prop=prop;if(!options.orig)options.orig={};}});jQuery.fx.prototype={update:function(){if(this.options.step)this.options.step.call(this.elem,this.now,this);(jQuery.fx.step[this.prop]||jQuery.fx.step._default)(this);if(this.prop=="height"||this.prop=="width")this.elem.style.display="block";},cur:function(force){if(this.elem[this.prop]!=null&&this.elem.style[this.prop]==null)return this.elem[this.prop];var r=parseFloat(jQuery.css(this.elem,this.prop,force));return r&&r>-10000?r:parseFloat(jQuery.curCSS(this.elem,this.prop))||0;},custom:function(from,to,unit){this.startTime=now();this.start=from;this.end=to;this.unit=unit||this.unit||"px";this.now=this.start;this.pos=this.state=0;this.update();var self=this;function t(gotoEnd){return self.step(gotoEnd);}t.elem=this.elem;jQuery.timers.push(t);if(jQuery.timerId==null){jQuery.timerId=setInterval(function(){var timers=jQuery.timers;for(var i=0;i<timers.length;i++)if(!timers[i]())timers.splice(i--,1);if(!timers.length){clearInterval(jQuery.timerId);jQuery.timerId=null;}},13);}},show:function(){this.options.orig[this.prop]=jQuery.attr(this.elem.style,this.prop);this.options.show=true;this.custom(0,this.cur());if(this.prop=="width"||this.prop=="height")this.elem.style[this.prop]="1px";jQuery(this.elem).show();},hide:function(){this.options.orig[this.prop]=jQuery.attr(this.elem.style,this.prop);this.options.hide=true;this.custom(this.cur(),0);},step:function(gotoEnd){var t=now();if(gotoEnd||t>this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var done=true;for(var i in this.options.curAnim)if(this.options.curAnim[i]!==true)done=false;if(done){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(jQuery.css(this.elem,"display")=="none")this.elem.style.display="block";}if(this.options.hide)this.elem.style.display="none";if(this.options.hide||this.options.show)for(var p in this.options.curAnim)jQuery.attr(this.elem.style,p,this.options.orig[p]);}if(done)this.options.complete.call(this.elem);return false;}else{var n=t-this.startTime;this.state=n/this.options.duration;this.pos=jQuery.easing[this.options.easing||(jQuery.easing.swing?"swing":"linear")](this.state,n,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update();}return true;}};jQuery.extend(jQuery.fx,{speeds:{slow:600,fast:200,def:400},step:{scrollLeft:function(fx){fx.elem.scrollLeft=fx.now;},scrollTop:function(fx){fx.elem.scrollTop=fx.now;},opacity:function(fx){jQuery.attr(fx.elem.style,"opacity",fx.now);},_default:function(fx){fx.elem.style[fx.prop]=fx.now+fx.unit;}}});jQuery.fn.offset=function(){var left=0,top=0,elem=this[0],results;if(elem)with(jQuery.browser){var parent=elem.parentNode,offsetChild=elem,offsetParent=elem.offsetParent,doc=elem.ownerDocument,safari2=safari&&parseInt(version)<522&&!/adobeair/i.test(userAgent),css=jQuery.curCSS,fixed=css(elem,"position")=="fixed";if(elem.getBoundingClientRect){var box=elem.getBoundingClientRect();add(box.left+Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),box.top+Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));add(-doc.documentElement.clientLeft,-doc.documentElement.clientTop);}else{add(elem.offsetLeft,elem.offsetTop);while(offsetParent){add(offsetParent.offsetLeft,offsetParent.offsetTop);if(mozilla&&!/^t(able|d|h)$/i.test(offsetParent.tagName)||safari&&!safari2)border(offsetParent);if(!fixed&&css(offsetParent,"position")=="fixed")fixed=true;offsetChild=/^body$/i.test(offsetParent.tagName)?offsetChild:offsetParent;offsetParent=offsetParent.offsetParent;}while(parent&&parent.tagName&&!/^body|html$/i.test(parent.tagName)){if(!/^inline|table.*$/i.test(css(parent,"display")))add(-parent.scrollLeft,-parent.scrollTop);if(mozilla&&css(parent,"overflow")!="visible")border(parent);parent=parent.parentNode;}if((safari2&&(fixed||css(offsetChild,"position")=="absolute"))||(mozilla&&css(offsetChild,"position")!="absolute"))add(-doc.body.offsetLeft,-doc.body.offsetTop);if(fixed)add(Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));}results={top:top,left:left};}function border(elem){add(jQuery.curCSS(elem,"borderLeftWidth",true),jQuery.curCSS(elem,"borderTopWidth",true));}function add(l,t){left+=parseInt(l,10)||0;top+=parseInt(t,10)||0;}return results;};jQuery.fn.extend({position:function(){var left=0,top=0,results;if(this[0]){var offsetParent=this.offsetParent(),offset=this.offset(),parentOffset=/^body|html$/i.test(offsetParent[0].tagName)?{top:0,left:0}:offsetParent.offset();offset.top-=num(this,'marginTop');offset.left-=num(this,'marginLeft');parentOffset.top+=num(offsetParent,'borderTopWidth');parentOffset.left+=num(offsetParent,'borderLeftWidth');results={top:offset.top-parentOffset.top,left:offset.left-parentOffset.left};}return results;},offsetParent:function(){var offsetParent=this[0].offsetParent;while(offsetParent&&(!/^body|html$/i.test(offsetParent.tagName)&&jQuery.css(offsetParent,'position')=='static'))offsetParent=offsetParent.offsetParent;return jQuery(offsetParent);}});jQuery.each(['Left','Top'],function(i,name){var method='scroll'+name;jQuery.fn[method]=function(val){if(!this[0])return;return val!=undefined?this.each(function(){this==window||this==document?window.scrollTo(!i?val:jQuery(window).scrollLeft(),i?val:jQuery(window).scrollTop()):this[method]=val;}):this[0]==window||this[0]==document?self[i?'pageYOffset':'pageXOffset']||jQuery.boxModel&&document.documentElement[method]||document.body[method]:this[0][method];};});jQuery.each(["Height","Width"],function(i,name){var tl=i?"Left":"Top",br=i?"Right":"Bottom";jQuery.fn["inner"+name]=function(){return this[name.toLowerCase()]()+num(this,"padding"+tl)+num(this,"padding"+br);};jQuery.fn["outer"+name]=function(margin){return this["inner"+name]()+num(this,"border"+tl+"Width")+num(this,"border"+br+"Width")+(margin?num(this,"margin"+tl)+num(this,"margin"+br):0);};});})(); \ No newline at end of file
diff --git a/vendor/assets/javascripts/markdown.js b/vendor/assets/javascripts/markdown.js
deleted file mode 100644
index 88dd96256..000000000
--- a/vendor/assets/javascripts/markdown.js
+++ /dev/null
@@ -1 +0,0 @@
-//= require_tree ./markdown \ No newline at end of file
diff --git a/vendor/assets/javascripts/markdown/Markdown.Converter.js b/vendor/assets/javascripts/markdown/Markdown.Converter.js
deleted file mode 100644
index 34a624b3a..000000000
--- a/vendor/assets/javascripts/markdown/Markdown.Converter.js
+++ /dev/null
@@ -1,1332 +0,0 @@
-var Markdown;
-
-if (typeof exports === "object" && typeof require === "function") // we're in a CommonJS (e.g. Node.js) module
- Markdown = exports;
-else
- Markdown = {};
-
-// The following text is included for historical reasons, but should
-// be taken with a pinch of salt; it's not all true anymore.
-
-//
-// Wherever possible, Showdown is a straight, line-by-line port
-// of the Perl version of Markdown.
-//
-// This is not a normal parser design; it's basically just a
-// series of string substitutions. It's hard to read and
-// maintain this way, but keeping Showdown close to the original
-// design makes it easier to port new features.
-//
-// More importantly, Showdown behaves like markdown.pl in most
-// edge cases. So web applications can do client-side preview
-// in Javascript, and then build identical HTML on the server.
-//
-// This port needs the new RegExp functionality of ECMA 262,
-// 3rd Edition (i.e. Javascript 1.5). Most modern web browsers
-// should do fine. Even with the new regular expression features,
-// We do a lot of work to emulate Perl's regex functionality.
-// The tricky changes in this file mostly have the "attacklab:"
-// label. Major or self-explanatory changes don't.
-//
-// Smart diff tools like Araxis Merge will be able to match up
-// this file with markdown.pl in a useful way. A little tweaking
-// helps: in a copy of markdown.pl, replace "#" with "//" and
-// replace "$text" with "text". Be sure to ignore whitespace
-// and line endings.
-//
-
-
-//
-// Usage:
-//
-// var text = "Markdown *rocks*.";
-//
-// var converter = new Markdown.Converter();
-// var html = converter.makeHtml(text);
-//
-// alert(html);
-//
-// Note: move the sample code to the bottom of this
-// file before uncommenting it.
-//
-
-(function () {
-
- function identity(x) { return x; }
- function returnFalse(x) { return false; }
-
- function HookCollection() { }
-
- HookCollection.prototype = {
-
- chain: function (hookname, func) {
- var original = this[hookname];
- if (!original)
- throw new Error("unknown hook " + hookname);
-
- if (original === identity)
- this[hookname] = func;
- else
- this[hookname] = function (x) { return func(original(x)); }
- },
- set: function (hookname, func) {
- if (!this[hookname])
- throw new Error("unknown hook " + hookname);
- this[hookname] = func;
- },
- addNoop: function (hookname) {
- this[hookname] = identity;
- },
- addFalse: function (hookname) {
- this[hookname] = returnFalse;
- }
- };
-
- Markdown.HookCollection = HookCollection;
-
- // g_urls and g_titles allow arbitrary user-entered strings as keys. This
- // caused an exception (and hence stopped the rendering) when the user entered
- // e.g. [push] or [__proto__]. Adding a prefix to the actual key prevents this
- // (since no builtin property starts with "s_"). See
- // http://meta.stackoverflow.com/questions/64655/strange-wmd-bug
- // (granted, switching from Array() to Object() alone would have left only __proto__
- // to be a problem)
- function SaveHash() { }
- SaveHash.prototype = {
- set: function (key, value) {
- this["s_" + key] = value;
- },
- get: function (key) {
- return this["s_" + key];
- }
- };
-
- Markdown.Converter = function () {
- var pluginHooks = this.hooks = new HookCollection();
- pluginHooks.addNoop("plainLinkText"); // given a URL that was encountered by itself (without markup), should return the link text that's to be given to this link
- pluginHooks.addNoop("preConversion"); // called with the orignal text as given to makeHtml. The result of this plugin hook is the actual markdown source that will be cooked
- pluginHooks.addNoop("postConversion"); // called with the final cooked HTML code. The result of this plugin hook is the actual output of makeHtml
-
- //
- // Private state of the converter instance:
- //
-
- // Global hashes, used by various utility routines
- var g_urls;
- var g_titles;
- var g_html_blocks;
-
- // Used to track when we're inside an ordered or unordered list
- // (see _ProcessListItems() for details):
- var g_list_level;
-
- this.makeHtml = function (text) {
-
- //
- // Main function. The order in which other subs are called here is
- // essential. Link and image substitutions need to happen before
- // _EscapeSpecialCharsWithinTagAttributes(), so that any *'s or _'s in the <a>
- // and <img> tags get encoded.
- //
-
- // This will only happen if makeHtml on the same converter instance is called from a plugin hook.
- // Don't do that.
- if (g_urls)
- throw new Error("Recursive call to converter.makeHtml");
-
- // Create the private state objects.
- g_urls = new SaveHash();
- g_titles = new SaveHash();
- g_html_blocks = [];
- g_list_level = 0;
-
- text = pluginHooks.preConversion(text);
-
- // attacklab: Replace ~ with ~T
- // This lets us use tilde as an escape char to avoid md5 hashes
- // The choice of character is arbitray; anything that isn't
- // magic in Markdown will work.
- text = text.replace(/~/g, "~T");
-
- // attacklab: Replace $ with ~D
- // RegExp interprets $ as a special character
- // when it's in a replacement string
- text = text.replace(/\$/g, "~D");
-
- // Standardize line endings
- text = text.replace(/\r\n/g, "\n"); // DOS to Unix
- text = text.replace(/\r/g, "\n"); // Mac to Unix
-
- // Make sure text begins and ends with a couple of newlines:
- text = "\n\n" + text + "\n\n";
-
- // Convert all tabs to spaces.
- text = _Detab(text);
-
- // Strip any lines consisting only of spaces and tabs.
- // This makes subsequent regexen easier to write, because we can
- // match consecutive blank lines with /\n+/ instead of something
- // contorted like /[ \t]*\n+/ .
- text = text.replace(/^[ \t]+$/mg, "");
-
- // Turn block-level HTML blocks into hash entries
- text = _HashHTMLBlocks(text);
-
- // Strip link definitions, store in hashes.
- text = _StripLinkDefinitions(text);
-
- text = _RunBlockGamut(text);
-
- text = _UnescapeSpecialChars(text);
-
- // attacklab: Restore dollar signs
- text = text.replace(/~D/g, "$$");
-
- // attacklab: Restore tildes
- text = text.replace(/~T/g, "~");
-
- text = pluginHooks.postConversion(text);
-
- g_html_blocks = g_titles = g_urls = null;
-
- return text;
- };
-
- function _StripLinkDefinitions(text) {
- //
- // Strips link definitions from text, stores the URLs and titles in
- // hash references.
- //
-
- // Link defs are in the form: ^[id]: url "optional title"
-
- /*
- text = text.replace(/
- ^[ ]{0,3}\[(.+)\]: // id = $1 attacklab: g_tab_width - 1
- [ \t]*
- \n? // maybe *one* newline
- [ \t]*
- <?(\S+?)>? // url = $2
- (?=\s|$) // lookahead for whitespace instead of the lookbehind removed below
- [ \t]*
- \n? // maybe one newline
- [ \t]*
- ( // (potential) title = $3
- (\n*) // any lines skipped = $4 attacklab: lookbehind removed
- [ \t]+
- ["(]
- (.+?) // title = $5
- [")]
- [ \t]*
- )? // title is optional
- (?:\n+|$)
- /gm, function(){...});
- */
-
- text = text.replace(/^[ ]{0,3}\[(.+)\]:[ \t]*\n?[ \t]*<?(\S+?)>?(?=\s|$)[ \t]*\n?[ \t]*((\n*)["(](.+?)[")][ \t]*)?(?:\n+)/gm,
- function (wholeMatch, m1, m2, m3, m4, m5) {
- m1 = m1.toLowerCase();
- g_urls.set(m1, _EncodeAmpsAndAngles(m2)); // Link IDs are case-insensitive
- if (m4) {
- // Oops, found blank lines, so it's not a title.
- // Put back the parenthetical statement we stole.
- return m3;
- } else if (m5) {
- g_titles.set(m1, m5.replace(/"/g, "&quot;"));
- }
-
- // Completely remove the definition from the text
- return "";
- }
- );
-
- return text;
- }
-
- function _HashHTMLBlocks(text) {
-
- // Hashify HTML blocks:
- // We only want to do this for block-level HTML tags, such as headers,
- // lists, and tables. That's because we still want to wrap <p>s around
- // "paragraphs" that are wrapped in non-block-level tags, such as anchors,
- // phrase emphasis, and spans. The list of tags we're looking for is
- // hard-coded:
- var block_tags_a = "p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math|ins|del"
- var block_tags_b = "p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math"
-
- // First, look for nested blocks, e.g.:
- // <div>
- // <div>
- // tags for inner block must be indented.
- // </div>
- // </div>
- //
- // The outermost tags must start at the left margin for this to match, and
- // the inner nested divs must be indented.
- // We need to do this before the next, more liberal match, because the next
- // match will start at the first `<div>` and stop at the first `</div>`.
-
- // attacklab: This regex can be expensive when it fails.
-
- /*
- text = text.replace(/
- ( // save in $1
- ^ // start of line (with /m)
- <($block_tags_a) // start tag = $2
- \b // word break
- // attacklab: hack around khtml/pcre bug...
- [^\r]*?\n // any number of lines, minimally matching
- </\2> // the matching end tag
- [ \t]* // trailing spaces/tabs
- (?=\n+) // followed by a newline
- ) // attacklab: there are sentinel newlines at end of document
- /gm,function(){...}};
- */
- text = text.replace(/^(<(p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math|ins|del)\b[^\r]*?\n<\/\2>[ \t]*(?=\n+))/gm, hashElement);
-
- //
- // Now match more liberally, simply from `\n<tag>` to `</tag>\n`
- //
-
- /*
- text = text.replace(/
- ( // save in $1
- ^ // start of line (with /m)
- <($block_tags_b) // start tag = $2
- \b // word break
- // attacklab: hack around khtml/pcre bug...
- [^\r]*? // any number of lines, minimally matching
- .*</\2> // the matching end tag
- [ \t]* // trailing spaces/tabs
- (?=\n+) // followed by a newline
- ) // attacklab: there are sentinel newlines at end of document
- /gm,function(){...}};
- */
- text = text.replace(/^(<(p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math)\b[^\r]*?.*<\/\2>[ \t]*(?=\n+)\n)/gm, hashElement);
-
- // Special case just for <hr />. It was easier to make a special case than
- // to make the other regex more complicated.
-
- /*
- text = text.replace(/
- \n // Starting after a blank line
- [ ]{0,3}
- ( // save in $1
- (<(hr) // start tag = $2
- \b // word break
- ([^<>])*?
- \/?>) // the matching end tag
- [ \t]*
- (?=\n{2,}) // followed by a blank line
- )
- /g,hashElement);
- */
- text = text.replace(/\n[ ]{0,3}((<(hr)\b([^<>])*?\/?>)[ \t]*(?=\n{2,}))/g, hashElement);
-
- // Special case for standalone HTML comments:
-
- /*
- text = text.replace(/
- \n\n // Starting after a blank line
- [ ]{0,3} // attacklab: g_tab_width - 1
- ( // save in $1
- <!
- (--(?:|(?:[^>-]|-[^>])(?:[^-]|-[^-])*)--) // see http://www.w3.org/TR/html-markup/syntax.html#comments and http://meta.stackoverflow.com/q/95256
- >
- [ \t]*
- (?=\n{2,}) // followed by a blank line
- )
- /g,hashElement);
- */
- text = text.replace(/\n\n[ ]{0,3}(<!(--(?:|(?:[^>-]|-[^>])(?:[^-]|-[^-])*)--)>[ \t]*(?=\n{2,}))/g, hashElement);
-
- // PHP and ASP-style processor instructions (<?...?> and <%...%>)
-
- /*
- text = text.replace(/
- (?:
- \n\n // Starting after a blank line
- )
- ( // save in $1
- [ ]{0,3} // attacklab: g_tab_width - 1
- (?:
- <([?%]) // $2
- [^\r]*?
- \2>
- )
- [ \t]*
- (?=\n{2,}) // followed by a blank line
- )
- /g,hashElement);
- */
- text = text.replace(/(?:\n\n)([ ]{0,3}(?:<([?%])[^\r]*?\2>)[ \t]*(?=\n{2,}))/g, hashElement);
-
- return text;
- }
-
- function hashElement(wholeMatch, m1) {
- var blockText = m1;
-
- // Undo double lines
- blockText = blockText.replace(/^\n+/, "");
-
- // strip trailing blank lines
- blockText = blockText.replace(/\n+$/g, "");
-
- // Replace the element text with a marker ("~KxK" where x is its key)
- blockText = "\n\n~K" + (g_html_blocks.push(blockText) - 1) + "K\n\n";
-
- return blockText;
- }
-
- function _RunBlockGamut(text, doNotUnhash) {
- //
- // These are all the transformations that form block-level
- // tags like paragraphs, headers, and list items.
- //
- text = _DoHeaders(text);
-
- // Do Horizontal Rules:
- var replacement = "<hr />\n";
- text = text.replace(/^[ ]{0,2}([ ]?\*[ ]?){3,}[ \t]*$/gm, replacement);
- text = text.replace(/^[ ]{0,2}([ ]?-[ ]?){3,}[ \t]*$/gm, replacement);
- text = text.replace(/^[ ]{0,2}([ ]?_[ ]?){3,}[ \t]*$/gm, replacement);
-
- text = _DoLists(text);
- text = _DoCodeBlocks(text);
- text = _DoBlockQuotes(text);
-
- // We already ran _HashHTMLBlocks() before, in Markdown(), but that
- // was to escape raw HTML in the original Markdown source. This time,
- // we're escaping the markup we've just created, so that we don't wrap
- // <p> tags around block-level tags.
- text = _HashHTMLBlocks(text);
- text = _FormParagraphs(text, doNotUnhash);
-
- return text;
- }
-
- function _RunSpanGamut(text) {
- //
- // These are all the transformations that occur *within* block-level
- // tags like paragraphs, headers, and list items.
- //
-
- text = _DoCodeSpans(text);
- text = _EscapeSpecialCharsWithinTagAttributes(text);
- text = _EncodeBackslashEscapes(text);
-
- // Process anchor and image tags. Images must come first,
- // because ![foo][f] looks like an anchor.
- text = _DoImages(text);
- text = _DoAnchors(text);
-
- // Make links out of things like `<http://example.com/>`
- // Must come after _DoAnchors(), because you can use < and >
- // delimiters in inline links like [this](<url>).
- text = _DoAutoLinks(text);
-
- text = text.replace(/~P/g, "://"); // put in place to prevent autolinking; reset now
-
- text = _EncodeAmpsAndAngles(text);
- text = _DoItalicsAndBold(text);
-
- // Do hard breaks:
- text = text.replace(/ +\n/g, " <br>\n");
-
- return text;
- }
-
- function _EscapeSpecialCharsWithinTagAttributes(text) {
- //
- // Within tags -- meaning between < and > -- encode [\ ` * _] so they
- // don't conflict with their use in Markdown for code, italics and strong.
- //
-
- // Build a regex to find HTML tags and comments. See Friedl's
- // "Mastering Regular Expressions", 2nd Ed., pp. 200-201.
-
- // SE: changed the comment part of the regex
-
- var regex = /(<[a-z\/!$]("[^"]*"|'[^']*'|[^'">])*>|<!(--(?:|(?:[^>-]|-[^>])(?:[^-]|-[^-])*)--)>)/gi;
-
- text = text.replace(regex, function (wholeMatch) {
- var tag = wholeMatch.replace(/(.)<\/?code>(?=.)/g, "$1`");
- tag = escapeCharacters(tag, wholeMatch.charAt(1) == "!" ? "\\`*_/" : "\\`*_"); // also escape slashes in comments to prevent autolinking there -- http://meta.stackoverflow.com/questions/95987
- return tag;
- });
-
- return text;
- }
-
- function _DoAnchors(text) {
- //
- // Turn Markdown link shortcuts into XHTML <a> tags.
- //
- //
- // First, handle reference-style links: [link text] [id]
- //
-
- /*
- text = text.replace(/
- ( // wrap whole match in $1
- \[
- (
- (?:
- \[[^\]]*\] // allow brackets nested one level
- |
- [^\[] // or anything else
- )*
- )
- \]
-
- [ ]? // one optional space
- (?:\n[ ]*)? // one optional newline followed by spaces
-
- \[
- (.*?) // id = $3
- \]
- )
- ()()()() // pad remaining backreferences
- /g, writeAnchorTag);
- */
- text = text.replace(/(\[((?:\[[^\]]*\]|[^\[\]])*)\][ ]?(?:\n[ ]*)?\[(.*?)\])()()()()/g, writeAnchorTag);
-
- //
- // Next, inline-style links: [link text](url "optional title")
- //
-
- /*
- text = text.replace(/
- ( // wrap whole match in $1
- \[
- (
- (?:
- \[[^\]]*\] // allow brackets nested one level
- |
- [^\[\]] // or anything else
- )*
- )
- \]
- \( // literal paren
- [ \t]*
- () // no id, so leave $3 empty
- <?( // href = $4
- (?:
- \([^)]*\) // allow one level of (correctly nested) parens (think MSDN)
- |
- [^()]
- )*?
- )>?
- [ \t]*
- ( // $5
- (['"]) // quote char = $6
- (.*?) // Title = $7
- \6 // matching quote
- [ \t]* // ignore any spaces/tabs between closing quote and )
- )? // title is optional
- \)
- )
- /g, writeAnchorTag);
- */
-
- text = text.replace(/(\[((?:\[[^\]]*\]|[^\[\]])*)\]\([ \t]*()<?((?:\([^)]*\)|[^()])*?)>?[ \t]*((['"])(.*?)\6[ \t]*)?\))/g, writeAnchorTag);
-
- //
- // Last, handle reference-style shortcuts: [link text]
- // These must come last in case you've also got [link test][1]
- // or [link test](/foo)
- //
-
- /*
- text = text.replace(/
- ( // wrap whole match in $1
- \[
- ([^\[\]]+) // link text = $2; can't contain '[' or ']'
- \]
- )
- ()()()()() // pad rest of backreferences
- /g, writeAnchorTag);
- */
- text = text.replace(/(\[([^\[\]]+)\])()()()()()/g, writeAnchorTag);
-
- return text;
- }
-
- function writeAnchorTag(wholeMatch, m1, m2, m3, m4, m5, m6, m7) {
- if (m7 == undefined) m7 = "";
- var whole_match = m1;
- var link_text = m2.replace(/:\/\//g, "~P"); // to prevent auto-linking withing the link. will be converted back after the auto-linker runs
- var link_id = m3.toLowerCase();
- var url = m4;
- var title = m7;
-
- if (url == "") {
- if (link_id == "") {
- // lower-case and turn embedded newlines into spaces
- link_id = link_text.toLowerCase().replace(/ ?\n/g, " ");
- }
- url = "#" + link_id;
-
- if (g_urls.get(link_id) != undefined) {
- url = g_urls.get(link_id);
- if (g_titles.get(link_id) != undefined) {
- title = g_titles.get(link_id);
- }
- }
- else {
- if (whole_match.search(/\(\s*\)$/m) > -1) {
- // Special case for explicit empty url
- url = "";
- } else {
- return whole_match;
- }
- }
- }
- url = encodeProblemUrlChars(url);
- url = escapeCharacters(url, "*_");
- var result = "<a href=\"" + url + "\"";
-
- if (title != "") {
- title = attributeEncode(title);
- title = escapeCharacters(title, "*_");
- result += " title=\"" + title + "\"";
- }
-
- result += ">" + link_text + "</a>";
-
- return result;
- }
-
- function _DoImages(text) {
- //
- // Turn Markdown image shortcuts into <img> tags.
- //
-
- //
- // First, handle reference-style labeled images: ![alt text][id]
- //
-
- /*
- text = text.replace(/
- ( // wrap whole match in $1
- !\[
- (.*?) // alt text = $2
- \]
-
- [ ]? // one optional space
- (?:\n[ ]*)? // one optional newline followed by spaces
-
- \[
- (.*?) // id = $3
- \]
- )
- ()()()() // pad rest of backreferences
- /g, writeImageTag);
- */
- text = text.replace(/(!\[(.*?)\][ ]?(?:\n[ ]*)?\[(.*?)\])()()()()/g, writeImageTag);
-
- //
- // Next, handle inline images: ![alt text](url "optional title")
- // Don't forget: encode * and _
-
- /*
- text = text.replace(/
- ( // wrap whole match in $1
- !\[
- (.*?) // alt text = $2
- \]
- \s? // One optional whitespace character
- \( // literal paren
- [ \t]*
- () // no id, so leave $3 empty
- <?(\S+?)>? // src url = $4
- [ \t]*
- ( // $5
- (['"]) // quote char = $6
- (.*?) // title = $7
- \6 // matching quote
- [ \t]*
- )? // title is optional
- \)
- )
- /g, writeImageTag);
- */
- text = text.replace(/(!\[(.*?)\]\s?\([ \t]*()<?(\S+?)>?[ \t]*((['"])(.*?)\6[ \t]*)?\))/g, writeImageTag);
-
- return text;
- }
-
- function attributeEncode(text) {
- // unconditionally replace angle brackets here -- what ends up in an attribute (e.g. alt or title)
- // never makes sense to have verbatim HTML in it (and the sanitizer would totally break it)
- return text.replace(/>/g, "&gt;").replace(/</g, "&lt;").replace(/"/g, "&quot;");
- }
-
- function writeImageTag(wholeMatch, m1, m2, m3, m4, m5, m6, m7) {
- var whole_match = m1;
- var alt_text = m2;
- var link_id = m3.toLowerCase();
- var url = m4;
- var title = m7;
-
- if (!title) title = "";
-
- if (url == "") {
- if (link_id == "") {
- // lower-case and turn embedded newlines into spaces
- link_id = alt_text.toLowerCase().replace(/ ?\n/g, " ");
- }
- url = "#" + link_id;
-
- if (g_urls.get(link_id) != undefined) {
- url = g_urls.get(link_id);
- if (g_titles.get(link_id) != undefined) {
- title = g_titles.get(link_id);
- }
- }
- else {
- return whole_match;
- }
- }
-
- alt_text = escapeCharacters(attributeEncode(alt_text), "*_[]()");
- url = escapeCharacters(url, "*_");
- var result = "<img src=\"" + url + "\" alt=\"" + alt_text + "\"";
-
- // attacklab: Markdown.pl adds empty title attributes to images.
- // Replicate this bug.
-
- //if (title != "") {
- title = attributeEncode(title);
- title = escapeCharacters(title, "*_");
- result += " title=\"" + title + "\"";
- //}
-
- result += " />";
-
- return result;
- }
-
- function _DoHeaders(text) {
-
- // Setext-style headers:
- // Header 1
- // ========
- //
- // Header 2
- // --------
- //
- text = text.replace(/^(.+)[ \t]*\n=+[ \t]*\n+/gm,
- function (wholeMatch, m1) { return "<h1>" + _RunSpanGamut(m1) + "</h1>\n\n"; }
- );
-
- text = text.replace(/^(.+)[ \t]*\n-+[ \t]*\n+/gm,
- function (matchFound, m1) { return "<h2>" + _RunSpanGamut(m1) + "</h2>\n\n"; }
- );
-
- // atx-style headers:
- // # Header 1
- // ## Header 2
- // ## Header 2 with closing hashes ##
- // ...
- // ###### Header 6
- //
-
- /*
- text = text.replace(/
- ^(\#{1,6}) // $1 = string of #'s
- [ \t]*
- (.+?) // $2 = Header text
- [ \t]*
- \#* // optional closing #'s (not counted)
- \n+
- /gm, function() {...});
- */
-
- text = text.replace(/^(\#{1,6})[ \t]+(.+?)[ \t]*\#*\n+/gm,
- function (wholeMatch, m1, m2) {
- var h_level = m1.length;
- return "<h" + h_level + ">" + _RunSpanGamut(m2) + "</h" + h_level + ">\n\n";
- }
- );
-
- return text;
- }
-
- function _DoLists(text) {
- //
- // Form HTML ordered (numbered) and unordered (bulleted) lists.
- //
-
- // attacklab: add sentinel to hack around khtml/safari bug:
- // http://bugs.webkit.org/show_bug.cgi?id=11231
- text += "~0";
-
- // Re-usable pattern to match any entirel ul or ol list:
-
- /*
- var whole_list = /
- ( // $1 = whole list
- ( // $2
- [ ]{0,3} // attacklab: g_tab_width - 1
- ([*+-]|\d+[.]) // $3 = first list item marker
- [ \t]+
- )
- [^\r]+?
- ( // $4
- ~0 // sentinel for workaround; should be $
- |
- \n{2,}
- (?=\S)
- (?! // Negative lookahead for another list item marker
- [ \t]*
- (?:[*+-]|\d+[.])[ \t]+
- )
- )
- )
- /g
- */
- var whole_list = /^(([ ]{0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(~0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/gm;
-
- if (g_list_level) {
- text = text.replace(whole_list, function (wholeMatch, m1, m2) {
- var list = m1;
- var list_type = (m2.search(/[*+-]/g) > -1) ? "ul" : "ol";
-
- var result = _ProcessListItems(list, list_type);
-
- // Trim any trailing whitespace, to put the closing `</$list_type>`
- // up on the preceding line, to get it past the current stupid
- // HTML block parser. This is a hack to work around the terrible
- // hack that is the HTML block parser.
- result = result.replace(/\s+$/, "");
- result = "<" + list_type + ">" + result + "</" + list_type + ">\n";
- return result;
- });
- } else {
- whole_list = /(\n\n|^\n?)(([ ]{0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(~0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/g;
- text = text.replace(whole_list, function (wholeMatch, m1, m2, m3) {
- var runup = m1;
- var list = m2;
-
- var list_type = (m3.search(/[*+-]/g) > -1) ? "ul" : "ol";
- var result = _ProcessListItems(list, list_type);
- result = runup + "<" + list_type + ">\n" + result + "</" + list_type + ">\n";
- return result;
- });
- }
-
- // attacklab: strip sentinel
- text = text.replace(/~0/, "");
-
- return text;
- }
-
- var _listItemMarkers = { ol: "\\d+[.]", ul: "[*+-]" };
-
- function _ProcessListItems(list_str, list_type) {
- //
- // Process the contents of a single ordered or unordered list, splitting it
- // into individual list items.
- //
- // list_type is either "ul" or "ol".
-
- // The $g_list_level global keeps track of when we're inside a list.
- // Each time we enter a list, we increment it; when we leave a list,
- // we decrement. If it's zero, we're not in a list anymore.
- //
- // We do this because when we're not inside a list, we want to treat
- // something like this:
- //
- // I recommend upgrading to version
- // 8. Oops, now this line is treated
- // as a sub-list.
- //
- // As a single paragraph, despite the fact that the second line starts
- // with a digit-period-space sequence.
- //
- // Whereas when we're inside a list (or sub-list), that line will be
- // treated as the start of a sub-list. What a kludge, huh? This is
- // an aspect of Markdown's syntax that's hard to parse perfectly
- // without resorting to mind-reading. Perhaps the solution is to
- // change the syntax rules such that sub-lists must start with a
- // starting cardinal number; e.g. "1." or "a.".
-
- g_list_level++;
-
- // trim trailing blank lines:
- list_str = list_str.replace(/\n{2,}$/, "\n");
-
- // attacklab: add sentinel to emulate \z
- list_str += "~0";
-
- // In the original attacklab showdown, list_type was not given to this function, and anything
- // that matched /[*+-]|\d+[.]/ would just create the next <li>, causing this mismatch:
- //
- // Markdown rendered by WMD rendered by MarkdownSharp
- // ------------------------------------------------------------------
- // 1. first 1. first 1. first
- // 2. second 2. second 2. second
- // - third 3. third * third
- //
- // We changed this to behave identical to MarkdownSharp. This is the constructed RegEx,
- // with {MARKER} being one of \d+[.] or [*+-], depending on list_type:
-
- /*
- list_str = list_str.replace(/
- (^[ \t]*) // leading whitespace = $1
- ({MARKER}) [ \t]+ // list marker = $2
- ([^\r]+? // list item text = $3
- (\n+)
- )
- (?=
- (~0 | \2 ({MARKER}) [ \t]+)
- )
- /gm, function(){...});
- */
-
- var marker = _listItemMarkers[list_type];
- var re = new RegExp("(^[ \\t]*)(" + marker + ")[ \\t]+([^\\r]+?(\\n+))(?=(~0|\\1(" + marker + ")[ \\t]+))", "gm");
- var last_item_had_a_double_newline = false;
- list_str = list_str.replace(re,
- function (wholeMatch, m1, m2, m3) {
- var item = m3;
- var leading_space = m1;
- var ends_with_double_newline = /\n\n$/.test(item);
- var contains_double_newline = ends_with_double_newline || item.search(/\n{2,}/) > -1;
-
- if (contains_double_newline || last_item_had_a_double_newline) {
- item = _RunBlockGamut(_Outdent(item), /* doNotUnhash = */true);
- }
- else {
- // Recursion for sub-lists:
- item = _DoLists(_Outdent(item));
- item = item.replace(/\n$/, ""); // chomp(item)
- item = _RunSpanGamut(item);
- }
- last_item_had_a_double_newline = ends_with_double_newline;
- return "<li>" + item + "</li>\n";
- }
- );
-
- // attacklab: strip sentinel
- list_str = list_str.replace(/~0/g, "");
-
- g_list_level--;
- return list_str;
- }
-
- function _DoCodeBlocks(text) {
- //
- // Process Markdown `<pre><code>` blocks.
- //
-
- /*
- text = text.replace(/
- (?:\n\n|^)
- ( // $1 = the code block -- one or more lines, starting with a space/tab
- (?:
- (?:[ ]{4}|\t) // Lines must start with a tab or a tab-width of spaces - attacklab: g_tab_width
- .*\n+
- )+
- )
- (\n*[ ]{0,3}[^ \t\n]|(?=~0)) // attacklab: g_tab_width
- /g ,function(){...});
- */
-
- // attacklab: sentinel workarounds for lack of \A and \Z, safari\khtml bug
- text += "~0";
-
- text = text.replace(/(?:\n\n|^)((?:(?:[ ]{4}|\t).*\n+)+)(\n*[ ]{0,3}[^ \t\n]|(?=~0))/g,
- function (wholeMatch, m1, m2) {
- var codeblock = m1;
- var nextChar = m2;
-
- codeblock = _EncodeCode(_Outdent(codeblock));
- codeblock = _Detab(codeblock);
- codeblock = codeblock.replace(/^\n+/g, ""); // trim leading newlines
- codeblock = codeblock.replace(/\n+$/g, ""); // trim trailing whitespace
-
- codeblock = "<pre><code>" + codeblock + "\n</code></pre>";
-
- return "\n\n" + codeblock + "\n\n" + nextChar;
- }
- );
-
- // attacklab: strip sentinel
- text = text.replace(/~0/, "");
-
- return text;
- }
-
- function hashBlock(text) {
- text = text.replace(/(^\n+|\n+$)/g, "");
- return "\n\n~K" + (g_html_blocks.push(text) - 1) + "K\n\n";
- }
-
- function _DoCodeSpans(text) {
- //
- // * Backtick quotes are used for <code></code> spans.
- //
- // * You can use multiple backticks as the delimiters if you want to
- // include literal backticks in the code span. So, this input:
- //
- // Just type ``foo `bar` baz`` at the prompt.
- //
- // Will translate to:
- //
- // <p>Just type <code>foo `bar` baz</code> at the prompt.</p>
- //
- // There's no arbitrary limit to the number of backticks you
- // can use as delimters. If you need three consecutive backticks
- // in your code, use four for delimiters, etc.
- //
- // * You can use spaces to get literal backticks at the edges:
- //
- // ... type `` `bar` `` ...
- //
- // Turns to:
- //
- // ... type <code>`bar`</code> ...
- //
-
- /*
- text = text.replace(/
- (^|[^\\]) // Character before opening ` can't be a backslash
- (`+) // $2 = Opening run of `
- ( // $3 = The code block
- [^\r]*?
- [^`] // attacklab: work around lack of lookbehind
- )
- \2 // Matching closer
- (?!`)
- /gm, function(){...});
- */
-
- text = text.replace(/(^|[^\\])(`+)([^\r]*?[^`])\2(?!`)/gm,
- function (wholeMatch, m1, m2, m3, m4) {
- var c = m3;
- c = c.replace(/^([ \t]*)/g, ""); // leading whitespace
- c = c.replace(/[ \t]*$/g, ""); // trailing whitespace
- c = _EncodeCode(c);
- c = c.replace(/:\/\//g, "~P"); // to prevent auto-linking. Not necessary in code *blocks*, but in code spans. Will be converted back after the auto-linker runs.
- return m1 + "<code>" + c + "</code>";
- }
- );
-
- return text;
- }
-
- function _EncodeCode(text) {
- //
- // Encode/escape certain characters inside Markdown code runs.
- // The point is that in code, these characters are literals,
- // and lose their special Markdown meanings.
- //
- // Encode all ampersands; HTML entities are not
- // entities within a Markdown code span.
- text = text.replace(/&/g, "&amp;");
-
- // Do the angle bracket song and dance:
- text = text.replace(/</g, "&lt;");
- text = text.replace(/>/g, "&gt;");
-
- // Now, escape characters that are magic in Markdown:
- text = escapeCharacters(text, "\*_{}[]\\", false);
-
- // jj the line above breaks this:
- //---
-
- //* Item
-
- // 1. Subitem
-
- // special char: *
- //---
-
- return text;
- }
-
- function _DoItalicsAndBold(text) {
-
- // <strong> must go first:
- text = text.replace(/([\W_]|^)(\*\*|__)(?=\S)([^\r]*?\S[\*_]*)\2([\W_]|$)/g,
- "$1<strong>$3</strong>$4");
-
- text = text.replace(/([\W_]|^)(\*|_)(?=\S)([^\r\*_]*?\S)\2([\W_]|$)/g,
- "$1<em>$3</em>$4");
-
- return text;
- }
-
- function _DoBlockQuotes(text) {
-
- /*
- text = text.replace(/
- ( // Wrap whole match in $1
- (
- ^[ \t]*>[ \t]? // '>' at the start of a line
- .+\n // rest of the first line
- (.+\n)* // subsequent consecutive lines
- \n* // blanks
- )+
- )
- /gm, function(){...});
- */
-
- text = text.replace(/((^[ \t]*>[ \t]?.+\n(.+\n)*\n*)+)/gm,
- function (wholeMatch, m1) {
- var bq = m1;
-
- // attacklab: hack around Konqueror 3.5.4 bug:
- // "----------bug".replace(/^-/g,"") == "bug"
-
- bq = bq.replace(/^[ \t]*>[ \t]?/gm, "~0"); // trim one level of quoting
-
- // attacklab: clean up hack
- bq = bq.replace(/~0/g, "");
-
- bq = bq.replace(/^[ \t]+$/gm, ""); // trim whitespace-only lines
- bq = _RunBlockGamut(bq); // recurse
-
- bq = bq.replace(/(^|\n)/g, "$1 ");
- // These leading spaces screw with <pre> content, so we need to fix that:
- bq = bq.replace(
- /(\s*<pre>[^\r]+?<\/pre>)/gm,
- function (wholeMatch, m1) {
- var pre = m1;
- // attacklab: hack around Konqueror 3.5.4 bug:
- pre = pre.replace(/^ /mg, "~0");
- pre = pre.replace(/~0/g, "");
- return pre;
- });
-
- return hashBlock("<blockquote>\n" + bq + "\n</blockquote>");
- }
- );
- return text;
- }
-
- function _FormParagraphs(text, doNotUnhash) {
- //
- // Params:
- // $text - string to process with html <p> tags
- //
-
- // Strip leading and trailing lines:
- text = text.replace(/^\n+/g, "");
- text = text.replace(/\n+$/g, "");
-
- var grafs = text.split(/\n{2,}/g);
- var grafsOut = [];
-
- var markerRe = /~K(\d+)K/;
-
- //
- // Wrap <p> tags.
- //
- var end = grafs.length;
- for (var i = 0; i < end; i++) {
- var str = grafs[i];
-
- // if this is an HTML marker, copy it
- if (markerRe.test(str)) {
- grafsOut.push(str);
- }
- else if (/\S/.test(str)) {
- str = _RunSpanGamut(str);
- str = str.replace(/^([ \t]*)/g, "<p>");
- str += "</p>"
- grafsOut.push(str);
- }
-
- }
- //
- // Unhashify HTML blocks
- //
- if (!doNotUnhash) {
- end = grafsOut.length;
- for (var i = 0; i < end; i++) {
- var foundAny = true;
- while (foundAny) { // we may need several runs, since the data may be nested
- foundAny = false;
- grafsOut[i] = grafsOut[i].replace(/~K(\d+)K/g, function (wholeMatch, id) {
- foundAny = true;
- return g_html_blocks[id];
- });
- }
- }
- }
- return grafsOut.join("\n\n");
- }
-
- function _EncodeAmpsAndAngles(text) {
- // Smart processing for ampersands and angle brackets that need to be encoded.
-
- // Ampersand-encoding based entirely on Nat Irons's Amputator MT plugin:
- // http://bumppo.net/projects/amputator/
- text = text.replace(/&(?!#?[xX]?(?:[0-9a-fA-F]+|\w+);)/g, "&amp;");
-
- // Encode naked <'s
- text = text.replace(/<(?![a-z\/?\$!])/gi, "&lt;");
-
- return text;
- }
-
- function _EncodeBackslashEscapes(text) {
- //
- // Parameter: String.
- // Returns: The string, with after processing the following backslash
- // escape sequences.
- //
-
- // attacklab: The polite way to do this is with the new
- // escapeCharacters() function:
- //
- // text = escapeCharacters(text,"\\",true);
- // text = escapeCharacters(text,"`*_{}[]()>#+-.!",true);
- //
- // ...but we're sidestepping its use of the (slow) RegExp constructor
- // as an optimization for Firefox. This function gets called a LOT.
-
- text = text.replace(/\\(\\)/g, escapeCharacters_callback);
- text = text.replace(/\\([`*_{}\[\]()>#+-.!])/g, escapeCharacters_callback);
- return text;
- }
-
- function _DoAutoLinks(text) {
-
- // note that at this point, all other URL in the text are already hyperlinked as <a href=""></a>
- // *except* for the <http://www.foo.com> case
-
- // automatically add < and > around unadorned raw hyperlinks
- // must be preceded by space/BOF and followed by non-word/EOF character
- text = text.replace(/(^|\s)(https?|ftp)(:\/\/[-A-Z0-9+&@#\/%?=~_|\[\]\(\)!:,\.;]*[-A-Z0-9+&@#\/%=~_|\[\]])($|\W)/gi, "$1<$2$3>$4");
-
- // autolink anything like <http://example.com>
-
- var replacer = function (wholematch, m1) { return "<a href=\"" + m1 + "\">" + pluginHooks.plainLinkText(m1) + "</a>"; }
- text = text.replace(/<((https?|ftp):[^'">\s]+)>/gi, replacer);
-
- // Email addresses: <address@domain.foo>
- /*
- text = text.replace(/
- <
- (?:mailto:)?
- (
- [-.\w]+
- \@
- [-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+
- )
- >
- /gi, _DoAutoLinks_callback());
- */
-
- /* disabling email autolinking, since we don't do that on the server, either
- text = text.replace(/<(?:mailto:)?([-.\w]+\@[-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+)>/gi,
- function(wholeMatch,m1) {
- return _EncodeEmailAddress( _UnescapeSpecialChars(m1) );
- }
- );
- */
- return text;
- }
-
- function _UnescapeSpecialChars(text) {
- //
- // Swap back in all the special characters we've hidden.
- //
- text = text.replace(/~E(\d+)E/g,
- function (wholeMatch, m1) {
- var charCodeToReplace = parseInt(m1);
- return String.fromCharCode(charCodeToReplace);
- }
- );
- return text;
- }
-
- function _Outdent(text) {
- //
- // Remove one level of line-leading tabs or spaces
- //
-
- // attacklab: hack around Konqueror 3.5.4 bug:
- // "----------bug".replace(/^-/g,"") == "bug"
-
- text = text.replace(/^(\t|[ ]{1,4})/gm, "~0"); // attacklab: g_tab_width
-
- // attacklab: clean up hack
- text = text.replace(/~0/g, "")
-
- return text;
- }
-
- function _Detab(text) {
- if (!/\t/.test(text))
- return text;
-
- var spaces = [" ", " ", " ", " "],
- skew = 0,
- v;
-
- return text.replace(/[\n\t]/g, function (match, offset) {
- if (match === "\n") {
- skew = offset + 1;
- return match;
- }
- v = (offset - skew) % 4;
- skew = offset + 1;
- return spaces[v];
- });
- }
-
- //
- // attacklab: Utility functions
- //
-
- var _problemUrlChars = /(?:["'*()[\]:]|~D)/g;
-
- // hex-encodes some unusual "problem" chars in URLs to avoid URL detection problems
- function encodeProblemUrlChars(url) {
- if (!url)
- return "";
-
- var len = url.length;
-
- return url.replace(_problemUrlChars, function (match, offset) {
- if (match == "~D") // escape for dollar
- return "%24";
- if (match == ":") {
- if (offset == len - 1 || /[0-9\/]/.test(url.charAt(offset + 1)))
- return ":"
- }
- return "%" + match.charCodeAt(0).toString(16);
- });
- }
-
-
- function escapeCharacters(text, charsToEscape, afterBackslash) {
- // First we have to escape the escape characters so that
- // we can build a character class out of them
- var regexString = "([" + charsToEscape.replace(/([\[\]\\])/g, "\\$1") + "])";
-
- if (afterBackslash) {
- regexString = "\\\\" + regexString;
- }
-
- var regex = new RegExp(regexString, "g");
- text = text.replace(regex, escapeCharacters_callback);
-
- return text;
- }
-
-
- function escapeCharacters_callback(wholeMatch, m1) {
- var charCodeToEscape = m1.charCodeAt(0);
- return "~E" + charCodeToEscape + "E";
- }
-
- }; // end of the Markdown.Converter constructor
-
-})();
diff --git a/vendor/assets/javascripts/markdown/Markdown.Sanitizer.js b/vendor/assets/javascripts/markdown/Markdown.Sanitizer.js
deleted file mode 100644
index cc5826fa8..000000000
--- a/vendor/assets/javascripts/markdown/Markdown.Sanitizer.js
+++ /dev/null
@@ -1,108 +0,0 @@
-(function () {
- var output, Converter;
- if (typeof exports === "object" && typeof require === "function") { // we're in a CommonJS (e.g. Node.js) module
- output = exports;
- Converter = require("./Markdown.Converter").Converter;
- } else {
- output = window.Markdown;
- Converter = output.Converter;
- }
-
- output.getSanitizingConverter = function () {
- var converter = new Converter();
- converter.hooks.chain("postConversion", sanitizeHtml);
- converter.hooks.chain("postConversion", balanceTags);
- return converter;
- }
-
- function sanitizeHtml(html) {
- return html.replace(/<[^>]*>?/gi, sanitizeTag);
- }
-
- // (tags that can be opened/closed) | (tags that stand alone)
- var basic_tag_whitelist = /^(<\/?(b|blockquote|code|del|dd|dl|dt|em|h1|h2|h3|i|kbd|li|ol|p|pre|s|sup|sub|strong|strike|ul)>|<(br|hr)\s?\/?>)$/i;
- // <a href="url..." optional title>|</a>
- var a_white = /^(<a\shref="((https?|ftp):\/\/|\/)[-A-Za-z0-9+&@#\/%?=~_|!:,.;\(\)]+"(\stitle="[^"<>]+")?\s?>|<\/a>)$/i;
-
- // <img src="url..." optional width optional height optional alt optional title
- var img_white = /^(<img\ssrc="(https?:\/\/|\/)[-A-Za-z0-9+&@#\/%?=~_|!:,.;\(\)]+"(\swidth="\d{1,3}")?(\sheight="\d{1,3}")?(\salt="[^"<>]*")?(\stitle="[^"<>]*")?\s?\/?>)$/i;
-
- function sanitizeTag(tag) {
- if (tag.match(basic_tag_whitelist) || tag.match(a_white) || tag.match(img_white))
- return tag;
- else
- return "";
- }
-
- /// <summary>
- /// attempt to balance HTML tags in the html string
- /// by removing any unmatched opening or closing tags
- /// IMPORTANT: we *assume* HTML has *already* been
- /// sanitized and is safe/sane before balancing!
- ///
- /// adapted from CODESNIPPET: A8591DBA-D1D3-11DE-947C-BA5556D89593
- /// </summary>
- function balanceTags(html) {
-
- if (html == "")
- return "";
-
- var re = /<\/?\w+[^>]*(\s|$|>)/g;
- // convert everything to lower case; this makes
- // our case insensitive comparisons easier
- var tags = html.toLowerCase().match(re);
-
- // no HTML tags present? nothing to do; exit now
- var tagcount = (tags || []).length;
- if (tagcount == 0)
- return html;
-
- var tagname, tag;
- var ignoredtags = "<p><img><br><li><hr>";
- var match;
- var tagpaired = [];
- var tagremove = [];
- var needsRemoval = false;
-
- // loop through matched tags in forward order
- for (var ctag = 0; ctag < tagcount; ctag++) {
- tagname = tags[ctag].replace(/<\/?(\w+).*/, "$1");
- // skip any already paired tags
- // and skip tags in our ignore list; assume they're self-closed
- if (tagpaired[ctag] || ignoredtags.search("<" + tagname + ">") > -1)
- continue;
-
- tag = tags[ctag];
- match = -1;
-
- if (!/^<\//.test(tag)) {
- // this is an opening tag
- // search forwards (next tags), look for closing tags
- for (var ntag = ctag + 1; ntag < tagcount; ntag++) {
- if (!tagpaired[ntag] && tags[ntag] == "</" + tagname + ">") {
- match = ntag;
- break;
- }
- }
- }
-
- if (match == -1)
- needsRemoval = tagremove[ctag] = true; // mark for removal
- else
- tagpaired[match] = true; // mark paired
- }
-
- if (!needsRemoval)
- return html;
-
- // delete all orphaned tags from the string
-
- var ctag = 0;
- html = html.replace(re, function (match) {
- var res = tagremove[ctag] ? "" : match;
- ctag++;
- return res;
- });
- return html;
- }
-})();
diff --git a/vendor/assets/javascripts/parse_url.js b/vendor/assets/javascripts/parse_url.js
deleted file mode 100644
index f609c3119..000000000
--- a/vendor/assets/javascripts/parse_url.js
+++ /dev/null
@@ -1,51 +0,0 @@
-function parse_url (str, component) {
- // http://kevin.vanzonneveld.net
- // + original by: Steven Levithan (http://blog.stevenlevithan.com)
- // + reimplemented by: Brett Zamir (http://brett-zamir.me)
- // + input by: Lorenzo Pisani
- // + input by: Tony
- // + improved by: Brett Zamir (http://brett-zamir.me)
- // % note: Based on http://stevenlevithan.com/demo/parseuri/js/assets/parseuri.js
- // % note: blog post at http://blog.stevenlevithan.com/archives/parseuri
- // % note: demo at http://stevenlevithan.com/demo/parseuri/js/assets/parseuri.js
- // % note: Does not replace invalid characters with '_' as in PHP, nor does it return false with
- // % note: a seriously malformed URL.
- // % note: Besides function name, is essentially the same as parseUri as well as our allowing
- // % note: an extra slash after the scheme/protocol (to allow file:/// as in PHP)
- // * example 1: parse_url('http://username:password@hostname/path?arg=value#anchor');
- // * returns 1: {scheme: 'http', host: 'hostname', user: 'username', pass: 'password', path: '/path', query: 'arg=value', fragment: 'anchor'}
- var key = ['source', 'scheme', 'authority', 'userInfo', 'user', 'pass', 'host', 'port',
- 'relative', 'path', 'directory', 'file', 'query', 'fragment'],
- ini = (this.php_js && this.php_js.ini) || {},
- mode = (ini['phpjs.parse_url.mode'] &&
- ini['phpjs.parse_url.mode'].local_value) || 'php',
- parser = {
- php: /^(?:([^:\/?#]+):)?(?:\/\/()(?:(?:()(?:([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?))?()(?:(()(?:(?:[^?#\/]*\/)*)()(?:[^?#]*))(?:\?([^#]*))?(?:#(.*))?)/,
- strict: /^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/,
- loose: /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/\/?)?((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/ // Added one optional slash to post-scheme to catch file:/// (should restrict this)
- };
-
- var m = parser[mode].exec(str),
- uri = {},
- i = 14;
- while (i--) {
- if (m[i]) {
- uri[key[i]] = m[i];
- }
- }
-
- if (component) {
- return uri[component.replace('PHP_URL_', '').toLowerCase()];
- }
- if (mode !== 'php') {
- var name = (ini['phpjs.parse_url.queryKey'] &&
- ini['phpjs.parse_url.queryKey'].local_value) || 'queryKey';
- parser = /(?:^|&)([^&=]*)=?([^&]*)/g;
- uri[name] = {};
- uri[key[12]].replace(parser, function ($0, $1, $2) {
- if ($1) {uri[name][$1] = $2;}
- });
- }
- delete uri.source;
- return uri;
-}
diff --git a/vendor/assets/javascripts/punycode.js b/vendor/assets/javascripts/punycode.js
deleted file mode 100644
index 8688f2efd..000000000
--- a/vendor/assets/javascripts/punycode.js
+++ /dev/null
@@ -1,512 +0,0 @@
-/*! http://mths.be/punycode by @mathias */
-;(function(root) {
-
- /**
- * The `punycode` object.
- * @name punycode
- * @type Object
- */
- var punycode,
-
- /** Detect free variables `define`, `exports`, `module` and `require` */
- freeDefine = typeof define == 'function' && typeof define.amd == 'object' &&
- define.amd && define,
- freeExports = typeof exports == 'object' && exports,
- freeModule = typeof module == 'object' && module,
- freeRequire = typeof require == 'function' && require,
-
- /** Highest positive signed 32-bit float value */
- maxInt = 2147483647, // aka. 0x7FFFFFFF or 2^31-1
-
- /** Bootstring parameters */
- base = 36,
- tMin = 1,
- tMax = 26,
- skew = 38,
- damp = 700,
- initialBias = 72,
- initialN = 128, // 0x80
- delimiter = '-', // '\x2D'
-
- /** Regular expressions */
- regexNonASCII = /[^ -~]/, // unprintable ASCII chars + non-ASCII chars
- regexPunycode = /^xn--/,
-
- /** Error messages */
- errors = {
- 'overflow': 'Overflow: input needs wider integers to process.',
- 'ucs2decode': 'UCS-2(decode): illegal sequence',
- 'ucs2encode': 'UCS-2(encode): illegal value',
- 'not-basic': 'Illegal input >= 0x80 (not a basic code point)',
- 'invalid-input': 'Invalid input'
- },
-
- /** Convenience shortcuts */
- baseMinusTMin = base - tMin,
- floor = Math.floor,
- stringFromCharCode = String.fromCharCode,
-
- /** Temporary variable */
- key;
-
- /*--------------------------------------------------------------------------*/
-
- /**
- * A generic error utility function.
- * @private
- * @param {String} type The error type.
- * @returns {Error} Throws a `RangeError` with the applicable error message.
- */
- function error(type) {
- throw RangeError(errors[type]);
- }
-
- /**
- * A generic `Array#map` utility function.
- * @private
- * @param {Array} array The array to iterate over.
- * @param {Function} callback The function that gets called for every array
- * item.
- * @returns {Array} A new array of values returned by the callback function.
- */
- function map(array, fn) {
- var length = array.length;
- while (length--) {
- array[length] = fn(array[length]);
- }
- return array;
- }
-
- /**
- * A simple `Array#map`-like wrapper to work with domain name strings.
- * @private
- * @param {String} domain The domain name.
- * @param {Function} callback The function that gets called for every
- * character.
- * @returns {Array} A new string of characters returned by the callback
- * function.
- */
- function mapDomain(string, fn) {
- var glue = '.';
- return map(string.split(glue), fn).join(glue);
- }
-
- /**
- * Creates an array containing the decimal code points of each Unicode
- * character in the string. While JavaScript uses UCS-2 internally,
- * this function will convert a pair of surrogate halves (each of which
- * UCS-2 exposes as separate characters) into a single code point,
- * matching UTF-16.
- * @see `punycode.ucs2.encode`
- * @see <http://mathiasbynens.be/notes/javascript-encoding>
- * @memberOf punycode.ucs2
- * @name decode
- * @param {String} string The Unicode input string (UCS-2).
- * @returns {Array} The new array of code points.
- */
- function ucs2decode(string) {
- var output = [],
- counter = 0,
- length = string.length,
- value,
- extra;
- while (counter < length) {
- value = string.charCodeAt(counter++);
- if ((value & 0xF800) == 0xD800) {
- extra = string.charCodeAt(counter++);
- if ((value & 0xFC00) != 0xD800 || (extra & 0xFC00) != 0xDC00) {
- error('ucs2decode');
- }
- value = ((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000;
- }
- output.push(value);
- }
- return output;
- }
-
- /**
- * Creates a string based on an array of decimal code points.
- * @see `punycode.ucs2.decode`
- * @memberOf punycode.ucs2
- * @name encode
- * @param {Array} codePoints The array of decimal code points.
- * @returns {String} The new Unicode string (UCS-2).
- */
- function ucs2encode(array) {
- return map(array, function(value) {
- var output = '';
- if ((value & 0xF800) == 0xD800) {
- error('ucs2encode');
- }
- if (value > 0xFFFF) {
- value -= 0x10000;
- output += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800);
- value = 0xDC00 | value & 0x3FF;
- }
- output += stringFromCharCode(value);
- return output;
- }).join('');
- }
-
- /**
- * Converts a basic code point into a digit/integer.
- * @see `digitToBasic()`
- * @private
- * @param {Number} codePoint The basic (decimal) code point.
- * @returns {Number} The numeric value of a basic code point (for use in
- * representing integers) in the range `0` to `base - 1`, or `base` if
- * the code point does not represent a value.
- */
- function basicToDigit(codePoint) {
- return codePoint - 48 < 10
- ? codePoint - 22
- : codePoint - 65 < 26
- ? codePoint - 65
- : codePoint - 97 < 26
- ? codePoint - 97
- : base;
- }
-
- /**
- * Converts a digit/integer into a basic code point.
- * @see `basicToDigit()`
- * @private
- * @param {Number} digit The numeric value of a basic code point.
- * @returns {Number} The basic code point whose value (when used for
- * representing integers) is `digit`, which needs to be in the range
- * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is
- * used; else, the lowercase form is used. The behavior is undefined
- * if flag is non-zero and `digit` has no uppercase form.
- */
- function digitToBasic(digit, flag) {
- // 0..25 map to ASCII a..z or A..Z
- // 26..35 map to ASCII 0..9
- return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);
- }
-
- /**
- * Bias adaptation function as per section 3.4 of RFC 3492.
- * http://tools.ietf.org/html/rfc3492#section-3.4
- * @private
- */
- function adapt(delta, numPoints, firstTime) {
- var k = 0;
- delta = firstTime ? floor(delta / damp) : delta >> 1;
- delta += floor(delta / numPoints);
- for (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) {
- delta = floor(delta / baseMinusTMin);
- }
- return floor(k + (baseMinusTMin + 1) * delta / (delta + skew));
- }
-
- /**
- * Converts a basic code point to lowercase is `flag` is falsy, or to
- * uppercase if `flag` is truthy. The code point is unchanged if it's
- * caseless. The behavior is undefined if `codePoint` is not a basic code
- * point.
- * @private
- * @param {Number} codePoint The numeric value of a basic code point.
- * @returns {Number} The resulting basic code point.
- */
- function encodeBasic(codePoint, flag) {
- codePoint -= (codePoint - 97 < 26) << 5;
- return codePoint + (!flag && codePoint - 65 < 26) << 5;
- }
-
- /**
- * Converts a Punycode string of ASCII code points to a string of Unicode
- * code points.
- * @memberOf punycode
- * @param {String} input The Punycode string of ASCII code points.
- * @returns {String} The resulting string of Unicode code points.
- */
- function decode(input) {
- // Don't use UCS-2
- var output = [],
- inputLength = input.length,
- out,
- i = 0,
- n = initialN,
- bias = initialBias,
- basic,
- j,
- index,
- oldi,
- w,
- k,
- digit,
- t,
- length,
- /** Cached calculation results */
- baseMinusT;
-
- // Handle the basic code points: let `basic` be the number of input code
- // points before the last delimiter, or `0` if there is none, then copy
- // the first basic code points to the output.
-
- basic = input.lastIndexOf(delimiter);
- if (basic < 0) {
- basic = 0;
- }
-
- for (j = 0; j < basic; ++j) {
- // if it's not a basic code point
- if (input.charCodeAt(j) >= 0x80) {
- error('not-basic');
- }
- output.push(input.charCodeAt(j));
- }
-
- // Main decoding loop: start just after the last delimiter if any basic code
- // points were copied; start at the beginning otherwise.
-
- for (index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) {
-
- // `index` is the index of the next character to be consumed.
- // Decode a generalized variable-length integer into `delta`,
- // which gets added to `i`. The overflow checking is easier
- // if we increase `i` as we go, then subtract off its starting
- // value at the end to obtain `delta`.
- for (oldi = i, w = 1, k = base; /* no condition */; k += base) {
-
- if (index >= inputLength) {
- error('invalid-input');
- }
-
- digit = basicToDigit(input.charCodeAt(index++));
-
- if (digit >= base || digit > floor((maxInt - i) / w)) {
- error('overflow');
- }
-
- i += digit * w;
- t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);
-
- if (digit < t) {
- break;
- }
-
- baseMinusT = base - t;
- if (w > floor(maxInt / baseMinusT)) {
- error('overflow');
- }
-
- w *= baseMinusT;
-
- }
-
- out = output.length + 1;
- bias = adapt(i - oldi, out, oldi == 0);
-
- // `i` was supposed to wrap around from `out` to `0`,
- // incrementing `n` each time, so we'll fix that now:
- if (floor(i / out) > maxInt - n) {
- error('overflow');
- }
-
- n += floor(i / out);
- i %= out;
-
- // Insert `n` at position `i` of the output
- output.splice(i++, 0, n);
-
- }
-
- return ucs2encode(output);
- }
-
- /**
- * Converts a string of Unicode code points to a Punycode string of ASCII
- * code points.
- * @memberOf punycode
- * @param {String} input The string of Unicode code points.
- * @returns {String} The resulting Punycode string of ASCII code points.
- */
- function encode(input) {
- var n,
- delta,
- handledCPCount,
- basicLength,
- bias,
- j,
- m,
- q,
- k,
- t,
- currentValue,
- output = [],
- /** `inputLength` will hold the number of code points in `input`. */
- inputLength,
- /** Cached calculation results */
- handledCPCountPlusOne,
- baseMinusT,
- qMinusT;
-
- // Convert the input in UCS-2 to Unicode
- input = ucs2decode(input);
-
- // Cache the length
- inputLength = input.length;
-
- // Initialize the state
- n = initialN;
- delta = 0;
- bias = initialBias;
-
- // Handle the basic code points
- for (j = 0; j < inputLength; ++j) {
- currentValue = input[j];
- if (currentValue < 0x80) {
- output.push(stringFromCharCode(currentValue));
- }
- }
-
- handledCPCount = basicLength = output.length;
-
- // `handledCPCount` is the number of code points that have been handled;
- // `basicLength` is the number of basic code points.
-
- // Finish the basic string - if it is not empty - with a delimiter
- if (basicLength) {
- output.push(delimiter);
- }
-
- // Main encoding loop:
- while (handledCPCount < inputLength) {
-
- // All non-basic code points < n have been handled already. Find the next
- // larger one:
- for (m = maxInt, j = 0; j < inputLength; ++j) {
- currentValue = input[j];
- if (currentValue >= n && currentValue < m) {
- m = currentValue;
- }
- }
-
- // Increase `delta` enough to advance the decoder's <n,i> state to <m,0>,
- // but guard against overflow
- handledCPCountPlusOne = handledCPCount + 1;
- if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {
- error('overflow');
- }
-
- delta += (m - n) * handledCPCountPlusOne;
- n = m;
-
- for (j = 0; j < inputLength; ++j) {
- currentValue = input[j];
-
- if (currentValue < n && ++delta > maxInt) {
- error('overflow');
- }
-
- if (currentValue == n) {
- // Represent delta as a generalized variable-length integer
- for (q = delta, k = base; /* no condition */; k += base) {
- t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);
- if (q < t) {
- break;
- }
- qMinusT = q - t;
- baseMinusT = base - t;
- output.push(
- stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0))
- );
- q = floor(qMinusT / baseMinusT);
- }
-
- output.push(stringFromCharCode(digitToBasic(q, 0)));
- bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);
- delta = 0;
- ++handledCPCount;
- }
- }
-
- ++delta;
- ++n;
-
- }
- return output.join('');
- }
-
- /**
- * Converts a Punycode string representing a domain name to Unicode. Only the
- * Punycoded parts of the domain name will be converted, i.e. it doesn't
- * matter if you call it on a string that has already been converted to
- * Unicode.
- * @memberOf punycode
- * @param {String} domain The Punycode domain name to convert to Unicode.
- * @returns {String} The Unicode representation of the given Punycode
- * string.
- */
- function toUnicode(domain) {
- return mapDomain(domain, function(string) {
- return regexPunycode.test(string)
- ? decode(string.slice(4).toLowerCase())
- : string;
- });
- }
-
- /**
- * Converts a Unicode string representing a domain name to Punycode. Only the
- * non-ASCII parts of the domain name will be converted, i.e. it doesn't
- * matter if you call it with a domain that's already in ASCII.
- * @memberOf punycode
- * @param {String} domain The domain name to convert, as a Unicode string.
- * @returns {String} The Punycode representation of the given domain name.
- */
- function toASCII(domain) {
- return mapDomain(domain, function(string) {
- return regexNonASCII.test(string)
- ? 'xn--' + encode(string)
- : string;
- });
- }
-
- /*--------------------------------------------------------------------------*/
-
- /** Define the public API */
- punycode = {
- /**
- * A string representing the current Punycode.js version number.
- * @memberOf punycode
- * @type String
- */
- 'version': '1.0.0',
- /**
- * An object of methods to convert from JavaScript's internal character
- * representation (UCS-2) to decimal Unicode code points, and back.
- * @see <http://mathiasbynens.be/notes/javascript-encoding>
- * @memberOf punycode
- * @type Object
- */
- 'ucs2': {
- 'decode': ucs2decode,
- 'encode': ucs2encode
- },
- 'decode': decode,
- 'encode': encode,
- 'toASCII': toASCII,
- 'toUnicode': toUnicode
- };
-
- /** Expose `punycode` */
- if (freeExports) {
- if (freeModule && freeModule.exports == freeExports) {
- // in Node.js or Ringo 0.8+
- freeModule.exports = punycode;
- } else {
- // in Narwhal or Ringo 0.7-
- for (key in punycode) {
- punycode.hasOwnProperty(key) && (freeExports[key] = punycode[key]);
- }
- }
- } else if (freeDefine) {
- // via curl.js or RequireJS
- define('punycode', punycode);
- } else {
- // in a browser or Rhino
- root.punycode = punycode;
- }
-
-}(this)); \ No newline at end of file