pagy 8.6.3 → 9.3.4

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 (106) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +1 -1
  3. data/apps/calendar.ru +119 -127
  4. data/apps/demo.ru +274 -260
  5. data/apps/index.rb +7 -0
  6. data/apps/keyset_ar.ru +227 -0
  7. data/apps/keyset_s.ru +219 -0
  8. data/apps/rails.ru +25 -20
  9. data/apps/repro.ru +108 -103
  10. data/bin/pagy +18 -20
  11. data/config/pagy.rb +19 -15
  12. data/javascripts/pagy.min.js +2 -2
  13. data/javascripts/pagy.min.js.map +3 -3
  14. data/javascripts/pagy.mjs +2 -2
  15. data/lib/pagy/b64.rb +33 -0
  16. data/lib/pagy/backend.rb +20 -20
  17. data/lib/pagy/calendar/day.rb +2 -2
  18. data/lib/pagy/calendar/month.rb +2 -2
  19. data/lib/pagy/calendar/quarter.rb +2 -2
  20. data/lib/pagy/calendar/unit.rb +7 -10
  21. data/lib/pagy/calendar/week.rb +2 -2
  22. data/lib/pagy/calendar/year.rb +2 -2
  23. data/lib/pagy/calendar.rb +15 -13
  24. data/lib/pagy/countless.rb +10 -14
  25. data/lib/pagy/extras/arel.rb +3 -11
  26. data/lib/pagy/extras/array.rb +5 -10
  27. data/lib/pagy/extras/bootstrap.rb +5 -5
  28. data/lib/pagy/extras/bulma.rb +10 -7
  29. data/lib/pagy/extras/calendar.rb +13 -17
  30. data/lib/pagy/extras/countless.rb +8 -13
  31. data/lib/pagy/extras/elasticsearch_rails.rb +16 -25
  32. data/lib/pagy/extras/gearbox.rb +18 -18
  33. data/lib/pagy/extras/headers.rb +25 -24
  34. data/lib/pagy/extras/i18n.rb +1 -1
  35. data/lib/pagy/extras/js_tools.rb +6 -6
  36. data/lib/pagy/extras/jsonapi.rb +30 -21
  37. data/lib/pagy/extras/keyset.rb +30 -0
  38. data/lib/pagy/extras/limit.rb +63 -0
  39. data/lib/pagy/extras/meilisearch.rb +9 -17
  40. data/lib/pagy/extras/metadata.rb +3 -3
  41. data/lib/pagy/extras/overflow.rb +9 -9
  42. data/lib/pagy/extras/pagy.rb +16 -16
  43. data/lib/pagy/extras/searchkick.rb +9 -17
  44. data/lib/pagy/extras/size.rb +1 -1
  45. data/lib/pagy/extras/standalone.rb +6 -6
  46. data/lib/pagy/extras/trim.rb +3 -3
  47. data/lib/pagy/frontend.rb +32 -33
  48. data/lib/pagy/i18n.rb +3 -2
  49. data/lib/pagy/keyset/active_record.rb +38 -0
  50. data/lib/pagy/keyset/sequel.rb +51 -0
  51. data/lib/pagy/keyset.rb +118 -0
  52. data/lib/pagy/shared_methods.rb +26 -0
  53. data/lib/pagy/url_helpers.rb +5 -5
  54. data/lib/pagy.rb +53 -67
  55. data/locales/ar.yml +1 -1
  56. data/locales/be.yml +1 -1
  57. data/locales/bg.yml +1 -1
  58. data/locales/bs.yml +1 -1
  59. data/locales/ca.yml +1 -1
  60. data/locales/ckb.yml +1 -1
  61. data/locales/cs.yml +1 -1
  62. data/locales/da.yml +1 -1
  63. data/locales/de.yml +1 -1
  64. data/locales/dz.yml +17 -0
  65. data/locales/en.yml +1 -1
  66. data/locales/es.yml +1 -1
  67. data/locales/fr.yml +1 -1
  68. data/locales/hr.yml +1 -1
  69. data/locales/id.yml +1 -1
  70. data/locales/it.yml +1 -1
  71. data/locales/ja.yml +1 -1
  72. data/locales/km.yml +1 -1
  73. data/locales/ko.yml +1 -1
  74. data/locales/nb.yml +1 -1
  75. data/locales/nl.yml +1 -1
  76. data/locales/nn.yml +1 -1
  77. data/locales/pl.yml +1 -1
  78. data/locales/pt-BR.yml +1 -1
  79. data/locales/pt.yml +1 -1
  80. data/locales/ru.yml +1 -1
  81. data/locales/sr.yml +1 -1
  82. data/locales/sv-SE.yml +1 -1
  83. data/locales/sv.yml +1 -1
  84. data/locales/sw.yml +3 -1
  85. data/locales/ta.yml +3 -1
  86. data/locales/tr.yml +1 -1
  87. data/locales/uk.yml +1 -1
  88. data/locales/vi.yml +1 -1
  89. data/locales/zh-CN.yml +7 -9
  90. data/locales/zh-HK.yml +7 -9
  91. data/locales/zh-TW.yml +7 -9
  92. metadata +14 -27
  93. data/apps/tmp/calendar.sqlite3 +0 -0
  94. data/apps/tmp/calendar.sqlite3-shm +0 -0
  95. data/apps/tmp/calendar.sqlite3-wal +0 -0
  96. data/apps/tmp/local_secret.txt +0 -1
  97. data/apps/tmp/pagy-keyset.sqlite3 +0 -0
  98. data/apps/tmp/pagy-keyset.sqlite3-shm +0 -0
  99. data/apps/tmp/pagy-keyset.sqlite3-wal +0 -0
  100. data/javascripts/pagy-module.js +0 -100
  101. data/javascripts/pagy.js +0 -4
  102. data/lib/pagy/extras/foundation.rb +0 -95
  103. data/lib/pagy/extras/items.rb +0 -64
  104. data/lib/pagy/extras/materialize.rb +0 -100
  105. data/lib/pagy/extras/semantic.rb +0 -94
  106. data/lib/pagy/extras/uikit.rb +0 -98
@@ -0,0 +1,38 @@
1
+ # See Pagy API documentation: https://ddnexus.github.io/pagy/docs/api/keyset
2
+ # frozen_string_literal: true
3
+
4
+ class Pagy
5
+ class Keyset
6
+ # Keyset adapter for ActiveRecord
7
+ class ActiveRecord < Keyset
8
+ protected
9
+
10
+ # Get the keyset attributes from the record
11
+ def keyset_attributes_from(record) = record.slice(*@keyset.keys)
12
+
13
+ # Extract the keyset from the set
14
+ def extract_keyset
15
+ @set.order_values.each_with_object({}) do |node, keyset|
16
+ keyset[node.value.name.to_sym] = node.direction
17
+ end
18
+ end
19
+
20
+ # Filter the newest records
21
+ def filter_newest = @set.where(filter_newest_query, **@latest)
22
+
23
+ # Append the missing keyset keys if the set is restricted by select
24
+ def apply_select
25
+ @set.select(*@keyset.keys)
26
+ end
27
+
28
+ # Set with selected columns?
29
+ def select? = !@set.select_values.empty?
30
+
31
+ # Typecast the latest attributes
32
+ def typecast_latest(latest)
33
+ @set.model.new(latest).slice(latest.keys)
34
+ .to_hash.transform_keys(&:to_sym)
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,51 @@
1
+ # See Pagy API documentation: https://ddnexus.github.io/pagy/docs/api/keyset
2
+ # frozen_string_literal: true
3
+
4
+ class Pagy
5
+ class Keyset
6
+ # Keyset adapter for sequel
7
+ class Sequel < Keyset
8
+ protected
9
+
10
+ # Get the keyset attributes from the record
11
+ def keyset_attributes_from(record) = record.to_hash.slice(*@keyset.keys)
12
+
13
+ # Extract the keyset from the set
14
+ def extract_keyset
15
+ return {} unless @set.opts[:order]
16
+
17
+ @set.opts[:order].each_with_object({}) do |item, keyset|
18
+ case item
19
+ when Symbol
20
+ keyset[item] = :asc
21
+ when ::Sequel::SQL::OrderedExpression
22
+ keyset[item.expression] = item.descending ? :desc : :asc
23
+ else
24
+ raise TypeError, "#{item.class.inspect} is not a supported Sequel::SQL::OrderedExpression"
25
+ end
26
+ end
27
+ end
28
+
29
+ # Filter the newest records
30
+ def filter_newest = @set.where(::Sequel.lit(filter_newest_query, **@latest))
31
+
32
+ # Append the missing keyset keys if the set is restricted by select
33
+ def apply_select
34
+ selected = @set.opts[:select]
35
+ @set.select_append(*@keyset.keys.reject { |c| selected.include?(c) })
36
+ end
37
+
38
+ # Set with selected columns?
39
+ def select? = !@set.opts[:select].nil?
40
+
41
+ # Typecast the latest attributes
42
+ def typecast_latest(latest)
43
+ model = @set.opts[:model]
44
+ model.unrestrict_primary_key if (restricted_pk = model.restrict_primary_key?)
45
+ latest = model.new(latest).to_hash.slice(*latest.keys.map(&:to_sym))
46
+ model.restrict_primary_key if restricted_pk
47
+ latest
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,118 @@
1
+ # See Pagy API documentation: https://ddnexus.github.io/pagy/docs/api/keyset
2
+ # frozen_string_literal: true
3
+
4
+ require 'json'
5
+ require_relative 'b64'
6
+ require_relative 'shared_methods'
7
+
8
+ class Pagy
9
+ # Implement wicked-fast keyset pagination for big data
10
+ class Keyset
11
+ class TypeError < ::TypeError; end
12
+
13
+ include SharedMethods
14
+
15
+ # Pick the right adapter for the set
16
+ def self.new(set, **vars)
17
+ if self == Pagy::Keyset
18
+ if defined?(::ActiveRecord) && set.is_a?(::ActiveRecord::Relation)
19
+ ActiveRecord
20
+ elsif defined?(::Sequel) && set.is_a?(::Sequel::Dataset)
21
+ Sequel
22
+ else
23
+ raise TypeError, "expected set to be an instance of ActiveRecord::Relation or Sequel::Dataset; got #{set.class}"
24
+ end.new(set, **vars)
25
+ else
26
+ allocate.tap { |instance| instance.send(:initialize, set, **vars) }
27
+ end
28
+ end
29
+
30
+ attr_reader :latest # Other readers from SharedMethods
31
+
32
+ def initialize(set, **vars)
33
+ default = DEFAULT.slice(:limit, :page_param, # from pagy
34
+ :headers, # from headers extra
35
+ :jsonapi, # from jsonapi extra
36
+ :limit_param, :limit_max, :limit_extra) # from limit_extra
37
+ assign_vars({ **default, page: nil }, vars)
38
+ assign_limit
39
+ @set = set
40
+ @page = @vars[:page]
41
+ @keyset = extract_keyset
42
+ raise InternalError, 'the set must be ordered' if @keyset.empty?
43
+ return unless @page
44
+
45
+ latest = JSON.parse(B64.urlsafe_decode(@page)).transform_keys(&:to_sym)
46
+ @latest = typecast_latest(latest)
47
+ raise InternalError, 'page and keyset are not consistent' \
48
+ unless @latest.keys == @keyset.keys
49
+ end
50
+
51
+ # Return the next page
52
+ def next
53
+ records
54
+ return unless @more
55
+
56
+ @next ||= begin
57
+ hash = keyset_attributes_from(@records.last)
58
+ json = @vars[:jsonify_keyset_attributes]&.(hash) || hash.to_json
59
+ B64.urlsafe_encode(json)
60
+ end
61
+ end
62
+
63
+ # Fetch the array of records for the current page
64
+ def records
65
+ @records ||= begin
66
+ @set = apply_select if select?
67
+ if @latest
68
+ # :nocov:
69
+ @set = @vars[:after_latest]&.(@set, @latest) || # deprecated
70
+ # :nocov:
71
+ @vars[:filter_newest]&.(@set, @latest, @keyset) ||
72
+ filter_newest
73
+ end
74
+ records = @set.limit(@limit + 1).to_a
75
+ @more = records.size > @limit && !records.pop.nil?
76
+ records
77
+ end
78
+ end
79
+
80
+ protected
81
+
82
+ # Prepare the literal query string (complete with the placeholders for value interpolation)
83
+ # used to filter the newest records.
84
+ # For example:
85
+ # With a set like Pet.order(animal: :asc, name: :desc, id: :asc) it returns the following string:
86
+ # ( "pets"."animal" = :animal AND "pets"."name" = :name AND "pets"."id" > :id ) OR
87
+ # ( "pets"."animal" = :animal AND "pets"."name" < :name ) OR
88
+ # ( "pets"."animal" > :animal )
89
+ # When :tuple_comparison is enabled, and if the order is all :asc or all :desc,
90
+ # with a set like Pet.order(:animal, :name, :id) it returns the following string:
91
+ # ( "pets"."animal", "pets"."name", "pets"."id" ) > ( :animal, :name, :id )
92
+ def filter_newest_query
93
+ operator = { asc: '>', desc: '<' }
94
+ directions = @keyset.values
95
+ table = @set.model.table_name
96
+ name = @keyset.to_h { |column| [column, %("#{table}"."#{column}")] }
97
+ if @vars[:tuple_comparison] && (directions.all?(:asc) || directions.all?(:desc))
98
+ placeholders = @keyset.keys.map { |column| ":#{column}" }.join(', ')
99
+ "( #{name.values.join(', ')} ) #{operator[directions.first]} ( #{placeholders} )"
100
+ else
101
+ keyset = @keyset.to_a
102
+ where = []
103
+ until keyset.empty?
104
+ last_column, last_direction = keyset.pop
105
+ query = +'( '
106
+ query << (keyset.map { |column, _d| "#{name[column]} = :#{column}" } \
107
+ << "#{name[last_column]} #{operator[last_direction]} :#{last_column}").join(' AND ')
108
+ query << ' )'
109
+ where << query
110
+ end
111
+ where.join(' OR ')
112
+ end
113
+ end
114
+ end
115
+ end
116
+
117
+ require_relative 'keyset/active_record'
118
+ require_relative 'keyset/sequel'
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Pagy
4
+ # Shared with Keyset
5
+ module SharedMethods
6
+ attr_reader :page, :limit, :vars
7
+
8
+ # Validates and assign the passed vars: var must be present and value.to_i must be >= to min
9
+ def assign_and_check(name_min)
10
+ name_min.each do |name, min|
11
+ raise VariableError.new(self, name, ">= #{min}", @vars[name]) \
12
+ unless @vars[name]&.respond_to?(:to_i) && instance_variable_set(:"@#{name}", @vars[name].to_i) >= min
13
+ end
14
+ end
15
+
16
+ # Assign @limit (overridden by the gearbox extra)
17
+ def assign_limit
18
+ assign_and_check(limit: 1)
19
+ end
20
+
21
+ # Assign @vars
22
+ def assign_vars(default, vars)
23
+ @vars = { **default, **vars.delete_if { |k, v| default.key?(k) && (v.nil? || v == '') } }
24
+ end
25
+ end
26
+ end
@@ -6,21 +6,21 @@ class Pagy
6
6
  # Return the URL for the page, relying on the params method and Rack by default.
7
7
  # It supports all Rack-based frameworks (Sinatra, Padrino, Rails, ...).
8
8
  # For non-rack environments you can use the standalone extra
9
- def pagy_url_for(pagy, page, absolute: false, **_)
9
+ def pagy_url_for(pagy, page, absolute: false, fragment: nil, **_)
10
10
  vars = pagy.vars
11
- query_params = request.GET.clone
11
+ query_params = request.GET.clone(freeze: false)
12
12
  query_params.merge!(vars[:params].transform_keys(&:to_s)) if vars[:params].is_a?(Hash)
13
13
  pagy_set_query_params(page, vars, query_params)
14
14
  query_params = vars[:params].(query_params) if vars[:params].is_a?(Proc)
15
15
  query_string = "?#{Rack::Utils.build_nested_query(query_params)}"
16
- "#{request.base_url if absolute}#{vars[:request_path] || request.path}#{query_string}#{vars[:fragment]}"
16
+ "#{request.base_url if absolute}#{vars[:request_path] || request.path}#{query_string}#{fragment}"
17
17
  end
18
18
 
19
- # Add the page and items params
19
+ # Add the page and limit params
20
20
  # Overridable by the jsonapi extra
21
21
  def pagy_set_query_params(page, vars, query_params)
22
22
  query_params[vars[:page_param].to_s] = page
23
- query_params[vars[:items_param].to_s] = vars[:items] if vars[:items_extra]
23
+ query_params[vars[:limit_param].to_s] = vars[:limit] if vars[:limit_extra]
24
24
  end
25
25
  end
26
26
  end
data/lib/pagy.rb CHANGED
@@ -2,48 +2,77 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require 'pathname'
5
+ require_relative 'pagy/shared_methods'
5
6
 
6
- # Core class
7
+ # Top superclass: it should define only what's common to all the subclasses
7
8
  class Pagy
8
- VERSION = '8.6.3'
9
+ VERSION = '9.3.4'
10
+
11
+ # Core default: constant for easy access, but mutable for customizable defaults
12
+ DEFAULT = { count_args: [:all], # rubocop:disable Style/MutableConstant
13
+ ends: true,
14
+ limit: 20,
15
+ outset: 0,
16
+ page: 1,
17
+ page_param: :page,
18
+ size: 7 } # AR friendly
9
19
 
10
20
  # Gem root pathname to get the path of Pagy files stylesheets, javascripts, apps, locales, etc.
11
21
  def self.root
12
22
  @root ||= Pathname.new(__dir__).parent.freeze
13
23
  end
14
24
 
15
- # Core default: constant for easy access, but mutable for customizable defaults
16
- DEFAULT = { page: 1, # rubocop:disable Style/MutableConstant
17
- items: 20,
18
- outset: 0,
19
- size: 7,
20
- ends: true,
21
- count_args: [:all], # AR friendly
22
- page_param: :page }
25
+ include SharedMethods
23
26
 
24
- attr_reader :count, :page, :items, :vars, :last, :offset, :in, :from, :to, :prev, :next
27
+ attr_reader :count, :from, :in, :last, :next, :offset, :prev, :to
25
28
  alias pages last
26
29
 
27
30
  # Merge and validate the options, do some simple arithmetic and set the instance variables
28
- def initialize(vars)
29
- normalize_vars(vars)
30
- setup_vars(count: 0, page: 1, outset: 0)
31
- setup_items_var
32
- setup_offset_var
33
- setup_last_var
34
- raise OverflowError.new(self, :page, "in 1..#{@last}", @page) if @page > @last
35
-
31
+ def initialize(**vars)
32
+ assign_vars(DEFAULT, vars)
33
+ assign_and_check(count: 0, page: 1, outset: 0)
34
+ assign_limit
35
+ assign_offset
36
+ assign_last
37
+ check_overflow
36
38
  @from = [@offset - @outset + 1, @count].min
37
- @to = [@offset - @outset + @items, @count].min
39
+ @to = [@offset - @outset + @limit, @count].min
38
40
  @in = [@to - @from + 1, @count].min
41
+ assign_prev_and_next
42
+ end
43
+
44
+ # Setup @last (overridden by the gearbox extra)
45
+ def assign_last
46
+ @last = [(@count.to_f / @limit).ceil, 1].max
47
+ @last = @vars[:max_pages] if @vars[:max_pages] && @last > vars[:max_pages]
48
+ end
49
+
50
+ # Assign @offset (overridden by the gearbox extra)
51
+ def assign_offset
52
+ @offset = (@limit * (@page - 1)) + @outset # may be already set from gear_box
53
+ end
54
+
55
+ # Assign @prev and @next
56
+ def assign_prev_and_next
39
57
  @prev = (@page - 1 unless @page == 1)
40
58
  @next = @page == @last ? (1 if @vars[:cycle]) : @page + 1
41
59
  end
42
60
 
43
- # Return the array of page numbers and :gap items e.g. [1, :gap, 8, "9", 10, :gap, 36]
61
+ # Checks the @page <= @last
62
+ def check_overflow
63
+ raise OverflowError.new(self, :page, "in 1..#{@last}", @page) if @page > @last
64
+ end
65
+
66
+ # Label for the current page. Allow the customization of the output (overridden by the calendar extra)
67
+ def label = @page.to_s
68
+
69
+ # Label for any page. Allow the customization of the output (overridden by the calendar extra)
70
+ def label_for(page) = page.to_s
71
+
72
+ # Return the array of page numbers and :gap e.g. [1, :gap, 8, "9", 10, :gap, 36]
44
73
  def series(size: @vars[:size], **_)
45
74
  raise VariableError.new(self, :size, 'to be an Integer >= 0', size) \
46
- unless size.is_a?(Integer) && size >= 0
75
+ unless size.is_a?(Integer) && size >= 0
47
76
  return [] if size.zero?
48
77
 
49
78
  [].tap do |series|
@@ -61,60 +90,17 @@ class Pagy
61
90
  series.push(*start...start + size)
62
91
  # Set first and last pages plus gaps when needed, respecting the size
63
92
  if vars[:ends] && size >= 7
64
- series[0] = 1 unless series[0] == 1
93
+ series[0] = 1
65
94
  series[1] = :gap unless series[1] == 2
66
95
  series[-2] = :gap unless series[-2] == @last - 1
67
- series[-1] = @last unless series[-1] == @last
96
+ series[-1] = @last
68
97
  end
69
98
  end
70
99
  series[series.index(@page)] = @page.to_s
71
100
  end
72
101
  end
73
-
74
- # Label for any page. Allow the customization of the output (overridden by the calendar extra)
75
- def label_for(page)
76
- page.to_s
77
- end
78
-
79
- # Label for the current page. Allow the customization of the output (overridden by the calendar extra)
80
- def label
81
- @page.to_s
82
- end
83
-
84
- protected
85
-
86
- # Apply defaults, cleanup blanks and set @vars
87
- def normalize_vars(vars)
88
- @vars = DEFAULT.merge(vars.delete_if { |k, v| DEFAULT.key?(k) && (v.nil? || v == '') })
89
- end
90
-
91
- # Setup and validates the passed vars: var must be present and value.to_i must be >= to min
92
- def setup_vars(name_min)
93
- name_min.each do |name, min|
94
- raise VariableError.new(self, name, ">= #{min}", @vars[name]) \
95
- unless @vars[name]&.respond_to?(:to_i) && instance_variable_set(:"@#{name}", @vars[name].to_i) >= min
96
- end
97
- end
98
-
99
- # Setup @items (overridden by the gearbox extra)
100
- def setup_items_var
101
- setup_vars(items: 1)
102
- end
103
-
104
- # Setup @offset (overridden by the gearbox extra)
105
- def setup_offset_var
106
- @offset = (@items * (@page - 1)) + @outset # may be already set from gear_box
107
- end
108
-
109
- # Setup @last (overridden by the gearbox extra)
110
- def setup_last_var
111
- @last = [(@count.to_f / @items).ceil, 1].max
112
- @last = vars[:max_pages] if vars[:max_pages] && @last > vars[:max_pages]
113
- end
114
- alias setup_pages_var setup_last_var
115
102
  end
116
103
 
117
- require_relative 'pagy/extras/size' # will be opt in in v9.0
118
104
  require_relative 'pagy/backend'
119
105
  require_relative 'pagy/frontend'
120
106
  require_relative 'pagy/exceptions'
data/locales/ar.yml CHANGED
@@ -26,4 +26,4 @@ ar:
26
26
  single_page: "عرض %{count} %{item_name}"
27
27
  multiple_pages: "عرض %{item_name} %{from}-%{to} من اجمالي %{count}"
28
28
  combo_nav_js: "الصفحة %{page_input} من %{pages}"
29
- items_selector_js: "عرض %{items_input} %{item_name} لكل صفحة"
29
+ limit_selector_js: "عرض %{limit_input} %{item_name} لكل صفحة"
data/locales/be.yml CHANGED
@@ -22,4 +22,4 @@ be:
22
22
  single_page: "%{count} %{item_name}"
23
23
  multiple_pages: "Усяго %{count} %{item_name}, паказаны з %{from} па %{to}"
24
24
  combo_nav_js: "Старонка %{page_input} з %{pages}"
25
- items_selector_js: "Паказаць %{items_input} %{item_name} на старонцы"
25
+ limit_selector_js: "Паказаць %{limit_input} %{item_name} на старонцы"
data/locales/bg.yml CHANGED
@@ -18,4 +18,4 @@ bg:
18
18
  single_page: "Показани са %{count} %{item_name}"
19
19
  multiple_pages: "Показани са %{item_name} %{from}-%{to} от %{count} общо"
20
20
  combo_nav_js: "Страница %{page_input} от %{pages}"
21
- items_selector_js: "Покажи %{items_input} %{item_name} на страница"
21
+ limit_selector_js: "Покажи %{limit_input} %{item_name} на страница"
data/locales/bs.yml CHANGED
@@ -22,4 +22,4 @@ bs:
22
22
  single_page: "Prikazuje se %{count} %{item_name}"
23
23
  multiple_pages: "Prikaz %{item_name} %{from}-%{to} od %{count} ukupno"
24
24
  combo_nav_js: "Stranica %{page_input} od %{pages}"
25
- items_selector_js: "Prikaži %{items_input} %{item_name} po stranici"
25
+ limit_selector_js: "Prikaži %{limit_input} %{item_name} po stranici"
data/locales/ca.yml CHANGED
@@ -18,4 +18,4 @@ ca:
18
18
  single_page: "Mostrant %{count} %{item_name}"
19
19
  multiple_pages: "Mostrant %{item_name} %{from}-%{to} de %{count} en total"
20
20
  combo_nav_js: "Pàgina %{page_input} de %{pages}"
21
- items_selector_js: "Mostra %{items_input} %{item_name} per pàgina"
21
+ limit_selector_js: "Mostra %{limit_input} %{item_name} per pàgina"
data/locales/ckb.yml CHANGED
@@ -15,4 +15,4 @@ ckb:
15
15
  single_page: "پیشاندانی %{count} %{item_name}"
16
16
  multiple_pages: "پشاندانی %{item_name}ی %{from}-%{to} لە کۆی %{count} بە گشتی"
17
17
  combo_nav_js: "پەڕی %{page_input} لە %{pages}"
18
- items_selector_js: "نیشاندانی %{items_input} %{item_name} لە هەر پەڕێک"
18
+ limit_selector_js: "نیشاندانی %{limit_input} %{item_name} لە هەر پەڕێک"
data/locales/cs.yml CHANGED
@@ -20,4 +20,4 @@ cs:
20
20
  single_page: "Zobrazeno %{count} %{item_name}"
21
21
  multiple_pages: "Zobrazeny položky %{from}-%{to} z %{count} celkem"
22
22
  combo_nav_js: "Strana %{page_input} z %{pages}"
23
- items_selector_js: "Zobrazit %{items_input} %{item_name} na stránce"
23
+ limit_selector_js: "Zobrazit %{limit_input} %{item_name} na stránce"
data/locales/da.yml CHANGED
@@ -18,4 +18,4 @@ da:
18
18
  single_page: "Viser %{count} %{item_name}"
19
19
  multiple_pages: "Viser %{item_name} %{from}-%{to} af %{count} totalt"
20
20
  combo_nav_js: "Side %{page_input} af %{pages}"
21
- items_selector_js: "Antal %{items_input} %{item_name} per side"
21
+ limit_selector_js: "Antal %{limit_input} %{item_name} per side"
data/locales/de.yml CHANGED
@@ -18,4 +18,4 @@ de:
18
18
  single_page: "Zeige %{count} %{item_name}"
19
19
  multiple_pages: "Zeige %{item_name} %{from}-%{to} von %{count} gesamt"
20
20
  combo_nav_js: "Seite %{page_input} von %{pages}"
21
- items_selector_js: "Zeige %{items_input} %{item_name} pro Seite"
21
+ limit_selector_js: "Zeige %{limit_input} %{item_name} pro Seite"
data/locales/dz.yml ADDED
@@ -0,0 +1,17 @@
1
+ # :other pluralization (see https://github.com/ddnexus/pagy/blob/master/gem/lib/pagy/i18n.rb)
2
+ dz:
3
+ pagy:
4
+ aria_label:
5
+ nav: "ཤོག་ལེབ་"
6
+ prev: "སྔོན་མ་"
7
+ next: "ཤུལ༌མ་"
8
+ prev: "&lt;"
9
+ next: "&gt;"
10
+ gap: "&hellip;"
11
+ item_name: "རྣམ་གྲངས་"
12
+ info:
13
+ no_items: "%{item_name}གཅིག་ཡང་འཚོལ་མ་འཐོབ།"
14
+ single_page: "%{item_name} %{count} བཀྲམ་སྟོན་འབད་དོ།"
15
+ multiple_pages: "བསྡོམས་ཀྱིས་ %{count} ལས་%{item_name} %{from}-%{to} བཀྲམ་སྟོན་འབད་དོ།"
16
+ combo_nav_js: "ཤོག་ལེབ་ %{pages} ལས་ %{page_input}།"
17
+ limit_selector_js: "ཤོག་ལེབ་རེ་ལུ་%{item_name} %{limit_input} སྟོན།"
data/locales/en.yml CHANGED
@@ -18,4 +18,4 @@ en:
18
18
  single_page: "Displaying %{count} %{item_name}"
19
19
  multiple_pages: "Displaying %{item_name} %{from}-%{to} of %{count} in total"
20
20
  combo_nav_js: "Page %{page_input} of %{pages}"
21
- items_selector_js: "Show %{items_input} %{item_name} per page"
21
+ limit_selector_js: "Show %{limit_input} %{item_name} per page"
data/locales/es.yml CHANGED
@@ -18,4 +18,4 @@ es:
18
18
  single_page: "Mostrando %{count} %{item_name}"
19
19
  multiple_pages: "Mostrando %{item_name} %{from}-%{to} de %{count} en total"
20
20
  combo_nav_js: "Página %{page_input} de %{pages}"
21
- items_selector_js: "Mostrar %{items_input} %{item_name} por página"
21
+ limit_selector_js: "Mostrar %{limit_input} %{item_name} por página"
data/locales/fr.yml CHANGED
@@ -18,4 +18,4 @@ fr:
18
18
  single_page: "Affichage de %{count} %{item_name}"
19
19
  multiple_pages: "Affichage des %{item_name} %{from} à %{to} sur %{count} au total"
20
20
  combo_nav_js: "Page %{page_input} sur %{pages}"
21
- items_selector_js: "Afficher %{items_input} %{item_name} par page"
21
+ limit_selector_js: "Afficher %{limit_input} %{item_name} par page"
data/locales/hr.yml CHANGED
@@ -22,4 +22,4 @@ hr:
22
22
  single_page: "Prikazuje se %{count} %{item_name}"
23
23
  multiple_pages: "Prikaz %{item_name} %{from}-%{to} od %{count} ukupno"
24
24
  combo_nav_js: "Stranica %{page_input} od %{pages}"
25
- items_selector_js: "Prikaži %{items_input} %{item_name} po stranici"
25
+ limit_selector_js: "Prikaži %{limit_input} %{item_name} po stranici"
data/locales/id.yml CHANGED
@@ -16,4 +16,4 @@ id:
16
16
  single_page: "Menampilkan %{count} %{item_name}"
17
17
  multiple_pages: "Menampilkan %{item_name} %{from}-%{to} dari total %{count}"
18
18
  combo_nav_js: "Halaman %{page_input} dari %{pages}"
19
- items_selector_js: "Tampilkan %{items_input} %{item_name} per halaman"
19
+ limit_selector_js: "Tampilkan %{limit_input} %{item_name} per halaman"
data/locales/it.yml CHANGED
@@ -18,4 +18,4 @@ it:
18
18
  single_page: "Visualizzazione di %{count} %{item_name}"
19
19
  multiple_pages: "Visualizzazione %{item_name} %{from}-%{to} di %{count} in totale"
20
20
  combo_nav_js: "Pagina %{page_input} di %{pages}"
21
- items_selector_js: "Mostra %{items_input} %{item_name} per pagina"
21
+ limit_selector_js: "Mostra %{limit_input} %{item_name} per pagina"
data/locales/ja.yml CHANGED
@@ -16,4 +16,4 @@ ja:
16
16
  single_page: "%{count} 件の%{item_name}"
17
17
  multiple_pages: "%{count} 件中 %{from}-%{to} 件目の%{item_name}を表示中"
18
18
  combo_nav_js: "%{page_input} / %{pages} ページ"
19
- items_selector_js: "%{items_input} 件ずつ表示"
19
+ limit_selector_js: "%{limit_input} 件ずつ表示"
data/locales/km.yml CHANGED
@@ -16,4 +16,4 @@ km:
16
16
  single_page: "បង្ហាញ %{count} %{item_name}"
17
17
  multiple_pages: "បង្ហាញ %{item_name} %{from}-%{to} នៃ %{count} ជាចំនួនសរុប"
18
18
  combo_nav_js: "ទំព័រ %{page_input} នៃ %{pages}"
19
- items_selector_js: "បង្ហាញ %{items_input} %{item_name} ក្នុង ១ ទំព័រ"
19
+ limit_selector_js: "បង្ហាញ %{limit_input} %{item_name} ក្នុង ១ ទំព័រ"
data/locales/ko.yml CHANGED
@@ -14,4 +14,4 @@ ko:
14
14
  single_page: "%{count}개의 %{item_name} 표시됨"
15
15
  multiple_pages: "총 %{count}개의 %{item_name} 중 %{from}-%{to}"
16
16
  combo_nav_js: "총 %{pages} 중 %{page_input} 페이지"
17
- items_selector_js: "페이지 당 %{items_input}개 표시%"
17
+ limit_selector_js: "페이지 당 %{limit_input}개 표시%"
data/locales/nb.yml CHANGED
@@ -18,4 +18,4 @@ nb:
18
18
  single_page: "Viser %{count} %{item_name}"
19
19
  multiple_pages: "Viser %{item_name} %{from}-%{to} av totalt %{count}"
20
20
  combo_nav_js: "Side %{page_input} av %{pages}"
21
- items_selector_js: "Vis %{items_input} %{item_name} per side"
21
+ limit_selector_js: "Vis %{limit_input} %{item_name} per side"
data/locales/nl.yml CHANGED
@@ -18,4 +18,4 @@ nl:
18
18
  single_page: "Toont %{count} %{item_name}"
19
19
  multiple_pages: "Toont %{from}-%{to} %{item_name} van %{count} in totaal"
20
20
  combo_nav_js: "Pagina %{page_input} van %{pages}"
21
- items_selector_js: "Toont %{items_input} %{item_name} per pagina"
21
+ limit_selector_js: "Toont %{limit_input} %{item_name} per pagina"
data/locales/nn.yml CHANGED
@@ -18,4 +18,4 @@ nn:
18
18
  single_page: "Viser %{count} %{item_name}"
19
19
  multiple_pages: "Viser %{item_name} %{from}-%{to} av totalt %{count}"
20
20
  combo_nav_js: "Side %{page_input} av %{pages}"
21
- items_selector_js: "Vis %{items_input} %{item_name} per side"
21
+ limit_selector_js: "Vis %{limit_input} %{item_name} per side"
data/locales/pl.yml CHANGED
@@ -22,4 +22,4 @@ pl:
22
22
  single_page: "Wyświetlono %{count} %{item_name}"
23
23
  multiple_pages: "Wyświetlono %{item_name} %{from}-%{to} z wszystkich %{count}"
24
24
  combo_nav_js: "Strona %{page_input} z %{pages}"
25
- items_selector_js: "Pokaż %{items_input} %{item_name} na stronie"
25
+ limit_selector_js: "Pokaż %{limit_input} %{item_name} na stronie"
data/locales/pt-BR.yml CHANGED
@@ -18,4 +18,4 @@ pt-BR:
18
18
  single_page: "Mostrando %{count} %{item_name}"
19
19
  multiple_pages: "Mostrando %{item_name} %{from}-%{to} do total de %{count}"
20
20
  combo_nav_js: "Página %{page_input} de %{pages}"
21
- items_selector_js: "Mostrar %{items_input} %{item_name} por página"
21
+ limit_selector_js: "Mostrar %{limit_input} %{item_name} por página"
data/locales/pt.yml CHANGED
@@ -18,4 +18,4 @@ pt:
18
18
  single_page: "Mostrando %{count} %{item_name}"
19
19
  multiple_pages: "Mostrando %{item_name} %{from}-%{to} de um total de %{count}"
20
20
  combo_nav_js: "Página %{page_input} de %{pages}"
21
- items_selector_js: "Mostrar %{items_input} %{item_name} por página"
21
+ limit_selector_js: "Mostrar %{limit_input} %{item_name} por página"
data/locales/ru.yml CHANGED
@@ -22,4 +22,4 @@ ru:
22
22
  single_page: "%{count} %{item_name}"
23
23
  multiple_pages: "Всего %{count} %{item_name}, показаны с %{from} по %{to}"
24
24
  combo_nav_js: "Страница %{page_input} из %{pages}"
25
- items_selector_js: "Показать %{items_input} %{item_name} на странице"
25
+ limit_selector_js: "Показать %{limit_input} %{item_name} на странице"
data/locales/sr.yml CHANGED
@@ -22,4 +22,4 @@ sr:
22
22
  single_page: "Приказује се %{count} %{item_name}"
23
23
  multiple_pages: "Приказ %{item_name} %{from}-%{to} од %{count} укупно"
24
24
  combo_nav_js: "Страниca %{page_input} од %{pages}"
25
- items_selector_js: "Прикажи %{items_input} %{item_name} по страниcи"
25
+ limit_selector_js: "Прикажи %{limit_input} %{item_name} по страниcи"
data/locales/sv-SE.yml CHANGED
@@ -18,4 +18,4 @@ sv-SE:
18
18
  single_page: "Visar %{count} %{item_name}"
19
19
  multiple_pages: "Visar %{item_name} %{from}-%{to} av %{count} totalt"
20
20
  combo_nav_js: "Sida %{page_input} av %{pages}"
21
- items_selector_js: "Visa %{items_input} %{item_name} per sida"
21
+ limit_selector_js: "Visa %{limit_input} %{item_name} per sida"
data/locales/sv.yml CHANGED
@@ -18,4 +18,4 @@ sv:
18
18
  single_page: "Visar %{count} %{item_name}"
19
19
  multiple_pages: "Visar %{item_name} %{from}-%{to} av %{count} totalt"
20
20
  combo_nav_js: "Sida %{page_input} av %{pages}"
21
- items_selector_js: "Visa %{items_input} %{item_name} per sida"
21
+ limit_selector_js: "Visa %{limit_input} %{item_name} per sida"