olelo 0.9.8 → 0.9.9

Sign up to get free protection for your applications and to get access to all the features.
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"