ransack 1.8.4 → 3.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (184) hide show
  1. checksums.yaml +5 -5
  2. data/.github/FUNDING.yml +3 -0
  3. data/.github/SECURITY.md +12 -0
  4. data/.github/workflows/cronjob.yml +102 -0
  5. data/.github/workflows/deploy.yml +35 -0
  6. data/.github/workflows/rubocop.yml +20 -0
  7. data/.github/workflows/test-deploy.yml +29 -0
  8. data/.github/workflows/test.yml +130 -0
  9. data/.gitignore +3 -0
  10. data/{lib/ransack/adapters/mongoid/3.2/.gitkeep → .nojekyll} +0 -0
  11. data/.rubocop.yml +44 -0
  12. data/CHANGELOG.md +352 -0
  13. data/CONTRIBUTING.md +25 -13
  14. data/Gemfile +26 -27
  15. data/README.md +65 -815
  16. data/Rakefile +1 -22
  17. data/bug_report_templates/test-ransack-scope-and-column-same-name.rb +78 -0
  18. data/bug_report_templates/test-ransacker-arel-present-predicate.rb +71 -0
  19. data/docs/.gitignore +19 -0
  20. data/docs/.nojekyll +0 -0
  21. data/docs/babel.config.js +3 -0
  22. data/docs/blog/2022-03-27-ransack-3.0.0.md +20 -0
  23. data/docs/docs/getting-started/_category_.json +4 -0
  24. data/docs/docs/getting-started/advanced-mode.md +46 -0
  25. data/docs/docs/getting-started/configuration.md +47 -0
  26. data/docs/docs/getting-started/search-matches.md +67 -0
  27. data/docs/docs/getting-started/simple-mode.md +284 -0
  28. data/docs/docs/getting-started/sorting.md +79 -0
  29. data/docs/docs/getting-started/using-predicates.md +282 -0
  30. data/docs/docs/going-further/_category_.json +4 -0
  31. data/docs/docs/going-further/acts-as-taggable-on.md +114 -0
  32. data/docs/docs/going-further/associations.md +70 -0
  33. data/docs/docs/going-further/custom-predicates.md +52 -0
  34. data/docs/docs/going-further/documentation.md +43 -0
  35. data/docs/docs/going-further/exporting-to-csv.md +49 -0
  36. data/docs/docs/going-further/external-guides.md +57 -0
  37. data/docs/docs/going-further/form-customisation.md +63 -0
  38. data/docs/docs/going-further/i18n.md +53 -0
  39. data/docs/docs/going-further/img/create_release.png +0 -0
  40. data/docs/docs/going-further/merging-searches.md +41 -0
  41. data/docs/docs/going-further/other-notes.md +428 -0
  42. data/docs/docs/going-further/polymorphic-search.md +40 -0
  43. data/docs/docs/going-further/ransackers.md +331 -0
  44. data/docs/docs/going-further/release_process.md +36 -0
  45. data/docs/docs/going-further/saving-queries.md +82 -0
  46. data/docs/docs/going-further/searching-postgres.md +57 -0
  47. data/docs/docs/going-further/wiki-contributors.md +82 -0
  48. data/docs/docs/intro.md +99 -0
  49. data/docs/docusaurus.config.js +120 -0
  50. data/docs/package.json +38 -0
  51. data/docs/sidebars.js +31 -0
  52. data/docs/src/components/HomepageFeatures/index.js +64 -0
  53. data/docs/src/components/HomepageFeatures/styles.module.css +11 -0
  54. data/docs/src/css/custom.css +39 -0
  55. data/docs/src/pages/index.module.css +23 -0
  56. data/docs/src/pages/markdown-page.md +7 -0
  57. data/docs/static/.nojekyll +0 -0
  58. data/docs/static/img/docusaurus.png +0 -0
  59. data/docs/static/img/favicon.ico +0 -0
  60. data/docs/static/img/logo.svg +1 -0
  61. data/docs/static/img/tutorial/docsVersionDropdown.png +0 -0
  62. data/docs/static/img/tutorial/localeDropdown.png +0 -0
  63. data/docs/static/img/undraw_docusaurus_mountain.svg +171 -0
  64. data/docs/static/img/undraw_docusaurus_react.svg +170 -0
  65. data/docs/static/img/undraw_docusaurus_tree.svg +40 -0
  66. data/docs/static/logo/ransack-h.png +0 -0
  67. data/docs/static/logo/ransack-h.svg +34 -0
  68. data/docs/static/logo/ransack-v.png +0 -0
  69. data/docs/static/logo/ransack-v.svg +34 -0
  70. data/docs/static/logo/ransack.png +0 -0
  71. data/docs/static/logo/ransack.svg +21 -0
  72. data/docs/yarn.lock +8436 -0
  73. data/lib/polyamorous/activerecord_6.1_ruby_2/join_association.rb +70 -0
  74. data/lib/polyamorous/activerecord_6.1_ruby_2/join_dependency.rb +92 -0
  75. data/lib/polyamorous/activerecord_6.1_ruby_2/reflection.rb +11 -0
  76. data/lib/polyamorous/activerecord_7.0_ruby_2/join_association.rb +1 -0
  77. data/lib/polyamorous/activerecord_7.0_ruby_2/join_dependency.rb +1 -0
  78. data/lib/polyamorous/activerecord_7.0_ruby_2/reflection.rb +1 -0
  79. data/lib/polyamorous/activerecord_7.1_ruby_2/join_association.rb +1 -0
  80. data/lib/polyamorous/activerecord_7.1_ruby_2/join_dependency.rb +1 -0
  81. data/lib/polyamorous/activerecord_7.1_ruby_2/reflection.rb +1 -0
  82. data/lib/polyamorous/join.rb +70 -0
  83. data/lib/polyamorous/polyamorous.rb +24 -0
  84. data/lib/polyamorous/swapping_reflection_class.rb +11 -0
  85. data/lib/polyamorous/tree_node.rb +7 -0
  86. data/lib/polyamorous.rb +1 -0
  87. data/lib/ransack/adapters/active_record/base.rb +14 -3
  88. data/lib/ransack/adapters/active_record/context.rb +140 -196
  89. data/lib/ransack/adapters/active_record/ransack/constants.rb +19 -4
  90. data/lib/ransack/adapters/active_record/ransack/context.rb +9 -19
  91. data/lib/ransack/adapters/active_record/ransack/nodes/condition.rb +7 -7
  92. data/lib/ransack/adapters/active_record/ransack/translate.rb +1 -5
  93. data/lib/ransack/adapters/active_record/ransack/visitor.rb +23 -0
  94. data/lib/ransack/adapters/active_record.rb +0 -9
  95. data/lib/ransack/adapters.rb +2 -0
  96. data/lib/ransack/configuration.rb +52 -2
  97. data/lib/ransack/constants.rb +1 -5
  98. data/lib/ransack/context.rb +29 -24
  99. data/lib/ransack/helpers/form_builder.rb +12 -6
  100. data/lib/ransack/helpers/form_helper.rb +11 -3
  101. data/lib/ransack/helpers.rb +1 -1
  102. data/lib/ransack/locale/ar.yml +70 -0
  103. data/lib/ransack/locale/az.yml +70 -0
  104. data/lib/ransack/locale/bg.yml +70 -0
  105. data/lib/ransack/locale/ca.yml +70 -0
  106. data/lib/ransack/locale/el.yml +70 -0
  107. data/lib/ransack/locale/es.yml +22 -22
  108. data/lib/ransack/locale/fa.yml +70 -0
  109. data/lib/ransack/locale/fi.yml +71 -0
  110. data/lib/ransack/locale/nl.yml +4 -4
  111. data/lib/ransack/locale/ru.yml +70 -0
  112. data/lib/ransack/locale/sk.yml +70 -0
  113. data/lib/ransack/locale/sv.yml +70 -0
  114. data/lib/ransack/locale/tr.yml +70 -0
  115. data/lib/ransack/locale/zh-CN.yml +12 -12
  116. data/lib/ransack/nodes/attribute.rb +2 -2
  117. data/lib/ransack/nodes/condition.rb +7 -1
  118. data/lib/ransack/nodes/grouping.rb +3 -8
  119. data/lib/ransack/nodes/sort.rb +3 -3
  120. data/lib/ransack/nodes/value.rb +3 -3
  121. data/lib/ransack/predicate.rb +13 -20
  122. data/lib/ransack/search.rb +7 -4
  123. data/lib/ransack/translate.rb +115 -115
  124. data/lib/ransack/version.rb +1 -1
  125. data/lib/ransack/visitor.rb +1 -12
  126. data/lib/ransack.rb +7 -5
  127. data/ransack.gemspec +9 -25
  128. data/spec/blueprints/articles.rb +1 -1
  129. data/spec/blueprints/comments.rb +1 -1
  130. data/spec/blueprints/notes.rb +1 -1
  131. data/spec/blueprints/tags.rb +1 -1
  132. data/spec/console.rb +5 -5
  133. data/spec/helpers/polyamorous_helper.rb +13 -0
  134. data/spec/helpers/ransack_helper.rb +1 -1
  135. data/spec/polyamorous/activerecord_compatibility_spec.rb +15 -0
  136. data/spec/polyamorous/join_association_spec.rb +30 -0
  137. data/spec/polyamorous/join_dependency_spec.rb +81 -0
  138. data/spec/polyamorous/join_spec.rb +19 -0
  139. data/spec/ransack/adapters/active_record/base_spec.rb +105 -11
  140. data/spec/ransack/adapters/active_record/context_spec.rb +63 -24
  141. data/spec/ransack/configuration_spec.rb +24 -0
  142. data/spec/ransack/helpers/form_builder_spec.rb +3 -15
  143. data/spec/ransack/helpers/form_helper_spec.rb +135 -168
  144. data/spec/ransack/nodes/condition_spec.rb +13 -0
  145. data/spec/ransack/nodes/grouping_spec.rb +2 -2
  146. data/spec/ransack/nodes/value_spec.rb +115 -0
  147. data/spec/ransack/predicate_spec.rb +54 -2
  148. data/spec/ransack/search_spec.rb +266 -36
  149. data/spec/spec_helper.rb +14 -5
  150. data/spec/support/schema.rb +99 -21
  151. metadata +117 -187
  152. data/.travis.yml +0 -86
  153. data/lib/ransack/adapters/active_record/3.0/compat.rb +0 -179
  154. data/lib/ransack/adapters/active_record/3.0/context.rb +0 -203
  155. data/lib/ransack/adapters/active_record/3.1/context.rb +0 -212
  156. data/lib/ransack/adapters/active_record/3.2/context.rb +0 -44
  157. data/lib/ransack/adapters/active_record/compat.rb +0 -14
  158. data/lib/ransack/adapters/mongoid/attributes/attribute.rb +0 -37
  159. data/lib/ransack/adapters/mongoid/attributes/order_predications.rb +0 -17
  160. data/lib/ransack/adapters/mongoid/attributes/predications.rb +0 -141
  161. data/lib/ransack/adapters/mongoid/base.rb +0 -134
  162. data/lib/ransack/adapters/mongoid/context.rb +0 -212
  163. data/lib/ransack/adapters/mongoid/inquiry_hash.rb +0 -23
  164. data/lib/ransack/adapters/mongoid/ransack/constants.rb +0 -88
  165. data/lib/ransack/adapters/mongoid/ransack/context.rb +0 -60
  166. data/lib/ransack/adapters/mongoid/ransack/nodes/condition.rb +0 -27
  167. data/lib/ransack/adapters/mongoid/ransack/translate.rb +0 -13
  168. data/lib/ransack/adapters/mongoid/ransack/visitor.rb +0 -24
  169. data/lib/ransack/adapters/mongoid/table.rb +0 -35
  170. data/lib/ransack/adapters/mongoid.rb +0 -15
  171. data/spec/mongoid/adapters/mongoid/base_spec.rb +0 -314
  172. data/spec/mongoid/adapters/mongoid/context_spec.rb +0 -56
  173. data/spec/mongoid/configuration_spec.rb +0 -162
  174. data/spec/mongoid/dependencies_spec.rb +0 -8
  175. data/spec/mongoid/helpers/ransack_helper.rb +0 -11
  176. data/spec/mongoid/nodes/condition_spec.rb +0 -49
  177. data/spec/mongoid/nodes/grouping_spec.rb +0 -13
  178. data/spec/mongoid/predicate_spec.rb +0 -155
  179. data/spec/mongoid/search_spec.rb +0 -445
  180. data/spec/mongoid/support/mongoid.yml +0 -11
  181. data/spec/mongoid/support/schema.rb +0 -135
  182. data/spec/mongoid/translate_spec.rb +0 -14
  183. data/spec/mongoid_spec_helper.rb +0 -63
  184. data/spec/ransack/dependencies_spec.rb +0 -12
@@ -5,7 +5,27 @@ module Ransack
5
5
  module Configuration
6
6
 
7
7
  mattr_accessor :predicates, :options
8
- self.predicates = {}
8
+
9
+ class PredicateCollection
10
+ attr_reader :sorted_names_with_underscores
11
+
12
+ def initialize
13
+ @collection = {}
14
+ @sorted_names_with_underscores = []
15
+ end
16
+
17
+ delegate :[], :keys, :has_key?, to: :@collection
18
+
19
+ def []=(key, value)
20
+ @sorted_names_with_underscores << [key, '_' + key]
21
+ @sorted_names_with_underscores.sort! { |(a, _), (b, _)| b.length <=> a.length }
22
+
23
+ @collection[key] = value
24
+ end
25
+ end
26
+
27
+ self.predicates = PredicateCollection.new
28
+
9
29
  self.options = {
10
30
  :search_key => :q,
11
31
  :ignore_unknown_conditions => true,
@@ -13,7 +33,9 @@ module Ransack
13
33
  :up_arrow => '&#9660;'.freeze,
14
34
  :down_arrow => '&#9650;'.freeze,
15
35
  :default_arrow => nil,
16
- :sanitize_scope_args => true
36
+ :sanitize_scope_args => true,
37
+ :postgres_fields_sort_option => nil,
38
+ :strip_whitespace => true
17
39
  }
18
40
 
19
41
  def configure
@@ -121,6 +143,21 @@ module Ransack
121
143
  self.options[:sanitize_scope_args] = boolean
122
144
  end
123
145
 
146
+ # The `NULLS FIRST` and `NULLS LAST` options can be used to determine
147
+ # whether nulls appear before or after non-null values in the sort ordering.
148
+ #
149
+ # User may want to configure it like this:
150
+ #
151
+ # Ransack.configure do |c|
152
+ # c.postgres_fields_sort_option = :nulls_first # or e.g. :nulls_always_last
153
+ # end
154
+ #
155
+ # See this feature: https://www.postgresql.org/docs/13/queries-order.html
156
+ #
157
+ def postgres_fields_sort_option=(setting)
158
+ self.options[:postgres_fields_sort_option] = setting
159
+ end
160
+
124
161
  # By default, Ransack displays sort order indicator arrows in sort links.
125
162
  # The default may be globally overridden in an initializer file like
126
163
  # `config/initializers/ransack.rb` as follows:
@@ -134,6 +171,19 @@ module Ransack
134
171
  self.options[:hide_sort_order_indicators] = boolean
135
172
  end
136
173
 
174
+ # By default, Ransack displays strips all whitespace when searching for a string.
175
+ # The default may be globally changed in an initializer file like
176
+ # `config/initializers/ransack.rb` as follows:
177
+ #
178
+ # Ransack.configure do |config|
179
+ # # Enable whitespace stripping for string searches
180
+ # config.strip_whitespace = true
181
+ # end
182
+ #
183
+ def strip_whitespace=(boolean)
184
+ self.options[:strip_whitespace] = boolean
185
+ end
186
+
137
187
  def arel_predicate_with_suffix(arel_predicate, suffix)
138
188
  if arel_predicate === Proc
139
189
  proc { |v| "#{arel_predicate.call(v)}#{suffix}" }
@@ -36,7 +36,7 @@ module Ransack
36
36
  'lt'.freeze, 'lteq'.freeze,
37
37
  'gt'.freeze, 'gteq'.freeze,
38
38
  'in'.freeze, 'not_in'.freeze
39
- ].freeze
39
+ ].freeze
40
40
  A_S_I = ['a'.freeze, 's'.freeze, 'i'.freeze].freeze
41
41
 
42
42
  EQ = 'eq'.freeze
@@ -45,11 +45,7 @@ module Ransack
45
45
  NOT_EQ_ALL = 'not_eq_all'.freeze
46
46
  CONT = 'cont'.freeze
47
47
 
48
- RAILS_4_1 = '4.1'.freeze
49
- RAILS_5_1 = '5.1'.freeze
50
-
51
48
  RANSACK_SLASH_SEARCHES = 'ransack/searches'.freeze
52
49
  RANSACK_SLASH_SEARCHES_SLASH_SEARCH = 'ransack/searches/search'.freeze
53
50
  end
54
51
  end
55
-
@@ -40,7 +40,7 @@ module Ransack
40
40
  # Convert a string representing a chain of associations and an attribute
41
41
  # into the attribute itself
42
42
  def contextualize(str)
43
- parent, attr_name = @bind_pairs[str]
43
+ parent, attr_name = bind_pair_for(str)
44
44
  table_for(parent)[attr_name]
45
45
  end
46
46
 
@@ -59,31 +59,33 @@ module Ransack
59
59
 
60
60
  def bind(object, str)
61
61
  return nil unless str
62
- object.parent, object.attr_name = @bind_pairs[str]
62
+ object.parent, object.attr_name = bind_pair_for(str)
63
63
  end
64
64
 
65
65
  def traverse(str, base = @base)
66
66
  str ||= ''.freeze
67
-
68
- if (segments = str.split(/_/)).size > 0
67
+ segments = str.split(Constants::UNDERSCORE)
68
+ unless segments.empty?
69
69
  remainder = []
70
70
  found_assoc = nil
71
- while !found_assoc && segments.size > 0 do
71
+ until found_assoc || segments.empty?
72
72
  # Strip the _of_Model_type text from the association name, but hold
73
73
  # onto it in klass, for use as the next base
74
74
  assoc, klass = unpolymorphize_association(
75
- segments.join('_'.freeze)
76
- )
75
+ segments.join(Constants::UNDERSCORE)
76
+ )
77
77
  if found_assoc = get_association(assoc, base)
78
78
  base = traverse(
79
- remainder.join('_'.freeze), klass || found_assoc.klass
80
- )
79
+ remainder.join(Constants::UNDERSCORE), klass || found_assoc.klass
80
+ )
81
81
  end
82
82
 
83
83
  remainder.unshift segments.pop
84
84
  end
85
- raise UntraversableAssociationError,
86
- "No association matches #{str}" unless found_assoc
85
+ unless found_assoc
86
+ raise(UntraversableAssociationError,
87
+ "No association matches #{str}")
88
+ end
87
89
  end
88
90
 
89
91
  klassify(base)
@@ -93,20 +95,19 @@ module Ransack
93
95
  base = klassify(base)
94
96
  str ||= ''.freeze
95
97
  path = []
96
- segments = str.split(/_/)
98
+ segments = str.split(Constants::UNDERSCORE)
97
99
  association_parts = []
98
- if (segments = str.split(/_/)).size > 0
99
- while segments.size > 0 &&
100
- !base.columns_hash[segments.join(Constants::UNDERSCORE)] &&
101
- association_parts << segments.shift do
100
+ unless segments.empty?
101
+ while !segments.empty? &&
102
+ !base.columns_hash[segments.join(Constants::UNDERSCORE)] &&
103
+ association_parts << segments.shift
102
104
  assoc, klass = unpolymorphize_association(
103
105
  association_parts.join(Constants::UNDERSCORE)
104
- )
105
- if found_assoc = get_association(assoc, base)
106
- path += association_parts
107
- association_parts = []
108
- base = klassify(klass || found_assoc)
109
- end
106
+ )
107
+ next unless found_assoc = get_association(assoc, base)
108
+ path += association_parts
109
+ association_parts = []
110
+ base = klassify(klass || found_assoc)
110
111
  end
111
112
  end
112
113
 
@@ -127,7 +128,7 @@ module Ransack
127
128
 
128
129
  def ransackable_attribute?(str, klass)
129
130
  klass.ransackable_attributes(auth_object).include?(str) ||
130
- klass.ransortable_attributes(auth_object).include?(str)
131
+ klass.ransortable_attributes(auth_object).include?(str)
131
132
  end
132
133
 
133
134
  def ransackable_association?(str, klass)
@@ -135,7 +136,11 @@ module Ransack
135
136
  end
136
137
 
137
138
  def ransackable_scope?(str, klass)
138
- klass.ransackable_scopes(auth_object).any? { |s| s.to_s == str }
139
+ klass.ransackable_scopes(auth_object).any? { |s| s.to_sym == str.to_sym }
140
+ end
141
+
142
+ def ransackable_scope_skip_sanitize_args?(str, klass)
143
+ klass.ransackable_scopes_skip_sanitize_args.any? { |s| s.to_sym == str.to_sym }
139
144
  end
140
145
 
141
146
  def searchable_attributes(str = ''.freeze)
@@ -6,8 +6,14 @@ module ActionView::Helpers::Tags
6
6
  # https://github.com/rails/rails/commit/c1a118a
7
7
  class Base
8
8
  private
9
- def value(object)
10
- object.send @method_name if object # use send instead of public_send
9
+ if defined? ::ActiveRecord
10
+ def value
11
+ if @allow_method_names_outside_object
12
+ object.send @method_name if object && object.respond_to?(@method_name, true)
13
+ else
14
+ object.send @method_name if object
15
+ end
16
+ end
11
17
  end
12
18
  end
13
19
  end
@@ -39,9 +45,9 @@ module Ransack
39
45
  end
40
46
 
41
47
  def attribute_select(options = nil, html_options = nil, action = nil)
42
- options = options || {}
43
- html_options = html_options || {}
44
- action = action || Constants::SEARCH
48
+ options ||= {}
49
+ html_options ||= {}
50
+ action ||= Constants::SEARCH
45
51
  default = options.delete(:default)
46
52
  raise ArgumentError, formbuilder_error_message(
47
53
  "#{action}_select") unless object.respond_to?(:context)
@@ -237,7 +243,7 @@ module Ransack
237
243
  Translate.association(base, :context => object.context),
238
244
  collection_for_base(action, base)
239
245
  ]
240
- rescue UntraversableAssociationError => e
246
+ rescue UntraversableAssociationError
241
247
  nil
242
248
  end
243
249
  end
@@ -130,12 +130,20 @@ module Ransack
130
130
 
131
131
  def url_options
132
132
  @params.merge(
133
- @options.merge(
133
+ @options.except(:class, :data, :host).merge(
134
134
  @search.context.search_key => search_and_sort_params))
135
135
  end
136
136
 
137
137
  def html_options(args)
138
- html_options = extract_options_and_mutate_args!(args)
138
+ if args.empty?
139
+ html_options = @options
140
+ else
141
+ deprecation_message = "Passing two trailing hashes to `sort_link` is deprecated, merge the trailing hashes into a single one."
142
+ caller_location = caller_locations(2, 2).first
143
+ warn "#{deprecation_message} (called at #{caller_location.path}:#{caller_location.lineno})"
144
+ html_options = extract_options_and_mutate_args!(args)
145
+ end
146
+
139
147
  html_options.merge(
140
148
  class: [['sort_link'.freeze, @current_dir], html_options[:class]]
141
149
  .compact.join(' '.freeze)
@@ -145,7 +153,7 @@ module Ransack
145
153
  private
146
154
 
147
155
  def parameters_hash(params)
148
- if ::ActiveRecord::VERSION::MAJOR == 5 && params.respond_to?(:to_unsafe_h)
156
+ if params.respond_to?(:to_unsafe_h)
149
157
  params.to_unsafe_h
150
158
  else
151
159
  params
@@ -1,2 +1,2 @@
1
1
  require 'ransack/helpers/form_builder'
2
- require 'ransack/helpers/form_helper'
2
+ require 'ransack/helpers/form_helper'
@@ -0,0 +1,70 @@
1
+ ar:
2
+ ransack:
3
+ search: "بحث"
4
+ predicate: "فاعل"
5
+ and: "و"
6
+ or: "أو"
7
+ any: "أيُّ"
8
+ all: "كل"
9
+ combinator: "دالة توافقية"
10
+ attribute: "خاصية"
11
+ value: "قيمة"
12
+ condition: "شرط"
13
+ sort: "ترتيب"
14
+ asc: "تصاعدي"
15
+ desc: "تنازلي"
16
+ predicates:
17
+ eq: "معادل"
18
+ eq_any: "معادل على اﻷقل لواحد"
19
+ eq_all: "معادل للجميع"
20
+ not_eq: "ليس معادلا لـ"
21
+ not_eq_any: "ليس معادلا على اﻷقل لواحد"
22
+ not_eq_all: "ليس معادلا للجميع"
23
+ matches: "موائم"
24
+ matches_any: "موائم لواحد على اﻷقل"
25
+ matches_all: "موائم للجميع"
26
+ does_not_match: "لا يتواءم"
27
+ does_not_match_any: "لا يتواءم مع واحد على اﻷقل"
28
+ does_not_match_all: "لا يتواءم مع الجميع"
29
+ lt: "أصغر من"
30
+ lt_any: "أصغر لواحد على اﻷقل"
31
+ lt_all: "أصغر من الجميع"
32
+ lteq: "أصغر أو مساو لـ"
33
+ lteq_any: "أصغر أو مساو لواحد على اﻷقل"
34
+ lteq_all: "أصغر أو مساو للجميع"
35
+ gt: "أكبر من"
36
+ gt_any: "أكبر من واحد على اﻷقل"
37
+ gt_all: "أكبر من الجميع"
38
+ gteq: "أكبر أو مساو لـ"
39
+ gteq_any: "أكبر أو مساو لواحد على اﻷقل"
40
+ gteq_all: "أكبر أو مساو للجميع"
41
+ in: "متضمن لـ"
42
+ in_any: "متضمن لواحد على اﻷقل"
43
+ in_all: "متضمن للجميع"
44
+ not_in: "غير متضمن"
45
+ not_in_any: "غير متضمن لواحد على اﻷقل"
46
+ not_in_all: "غير متضمن للجميع"
47
+ cont: "محتو"
48
+ cont_any: "محتو لواحد على اﻷقل"
49
+ cont_all: "محتو لجميع"
50
+ not_cont: "غير محتو"
51
+ not_cont_any: "غير محتو لواحد على اﻷقل"
52
+ not_cont_all: "غير محتو للجميع"
53
+ start: "يبدأ بـ"
54
+ start_any: "يبدأ بواحد على اﻷقل"
55
+ start_all: "يبدأ بالجميع"
56
+ not_start: "لا يبدأ بـ"
57
+ not_start_any: "لا يبدأ بواحد على اﻷقل"
58
+ not_start_all: "لا يبدأ بالجميع"
59
+ end: "ينتهي بـ"
60
+ end_any: "ينتهي بواحد على اﻷقل"
61
+ end_all: "ينتهي بالجميع"
62
+ not_end: "لا ينتهي بـ"
63
+ not_end_any: "لا ينتهي بواحد على اﻷقل"
64
+ not_end_all: "لا ينتهي بالجميع"
65
+ 'true': "صحيح"
66
+ 'false': "خطأ"
67
+ present: "مستقبل"
68
+ blank: "فراغ"
69
+ 'null': "عدم"
70
+ not_null: "غير مساو لقيمة عدم"
@@ -0,0 +1,70 @@
1
+ az:
2
+ ransack:
3
+ search: "axtar"
4
+ predicate: "təsdiqlə"
5
+ and: "və"
6
+ or: "və ya"
7
+ any: "hər hansı"
8
+ all: "hamısı"
9
+ combinator: "birləşdirici"
10
+ attribute: "xüsusiyyət"
11
+ value: "dəyər"
12
+ condition: "şərt"
13
+ sort: "sırala"
14
+ asc: "artan"
15
+ desc: "azalan"
16
+ predicates:
17
+ eq: "bərabər"
18
+ eq_any: "hər hansı birinə bərabər"
19
+ eq_all: "hamısına bərabər"
20
+ not_eq: "bərabər deyil"
21
+ not_eq_any: "hər hansı birinə bərabər deyil"
22
+ not_eq_all: "heç birinə bərabər deyil"
23
+ matches: "uyğunlaşan"
24
+ matches_any: "hər hansı biri ilə uyğunlaşan"
25
+ matches_all: "hamısı ilə uyğunlaşan"
26
+ does_not_match: "uyğunlaşmayan"
27
+ does_not_match_any: "hər hansı biri ilə uyğunlaşmayan"
28
+ does_not_match_all: "heç biri ilə uyğunlaşmayan"
29
+ lt: "daha kiçik"
30
+ lt_any: "hər hansı birindən kiçik"
31
+ lt_all: "hamısından kiçik"
32
+ lteq: "daha kiçik və ya bərabər"
33
+ lteq_any: "daha kiçik və ya hər hansı birinə bərabər"
34
+ lteq_all: "daha kiçik və ya hamısına bərabər"
35
+ gt: "daha böyük "
36
+ gt_any: "hər hansı birindən daha böyük"
37
+ gt_all: "hamısından daha böyük"
38
+ gteq: "daha böyük və ya bərabər"
39
+ gteq_any: "daha böyük və ya hər hansı birine bərabər"
40
+ gteq_all: "daha böyük və ya hamısıne bərabər"
41
+ in: "içində"
42
+ in_any: "hər hansı birində"
43
+ in_all: "hamısında"
44
+ not_in: "içində deyil"
45
+ not_in_any: "hər hansı birində deyil"
46
+ not_in_all: "heç birində deyil"
47
+ cont: "ehtiva edən"
48
+ cont_any: "hər hansı birini ehtiva edən"
49
+ cont_all: "hamısını ehtiva edən"
50
+ not_cont: "ehtiva etməyən"
51
+ not_cont_any: "hər hansı birini ehtiva etməyən"
52
+ not_cont_all: "heç birini birini ehtiva etməyən"
53
+ start: "ilə başlayan"
54
+ start_any: "hər hansı biri ilə başlayan"
55
+ start_all: "hamısı ilə başlayan"
56
+ not_start: "ilə başlamayan"
57
+ not_start_any: "hər hansı biri ilə başlamayan"
58
+ not_start_all: "hiçbiri ilə başlamayan"
59
+ end: "ilə bitən"
60
+ end_any: "hər hansı biri ilə bitən"
61
+ end_all: "hamısı ilə bitən"
62
+ not_end: "ilə bitməyən"
63
+ not_end_any: "hər hansı biri ilə bitməyən"
64
+ not_end_all: "heç biri ilə bitməyən"
65
+ 'true': "doğru"
66
+ 'false': "yanlış"
67
+ present: "mövcüd"
68
+ blank: "boş"
69
+ 'null': "keçərsiz"
70
+ not_null: "keçərli"
@@ -0,0 +1,70 @@
1
+ bg:
2
+ ransack:
3
+ search: "търсене"
4
+ predicate: "предикат"
5
+ and: "и"
6
+ or: "или"
7
+ any: "всякакво"
8
+ all: "всички"
9
+ combinator: "комбинатор"
10
+ attribute: "атрибут"
11
+ value: "стойност"
12
+ condition: "условие"
13
+ sort: "сортиране"
14
+ asc: "възходящ"
15
+ desc: "низходящ"
16
+ predicates:
17
+ eq: "се равнява на"
18
+ eq_any: "се равнява на всяко"
19
+ eq_all: "се равнява на всички"
20
+ not_eq: "не е равно на"
21
+ not_eq_any: "не е равно на никое от"
22
+ not_eq_all: "не е равно на всички"
23
+ matches: "съвпада"
24
+ matches_any: "съвпада с някое"
25
+ matches_all: "съвпада с всички"
26
+ does_not_match: "не съвпада"
27
+ does_not_match_any: "не съвпада с никое"
28
+ does_not_match_all: "не съвпада с всички"
29
+ lt: "по-малко от"
30
+ lt_any: "по-малко от някое"
31
+ lt_all: "по-малко от всички"
32
+ lteq: "по-малко или равно на"
33
+ lteq_any: "по-малко или равно на някое"
34
+ lteq_all: "по-малко или равно на всички"
35
+ gt: "по-голямо от"
36
+ gt_any: "по-голямо от всякое"
37
+ gt_all: "по-голямо от всички"
38
+ gteq: "по-голямо или равно на"
39
+ gteq_any: "по-голямо или равно на всякое"
40
+ gteq_all: "по-голямо или равно на всички"
41
+ in: "в"
42
+ in_any: "във всякое"
43
+ in_all: "във всички"
44
+ not_in: "не в"
45
+ not_in_any: "не в никое"
46
+ not_in_all: "не във всички"
47
+ cont: "съдържа"
48
+ cont_any: "съдържа всякое"
49
+ cont_all: "съдържа всички"
50
+ not_cont: "не съдържа"
51
+ not_cont_any: "не съдържа никое"
52
+ not_cont_all: "не съдържа всички"
53
+ start: "започва с"
54
+ start_any: "започва с всякое"
55
+ start_all: "започва с всички"
56
+ not_start: "не започва с"
57
+ not_start_any: "не започва с никое"
58
+ not_start_all: "не започва с всички"
59
+ end: "завършва с"
60
+ end_any: "завършва с всякое"
61
+ end_all: "завършва с всички"
62
+ not_end: "не завършва с"
63
+ not_end_any: "не завършва с никое"
64
+ not_end_all: "не завършва с всички"
65
+ 'true': "истина"
66
+ 'false': "неистина"
67
+ present: "присъства"
68
+ blank: "е празно"
69
+ 'null': "е нула"
70
+ not_null: "не е нула"
@@ -0,0 +1,70 @@
1
+ ca:
2
+ ransack:
3
+ search: "cercar"
4
+ predicate: "predicat"
5
+ and: "i"
6
+ or: "o"
7
+ any: "qualsevol"
8
+ all: "tots"
9
+ combinator: "combinador"
10
+ attribute: "atribut"
11
+ value: "valor"
12
+ condition: "condició"
13
+ sort: "ordenar"
14
+ asc: "ascendent"
15
+ desc: "descendent"
16
+ predicates:
17
+ eq: "és igual a"
18
+ eq_any: "és igual a qualsevol"
19
+ eq_all: "és igual a tots"
20
+ not_eq: "no és igual a"
21
+ not_eq_any: "no és igual a qualsevol"
22
+ not_eq_all: "no és igual a tots"
23
+ matches: "coincideix"
24
+ matches_any: "coincideix a qualsevol"
25
+ matches_all: "coincideix a tots"
26
+ does_not_match: "no coincideix"
27
+ does_not_match_any: "no coincideix amb cap"
28
+ does_not_match_all: "no coincideix amb tots"
29
+ lt: "menor que"
30
+ lt_any: "menor que qualsevol"
31
+ lt_all: "menor o igual a"
32
+ lteq: "menor que o igual a"
33
+ lteq_any: "menor o igual a qualsevol"
34
+ lteq_all: "menor o igual a tots"
35
+ gt: "major que"
36
+ gt_any: "major que qualsevol"
37
+ gt_all: "major que tots"
38
+ gteq: "major que o igual a"
39
+ gteq_any: "major que o igual a qualsevol"
40
+ gteq_all: "major que o igual a tots"
41
+ in: "en"
42
+ in_any: "en qualsevol"
43
+ in_all: "en tots"
44
+ not_in: "no en"
45
+ not_in_any: "no en qualsevol"
46
+ not_in_all: "no en tots"
47
+ cont: "conté"
48
+ cont_any: "conté qualsevol"
49
+ cont_all: "conté tots"
50
+ not_cont: "no conté"
51
+ not_cont_any: "no conté cap"
52
+ not_cont_all: "no conté tota"
53
+ start: "comença per"
54
+ start_any: "comença per qualsevol"
55
+ start_all: "comença per tot"
56
+ not_start: "no comença per"
57
+ not_start_any: "no comença per qualsevol"
58
+ not_start_all: "no comença per tot"
59
+ end: "acaba en"
60
+ end_any: "acaba en qualsevol"
61
+ end_all: "acaba en tot"
62
+ not_end: "no acaba en"
63
+ not_end_any: "no acaba en qualsevol"
64
+ not_end_all: "no acaba en tot"
65
+ 'true': "és verdader"
66
+ 'false': "és fals"
67
+ present: "és present"
68
+ blank: "està en blanc"
69
+ 'null': "és nul"
70
+ not_null: "no és nul"
@@ -0,0 +1,70 @@
1
+ el:
2
+ ransack:
3
+ search: "αναζήτηση"
4
+ predicate: "κατηγορούμενο"
5
+ and: "και"
6
+ or: "ή"
7
+ any: "οποιοδήποτε"
8
+ all: "όλα"
9
+ combinator: "συνδυαστής"
10
+ attribute: "ιδιότητα"
11
+ value: "τιμή"
12
+ condition: "συνθήκη"
13
+ sort: "ταξινόμηση"
14
+ asc: "αύξουσα"
15
+ desc: "φθίνουσα"
16
+ predicates:
17
+ eq: "ίσον"
18
+ eq_any: "ισούται με οποιοδήποτε"
19
+ eq_all: "ισούται με όλα"
20
+ not_eq: "άνισο"
21
+ not_eq_any: "άνισο με οποιοδήποτε"
22
+ not_eq_all: "άνισο με όλα"
23
+ matches: "αντιστοιχεί"
24
+ matches_any: "αντιστοιχεί με οποιοδήποτε"
25
+ matches_all: "αντιστοιχεί με όλα"
26
+ does_not_match: "δεν αντιστοιχεί"
27
+ does_not_match_any: "δεν αντιστοιχεί με οποιοδήποτε"
28
+ does_not_match_all: "δεν αντιστοιχεί με όλα"
29
+ lt: "μικρότερο από"
30
+ lt_any: "μικρότερο από οποιοδήποτε"
31
+ lt_all: "μικρότερο από όλα"
32
+ lteq: "μικρότερο ή ίσον"
33
+ lteq_any: "μικρότερο ή ίσον από οποιοδήποτε"
34
+ lteq_all: "μικρότερο ή ίσον από όλα"
35
+ gt: "μεγαλύτερο από"
36
+ gt_any: "μεγαλύτερο από οποιοδήποτε"
37
+ gt_all: μεγαλύτερο από όλα"
38
+ gteq: "μεγαλύτερο ή ίσον από"
39
+ gteq_any: "μεγαλύτερο ή ίσον από οποιοδήποτε"
40
+ gteq_all: "μεγαλύτερο ή ίσον από όλα"
41
+ in: "περιέχεται"
42
+ in_any: "περιέχεται σε οποιοδήποτε"
43
+ in_all: "περιέχεται σε όλα"
44
+ not_in: "δεν περιέχεται"
45
+ not_in_any: "δεν περιέχεται σε οποιοδήποτε"
46
+ not_in_all: "δεν περιέχεται σε όλα"
47
+ cont: "περιέχει"
48
+ cont_any: "περιέχει οποιοδήποτε"
49
+ cont_all: "περιέχει όλα"
50
+ not_cont: "δεν περιέχει"
51
+ not_cont_any: "δεν περιέχει οποιοδήποτε"
52
+ not_cont_all: "δεν περιέχει όλα"
53
+ start: "αρχίζει με"
54
+ start_any: "αρχίζει με οποιοδήποτε"
55
+ start_all: "αρχίζει με όλα"
56
+ not_start: "δεν αρχίζει με"
57
+ not_start_any: "δεν αρχίζει με οποιοδήποτε"
58
+ not_start_all: "δεν αρχίζει με όλα"
59
+ end: "τελειώνει με"
60
+ end_any: "τελειώνει οποιοδήποτε"
61
+ end_all: "τελειώνει με όλα"
62
+ not_end: "δεν τελειώνει με"
63
+ not_end_any: "δεν τελειώνει οποιοδήποτε"
64
+ not_end_all: "δεν τελειώνει με όλα"
65
+ 'true': "αληθές"
66
+ 'false': "ψευδές"
67
+ present: "υπάρχει"
68
+ blank: "είναι κενό"
69
+ 'null': "άκυρο"
70
+ not_null: "δεν είναι άκυρο"