olelo 0.9.8 → 0.9.9

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 (71) hide show
  1. data/.gitignore +1 -0
  2. data/Rakefile +44 -10
  3. data/config.ru +4 -1
  4. data/lib/olelo/application.rb +1 -54
  5. data/lib/olelo/helper.rb +12 -7
  6. data/lib/olelo/initializer.rb +10 -13
  7. data/lib/olelo/locale.rb +7 -12
  8. data/lib/olelo/locale.yml +1 -36
  9. data/lib/olelo/plugin.rb +0 -12
  10. data/lib/olelo/routing.rb +1 -1
  11. data/lib/olelo/templates.rb +2 -3
  12. data/lib/olelo/util.rb +1 -1
  13. data/lib/olelo/version.rb +1 -1
  14. data/{views → lib/olelo/views}/delete.slim +0 -0
  15. data/{views → lib/olelo/views}/deleted.slim +0 -0
  16. data/{views → lib/olelo/views}/edit.slim +3 -3
  17. data/{views → lib/olelo/views}/error.slim +0 -0
  18. data/{views → lib/olelo/views}/layout.slim +1 -1
  19. data/{views → lib/olelo/views}/login.slim +1 -1
  20. data/{views → lib/olelo/views}/move.slim +0 -0
  21. data/{views → lib/olelo/views}/not_found.slim +0 -0
  22. data/{views → lib/olelo/views}/profile.slim +0 -0
  23. data/lib/olelo/views/show.slim +8 -0
  24. data/lib/olelo/virtualfs.rb +5 -29
  25. data/plugins/aspects/changelog.rb +3 -5
  26. data/plugins/aspects/documentbrowser.rb +24 -2
  27. data/plugins/aspects/download.rb +12 -0
  28. data/plugins/aspects/gallery/main.rb +9 -0
  29. data/plugins/aspects/highlight.rb +11 -0
  30. data/plugins/aspects/image.rb +12 -0
  31. data/plugins/aspects/imageinfo.rb +36 -2
  32. data/plugins/aspects/main.rb +16 -1
  33. data/plugins/aspects/pageinfo.rb +20 -2
  34. data/plugins/aspects/source.rb +12 -0
  35. data/plugins/aspects/subpages.rb +17 -1
  36. data/plugins/aspects/text.rb +12 -0
  37. data/plugins/blog/main.rb +4 -4
  38. data/plugins/editor/preview.rb +16 -0
  39. data/plugins/editor/recaptcha.rb +19 -0
  40. data/plugins/filters/editsection.rb +19 -0
  41. data/plugins/filters/locale.yml +11 -16
  42. data/plugins/filters/toc.rb +12 -0
  43. data/{views → plugins/history}/changes.slim +0 -0
  44. data/{views → plugins/history}/compare.slim +2 -2
  45. data/{views → plugins/history}/history.slim +1 -1
  46. data/plugins/history/locale.yml +40 -0
  47. data/plugins/history/main.rb +67 -0
  48. data/plugins/history/script.js +2 -0
  49. data/{static/script/12-olelo.historytable.js → plugins/history/script/00-historytable.js} +0 -0
  50. data/plugins/history/script/init.js +7 -0
  51. data/plugins/login/persistent.rb +11 -0
  52. data/plugins/repositories/git_grep.rb +19 -2
  53. data/plugins/repositories/gitrb_repository.rb +8 -0
  54. data/plugins/repositories/rugged_repository.rb +10 -0
  55. data/plugins/security/acl.rb +23 -0
  56. data/plugins/security/private_wiki.rb +11 -0
  57. data/plugins/utils/assets.rb +15 -21
  58. data/plugins/utils/store.rb +40 -19
  59. data/static/{images/favicon.png → favicon.png} +0 -0
  60. data/static/script.js +3 -5
  61. data/static/script/init.js +0 -1
  62. data/static/themes/atlantis/screen.scss +3 -3
  63. data/static/themes/atlantis/style.css +1 -1
  64. data/test/templates_test.rb +3 -11
  65. metadata +47 -49
  66. data/plugins/aspects/locale.yml +0 -87
  67. data/plugins/editor/locale.yml +0 -20
  68. data/plugins/login/locale.yml +0 -8
  69. data/plugins/repositories/locale.yml +0 -16
  70. data/plugins/security/locale.yml +0 -24
  71. data/views/show.slim +0 -8
data/.gitignore CHANGED
@@ -7,3 +7,4 @@ doc/api
7
7
  coverage
8
8
  attic
9
9
  test/.test
10
+ Gemfile.lock
data/Rakefile CHANGED
@@ -33,10 +33,11 @@ file('static/script.js' => Dir.glob('static/script/*.js')) { |t| shrink_js(t) }
33
33
  file('plugins/treeview/script.js' => Dir.glob('plugins/treeview/script/*.js')) {|t| shrink_js(t) }
34
34
  file('plugins/misc/fancybox/script.js' => Dir.glob('plugins/misc/fancybox/script/*.js')) {|t| shrink_js(t) }
35
35
  file('plugins/editor/markup/script.js' => Dir.glob('plugins/editor/markup/script/*.js')) {|t| shrink_js(t) }
36
+ file('plugins/history/script.js' => Dir.glob('plugins/history/script/*.js')) {|t| shrink_js(t) }
36
37
 
37
38
  namespace :gen do
38
39
  desc('Shrink JS files')
39
- task js: %w(static/script.js plugins/treeview/script.js plugins/misc/fancybox/script.js plugins/editor/markup/script.js)
40
+ task js: %w(static/script.js plugins/treeview/script.js plugins/misc/fancybox/script.js plugins/editor/markup/script.js plugins/history/script.js)
40
41
 
41
42
  desc('Compile CSS files')
42
43
  task css: %w(static/themes/atlantis/style.css
@@ -74,26 +75,59 @@ end
74
75
  namespace :locale do
75
76
  desc 'Sort locale yaml files'
76
77
  task :sort do
77
- # You need the i18n_yaml_sorter gem
78
+ require File.join(File.dirname(__FILE__), 'lib/olelo/virtualfs')
79
+ require 'i18n_yaml_sorter'
80
+
81
+ Dir['**/*.rb'].each do |file|
82
+ begin
83
+ locale = Olelo::VirtualFS::Embedded.new(file).read('locale.yml')
84
+ rescue
85
+ next
86
+ end
87
+ puts "Sorting #{file}"
88
+ result = I18nYamlSorter::Sorter.new(StringIO.new(locale)).sort
89
+ if result != locale
90
+ puts "Sorted #{file}:\n#{result}\n"
91
+ end
92
+ end
93
+
78
94
  Dir['**/locale.yml'].each do |file|
79
95
  puts "Sorting #{file}"
80
- system("sort_yaml < #{file} > #{file}.sorted; mv #{file}.sorted #{file}")
96
+ system("sort_yaml < #{file} > #{file}.sorted && mv #{file}.sorted #{file}")
81
97
  end
82
98
  end
83
99
 
84
100
  desc 'Check locales for missing keys'
85
101
  task :check do
102
+ require File.join(File.dirname(__FILE__), 'lib/olelo/virtualfs')
86
103
  require 'yaml'
104
+ files = {}
105
+ Dir['**/*.rb'].each do |file|
106
+ begin
107
+ files[file] = Olelo::VirtualFS::Embedded.new(file).read('locale.yml')
108
+ rescue
109
+ end
110
+ end
87
111
  Dir['**/locale.yml'].each do |file|
112
+ files[file] = File.read(file)
113
+ end
114
+
115
+ files.each do |file, content|
88
116
  puts "Checking #{file}"
89
- translations = YAML.load_file(file)
90
- puts 'en locale missing' unless translations['en']
91
- keys = translations['en'].keys
117
+ translations = YAML.load(content)
118
+ en = translations['en']
119
+ raise 'en locale missing' unless en
120
+ en_keys = en.keys
92
121
  translations.each do |locale,hash|
93
- delta = hash.keys - keys
94
- puts "\tLocale #{locale} has additional keys #{delta.join(' ')}" unless delta.empty?
95
- delta = keys - hash.keys
96
- puts "\tLocale #{locale} has missing keys #{delta.join(' ')}" unless delta.empty?
122
+ delta = hash.keys - en_keys
123
+ puts "\t#{locale} has additional keys #{delta.join(' ')}" unless delta.empty?
124
+ delta = en_keys - hash.keys
125
+ puts "\t#{locale} is missing the keys #{delta.join(' ')}" unless delta.empty?
126
+ (en_keys & hash.keys).each do |key|
127
+ if hash[key].count('%{') != en[key].count('%{')
128
+ puts "\t#{locale}:#{key} has invalid number of arguments"
129
+ end
130
+ end
97
131
  end
98
132
  end
99
133
  end
data/config.ru CHANGED
@@ -16,7 +16,6 @@ Olelo::Config.instance['app_path'] = app_path
16
16
  Olelo::Config.instance['config_path'] = ::File.join(app_path, 'config')
17
17
  Olelo::Config.instance['initializers_path'] = ::File.join(app_path, 'config', 'initializers')
18
18
  Olelo::Config.instance['plugins_path'] = ::File.join(app_path, 'plugins')
19
- Olelo::Config.instance['views_path'] = ::File.join(app_path, 'views')
20
19
  Olelo::Config.instance['themes_path'] = ::File.join(app_path, 'static', 'themes')
21
20
  Olelo::Config.instance['rack.session_secret'] = SecureRandom.hex
22
21
  Olelo::Config.instance.load!(::File.join(app_path, 'config', 'config.yml.default'))
@@ -84,6 +83,10 @@ end
84
83
 
85
84
  use Rack::StaticCache, urls: ['/static'], root: app_path
86
85
  use Rack::Session::Cookie, key: 'olelo.session', secret: Olelo::Config['rack.session_secret']
86
+
87
+ #require 'rack/perftools_profiler'
88
+ #use Rack::PerftoolsProfiler
89
+
87
90
  use Olelo::Middleware::DegradeMimeType
88
91
  use Olelo::Middleware::UAHeader
89
92
 
@@ -11,7 +11,7 @@ module Olelo
11
11
  attr_reader :page
12
12
  attr_setter :on_error
13
13
 
14
- has_around_hooks :request, :routing, :action, :title, :footer, :login_buttons,
14
+ has_around_hooks :routing, :action, :login_buttons,
15
15
  :edit_buttons, :attributes_buttons, :upload_buttons
16
16
  has_hooks :auto_login, :render, :menu, :head
17
17
 
@@ -59,18 +59,6 @@ module Olelo
59
59
  edit_menu.item(:move, href: build_path(page, action: :move), rel: 'nofollow')
60
60
  edit_menu.item(:delete, href: build_path(page, action: :delete), rel: 'nofollow')
61
61
  end
62
- history_menu = menu.item(:history, href: build_path(page, action: :history), accesskey: 'h')
63
-
64
- if @menu_versions
65
- head = !page.head? && (Olelo::Page.find(page.path) rescue nil)
66
- if page.previous_version || head || page.next_version
67
- history_menu.item(:older, href: build_path(page, original_params.merge(version: page.previous_version)),
68
- accesskey: 'o') if page.previous_version
69
- history_menu.item(:head, href: build_path(page.path, original_params), accesskey: 'c') if head
70
- history_menu.item(:newer, href: build_path(page, original_params.merge(version: page.next_version)),
71
- accesskey: 'n') if page.next_version
72
- end
73
- end
74
62
  end
75
63
  end
76
64
 
@@ -139,29 +127,6 @@ module Olelo
139
127
  render :profile
140
128
  end
141
129
 
142
- get '/changes/:version(/:path)' do
143
- @page = Page.find!(params[:path])
144
- begin
145
- @diff = page.diff(nil, params[:version])
146
- rescue => ex
147
- Olelo.logger.debug ex
148
- raise NotFound
149
- end
150
- @version = @diff.to
151
- cache_control etag: @version.to_s
152
- render :changes
153
- end
154
-
155
- get '/history(/:path)' do
156
- per_page = 30
157
- @page = Page.find!(params[:path])
158
- @page_nr = [params[:page].to_i, 1].max
159
- @history = page.history((@page_nr - 1) * per_page, per_page)
160
- @page_count = @page_nr + @history.length / per_page
161
- cache_control etag: page.etag
162
- render :history
163
- end
164
-
165
130
  get '/move/:path' do
166
131
  @page = Page.find!(params[:path])
167
132
  render :move
@@ -184,23 +149,6 @@ module Olelo
184
149
  end
185
150
  end
186
151
 
187
- get '/compare/:versions(/:path)', versions: '(?:\w+)\.{2,3}(?:\w+)' do
188
- @page = Page.find!(params[:path])
189
- versions = params[:versions].split(/\.{2,3}/)
190
- begin
191
- @diff = page.diff(versions.first, versions.last)
192
- rescue => ex
193
- Olelo.logger.debug ex
194
- raise NotFound
195
- end
196
- render :compare
197
- end
198
-
199
- get '/compare(/:path)' do
200
- versions = params[:versions] || []
201
- redirect build_path(params[:path], action: versions.size < 2 ? :history : "compare/#{versions.first}...#{versions.last}")
202
- end
203
-
204
152
  get '/edit(/:path)' do
205
153
  @page = Page.find!(params[:path])
206
154
  flash.info!(:info_binary.t(page: page.title, type: "#{page.mime.comment} (#{page.mime})")) unless page.editable?
@@ -261,7 +209,6 @@ module Olelo
261
209
  end
262
210
 
263
211
  def show_page
264
- @menu_versions = true
265
212
  render(:show, locals: {content: page.try(:content)})
266
213
  end
267
214
 
@@ -2,19 +2,24 @@
2
2
  module Olelo
3
3
  module BlockHelper
4
4
  def blocks
5
- @blocks ||= Hash.with_indifferent_access('')
5
+ @blocks ||= Hash.new('')
6
6
  end
7
7
 
8
- def define_block(name, content = nil)
9
- blocks[name] = block_given? ? yield : escape_html(content)
8
+ def define_block(name, content = nil, &block)
9
+ blocks[name] = block ? block : escape_html(content)
10
10
  ''
11
11
  end
12
12
 
13
+ def render_block(name)
14
+ block = blocks[name]
15
+ block.respond_to?(:call) ? block.call : block
16
+ end
17
+
13
18
  def include_block(name)
14
- with_hooks(name) { blocks[name] }.join.html_safe
19
+ wrap_block(name) { render_block(name) }
15
20
  end
16
21
 
17
- def render_block(name)
22
+ def wrap_block(name)
18
23
  with_hooks(name) { yield }.join.html_safe
19
24
  end
20
25
  end
@@ -299,7 +304,7 @@ module Olelo
299
304
  if block_given? || content
300
305
  define_block(:footer, content, &block)
301
306
  else
302
- include_block(:footer)
307
+ render_block(:footer)
303
308
  end
304
309
  end
305
310
 
@@ -307,7 +312,7 @@ module Olelo
307
312
  if block_given? || content
308
313
  define_block(:title, content, &block)
309
314
  else
310
- include_block(:title)
315
+ render_block(:title)
311
316
  end
312
317
  end
313
318
 
@@ -23,26 +23,23 @@ module Olelo
23
23
 
24
24
  def init_locale
25
25
  Locale.locale = Config['locale']
26
- Locale.load(File.join(File.dirname(__FILE__), 'locale.yml'))
26
+ Locale.add(YAML.load_file(File.join(File.dirname(__FILE__), 'locale.yml')))
27
27
  end
28
28
 
29
29
  def init_templates
30
30
  Templates.enable_caching if Config['production']
31
- Templates.loader = Class.new do
32
- def context
33
- Plugin.caller.first.try(:name)
34
- end
35
-
36
- def load(name)
37
- VirtualFS::Union.new(Plugin.caller.first.try(:virtual_fs),
38
- VirtualFS::Native.new(Config['views_path'])).read(name)
39
- end
40
- end.new
31
+ Templates.loader = proc do |name|
32
+ VirtualFS::Union.new(VirtualFS::Native.new(File.join(File.dirname(__FILE__), 'views')),
33
+ *Plugin.loaded.map(&:virtual_fs)).read(name)
34
+ end
41
35
  end
42
36
 
43
37
  def init_plugins
44
- # Load locales provided by plugins
45
- Plugin.after(:load) { Locale.load(File.join(File.dirname(file), 'locale.yml')) }
38
+ # Load locale provided by plugin
39
+ Plugin.after(:load) do
40
+ locale = virtual_fs.read('locale.yml') rescue nil
41
+ Locale.add(YAML.load(locale)) if locale
42
+ end
46
43
 
47
44
  # Configure plugin system
48
45
  Plugin.disabled = Config['disabled_plugins'].to_a
@@ -3,27 +3,22 @@ module Olelo
3
3
  module Locale
4
4
  @locale = nil
5
5
  @translations = Hash.with_indifferent_access
6
- @loaded = []
7
6
 
8
7
  class << self
9
8
  attr_accessor :locale
10
9
 
11
- # Load locale from file
10
+ # Add locale hash
12
11
  #
13
- # A locale is a yamlfile which maps
12
+ # A locale is a hash which maps
14
13
  # keys to strings.
15
14
  #
16
- # @param [String] file name
15
+ # @param [Hash] Locale hash
17
16
  # @return [void]
18
17
  #
19
- def load(file)
20
- if !@loaded.include?(file) && File.file?(file)
21
- locale = YAML.load_file(file)
22
- @translations.update(locale[$1] || {}) if @locale =~ /^(\w+)(_|-)/
23
- @translations.update(locale[@locale] || {})
24
- @translations.each_value(&:freeze)
25
- @loaded << file
26
- end
18
+ def add(locale)
19
+ @translations.update(locale[$1] || {}) if @locale =~ /^(\w+)(_|-)/
20
+ @translations.update(locale[@locale] || {})
21
+ @translations.each_value(&:freeze)
27
22
  end
28
23
 
29
24
  # Return translated string for key
@@ -7,19 +7,14 @@ cs_CZ:
7
7
  attribute_title: 'Titulek'
8
8
  attributes: 'Atributy'
9
9
  attributes_edited: 'Atributy stránky %{page} editovány'
10
- author: 'Autor'
11
10
  binary_file: 'Binární soubor'
12
11
  cancel: 'Zrušit'
13
12
  change_password: 'Změnit heslo'
14
- changes: 'Změny'
15
- changes_of: 'Změny stránky %{page}'
16
13
  changes_saved: 'Změny uloženy'
17
14
  comment: 'Komentář'
18
- compare: 'Porovnat %{name}'
19
15
  confirm_password: 'Potvrdit heslo'
20
16
  create_page: 'Vytvořit stránku %{page}'
21
17
  create_redirect: 'Vytvořit přesměrování'
22
- date: 'Datum'
23
18
  delete: 'Smazat'
24
19
  delete_page: 'Smazat stránku %{page}'
25
20
  deleted: 'Smazáno'
@@ -35,7 +30,6 @@ cs_CZ:
35
30
  groups: 'Skupiny'
36
31
  head: 'Nejnovější'
37
32
  history: 'Historie'
38
- history_of: 'Historie stránky %{page}'
39
33
  info_binary: 'Stránka %{page} je binární typ %{type} a nemůže být editována jako textový soubor.'
40
34
  invalid_email: 'e-mail je neplatný'
41
35
  invalid_mime_type: 'mime-type je neplatný'
@@ -48,10 +42,6 @@ cs_CZ:
48
42
  menu_actions_edit_delete: 'Smazat'
49
43
  menu_actions_edit_move: 'Přesunout'
50
44
  menu_actions_edit_new: 'Nová stránka'
51
- menu_actions_history: 'Historie'
52
- menu_actions_history_head: 'Aktuální'
53
- menu_actions_history_newer: 'Novější'
54
- menu_actions_history_older: 'Starší'
55
45
  menu_actions_view: 'Zobrazit'
56
46
  move: 'Přesunout'
57
47
  move_page: 'Přesunout stránku %{page}'
@@ -66,10 +56,10 @@ cs_CZ:
66
56
  not_found_title: '404 Not found'
67
57
  page_moved: 'Stránka %{page} přesunuta do %{destination}.'
68
58
  page_uploaded: 'Stránka %{page} nahrána'
69
- parents: 'Rodiče'
70
59
  password: 'Heslo'
71
60
  passwords_do_not_match: 'Hesla se neshodují'
72
61
  path: 'Cesta'
62
+ powered_by: 'Powered by <a href="https://github.com/minad/olelo">&#332;lelo</a>'
73
63
  profile_title: 'Profil uživatele %{user}'
74
64
  really_delete: 'Opravdu smazat?'
75
65
  reserved_path: 'Cesta je rezervována'
@@ -104,19 +94,14 @@ de:
104
94
  attribute_title: 'Titel'
105
95
  attributes: 'Attribute'
106
96
  attributes_edited: 'Attribute von %{page} bearbeitet'
107
- author: 'Autor'
108
97
  binary_file: 'Binärdatei'
109
98
  cancel: 'Abbrechen'
110
99
  change_password: 'Passwort ändern'
111
- changes: 'Änderungen'
112
- changes_of: 'Änderungen von %{page}'
113
100
  changes_saved: 'Änderungen gespeichert'
114
101
  comment: 'Kommentar'
115
- compare: 'Vergleiche %{name}'
116
102
  confirm_password: 'Bestätige Passwort'
117
103
  create_page: 'Neue %{page}'
118
104
  create_redirect: 'Weiterleitung'
119
- date: 'Datum'
120
105
  delete: 'Löschen'
121
106
  delete_page: 'Lösche %{page}'
122
107
  deleted: 'Gelöscht'
@@ -132,7 +117,6 @@ de:
132
117
  groups: 'Gruppen'
133
118
  head: 'Kopf'
134
119
  history: 'Historie'
135
- history_of: 'Historie von %{page}'
136
120
  info_binary: '%{page} ist eine Datei mit dem Typ %{type} und kann nicht wie eine Textdatei bearbeitet werden.'
137
121
  invalid_email: 'E-Mail ist ungültig'
138
122
  invalid_mime_type: 'Mime-Typ ist ungültig'
@@ -145,9 +129,6 @@ de:
145
129
  menu_actions_edit_delete: 'Löschen'
146
130
  menu_actions_edit_move: 'Verschieben'
147
131
  menu_actions_edit_new: 'Neue Seite'
148
- menu_actions_history: 'Historie'
149
- menu_actions_history_newer: 'Neuer'
150
- menu_actions_history_older: 'Älter'
151
132
  menu_actions_view: 'Ansicht'
152
133
  move: 'Verschieben'
153
134
  move_page: 'Verschiebe %{page}'
@@ -162,7 +143,6 @@ de:
162
143
  page_edited: '%{page} bearbeitet'
163
144
  page_moved: '%{page} verschoben nach %{destination}.'
164
145
  page_uploaded: 'Seite %{page} hochgeladen'
165
- parents: 'Eltern'
166
146
  password: 'Passwort'
167
147
  passwords_do_not_match: 'Passwörter stimmen nicht überein'
168
148
  path: 'Pfad'
@@ -201,19 +181,14 @@ en:
201
181
  attribute_title: 'Title'
202
182
  attributes: 'Attributes'
203
183
  attributes_edited: 'Attributes of %{page} edited'
204
- author: 'Author'
205
184
  binary_file: 'Binary file'
206
185
  cancel: 'Cancel'
207
186
  change_password: 'Change password'
208
- changes: 'Changes'
209
- changes_of: 'Changes of %{page}'
210
187
  changes_saved: 'Changes saved'
211
188
  comment: 'Comment'
212
- compare: 'Compare %{name}: %{from} → %{to}'
213
189
  confirm_password: 'Confirm password'
214
190
  create_page: 'Create %{page}'
215
191
  create_redirect: 'Create redirect'
216
- date: 'Date'
217
192
  delete: 'Delete'
218
193
  delete_page: 'Delete %{page}'
219
194
  deleted: 'Deleted'
@@ -229,7 +204,6 @@ en:
229
204
  groups: 'Groups'
230
205
  head: 'Head'
231
206
  history: 'History'
232
- history_of: 'History of %{page}'
233
207
  info_binary: '%{page} is a binary %{type} and cannot be edited like a text file.'
234
208
  invalid_email: 'E-Mail is invalid'
235
209
  invalid_mime_type: 'Invalid mime type'
@@ -252,7 +226,6 @@ en:
252
226
  page_edited: '%{page} edited'
253
227
  page_moved: '%{page} moved to %{destination}.'
254
228
  page_uploaded: 'Page %{page} uploaded'
255
- parents: 'Parents'
256
229
  password: 'Password'
257
230
  passwords_do_not_match: 'Passwords do not match'
258
231
  path: 'Path'
@@ -291,19 +264,14 @@ fr:
291
264
  attribute_title: "Titre"
292
265
  attributes: "Attributs"
293
266
  attributes_edited: "Attributs de %{page} modifiés"
294
- author: "Auteur"
295
267
  binary_file: "Fichier binaire"
296
268
  cancel: "Cancel"
297
269
  change_password: "Changer de mot de passe"
298
- changes: "Changement"
299
- changes_of: "Chamgements de %{page}"
300
270
  changes_saved: "Changement enregistrés"
301
271
  comment: "Commentaire"
302
- compare: "Comparer %{name}"
303
272
  confirm_password: "Confirmer le mot de passe"
304
273
  create_page: "Créer %{page}"
305
274
  create_redirect: "Créer une redirection"
306
- date: "Date"
307
275
  delete: "Effacer"
308
276
  delete_page: "Effacer %{page}"
309
277
  deleted: "Supprimé"
@@ -319,7 +287,6 @@ fr:
319
287
  groups: "Groupes"
320
288
  head: "Tête"
321
289
  history: "Historique"
322
- history_of: "Historique de %{page}"
323
290
  info_binary: "%{page} est un binaire %{type} et ne peut pas être édité comme un fichier texte."
324
291
  invalid_email: "Courriel invalide"
325
292
  invalid_mime_type: "Type MIME invalide"
@@ -333,7 +300,6 @@ fr:
333
300
  move_page: "Déplacer %{page}"
334
301
  name: "Nom"
335
302
  new_page: "Nouvelle page"
336
- newer: "Plus récent"
337
303
  no_changes: "Aucun changement"
338
304
  not_found_text: "Désolé, la page que vous recherchez n'a pas été trouvée."
339
305
  not_found_title: '404 Non trouvé'
@@ -343,7 +309,6 @@ fr:
343
309
  page_edited: "%{page} éditée"
344
310
  page_moved: "%{page} déplacer vers %{destination}."
345
311
  page_uploaded: "Page %{page} téléversé"
346
- parents: "Parents"
347
312
  password: "Mot de passe"
348
313
  passwords_do_not_match: "Les mots de passe ne correspondent pas"
349
314
  path: "Chemin"