runo 0.1.0

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 (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"