olelo 0.9.4 → 0.9.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (72) hide show
  1. data/.gitignore +0 -1
  2. data/.travis.yml +8 -0
  3. data/README.creole +31 -11
  4. data/Rakefile +46 -21
  5. data/config/aspects.rb +19 -15
  6. data/lib/olelo/application.rb +2 -3
  7. data/lib/olelo/extensions.rb +3 -0
  8. data/lib/olelo/helper.rb +7 -5
  9. data/lib/olelo/locale.rb +1 -1
  10. data/lib/olelo/locale.yml +298 -204
  11. data/lib/olelo/page.rb +9 -1
  12. data/lib/olelo/plugin.rb +1 -1
  13. data/lib/olelo/repository.rb +1 -1
  14. data/lib/olelo/util.rb +3 -0
  15. data/lib/olelo/version.rb +1 -1
  16. data/olelo.gemspec +1 -1
  17. data/plugins/aspects/changelog.rb +7 -4
  18. data/plugins/aspects/locale.yml +69 -47
  19. data/plugins/blog/locale.yml +13 -9
  20. data/plugins/editor/locale.yml +16 -11
  21. data/plugins/filters/creole.rb +3 -6
  22. data/plugins/filters/fix_image_links.rb +20 -0
  23. data/plugins/filters/locale.yml +18 -13
  24. data/plugins/filters/s5/main.rb +2 -0
  25. data/plugins/login/locale.yml +6 -4
  26. data/plugins/repositories/gitrb_repository.rb +1 -1
  27. data/plugins/repositories/locale.yml +14 -10
  28. data/plugins/repositories/rugged_repository.rb +2 -3
  29. data/plugins/security/locale.yml +19 -13
  30. data/plugins/tags/math.rb +2 -1
  31. data/plugins/treeview/script.js +2 -2
  32. data/plugins/treeview/script/init.js +4 -0
  33. data/plugins/utils/xml.rb +14 -0
  34. data/static/script.js +296 -256
  35. data/static/script/02-history.js +1943 -0
  36. data/static/script/03-history.adapter.jquery.js +77 -0
  37. data/static/script/{03-jquery.ui.core.js → 04-jquery.ui.core.js} +0 -0
  38. data/static/script/{04-jquery.ui.widget.js → 05-jquery.ui.widget.js} +0 -0
  39. data/static/script/{05-jquery.ui.position.js → 06-jquery.ui.position.js} +0 -0
  40. data/static/script/{06-jquery.ui.menu.js → 07-jquery.ui.menu.js} +0 -0
  41. data/static/script/{07-jquery.ui.autocomplete.js → 08-jquery.ui.autocomplete.js} +0 -0
  42. data/static/script/{02-olelo.storage.js → 09-olelo.storage.js} +0 -0
  43. data/static/script/{08-olelo.i18n.js → 10-olelo.i18n.js} +0 -0
  44. data/static/script/{09-olelo.unsaved.js → 11-olelo.unsaved.js} +6 -2
  45. data/static/script/{10-olelo.historytable.js → 12-olelo.historytable.js} +0 -0
  46. data/static/script/13-olelo.pagination.js +30 -0
  47. data/static/script/{13-olelo.tabwidget.js → 14-olelo.tabwidget.js} +0 -0
  48. data/static/script/{14-olelo.timeago.js → 15-olelo.timeago.js} +14 -1
  49. data/static/script/{15-olelo.underliner.js → 16-olelo.underliner.js} +0 -0
  50. data/static/script/{16-olelo.ui.combobox.js → 17-olelo.ui.combobox.js} +0 -0
  51. data/static/script/init.js +10 -10
  52. data/static/themes/atlantis/screen.scss +11 -10
  53. data/static/themes/atlantis/style.css +1 -1
  54. data/test/config_test.rb +9 -0
  55. data/test/factory_test.rb +1 -1
  56. data/test/hash_extensions_test.rb +1 -1
  57. data/test/helper.rb +0 -1
  58. data/test/hooks_test.rb +1 -2
  59. data/test/object_extensions_test.rb +1 -2
  60. data/test/run.rb +12 -0
  61. data/test/string_extensions_test.rb +1 -1
  62. data/test/templates_test.rb +1 -3
  63. data/test/util_test.rb +1 -6
  64. data/views/compare.slim +4 -5
  65. data/views/edit.slim +2 -2
  66. data/views/history.slim +1 -1
  67. data/views/layout.slim +1 -2
  68. data/views/not_found.slim +2 -2
  69. data/views/show.slim +3 -4
  70. metadata +47 -44
  71. data/plugins/filters/fix_img_tag.rb +0 -16
  72. data/static/script/11-olelo.pagination.js +0 -18
data/.gitignore CHANGED
@@ -1,6 +1,5 @@
1
1
  *.log
2
2
  *.swp
3
- *.rbc
4
3
  .wiki
5
4
  .yardoc
6
5
  config.yml
@@ -1,4 +1,12 @@
1
1
  rvm:
2
+ - 1.9.2
2
3
  - 1.9.3
3
4
  - ruby-head
4
5
  - rbx-19mode
6
+ matrix:
7
+ allow_failures:
8
+ - rvm: rbx-19mode
9
+ # HACK: Fix problems with native libraries on ruby-head
10
+ before_install:
11
+ - gem install rugged -v 0.17.0.b7 -- --with-cflags='--std=gnu99'
12
+ - gem install nokogiri redcarpet -- --with-cflags='--std=gnu99'
@@ -1,5 +1,9 @@
1
1
  = Ōlelo Wiki
2
2
 
3
+ [[https://travis-ci.org/minad/olelo|{{https://secure.travis-ci.org/minad/olelo.png?branch=master|Build Status}}]]
4
+ [[https://gemnasium.com/minad/olelo|{{https://gemnasium.com/minad/olelo.png?travis|Dependency Status}}]]
5
+ [[https://codeclimate.com/github/minad/olelo|{{https://codeclimate.com/badge.png|Code Climate}}]]
6
+
3
7
  Ōlelo is a wiki that stores pages in a [[http://git-scm.org/|Git]] repository, supports many markup styles and has an extensible, hackable architecture!
4
8
  If you want to see a demo installation go to http://www.gitwiki.org/.
5
9
 
@@ -13,6 +17,7 @@ Core features:
13
17
  * Support for hierarchical wikis (directory structure)
14
18
  * File upload
15
19
  * History, commit and diff view
20
+ * Locales, currently supported languages Czech, English, French, German
16
21
 
17
22
  Features, implemented by plugins:
18
23
  * Support for many markup languages (Creole, Markdown, Textile, ...)
@@ -22,7 +27,7 @@ Features, implemented by plugins:
22
27
  * Syntax highlighted embedded code blocks
23
28
  * Image resizing, SVG to PNG/JPEG conversion
24
29
  * Auto-generated table of contents
25
- * Wiki syntax can be extended with tags
30
+ * Wiki syntax can be extended with tags (gist, math, footnotes, ...)
26
31
  * Editor preview
27
32
  * View pages as S5 presentation
28
33
  * Privacy features: Access control lists, Private wiki which needs login, readonly wiki
@@ -41,7 +46,7 @@ Go to a git repository via command line and start the Ōlelo webserver.
41
46
  $ olelo
42
47
  }}}
43
48
 
44
- Point your web browser at http://localhost:8080/.
49
+ Point your web browser at http://localhost:8080/. This is all you have to do, now you are good to go to use your wiki!
45
50
 
46
51
  == Installation from source
47
52
 
@@ -74,25 +79,22 @@ For production purposes, I recommend that you deploy the wiki with [[http://unic
74
79
  $ unicorn path-to/config.ru
75
80
  }}}
76
81
 
77
- Unicorn is a very flexible ruby application server and Ōlelo runs very well on it. You can adapt the number of Unicorn workers depending on the load you expect. It is
78
- a good idea to observe the Unicorn workers as described in https://github.com/blog/519-unicorn-god and kill missbehaving workers if necessary.
82
+ Unicorn is a very flexible ruby application server and Ōlelo runs very well on it. You can adapt the number of Unicorn workers depending on the load you expect. It is a good idea to observe the Unicorn workers as described in https://github.com/blog/519-unicorn-god and kill missbehaving workers if necessary.
79
83
 
80
84
  == Configuration
81
85
 
82
- For deployment you might want to tweak some settings. Ōlelo reads the files config/config.yml.default and config/config.yml in that order.
83
- So just copy the default configuration config/config.yml.default to config/config.yml and make your modifications. If you installed Ōlelo
84
- as gem this is not a good idea since you don't want to fiddle in the gem directory. For this purpose exists the environment variable OLELO_CONFIG which
86
+ For deployment you might want to tweak some settings. Ōlelo reads the files 'config/config.yml.default' and 'config/config.yml' in that order. So just copy the default configuration 'config/config.yml.default' to 'config/config.yml' and make your modifications. If you installed Ōlelo as gem this is not a good idea since you don't want to fiddle in the gem directory. For this purpose the environment variable '$OLELO_CONFIG' exists which
85
87
  can point to the configuration file that you want to use.
86
88
 
87
89
  {{{
88
90
  export OLELO_CONFIG=/home/olelo/olelo_config.yml
89
91
  }}}
90
92
 
91
- You can also use the OLELO_CONFIG environment variable if you want to run multiple Ōlelo instances with different configurations.
93
+ You can also use the '$OLELO_CONFIG' environment variable if you want to run multiple Ōlelo instances with different configurations, for example to serve different pages from different repositories.
92
94
 
93
95
  == Dependencies
94
96
 
95
- If you use Bundler or installed Ōlelo as gem you don't really have to care about the dependencies. The standard installation provides the core dependencies and a good selection of optional dependencies.
97
+ If you installed Ōlelo as gem or used Bundler you don't really have to care about the dependencies. The standard installation provides the core dependencies and a good selection of optional dependencies.
96
98
 
97
99
  Core dependencies:
98
100
  * [[http://www.git-scm.com|Git]]
@@ -109,15 +111,33 @@ Some dependencies are optional, for example depending on the markup you want to
109
111
  * [[http://nokogiri.org/|Nokogiri for auto-generated table of contents]]
110
112
  * [[http://pygments.org/|Pygments for syntax highlighting of code blocks]]
111
113
 
114
+ == Development
115
+
116
+ === Important concepts
117
+
118
+ * Plugin architecture
119
+ * Aspects under 'plugins/aspects' which provide different 'views' for a page
120
+ * Filters under 'plugins/filters' which make it possible to build up aspects from a filter chain.
121
+ These aspects are configured under 'config/aspects.rb'
122
+ * Tags are provided by the 'plugins/tags/main.rb' plugin and can be integrated in a filter chain.
123
+ They look like html tags and can be used to extend the wiki syntax.
124
+
125
+ === Tipps
126
+
127
+ * Execute 'rake --tasks' to see the available development tasks
128
+ * Activate development mode by setting the option 'production: false' in 'config/config.yml'
129
+ * Increase the log verbosity by setting 'log.level: DEBUG' in 'config/config.yml'
130
+ * Do not hesitate to create an issue at the [[https://github.com/minad/olelo/issues|issue tracker]]
131
+
112
132
  == Authors
113
133
 
114
- Git-Wiki was originally developed by Simon Rozet. The development of Ōlelo to its current state was done by Daniel Mendler and contributors.
115
- The current code base doesn't have much in common with the original Git-Wiki proof-of-concept.
134
+ Git-Wiki was originally developed by Simon Rozet. The development of Ōlelo to its current state was done by Daniel Mendler and contributors. The current code base doesn't have much in common with the original Git-Wiki proof-of-concept.
116
135
 
117
136
  Contributors:
118
137
  * Alex Eagle
119
138
  * Alex Wall
120
139
  * Hrvoje
140
+ * Korthaerd
121
141
  * Luca Greco
122
142
  * Pavel Suchmann
123
143
  * Raffael Schmid
data/Rakefile CHANGED
@@ -1,4 +1,4 @@
1
- task default: %w(test:spec)
1
+ task default: :test
2
2
 
3
3
  def shrink_js(t)
4
4
  #sh "cat #{t.prerequisites.sort.join(' ')} > #{t.name}"
@@ -42,21 +42,14 @@ namespace :gen do
42
42
  task css: %w(static/themes/atlantis/style.css
43
43
  plugins/treeview/treeview.css
44
44
  plugins/utils/pygments.css
45
- plugins/gallery/gallery.css
45
+ plugins/aspects/gallery/gallery.css
46
46
  plugins/misc/fancybox/jquery.fancybox.css
47
47
  plugins/blog/blog.css)
48
48
  end
49
49
 
50
- namespace :test do
51
- desc 'Run tests with bacon'
52
- task spec: FileList['test/*_test.rb'] do |t|
53
- sh "bacon -q -Ilib:test #{t.prerequisites.join(' ')}"
54
- end
55
-
56
- desc 'Generate test coverage report'
57
- task rcov: FileList['test/*_test.rb'] do |t|
58
- sh "rcov -Ilib:test #{t.prerequisites.join(' ')}"
59
- end
50
+ desc 'Run tests with bacon'
51
+ task test: FileList['test/*_test.rb'] do |t|
52
+ sh "bacon -q -Ilib:test test/run.rb"
60
53
  end
61
54
 
62
55
  desc 'Cleanup'
@@ -67,19 +60,51 @@ task :clean do |t|
67
60
  FileUtils.rm_rf '.wiki/log'
68
61
  end
69
62
 
70
- desc 'Generate documentation'
71
63
  namespace :doc do
72
- task :gen do; system("yard doc -o doc/api 'lib/**/*.rb' 'plugins/**/*.rb'"); end
73
- task :server do; system('yard server --reload'); end
74
- task :check do; system("yardcheck 'lib/**/*.rb' 'plugins/**/*.rb'"); end
64
+ desc 'Generate documentation'
65
+ task :gen do; sh "yard doc -o doc/api 'lib/**/*.rb' 'plugins/**/*.rb'"; end
66
+
67
+ desc 'Start YARD documentation server'
68
+ task :server do; sh 'yard server --reload'; end
69
+
70
+ desc 'Check YARD documentation'
71
+ task :check do; sh "yardcheck 'lib/**/*.rb' 'plugins/**/*.rb'"; end
72
+ end
73
+
74
+ namespace :locale do
75
+ desc 'Sort locale yaml files'
76
+ task :sort do
77
+ # You need the i18n_yaml_sorter gem
78
+ Dir['**/locale.yml'].each do |file|
79
+ puts "Sorting #{file}"
80
+ system("sort_yaml < #{file} > #{file}.sorted; mv #{file}.sorted #{file}")
81
+ end
82
+ end
83
+
84
+ desc 'Check locales for missing keys'
85
+ task :check do
86
+ require 'yaml'
87
+ Dir['**/locale.yml'].each do |file|
88
+ puts "Checking #{file}"
89
+ translations = YAML.load_file(file)
90
+ puts 'en locale missing' unless translations['en']
91
+ keys = translations['en'].keys
92
+ 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?
97
+ end
98
+ end
99
+ end
75
100
  end
76
101
 
77
102
  namespace :notes do
78
- task :todo do; system('ack T''ODO'); end
79
- task :fixme do; system('ack F''IXME'); end
80
- task :hack do; system('ack H''ACK'); end
81
- task :warning do; system('ack W''ARNING'); end
82
- task :important do; system('ack I''MPORTANT'); end
103
+ task :todo do; sh('ack T''ODO'); end
104
+ task :fixme do; sh('ack F''IXME'); end
105
+ task :hack do; sh('ack H''ACK'); end
106
+ task :warning do; sh('ack W''ARNING'); end
107
+ task :important do; sh('ack I''MPORTANT'); end
83
108
  end
84
109
 
85
110
  desc 'Show annotations'
@@ -67,7 +67,8 @@ aspect :page do
67
67
  remove_comments.tag_shortcuts
68
68
  creole_nowiki.tag { creole!.rubypants }
69
69
  end
70
- toc.interwiki(map: interwiki_map).link_classifier
70
+ fix_image_links.toc
71
+ interwiki(map: interwiki_map).link_classifier
71
72
  end
72
73
  end
73
74
 
@@ -78,7 +79,8 @@ aspect :s5 do
78
79
  filter do
79
80
  remove_comments.tag_shortcuts
80
81
  creole_nowiki.tag { creole!.rubypants }
81
- toc.interwiki(map: interwiki_map).link_classifier
82
+ fix_image_links.toc
83
+ interwiki(map: interwiki_map).link_classifier
82
84
  html_wrapper!.s5!
83
85
  end
84
86
  end
@@ -90,7 +92,7 @@ aspect :latex do
90
92
  filter do
91
93
  remove_comments.tag_shortcuts.creole_nowiki
92
94
  tag(static: true) { creole!.rubypants }
93
- toc.interwiki(map: interwiki_map)
95
+ interwiki(map: interwiki_map)
94
96
  html_wrapper!.xslt!(stylesheet: 'xhtml2latex.xsl')
95
97
  end
96
98
  end
@@ -107,7 +109,8 @@ aspect :page do
107
109
  remove_comments.tag_shortcuts
108
110
  mediawiki_nowiki.tag { mediawiki!.rubypants }
109
111
  end
110
- toc.interwiki(map: interwiki_map).link_classifier
112
+ fix_image_links.toc
113
+ interwiki(map: interwiki_map).link_classifier
111
114
  end
112
115
  end
113
116
 
@@ -118,7 +121,8 @@ aspect :s5 do
118
121
  filter do
119
122
  remove_comments.tag_shortcuts
120
123
  mediawiki_nowiki.tag { mediawiki!.rubypants }
121
- toc.interwiki(map: interwiki_map).link_classifier
124
+ fix_image_links.toc
125
+ interwiki(map: interwiki_map).link_classifier
122
126
  html_wrapper!.s5!
123
127
  end
124
128
  end
@@ -130,7 +134,7 @@ aspect :latex do
130
134
  filter do
131
135
  remove_comments.tag_shortcuts.mediawiki_nowiki
132
136
  tag(static: true) { mediawiki!.rubypants }
133
- toc.interwiki(map: interwiki_map)
137
+ interwiki(map: interwiki_map)
134
138
  html_wrapper!.xslt!(stylesheet: 'xhtml2latex.xsl')
135
139
  end
136
140
  end
@@ -145,7 +149,7 @@ aspect :page do
145
149
  filter do
146
150
  remove_comments.tag_shortcuts.textile_nowiki
147
151
  tag(disable: 'html:*') { textile!.rubypants }
148
- fix_img_tag.toc
152
+ fix_image_links.toc
149
153
  interwiki(map: interwiki_map).link_classifier
150
154
  end
151
155
  end
@@ -157,7 +161,7 @@ aspect :s5 do
157
161
  filter do
158
162
  remove_comments.tag_shortcuts.textile_nowiki
159
163
  tag(disable: 'html:*') { textile!.rubypants }
160
- fix_img_tag.toc
164
+ fix_image_links.toc
161
165
  interwiki(map: interwiki_map).link_classifier
162
166
  html_wrapper!.s5!
163
167
  end
@@ -170,7 +174,7 @@ aspect :latex do
170
174
  filter do
171
175
  remove_comments.tag_shortcuts.textile_nowiki
172
176
  tag(static: true, disable: 'html:*') { textile!.rubypants }
173
- toc.interwiki(map: interwiki_map)
177
+ interwiki(map: interwiki_map)
174
178
  html_wrapper!.xslt!(stylesheet: 'xhtml2latex.xsl')
175
179
  end
176
180
  end
@@ -187,7 +191,7 @@ aspect :page do
187
191
  remove_comments.tag_shortcuts.markdown_nowiki
188
192
  tag(disable: 'html:*') { markdown! }
189
193
  end
190
- fix_img_tag.toc
194
+ fix_image_links.toc
191
195
  interwiki(map: interwiki_map).link_classifier
192
196
  end
193
197
  end
@@ -199,7 +203,7 @@ aspect :s5 do
199
203
  filter do
200
204
  remove_comments.tag_shortcuts.markdown_nowiki
201
205
  tag(disable: 'html:*') { markdown! }
202
- fix_img_tag.toc
206
+ fix_image_links.toc
203
207
  interwiki(map: interwiki_map).link_classifier
204
208
  html_wrapper!.s5!
205
209
  end
@@ -212,7 +216,7 @@ aspect :latex do
212
216
  filter do
213
217
  remove_comments.tag_shortcuts.markdown_nowiki
214
218
  tag(static: true, disable: 'html:*') { markdown! }
215
- toc.interwiki(map: interwiki_map)
219
+ interwiki(map: interwiki_map)
216
220
  html_wrapper!.xslt!(stylesheet: 'xhtml2latex.xsl')
217
221
  end
218
222
  end
@@ -227,7 +231,7 @@ aspect :page do
227
231
  filter do
228
232
  remove_comments.tag_shortcuts
229
233
  tag { orgmode!.rubypants }
230
- fix_img_tag.toc
234
+ fix_image_links.toc
231
235
  interwiki(map: interwiki_map).link_classifier
232
236
  end
233
237
  end
@@ -239,7 +243,7 @@ aspect :s5 do
239
243
  filter do
240
244
  remove_comments.tag_shortcuts
241
245
  tag { orgmode!.rubypants }
242
- fix_img_tag.toc
246
+ fix_image_links.toc
243
247
  interwiki(map: interwiki_map).link_classifier
244
248
  html_wrapper!.s5!
245
249
  end
@@ -252,7 +256,7 @@ aspect :latex do
252
256
  filter do
253
257
  remove_comments.tag_shortcuts
254
258
  tag(static: true) { orgmode!.rubypants }
255
- toc.interwiki(map: interwiki_map)
259
+ interwiki(map: interwiki_map)
256
260
  html_wrapper!.xslt!(stylesheet: 'xhtml2latex.xsl')
257
261
  end
258
262
  end
@@ -154,10 +154,9 @@ module Olelo
154
154
 
155
155
  get '/history(/:path)' do
156
156
  per_page = 30
157
- limit = 90
158
157
  @page = Page.find!(params[:path])
159
158
  @page_nr = [params[:page].to_i, 1].max
160
- @history = page.history((@page_nr - 1) * per_page, limit)
159
+ @history = page.history((@page_nr - 1) * per_page, per_page)
161
160
  @page_count = @page_nr + @history.length / per_page
162
161
  @history = @history[0...per_page]
163
162
  cache_control version: page.version
@@ -205,7 +204,7 @@ module Olelo
205
204
 
206
205
  get '/edit(/:path)' do
207
206
  @page = Page.find!(params[:path])
208
- flash.info!(:info_binary.t(page: page.title, type: "#{page.mime.comment} (#{page.mime})")) unless page.mime.text?
207
+ flash.info!(:info_binary.t(page: page.title, type: "#{page.mime.comment} (#{page.mime})")) unless page.editable?
209
208
  render :edit
210
209
  end
211
210
 
@@ -1,4 +1,7 @@
1
1
  class Module
2
+ # HACK: private_constant was introduced in 1.9.3
3
+ def private_constant(*args); end unless respond_to?(:private_constant)
4
+
2
5
  # Generate accessor method with question mark
3
6
  #
4
7
  # @param [String, Symbol...] attrs Attributes to generate setter for
@@ -58,6 +58,7 @@ module Olelo
58
58
 
59
59
  def pagination(path, page_count, page_nr, options = {})
60
60
  return if page_count <= 1
61
+ unlimited = options.delete(:unlimited)
61
62
  li = []
62
63
  li << if page_nr > 1
63
64
  %{<a href="#{escape_html build_path(path, options.merge(page: page_nr - 1))}">&#9666;</a>}
@@ -86,11 +87,12 @@ module Olelo
86
87
  if max != page_count
87
88
  li << %{<span class="ellipsis"/>} << %{<a href="#{escape_html build_path(path, options.merge(page: page_count))}">#{page_count}</a>}
88
89
  end
89
- li << if page_nr < page_count
90
- %{<a href="#{escape_html build_path(path, options.merge(page: page_nr + 1))}">&#9656;</a>}
91
- else
92
- %{<span class="disabled">&#9656;</span>}
93
- end
90
+ if page_nr < page_count
91
+ li << %{<span class="ellipsis"/>} if unlimited
92
+ li << %{<a href="#{escape_html build_path(path, options.merge(page: page_nr + 1))}">&#9656;</a>}
93
+ else
94
+ li << %{<span class="disabled">&#9656;</span>}
95
+ end
94
96
  ('<ul class="pagination">' + li.map {|x| "<li>#{x}</li>"}.join + '</ul>').html_safe
95
97
  end
96
98
 
@@ -41,7 +41,7 @@ module Olelo
41
41
  if !key.to_s.ends_with?('_plural') && args[:count] && args[:count] != 1
42
42
  translate("#{key}_plural", args)
43
43
  elsif @translations[key]
44
- args.inject(@translations[key]) {|s,(k,v)| s.gsub("#\{#{k}\}", v.to_s) }
44
+ @translations[key] % args
45
45
  else
46
46
  args[:fallback] || "##{key}"
47
47
  end
@@ -1,132 +1,139 @@
1
- en:
2
- access_denied: 'Access denied'
3
- actions: 'Actions'
4
- already_exists: '#{page} exists already'
1
+ cs_CZ:
2
+ access_denied: 'Přístup odepřen'
3
+ actions: 'Akce'
4
+ already_exists: 'Stránka %{page} již existuje'
5
5
  attribute_mime: 'Mime-Type'
6
- attribute_no_title: 'Disable title'
7
- attribute_title: 'Title'
8
- attributes: 'Attributes'
9
- attributes_edited: 'Attributes of #{page} edited'
10
- author: 'Author'
11
- binary_file: 'Binary file'
12
- by: 'by'
13
- cancel: 'Cancel'
14
- change_password: 'Change password'
15
- changes: 'Changes'
16
- changes_of: 'Changes of #{page}'
17
- changes_saved: 'Changes saved'
18
- comment: 'Comment'
19
- compare: 'Compare #{name}'
20
- confirm_password: 'Confirm password'
21
- head: 'Head'
22
- create_page: 'Create #{page}'
23
- create_redirect: 'Create redirect'
24
- date: 'Date'
25
- delete: 'Delete'
26
- deleted: 'Deleted'
27
- delete_page: 'Delete #{page}'
28
- description: 'Description'
29
- destination: 'Destination'
30
- edit: 'Edit'
31
- edit_page: 'Editing #{page}'
32
- edit_page_section: 'Editing #{page} (Section)'
33
- email: 'E-Mail'
34
- empty_password: 'Empty password'
35
- info_binary: '#{page} is a binary #{type} and cannot be edited like a text file.'
36
- error_occurred: 'Oh snap! An error occurred.'
37
- file: 'File'
38
- groups: 'Groups'
39
- history: 'History'
40
- history_of: 'History of #{page}'
41
- invalid_email: 'E-Mail is invalid'
42
- invalid_mime_type: 'Invalid mime type'
43
- invalid_name: 'Name is invalid'
44
- invalid_path: 'Invalid path'
45
- last_modified: 'Last modified'
46
- login: 'Login'
47
- logout: 'Logout'
48
- menu_actions_edit_new: 'New Page'
49
- move: 'Move'
50
- move_page: 'Move #{page}'
51
- name: 'Name'
52
- newer: 'Newer'
53
- new_page: 'New Page'
54
- no_changes: 'No changes'
55
- old_password: 'Old password'
56
- page: 'Page'
57
- page_edited: '#{page} edited'
58
- page_not_found: 'Sorry, the page you were looking for was not found.'
59
- page_uploaded: 'Page #{page} uploaded'
60
- password: 'Password'
61
- passwords_do_not_match: 'Passwords do not match'
62
- parents: 'Parents'
63
- path: 'Path'
64
- profile_title: 'Profile of #{user}'
65
- really_delete: 'Really delete?'
66
- reserved_path: 'Path is reserved'
6
+ attribute_no_title: 'Skrýt titulek'
7
+ attribute_title: 'Titulek'
8
+ attributes: 'Atributy'
9
+ attributes_edited: 'Atributy stránky %{page} editovány'
10
+ author: 'Autor'
11
+ binary_file: 'Binární soubor'
12
+ cancel: 'Zrušit'
13
+ change_password: 'Změnit heslo'
14
+ changes: 'Změny'
15
+ changes_of: 'Změny stránky %{page}'
16
+ changes_saved: 'Změny uloženy'
17
+ comment: 'Komentář'
18
+ compare: 'Porovnat %{name}'
19
+ confirm_password: 'Potvrdit heslo'
20
+ create_page: 'Vytvořit stránku %{page}'
21
+ create_redirect: 'Vytvořit přesměrování'
22
+ date: 'Datum'
23
+ delete: 'Smazat'
24
+ delete_page: 'Smazat stránku %{page}'
25
+ deleted: 'Smazáno'
26
+ description: 'Popis'
27
+ destination: 'Cíl'
28
+ edit: 'Editovat'
29
+ edit_page: 'Editace stránky %{page}'
30
+ edit_page_section: 'Editovat %{page} (Sekci)'
31
+ email: 'e-mail'
32
+ empty_password: 'Prázdné heslo'
33
+ error_occurred: 'Ouvej! Vyskytla se chyba.'
34
+ file: 'Soubor'
35
+ groups: 'Skupiny'
36
+ head: 'Nejnovější'
37
+ history: 'Historie'
38
+ history_of: 'Historie stránky %{page}'
39
+ info_binary: 'Stránka %{page} je binární typ %{type} a nemůže být editována jako textový soubor.'
40
+ invalid_email: 'e-mail je neplatný'
41
+ invalid_mime_type: 'mime-type je neplatný'
42
+ invalid_name: 'Jméno je neplatné'
43
+ invalid_path: 'Neplatná cesta'
44
+ last_modified: 'Poslední modifikace'
45
+ login: 'Přihlášení'
46
+ logout: 'Odhlášení'
47
+ menu_actions_edit: 'Editovat'
48
+ menu_actions_edit_delete: 'Smazat'
49
+ menu_actions_edit_move: 'Přesunout'
50
+ 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
+ menu_actions_view: 'Zobrazit'
56
+ move: 'Přesunout'
57
+ move_page: 'Přesunout stránku %{page}'
58
+ name: 'Jméno'
59
+ new_page: 'Nová stránka'
60
+ no_changes: 'Žádné změny'
61
+ not_found_text: 'Pardon, stránka, kterou hledáte, nebyla nalezena.'
62
+ old_password: 'Staré heslo'
63
+ page: 'Stránka'
64
+ page_deleted: 'Stránka %{page} smazána.'
65
+ page_edited: 'Stránka %{page} editována'#
66
+ not_found_title: '404 Not found'
67
+ page_moved: 'Stránka %{page} přesunuta do %{destination}.'
68
+ page_uploaded: 'Stránka %{page} nahrána'
69
+ parents: 'Rodiče'
70
+ password: 'Heslo'
71
+ passwords_do_not_match: 'Hesla se neshodují'
72
+ path: 'Cesta'
73
+ profile_title: 'Profil uživatele %{user}'
74
+ really_delete: 'Opravdu smazat?'
75
+ reserved_path: 'Cesta je rezervována'
67
76
  reset: 'Reset'
68
- root: 'Root'
69
- page_deleted: '#{page} deleted.'
70
- page_moved: '#{page} moved to #{destination}.'
71
- save: 'Save'
72
- save_and_close: 'Save & Close'
73
- search: 'Search'
74
- settings: 'Settings'
75
- signup: 'Sign up'
76
- summary: 'Summary'
77
+ root: 'Hlavní strana'
78
+ save: 'Uložit'
79
+ save_and_close: 'Uložit a zavřít'
80
+ search: 'Hledat'
81
+ settings: 'Nastavení'
82
+ signup: 'Registrovat se'
83
+ summary: 'Souhrn'
77
84
  text: 'Text'
78
- title: 'Title'
79
- tree: 'Tree'
80
- type_select: 'Select value'
81
- type_stringlist: 'Comma-separated strings'
82
- upload_file: 'Upload file'
83
- upload: 'Upload'
84
- user: 'User'
85
- user_already_exists: 'User #{name} already exists'
86
- version: 'Version'
87
- version_conflict: 'Version conflict detected'
88
- wrong_user_or_pw: 'Wrong username or password'
89
- wrong_password: 'Wrong password'
85
+ title: 'Titulek'
86
+ tree: 'Strom'
87
+ type_select: 'Vybrat hodnotu'
88
+ type_stringlist: 'Řetězce oddělené čárkou'
89
+ upload: 'Nahrát'
90
+ upload_file: 'Nahrát soubor'
91
+ user: 'Uživatel'
92
+ user_already_exists: 'Uživatel %{name} již existuje'
93
+ version: 'Verze'
94
+ version_by: 'Verze %{version} od %{author}, %{date}'
95
+ version_conflict: 'Detekován konflikt verzí'
96
+ wrong_password: 'Chybné heslo'
97
+ wrong_user_or_pw: 'Chybné jméno uživatele nebo heslo'
90
98
  de:
91
99
  access_denied: 'Zugriff verweigert'
92
100
  actions: 'Aktionen'
93
- already_exists: '#{page} existiert bereits'
101
+ already_exists: '%{page} existiert bereits'
94
102
  attribute_mime: 'Mime-Typ'
95
103
  attribute_no_title: 'Titel deaktivieren'
96
104
  attribute_title: 'Titel'
97
105
  attributes: 'Attribute'
98
- attributes_edited: 'Attribute von #{page} bearbeitet'
106
+ attributes_edited: 'Attribute von %{page} bearbeitet'
99
107
  author: 'Autor'
100
108
  binary_file: 'Binärdatei'
101
- by: 'von'
102
109
  cancel: 'Abbrechen'
103
110
  change_password: 'Passwort ändern'
104
111
  changes: 'Änderungen'
105
- changes_of: 'Änderungen von #{page}'
112
+ changes_of: 'Änderungen von %{page}'
106
113
  changes_saved: 'Änderungen gespeichert'
107
114
  comment: 'Kommentar'
108
- compare: 'Vergleiche #{name}'
115
+ compare: 'Vergleiche %{name}'
109
116
  confirm_password: 'Bestätige Passwort'
110
- head: 'Kopf'
111
- create_page: 'Neue #{page}'
117
+ create_page: 'Neue %{page}'
112
118
  create_redirect: 'Weiterleitung'
113
119
  date: 'Datum'
114
120
  delete: 'Löschen'
121
+ delete_page: 'Lösche %{page}'
115
122
  deleted: 'Gelöscht'
116
- delete_page: 'Lösche #{page}'
117
123
  description: 'Beschreibung'
118
124
  destination: 'Ziel'
119
125
  edit: 'Bearbeiten'
120
- edit_page: 'Bearbeite #{page}'
121
- edit_page_section: 'Bearbeite #{page} (Bereich)'
126
+ edit_page: 'Bearbeite %{page}'
127
+ edit_page_section: 'Bearbeite %{page} (Bereich)'
122
128
  email: 'E-Mail'
123
129
  empty_password: 'Leeres Passwort'
124
- info_binary: '#{page} ist eine Datei mit dem Typ #{type} und kann nicht wie eine Textdatei bearbeitet werden.'
125
130
  error_occurred: 'Hoppla! Es ist ein Fehler aufgetreten.'
126
131
  file: 'Datei'
127
132
  groups: 'Gruppen'
133
+ head: 'Kopf'
128
134
  history: 'Historie'
129
- history_of: 'Historie von #{page}'
135
+ history_of: 'Historie von %{page}'
136
+ info_binary: '%{page} ist eine Datei mit dem Typ %{type} und kann nicht wie eine Textdatei bearbeitet werden.'
130
137
  invalid_email: 'E-Mail ist ungültig'
131
138
  invalid_mime_type: 'Mime-Typ ist ungültig'
132
139
  invalid_name: 'Name ist ungültig'
@@ -143,26 +150,28 @@ de:
143
150
  menu_actions_history_older: 'Älter'
144
151
  menu_actions_view: 'Ansicht'
145
152
  move: 'Verschieben'
146
- move_page: 'Verschiebe #{page}'
153
+ move_page: 'Verschiebe %{page}'
147
154
  name: 'Name'
148
155
  new_page: 'Neue Seite'
149
156
  no_changes: 'Keine Änderungen'
157
+ not_found_text: 'Die Seite wurde leider nicht gefunden.'
158
+ not_found_title: '404 Nicht gefunden'
150
159
  old_password: 'Altes Passwort'
151
160
  page: 'Seite'
152
- page_edited: '#{page} edited'
153
- page_not_found: 'Die Seite wurde leider nicht gefunden.'
154
- page_uploaded: 'Seite #{page} hochgeladen'
161
+ page_deleted: '%{page} gelöscht.'
162
+ page_edited: '%{page} bearbeitet'
163
+ page_moved: '%{page} verschoben nach %{destination}.'
164
+ page_uploaded: 'Seite %{page} hochgeladen'
165
+ parents: 'Eltern'
155
166
  password: 'Passwort'
156
167
  passwords_do_not_match: 'Passwörter stimmen nicht überein'
157
- parents: 'Eltern'
158
168
  path: 'Pfad'
159
- profile_title: 'Profil von #{user}'
169
+ powered_by: 'Powered by <a href="https://github.com/minad/olelo">&#332;lelo</a>'
170
+ profile_title: 'Profil von %{user}'
160
171
  really_delete: 'Wirklich löschen?'
161
172
  reserved_path: 'Pfad ist reserviert'
162
173
  reset: 'Zurücksetzen'
163
174
  root: 'Root'
164
- page_deleted: '#{page} gelöscht.'
165
- page_moved: '#{page} verschoben nach #{destination}.'
166
175
  save: 'Speichern'
167
176
  save_and_close: 'Speichern & Schließen'
168
177
  search: 'Suche'
@@ -171,111 +180,196 @@ de:
171
180
  summary: 'Zusammenfassung'
172
181
  text: 'Text'
173
182
  title: 'Titel'
183
+ tree: 'Baum'
174
184
  type_select: 'Wert auswählen'
175
185
  type_stringlist: 'Durch Komma getrennte Strings'
176
- tree: 'Baum'
177
- upload_file: 'Datei hochladen'
178
186
  upload: 'Hochladen'
187
+ upload_file: 'Datei hochladen'
179
188
  user: 'Benutzer'
180
- user_already_exists: 'Benutzer #{name} existiert bereits'
189
+ user_already_exists: 'Benutzer %{name} existiert bereits'
181
190
  version: 'Version'
191
+ version_by: 'Version %{version} von %{author}, %{date}'
182
192
  version_conflict: 'Versionskonflikt aufgetreten'
183
- wrong_user_or_pw: 'Falscher Benutzername oder falsches Passwort'
184
193
  wrong_password: 'Falsches Passwort'
185
- cs_CZ:
186
- access_denied: 'Přístup odepřen'
187
- actions: 'Akce'
188
- already_exists: 'Stránka #{page} již existuje'
194
+ wrong_user_or_pw: 'Falscher Benutzername oder falsches Passwort'
195
+ en:
196
+ access_denied: 'Access denied'
197
+ actions: 'Actions'
198
+ already_exists: '%{page} exists already'
189
199
  attribute_mime: 'Mime-Type'
190
- attribute_no_title: 'Skrýt titulek'
191
- attribute_title: 'Titulek'
192
- attributes: 'Atributy'
193
- attributes_edited: 'Atributy stránky #{page} editovány'
194
- author: 'Autor'
195
- binary_file: 'Binární soubor'
196
- by: 'od'
197
- cancel: 'Zrušit'
198
- change_password: 'Změnit heslo'
199
- changes: 'Změny'
200
- changes_of: 'Změny stránky #{page}'
201
- changes_saved: 'Změny uloženy'
202
- comment: 'Komentář'
203
- compare: 'Porovnat #{name}'
204
- confirm_password: 'Potvrdit heslo'
205
- head: 'Nejnovější'
206
- create_page: 'Vytvořit stránku #{page}'
207
- create_redirect: 'Vytvořit přesměrování'
208
- date: 'Datum'
209
- delete: 'Smazat'
210
- deleted: 'Smazáno'
211
- delete_page: 'Smazat stránku #{page}'
212
- description: 'Popis'
213
- destination: 'Cíl'
214
- edit: 'Editovat'
215
- edit_page: 'Editace stránky #{page}'
216
- edit_page_section: 'Editovat #{page} (Sekci)'
217
- email: 'e-mail'
218
- empty_password: 'Prázdné heslo'
219
- info_binary: 'Stránka #{page} je binární typ #{type} a nemůže být editována jako textový soubor.'
220
- error_occurred: 'Ouvej! Vyskytla se chyba.'
221
- file: 'Soubor'
222
- groups: 'Skupiny'
223
- history: 'Historie'
224
- history_of: 'Historie stránky #{page}'
225
- invalid_email: 'e-mail je neplatný'
226
- invalid_mime_type: 'mime-type je neplatný'
227
- invalid_name: 'Jméno je neplatné'
228
- invalid_path: 'Neplatná cesta'
229
- last_modified: 'Poslední modifikace'
230
- login: 'Přihlášení'
231
- logout: 'Odhlášení'
232
- menu_actions_edit: 'Editovat'
233
- menu_actions_edit_delete: 'Smazat'
234
- menu_actions_edit_move: 'Přesunout'
235
- menu_actions_edit_new: 'Nová stránka'
236
- menu_actions_history: 'Historie'
237
- menu_actions_history_newer: 'Novější'
238
- menu_actions_history_older: 'Starší'
239
- menu_actions_history_head: 'Aktuální'
240
- menu_actions_view: 'Zobrazit'
241
- move: 'Přesunout'
242
- move_page: 'Přesunout stránku #{page}'
243
- name: 'Jméno'
244
- newer: 'Novější'
245
- new_page: 'Nová stránka'
246
- no_changes: 'Žádné změny'
247
- old_password: 'Staré heslo'
248
- page: 'Stránka'
249
- page_edited: 'Stránka #{page} editována'
250
- page_not_found: 'Pardon, stránka, kterou hledáte, nebyla nalezena.'
251
- page_uploaded: 'Stránka #{page} nahrána'
252
- password: 'Heslo'
253
- passwords_do_not_match: 'Hesla se neshodují'
254
- parents: 'Rodiče'
255
- path: 'Cesta'
256
- profile_title: 'Profil uživatele #{user}'
257
- really_delete: 'Opravdu smazat?'
258
- reserved_path: 'Cesta je rezervována'
200
+ attribute_no_title: 'Disable title'
201
+ attribute_title: 'Title'
202
+ attributes: 'Attributes'
203
+ attributes_edited: 'Attributes of %{page} edited'
204
+ author: 'Author'
205
+ binary_file: 'Binary file'
206
+ cancel: 'Cancel'
207
+ change_password: 'Change password'
208
+ changes: 'Changes'
209
+ changes_of: 'Changes of %{page}'
210
+ changes_saved: 'Changes saved'
211
+ comment: 'Comment'
212
+ compare: 'Compare %{name}: %{from} → %{to}'
213
+ confirm_password: 'Confirm password'
214
+ create_page: 'Create %{page}'
215
+ create_redirect: 'Create redirect'
216
+ date: 'Date'
217
+ delete: 'Delete'
218
+ delete_page: 'Delete %{page}'
219
+ deleted: 'Deleted'
220
+ description: 'Description'
221
+ destination: 'Destination'
222
+ edit: 'Edit'
223
+ edit_page: 'Editing %{page}'
224
+ edit_page_section: 'Editing %{page} (Section)'
225
+ email: 'E-Mail'
226
+ empty_password: 'Empty password'
227
+ error_occurred: 'Oh snap! An error occurred.'
228
+ file: 'File'
229
+ groups: 'Groups'
230
+ head: 'Head'
231
+ history: 'History'
232
+ history_of: 'History of %{page}'
233
+ info_binary: '%{page} is a binary %{type} and cannot be edited like a text file.'
234
+ invalid_email: 'E-Mail is invalid'
235
+ invalid_mime_type: 'Invalid mime type'
236
+ invalid_name: 'Name is invalid'
237
+ invalid_path: 'Invalid path'
238
+ last_modified: 'Last modified'
239
+ login: 'Login'
240
+ logout: 'Logout'
241
+ menu_actions_edit_new: 'New Page'
242
+ move: 'Move'
243
+ move_page: 'Move %{page}'
244
+ name: 'Name'
245
+ new_page: 'New Page'
246
+ no_changes: 'No changes'
247
+ not_found_text: 'Sorry, the page you were looking for was not found.'
248
+ not_found_title: '404 Not found'
249
+ old_password: 'Old password'
250
+ page: 'Page'
251
+ page_deleted: '%{page} deleted.'
252
+ page_edited: '%{page} edited'
253
+ page_moved: '%{page} moved to %{destination}.'
254
+ page_uploaded: 'Page %{page} uploaded'
255
+ parents: 'Parents'
256
+ password: 'Password'
257
+ passwords_do_not_match: 'Passwords do not match'
258
+ path: 'Path'
259
+ powered_by: 'Powered by <a href="https://github.com/minad/olelo">&#332;lelo</a>'
260
+ profile_title: 'Profile of %{user}'
261
+ really_delete: 'Really delete?'
262
+ reserved_path: 'Path is reserved'
259
263
  reset: 'Reset'
260
- root: 'Hlavní strana'
261
- page_deleted: 'Stránka #{page} smazána.'
262
- page_moved: 'Stránka #{page} přesunuta do #{destination}.'
263
- save: 'Uložit'
264
- save_and_close: 'Uložit a zavřít'
265
- search: 'Hledat'
266
- settings: 'Nastavení'
267
- signup: 'Registrovat se'
268
- summary: 'Souhrn'
264
+ root: 'Root'
265
+ save: 'Save'
266
+ save_and_close: 'Save & Close'
267
+ search: 'Search'
268
+ settings: 'Settings'
269
+ signup: 'Sign up'
270
+ summary: 'Summary'
269
271
  text: 'Text'
270
- title: 'Titulek'
271
- tree: 'Strom'
272
- type_select: 'Vybrat hodnotu'
273
- type_stringlist: 'Řetězce oddělené čárkou'
274
- upload_file: 'Nahrát soubor'
275
- upload: 'Nahrát'
276
- user: 'Uživatel'
277
- user_already_exists: 'Uživatel #{name} již existuje'
278
- version: 'Verze'
279
- version_conflict: 'Detekován konflikt verzí'
280
- wrong_user_or_pw: 'Chybné jméno uživatele nebo heslo'
281
- wrong_password: 'Chybné heslo'
272
+ title: 'Title'
273
+ tree: 'Tree'
274
+ type_select: 'Select value'
275
+ type_stringlist: 'Comma-separated strings'
276
+ upload: 'Upload'
277
+ upload_file: 'Upload file'
278
+ user: 'User'
279
+ user_already_exists: 'User %{name} already exists'
280
+ version: 'Version'
281
+ version_by: 'Version %{version} by %{author}, %{date}'
282
+ version_conflict: 'Version conflict detected'
283
+ wrong_password: 'Wrong password'
284
+ wrong_user_or_pw: 'Wrong username or password'
285
+ fr:
286
+ access_denied: "Accès refusé"
287
+ actions: "Actions"
288
+ already_exists: "%{page} existe déjà"
289
+ attribute_mime: "Type MIME"
290
+ attribute_no_title: "Désactiver le titre"
291
+ attribute_title: "Titre"
292
+ attributes: "Attributs"
293
+ attributes_edited: "Attributs de %{page} modifiés"
294
+ author: "Auteur"
295
+ binary_file: "Fichier binaire"
296
+ cancel: "Cancel"
297
+ change_password: "Changer de mot de passe"
298
+ changes: "Changement"
299
+ changes_of: "Chamgements de %{page}"
300
+ changes_saved: "Changement enregistrés"
301
+ comment: "Commentaire"
302
+ compare: "Comparer %{name}"
303
+ confirm_password: "Confirmer le mot de passe"
304
+ create_page: "Créer %{page}"
305
+ create_redirect: "Créer une redirection"
306
+ date: "Date"
307
+ delete: "Effacer"
308
+ delete_page: "Effacer %{page}"
309
+ deleted: "Supprimé"
310
+ description: "Description"
311
+ destination: "Destination"
312
+ edit: "Éditer"
313
+ edit_page: "Modifier %{page}"
314
+ edit_page_section: "Modifier %{page} (Section)"
315
+ email: "Courriel"
316
+ empty_password: "Mot de passe vide"
317
+ error_occurred: "Oops ! Une erreur est survenue."
318
+ file: "Fichier"
319
+ groups: "Groupes"
320
+ head: "Tête"
321
+ history: "Historique"
322
+ history_of: "Historique de %{page}"
323
+ info_binary: "%{page} est un binaire %{type} et ne peut pas être édité comme un fichier texte."
324
+ invalid_email: "Courriel invalide"
325
+ invalid_mime_type: "Type MIME invalide"
326
+ invalid_name: "Nom invalide"
327
+ invalid_path: "Chemin invalide"
328
+ last_modified: "Dernière modification"
329
+ login: "Connexion"
330
+ logout: "Déconnexion"
331
+ menu_actions_edit_new: "Nouvelle page"
332
+ move: "Déplacer"
333
+ move_page: "Déplacer %{page}"
334
+ name: "Nom"
335
+ new_page: "Nouvelle page"
336
+ newer: "Plus récent"
337
+ no_changes: "Aucun changement"
338
+ not_found_text: "Désolé, la page que vous recherchez n'a pas été trouvée."
339
+ not_found_title: '404 Non trouvé'
340
+ old_password: "Ancien mot de passe"
341
+ page: "Page"
342
+ page_deleted: "%{page} supprimé."
343
+ page_edited: "%{page} éditée"
344
+ page_moved: "%{page} déplacer vers %{destination}."
345
+ page_uploaded: "Page %{page} téléversé"
346
+ parents: "Parents"
347
+ password: "Mot de passe"
348
+ passwords_do_not_match: "Les mots de passe ne correspondent pas"
349
+ path: "Chemin"
350
+ powered_by: 'Powered by <a href="https://github.com/minad/olelo">&#332;lelo</a>'
351
+ profile_title: "Profil de %{user}"
352
+ really_delete: "Effacer réellement ?"
353
+ reserved_path: "Chemin réservé"
354
+ reset: "Réinitialiser"
355
+ root: "Racine"
356
+ save: "Enregistrer"
357
+ save_and_close: "Enregistrer et fermer"
358
+ search: "Rechercher"
359
+ settings: "Paramètres"
360
+ signup: "S'enregistrer"
361
+ summary: "Sommaire"
362
+ text: "Texte"
363
+ title: "Titre"
364
+ tree: "Arbre"
365
+ type_select: "Sélectionnez une valeur"
366
+ type_stringlist: "Chaînes séparées par des virgules"
367
+ upload: "Téléverser"
368
+ upload_file: "Téléverser un fichier"
369
+ user: "Utilisateur"
370
+ user_already_exists: "L'utilisateur %{name} existe déjà"
371
+ version: "Version"
372
+ version_by: 'Version %{version} par %{author}, %{date}'
373
+ version_conflict: "Conflit de version détecté"
374
+ wrong_password: "Mot de passe incorect"
375
+ wrong_user_or_pw: "Nom d'utilisateur ou mot de passe incorect"