radiant-reader-extension 3.0.0.rc4 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (100) hide show
  1. data/README.md +105 -38
  2. data/Rakefile +4 -4
  3. data/app/controllers/accounts_controller.rb +24 -11
  4. data/app/controllers/admin/groups_controller.rb +15 -0
  5. data/app/controllers/admin/memberships_controller.rb +13 -7
  6. data/app/controllers/admin/messages_controller.rb +1 -0
  7. data/app/controllers/admin/permissions_controller.rb +15 -8
  8. data/app/controllers/groups_controller.rb +6 -4
  9. data/app/controllers/password_resets_controller.rb +1 -1
  10. data/app/controllers/reader_action_controller.rb +7 -51
  11. data/app/controllers/reader_sessions_controller.rb +9 -11
  12. data/app/helpers/reader_helper.rb +23 -3
  13. data/app/models/group.rb +45 -16
  14. data/app/models/message.rb +4 -11
  15. data/app/models/permission.rb +4 -0
  16. data/app/models/reader.rb +61 -26
  17. data/app/models/reader_notifier.rb +2 -2
  18. data/app/models/reader_page.rb +9 -5
  19. data/app/views/accounts/{_memberships.html.haml → _choose_memberships.html.haml} +0 -0
  20. data/app/views/accounts/_form.html.haml +9 -11
  21. data/app/views/accounts/_preamble.html.haml +14 -0
  22. data/app/views/accounts/_profile_form.html.haml +13 -29
  23. data/app/views/accounts/dashboard.html.haml +0 -1
  24. data/app/views/accounts/edit.html.haml +3 -3
  25. data/app/views/accounts/edit_profile.html.haml +10 -10
  26. data/app/views/admin/groups/_chooser.html.haml +8 -0
  27. data/app/views/admin/groups/_form.html.haml +7 -5
  28. data/app/views/admin/groups/_group.html.haml +29 -0
  29. data/app/views/admin/groups/index.html.haml +2 -28
  30. data/app/views/admin/groups/show.html.haml +3 -2
  31. data/app/views/admin/memberships/_reader.html.haml +2 -6
  32. data/app/views/admin/messages/_form.html.haml +10 -11
  33. data/app/views/admin/messages/_list_function.haml +2 -3
  34. data/app/views/admin/messages/{index.haml → index.html.haml} +21 -11
  35. data/app/views/admin/pages/_page_groups.html.haml +5 -11
  36. data/app/views/admin/permissions/_page.html.haml +6 -12
  37. data/app/views/admin/reader_configuration/edit.html.haml +2 -0
  38. data/app/views/admin/reader_configuration/show.html.haml +2 -0
  39. data/app/views/groups/_group.html.haml +12 -0
  40. data/app/views/groups/show.html.haml +10 -3
  41. data/app/views/readers/_description.html.haml +3 -0
  42. data/app/views/readers/_groups.html.haml +9 -0
  43. data/app/views/{accounts → readers}/_links.html.haml +2 -2
  44. data/app/views/readers/_list.html.haml +23 -0
  45. data/app/views/{accounts/_groups.html.haml → readers/_memberships.html.haml} +0 -1
  46. data/app/views/{accounts/_reader.html.haml → readers/_mugshot.html.haml} +1 -1
  47. data/app/views/readers/_people.html.haml +6 -0
  48. data/app/views/readers/_profile.html.haml +30 -0
  49. data/app/views/readers/_reader.html.haml +28 -0
  50. data/app/views/readers/index.html.haml +20 -0
  51. data/app/views/{accounts → readers}/show.html.haml +1 -2
  52. data/app/views/shared/_standard_reader_parts.html.haml +1 -1
  53. data/app/views/shared/not_allowed.html.haml +16 -0
  54. data/config/initializers/formats.rb +1 -2
  55. data/config/initializers/radiant_config.rb +5 -2
  56. data/config/locales/en.yml +181 -140
  57. data/config/routes.rb +25 -16
  58. data/db/migrate/001_create_readers.rb +0 -1
  59. data/db/migrate/20090921125653_reader_messages.rb +0 -1
  60. data/db/migrate/20090921125654_group_messages.rb +0 -1
  61. data/db/migrate/20110812111934_groups_nested_set.rb +19 -0
  62. data/db/migrate/20110814070858_message_has_many_groups.rb +14 -0
  63. data/db/migrate/20110905194602_group_ancestry.rb +23 -0
  64. data/lib/controller_extensions.rb +49 -0
  65. data/lib/grouped_model.rb +49 -8
  66. data/lib/grouped_page.rb +17 -5
  67. data/lib/message_tags.rb +21 -3
  68. data/lib/radiant-reader-extension.rb +1 -1
  69. data/lib/reader_admin_ui.rb +7 -8
  70. data/lib/reader_tags.rb +1 -1
  71. data/lib/site_controller_extensions.rb +7 -18
  72. data/public/images/furniture/csv.png +0 -0
  73. data/public/images/furniture/csv_tiny.png +0 -0
  74. data/public/images/furniture/vcard.png +0 -0
  75. data/public/images/furniture/vcard_tiny.png +0 -0
  76. data/public/javascripts/admin/reader.js +22 -1
  77. data/public/stylesheets/sass/admin/reader_group.sass +23 -22
  78. data/public/stylesheets/sass/reader.sass +81 -17
  79. data/radiant-reader-extension.gemspec +3 -1
  80. data/reader_extension.rb +7 -9
  81. data/spec/controllers/accounts_controller_spec.rb +8 -22
  82. data/spec/controllers/admin/messages_controller_spec.rb +0 -12
  83. data/spec/datasets/readers_dataset.rb +41 -38
  84. data/spec/lib/reader_tags_spec.rb +1 -1
  85. data/spec/models/group_spec.rb +89 -22
  86. data/spec/models/message_spec.rb +1 -1
  87. data/spec/models/reader_notifier_spec.rb +1 -1
  88. data/spec/models/reader_page_spec.rb +34 -18
  89. data/spec/models/reader_spec.rb +0 -1
  90. data/spec/spec.opts +4 -3
  91. metadata +51 -28
  92. data/app/views/accounts/_contributions.html.haml +0 -2
  93. data/app/views/accounts/_description.html.haml +0 -2
  94. data/app/views/accounts/_list.html.haml +0 -17
  95. data/app/views/accounts/_profile.html.haml +0 -29
  96. data/app/views/accounts/index.html.haml +0 -23
  97. data/app/views/groups/_all.html.haml +0 -10
  98. data/app/views/site/not_allowed.html.haml +0 -4
  99. data/db/migrate/20100922152338_lock_versions.rb +0 -9
  100. data/db/migrate/20101004074945_unlock_version.rb +0 -9
@@ -7,11 +7,21 @@
7
7
  %tr
8
8
  - render_region :thead do |thead|
9
9
  - thead.subject_header do
10
- %th.message Subject
10
+ %th.message
11
+ = t('reader_extension.subject')
12
+ - thead.function_header do
13
+ %th.message_function
14
+ = t('reader_extension.function')
15
+ - thead.groups_header do
16
+ %th.message_groups
17
+ = t('reader_extension.groups')
11
18
  - thead.sent_header do
12
- %th.message_sent Delivery status
19
+ %th.message_sent
20
+ = t('reader_extension.delivery_status')
13
21
  - thead.modify_header do
14
- %th.modify Modify
22
+ %th.modify
23
+ = t('modify')
24
+
15
25
  %tbody
16
26
  - @messages.each do |message|
17
27
  %tr
@@ -19,14 +29,14 @@
19
29
  - tbody.subject_cell do
20
30
  %td.name
21
31
  = link_to message.subject, admin_message_url(message), :class => message.has_function? ? "functional" : "normal"
22
- %span.function
23
- - if message.administrative?
24
- = t("message_functions.#{message.function}")
25
- - else
26
- = t("message_functions.ad_hoc")
27
- - if message.group
28
- = t('reader_extension.for')
29
- = link_to message.group.name, admin_group_url(message.group)
32
+ - tbody.function_cell do
33
+ %td.message_function
34
+ - if message.administrative?
35
+ = t("message_functions.#{message.function}")
36
+ - tbody.groups_cell do
37
+ %td.message_groups
38
+ - if message.groups.any?
39
+ = message.groups.map(&:name).to_sentence
30
40
 
31
41
  - tbody.sent_cell do
32
42
  %td.message_sent
@@ -1,13 +1,7 @@
1
1
  - groups = Group.find(:all)
2
2
  - if groups.any?
3
- .set
4
- %p
5
- = t('reader_extension.permitted_groups')
6
- - groups.each do |group|
7
- = check_box_tag "page[group_ids][]", group.id, @page.has_inherited_group?(group), :id => "page_group_#{group.id}", :disabled => @page.group_is_inherited?(group)
8
- - if @page.group_is_inherited?(group)
9
- %label.checkbox{:for => "page_group_#{group.id}", :class => 'disabled', :title => t('reader_extension.inherited_group')}
10
- = group.name
11
- - else
12
- %label.checkbox{:for => "page_group_#{group.id}"}
13
- = group.name
3
+ %p
4
+ = t('reader_extension.permitted_groups')
5
+ %br
6
+ - fields_for @page do |f|
7
+ = render :partial => 'admin/groups/chooser', :locals => {:f => f}
@@ -1,24 +1,18 @@
1
1
  - page ||= @page
2
2
  - group ||= @group
3
3
 
4
- - liclass = 'loose'
5
- - liclass = 'attached' if page.has_group?(group)
6
- - liclass = 'inherited' if page.group_is_inherited?(group)
7
4
 
8
- - if permission = group.permission_for(page)
9
- %li{:class => "fake_checkbox checked", :id => "page_#{page.id}"}
10
- = link_to_remote page.title, :url => admin_group_permission_url(group, permission), :method => 'delete', :loading => "$('page_#{page.id}').addClassName('waiting')", :update => "page_holder_#{page.id}"
11
-
12
- - elsif page.has_inherited_group?(group)
13
- %li{:class => "fake_checkbox inherited", :id => "page_#{page.id}"}
5
+ - if page.has_inherited_group?(group)
6
+ %span{:class => "fake_checkbox inherited"}
14
7
  = page.title
15
8
 
16
9
  - else
17
- %li{:class => "fake_checkbox unchecked", :id => "page_#{page.id}"}
18
- = link_to_remote page.title, :url => admin_group_permissions_url(group, :page_id => page.id), :loading => "$('page_#{page.id}').addClassName('waiting')", :update => "page_holder_#{page.id}"
10
+ - cssclass = "fake_checkbox"
11
+ - cssclass << ' checked' if page.has_group?(group)
12
+ = link_to page.title, admin_toggle_group_permission_url(:group_id => group.id, :page_id => page.id), {:class => cssclass, :id => "toggle_page_#{page.id}"}
19
13
 
20
14
  - if page.children.any?
21
15
  %ul
22
16
  - page.children.each do |child|
23
- %div{:id => "page_holder_#{child.id}"}
17
+ %li{:id => "page_holder_#{child.id}"}
24
18
  = render :partial => 'admin/permissions/page', :object => child
@@ -16,6 +16,8 @@
16
16
  = edit_config('reader.allow_registration?')
17
17
  %p
18
18
  = edit_config('reader.require_confirmation?')
19
+ %p
20
+ = edit_config 'reader.directory_visibility'
19
21
  %p
20
22
  = edit_config('reader.get_profile?')
21
23
  %p
@@ -12,6 +12,8 @@
12
12
  = show_config 'reader.allow_registration?'
13
13
  %p.ruled
14
14
  = show_config 'reader.require_confirmation?'
15
+ %p.ruled
16
+ = show_config 'reader.directory_visibility'
15
17
  %p.ruled
16
18
  = show_config 'reader.get_profile?'
17
19
  %p.ruled
@@ -0,0 +1,12 @@
1
+ .group
2
+ %h3
3
+ = link_to group.name, group_url(group)
4
+
5
+ %p.context
6
+ = t("reader_extension.member_count", :count => group.readers.count) + '.'
7
+ = link_to t('reader_extension.directory.vcard_link'), group_url(group, :format => :vcard), :class => 'vcard'
8
+ = link_to t('reader_extension.directory.csv_link'), group_url(group, :format => :csv), :class => 'csv'
9
+
10
+ - if group.description
11
+ %p
12
+ = group.description
@@ -1,6 +1,11 @@
1
1
  - content_for :breadhead do
2
+ = link_to t('reader_extension.readers_title').titlecase, reader_index_url
3
+ = t('reader_extension.separator')
2
4
  = link_to t('reader_extension.groups').titlecase, groups_url
3
5
  = t('reader_extension.separator')
6
+ - if @group.parent
7
+ = link_to @group.parent.name, group_url(@group.parent)
8
+ = t('reader_extension.separator')
4
9
 
5
10
  - content_for :title do
6
11
  = @group.name
@@ -22,10 +27,12 @@
22
27
  = t('or')
23
28
  = link_to t("reader_extension.vcard_file"), group_url(@group, :format => :vcard), :class => 'vcard'
24
29
 
25
- %h3
26
- = t('reader_extension.group_members')
30
+ - if @group.children.any?
31
+ %h2
32
+ = t('reader_extension.subgroups', :name => @group.name)
33
+ = render :partial => 'groups/group', :collection => @group.children
27
34
 
28
- = render :partial => 'accounts/list', :readers => @readers
35
+ = render :partial => 'readers/people', :readers => @readers
29
36
 
30
37
  = yield :main
31
38
 
@@ -0,0 +1,3 @@
1
+ - reader ||= @reader
2
+ - unless reader.description.blank?
3
+ = clean_html(reader.description)
@@ -0,0 +1,9 @@
1
+ - groups ||= @groups
2
+
3
+ %h2
4
+ = t('reader_extension.groups')
5
+ - if groups.any?
6
+ = render :partial => 'groups/group', :collection => groups
7
+ - else
8
+ %p
9
+ = t('reader_extension.no_groups')
@@ -4,9 +4,9 @@
4
4
  %li
5
5
  = link_to t("reader_extension.directory.link"), readers_url
6
6
  %li
7
- = link_to t("reader_extension.directory.csv_link"), readers_url(:format => :csv)
7
+ = link_to t("reader_extension.directory.csv_link"), readers_url(:format => :csv), :class => 'csv'
8
8
  %li
9
9
  = link_to t("reader_extension.directory.vcard_link"), readers_url(:format => :vcard), :class => 'vcard'
10
10
  - Group.visible_to(current_reader).each do |group|
11
11
  %li
12
- = link_to_group(group)
12
+ = link_to_group(group) + ' ' + t('group')
@@ -0,0 +1,23 @@
1
+ - readers ||= []
2
+
3
+ - if readers.any?
4
+ - if readers.respond_to?(:previous_page) && readers.previous_page
5
+ = pagination_and_summary_for(readers, t('reader_extension.person'))
6
+
7
+ - if @display == 'gallery'
8
+ - if readers.size > 1
9
+ - cols = 3
10
+ - columns = readers.in_groups_of((readers.size / cols), false)
11
+ - else
12
+ - columns = [readers]
13
+ - columns.each do |column|
14
+ %div.column
15
+ = render :partial => 'readers/mugshot', :collection => column
16
+
17
+ - else
18
+ %table.readers
19
+ %tbody
20
+ = render :partial => 'readers/reader', :collection => readers
21
+
22
+ - if readers.respond_to?(:next_page) && readers.next_page
23
+ = pagination_and_summary_for(readers, t('reader_extension.person'))
@@ -1,5 +1,4 @@
1
1
  - reader ||= @reader
2
-
3
2
  - groups = reader.groups.visible_to(current_reader)
4
3
  - if groups.any?
5
4
  %ul.groups
@@ -1,6 +1,6 @@
1
1
  .reader
2
2
  %h2
3
- = link_to standard_gravatar_for(reader), reader_url(reader), {:title => reader.name}
3
+ = link_to gravatar_for(reader, :size => 128), reader_url(reader), :title => reader.name
4
4
  = link_to reader.name, reader_url(reader)
5
5
  %span.headernote
6
6
  = link_to '&nbsp;', reader_url(reader, :format => :vcard), :class => 'vcard'
@@ -0,0 +1,6 @@
1
+ - readers ||= @readers
2
+
3
+ %h2
4
+ = t('reader_extension.people').titlecase
5
+
6
+ = render :partial => 'readers/list', :locals => {:readers => readers}
@@ -0,0 +1,30 @@
1
+ - if Radiant.config['reader.share_details?']
2
+ - reader ||= @reader
3
+
4
+ - if reader.unshareable?
5
+ - if reader == current_reader
6
+ %p.warning
7
+ = t('reader_extension.you_are_not_shared')
8
+ - else
9
+ %div.contact
10
+ %h3
11
+ = link_to reader.name, reader_url(reader, :format => :vcard), :class => 'vcard', :title => t('reader_extension.directory.vcard_link')
12
+ %ul
13
+ - if email = reader.email
14
+ %li
15
+ = t("reader_extension.directory.email") + ': '
16
+ = email_link email
17
+ - %w{phone mobile}.each do |field|
18
+ - if value = reader.send(field.to_sym)
19
+ %li
20
+ = t("reader_extension.directory.#{field}") + ': '
21
+ = value
22
+ - if reader.postal_address?
23
+ %li
24
+ %span.indent
25
+ = t("reader_extension.directory.postal_address") + ': '
26
+ = reader.postal_address.to_html
27
+ - if reader == current_reader
28
+ %li
29
+ = link_to t("reader_extension.edit_profile"), reader_edit_profile_url, :class => 'edit'
30
+
@@ -0,0 +1,28 @@
1
+ %tr.reader
2
+ - if reader.unshareable?
3
+ %td{:colspan => 7}
4
+ = t("reader_extension.listing_denied")
5
+ - else
6
+ %td.gravatar
7
+ = link_to gravatar_for(reader, {:size => 18}, {:class => 'gravatar'}), reader_url(reader), :title => reader.name
8
+ %td.name
9
+ %h3
10
+ = link_to reader.name, reader_url(reader)
11
+ %td.email
12
+ %p
13
+ = mail_to reader.email, nil, :encode => 'hex', :replace_at => " #{t('reader_extension.at')} "
14
+
15
+ - [:phone, :mobile].each do |field|
16
+ - value = reader.send(field)
17
+ - unless value.blank?
18
+ %td{:class => field.to_s}
19
+ %p
20
+ = value
21
+ - else
22
+ %td.missing
23
+ %p
24
+ = t("reader_extension.no_#{field}")
25
+
26
+ %td.vcard
27
+ %p
28
+ = link_to t('reader_extension.vcard'), reader_url(reader, :format => :vcard), :class => 'vcard'
@@ -0,0 +1,20 @@
1
+ - content_for :introduction do
2
+ %p
3
+ = t("reader_extension.readers_introduction_#{Radiant.config['reader.directory_visibility']}")
4
+ - if current_reader && Radiant.config['reader.directory_visibility'] != 'none'
5
+ = t("reader_extension.readers_introduction_edit", :url => reader_edit_profile_url)
6
+
7
+ - content_for :breadcrumbs do
8
+ = link_to t('reader_extension.home').titlecase, '/'
9
+ = t('reader_extension.separator')
10
+ = t('reader_extension.people').titlecase
11
+
12
+ - content_for :title do
13
+ = t('reader_extension.readers_title').titlecase
14
+
15
+ = render :partial => 'shared/standard_reader_parts'
16
+
17
+ - content_for :main do
18
+ = render_region :main
19
+
20
+ = yield :main
@@ -1,5 +1,5 @@
1
1
  - content_for :breadhead do
2
- = link_to t('reader_extension.readers').titlecase, readers_url
2
+ = link_to t('reader_extension.readers').titlecase, reader_index_url
3
3
  = t('reader_extension.separator')
4
4
 
5
5
  - content_for :title do
@@ -18,6 +18,5 @@
18
18
  - content_for :main do
19
19
  - render_region :main
20
20
 
21
-
22
21
  = yield :main
23
22
 
@@ -6,7 +6,7 @@
6
6
  = link_to t('reader_extension.navigation.readers'), readers_url, :class => 'section'
7
7
  - if current_reader
8
8
  = link_to t('reader_extension.navigation.dashboard'), reader_dashboard_url
9
- = link_to t('reader_extension.navigation.directory'), readers_url
9
+ = link_to t('reader_extension.navigation.directory'), reader_index_url
10
10
  = link_to t('reader_extension.navigation.profile'), reader_profile_url
11
11
  = link_to t('reader_extension.navigation.account'), reader_account_url
12
12
  = link_to t('reader_extension.navigation.log_out'), reader_logout_url
@@ -0,0 +1,16 @@
1
+ - content_for :title do
2
+ = t('reader_extension.access_denied')
3
+
4
+ = render :partial => 'shared/standard_reader_parts'
5
+
6
+ - content_for :main do
7
+ %p
8
+ = t('reader_extension.explain_access_error')
9
+
10
+ %p.exception
11
+ = @message
12
+
13
+ %p
14
+ = t('reader_extension.mistaken_access_error')
15
+
16
+ = yield :main
@@ -1,2 +1 @@
1
- Mime::Type.register "text/x-vcard", :vcard
2
- Mime::Type.register "text/csv", :csv
1
+ Mime::Type.register "text/x-vcard", :vcard unless Mime::Type.lookup(:vcard)
@@ -5,12 +5,15 @@ Radiant.config do |config|
5
5
  reader.define 'layout', :select_from => lambda { Layout.all.map(&:name) }, :allow_blank => false
6
6
  reader.define 'get_profile?', :default => true
7
7
  reader.define 'public?', :default => false
8
- reader.define 'confine_to_groups?', :default => false
8
+ reader.define 'directory_visibility', :select_from => %w{public private grouped none}, :allow_blank => false, :default => 'private'
9
9
  reader.define 'share_details?', :default => false
10
+ reader.define 'profiles_path', :default => ""
11
+ reader.define 'preferences_path', :default => ""
12
+ reader.define 'login_to', :default => "dashboard"
10
13
  end
11
14
  config.namespace('email') do |email|
12
15
  email.define 'layout', :select_from => lambda { Layout.all.map(&:name) }, :allow_blank => true
13
16
  email.define 'name', :allow_blank => false
14
- email.define 'address', :allow_blank => false
17
+ email.define 'address', :allow_blank => false
15
18
  end
16
19
  end
@@ -1,38 +1,41 @@
1
1
  en:
2
2
  activerecord:
3
3
  attributes:
4
+ group:
5
+ name: "Name"
6
+ description: "Description"
7
+ parent_id: "Subgroup of"
8
+ homepage_id: "Group home page"
4
9
  reader:
5
- description: "Biog"
10
+ description: "Biog or remarks"
6
11
  email: "Email address"
7
- phone: "Home phone"
8
- mobile: "Mobile phone"
9
12
  forename: "Forename"
10
13
  honorific: "Title or rank"
11
14
  login: "Login username"
15
+ mobile: "Mobile phone"
12
16
  name: "Your name"
13
17
  password: "Password"
14
18
  password_confirmation: "Confirm password"
15
- postal_address: "Postal address"
16
- post_organisation: "Organisation"
19
+ phone: "Home phone"
20
+ post_city: "City or town"
21
+ post_country: "Country"
17
22
  post_line1: "Building name or number"
18
23
  post_line2: "Street"
19
- post_city: "City or town"
24
+ post_organisation: "Organisation"
20
25
  post_province: "County"
21
- post_country: "Country"
26
+ postal_address: "Postal address"
22
27
  postcode: "Postcode"
23
28
  surname: "Surname"
24
29
  unshareable: "Share none of this information"
25
30
  message:
26
- subject: "Message Subject"
27
- filter_id: "Filter"
28
31
  body: "Message body"
32
+ filter_id: "Filter"
33
+ subject: "Message Subject"
34
+ group_ids: "Groups"
29
35
  errors:
30
36
  models:
31
37
  reader:
32
38
  attributes:
33
- name:
34
- blank: "please enter a name"
35
- too_long: "this is too long: 100 characters max"
36
39
  email:
37
40
  blank: "please enter your email address"
38
41
  invalid: "this doesn't look like an email address"
@@ -40,54 +43,66 @@ en:
40
43
  taken_by_author: "this address belongs to an author here. You don't need to register here: just log in to admin."
41
44
  login:
42
45
  taken: "this login is already in use here"
46
+ name:
47
+ blank: "please enter a name"
48
+ too_long: "this is too long: 100 characters max"
43
49
  password:
44
50
  too_short: "this must have at least six characters"
45
51
  invalid: "this must include at least one non-letter"
46
52
  config:
47
53
  reader:
48
54
  allow_registration?: "Allow registration"
49
- require_confirmation?: "Confirm email addresses"
50
- use_honorifics?: "Use honorifics"
51
- layout: "Layout for forms"
55
+ directory_visibility: "Access to directory"
52
56
  get_profile?: "Ask for profile text"
57
+ layout: "Layout for forms"
53
58
  public?: "Readers list public"
54
- confine_to_groups?: "Show only members of shared groups"
59
+ require_confirmation?: "Confirm email addresses"
60
+ use_honorifics?: "Use honorifics"
55
61
  email:
56
- name: "Message sender"
57
62
  address: "Message reply-to"
58
- prefix: "Subject prefix"
59
63
  layout: "Email layout"
60
- reader: "Reader"
61
- readers: "Readers"
64
+ name: "Message sender"
65
+ prefix: "Subject prefix"
66
+ group: "group"
62
67
  groups: "Groups"
63
- messages: "Messages"
64
- settings: "Settings"
68
+ message: "message"
65
69
  message_functions:
66
70
  activation: "Activation instructions"
67
71
  ad_hoc: "Ad hoc message"
68
- invitation: "Invitation"
69
- group_welcome: "Group welcome"
70
72
  group_invitation: "Group invitation"
73
+ group_welcome: "Group welcome"
74
+ invitation: "Invitation"
71
75
  password_reset: "Password instructions"
72
76
  welcome: "Registration complete"
77
+ messages: "Messages"
78
+ reader: "reader"
73
79
  reader_extension:
74
- access_denied: "Access denied"
80
+ access_denied: "Not allowed!"
75
81
  account_settings: "Account settings"
76
82
  account_updated: "Your account has been updated"
77
83
  activate_account: "Activate your account"
78
84
  activation_complete: "Thank you very much for persevering with the registration process. Your account is now active."
79
85
  activation_message_sent: "Account activation instructions have been emailed to you."
80
86
  activation_required: "Please check your email for an activation message"
81
- activation_required_header: "Please check your email"
82
87
  activation_required_explanation: "You should have received a confirmation message containing a link that will activate your account."
88
+ activation_required_header: "Please check your email"
83
89
  activation_sent: "Activation message sent"
90
+ add_members: "add members"
91
+ add_subgroup: "add subgroup"
92
+ admin_messages: "Administrative messages"
84
93
  affected_fields_highlighted: "The affected fields are highlighted below."
85
94
  all: "All"
86
95
  all_deliveries_failed: "All deliveries failed"
96
+ all_in_group: "Everyone in the group"
97
+ allowed_groups: "Allow access only to:"
87
98
  already_active: "Your account is already active."
88
99
  already_logged_in: "You're already logged in!"
89
100
  already_registered: "If you've already registered, you should only need to"
90
101
  and_try_again: "and try again."
102
+ any_option: "<any>"
103
+ at: "at"
104
+ belongs_to_group: 'This message belongs to the <a href="%{href}">%{name}</a> group.'
105
+ belongs_to_these_groups: "This message is sent to these groups:"
91
106
  bold_required: "Fields with bold headings are required and will cause grumbling if left blank."
92
107
  but_not_active: 'but your account is not yet activated. Please check your email for our activation message.'
93
108
  cancel: "cancel"
@@ -96,8 +111,10 @@ en:
96
111
  change_gravatar: "change gravatar image"
97
112
  change_password: "Change your password"
98
113
  check_email: "Please check your email for an activation message"
114
+ check_invitation_list: "Check the invitation list"
115
+ check_invitation_message: "Preview invitation message"
99
116
  check_vcard: "Check your contact card"
100
- checked_fields_public: "Uncheck any field (by clicking on the green tick) that you do not want to publish."
117
+ checked_fields_public: "Uncheck any field (by clicking on the green tick) that you do not want to make visible to other members."
101
118
  checked_fields_uncheck: "Click on the arrow to make that field private."
102
119
  confirm_new_password: "Confirm new password"
103
120
  confirm_password: "Confirm password"
@@ -108,69 +125,111 @@ en:
108
125
  zero: "(nobody)"
109
126
  one: "(one person)"
110
127
  other: "(%{count} people)"
128
+ create_account: "Register"
129
+ create_group_invitation: "Create group invitation message"
130
+ create_group_welcome: "Create group welcome message"
131
+ create_invitation: "create invitation"
132
+ create_invitation_message: "create invitation message"
133
+ create_message: "Create new message"
111
134
  create_message: "create message"
112
- csv_file: "a csv file"
135
+ create_new_message: "Send a new message"
136
+ create_welcome: "create welcome"
137
+ csv_file: "CSV data"
113
138
  dashboard:
139
+ account: "Account settings"
114
140
  directory: "Directory"
115
141
  edit_profile: "Edit profile"
116
- profile: "Your page"
117
- account: "Account settings"
118
- listing: "Directory listing"
119
- introduction: "Hello %{name}. Welcome back to %{site}. This page gathers together recent activity, useful links and bits of administration. You can always get back here by clicking on a 'dashboard' link."
120
- welcome: "Hello %{name}. Welcome to %{site} and thank you for persevering with the registration process. Your account is now active and this is your (empty) dashboard page."
121
142
  groups: "Your groups"
143
+ introduction: "Hello %{name}. Welcome back to %{site}. This page gathers together recent activity, useful links and bits of administration. You can always get back here by clicking on a 'dashboard' link."
144
+ listing: "Directory listing"
122
145
  messages: "Messages for you"
146
+ profile: "Your page"
123
147
  title: "Welcome"
148
+ welcome: "Hello %{name}. Welcome to %{site} and thank you for persevering with the registration process. Your account is now active and this is your (empty) dashboard page."
149
+ delete_group: "delete group"
150
+ delete_message: "Delete message"
151
+ delete_message: "delete message"
152
+ delete_reader: "delete reader"
153
+ delivery_status: "Delivery"
124
154
  directory:
125
- name: "Full name"
126
155
  contact: "Contact"
127
- profile: "Profile"
156
+ csv_link: "Download CSV data"
128
157
  email: "Email"
129
- phone: "Telephone"
158
+ groups: "Groups"
159
+ link: "Browse members list"
130
160
  mobile: "Mobile"
161
+ name: "Full name"
162
+ phone: "Telephone"
131
163
  postal_address: "Address"
132
- link: "Browse members list"
164
+ profile: "Profile"
133
165
  title: "Directory"
134
- csv_link: "Download as CSV file"
135
- vcard_link: "Download to your address book"
136
- groups: "Groups"
166
+ vcard_link: "Download address book file"
137
167
  dont_fill: "Don't fill this in!"
138
168
  download_as: "Download as"
139
169
  download_group_as: "Download the whole group as"
170
+ download_vcard: "Download vcard"
171
+ edit_group: "edit group"
172
+ edit_message: "Edit message"
140
173
  edit_profile: "Edit your profile"
174
+ email: "email"
141
175
  email_unknown: "Sorry. That email address is not known here."
142
176
  enter_code: "Please enter confirmation code"
143
177
  enter_email_for_reminder: "enter your email address and we will send the message again"
178
+ everyone: "Everyone"
144
179
  everyone_in_group: "Everyone in the group"
180
+ everyone_inactive: "Anyone who has not activated their account"
181
+ everyone_unsent: "Anyone who has not received this message"
182
+ explain_access_error: "Sorry: you have run into a barrier and are not allowed to do whatever it was you just tried to do. The error message was:"
183
+ for: 'for'
184
+ for_group: "for the %{name} group"
185
+ for_the_groups:
186
+ zero: "without group links"
187
+ one: "for the %{names} group"
188
+ other: "for the %{names} groups"
145
189
  forgotten_password: "Forgotten your password?"
146
190
  form_notes:
147
191
  account:
148
- description: "you can fill this in later. Textile formatting is allowed."
192
+ description: "This appears at the top of your profile page."
149
193
  email: "we will send activation instructions to this address"
150
194
  existing_password: "leave blank to keep present password. If changing, at least four characters."
195
+ honorific: "this is prepended to your name but only in a formal setting"
151
196
  login: "you can always use your email address instead"
197
+ mobile: "without country code"
152
198
  name: "this is how you will be referred to on the site"
153
199
  new_password: "at least six characters, please, and with at least one non-letter character"
154
- honorific: "this is prepended to your name but only in a formal setting"
200
+ phone: "with area code but no country code"
155
201
  post_country: "Please choose from the list"
156
202
  post_organisation: "You can omit this unless it's part of your postal address"
157
- unshareable: "to keep one field private, uncheck it above. To keep all your contact information private and receive only administrative messages, check this box."
158
- phone: "with area code but no country code"
159
- mobile: "without country code"
203
+ unshareable: "To keep your contact information private and receive only administrative messages, check this box."
160
204
  form_problem: "there was a problem with the form"
205
+ full_name: "full name"
206
+ function: "Function"
161
207
  getting_gravatar: "If you would like a picture to appear next to your messages, give yourself a gravatar at"
162
- groups: "Groups"
208
+ group: "group"
163
209
  group_filter: "Show only members of the group: "
210
+ group_invitation: "This is the invitation message"
164
211
  group_members: "Group Members"
212
+ group_members: "Group members"
213
+ group_page: "group page"
214
+ group_welcome: "This is the welcome message"
215
+ groups: "Groups"
216
+ groups_introduction: ""
165
217
  hello: "hello"
218
+ home: 'home'
166
219
  honorific: "Title or rank"
167
- invitation_message: "Invitation message"
168
- invite_description: '<a href="%{url}">Edit your preferences to put some text about yourself here.'
169
220
  if_cant_find: "If you can't find the message, we can"
170
221
  if_mistake_see_admin: "If this is a mistake, please talk to the site administrator about your account."
171
222
  if_not_you: "If that's not you, please"
223
+ inactive_in_group: "Group members who have not activated their account"
224
+ inherited_group: "group is attached higher in the page tree: can't be detached here"
225
+ invitation_instructions: "This is a quick way to bring a group of people into the system in one go. Enter a comma-separated list of names and email addresses (one person per line) and after a bit of checking and tweaking on the next page, each of those people will be invited into the system and issued an account with a vaguely adequate username and entirely random password. Anyone who is already here will just be added to the group."
226
+ invitation_message: "Invitation message"
227
+ invitation_preview_instructions: "Fields in red have validation problems. That usually means an email address or login needs checking. Hover your mouse pointer over the affected field to find out more. Fields in grey show that we already have that person here (based on their email address). You can still bring them into the group but you can't edit their details here."
228
+ invite_description: '<a href="%{url}">Edit your preferences to put some text about yourself here.'
229
+ invite_into_group: "Invite people into the %{name} group"
172
230
  is_free_and_quick: " is free and only takes a moment"
173
231
  joined_on: "Joined on"
232
+ last_sent: "last sent"
174
233
  log_in: 'log in'
175
234
  log_in_or_register: "Please log in here. If you haven't already, you will need to <a href='/register'>register</a> first."
176
235
  log_out: "log out"
@@ -179,43 +238,64 @@ en:
179
238
  login_unknown: "Sorry: we don't recognise that combination of username and password."
180
239
  logout_message: "You are logged out. Bye!"
181
240
  member: "member"
182
- message_delivered: "Message delivered"
183
- message_preview_introduction: "This is a snapshot of the message that was delivered to you %{date}. If it contains instructions they may now be out of date."
184
- must_be_empty: "must be empty"
241
+ member_count:
242
+ zero: "No members."
243
+ one: "One member"
244
+ other: "%{count} members"
185
245
  message_adhoc: "This is an ad-hoc message you can send at any time."
186
246
  message_administrative: "This message is sent automatically"
187
- message_group_adhoc: 'It is restricted to members of the <a href="%{href}">%{name}</a> group.'
188
- message_group_administrative: "It is sent automatically"
247
+ message_delivered: "Message delivered"
189
248
  message_function:
190
- welcome: "when someone completes the registration and email-confirmation process."
191
- password_reset: "when someone asks to reset their password."
192
249
  activation: "when someone registers here."
193
- invitation: "when someone is invited to visit the site."
194
- group_welcome: "when someone is admitted to the group."
195
250
  group_invitation: "when someone is invited into the group."
251
+ group_welcome: "when someone is admitted to the group."
252
+ invitation: "when someone is invited to visit the site."
253
+ password_reset: "when someone asks to reset their password."
254
+ welcome: "when someone completes the registration and email-confirmation process."
255
+ message_group_adhoc: 'It is restricted to members of the <a href="%{href}">%{name}</a> group.'
256
+ message_group_administrative: "It is sent automatically"
257
+ message_preview_introduction: "This is a snapshot of the message that was delivered to you %{date}. If it contains instructions they may now be out of date."
258
+ mistaken_access_error: "If you think that's a mistake, and that you should be allowed to do whatever it was you just tried to do, please contact your site administrator."
259
+ must_be_empty: "must be empty"
196
260
  navigation:
197
- account: "Your account"
261
+ account: "Preferences"
198
262
  activate: "Activate account"
199
263
  admin: "Admin"
200
264
  dashboard: "Dashboard"
201
265
  directory: "Directory"
202
266
  greeting: "Hello %{name}"
203
267
  help: "Help"
204
- readers: "Members"
205
- preferences: "Preferences"
206
- profile: "Profile"
268
+ loading: "Loading..."
207
269
  log_in: "Log in"
208
270
  log_out: "Log out"
209
- loading: "Loading..."
271
+ preferences: "Preferences"
272
+ profile: "Profile"
273
+ readers: "Members"
210
274
  register: "Register"
211
275
  your_account: "Preferences"
276
+ never_sent: 'never sent'
212
277
  new_account: "Register here"
278
+ new_group: "new group"
213
279
  new_password: "New password"
214
280
  new_password_instructions: "Please enter and confirm the new password you would like to use. It should be at least six characters long, nothing obvious or typical and with at least one non-letter character."
215
281
  'no': "no"
216
282
  no_description: "No description available"
283
+ no_invitation_message: "This group has no invitation message. You will need to create one before you can invite people into it."
284
+ no_mobile: "no mobile"
285
+ none_option: "<none>"
286
+ no_phone: "no phone"
287
+ no_postal_address: "no address"
288
+ nobody_to_list: "There is nobody to display here."
289
+ none: "none"
217
290
  notes: "notes"
291
+ optional_login: "[login]"
292
+ optional_phone: "[phone]"
293
+ or_edit_preferences: 'You can also <a href="%{url}">edit your account preferences</a>.'
294
+ or_edit_profile: 'You can also <a href="%{url}">edit your profile</a> to add more information about yourself.'
295
+ other_messages: "Ad-hoc messages"
296
+ page_not_public: "The page you have requested is not public. Please log in. If your account has the necessary permission you will be taken straight there."
218
297
  page_permission_denied: "You don't have permission to see the page that you have requested."
298
+ page_private: "Sorry: you don't have permission to view that page."
219
299
  password: "Password"
220
300
  password_incorrect: "Sorry. Wrong password."
221
301
  password_mismatch: "Passwords don't match! Please try again."
@@ -234,17 +314,31 @@ en:
234
314
  please_read_our: "Please read our"
235
315
  please_register: "Please take a moment to choose a login and password. We need your email address to confirm your identity and send administrative messages: any other information you can fill in later."
236
316
  please_use_form: "Please use the registration form"
237
- preferences_intro: "You can use this form to change your preferences and enter a bit more information about yourself."
238
- profile_intro_private: "The information that you put in here is made available to other members both on the site and in their address books. It is not available to the public and nobody will see it who is not logged in to this site."
317
+ preferences_intro: "Use this form to change your account preferences."
318
+ preview_and_send_message: "Preview and send message"
319
+ private_page_explanation: "The pages selected on the left are only visible to the people selected on the right (unless another group is also given permission to see that page)."
320
+ private_pages: "Private pages"
239
321
  profile_intro_grouped: "The information that you put in here is made available to the other members of your groups both on the site and in their address books. It is not available to the public or to users of this site outside your groups."
322
+ profile_intro_private: "The information that you put in here is made available to other members both on the site and in their address books. It is not available to the public and nobody will see it who is not logged in to this site."
240
323
  profile_intro_public: "The information that you put in here is made visible to the public. Email addresses are spam-protected but your contact information will be visible to everyone."
324
+ public_if_no_groups: "Leave all groups unchecked for public access"
325
+ reader: 'Reader'
241
326
  reader_admin: "Reader administration"
327
+ reader_configuration_page: "reader settings"
242
328
  reader_emails: "Administrative messages"
243
- reader: 'Reader'
244
329
  reader_logged_in_as: "You are logged in as %{name}."
330
+ reader_required: "Sorry: this part of the site requires an account."
245
331
  reader_saved: "Reader saved"
246
332
  readers: 'People'
247
- readers_introduction: "This is a list of everyone who has joined the site. It's only visible to logged-in users."
333
+ readers_introduction_edit: 'You can update your listing by <a href="%{url}">editing your profile</a>.'
334
+ readers_introduction_grouped: "This is a private directory and will only show people who are in the same groups as you."
335
+ readers_introduction_none: "This site does not provide a directory of members."
336
+ readers_introduction_private: "This is a private directory visible only to logged-in users of the site."
337
+ readers_introduction_public: "Click on a person to see their profile, contact information and other details."
338
+ readers_title: "Directory"
339
+ really_delete_group: "Are you sure you want to completely remove the '%{name}' group? This cannot be undone."
340
+ really_delete_message: "Are you sure you want to delete the message '%{title}'? This cannot be undone."
341
+ really_delete_reader: "Are you sure you want to remove the reader %{name}? This cannot be undone."
248
342
  register: "register"
249
343
  registration: "registration"
250
344
  registration_disallowed: "Sorry. This site does not allow visitors to register"
@@ -253,15 +347,21 @@ en:
253
347
  reset_message_instructions: "Thank you. A message has been sent containing the instructions for setting a new password. Remember it hasn't changed yet and won't until you follow the instructions in the message. If you remember your old password, you can just carry on using it and ignore the reset message."
254
348
  reset_message_sent: "Password-reset instructions have been emailed to you"
255
349
  reset_not_found: "Password-reset code not found"
256
- sorry_reset_not_found: "Sorry: the system can't find you. That link must have been garbled somewhere along the line. Please paste the 20-character confirmation code into the box below and we'll try again."
257
350
  reset_password: "Reset your password"
258
351
  restart_password_change: "Send another password-reset message"
259
352
  return_to_page: "return to the page you were looking at before you started registering"
260
353
  select_all: "Select all"
261
354
  selected_people: "Selected people"
262
355
  send_it_again: "send it again"
356
+ send_message: "Send message"
263
357
  send_reset_button: "send me instructions"
358
+ send_to: "Send to"
264
359
  sent_on: "sent %{date}"
360
+ sent_to_group: "sent automatically to the %{name} group"
361
+ sent_to_these_groups: "sent automatically to these groups"
362
+ separator: " &raquo; "
363
+ set_message_function: "Message function"
364
+ set_message_groups: "Message groups"
265
365
  set_new_password: "set new password"
266
366
  showing: "Showing"
267
367
  showing_of_total:
@@ -271,92 +371,33 @@ en:
271
371
  some_deliveries_failed: "Some deliveries failed"
272
372
  sorry: "sorry"
273
373
  sorry_access_denied: "Sorry: access denied"
374
+ sorry_reset_not_found: "Sorry: the system can't find you. That link must have been garbled somewhere along the line. Please paste the 20-character confirmation code into the box below and we'll try again."
274
375
  spam_trap: "it's a spam trap and shouldn't be visible"
275
376
  status_check: "Please wait: loading controls"
377
+ subgroups: "Groups within %{name}"
378
+ subject: "Subject"
379
+ subscriptions: "subscriptions"
276
380
  terms_and_conditions: "terms and conditions"
277
381
  thanks_activated: "Thank you! Your account has been activated."
278
382
  thanks_and_activation_instructions: "Thank you for registering. Now please check your email. We have sent a message containing a link that will automatically activate your account and log you in."
279
383
  this_is_your_page: "This is the page that other (logged-in) site visitors will see when they click on your name."
384
+ this_message_functional: "This is the %{function} message."
385
+ unsent_in_group: "Group members who have not received this message"
386
+ update_account: "Save changes"
280
387
  username: "username"
388
+ vcard: "vcard"
389
+ vcard_file: "address book file"
281
390
  welcome_back: "Welcome back"
282
391
  welcome_message: "Welcome message"
392
+ welcome_please_log_in: '<span class="greeting">Welcome!</span> To take part, please <a href="%{login_url}">log in</a> or <a href="%{register_url}">register</a>.'
283
393
  wrong_email: "you think you might have put the wrong email address in,"
284
394
  'yes': "yes"
285
- your_description: "Some text for your profile page"
395
+ you_are_not_shared: "You have chosen not to share your contact information."
396
+ your_description: "Your profile text"
286
397
  your_email: "Your email address"
287
398
  your_name: "Your name"
288
- send_to: "Send to"
289
- reader_configuration_page: "reader settings"
290
- welcome_please_log_in: '<span class="greeting">Welcome!</span> To take part, please <a href="%{login_url}">log in</a> or <a href="%{register_url}">register</a>.'
291
- everyone_unsent: "Anyone who has not received this message"
292
- everyone_inactive: "Anyone who has not activated their account"
293
- everyone: "Everyone"
294
- create_message: "Create new message"
295
- send_message: "Send message"
296
- edit_message: "Edit message"
297
- delete_message: "Delete message"
298
- this_message_functional: "This is the %{function} message."
299
- preview_and_send_message: "Preview and send message"
300
- really_delete_message: "Are you sure you want to delete the message '%{title}'? This cannot be undone."
301
- delete_reader: "delete reader"
302
- really_delete_reader: "Are you sure you want to remove the reader %{name}? This cannot be undone."
303
- never_sent: 'never sent'
304
- for: 'for'
305
- home: 'home'
306
- reader_required: "Sorry: this part of the site requires an account."
307
- update_account: "Save changes"
308
- create_account: "Register"
309
- separator: " &raquo; "
310
- vcard_file: "address book"
311
- you_are_not_shared: "You have chosen not to share your contact information."
312
-
313
- # group
314
- group: "group"
315
- subscriptions: "subscriptions"
316
- inherited_group: "group is attached higher in the page tree: can't be detached here"
317
- public_if_no_groups: "Leave all groups unchecked for public access"
318
- allowed_groups: "Allow access only to:"
319
- page_private: "Sorry: you don't have permission to view that page."
320
- none: "none"
321
- new_group: "new group"
322
- group_members: "Group members"
323
- private_pages: "Private pages"
324
- admin_messages: "Administrative messages"
325
- other_messages: "Ad-hoc messages"
326
- create_new_message: "Send a new message"
327
- delete_message: "delete message"
328
- create_welcome: "create welcome"
329
- create_invitation: "create invitation"
330
- last_sent: "last sent"
331
- private_page_explanation: "The pages selected on the left are only visible to the people selected on the right (unless another group is also given permission to see that page)."
332
- sent_to_group: "sent automatically to the %{name} group"
333
- sent_to_these_groups: "sent automatically to these groups"
334
- group_welcome: "This is the welcome message"
335
- group_invitation: "This is the invitation message"
336
- all_in_group: "Everyone in the group"
337
- inactive_in_group: "Group members who have not activated their account"
338
- unsent_in_group: "Group members who have not received this message"
339
- group_page: "group page"
340
- for_group: "for the %{name} group"
341
- add_members: "add members"
342
- delete_group: "delete group"
343
- really_delete_group: "Are you sure you want to completely remove the '%{name}' group? This cannot be undone."
344
- edit_group: "edit group"
345
- belongs_to_group: 'This message belongs to the <a href="%{href}">%{name}</a> group.'
346
- belongs_to_these_groups: "This message is sent to these groups:"
347
- invite_into_group: "Invite people into the %{name} group"
348
- invitation_instructions: "This is a quick way to bring a group of people into the system in one go. Enter a comma-separated list of names and email addresses (one person per line) and after a bit of checking and tweaking on the next page, each of those people will be invited into the system and issued an account with a vaguely adequate username and entirely random password. Anyone who is already here will just be added to the group."
349
- check_invitation_message: "Preview invitation message"
350
- no_invitation_message: "This group has no invitation message. You will need to create one before you can invite people into it."
351
- create_invitation_message: "create invitation message"
352
- check_invitation_list: "Check the invitation list"
353
- invitation_preview_instructions: "Fields in red have validation problems. That usually means an email address or login needs checking. Hover your mouse pointer over the affected field to find out more. Fields in grey show that we already have that person here (based on their email address). You can still bring them into the group but you can't edit their details here."
354
- full_name: "full name"
355
- email: "email"
356
- optional_phone: "[phone]"
357
- optional_login: "[login]"
358
- page_not_public: "The page you have requested is not public. Please log in. If your account has the necessary permission you will be taken straight there."
359
-
399
+ readers: "Readers"
400
+ settings: "Settings"
360
401
  time:
361
402
  formats:
362
403
  date: "%B %e, %Y"