runo 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (149) hide show
  1. data/LICENSE +19 -0
  2. data/README.rdoc +120 -0
  3. data/bin/runo +35 -0
  4. data/lib/_error.rb +14 -0
  5. data/lib/_field.rb +260 -0
  6. data/lib/_i18n.rb +141 -0
  7. data/lib/_parser.rb +243 -0
  8. data/lib/_path.rb +86 -0
  9. data/lib/_storage/_storage.rb +213 -0
  10. data/lib/_storage/file.rb +200 -0
  11. data/lib/_storage/sequel.rb +174 -0
  12. data/lib/_storage/temp.rb +73 -0
  13. data/lib/_widget/action_create.rb +23 -0
  14. data/lib/_widget/action_login.rb +22 -0
  15. data/lib/_widget/action_signup.rb +16 -0
  16. data/lib/_widget/action_update.rb +16 -0
  17. data/lib/_widget/crumb.rb +24 -0
  18. data/lib/_widget/done.rb +16 -0
  19. data/lib/_widget/login.rb +25 -0
  20. data/lib/_widget/me.rb +31 -0
  21. data/lib/_widget/message.rb +51 -0
  22. data/lib/_widget/navi.rb +88 -0
  23. data/lib/_widget/submit.rb +49 -0
  24. data/lib/_widget/view_ym.rb +77 -0
  25. data/lib/_workflow/_workflow.rb +89 -0
  26. data/lib/_workflow/attachment.rb +50 -0
  27. data/lib/_workflow/blog.rb +28 -0
  28. data/lib/_workflow/contact.rb +23 -0
  29. data/lib/_workflow/forum.rb +26 -0
  30. data/lib/_workflow/register.rb +39 -0
  31. data/lib/meta/_meta.rb +20 -0
  32. data/lib/meta/group.rb +19 -0
  33. data/lib/meta/id.rb +59 -0
  34. data/lib/meta/owner.rb +21 -0
  35. data/lib/meta/timestamp.rb +118 -0
  36. data/lib/runo.rb +396 -0
  37. data/lib/scalar/checkbox.rb +68 -0
  38. data/lib/scalar/file.rb +144 -0
  39. data/lib/scalar/img.rb +112 -0
  40. data/lib/scalar/password.rb +58 -0
  41. data/lib/scalar/radio.rb +47 -0
  42. data/lib/scalar/select.rb +47 -0
  43. data/lib/scalar/text.rb +38 -0
  44. data/lib/scalar/textarea.rb +35 -0
  45. data/lib/scalar/textarea_pre.rb +14 -0
  46. data/lib/scalar/textarea_wiki.rb +173 -0
  47. data/lib/set/_set.rb +195 -0
  48. data/lib/set/dynamic.rb +177 -0
  49. data/lib/set/static.rb +102 -0
  50. data/lib/set/static_folder.rb +96 -0
  51. data/locale/en/index.po +242 -0
  52. data/locale/index.pot +243 -0
  53. data/locale/ja/index.po +242 -0
  54. data/locale/lazy_parser.rb +54 -0
  55. data/skel/config.ru +27 -0
  56. data/skel/skin/_users/00000000_frank-avatar.jpg +0 -0
  57. data/skel/skin/_users/00000000_frank-avatar_small.jpg +0 -0
  58. data/skel/skin/_users/00000000_frank.yaml +12 -0
  59. data/skel/skin/_users/00000000_root-avatar.jpg +0 -0
  60. data/skel/skin/_users/00000000_root-avatar_small.jpg +0 -0
  61. data/skel/skin/_users/00000000_root.yaml +11 -0
  62. data/skel/skin/_users/css/users.css +21 -0
  63. data/skel/skin/_users/css/users.less +25 -0
  64. data/skel/skin/_users/done.html +42 -0
  65. data/skel/skin/_users/index.html +46 -0
  66. data/skel/skin/_users/index.yaml +3 -0
  67. data/skel/skin/_users/summary.html +40 -0
  68. data/skel/skin/css/base.css +93 -0
  69. data/skel/skin/css/base.less +139 -0
  70. data/skel/skin/css/coax.css +199 -0
  71. data/skel/skin/css/coax.less +244 -0
  72. data/skel/skin/examples/blog/20091214_0001.yaml +8 -0
  73. data/skel/skin/examples/blog/20100630_0001.yaml +8 -0
  74. data/skel/skin/examples/blog/20100630_0002.yaml +14 -0
  75. data/skel/skin/examples/blog/20100701_0001.yaml +8 -0
  76. data/skel/skin/examples/blog/20100701_0002-a-20100701_0001-f.jpg +0 -0
  77. data/skel/skin/examples/blog/20100701_0002-a-20100701_0001-f_small.jpg +0 -0
  78. data/skel/skin/examples/blog/20100701_0002.yaml +19 -0
  79. data/skel/skin/examples/blog/frank/20100701_0001.yaml +10 -0
  80. data/skel/skin/examples/blog/frank/index.yaml +4 -0
  81. data/skel/skin/examples/blog/index.html +51 -0
  82. data/skel/skin/examples/blog/rss.xml +18 -0
  83. data/skel/skin/examples/contact/20100701_0001-file.txt +1 -0
  84. data/skel/skin/examples/contact/20100701_0001.yaml +15 -0
  85. data/skel/skin/examples/contact/20100701_0002.yaml +8 -0
  86. data/skel/skin/examples/contact/20100701_0003.yaml +9 -0
  87. data/skel/skin/examples/contact/index.html +47 -0
  88. data/skel/skin/examples/contact/js/contact.js +13 -0
  89. data/skel/skin/examples/contact/summary.html +54 -0
  90. data/skel/skin/examples/forum/20100701_0001.yaml +41 -0
  91. data/skel/skin/examples/forum/20100701_0002.yaml +25 -0
  92. data/skel/skin/examples/forum/index.html +68 -0
  93. data/skel/skin/examples/forum/summary.html +47 -0
  94. data/skel/skin/examples/index.html +75 -0
  95. data/skel/skin/index.html +41 -0
  96. data/skel/skin/js/base.js +50 -0
  97. data/t/locale/de/index.po +19 -0
  98. data/t/locale/en-GB/index.po +25 -0
  99. data/t/locale/ja/index.po +30 -0
  100. data/t/skin/_users/00000000_test.yaml +3 -0
  101. data/t/skin/_users/index.html +13 -0
  102. data/t/skin/foo/20091120_0001.yaml +7 -0
  103. data/t/skin/foo/bar/20091120_0001.yaml +5 -0
  104. data/t/skin/foo/bar/index.yaml +5 -0
  105. data/t/skin/foo/baz/css/baz.css +1 -0
  106. data/t/skin/foo/css/foo.css +1 -0
  107. data/t/skin/foo/index.html +14 -0
  108. data/t/skin/foo/index.yaml +7 -0
  109. data/t/skin/foo/not_css/foo.css +1 -0
  110. data/t/skin/foo/sub-20100306_0001.yaml +3 -0
  111. data/t/skin/index.yaml +3 -0
  112. data/t/skin/t_attachment/index.html +13 -0
  113. data/t/skin/t_contact/done.html +6 -0
  114. data/t/skin/t_contact/index.html +9 -0
  115. data/t/skin/t_file/index.html +16 -0
  116. data/t/skin/t_img/index.html +14 -0
  117. data/t/skin/t_img/test.jpg +0 -0
  118. data/t/skin/t_select/index.html +9 -0
  119. data/t/skin/t_store/index.html +9 -0
  120. data/t/skin/t_summary/20100326_0001.yaml +3 -0
  121. data/t/skin/t_summary/create.html +9 -0
  122. data/t/skin/t_summary/index.html +9 -0
  123. data/t/skin/t_summary/summary.html +9 -0
  124. data/t/t.rb +27 -0
  125. data/t/test_checkbox.rb +273 -0
  126. data/t/test_field.rb +330 -0
  127. data/t/test_file.rb +900 -0
  128. data/t/test_id.rb +215 -0
  129. data/t/test_img.rb +328 -0
  130. data/t/test_meta.rb +57 -0
  131. data/t/test_parser.rb +1266 -0
  132. data/t/test_password.rb +188 -0
  133. data/t/test_radio.rb +226 -0
  134. data/t/test_role.rb +249 -0
  135. data/t/test_runo.rb +742 -0
  136. data/t/test_runo_call.rb +1286 -0
  137. data/t/test_runo_i18n.rb +318 -0
  138. data/t/test_select.rb +182 -0
  139. data/t/test_set_complex.rb +527 -0
  140. data/t/test_set_dynamic.rb +1504 -0
  141. data/t/test_set_folder.rb +515 -0
  142. data/t/test_set_permit.rb +246 -0
  143. data/t/test_set_static.rb +445 -0
  144. data/t/test_storage.rb +915 -0
  145. data/t/test_text.rb +125 -0
  146. data/t/test_textarea.rb +138 -0
  147. data/t/test_timestamp.rb +473 -0
  148. data/t/test_workflow.rb +367 -0
  149. metadata +345 -0
@@ -0,0 +1,177 @@
1
+ # encoding: UTF-8
2
+
3
+ # Author:: Akira FUNAI
4
+ # Copyright:: Copyright (c) 2009 Akira FUNAI
5
+
6
+ class Runo::Set::Dynamic < Runo::Field
7
+
8
+ include Runo::Set
9
+
10
+ attr_reader :storage, :workflow
11
+
12
+ def initialize(meta = {})
13
+ @meta = meta
14
+ @storage = Runo::Storage.instance self
15
+ @workflow = Runo::Workflow.instance self
16
+ @meta = @workflow.class.const_get(:DEFAULT_META).merge @meta
17
+ @item_object = {}
18
+
19
+ my[:item] ||= {
20
+ 'default' => {:item => {}}
21
+ }
22
+ my[:item].each {|type, item_meta|
23
+ item_meta[:item] = @workflow.default_sub_items.merge item_meta[:item]
24
+ }
25
+
26
+ my[:p_size] = meta[:max] if meta[:max]
27
+ my[:preview] = :optional if meta[:tokens].to_a.include?('may_preview')
28
+ my[:preview] = :mandatory if meta[:tokens].to_a.include?('should_preview')
29
+ my[:order] = 'id' if meta[:tokens].to_a.include? 'asc'
30
+ my[:order] = '-id' if meta[:tokens].to_a.include? 'desc'
31
+ end
32
+
33
+ def meta_href
34
+ "#{Runo.uri}#{my[:path]}/"
35
+ end
36
+
37
+ def meta_tid
38
+ unless @meta[:tid]
39
+ t = Time.now
40
+ @meta[:tid] = t.strftime('%m%d%H%M%S.') + t.usec.to_s
41
+ end
42
+ @meta[:tid]
43
+ end
44
+
45
+ def get(arg = {})
46
+ if !arg[:conds].is_a?(::Hash) || arg[:conds].empty?
47
+ arg[:conds] = my[:conds].is_a?(::Hash) ? my[:conds].dup : {}
48
+ end
49
+ super
50
+ end
51
+
52
+ def commit(type = :temp)
53
+ @workflow.before_commit
54
+
55
+ items = pending_items
56
+ items.each {|id, item|
57
+ item.commit(:temp) || next
58
+ case type
59
+ when :temp
60
+ store(id, item) if @storage.is_a? Runo::Storage::Temp
61
+ when :persistent
62
+ store(id, item)
63
+ item.commit :persistent
64
+ end
65
+ }
66
+ if valid?
67
+ @result = (@action == :update) ? items : @action
68
+ @action = nil if type == :persistent
69
+ @workflow.after_commit
70
+ self
71
+ end
72
+ end
73
+
74
+ private
75
+
76
+ def _val
77
+ @storage.val
78
+ end
79
+
80
+ def _get(arg)
81
+ (@workflow._get(arg) || super) unless @workflow._hide? arg
82
+ end
83
+
84
+ def _get_by_tmpl(arg, tmpl = '')
85
+ if arg[:action] == :read || self != Runo.base
86
+ super
87
+ else
88
+ base_path = Runo.transaction[my[:tid]].is_a?(Runo::Field) ? nil : my[:base_path]
89
+ action = "#{base_path}/#{my[:tid]}/update.html"
90
+ <<_html
91
+ <form id="form_#{my[:name]}" method="post" enctype="multipart/form-data" action="#{action}">
92
+ <input name="_token" type="hidden" value="#{Runo.token}" />
93
+ #{super}</form>
94
+ _html
95
+ end
96
+ end
97
+
98
+ def _get_by_self_reference(arg)
99
+ super unless @workflow._hide?(arg)
100
+ end
101
+
102
+ def permit_get?(arg)
103
+ permit?(arg[:action]) || collect_item(arg[:conds] || {}).all? {|item|
104
+ item[:id][Runo::REX::ID_NEW] ?
105
+ item.permit?(:create) :
106
+ item.send(:permit_get?, :action => arg[:action])
107
+ }
108
+ end
109
+
110
+ def _post(action, v = nil)
111
+ if action == :create
112
+ @storage.build({})
113
+ @item_object.clear
114
+ end
115
+
116
+ case action
117
+ when :create, :update
118
+ v.each_key.sort_by {|id| id.to_s }.each {|id|
119
+ next unless id.is_a? ::String
120
+
121
+ v[id][:action] ||= id[Runo::REX::ID_NEW] ? :create : :update
122
+ item_instance(id).post(v[id][:action], v[id])
123
+ }
124
+ when :load, :load_default
125
+ @storage.build v
126
+ end
127
+
128
+ !pending_items.empty? || action == :delete
129
+ end
130
+
131
+ def store(id, item)
132
+ case item.action
133
+ when :create
134
+ return if id[Runo::REX::ID] || item.empty?
135
+ new_id = @storage.store(:new_id, item.val)
136
+ item[:id] = new_id
137
+ @item_object.delete id
138
+ @item_object[item[:id]] = item
139
+ when :update, nil
140
+ new_id = @storage.store(item[:id], item.val)
141
+ if new_id != item[:id]
142
+ @item_object[new_id] = @item_object.delete item[:id]
143
+ item[:id] = new_id
144
+ end
145
+ when :delete
146
+ @storage.delete id
147
+ @item_object.delete id
148
+ end
149
+ end
150
+
151
+ def collect_item(conds = {}, &block)
152
+ @storage.select(conds).collect {|id|
153
+ item = item_instance id
154
+ block ? block.call(item) : item
155
+ }
156
+ end
157
+
158
+ def item_instance(id, type = 'default')
159
+ unless @item_object[id]
160
+ item_meta = my[:item][type] || my[:item]['default']
161
+ @item_object[id] = Runo::Field.instance(
162
+ item_meta.merge(
163
+ :id => id,
164
+ :parent => self,
165
+ :klass => 'set-static'
166
+ )
167
+ )
168
+ if id[Runo::REX::ID_NEW]
169
+ @item_object[id].load_default
170
+ else
171
+ @item_object[id].load(@storage.val id)
172
+ end
173
+ end
174
+ @item_object[id]
175
+ end
176
+
177
+ end
@@ -0,0 +1,102 @@
1
+ # encoding: UTF-8
2
+
3
+ # Author:: Akira FUNAI
4
+ # Copyright:: Copyright (c) 2009 Akira FUNAI
5
+
6
+ require 'strscan'
7
+
8
+ class Runo::Set::Static < Runo::Field
9
+
10
+ include Runo::Set
11
+
12
+ def initialize(meta = {})
13
+ @meta = meta
14
+ @meta.merge!(Runo::Parser.parse_html meta[:html]) if meta[:html]
15
+ @meta[:item] ||= {}
16
+ @item_object = {}
17
+ end
18
+
19
+ def meta_href
20
+ my[:sd] ? "#{my[:sd][:href]}id=#{my[:id]}/" : "#{Runo.uri}#{my[:dir]}/"
21
+ end
22
+
23
+ def commit(type = :temp)
24
+ items = pending_items
25
+ items.each {|id, item| item.commit type }
26
+ if valid?
27
+ @result = (@action == :update) ? items : @action
28
+ @action = nil if type == :persistent
29
+ self
30
+ end
31
+ end
32
+
33
+ private
34
+
35
+ def _val
36
+ inject({}) {|v, item|
37
+ v[item[:id]] = item.val unless item.empty?
38
+ v
39
+ }
40
+ end
41
+
42
+ def _g_a_update(arg)
43
+ if arg[:orig_action] != :read
44
+ '<a>'
45
+ elsif permit_get?(:action => :update)
46
+ "<a href=\"#{_g_uri_update arg}\">"
47
+ elsif permit? :delete
48
+ "<a href=\"#{_g_uri_delete arg}\">"
49
+ else
50
+ '<a>'
51
+ end
52
+ end
53
+
54
+ def _g_uri_update(arg)
55
+ "#{my[:parent][:path]}/#{Runo::Path::path_of :id => my[:id]}update.html"
56
+ end
57
+
58
+ def _g_uri_delete(arg)
59
+ "#{my[:parent][:path]}/#{Runo::Path::path_of :id => my[:id]}preview_delete.html"
60
+ end
61
+
62
+ def _g_uri_detail(arg)
63
+ "#{my[:parent][:path]}/#{Runo::Path::path_of :id => my[:id]}read_detail.html"
64
+ end
65
+
66
+ def _g_hidden(arg)
67
+ if arg[:orig_action] == :preview
68
+ action = my[:id][Runo::REX::ID_NEW] ? :create : arg[:sub_action]
69
+ <<_html.chomp
70
+ <input type="hidden" name="#{my[:short_name]}.action" value="#{action}" />
71
+ _html
72
+ end
73
+ end
74
+
75
+ def _post(action, v = {})
76
+ each {|item|
77
+ id = item[:id]
78
+ item_action = (item.is_a?(Runo::Set) && action == :create) ? :update : action
79
+ item_action = v[id][:action] if v[id].is_a?(::Hash) && v[id][:action]
80
+ if [:load_default, :delete].include?(item_action) || v.key?(id) || item(id).is_a?(Runo::Meta)
81
+ item.post(item_action, v[id])
82
+ end
83
+ }
84
+ !pending_items.empty? || action == :delete
85
+ end
86
+
87
+ def collect_item(conds = {}, &block)
88
+ items = my[:item].keys
89
+ items &= conds[:id].to_a if conds[:id] # select item(s) by id
90
+ items.collect {|id|
91
+ item = @item_object[id] ||= Runo::Field.instance(
92
+ my[:item][id].merge(:id => id, :parent => self)
93
+ )
94
+ block ? block.call(item) : item
95
+ }
96
+ end
97
+
98
+ def val_cast(v)
99
+ v.is_a?(::Hash) ? v : {:self => v}
100
+ end
101
+
102
+ end
@@ -0,0 +1,96 @@
1
+ # encoding: UTF-8
2
+
3
+ # Author:: Akira FUNAI
4
+ # Copyright:: Copyright (c) 2009 Akira FUNAI
5
+
6
+ class Runo::Set::Static::Folder < Runo::Set::Static
7
+
8
+ def self.root
9
+ self.new(:id => '')
10
+ end
11
+
12
+ def initialize(meta = {})
13
+ meta[:dir] = meta[:parent] ? ::File.join(meta[:parent][:dir], meta[:id]) : meta[:id]
14
+ meta[:html] = load_html(meta[:dir], meta[:parent])
15
+ super
16
+
17
+ ::Dir.glob(::File.join Runo['skin_dir'], my[:html_dir].to_s, '*.html').each {|f|
18
+ action = ::File.basename(f, '.*').intern
19
+ merge_tmpl(@meta, Runo::Parser.parse_html(::File.read(f), action)) if action != :index
20
+ }
21
+ ::Dir.glob(::File.join Runo['skin_dir'], my[:html_dir].to_s, '*.xml').each {|f|
22
+ action = ::File.basename(f, '.*').intern
23
+ merge_tmpl(@meta, Runo::Parser.parse_xml(::File.read(f), action)) if action != :index
24
+ }
25
+
26
+ @meta[:tmpl].values.each {|tmpl|
27
+ tmpl.sub!(/<head>([\s\n]*)/i) {
28
+ "#{$&}<base href=\"@(href)\" />#{$1}"
29
+ }
30
+ } if @meta[:tmpl]
31
+
32
+ @meta.merge! load_yaml(my[:dir], my[:parent])
33
+ end
34
+
35
+ def meta_dir
36
+ @meta[:dir]
37
+ end
38
+
39
+ def meta_html_dir
40
+ if ::File.readable? ::File.join(Runo['skin_dir'], my[:dir], 'index.html')
41
+ my[:dir]
42
+ elsif my[:parent]
43
+ my[:parent][:html_dir]
44
+ end
45
+ end
46
+
47
+ private
48
+
49
+ def _get(arg)
50
+ if arg['main'] && action_tmpl = my[:tmpl][arg['main'][:action]]
51
+ _get_by_tmpl(arg, action_tmpl)
52
+ else
53
+ super
54
+ end
55
+ end
56
+
57
+ def collect_item(conds = {}, &block)
58
+ if conds[:id] =~ Runo::REX::ID && sd = item('main')
59
+ return sd.instance_eval { collect_item(conds, &block) }
60
+ elsif (
61
+ conds[:id] =~ /\A\w+\z/ &&
62
+ ::File.directory?(::File.join Runo['skin_dir'], my[:dir], conds[:id])
63
+ )
64
+ my[:item][conds[:id]] = {:klass => 'set-static-folder'}
65
+ end
66
+ super
67
+ end
68
+
69
+ def load_html(dir, parent, action = :index)
70
+ html_file = ::File.join Runo['skin_dir'], dir, "#{action}.html"
71
+ if ::File.exists? html_file
72
+ ::File.read html_file
73
+ elsif parent
74
+ parent[:html]
75
+ end
76
+ end
77
+
78
+ def load_yaml(dir, parent)
79
+ yaml_file = ::File.join(Runo['skin_dir'], dir, 'index.yaml')
80
+ meta = ::File.exists?(yaml_file) ? YAML.load_file(yaml_file) : {}
81
+ meta.keys.inject({}) {|m, k|
82
+ m[k.intern] = meta[k]
83
+ m
84
+ }
85
+ end
86
+
87
+ def merge_tmpl(meta, action_meta)
88
+ meta[:tmpl].merge! action_meta[:tmpl]
89
+ meta[:item].each {|id, val|
90
+ merge_tmpl(val, action_meta[:item][id]) if action_meta[:item][id]
91
+ } if action_meta[:item]
92
+ meta
93
+ end
94
+
95
+ end
96
+
@@ -0,0 +1,242 @@
1
+ # Copyright (C) 2009-2010 Akira FUNAI
2
+ # This file is distributed under the same license as the Runo package.
3
+ # Akira FUNAI <akira@funai.com>, 2010.
4
+ #
5
+ msgid ""
6
+ msgstr ""
7
+ "Project-Id-Version: Runo 0.1\n"
8
+ "POT-Creation-Date: 2010-05-09 17:07+0900\n"
9
+ "PO-Revision-Date: 2010-06-29 22:51+0900\n"
10
+ "Last-Translator: Akira FUNAI <akira@funai.com>\n"
11
+ "Language-Team: English <en@translate.freefriends.org>\n"
12
+ "MIME-Version: 1.0\n"
13
+ "Content-Type: text/plain; charset=UTF-8\n"
14
+ "Content-Transfer-Encoding: 8bit\n"
15
+ "Plural-Forms: nplurals=2; plural=(n != 1);\n"
16
+
17
+ #: lib/_widget/action_signup.rb:12
18
+ msgid "signup"
19
+ msgstr "signup"
20
+
21
+ #: lib/_workflow/_workflow.rb:11
22
+ msgid "item"
23
+ msgid_plural "items"
24
+ msgstr[0] "item"
25
+ msgstr[1] "items"
26
+
27
+ #: lib/_workflow/_workflow.rb:41
28
+ msgid "admin"
29
+ msgstr "admin"
30
+
31
+ #: lib/_workflow/_workflow.rb:41
32
+ msgid "group"
33
+ msgstr "group"
34
+
35
+ #: lib/_workflow/_workflow.rb:41
36
+ msgid "owner"
37
+ msgstr "owner"
38
+
39
+ #: lib/_workflow/_workflow.rb:41
40
+ msgid "user"
41
+ msgid_plural "users"
42
+ msgstr[0] "user"
43
+ msgstr[1] "users"
44
+
45
+ #: lib/_workflow/_workflow.rb:41
46
+ msgid "none"
47
+ msgstr "none"
48
+
49
+ #: lib/_workflow/_workflow.rb:94 lib/_workflow/attachment.rb:32
50
+ msgid "create"
51
+ msgstr "create"
52
+
53
+ #: lib/_workflow/_workflow.rb:94 lib/_workflow/attachment.rb:32
54
+ msgid "update"
55
+ msgstr "update"
56
+
57
+ #: lib/_workflow/_workflow.rb:94 lib/_workflow/attachment.rb:32
58
+ msgid "delete"
59
+ msgstr "delete"
60
+
61
+ #: lib/_workflow/_workflow.rb:99
62
+ msgid "preview"
63
+ msgstr "preview"
64
+
65
+ #: lib/_workflow/_workflow.rb:112
66
+ msgid "delete..."
67
+ msgstr "delete..."
68
+
69
+ #: lib/_workflow/attachment.rb:10
70
+ msgid "attachment"
71
+ msgid_plural "attachments"
72
+ msgstr[0] "attachment"
73
+ msgstr[1] "attachments"
74
+
75
+ #: lib/_workflow/blog.rb:11
76
+ msgid "entry"
77
+ msgid_plural "entries"
78
+ msgstr[0] "entry"
79
+ msgstr[1] "entries"
80
+
81
+ #: lib/_workflow/contact.rb:11
82
+ msgid "answer"
83
+ msgid_plural "answers"
84
+ msgstr[0] "answer"
85
+ msgstr[1] "answers"
86
+
87
+ #: lib/meta/id.rb:23
88
+ msgid "malformatted id"
89
+ msgstr "malformatted id"
90
+
91
+ #: lib/meta/id.rb:30
92
+ msgid "duplicate id: %{id}"
93
+ msgstr "duplicate id: %{id}"
94
+
95
+ #: lib/meta/timestamp.rb:44
96
+ msgid "%Y-%m-%dT%H:%M:%S"
97
+ msgstr "%Y-%m-%d %H:%M:%S"
98
+
99
+ #: lib/meta/timestamp.rb:63
100
+ msgid "update the timestamp"
101
+ msgstr "update the timestamp"
102
+
103
+ #: lib/scalar/checkbox.rb:22 lib/scalar/file.rb:55 lib/scalar/radio.rb:15
104
+ #: lib/scalar/select.rb:15 lib/scalar/text.rb:17 lib/scalar/textarea.rb:12
105
+ msgid "mandatory"
106
+ msgstr "mandatory"
107
+
108
+ #: lib/scalar/checkbox.rb:24 lib/scalar/radio.rb:17 lib/scalar/select.rb:19
109
+ msgid "no such option"
110
+ msgstr "no such option"
111
+
112
+ #: lib/scalar/file.rb:53
113
+ msgid "wrong file type: should be %{types}"
114
+ msgstr "wrong file type: should be %{types}"
115
+
116
+ #: lib/scalar/file.rb:53
117
+ msgid "too large: %{max} bytes maximum"
118
+ msgstr "too large: %{max} bytes maximum"
119
+
120
+ #: lib/scalar/file.rb:57
121
+ msgid "too small: %{min} bytes minimum"
122
+ msgstr "too small: %{min} bytes minimum"
123
+
124
+ #: lib/scalar/select.rb:31
125
+ msgid "please select"
126
+ msgstr "please select"
127
+
128
+ #: lib/scalar/text.rb:15 lib/scalar/textarea.rb:10
129
+ msgid "too long: %{max} characters maximum"
130
+ msgstr "too long: %{max} characters maximum"
131
+
132
+ #: lib/scalar/text.rb:19 lib/scalar/textarea.rb:14
133
+ msgid "too short: %{min} characters minimum"
134
+ msgstr "too short: %{min} characters minimum"
135
+
136
+ #: lib/set/dynamic.rb:112
137
+ msgid "login"
138
+ msgstr "login"
139
+
140
+ #: lib/set/dynamic.rb:118
141
+ msgid "done."
142
+ msgstr "done."
143
+
144
+ #: lib/set/dynamic.rb:125
145
+ msgid "please login."
146
+ msgstr "please login."
147
+
148
+ #: lib/set/dynamic.rb:127
149
+ msgid "please confirm."
150
+ msgstr "please confirm."
151
+
152
+ #: lib/set/dynamic.rb:129
153
+ msgid "malformed input."
154
+ msgstr "malformed input."
155
+
156
+ #: lib/set/dynamic.rb:134
157
+ msgid "%{result} %{n} %{item}."
158
+ msgstr "%{result} %{n} %{item}."
159
+
160
+ #: lib/set/dynamic.rb:136
161
+ msgid "created"
162
+ msgstr "created"
163
+
164
+ #: lib/set/dynamic.rb:137
165
+ msgid "updated"
166
+ msgstr "updated"
167
+
168
+ #: lib/set/dynamic.rb:138
169
+ msgid "deleted"
170
+ msgstr "deleted"
171
+
172
+ #: lib/set/dynamic.rb:161
173
+ msgid "create new %{item}..."
174
+ msgstr "create new %{item}..."
175
+
176
+ #: lib/set/dynamic.rb:181
177
+ msgid "prev"
178
+ msgstr "prev"
179
+
180
+ #: lib/set/dynamic.rb:186
181
+ msgid "next"
182
+ msgstr "next"
183
+
184
+ #: lib/set/dynamic.rb:294
185
+ msgid "%{year}/%{month}"
186
+ msgstr "%{year}/%{month}"
187
+
188
+ #: lib/set/dynamic.rb:301
189
+ msgid "Jan"
190
+ msgstr "Jan"
191
+
192
+ #: lib/set/dynamic.rb:301
193
+ msgid "Feb"
194
+ msgstr "Feb"
195
+
196
+ #: lib/set/dynamic.rb:301
197
+ msgid "Mar"
198
+ msgstr "Mar"
199
+
200
+ #: lib/set/dynamic.rb:301
201
+ msgid "Apr"
202
+ msgstr "Apr"
203
+
204
+ #: lib/set/dynamic.rb:301
205
+ msgid "May"
206
+ msgstr "May"
207
+
208
+ #: lib/set/dynamic.rb:301
209
+ msgid "Jun"
210
+ msgstr "Jun"
211
+
212
+ #: lib/set/dynamic.rb:301
213
+ msgid "Jul"
214
+ msgstr "Jul"
215
+
216
+ #: lib/set/dynamic.rb:301
217
+ msgid "Aug"
218
+ msgstr "Aug"
219
+
220
+ #: lib/set/dynamic.rb:301
221
+ msgid "Sep"
222
+ msgstr "Sep"
223
+
224
+ #: lib/set/dynamic.rb:301
225
+ msgid "Oct"
226
+ msgstr "Oct"
227
+
228
+ #: lib/set/dynamic.rb:301
229
+ msgid "Nov"
230
+ msgstr "Nov"
231
+
232
+ #: lib/set/dynamic.rb:301
233
+ msgid "Dec"
234
+ msgstr "Dec"
235
+
236
+ #: lib/set/static.rb:40
237
+ msgid "update..."
238
+ msgstr "update..."
239
+
240
+ #: lib/set/static_folder.rb:56
241
+ msgid "logout"
242
+ msgstr "logout"