zena 1.2.4 → 1.2.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (104) hide show
  1. data/History.txt +18 -0
  2. data/app/controllers/nodes_controller.rb +11 -6
  3. data/app/controllers/sites_controller.rb +3 -2
  4. data/app/controllers/user_sessions_controller.rb +1 -1
  5. data/app/controllers/virtual_classes_controller.rb +3 -2
  6. data/app/models/document.rb +2 -2
  7. data/app/models/node.rb +6 -1
  8. data/app/models/note.rb +3 -27
  9. data/app/models/role.rb +11 -5
  10. data/app/models/site.rb +140 -43
  11. data/app/models/string_hash.rb +2 -0
  12. data/app/models/user.rb +9 -4
  13. data/app/models/user_session.rb +1 -1
  14. data/app/models/virtual_class.rb +49 -18
  15. data/app/views/sites/_form.erb +7 -4
  16. data/app/views/sites/_li.erb +15 -9
  17. data/app/views/users/_li.rhtml +3 -0
  18. data/app/views/users/index.rhtml +1 -1
  19. data/app/views/virtual_classes/_form.erb +1 -1
  20. data/bricks/acls/zena/init.rb +1 -2
  21. data/bricks/acls/zena/test/sites/erebus/roles.yml +4 -0
  22. data/bricks/activity/lib/bricks/activity.rb +24 -0
  23. data/bricks/activity/zena/migrate/20130711135905_add_activity_to_user.rb +9 -0
  24. data/bricks/activity/zena/test/integration/activity_integration_test.rb +29 -0
  25. data/bricks/captcha/zena/init.rb +0 -3
  26. data/bricks/fs_skin/lib/bricks/fs_skin.rb +3 -3
  27. data/bricks/fs_skin/zena/skins/blog/Node.zafu +1 -1
  28. data/bricks/fs_skin/zena/tasks.rb +2 -2
  29. data/bricks/fs_skin/zena/test/integration/fs_skin_integration_test.rb +2 -2
  30. data/bricks/fs_skin/zena/test/unit/fs_skin_test.rb +1 -1
  31. data/bricks/math/zena/init.rb +0 -3
  32. data/bricks/pdf/zena/init.rb +1 -5
  33. data/bricks/worker/zena/init.rb +0 -2
  34. data/bricks/zena/zena/migrate/20130617164527_add_master_id_to_site.rb +13 -0
  35. data/bricks/zena/zena/migrate/20130712081512_alter_login_users.rb +9 -0
  36. data/config/bricks.yml +4 -1
  37. data/lib/bricks/loader.rb +17 -9
  38. data/lib/tasks/zena.rake +40 -5
  39. data/lib/zafu/process/ruby_less_processing.rb +3 -5
  40. data/lib/zena.rb +2 -0
  41. data/lib/zena/acts/secure.rb +11 -2
  42. data/lib/zena/console.rb +5 -4
  43. data/lib/zena/core_ext/string.rb +2 -2
  44. data/lib/zena/deploy.rb +22 -6
  45. data/lib/zena/deploy/logrotate_app.rhtml +10 -7
  46. data/lib/zena/deploy/logrotate_host.rhtml +21 -26
  47. data/lib/zena/deploy/vhost.rhtml +3 -3
  48. data/lib/zena/foxy_parser.rb +1 -1
  49. data/lib/zena/info.rb +1 -1
  50. data/lib/zena/site_worker.rb +2 -2
  51. data/lib/zena/use.rb +0 -1
  52. data/lib/zena/use/ancestry.rb +1 -1
  53. data/lib/zena/use/authlogic.rb +2 -1
  54. data/lib/zena/use/display.rb +6 -0
  55. data/lib/zena/use/query_builder.rb +1 -1
  56. data/lib/zena/use/query_node.rb +3 -3
  57. data/lib/zena/use/rendering.rb +47 -13
  58. data/lib/zena/use/test_helper.rb +1 -1
  59. data/lib/zena/use/urls.rb +6 -104
  60. data/lib/zena/use/zafu_safe_definitions.rb +9 -4
  61. data/lib/zena/use/zafu_templates.rb +1 -0
  62. data/locale/app.pot +4 -0
  63. data/locale/de/LC_MESSAGES/zena.mo +0 -0
  64. data/locale/de/zena.po +6 -2
  65. data/locale/en/LC_MESSAGES/zena.mo +0 -0
  66. data/locale/en/zena.po +6 -2
  67. data/locale/fr/LC_MESSAGES/zena.mo +0 -0
  68. data/locale/fr/zena.po +5 -1
  69. data/locale/it/LC_MESSAGES/zena.mo +0 -0
  70. data/locale/it/zena.po +6 -2
  71. data/locale/zena.pot +4 -0
  72. data/test/functional/nodes_controller_test.rb +2 -133
  73. data/test/functional/sites_controller_test.rb +1 -1
  74. data/test/integration/multiple_hosts_test.rb +2 -1
  75. data/test/integration/navigation_test.rb +37 -0
  76. data/test/integration/query_node/basic.yml +1 -1
  77. data/test/integration/zafu_compiler/ajax.yml +7 -0
  78. data/test/integration/zafu_compiler/comments.yml +2 -2
  79. data/test/integration/zafu_compiler/context.yml +6 -2
  80. data/test/integration/zafu_compiler/display.yml +16 -4
  81. data/test/integration/zafu_compiler/forms.yml +1 -0
  82. data/test/integration/zafu_compiler/query.yml +7 -1
  83. data/test/integration/zafu_compiler/relations.yml +12 -7
  84. data/test/integration/zafu_compiler/roles.yml +3 -3
  85. data/test/integration/zafu_compiler/rubyless.yml +1 -2
  86. data/test/integration/zafu_compiler/safe_definitions.yml +5 -0
  87. data/test/sites/complex/roles.yml +1 -1
  88. data/test/sites/ocean/roles.yml +4 -0
  89. data/test/sites/zena/columns.yml +3 -1
  90. data/test/sites/zena/roles.yml +5 -1
  91. data/test/sites/zena/sites.yml +22 -0
  92. data/test/unit/document_test.rb +14 -0
  93. data/test/unit/node_test.rb +14 -0
  94. data/test/unit/role_test.rb +19 -4
  95. data/test/unit/site_test.rb +67 -0
  96. data/test/unit/user_test.rb +20 -0
  97. data/test/unit/virtual_class_test.rb +116 -11
  98. data/test/unit/zena/use/rendering_test.rb +1 -1
  99. data/zena.gemspec +67 -66
  100. metadata +126 -125
  101. data/bricks/fs_skin/zena/init.rb +0 -1
  102. data/bricks/grid/zena/init.rb +0 -4
  103. data/bricks/single/zena/init.rb +0 -1
  104. data/bricks/spreadsheet/zena/init.rb +0 -3
@@ -10,7 +10,7 @@ module Zena
10
10
  TITLE_ML_JOIN = %Q{INNER JOIN idx_nodes_ml_strings AS id1 ON id1.node_id = nodes.id AND id1.key = 'title'}
11
11
 
12
12
  # (slow). Find a node by it's path. This is used during node importation when stored as zml files or to resolve custom_base url until we have an "alias" table.
13
- def find_by_path(path, parent_id = current_site.root_id, multilingual = false)
13
+ def find_by_path(path, parent_id = current_site.orphan_id, multilingual = false)
14
14
  res = nil
15
15
  path = path.split('/') unless path.kind_of?(Array)
16
16
  last = path.size - 1
@@ -50,7 +50,8 @@ module Zena
50
50
  User.send(:with_scope, :find => {:conditions => ['site_id = ?', site.id]}) do
51
51
  if user = token_visitor || registered_visitor || anonymous_visitor(site)
52
52
  user.asset_host = @asset_host
53
- Thread.current[:visitor] = user
53
+ # Make sure we load alias site in visitor
54
+ setup_visitor(user, site)
54
55
  end
55
56
  end
56
57
  end
@@ -236,6 +236,7 @@ module Zena
236
236
  safe_method [:sprintf, String, Number] => {:class => String, :method => 'sprintf'}
237
237
  safe_method [:search_box, {:ajax => String, :type => String}] => {:class => String, :method => 'search_box', :html_safe => true}
238
238
  safe_context [:admin_links, {:list => String}] => [String]
239
+ safe_method :uuid => String
239
240
 
240
241
  # Return sprintf formated entry. Return '' for values eq to zero.
241
242
  def sprintf_unless_zero(fmt, value)
@@ -246,6 +247,11 @@ module Zena
246
247
  def search_box(opts={})
247
248
  render_to_string(:partial=>'search/form', :locals => {:ajax => opts[:ajax], :type => opts[:type]})
248
249
  end
250
+
251
+ # Return a random string that can be used as id (starts with a character)
252
+ def uuid
253
+ 'u' + UUIDTools::UUID.random_create.to_s.gsub('-','')[0..8]
254
+ end
249
255
 
250
256
  # Return the 'zip' of the node corresponding to the browser url (start node). This value is kept
251
257
  # accross all Ajax calls.
@@ -1,7 +1,7 @@
1
1
  module Zena
2
2
  module Use
3
3
  module QueryBuilder
4
- DATE_FIELD_REGEXP = %r{\d+[\.-/]\d+[\.-/]\d+}
4
+ DATE_FIELD_REGEXP = %r{\d+[\.\-/]\d+[\.\-/]\d+}
5
5
  module ViewMethods
6
6
  include RubyLess
7
7
  # Pseudo string comming from params.
@@ -105,7 +105,7 @@ module Zena
105
105
  end
106
106
  end
107
107
 
108
- class Compiler < QueryBuilder::Processor
108
+ class Compiler < ::QueryBuilder::Processor
109
109
  attr_reader :context # ?
110
110
  set_main_table 'nodes'
111
111
  set_main_class 'Node'
@@ -328,7 +328,7 @@ module Zena
328
328
  if klass = Node.get_class(right[1])
329
329
  "#{field_or_attr('kpath')} #{is_not ? 'NOT ' : ''}LIKE #{quote(klass.kpath + '%')}"
330
330
  else
331
- raise QueryBuilder::QueryException.new("Unknown class #{right.last.inspect}.")
331
+ raise ::QueryBuilder::QueryException.new("Unknown class #{right.last.inspect}.")
332
332
  end
333
333
  else
334
334
  process_op(:like, left, right)
@@ -577,7 +577,7 @@ module Zena
577
577
  set_main_class(klass)
578
578
  kpath_filter = ".kpath LIKE #{quote("#{klass.kpath}%")}" unless klass.kpath == 'N'
579
579
  else
580
- raise QueryBuilder::QueryException.new("Unknown class #{klass} in scope '#{class_name}:#{scope}'.")
580
+ raise ::QueryBuilder::QueryException.new("Unknown class #{klass} in scope '#{class_name}:#{scope}'.")
581
581
  end
582
582
  else
583
583
  klass = nil
@@ -171,21 +171,28 @@ module Zena
171
171
  render :inline => result[:data]
172
172
 
173
173
  else
174
- if zafu_headers
175
- if disposition = zafu_headers.delete('Content-Disposition')
176
- result.delete(:filename) if disposition =~ /filename\s*=/
177
- result[:disposition] = disposition
178
- end
174
+
175
+ if disposition = zafu_headers.delete('Content-Disposition')
176
+ result.delete(:filename) if disposition =~ /filename\s*=/
177
+ result[:disposition] = disposition
178
+ end
179
179
 
180
- if type = zafu_headers.delete('Content-Type')
181
- result[:type] = type
182
- end
180
+ if type = zafu_headers.delete('Content-Type')
181
+ result[:type] = type
182
+ end
183
183
 
184
- if filename = zafu_headers.delete('filename')
185
- result[:filename] = filename
184
+ if filename = zafu_headers.delete('filename')
185
+ result[:filename] = filename
186
+ end
187
+
188
+ if status = zafu_headers.delete('Status')
189
+ if (status.to_i / 100) == 3
190
+ redirect_to zafu_headers.delete('Location'), :status => status.to_i
191
+ else
192
+ render :status => status.to_i
186
193
  end
187
-
188
194
  headers.merge!(zafu_headers)
195
+ return
189
196
  end
190
197
 
191
198
  if data = result.delete(:data)
@@ -195,7 +202,9 @@ module Zena
195
202
  else
196
203
  # Should never happen
197
204
  raise Exception.new("Render '#{params[:format]}' should return either :file or :data (none found).")
198
- end
205
+ end
206
+ headers.merge!(zafu_headers)
207
+
199
208
  end
200
209
 
201
210
  cache_page(:content_data => result[:data], :content_path => result[:file]) if opts[:cache]
@@ -205,7 +214,26 @@ module Zena
205
214
  render_to_string :file => template_url(opts), :layout => false
206
215
  else
207
216
  render :file => template_url(opts), :layout => false, :status => opts[:status]
217
+
218
+ if status = zafu_headers.delete('Status')
219
+ # reset rendering
220
+ response.content_type = nil
221
+ erase_render_results
222
+ reset_variables_added_to_assigns
223
+
224
+ if (status.to_i / 100) == 3
225
+ redirect_to zafu_headers.delete('Location'), :status => status.to_i
226
+ else
227
+ render :status => status.to_i
228
+ end
229
+
230
+ headers.merge!(zafu_headers)
231
+
232
+ return
233
+ end
234
+
208
235
  headers.merge!(zafu_headers)
236
+
209
237
  cache_page(:url => opts[:cache_url]) if opts[:cache]
210
238
  end
211
239
  end
@@ -239,7 +267,13 @@ module Zena
239
267
  :content_data => response.body,
240
268
  :node_id => @node[:id]
241
269
  }.merge(opts)
242
- secure!(CachedPage) { CachedPage.create(opts) }
270
+ if secure!(CachedPage) { CachedPage.create(opts) }
271
+ true
272
+ else
273
+ false
274
+ end
275
+ else
276
+ false
243
277
  end
244
278
  end
245
279
 
@@ -9,7 +9,7 @@ module Zena
9
9
  # Set visitor for unit testing
10
10
  def login(fixture)
11
11
  user = users(fixture)
12
- Thread.current[:visitor] = user
12
+ setup_visitor(user, user.site)
13
13
  user.ip = '10.0.0.44'
14
14
  $_test_site = user.site.name
15
15
  ::I18n.locale = user.lang
@@ -93,7 +93,7 @@ module Zena
93
93
  if ep.delete('mode')
94
94
  mode ||= params[:mode]
95
95
  end
96
- opts['encode_params'] = ep
96
+ opts[:encode_params] = ep
97
97
  end
98
98
 
99
99
  if host = opts.delete(:host)
@@ -155,6 +155,7 @@ module Zena
155
155
  end
156
156
 
157
157
  def append_query_params(path, opts)
158
+
158
159
  if opts == {}
159
160
  path
160
161
  else
@@ -162,7 +163,9 @@ module Zena
162
163
  list = opts.keys.map do |k|
163
164
  # FIXME: DOC
164
165
  if k.to_s == 'encode_params'
165
- opts[k].map do |key|
166
+ list = opts[k]
167
+ list = list.split(',').map(&:strip) unless list.kind_of?(Array)
168
+ list.map do |key|
166
169
  value = params[key]
167
170
  if value.kind_of?(Hash)
168
171
  {key => value}.to_query
@@ -277,7 +280,7 @@ module Zena
277
280
  def host_with_port
278
281
  @host_with_port ||= begin
279
282
  port = request.port
280
- if port.blank? || port.to_s == '80'
283
+ if port.blank? || port.to_s == '80' || port.to_s == '443'
281
284
  current_site.host
282
285
  else
283
286
  "#{current_site.host}:#{port}"
@@ -502,107 +505,6 @@ module Zena
502
505
  # We wrap without callbacks (before_wrap, after_wrap) so that the link
503
506
  # is used as raw text in these callbacks.
504
507
  markup.wrap(text)
505
- =begin
506
- query_params = options[:query_params] || {}
507
- default_text = options[:default_text]
508
- params = {}
509
- (options[:params] || @params).each do |k,v|
510
- next if v.nil?
511
- params[k] = v
512
- end
513
-
514
- opts = {}
515
-
516
- if href = params.delete(:href)
517
- if lnode = get_context_var('set_var', value) && stored.klass <= Node
518
- # using stored node
519
- else
520
- lnode, klass = build_finder(:first, href, {})
521
- return unless lnode
522
- return parser_error("invalid class (#{klass})") unless klass.ancestors.include?(Node)
523
- end
524
- else
525
- # obj
526
- if node_class == Version
527
- lnode = "#{node}.node"
528
- opts[:lang] = "#{node}.lang"
529
- elsif node.will_be?(Node)
530
- lnode = node
531
- else
532
- lnode = @context[:previous_node]
533
- end
534
- end
535
-
536
- if fmt = params.delete(:format)
537
- if fmt == 'data'
538
- opts[:format] = "#{node}.ext"
539
- else
540
- opts[:format] = fmt.inspect
541
- end
542
- end
543
-
544
- if mode = params.delete(:mode)
545
- opts[:mode] = mode.inspect
546
- end
547
-
548
- if anchor = params.delete(:anchor)
549
- opts[:anchor] = anchor.inspect
550
- end
551
-
552
- if anchor_in = params.delete(:in)
553
- finder, klass = build_finder(:first, anchor_in, {})
554
- return unless finder
555
- return parser_error("invalid class (#{klass})") unless klass.ancestors.include?(Node)
556
- opts[:anchor_in] = finder
557
- end
558
-
559
- if @html_tag && @html_tag != 'a'
560
- # FIXME: can we remove this ?
561
- # html attributes do not belong to anchor
562
- pre_space = ''
563
- html_params = {}
564
- else
565
- html_params = get_html_params(params.merge(@html_tag_params), :link)
566
- pre_space = @space_before || ''
567
- @html_tag_done = true
568
- end
569
-
570
- (params.keys - [:style, :class, :id, :rel, :name, :anchor, :attr, :tattr, :trans, :text]).each do |k|
571
- next if k.to_s =~ /if_|set_|\A_/
572
- query_params[k] = params[k]
573
- end
574
-
575
- # TODO: merge these two query_params cleanup things into something cleaner.
576
- else
577
- # direct link
578
- query_params.each do |k,v|
579
- if k == :date
580
- if v == 'current_date'
581
- query_params[k] = current_date
582
- elsif v =~ /\A\d/
583
- query_params[k] = v.inspect
584
- elsif v =~ /\[/
585
- attribute, static = parse_attributes_in_value(v.gsub('"',''), :erb => false)
586
- query_params[k] = "\"#{attribute}\""
587
- else
588
- query_params[k] = node_attribute(v)
589
- end
590
- else
591
- attribute, static = parse_attributes_in_value(v.gsub('"',''), :erb => false)
592
- query_params[k] = "\"#{attribute}\""
593
- end
594
- end
595
-
596
- query_params.merge!(opts)
597
-
598
- opts_str = ''
599
- query_params.keys.sort {|a,b| a.to_s <=> b.to_s }.each do |k|
600
- opts_str << ",:#{k.to_s.gsub(/[^a-z_A-Z_]/,'')}=>#{query_params[k]}"
601
- end
602
-
603
- pre_space + "<a#{params_to_html(html_params)} href='<%= zen_path(#{lnode}#{opts_str}) %>'>#{text_for_link(default_text)}</a>"
604
- end
605
- =end
606
508
  end
607
509
 
608
510
 
@@ -117,7 +117,9 @@ module Zena
117
117
  def self.first_proc
118
118
  @@first_proc ||= Proc.new do |receiver, method|
119
119
  if elem = receiver.opts[:elem] || receiver.klass.first
120
- RubyLess::TypedString.new("#{receiver.raw}.first", :class => elem, :nil => true)
120
+ # All query contexts are only opened if they are not empty.
121
+ could_be_nil = !receiver.opts[:query]
122
+ RubyLess::TypedString.new("#{receiver.raw}.first", :class => elem, :nil => could_be_nil, :query => receiver.opts[:query])
121
123
  else
122
124
  # should never happen
123
125
  raise RubyLess::NoMethodError.new(receiver.raw, receiver.klass, ['first'])
@@ -157,7 +159,8 @@ module Zena
157
159
 
158
160
  safe_method :now => {:method => 'Time.now', :class => Time}
159
161
  safe_method :string_hash => {:method => 'StringHash.new', :class => StringHash}
160
- safe_method [:string_hash, Hash] => {:method => 'StringHash.from_hash', :class => StringHash}
162
+ safe_method [:string_hash, Hash] => {:method => 'StringHash.from_hash', :class => StringHash}
163
+ safe_method [:string_hash, String] => {:method => 'StringHash.from_string', :class => StringHash}
161
164
  safe_method [:h, String] => {:class => String, :accept_nil => true}
162
165
  safe_method_for String, [:gsub, Regexp, String] => {:class => String, :pre_processor => true}
163
166
  safe_method_for String, :upcase => {:class => String, :pre_processor => true}
@@ -166,8 +169,10 @@ module Zena
166
169
  safe_method_for String, :url_name => {:class => String, :pre_processor => true, :method => :url_name}
167
170
  safe_method_for String, :to_i => {:class => Number, :pre_processor => true}
168
171
  safe_method_for String, :to_s => {:class => String, :pre_processor => true}
169
- safe_method_for String, [:limit, Number] => {:class => String, :pre_processor => true, :html_safe => true}
170
- safe_method_for String, [:limit, Number, String] => {:class => String, :pre_processor => true, :html_safe => true}
172
+ safe_method_for String, :size => {:class => Number, :pre_processor => true}
173
+ safe_method_for String, [:limit, Number] => {:class => String, :pre_processor => true}
174
+ safe_method_for String, [:limit, Number, String] => {:class => Number, :pre_processor => true}
175
+
171
176
  safe_method_for String, :to_f => {:class => Number, :pre_processor => true}
172
177
  safe_method_for String, :to_json => {:class => String, :pre_processor => true}
173
178
  safe_method_for String, [:split, String] => {:class => [String], :pre_processor => true}
@@ -261,6 +261,7 @@ module Zena
261
261
  return default_template_url(opts) unless zafu_url
262
262
 
263
263
  rel_path = current_site.zafu_path + "/#{zafu_url}/#{lang_path}/_main.erb"
264
+
264
265
  path = SITES_ROOT + rel_path
265
266
  if !File.exists?(path) || params[:rebuild]
266
267
  if @node && klass = VirtualClass.find_by_kpath(template.tkpath)
@@ -407,6 +407,10 @@ msgstr ""
407
407
  msgid "site_img"
408
408
  msgstr ""
409
409
 
410
+ #: app/views/sites/_li.erb:2 lib/gettext_strings.rb:34
411
+ msgid "alias_img"
412
+ msgstr ""
413
+
410
414
  #: app/views/sites/_li.erb:11
411
415
  msgid "no API"
412
416
  msgstr ""
@@ -1612,11 +1612,15 @@ msgstr "%H:%M"
1612
1612
  #: app/views/sites/_form.erb:22 lib/gettext_strings.rb:38
1613
1613
  #, fuzzy
1614
1614
  msgid "site group"
1615
- msgstr "<img src='/images/group.png' title='group'/>"
1615
+ msgstr "<img src='/images/group.png' alt='group' title='group'/>"
1616
1616
 
1617
1617
  #: app/views/sites/_li.erb:2 lib/gettext_strings.rb:34
1618
1618
  msgid "site_img"
1619
- msgstr "<img src='/images/world.png' title='site'/>"
1619
+ msgstr "<img src='/images/world.png' alt='site' title='site'/>"
1620
+
1621
+ #: app/views/sites/_li.erb:2 lib/gettext_strings.rb:34
1622
+ msgid "alias_img"
1623
+ msgstr "<img src='/images/world_link.png' alt='alias' title='alias'/>"
1620
1624
 
1621
1625
  #: app/views/sites/index.erb:1 lib/zena/use/display.rb:279
1622
1626
  msgid "sites"
@@ -480,7 +480,7 @@ msgstr "Acl with highest priority is tested first."
480
480
  #: app/views/acls/_form.rhtml:47
481
481
  msgid "acl_query_help"
482
482
  msgstr ""
483
- "SQLiss query to fetch all the nodes for which this acl authorizes access."
483
+ "SQLiss query to fetch all the nodes for which this acl authorizes access (Ruby)."
484
484
 
485
485
  #: lib/zena/use/display.rb:282
486
486
  msgid "acls"
@@ -1595,7 +1595,11 @@ msgstr "<img src='/images/group.png' alt='group'/>"
1595
1595
 
1596
1596
  #: app/views/sites/_li.erb:2 lib/gettext_strings.rb:34
1597
1597
  msgid "site_img"
1598
- msgstr "<img src='/images/world.png' alt='site'/>"
1598
+ msgstr "<img src='/images/world.png' alt='site' title='site'/>"
1599
+
1600
+ #: app/views/sites/_li.erb:2 lib/gettext_strings.rb:34
1601
+ msgid "alias_img"
1602
+ msgstr "<img src='/images/world_link.png' alt='alias' title='alias'/>"
1599
1603
 
1600
1604
  #: app/views/sites/index.erb:1 lib/zena/use/display.rb:279
1601
1605
  msgid "sites"
@@ -1545,7 +1545,11 @@ msgstr "groupe de site"
1545
1545
 
1546
1546
  #: app/views/sites/_li.erb:2 lib/gettext_strings.rb:34
1547
1547
  msgid "site_img"
1548
- msgstr "<img src='/images/world.png' alt='site'/>"
1548
+ msgstr "<img src='/images/world.png' alt='site' title='site'/>"
1549
+
1550
+ #: app/views/sites/_li.erb:2 lib/gettext_strings.rb:34
1551
+ msgid "alias_img"
1552
+ msgstr "<img src='/images/world_link.png' alt='alias' title='alias'/>"
1549
1553
 
1550
1554
  #: app/views/sites/index.erb:1 lib/zena/use/display.rb:279
1551
1555
  msgid "sites"
@@ -480,7 +480,7 @@ msgstr "Acl with highest priority is tested first."
480
480
 
481
481
  #: app/views/acls/_form.rhtml:47
482
482
  msgid "acl_query_help"
483
- msgstr "SQLiss query to fetch all the nodes for which this acl authorizes access."
483
+ msgstr "SQLiss query to fetch all the nodes for which this acl authorizes access (Ruby)."
484
484
 
485
485
  #: lib/zena/use/display.rb:282
486
486
  msgid "acls"
@@ -1658,7 +1658,11 @@ msgstr "<img src='/images/group.png' alt='group'/>"
1658
1658
  #: app/views/sites/_li.erb:2
1659
1659
  #: lib/gettext_strings.rb:34
1660
1660
  msgid "site_img"
1661
- msgstr "<img src='/images/world.png' alt='site'/>"
1661
+ msgstr "<img src='/images/world.png' alt='site' title='site'/>"
1662
+
1663
+ #: app/views/sites/_li.erb:2 lib/gettext_strings.rb:34
1664
+ msgid "alias_img"
1665
+ msgstr "<img src='/images/world_link.png' alt='alias' title='alias'/>"
1662
1666
 
1663
1667
  #: app/views/sites/index.erb:1
1664
1668
  #: lib/zena/use/display.rb:279