├── .github
└── workflows
│ └── main.yml
├── .gitignore
├── .standard.yml
├── CODE_OF_CONDUCT.md
├── Gemfile
├── Gemfile.lock
├── LICENSE.txt
├── README.md
├── Rakefile
├── bin
├── console
├── kuiq
└── setup
├── kuiq.gemspec
├── lib
├── kuiq.rb
└── kuiq
│ ├── cli.rb
│ ├── ext
│ └── kernel.rb
│ ├── i18n.rb
│ ├── model
│ ├── class_metric.rb
│ ├── dashboard_graph_presenter.rb
│ ├── job.rb
│ ├── job_manager.rb
│ ├── metrics_graph_presenter.rb
│ ├── paginator.rb
│ ├── process.rb
│ ├── queue.rb
│ └── work.rb
│ ├── version.rb
│ └── view
│ ├── busy.rb
│ ├── dashboard.rb
│ ├── dashboard_graph.rb
│ ├── footer.rb
│ ├── gui_application.rb
│ ├── metrics.rb
│ ├── morgue.rb
│ ├── queues.rb
│ ├── retries.rb
│ ├── scheduled.rb
│ ├── stat.rb
│ ├── stat_row.rb
│ └── table_toolbar.rb
├── locales
├── ar.yml
├── cs.yml
├── da.yml
├── de.yml
├── el.yml
├── en.yml
├── es.yml
├── fa.yml
├── fr.yml
├── gd.yml
├── he.yml
├── hi.yml
├── it.yml
├── ja.yml
├── ko.yml
├── lt.yml
├── nb.yml
├── nl.yml
├── pl.yml
├── pt-br.yml
├── pt.yml
├── ru.yml
├── sv.yml
├── ta.yml
├── uk.yml
├── ur.yml
├── vi.yml
├── zh-cn.yml
└── zh-tw.yml
├── misc
└── ui.png
└── test
├── test_helper.rb
└── test_kuiq.rb
/.github/workflows/main.yml:
--------------------------------------------------------------------------------
1 | name: Ruby
2 |
3 | on:
4 | push:
5 | branches:
6 | - main
7 |
8 | pull_request:
9 |
10 | jobs:
11 | build:
12 | runs-on: ubuntu-latest
13 | name: Ruby ${{ matrix.ruby }}
14 | strategy:
15 | matrix:
16 | ruby:
17 | - '3.2.0'
18 |
19 | steps:
20 | - uses: actions/checkout@v4
21 | - name: Set up Ruby
22 | uses: ruby/setup-ruby@v1
23 | with:
24 | ruby-version: ${{ matrix.ruby }}
25 | bundler-cache: true
26 | - name: Run the default task
27 | run: bundle exec rake
28 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | /.bundle/
2 | /.yardoc
3 | /_yardoc/
4 | /coverage/
5 | /doc/
6 | /pkg/
7 | /spec/reports/
8 | /tmp/
9 | .gladiator
10 | .gladiator-scratchpad
11 | .ruby-version
12 | .ruby-gemset
13 |
--------------------------------------------------------------------------------
/.standard.yml:
--------------------------------------------------------------------------------
1 | # For available configuration options, see:
2 | # https://github.com/testdouble/standard
3 | ruby_version: 3.2
4 |
--------------------------------------------------------------------------------
/CODE_OF_CONDUCT.md:
--------------------------------------------------------------------------------
1 | # Contributor Covenant Code of Conduct
2 |
3 | ## Our Pledge
4 |
5 | We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation.
6 |
7 | We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community.
8 |
9 | ## Our Standards
10 |
11 | Examples of behavior that contributes to a positive environment for our community include:
12 |
13 | * Demonstrating empathy and kindness toward other people
14 | * Being respectful of differing opinions, viewpoints, and experiences
15 | * Giving and gracefully accepting constructive feedback
16 | * Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience
17 | * Focusing on what is best not just for us as individuals, but for the overall community
18 |
19 | Examples of unacceptable behavior include:
20 |
21 | * The use of sexualized language or imagery, and sexual attention or
22 | advances of any kind
23 | * Trolling, insulting or derogatory comments, and personal or political attacks
24 | * Public or private harassment
25 | * Publishing others' private information, such as a physical or email
26 | address, without their explicit permission
27 | * Other conduct which could reasonably be considered inappropriate in a
28 | professional setting
29 |
30 | ## Enforcement Responsibilities
31 |
32 | Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful.
33 |
34 | Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate.
35 |
36 | ## Scope
37 |
38 | This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event.
39 |
40 | ## Enforcement
41 |
42 | Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at mperham@gmail.com. All complaints will be reviewed and investigated promptly and fairly.
43 |
44 | All community leaders are obligated to respect the privacy and security of the reporter of any incident.
45 |
46 | ## Enforcement Guidelines
47 |
48 | Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct:
49 |
50 | ### 1. Correction
51 |
52 | **Community Impact**: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community.
53 |
54 | **Consequence**: A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested.
55 |
56 | ### 2. Warning
57 |
58 | **Community Impact**: A violation through a single incident or series of actions.
59 |
60 | **Consequence**: A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban.
61 |
62 | ### 3. Temporary Ban
63 |
64 | **Community Impact**: A serious violation of community standards, including sustained inappropriate behavior.
65 |
66 | **Consequence**: A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban.
67 |
68 | ### 4. Permanent Ban
69 |
70 | **Community Impact**: Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals.
71 |
72 | **Consequence**: A permanent ban from any sort of public interaction within the community.
73 |
74 | ## Attribution
75 |
76 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 2.0,
77 | available at https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
78 |
79 | Community Impact Guidelines were inspired by [Mozilla's code of conduct enforcement ladder](https://github.com/mozilla/diversity).
80 |
81 | [homepage]: https://www.contributor-covenant.org
82 |
83 | For answers to common questions about this code of conduct, see the FAQ at
84 | https://www.contributor-covenant.org/faq. Translations are available at https://www.contributor-covenant.org/translations.
85 |
--------------------------------------------------------------------------------
/Gemfile:
--------------------------------------------------------------------------------
1 | # frozen_string_literal: true
2 |
3 | source "https://rubygems.org"
4 |
5 | gem "glimmer-dsl-libui", "= 0.11.8"
6 | gem "glimmer-libui-cc-graphs_and_charts", "= 0.3.0"
7 | gem "sidekiq"
8 |
9 | group :test do
10 | gem "rake"
11 | gem "standard"
12 | gem "minitest"
13 | end
14 |
15 | # gem "derailed_benchmarks", group: :development
16 |
--------------------------------------------------------------------------------
/Gemfile.lock:
--------------------------------------------------------------------------------
1 | GEM
2 | remote: https://rubygems.org/
3 | specs:
4 | array_include_methods (1.5.1)
5 | ast (2.4.2)
6 | awesome_print (1.9.2)
7 | chunky_png (1.4.0)
8 | color (1.8)
9 | concurrent-ruby (1.2.2)
10 | connection_pool (2.4.1)
11 | equalizer (0.0.11)
12 | facets (3.1.0)
13 | glimmer (2.7.7)
14 | array_include_methods (>= 1.4.0, < 1.6.0)
15 | facets (>= 3.1.0, < 4.0.0)
16 | glimmer-dsl-libui (0.11.8)
17 | chunky_png (~> 1.4.0)
18 | color (~> 1.8)
19 | equalizer (= 0.0.11)
20 | glimmer (~> 2.7.4)
21 | libui (= 0.1.2.pre)
22 | os (>= 1.0.0, < 2.0.0)
23 | perfect-shape (~> 1.0.8)
24 | puts_debuggerer (>= 0.13.5, < 2.0.0)
25 | rake (>= 10.1.0, < 14.0.0)
26 | rake-tui (>= 0.2.3, < 2.0.0)
27 | rouge (>= 3.26.0, < 4.0.0)
28 | super_module (~> 1.4.1)
29 | text-table (>= 1.2.4, < 2.0.0)
30 | glimmer-libui-cc-graphs_and_charts (0.3.0)
31 | glimmer-dsl-libui (>= 0.11.8, < 2.0.0)
32 | json (2.7.1)
33 | language_server-protocol (3.17.0.3)
34 | libui (0.1.2.pre)
35 | libui (0.1.2.pre-arm64-darwin)
36 | libui (0.1.2.pre-x86_64-darwin)
37 | lint_roller (1.1.0)
38 | matrix (0.4.2)
39 | method_source (1.0.0)
40 | minitest (5.20.0)
41 | os (1.1.4)
42 | parallel (1.24.0)
43 | parser (3.2.2.4)
44 | ast (~> 2.4.1)
45 | racc
46 | pastel (0.8.0)
47 | tty-color (~> 0.5)
48 | perfect-shape (1.0.8)
49 | equalizer (>= 0.0.11, < 1.1.0)
50 | matrix (>= 0.4.2, < 1.1.0)
51 | puts_debuggerer (0.13.5)
52 | awesome_print (~> 1.9.2)
53 | racc (1.7.3)
54 | rack (3.0.8)
55 | rainbow (3.1.1)
56 | rake (13.1.0)
57 | rake-tui (0.2.3)
58 | tty-prompt
59 | redis-client (0.19.0)
60 | connection_pool
61 | regexp_parser (2.8.3)
62 | rexml (3.2.6)
63 | rouge (3.30.0)
64 | rubocop (1.57.2)
65 | json (~> 2.3)
66 | language_server-protocol (>= 3.17.0)
67 | parallel (~> 1.10)
68 | parser (>= 3.2.2.4)
69 | rainbow (>= 2.2.2, < 4.0)
70 | regexp_parser (>= 1.8, < 3.0)
71 | rexml (>= 3.2.5, < 4.0)
72 | rubocop-ast (>= 1.28.1, < 2.0)
73 | ruby-progressbar (~> 1.7)
74 | unicode-display_width (>= 2.4.0, < 3.0)
75 | rubocop-ast (1.30.0)
76 | parser (>= 3.2.1.0)
77 | rubocop-performance (1.19.1)
78 | rubocop (>= 1.7.0, < 2.0)
79 | rubocop-ast (>= 0.4.0)
80 | ruby-progressbar (1.13.0)
81 | sidekiq (7.2.0)
82 | concurrent-ruby (< 2)
83 | connection_pool (>= 2.3.0)
84 | rack (>= 2.2.4)
85 | redis-client (>= 0.14.0)
86 | standard (1.32.1)
87 | language_server-protocol (~> 3.17.0.2)
88 | lint_roller (~> 1.0)
89 | rubocop (~> 1.57.2)
90 | standard-custom (~> 1.0.0)
91 | standard-performance (~> 1.2)
92 | standard-custom (1.0.2)
93 | lint_roller (~> 1.0)
94 | rubocop (~> 1.50)
95 | standard-performance (1.2.1)
96 | lint_roller (~> 1.1)
97 | rubocop-performance (~> 1.19.1)
98 | super_module (1.4.1)
99 | method_source (>= 0.8.2, < 1.1.0)
100 | text-table (1.2.4)
101 | tty-color (0.6.0)
102 | tty-cursor (0.7.1)
103 | tty-prompt (0.23.1)
104 | pastel (~> 0.8)
105 | tty-reader (~> 0.8)
106 | tty-reader (0.9.0)
107 | tty-cursor (~> 0.7)
108 | tty-screen (~> 0.8)
109 | wisper (~> 2.0)
110 | tty-screen (0.8.2)
111 | unicode-display_width (2.5.0)
112 | wisper (2.0.1)
113 |
114 | PLATFORMS
115 | arm64-darwin-21
116 | arm64-darwin-22
117 | x86_64-darwin-22
118 | x86_64-linux
119 |
120 | DEPENDENCIES
121 | glimmer-dsl-libui (= 0.11.8)
122 | glimmer-libui-cc-graphs_and_charts (= 0.3.0)
123 | minitest
124 | rake
125 | sidekiq
126 | standard
127 |
128 | BUNDLED WITH
129 | 2.4.22
130 |
--------------------------------------------------------------------------------
/LICENSE.txt:
--------------------------------------------------------------------------------
1 | GNU LESSER GENERAL PUBLIC LICENSE
2 | Version 3, 29 June 2007
3 |
4 | Copyright (C) 2007 Free Software Foundation, Inc.
5 | Everyone is permitted to copy and distribute verbatim copies
6 | of this license document, but changing it is not allowed.
7 |
8 |
9 | This version of the GNU Lesser General Public License incorporates
10 | the terms and conditions of version 3 of the GNU General Public
11 | License, supplemented by the additional permissions listed below.
12 |
13 | 0. Additional Definitions.
14 |
15 | As used herein, "this License" refers to version 3 of the GNU Lesser
16 | General Public License, and the "GNU GPL" refers to version 3 of the GNU
17 | General Public License.
18 |
19 | "The Library" refers to a covered work governed by this License,
20 | other than an Application or a Combined Work as defined below.
21 |
22 | An "Application" is any work that makes use of an interface provided
23 | by the Library, but which is not otherwise based on the Library.
24 | Defining a subclass of a class defined by the Library is deemed a mode
25 | of using an interface provided by the Library.
26 |
27 | A "Combined Work" is a work produced by combining or linking an
28 | Application with the Library. The particular version of the Library
29 | with which the Combined Work was made is also called the "Linked
30 | Version".
31 |
32 | The "Minimal Corresponding Source" for a Combined Work means the
33 | Corresponding Source for the Combined Work, excluding any source code
34 | for portions of the Combined Work that, considered in isolation, are
35 | based on the Application, and not on the Linked Version.
36 |
37 | The "Corresponding Application Code" for a Combined Work means the
38 | object code and/or source code for the Application, including any data
39 | and utility programs needed for reproducing the Combined Work from the
40 | Application, but excluding the System Libraries of the Combined Work.
41 |
42 | 1. Exception to Section 3 of the GNU GPL.
43 |
44 | You may convey a covered work under sections 3 and 4 of this License
45 | without being bound by section 3 of the GNU GPL.
46 |
47 | 2. Conveying Modified Versions.
48 |
49 | If you modify a copy of the Library, and, in your modifications, a
50 | facility refers to a function or data to be supplied by an Application
51 | that uses the facility (other than as an argument passed when the
52 | facility is invoked), then you may convey a copy of the modified
53 | version:
54 |
55 | a) under this License, provided that you make a good faith effort to
56 | ensure that, in the event an Application does not supply the
57 | function or data, the facility still operates, and performs
58 | whatever part of its purpose remains meaningful, or
59 |
60 | b) under the GNU GPL, with none of the additional permissions of
61 | this License applicable to that copy.
62 |
63 | 3. Object Code Incorporating Material from Library Header Files.
64 |
65 | The object code form of an Application may incorporate material from
66 | a header file that is part of the Library. You may convey such object
67 | code under terms of your choice, provided that, if the incorporated
68 | material is not limited to numerical parameters, data structure
69 | layouts and accessors, or small macros, inline functions and templates
70 | (ten or fewer lines in length), you do both of the following:
71 |
72 | a) Give prominent notice with each copy of the object code that the
73 | Library is used in it and that the Library and its use are
74 | covered by this License.
75 |
76 | b) Accompany the object code with a copy of the GNU GPL and this license
77 | document.
78 |
79 | 4. Combined Works.
80 |
81 | You may convey a Combined Work under terms of your choice that,
82 | taken together, effectively do not restrict modification of the
83 | portions of the Library contained in the Combined Work and reverse
84 | engineering for debugging such modifications, if you also do each of
85 | the following:
86 |
87 | a) Give prominent notice with each copy of the Combined Work that
88 | the Library is used in it and that the Library and its use are
89 | covered by this License.
90 |
91 | b) Accompany the Combined Work with a copy of the GNU GPL and this license
92 | document.
93 |
94 | c) For a Combined Work that displays copyright notices during
95 | execution, include the copyright notice for the Library among
96 | these notices, as well as a reference directing the user to the
97 | copies of the GNU GPL and this license document.
98 |
99 | d) Do one of the following:
100 |
101 | 0) Convey the Minimal Corresponding Source under the terms of this
102 | License, and the Corresponding Application Code in a form
103 | suitable for, and under terms that permit, the user to
104 | recombine or relink the Application with a modified version of
105 | the Linked Version to produce a modified Combined Work, in the
106 | manner specified by section 6 of the GNU GPL for conveying
107 | Corresponding Source.
108 |
109 | 1) Use a suitable shared library mechanism for linking with the
110 | Library. A suitable mechanism is one that (a) uses at run time
111 | a copy of the Library already present on the user's computer
112 | system, and (b) will operate properly with a modified version
113 | of the Library that is interface-compatible with the Linked
114 | Version.
115 |
116 | e) Provide Installation Information, but only if you would otherwise
117 | be required to provide such information under section 6 of the
118 | GNU GPL, and only to the extent that such information is
119 | necessary to install and execute a modified version of the
120 | Combined Work produced by recombining or relinking the
121 | Application with a modified version of the Linked Version. (If
122 | you use option 4d0, the Installation Information must accompany
123 | the Minimal Corresponding Source and Corresponding Application
124 | Code. If you use option 4d1, you must provide the Installation
125 | Information in the manner specified by section 6 of the GNU GPL
126 | for conveying Corresponding Source.)
127 |
128 | 5. Combined Libraries.
129 |
130 | You may place library facilities that are a work based on the
131 | Library side by side in a single library together with other library
132 | facilities that are not Applications and are not covered by this
133 | License, and convey such a combined library under terms of your
134 | choice, if you do both of the following:
135 |
136 | a) Accompany the combined library with a copy of the same work based
137 | on the Library, uncombined with any other library facilities,
138 | conveyed under the terms of this License.
139 |
140 | b) Give prominent notice with the combined library that part of it
141 | is a work based on the Library, and explaining where to find the
142 | accompanying uncombined form of the same work.
143 |
144 | 6. Revised Versions of the GNU Lesser General Public License.
145 |
146 | The Free Software Foundation may publish revised and/or new versions
147 | of the GNU Lesser General Public License from time to time. Such new
148 | versions will be similar in spirit to the present version, but may
149 | differ in detail to address new problems or concerns.
150 |
151 | Each version is given a distinguishing version number. If the
152 | Library as you received it specifies that a certain numbered version
153 | of the GNU Lesser General Public License "or any later version"
154 | applies to it, you have the option of following the terms and
155 | conditions either of that published version or of any later version
156 | published by the Free Software Foundation. If the Library as you
157 | received it does not specify a version number of the GNU Lesser
158 | General Public License, you may choose any version of the GNU Lesser
159 | General Public License ever published by the Free Software Foundation.
160 |
161 | If the Library as you received it specifies that a proxy can decide
162 | whether future versions of the GNU Lesser General Public License shall
163 | apply, that proxy's public statement of acceptance of any version is
164 | permanent authorization for you to choose that version for the
165 | Library.
166 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Kuiq - Sidekiq UI
2 |
3 | Kuiq (**UI** for Side**kiq**, pronounced "quick") is a native desktop application for Sidekiq administration. It uses the [Glimmer DSL for LibUI](https://github.com/AndyObtiva/glimmer-dsl-libui) toolkit for building native GUIs in Ruby.
4 |
5 | Please note this is a prototype and nothing official or usable at the moment.
6 |
7 | If you are unfamiliar with [Glimmer DSL for LibUI](https://github.com/AndyObtiva/glimmer-dsl-libui), you can see a large set of helpful examples by running `gem install glimmer-dsl-libui; glimmer examples`.
8 |
9 | ## Installation
10 |
11 | Stable release (not available yet):
12 |
13 | ```
14 | gem install kuiq
15 | ```
16 |
17 | Latest version:
18 |
19 | ```
20 | git clone git@github.com:mperham/kuiq.git
21 | cd kuiq && bundle
22 | bundle exec bin/kuiq
23 | ```
24 |
25 | ## Usage
26 |
27 | You'll need to check out the latest code and run Kuiq manually.
28 | Specify your Redis location with `REDIS_URL`:
29 |
30 | ```
31 | REDIS_URL=redis://localhost:6379/0 bundle exec bin/kuiq
32 | ```
33 |
34 | ## Screenshot
35 |
36 | If all goes well, you'll see something like this:
37 |
38 | 
39 |
40 | ## Author
41 |
42 | Andy Maleh, Mike Perham
43 |
--------------------------------------------------------------------------------
/Rakefile:
--------------------------------------------------------------------------------
1 | # frozen_string_literal: true
2 |
3 | require "fileutils"
4 | require "bundler/gem_tasks"
5 | require "rake/testtask"
6 |
7 | Rake::TestTask.new(:test) do |t|
8 | t.libs << "test"
9 | t.libs << "lib"
10 | t.test_files = FileList["test/**/test_*.rb"]
11 | end
12 |
13 | require "standard/rake"
14 |
15 | task default: %i[test standard:fix]
16 |
17 | task :refresh_locales do
18 | FileUtils.cp_r "../sidekiq/web/locales", "."
19 | end
20 |
--------------------------------------------------------------------------------
/bin/console:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env ruby
2 | # frozen_string_literal: true
3 |
4 | $LOAD_PATH.unshift File.expand_path(File.join(__dir__, '..', 'lib'))
5 |
6 | require "bundler/setup"
7 | require "kuiq/sidekiq_ui"
8 |
9 | # You can add fixtures and/or initialization code here to make experimenting
10 | # with your gem easier. You can also use a different console, if you like.
11 |
12 | require "irb"
13 | IRB.start(__FILE__)
14 |
--------------------------------------------------------------------------------
/bin/kuiq:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env ruby
2 |
3 | $LOAD_PATH.unshift File.expand_path(File.join(__dir__, '..', 'lib'))
4 |
5 | require "kuiq/cli"
6 |
7 | cli = Kuiq::CLI.instance
8 | cli.parse
9 | cli.run
10 |
--------------------------------------------------------------------------------
/bin/setup:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | set -euo pipefail
3 | IFS=$'\n\t'
4 | set -vx
5 |
6 | bundle install
7 |
8 | # Do any other automated setup that you need to do here
9 |
--------------------------------------------------------------------------------
/kuiq.gemspec:
--------------------------------------------------------------------------------
1 | # frozen_string_literal: true
2 |
3 | require_relative "lib/kuiq/version"
4 |
5 | Gem::Specification.new do |spec|
6 | spec.name = "kuiq"
7 | spec.version = Kuiq::VERSION
8 | spec.authors = ["Mike Perham"]
9 | spec.email = ["mperham@gmail.com"]
10 |
11 | spec.summary = "Sidekiq desktop application"
12 | spec.description = "A native desktop application for Sidekiq operators, using the Glimmer toolkit"
13 | spec.homepage = "https://github.com/mperham/quick"
14 | spec.license = "LGPL-3.0"
15 | spec.required_ruby_version = ">= 3.0.0"
16 |
17 | spec.metadata["homepage_uri"] = spec.homepage
18 | spec.metadata["source_code_uri"] = spec.homepage
19 | spec.metadata["changelog_uri"] = spec.homepage
20 |
21 | # Specify which files should be added to the gem when it is released.
22 | # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
23 | spec.files = Dir.chdir(__dir__) do
24 | `git ls-files -z`.split("\x0").reject do |f|
25 | (File.expand_path(f) == __FILE__) ||
26 | f.start_with?(*%w[test/ spec/ features/ .git .github appveyor Gemfile])
27 | end
28 | end
29 | spec.bindir = "bin"
30 | spec.executables = ["kuiq"]
31 | spec.require_paths = ["lib"]
32 |
33 | # Uncomment to register a new dependency of your gem
34 | spec.add_dependency "glimmer-dsl-libui", "= 0.11.7"
35 | spec.add_dependency "glimmer-libui-cc-graphs_and_charts", "= 0.2.3"
36 | spec.add_dependency "sidekiq", "~> 7.2"
37 | end
38 |
--------------------------------------------------------------------------------
/lib/kuiq.rb:
--------------------------------------------------------------------------------
1 | # frozen_string_literal: true
2 |
3 | require "kuiq/version"
4 |
5 | module Kuiq
6 | WINDOW_WIDTH = 1000.0
7 | WINDOW_HEIGHT = 635.0
8 | GRAPH_MAX_POINTS_LARGEST_SCREEN = 577
9 | GRAPH_DASHBOARD_COLORS = {
10 | processed: [47, 109, 104],
11 | failed: [163, 40, 39],
12 | }
13 | POLLING_INTERVAL_MIN = 1
14 | POLLING_INTERVAL_MAX = 20
15 | POLLING_INTERVAL_DEFAULT = 2
16 | end
17 |
--------------------------------------------------------------------------------
/lib/kuiq/cli.rb:
--------------------------------------------------------------------------------
1 | require "singleton"
2 | require "optparse"
3 | require "sidekiq"
4 | require "sidekiq/api"
5 | require "kuiq/version"
6 | require "kuiq/i18n"
7 |
8 | module Kuiq
9 | class CLI
10 | include Singleton
11 |
12 | DEFAULTS = {
13 | verbose: false,
14 | action: :gui
15 | }
16 |
17 | def parse
18 | @options = DEFAULTS.dup
19 | OptionParser.new do |opts|
20 | opts.banner = "Usage: #{opts.program_name} [options]"
21 | opts.on("-v", "Use verbose logging") do |v|
22 | @options[:verbose] = v
23 | end
24 | end.parse!
25 |
26 | logger.level = (@options[:verbose] ? :info : :warn)
27 | @options
28 | end
29 |
30 | def gui
31 | require "glimmer-dsl-libui"
32 | require "kuiq/view/gui_application"
33 | Kuiq::GUIApplication.launch
34 | end
35 |
36 | def run
37 | logger.info { "Kuiq #{Kuiq::VERSION}, using the #{I18n.current_locale.upcase} locale" }
38 | logger.info { RUBY_DESCRIPTION }
39 | logger.info { "Redis client #{RedisClient::VERSION}, server #{Sidekiq.default_configuration.redis_info["redis_version"]}" }
40 | logger.info { "LibUI #{::LibUI::VERSION}, Glimmer " }
41 |
42 | send(@options[:action])
43 | end
44 |
45 | def logger
46 | Sidekiq.logger
47 | end
48 | end
49 | end
50 |
--------------------------------------------------------------------------------
/lib/kuiq/ext/kernel.rb:
--------------------------------------------------------------------------------
1 | # Any methods defined here are available everywhere (both Models & Views) to provide extra convenience
2 | # for handling cross-cutting concerns like logging and i18n.
3 | #
4 | # That said, defining Kernel methods must be done sparingly as it can be tough for codebase
5 | # newcomers to figure out that global methods live here, and it would be better for maintainability
6 | # in general to call methods on objects instead of inheriting global utility methods.
7 | module Kernel
8 | # We will return Sidekiq.logger instead of Glimmer::Config.logger
9 | # because in general, GUI error logging is at the error level
10 | # and Sidekiq logging is at the info level, and we do not want
11 | # to see GUI info logging as it can be very verbose.
12 | #
13 | # In the future, if there is a need to unite the two loggers, we could
14 | # set `Glimmer::Config.logger = Sidekiq.logger` right after loading
15 | # both the sidekiq and glimmer-dsl-libui gems.
16 | def logger
17 | Sidekiq.logger
18 | end
19 |
20 | def t(msg, options = {})
21 | Kuiq::I18n.t(msg, options)
22 | end
23 |
24 | # Inverse-translates (e.g. for "Tableau de Bord" in fr, we get "Dashboard")
25 | def it(msg, options = {})
26 | Kuiq::I18n.it(msg, options)
27 | end
28 |
29 | def timeago_in_words(from_time, to_time = Time.now)
30 | from_time, to_time = to_time, from_time if from_time > to_time
31 | distance_in_minutes = ((to_time - from_time) / 60.0).round
32 | distance_in_seconds = (to_time - from_time).round
33 |
34 | case distance_in_minutes
35 | when 0
36 | case distance_in_seconds
37 | when ..4 then "0s"
38 | when 5..9 then "5s"
39 | when 10..19 then "15s"
40 | when 20..39 then "30s"
41 | else "1m"
42 | end
43 |
44 | when 1...90
45 | "#{distance_in_minutes}m"
46 | when 90...2520
47 | "#{(distance_in_minutes.to_f / 60.0).round}h"
48 | else
49 | "#{(distance_in_minutes.to_f / 1440.0).round}d"
50 | end
51 | end
52 | end
53 |
--------------------------------------------------------------------------------
/lib/kuiq/i18n.rb:
--------------------------------------------------------------------------------
1 | # frozen_string_literal: true
2 |
3 | module Kuiq
4 | class I18n
5 | LOCALES = "./locales"
6 |
7 | class << self
8 | # Use Sidekiq's i18n with locale files in sidekiq/web/locales
9 | # Note task in Rakefile to refresh locale files.
10 | def current_locale
11 | @locale ||= begin
12 | x = (ENV["LANGUAGE"] || ENV["LANG"] || "en").downcase.tr("_", "-")
13 | loop do
14 | break "en" if x.size < 2
15 | break x if File.exist?("#{LOCALES}/#{x}.yml")
16 | # dumb brute force heuristic: look for locale files
17 | # that match the longest LANG prefix, necessary to serve
18 | # more complex lang groups like zh and pt.
19 | x = x[0...-1]
20 | end
21 | end
22 | end
23 |
24 | # Translates msg string for current locale (e.g. for "Dashboard", we get "Tableau de Bord" in fr)
25 | def t(msg, options = {})
26 | string = strings(current_locale)[msg] || msg
27 | if options.empty?
28 | string
29 | else
30 | string % options
31 | end
32 | end
33 |
34 | # Inverse-translates msg string for current locale (e.g. for "Tableau de Bord" in fr, we get "Dashboard")
35 | def it(msg, options = {})
36 | inverted_strings = inverted_strings(current_locale)
37 | msg_without_underscores = msg.to_s.sub("_", " ")
38 | string = inverted_strings[msg] || inverted_strings[msg_without_underscores] || msg
39 | if options.empty?
40 | string
41 | else
42 | string % options
43 | end
44 | end
45 |
46 | private def strings(lang)
47 | @strings ||= {}
48 | @strings[lang] ||= [LOCALES].each_with_object({}) do |path, global|
49 | Dir["#{path}/#{lang}.yml"].each do |file|
50 | strs = YAML.safe_load_file(file)
51 | global.merge!(strs[lang])
52 | end
53 | end
54 | end
55 |
56 | private def inverted_strings(lang)
57 | @inverted_strings ||= {}
58 | @inverted_strings[lang] ||= strings(lang).invert
59 | end
60 | end
61 | end
62 | end
63 |
--------------------------------------------------------------------------------
/lib/kuiq/model/class_metric.rb:
--------------------------------------------------------------------------------
1 | module Kuiq
2 | module Model
3 | class ClassMetric
4 | class << self
5 | def next_swatch_color
6 | available_swatch_colors[next_swatch_color_index % available_swatch_colors.size]
7 | end
8 |
9 | def available_swatch_colors
10 | @available_swatch_colors ||= SWATCH_COLORS.dup.shuffle + Glimmer::LibUI.x11_colors.dup.shuffle
11 | end
12 |
13 | private
14 |
15 | def next_swatch_color_index
16 | @next_swatch_color_index ||= -1
17 | @next_swatch_color_index += 1
18 | end
19 | end
20 |
21 | SWATCH_COLORS = [
22 | "#537bc4", "#4dc9f6", "#f67019", "#f53794", "#acc236",
23 | "#166a8f", "#00a950", "#58595b", "#8549ba", "#991b1b"
24 | ]
25 |
26 | attr_reader :swatch_name_color, :results
27 |
28 | def initialize(klass, results)
29 | @results = results
30 | # we need to store data in a triad to match what libui expects of
31 | # table data in a 3-value checkbox text color column
32 | @swatch_name_color = [true, klass, ClassMetric.next_swatch_color]
33 | end
34 |
35 | def success = rounded_number(results.dig("totals", "p") - results.dig("totals", "f"))
36 |
37 | def failure = rounded_number(results.dig("totals", "f"))
38 |
39 | def tet = rounded_number(results.dig("totals", "s"), precision: 2)
40 |
41 | def aet = rounded_number(results.total_avg("s"), precision: 2)
42 |
43 | def swatch
44 | swatch_name_color[0]
45 | end
46 |
47 | def name
48 | swatch_name_color[1]
49 | end
50 |
51 | def swatch_color
52 | swatch_name_color[2]
53 | end
54 |
55 | private
56 |
57 | def rounded_number(number, options = {})
58 | precision = options[:precision] || 0
59 | number.round(precision)
60 | end
61 | end
62 | end
63 | end
64 |
--------------------------------------------------------------------------------
/lib/kuiq/model/dashboard_graph_presenter.rb:
--------------------------------------------------------------------------------
1 | require "date"
2 |
3 | require "kuiq/model/job_manager"
4 | require "kuiq/model/job"
5 |
6 | module Kuiq
7 | module Model
8 | class DashboardGraphPresenter
9 | JOB_STATUSES = [:failed, :processed]
10 | DAY_IN_SECONDS = 60*60*24
11 |
12 | attr_reader :job_manager
13 | attr_accessor :graph_width, :graph_height
14 |
15 | def initialize(job_manager, graph_width, graph_height)
16 | @job_manager = job_manager
17 | @graph_width = graph_width
18 | @graph_height = graph_height
19 | @stats = []
20 | @multi_day_stats = []
21 | @reset_stats_observer = Glimmer::DataBinding::Observer.proc { @stats = [] }
22 | @reset_stats_observer.observe(@job_manager, :polling_interval)
23 | end
24 |
25 | def record_stats
26 | raw_time = Time.now.utc
27 | stat = {
28 | time: live_poll_time_format(raw_time),
29 | raw_time: raw_time,
30 | processed: job_manager.processed,
31 | failed: job_manager.failed
32 | }
33 | @stats.prepend(stat)
34 | @stats = @stats[0, GRAPH_MAX_POINTS_LARGEST_SCREEN]
35 | end
36 |
37 | def report_stats(job_status)
38 | reported_stats = {
39 | x_interval_in_seconds: @job_manager.polling_interval,
40 | y_values: [],
41 | x_value_format: ->(time) { live_poll_time_format(time) },
42 | }
43 | return reported_stats if @stats.size <= 1
44 | @stats.each_with_index do |stat, n|
45 | if n == 0
46 | reported_stats[:x_value_start] = stat[:raw_time]
47 | next
48 | end
49 | y_value = @stats[n - 1][job_status] - stat[job_status]
50 | reported_stats[:y_values] << y_value
51 | end
52 | reported_stats
53 | end
54 |
55 | def report_history_stats(job_status, day_count)
56 | reported_stats = {
57 | x_interval_in_seconds: DAY_IN_SECONDS,
58 | y_values: [],
59 | x_value_format: ->(time) { time.strftime('%Y-%m-%d') },
60 | }
61 | history_stats = history(day_count: day_count).send(job_status)
62 | return reported_stats if history_stats.size <= 1
63 | history_stats.each_with_index do |stat, n|
64 | formatted_time = stat.first
65 | time = DateTime.strptime(formatted_time, '%Y-%m-%d').to_time
66 | value = stat.last
67 | reported_stats[:x_value_start] = time if n == 0
68 | reported_stats[:y_values] << value
69 | end
70 | reported_stats
71 | end
72 |
73 | def history(day_count:)
74 | Sidekiq::Stats::History.new(day_count)
75 | end
76 |
77 | private
78 |
79 | def live_poll_time_format(time)
80 | time.strftime("%a %d %b %Y %T GMT")
81 | end
82 | end
83 | end
84 | end
85 |
--------------------------------------------------------------------------------
/lib/kuiq/model/job.rb:
--------------------------------------------------------------------------------
1 | require "json"
2 |
3 | module Kuiq
4 | module Model
5 | class Job
6 | STATUSES = %i[processed failed busy enqueued retries scheduled dead]
7 |
8 | attr_reader :redis_hash, :score, :index
9 |
10 | def initialize(redis_hash, score, index = nil)
11 | @redis_hash = redis_hash
12 | @score = score
13 | @index = index
14 | end
15 |
16 | def at
17 | Time.at(score).utc
18 | end
19 |
20 | def at_s
21 | timeago_in_words(at)
22 | end
23 | alias_method :next_retry, :at_s
24 | alias_method :when, :at_s
25 | alias_method :last_retry, :at_s
26 |
27 | def job
28 | redis_hash["class"]
29 | end
30 |
31 | def arguments
32 | redis_hash["args"].map { |arg| "\"#{arg}\"" }.join(", ")
33 | end
34 |
35 | def error
36 | redis_hash["error_message"]
37 | end
38 |
39 | def sorted_entry
40 | @sorted_entry ||= Sidekiq::SortedEntry.new(nil, score, JSON.dump(redis_hash))
41 | end
42 |
43 | def respond_to_missing?(method_name, include_private = false)
44 | super ||
45 | redis_hash.include?(method_name.to_s)
46 | end
47 |
48 | def method_missing(method_name, *args, &block)
49 | if redis_hash.include?(method_name.to_s)
50 | redis_hash[method_name.to_s].to_s
51 | else
52 | super
53 | end
54 | end
55 | end
56 | end
57 | end
58 |
--------------------------------------------------------------------------------
/lib/kuiq/model/job_manager.rb:
--------------------------------------------------------------------------------
1 | require "kuiq/model/job"
2 | require "kuiq/model/process"
3 | require "kuiq/model/work"
4 | require "kuiq/model/paginator"
5 | require "kuiq/model/queue"
6 | require "kuiq/model/class_metric"
7 |
8 | module Kuiq
9 | module Model
10 | class JobManager
11 | REDIS_PROPERTIES = %w[redis_version uptime_in_days connected_clients used_memory_human used_memory_peak_human]
12 | BUSY_PROPERTIES = %i[process_size total_concurrency busy utilization total_rss]
13 |
14 | attr_accessor :polling_interval, :live_poll, :selected_job_for_metrics
15 | attr_reader :redis_url, :redis_info, :current_time,
16 | :retry_filter, :schedule_filter, :dead_filter,
17 | :work_queue_filter
18 |
19 | def initialize
20 | @polling_interval = POLLING_INTERVAL_DEFAULT
21 | @redis_url = Sidekiq.redis { |c| c.config.server_url }
22 | @redis_info = Sidekiq.default_configuration.redis_info
23 | @current_time = Time.now.utc
24 | @selected_job_for_metrics = metrics.map(&:name).first
25 | end
26 |
27 | def stats = @stats ||= Sidekiq::Stats.new
28 |
29 | def process_set = @process_set ||= Sidekiq::ProcessSet.new
30 |
31 | def work_set = @work_set ||= Sidekiq::WorkSet.new
32 |
33 | def processed = stats.processed
34 |
35 | def failed = stats.failed
36 |
37 | def busy = work_set.size
38 |
39 | def enqueued = stats.enqueued
40 |
41 | def retries = stats.retry_size
42 |
43 | def scheduled = stats.scheduled_size
44 |
45 | def dead = stats.dead_size
46 |
47 | def process_size = process_set.size
48 |
49 | def total_concurrency = process_set.total_concurrency
50 |
51 | def total_rss = process_set.total_rss
52 |
53 | def utilization
54 | x = total_concurrency
55 | ws = busy
56 | x.zero? ? 0 : ((ws / x.to_f) * 100).round(0)
57 | end
58 |
59 | def processes
60 | process_set.to_a.map { |process_hash| Process.new(process_hash) }
61 | end
62 |
63 | def works
64 | work_objects = work_set.to_a.map { |args| Work.new(*args) }
65 | work_objects = work_objects.select { |work| work.queue == work_queue_filter } if !work_queue_filter.to_s.strip.empty?
66 | work_objects
67 | end
68 |
69 | def work_queue_filter=(string)
70 | @work_queue_filter = string
71 | notify_observers(:works)
72 | end
73 |
74 | def queues
75 | Sidekiq::Queue.all.map { |q| Kuiq::Model::Queue.new(q) }
76 | end
77 |
78 | def metrics
79 | if @metrics.nil?
80 | query = Sidekiq::Metrics::Query.new
81 | # TODO support different values for :minutes option through a combobox dropdown
82 | query_result = query.top_jobs(minutes: 60)
83 | job_results = query_result.job_results
84 | sorted_job_results = job_results.sort_by { |_, results| -results.totals["s"] }.take(30)
85 | @metrics = sorted_job_results.map { |klass, results| Kuiq::Model::ClassMetric.new(klass, results) }
86 | end
87 | @metrics
88 | end
89 |
90 | def metrics_for_job(job_worker_name)
91 | @metrics_for_job ||= {}
92 | if @metrics_for_job[job_worker_name].nil?
93 | query = Sidekiq::Metrics::Query.new
94 | # TODO support different values for :minutes option through a combobox dropdown
95 | query_result = query.for_job(job_worker_name, minutes: 60)
96 | query_result.marks.map { |m| [m.bucket, m.label] }
97 | job_results = query_result.job_results[job_worker_name]
98 | ends_at = query_result.ends_at
99 | hist_totals = job_results.hist.values.first.zip(*job_results.hist.values[1..]).map(&:sum).reverse
100 | bucket_labels = Sidekiq::Metrics::Histogram::LABELS
101 | bucket_intervals = Sidekiq::Metrics::Histogram::BUCKET_INTERVALS
102 | @metrics_for_job[job_worker_name] = {
103 | hist_totals: hist_totals,
104 | bucket_labels: bucket_labels,
105 | bucket_intervals: bucket_intervals,
106 | job_results: job_results,
107 | ends_at: ends_at,
108 | }
109 | end
110 | @metrics_for_job[job_worker_name]
111 | end
112 |
113 | def metrics_for_selected_job
114 | metrics_for_job(selected_job_for_metrics)
115 | end
116 |
117 | def metric_jobs
118 | @metric_jobs ||= metrics.map(&:name).yield_self do |names|
119 | names.empty? ? [''] : names
120 | end
121 | end
122 |
123 | def retried_jobs
124 | # Data will get lazy loaded into the table as the user scrolls through.
125 | # After data is built, it is cached long-term, till updating table `cell_rows`.
126 | sorted_jobs(Sidekiq::RetrySet)
127 | end
128 |
129 | def retry_filter=(string)
130 | @retry_filter = string
131 | notify_observers(:retried_jobs)
132 | end
133 |
134 | def scheduled_jobs
135 | sorted_jobs(Sidekiq::ScheduledSet)
136 | end
137 |
138 | def schedule_filter=(string)
139 | @schedule_filter = string
140 | notify_observers(:scheduled_jobs)
141 | end
142 |
143 | def dead_jobs
144 | sorted_jobs(Sidekiq::DeadSet)
145 | end
146 |
147 | def dead_filter=(string)
148 | @dead_filter = string
149 | notify_observers(:dead_jobs)
150 | end
151 |
152 | def sorted_jobs(klass)
153 | inst = klass.new
154 | key = inst.name
155 | count = inst.size
156 | filter_method_name = "#{key}_filter"
157 | filter = send(filter_method_name) if respond_to?(filter_method_name)
158 | page_size = 25
159 | if !filter.to_s.strip.empty?
160 | result_set = inst.scan(filter).to_a
161 | job_cache = result_set.each_with_index.map do |sorted_entry, index|
162 | Job.new(JSON.parse(sorted_entry.value), sorted_entry.score, index)
163 | end
164 | count = job_cache.size
165 | Enumerator::Lazy.new(count.times, count) do |yielder, index|
166 | yielder << job_cache[index]
167 | end
168 | else
169 | page_data_cache = nil
170 | Enumerator::Lazy.new(count.times, count) do |yielder, index|
171 | page_index = (index / page_size)
172 | page = page_index + 1
173 | index_within_page = index % page_size
174 | page_data_cache = nil if index_within_page == 0
175 | page_data_cache ||= Paginator.instance.page(key, page, page_size)
176 | job_redis_hash_json, score = page_data_cache.last.reject { |j| j.is_a?(Numeric) }[index_within_page]
177 | if job_redis_hash_json
178 | job_redis_hash = JSON.parse(job_redis_hash_json)
179 | job = Job.new(job_redis_hash, score, index)
180 | yielder << job
181 | end
182 | end
183 | end
184 | end
185 |
186 | def refresh
187 | clear_caches
188 | refresh_time
189 | refresh_stats
190 | refresh_redis_properties
191 | refresh_busy_properties
192 | refresh_collections
193 | end
194 |
195 | def clear_caches
196 | @process_set = @work_set = @stats = nil
197 | end
198 |
199 | def refresh_busy_properties
200 | BUSY_PROPERTIES.each do |property|
201 | notify_observers(property)
202 | end
203 | end
204 |
205 | def refresh_time
206 | @current_time = Time.now.utc
207 | notify_observers(:current_time)
208 | end
209 |
210 | def refresh_stats
211 | Job::STATUSES.each do |status|
212 | # notify_observers is added automatically by Glimmer when data-binding
213 | # it enables manually triggering data-binding changes when needed
214 | notify_observers(status)
215 | end
216 | end
217 |
218 | def refresh_redis_properties
219 | REDIS_PROPERTIES.each do |property|
220 | # notify_observers is added automatically by Glimmer when data-binding
221 | # it enables manually triggering data-binding changes when needed
222 | redis_info.notify_observers(property)
223 | end
224 | end
225 |
226 | def refresh_collections
227 | return unless live_poll
228 |
229 | notify_observers(:retried_jobs)
230 | notify_observers(:scheduled_jobs)
231 | notify_observers(:dead_jobs)
232 | notify_observers(:processes)
233 | notify_observers(:works)
234 | end
235 | end
236 | end
237 | end
238 |
--------------------------------------------------------------------------------
/lib/kuiq/model/metrics_graph_presenter.rb:
--------------------------------------------------------------------------------
1 | require "date"
2 |
3 | require "kuiq/model/job_manager"
4 |
5 | module Kuiq
6 | module Model
7 | class MetricsGraphPresenter
8 | TIME_FORMAT = '%H:%M'
9 |
10 | attr_reader :job_manager
11 | attr_accessor :graph_width, :graph_height
12 |
13 | def initialize(job_manager, graph_width, graph_height)
14 | @job_manager = job_manager
15 | @graph_width = graph_width
16 | @graph_height = graph_height
17 | end
18 |
19 | def report_graph_lines
20 | job_manager.metrics.select(&:swatch).map(&method(:report_graph_line))
21 | end
22 |
23 | def report_graph_line(class_metric)
24 | values = class_metric.results.series["s"].inject({}) do |output, (time, value)|
25 | raw_time = DateTime.strptime(time, TIME_FORMAT).to_time
26 | output.merge(raw_time => value)
27 | end
28 | {
29 | name: class_metric.name,
30 | stroke: [*class_metric.swatch_color, thickness: 2],
31 | values: values,
32 | x_value_format: ->(raw_time) { raw_time.strftime(TIME_FORMAT) },
33 | }
34 | end
35 |
36 | def report_metrics_for_selected_job
37 | the_metrics = job_manager.metrics_for_selected_job
38 | the_metrics[:bucket_labels].zip(the_metrics[:hist_totals]).to_h
39 | end
40 |
41 | def report_metrics_3d_for_selected_job
42 | the_metrics = job_manager.metrics_for_selected_job
43 | start_x = the_metrics[:ends_at]
44 | n = -60
45 | y_values = the_metrics[:bucket_intervals][1, 10]
46 | metrics_3d = the_metrics[:job_results].hist.map do |x_value_string, z_values_raw|
47 | x_value = start_x + (n += 60)
48 | z_values = z_values_raw[-11..-2].reverse
49 | [x_value, (y_values.zip(z_values).to_h)]
50 | end.to_h
51 | all_z_values = metrics_3d.values.map(&:values).flatten
52 | max_z_value = all_z_values.max
53 | min_z_value = all_z_values.reject { |z_value| z_value == 0 }.min || 0.0
54 | z_value_range = max_z_value - min_z_value
55 | max_bubble_radius = graph_width / 160.0
56 | z_normalizer_multiplier = max_bubble_radius / z_value_range.to_f
57 | normalized_metrics_3d = metrics_3d.map do |x_value, y_z_values|
58 | normalized_y_z_values = y_z_values.map do |y_value, z_value|
59 | normalized_z_value = (z_value * z_normalizer_multiplier.to_f) + 1.5
60 | [y_value, normalized_z_value]
61 | end.to_h
62 | [x_value, normalized_y_z_values]
63 | end.to_h
64 | normalized_metrics_3d
65 | end
66 | end
67 | end
68 | end
69 |
--------------------------------------------------------------------------------
/lib/kuiq/model/paginator.rb:
--------------------------------------------------------------------------------
1 | require "sidekiq/paginator"
2 | require "singleton"
3 |
4 | module Kuiq
5 | module Model
6 | class Paginator
7 | include Sidekiq::Paginator
8 | include Singleton
9 | end
10 | end
11 | end
12 |
--------------------------------------------------------------------------------
/lib/kuiq/model/process.rb:
--------------------------------------------------------------------------------
1 | module Kuiq
2 | module Model
3 | class Process
4 | def initialize(hash)
5 | @hash = hash
6 | end
7 |
8 | def started_at
9 | Time.at(@hash["started_at"]).utc.iso8601
10 | end
11 |
12 | def rss
13 | format_memory(@hash["rss"])
14 | end
15 |
16 | def queues
17 | @hash["queues"].join(', ')
18 | end
19 |
20 | def labels
21 | @hash["labels"].join(', ')
22 | end
23 |
24 | def method_missing(attr, *args, &block)
25 | @hash[attr.to_s]
26 | end
27 |
28 | def respond_to_missing?(attr, include_private = false)
29 | # Sidekiq::Process does not provide a method for checking if an attr is supported or not,
30 | # so if a method is missing, we always delegate it to an attribute on the @hash
31 | # even if it ends up returning nil
32 | true
33 | end
34 |
35 | private
36 |
37 | def format_memory(rss_kb)
38 | return "0" if rss_kb.nil? || rss_kb == 0
39 |
40 | if rss_kb < 100_000
41 | "#{rss_kb} KB"
42 | elsif rss_kb < 10_000_000
43 | "#{rounded_number((rss_kb / 1024.0).to_i)} MB"
44 | else
45 | "#{rounded_number((rss_kb / (1024.0 * 1024.0)), precision: 1)} GB"
46 | end
47 | end
48 |
49 | def rounded_number(number, options = {})
50 | precision = options[:precision] || 0
51 | number.round(precision)
52 | end
53 | end
54 | end
55 | end
56 |
--------------------------------------------------------------------------------
/lib/kuiq/model/queue.rb:
--------------------------------------------------------------------------------
1 | module Kuiq
2 | module Model
3 | class Queue
4 | def initialize(q)
5 | @q = q
6 | end
7 |
8 | def name = "#{@q.name}#{@q.paused? ? " 🛑" : ""}"
9 |
10 | def size = @q.size
11 |
12 | def latency = rounded_number(@q.latency, precision: 1)
13 |
14 | def paused? = @q.paused?
15 |
16 | def actions = ""
17 |
18 | private
19 |
20 | def rounded_number(number, options = {})
21 | precision = options[:precision] || 0
22 | number.round(precision)
23 | end
24 | end
25 | end
26 | end
27 |
--------------------------------------------------------------------------------
/lib/kuiq/model/work.rb:
--------------------------------------------------------------------------------
1 | require 'json'
2 |
3 | module Kuiq
4 | module Model
5 | class Work
6 | attr_reader :process, :thread, :job, :payload
7 | def initialize(process, thread, hash)
8 | @process = process
9 | @thread = thread
10 | @job = hash
11 | @payload = JSON.parse(@job["payload"])
12 | end
13 |
14 | def queue
15 | job["queue"]
16 | end
17 |
18 | def started_at
19 | Time.at(job["run_at"]).utc.iso8601
20 | end
21 |
22 | def job_class
23 | payload["class"]
24 | end
25 |
26 | def method_missing(method_name, *args, &block)
27 | if payload.include?(method_name.to_s)
28 | payload[method_name.to_s]
29 | else
30 | super
31 | end
32 | end
33 |
34 | def respond_to_missing?(method_name, include_private = false)
35 | super || payload.include?(method_name.to_s)
36 | end
37 | end
38 | end
39 | end
40 |
--------------------------------------------------------------------------------
/lib/kuiq/version.rb:
--------------------------------------------------------------------------------
1 | # frozen_string_literal: true
2 |
3 | module Kuiq
4 | VERSION = "0.1.0"
5 | end
6 |
--------------------------------------------------------------------------------
/lib/kuiq/view/busy.rb:
--------------------------------------------------------------------------------
1 | require "kuiq/view/stat_row"
2 | require "kuiq/view/footer"
3 |
4 | module Kuiq
5 | module View
6 | class Busy
7 | include Glimmer::LibUI::CustomControl
8 |
9 | option :job_manager
10 |
11 | body {
12 | vertical_box {
13 | stat_row(group_title: t("Summary"), model: job_manager, attributes: Model::Job::STATUSES) {
14 | stretchy false
15 | }
16 |
17 | stat_row(group_title: t("Status"), model: job_manager, attributes: Model::JobManager::BUSY_PROPERTIES) {
18 | stretchy false
19 | }
20 |
21 | table_toolbar(job_manager: job_manager, include_filter: false) {
22 | stretchy false
23 | }
24 |
25 | group(t("Processes")) {
26 | margined false
27 |
28 | table {
29 | text_column(t("Name"))
30 | text_column(t("Started"))
31 | text_column(t("RSS"))
32 | text_column(t("Threads"))
33 | text_column(t("Busy"))
34 | text_column(t("Labels"))
35 | text_column(t("Queues"))
36 |
37 | cell_rows <= [job_manager, :processes,
38 | column_attributes: {
39 | t("Name") => :identity,
40 | t("Started") => :started_at,
41 | t("RSS") => :rss,
42 | t("Threads") => :concurrency,
43 | t("Busy") => :busy,
44 | t("Labels") => :labels,
45 | t("Queues") => :queues,
46 | }]
47 | }
48 | }
49 |
50 | horizontal_box {
51 | stretchy false
52 |
53 | # filler
54 | label
55 |
56 | label("#{t("Queue")}:") {
57 | stretchy false
58 | }
59 |
60 | combobox {
61 | stretchy false
62 |
63 | items [''] + job_manager.queues.map(&:name)
64 | selected_item <=> [job_manager, :work_queue_filter]
65 | }
66 | }
67 |
68 | group(t("Jobs")) {
69 | margined false
70 |
71 | table {
72 | text_column(t("Process"))
73 | text_column(t("Started"))
74 | text_column(t("TID"))
75 | text_column(t("JID"))
76 | text_column(t("Queue"))
77 | text_column(t("Job"))
78 | text_column(t("Arguments"))
79 |
80 | cell_rows <= [job_manager, :works,
81 | column_attributes: {
82 | t("Process") => :process,
83 | t("Started") => :started_at,
84 | t("TID") => :thread,
85 | t("JID") => :jid,
86 | t("Queue") => :queue,
87 | t("Job") => :job_class,
88 | t("Arguments") => :args,
89 | }]
90 | }
91 | }
92 |
93 | horizontal_separator {
94 | stretchy false
95 | }
96 |
97 | footer(job_manager: job_manager) {
98 | stretchy false
99 | }
100 | }
101 | }
102 | end
103 | end
104 | end
105 |
--------------------------------------------------------------------------------
/lib/kuiq/view/dashboard.rb:
--------------------------------------------------------------------------------
1 | require "kuiq/view/dashboard_graph"
2 | require "kuiq/view/stat_row"
3 | require "kuiq/view/footer"
4 |
5 | module Kuiq
6 | module View
7 | class Dashboard
8 | include Glimmer::LibUI::CustomControl
9 |
10 | option :job_manager
11 |
12 | body {
13 | vertical_box {
14 | stat_row(group_title: t("Summary"), model: job_manager, attributes: Model::Job::STATUSES) {
15 | stretchy false
16 | }
17 |
18 | group(t("Dashboard")) {
19 | margined false
20 |
21 | vertical_box {
22 | horizontal_box {
23 | stretchy false
24 |
25 | # filler
26 | label
27 | label
28 |
29 | vertical_box {
30 | horizontal_box {
31 | label("#{t("PollingInterval")}:") {
32 | stretchy false
33 | }
34 |
35 | label {
36 | text <= [job_manager, :polling_interval,
37 | on_read: ->(val) { "#{val} sec" }]
38 | }
39 | }
40 |
41 | slider(POLLING_INTERVAL_MIN, POLLING_INTERVAL_MAX) {
42 | value <=> [job_manager, :polling_interval]
43 | }
44 | }
45 | }
46 |
47 | dashboard_graph(job_manager: job_manager) {
48 | stretchy false
49 | }
50 | }
51 | }
52 |
53 | stat_row(group_title: "Redis", model: job_manager.redis_info, attributes: Model::JobManager::REDIS_PROPERTIES) {
54 | stretchy false
55 | }
56 |
57 | horizontal_separator {
58 | stretchy false
59 | }
60 |
61 | footer(job_manager: job_manager) {
62 | stretchy false
63 | }
64 | }
65 | }
66 | end
67 | end
68 | end
69 |
--------------------------------------------------------------------------------
/lib/kuiq/view/dashboard_graph.rb:
--------------------------------------------------------------------------------
1 | require "glimmer/view/line_graph"
2 |
3 | require "kuiq"
4 | require "kuiq/model/dashboard_graph_presenter"
5 |
6 | module Kuiq
7 | module View
8 | class DashboardGraph
9 | include Glimmer::LibUI::CustomControl
10 |
11 | option :job_manager
12 |
13 | attr_reader :presenter
14 |
15 | before_body do
16 | @presenter = Model::DashboardGraphPresenter.new(job_manager, graph_width, graph_height)
17 | @points = {}
18 | @multi_day_points = {}
19 | @multi_day_selection_point = {}
20 | end
21 |
22 | after_body do
23 | body_root.window_proxy.content {
24 | on_content_size_changed do
25 | @live_poll_line_graph.width = @presenter.graph_width = graph_width
26 | @live_poll_line_graph.height = @presenter.graph_height = graph_height
27 |
28 | @history_line_graphs.values.each do |history_line_graph|
29 | history_line_graph.width = @presenter.graph_width
30 | history_line_graph.height = @presenter.graph_height
31 | end
32 | end
33 | }
34 | polling_interval = job_manager.polling_interval
35 | time_remaining = job_manager.polling_interval
36 | timer_interval = 1 # 1 second
37 | Glimmer::LibUI.timer(timer_interval) do
38 | if polling_interval != job_manager.polling_interval
39 | if job_manager.polling_interval < polling_interval
40 | time_remaining = job_manager.polling_interval
41 | else
42 | time_remaining += job_manager.polling_interval - polling_interval
43 | end
44 | polling_interval = job_manager.polling_interval
45 | end
46 | time_remaining -= timer_interval
47 | if time_remaining == 0
48 | presenter.record_stats
49 | job_manager.refresh
50 | @live_poll_line_graph.lines = report_graph_lines
51 | time_remaining = job_manager.polling_interval
52 | end
53 | end
54 | end
55 |
56 | body {
57 | tab {
58 | tab_item(t("LivePoll")) {
59 | @live_poll_line_graph = line_graph(
60 | width: @presenter.graph_width,
61 | height: @presenter.graph_height,
62 | lines: report_graph_lines,
63 | display_attributes_on_hover: true,
64 | graph_point_radius: 3,
65 | graph_selected_point_radius: 4,
66 | graph_fill_selected_point: :line_stroke,
67 | )
68 | }
69 |
70 | tab_item(t('OneWeek')) {
71 | history_line_graph(day_count: 7)
72 | }
73 |
74 | tab_item(t('OneMonth')) {
75 | history_line_graph(day_count: 30)
76 | }
77 |
78 | tab_item(t('ThreeMonths')) {
79 | history_line_graph(day_count: 90)
80 | }
81 |
82 | tab_item(t('SixMonths')) {
83 | history_line_graph(day_count: 180)
84 | }
85 |
86 | }
87 | }
88 |
89 | private
90 |
91 | def graph_width
92 | current_window_width = body_root&.window_proxy&.content_size&.first || WINDOW_WIDTH
93 | current_window_width - 24
94 | end
95 |
96 | def graph_height
97 | current_window_height = body_root&.window_proxy&.content_size&.last || WINDOW_HEIGHT
98 | current_window_height - 395
99 | end
100 |
101 | def report_graph_lines
102 | Model::DashboardGraphPresenter::JOB_STATUSES.map do |job_status|
103 | {
104 | name: t(job_status.capitalize),
105 | stroke: [*GRAPH_DASHBOARD_COLORS[job_status], thickness: 2],
106 | }.merge(presenter.report_stats(job_status))
107 | end
108 | end
109 |
110 | def history_line_graph(day_count: 30)
111 | @history_line_graphs ||= {}
112 | @history_line_graphs[day_count] = line_graph(
113 | width: @presenter.graph_width,
114 | height: @presenter.graph_height,
115 | lines: report_history_graph_lines(day_count: day_count),
116 | display_attributes_on_hover: true,
117 | graph_point_distance: :width_divided_by_point_count,
118 | graph_point_radius: 3,
119 | graph_selected_point_radius: 4,
120 | graph_fill_selected_point: :line_stroke,
121 | )
122 | end
123 |
124 | def report_history_graph_lines(day_count:)
125 | Model::DashboardGraphPresenter::JOB_STATUSES.map do |job_status|
126 | {
127 | name: t(job_status.capitalize),
128 | stroke: [*GRAPH_DASHBOARD_COLORS[job_status], thickness: 2],
129 | }.merge(presenter.report_history_stats(job_status, day_count))
130 | end
131 | end
132 |
133 | end
134 | end
135 | end
136 |
--------------------------------------------------------------------------------
/lib/kuiq/view/footer.rb:
--------------------------------------------------------------------------------
1 | module Kuiq
2 | module View
3 | class Footer
4 | include Glimmer::LibUI::CustomControl
5 |
6 | option :job_manager
7 |
8 | body {
9 | horizontal_box {
10 | label("Sidekiq v#{Sidekiq::VERSION}") {
11 | stretchy false
12 | }
13 | label(job_manager.redis_url) {
14 | stretchy false
15 | }
16 | label {
17 | stretchy false
18 |
19 | text <= [job_manager, :current_time, on_read: ->(val) { val.strftime("%T UTC") }]
20 | }
21 | label(I18n.current_locale) {
22 | stretchy false
23 | }
24 | }
25 | }
26 | end
27 | end
28 | end
29 |
--------------------------------------------------------------------------------
/lib/kuiq/view/gui_application.rb:
--------------------------------------------------------------------------------
1 | require "kuiq"
2 | require "kuiq/i18n"
3 | require "kuiq/ext/kernel"
4 | require "kuiq/model/job_manager"
5 | require "kuiq/view/dashboard"
6 | require "kuiq/view/busy"
7 | require "kuiq/view/retries"
8 | require "kuiq/view/scheduled"
9 | require "kuiq/view/morgue"
10 | require "kuiq/view/queues"
11 | require "kuiq/view/metrics"
12 |
13 | module Kuiq
14 | class GUIApplication
15 | include Glimmer::LibUI::Application
16 |
17 | before_body do
18 | @job_manager = Model::JobManager.new
19 | end
20 |
21 | body {
22 | window("Kuiq - Sidekiq UI", WINDOW_WIDTH, WINDOW_HEIGHT) {
23 | vertical_box {
24 | tab {
25 | tab_item(t("Dashboard")) {
26 | dashboard(job_manager: @job_manager)
27 | }
28 | tab_item("Busy") {
29 | busy(job_manager: @job_manager)
30 | }
31 | tab_item("Queues") {
32 | queues(job_manager: @job_manager)
33 | }
34 | tab_item(t("Retries")) {
35 | retries(job_manager: @job_manager)
36 | }
37 | tab_item(t("Scheduled")) {
38 | scheduled(job_manager: @job_manager)
39 | }
40 | tab_item(t("Dead")) {
41 | morgue(job_manager: @job_manager)
42 | }
43 | tab_item("Metrics") {
44 | metrics(job_manager: @job_manager)
45 | }
46 | }
47 | }
48 | }
49 | }
50 | end
51 | end
52 |
--------------------------------------------------------------------------------
/lib/kuiq/view/metrics.rb:
--------------------------------------------------------------------------------
1 | require "glimmer/view/line_graph"
2 | require "glimmer/view/bar_chart"
3 | require "glimmer/view/bubble_chart"
4 |
5 | require "kuiq/model/metrics_graph_presenter"
6 |
7 | require "kuiq/view/stat_row"
8 | require "kuiq/view/footer"
9 |
10 | module Kuiq
11 | module View
12 | class Metrics
13 | include Glimmer::LibUI::CustomControl
14 |
15 | option :job_manager
16 |
17 | before_body do
18 | @presenter = Model::MetricsGraphPresenter.new(job_manager, graph_width, graph_height)
19 | end
20 |
21 | after_body do
22 | body_root.window_proxy.content {
23 | on_content_size_changed do
24 | new_width = @metrics_line_graph.width = @presenter.graph_width = graph_width
25 | new_height = @metrics_line_graph.height = @presenter.graph_height = graph_height
26 | @metrics_for_job_bar_chart.width = new_width
27 | @metrics_for_job_bar_chart.height = new_height
28 | @metrics_for_job_bubble_chart.width = new_width
29 | @metrics_for_job_bubble_chart.height = new_height
30 | @metrics_for_job_bubble_chart.values = @metrics_for_job_bubble_chart.values = @presenter.report_metrics_3d_for_selected_job
31 | end
32 | }
33 |
34 | job_manager.metrics.each do |class_metric|
35 | observe(class_metric, 'swatch_name_color[0]') do
36 | @metrics_line_graph.lines = @presenter.report_graph_lines
37 | end
38 | end
39 |
40 | observe(job_manager, :selected_job_for_metrics) do
41 | @metrics_for_job_bar_chart.values = @presenter.report_metrics_for_selected_job
42 | @metrics_for_job_bubble_chart.values = @presenter.report_metrics_3d_for_selected_job
43 | end
44 | end
45 |
46 | body {
47 | vertical_box {
48 | stat_row(group_title: t("Summary"), model: job_manager, attributes: Model::Job::STATUSES) {
49 | stretchy false
50 | }
51 |
52 | group(t("Metrics")) {
53 | margined false
54 |
55 | tab {
56 | tab_item('All Workers') {
57 | vertical_box {
58 | @metrics_line_graph = line_graph(
59 | width: @presenter.graph_width,
60 | height: @presenter.graph_height,
61 | lines: @presenter.report_graph_lines,
62 | graph_point_radius: 3,
63 | graph_selected_point_radius: 4,
64 | graph_fill_selected_point: :line_stroke,
65 | )
66 |
67 | table {
68 | checkbox_text_color_column(t("Name")) {
69 | editable_checkbox true
70 | }
71 | text_column(t("Success"))
72 | text_column(t("Failure"))
73 | text_column(t("TotalExecutionTime"))
74 | text_column(t("AvgExecutionTime"))
75 |
76 | cell_rows <= [job_manager, :metrics,
77 | column_attributes: {
78 | t("Name") => :swatch_name_color,
79 | t("Success") => :success,
80 | t("Failure") => :failure,
81 | t("TotalExecutionTime") => :tet,
82 | t("AvgExecutionTime") => :aet,
83 | }]
84 | }
85 | }
86 | }
87 |
88 | tab_item('Specific Worker') {
89 | vertical_box {
90 | horizontal_box {
91 | stretchy false
92 |
93 | combobox {
94 | stretchy false
95 |
96 | items <= [job_manager, :metric_jobs, computed_by: :metrics]
97 | selected_item <=> [job_manager, :selected_job_for_metrics]
98 | }
99 | }
100 |
101 | @metrics_for_job_bar_chart = bar_chart(
102 | width: @presenter.graph_width,
103 | height: @presenter.graph_height,
104 | x_axis_label: "Execution Time",
105 | y_axis_label: "Jobs",
106 | chart_color_bar: [92, 122, 190],
107 | values: @presenter.report_metrics_for_selected_job,
108 | )
109 |
110 | @metrics_for_job_bubble_chart = bubble_chart(
111 | width: @presenter.graph_width,
112 | height: @presenter.graph_height,
113 | chart_color_bubble: [92, 122, 190],
114 | values: @presenter.report_metrics_3d_for_selected_job,
115 | )
116 | }
117 | }
118 | }
119 | }
120 |
121 | horizontal_separator {
122 | stretchy false
123 | }
124 |
125 | footer(job_manager: job_manager) {
126 | stretchy false
127 | }
128 | }
129 | }
130 |
131 | def graph_width
132 | current_window_width = body_root&.window_proxy&.content_size&.first || WINDOW_WIDTH
133 | current_window_width - 24
134 | end
135 |
136 | def graph_height
137 | current_window_height = body_root&.window_proxy&.content_size&.last || WINDOW_HEIGHT
138 | (current_window_height - 220)/2.0 - 5
139 | end
140 |
141 | end
142 | end
143 | end
144 |
--------------------------------------------------------------------------------
/lib/kuiq/view/morgue.rb:
--------------------------------------------------------------------------------
1 | require "kuiq/view/stat_row"
2 | require "kuiq/view/table_toolbar"
3 | require "kuiq/view/footer"
4 |
5 | module Kuiq
6 | module View
7 | class Morgue
8 | include Glimmer::LibUI::CustomControl
9 |
10 | option :job_manager
11 |
12 | body {
13 | vertical_box {
14 | stat_row(group_title: t("Summary"), model: job_manager, attributes: Model::Job::STATUSES) {
15 | stretchy false
16 | }
17 |
18 | table_toolbar(job_manager: job_manager, filter_name: "dead") {
19 | stretchy false
20 | }
21 |
22 | table {
23 | text_column(t("LastRetry"))
24 | text_column(t("Queue"))
25 | text_column(t("Job"))
26 | text_column(t("Arguments"))
27 | text_column(t("Error"))
28 |
29 | cell_rows <= [job_manager, :dead_jobs,
30 | column_attributes: {
31 | t("LastRetry") => :last_retry,
32 | t("Queue") => :queue,
33 | t("Job") => :job,
34 | t("Arguments") => :arguments,
35 | t("Error") => :error
36 | }]
37 | }
38 |
39 | horizontal_separator {
40 | stretchy false
41 | }
42 |
43 | footer(job_manager: job_manager) {
44 | stretchy false
45 | }
46 | }
47 | }
48 | end
49 | end
50 | end
51 |
--------------------------------------------------------------------------------
/lib/kuiq/view/queues.rb:
--------------------------------------------------------------------------------
1 | require "kuiq/view/stat_row"
2 | require "kuiq/view/footer"
3 |
4 | module Kuiq
5 | module View
6 | class Queues
7 | include Glimmer::LibUI::CustomControl
8 |
9 | option :job_manager
10 |
11 | body {
12 | vertical_box {
13 | stat_row(group_title: t("Summary"), model: job_manager, attributes: Model::Job::STATUSES) {
14 | stretchy false
15 | }
16 |
17 | group(t("Queues")) {
18 | margined false
19 |
20 | table {
21 | text_column(t("Name"))
22 | text_column(t("Size"))
23 | text_column(t("Latency"))
24 | text_column(t("Actions"))
25 |
26 | cell_rows <= [job_manager, :queues,
27 | column_attributes: {
28 | t("Name") => :name,
29 | t("Size") => :size,
30 | t("Latency") => :latency,
31 | t("Actions") => :actions
32 | }]
33 | }
34 | }
35 |
36 | horizontal_separator {
37 | stretchy false
38 | }
39 |
40 | footer(job_manager: job_manager) {
41 | stretchy false
42 | }
43 | }
44 | }
45 | end
46 | end
47 | end
48 |
--------------------------------------------------------------------------------
/lib/kuiq/view/retries.rb:
--------------------------------------------------------------------------------
1 | require "kuiq/view/stat_row"
2 | require "kuiq/view/table_toolbar"
3 | require "kuiq/view/footer"
4 |
5 | module Kuiq
6 | module View
7 | class Retries
8 | include Glimmer::LibUI::CustomControl
9 |
10 | option :job_manager
11 |
12 | body {
13 | vertical_box {
14 | stat_row(group_title: t("Summary"), model: job_manager, attributes: Model::Job::STATUSES) {
15 | stretchy false
16 | }
17 |
18 | table_toolbar(job_manager: job_manager, filter_name: "retry") {
19 | stretchy false
20 | }
21 |
22 | table {
23 | text_column(t("NextRetry"))
24 | text_column(t("RetryCount"))
25 | text_column(t("Queue"))
26 | text_column(t("Job"))
27 | text_column(t("Arguments"))
28 | text_column(t("Error"))
29 |
30 | cell_rows <= [job_manager, :retried_jobs,
31 | column_attributes: {
32 | t("NextRetry") => :next_retry,
33 | t("RetryCount") => :retry_count,
34 | t("Queue") => :queue,
35 | t("Job") => :job,
36 | t("Arguments") => :arguments,
37 | t("Error") => :error
38 | }]
39 | }
40 |
41 | horizontal_separator {
42 | stretchy false
43 | }
44 |
45 | footer(job_manager: job_manager) {
46 | stretchy false
47 | }
48 | }
49 | }
50 | end
51 | end
52 | end
53 |
--------------------------------------------------------------------------------
/lib/kuiq/view/scheduled.rb:
--------------------------------------------------------------------------------
1 | require "kuiq/view/stat_row"
2 | require "kuiq/view/table_toolbar"
3 | require "kuiq/view/footer"
4 |
5 | module Kuiq
6 | module View
7 | class Scheduled
8 | include Glimmer::LibUI::CustomControl
9 |
10 | option :job_manager
11 |
12 | body {
13 | vertical_box {
14 | stat_row(group_title: t("Summary"), model: job_manager, attributes: Model::Job::STATUSES) {
15 | stretchy false
16 | }
17 |
18 | table_toolbar(job_manager: job_manager, filter_name: "schedule") {
19 | stretchy false
20 | }
21 |
22 | table {
23 | text_column(t("When"))
24 | text_column(t("Queue"))
25 | text_column(t("Job"))
26 | text_column(t("Arguments"))
27 |
28 | cell_rows <= [job_manager, :scheduled_jobs,
29 | column_attributes: {
30 | t("When") => :when,
31 | t("Queue") => :queue,
32 | t("Job") => :job,
33 | t("Arguments") => :arguments
34 | }]
35 | }
36 |
37 | horizontal_separator {
38 | stretchy false
39 | }
40 |
41 | footer(job_manager: job_manager) {
42 | stretchy false
43 | }
44 | }
45 | }
46 | end
47 | end
48 | end
49 |
--------------------------------------------------------------------------------
/lib/kuiq/view/stat.rb:
--------------------------------------------------------------------------------
1 | module Kuiq
2 | module View
3 | class Stat
4 | include Glimmer::LibUI::CustomControl
5 |
6 | ATTRIBUTE_CUSTOM_TEXT = {
7 | "redis_version" => "Version",
8 | "uptime_in_days" => "Uptime",
9 | "connected_clients" => "Connections",
10 | "used_memory_human" => "MemoryUsage",
11 | "used_memory_peak_human" => "PeakMemoryUsage"
12 | }
13 |
14 | option :model
15 | option :attribute
16 |
17 | before_body do
18 | @attribute_text = ATTRIBUTE_CUSTOM_TEXT[attribute.to_s] || humanize(attribute)
19 | end
20 |
21 | body {
22 | vertical_box {
23 | label(t(@attribute_text))
24 |
25 | label {
26 | text <= [model, attribute, on_read: :to_s]
27 | }
28 | }
29 | }
30 |
31 | def humanize(attribute)
32 | attribute.to_s.split("_").map(&:capitalize).join(" ")
33 | end
34 | end
35 | end
36 | end
37 |
--------------------------------------------------------------------------------
/lib/kuiq/view/stat_row.rb:
--------------------------------------------------------------------------------
1 | require "kuiq/view/stat"
2 |
3 | module Kuiq
4 | module View
5 | class StatRow
6 | include Glimmer::LibUI::CustomControl
7 |
8 | option :group_title
9 | option :model
10 | option :attributes
11 |
12 | body {
13 | group(group_title) {
14 | margined false
15 |
16 | horizontal_box {
17 | attributes.each do |attribute|
18 | stat(model: model, attribute: attribute)
19 | end
20 | }
21 | }
22 | }
23 | end
24 | end
25 | end
26 |
--------------------------------------------------------------------------------
/lib/kuiq/view/table_toolbar.rb:
--------------------------------------------------------------------------------
1 | module Kuiq
2 | module View
3 | class TableToolbar
4 | include Glimmer::LibUI::CustomControl
5 |
6 | option :job_manager
7 | option :include_filter, default: true
8 | option :filter_name
9 |
10 | body {
11 | horizontal_box {
12 | checkbox(t('LivePoll')) {
13 | stretchy false
14 |
15 | checked <=> [job_manager, :live_poll]
16 | }
17 |
18 | # filler
19 | label
20 |
21 | if include_filter
22 | label("#{t('Filter')}:") {
23 | stretchy false
24 | }
25 |
26 | entry {
27 | stretchy false
28 |
29 | text <=> [job_manager, "#{filter_name}_filter"]
30 | }
31 | end
32 | }
33 | }
34 |
35 | end
36 | end
37 | end
38 |
--------------------------------------------------------------------------------
/locales/ar.yml:
--------------------------------------------------------------------------------
1 | # elements like %{queue} are variables and should not be translated
2 | ar:
3 | Actions: إجراءات
4 | AddToQueue: إضافة إلى الرتل
5 | AreYouSure: هل انت متأكد؟
6 | AreYouSureDeleteJob: هل أنت متأكد من حذف الوظيفة؟
7 | AreYouSureDeleteQueue: هل أنت متأكد من حذف الرتل %{queue}؟
8 | Arguments: مدخلات
9 | BackToApp: العودة إلى التطبيق
10 | Busy: مشغول
11 | Class: نوع
12 | Connections: اتصالات
13 | CreatedAt: أنشئت في
14 | CurrentMessagesInQueue: الرسائل الحالية في الرتل %{queue}
15 | Dashboard: لوحة التحكم
16 | Dead: ميتة
17 | DeadJobs: وظائف ميتة
18 | Delete: حذف
19 | DeleteAll: حذف الكل
20 | Enqueued: في الرتل
21 | Error: خطأ
22 | ErrorBacktrace: تتبع الخطأ
23 | ErrorClass: نوع الخطأ
24 | ErrorMessage: رسالة الخطأ
25 | Extras: إضافات
26 | Failed: فشل
27 | Failures: فشل
28 | GoBack: إلى الخلف
29 | History: تاريخ
30 | Job: وظيفة
31 | Jobs: وظائف
32 | Kill: إبطال
33 | KillAll: إبطال الكل
34 | LastRetry: إعادة المحاولة الأخيرة
35 | Latency: زمن الانتظار
36 | LivePoll: استعلام مباشر
37 | MemoryUsage: استخدام الذاكرة
38 | Name: الاسم
39 | Namespace: مساحة الاسم
40 | NextRetry: إعادة المحاولة القادمة
41 | NoDeadJobsFound: لاتوجد وظائف ميتة
42 | NoRetriesFound: لاتوجد أي إعادة محاولة
43 | NoScheduledFound: لايوجد وظائف مجدولة
44 | NotYetEnqueued: لم تدخل الرتل بعد
45 | OneMonth: شهر
46 | OneWeek: أسبوع
47 | OriginallyFailed: فشل أصلا
48 | Pause: إيقاف مؤقت
49 | Paused: موقفة مؤقتاً
50 | PeakMemoryUsage: ذروة استخدام الذاكرة
51 | Plugins: الإضافات
52 | PollingInterval: الفاصل الزمني بين الاستعلامات
53 | Process: عملية
54 | Processed: تمت المعالجة
55 | Processes: عمليات
56 | Queue: رتل
57 | Queues: أرتال
58 | Quiet: هدوء
59 | QuietAll: هدوء الكل
60 | Realtime: الزمن الفعلي
61 | Retries: إعادة محاولة
62 | RetryAll: إعادة المحاولة للكل
63 | RetryCount: عدد مرات إعادة المحاولة
64 | RetryNow: إعادة المحاولة الآن
65 | Scheduled: مجدول
66 | ScheduledJobs: وظائف مجدولة
67 | ShowAll: عرض الكل
68 | SixMonths: ستة أشهر
69 | Size: حجم
70 | Started: بدأت
71 | Status: حالة
72 | Stop: إيقاف
73 | StopAll: إيقاف الكل
74 | StopPolling: إيقاف الاستعلامات
75 | TextDirection: 'rtl'
76 | Thread: نيسب
77 | Threads: نياسب
78 | ThreeMonths: ثلاثة أشهر
79 | Time: وقت
80 | Unpause: متابعة
81 | Uptime: زمن العمل
82 | Utilization: الاستخدام
83 | Version: إصدار
84 | When: متى
85 | Worker: عامل
86 | active: نشيط
87 | idle: خامل
88 |
--------------------------------------------------------------------------------
/locales/cs.yml:
--------------------------------------------------------------------------------
1 | # elements like %{queue} are variables and should not be translated
2 | cs:
3 | Actions: Akce
4 | AddToQueue: Přidat do fronty
5 | AreYouSure: Jste si jisti?
6 | AreYouSureDeleteJob: Jste si jisti, že chcete odstranit tento úkol?
7 | AreYouSureDeleteQueue: Jste si jisti, že chcete odstranit frontu %{queue}?
8 | Arguments: Argumenty
9 | Busy: Zaneprázdněné
10 | Class: Třída
11 | Connections: Připojení
12 | CreatedAt: Vytvořeno
13 | CurrentMessagesInQueue: Aktuální úkoly ve frontě %{queue}
14 | Dashboard: Kontrolní panel
15 | Dead: Mrtvé
16 | DeadJobs: Mrtvé úkoly
17 | Delete: Odstranit
18 | DeleteAll: Odstranit vše
19 | Enqueued: Zařazené
20 | Error: Chyba
21 | ErrorBacktrace: Chybový výstup
22 | ErrorClass: Třída chyby
23 | ErrorMessage: Chybová zpráva
24 | Extras: Doplňky
25 | Failed: Nezdařené
26 | Failures: Selhání
27 | GoBack: ← Zpět
28 | History: Historie
29 | Job: Úkol
30 | Jobs: Úkoly
31 | Kill: Zabít
32 | LastRetry: Poslední opakování
33 | LivePoll: Průběžně aktualizovat
34 | MemoryUsage: Využití paměti
35 | Namespace: Jmenný prostor
36 | NextRetry: Další opakování
37 | NoDeadJobsFound: Nebyly nalezeny žádné mrtvé úkoly
38 | NoRetriesFound: Nebyla nalezena žádná opakování
39 | NoScheduledFound: Nebyly nalezeny žádné naplánované úkoly
40 | NotYetEnqueued: Ještě nezařazeno
41 | OneMonth: 1 měsíc
42 | OneWeek: 1 týden
43 | OriginallyFailed: Původně se nezdařilo
44 | Paused: Pozastavené
45 | PeakMemoryUsage: Nejvyšší využití paměti
46 | Plugins: Doplňky
47 | PollingInterval: Interval obnovení
48 | Processed: Zpracované
49 | Processes: Procesy
50 | Queue: Fronta
51 | Queues: Fronty
52 | Quiet: Ztišit
53 | QuietAll: Ztišit vše
54 | Realtime: V reálném čase
55 | Retries: Opakování
56 | RetryAll: Opakovat vše
57 | RetryCount: Počet opakování
58 | RetryNow: Opakovat teď
59 | Scheduled: Naplánované
60 | ScheduledJobs: Naplánované úkoly
61 | ShowAll: Ukázat všechny
62 | SixMonths: 6 měsíců
63 | Size: Velikost
64 | Started: Začal
65 | Status: Stav
66 | Stop: Zastavit
67 | StopAll: Zastavit vše
68 | StopPolling: Zastavit průběžnou aktualizaci
69 | Thread: Vlákno
70 | Threads: Vlákna
71 | ThreeMonths: 3 měsíce
72 | Time: Čas
73 | Uptime: Uptime (dny)
74 | Version: Verze
75 | When: Kdy
76 | Worker: Worker
77 | active: aktivní
78 | idle: nečinný
79 |
--------------------------------------------------------------------------------
/locales/da.yml:
--------------------------------------------------------------------------------
1 | # elements like %{queue} are variables and should not be translated
2 | da:
3 | Actions: Handlinger
4 | AddToQueue: Tilføj til kø
5 | AreYouSure: Er du sikker?
6 | AreYouSureDeleteJob: Er du sikker på at du vil slette dette job?
7 | AreYouSureDeleteQueue: Er du sikker på at du vil slette %{queue} køen?
8 | Arguments: Argumenter
9 | AvgExecutionTime: Gennemsnitlig eksekveringstid
10 | Busy: Travl
11 | Class: Klasse
12 | Connections: Forbindelser
13 | CurrentMessagesInQueue: Nuværende beskeder i %{queue}
14 | Dashboard: Instrumentbræt
15 | Dead: Død
16 | DeadJobs: Døde jobs
17 | Delete: Slet
18 | DeleteAll: Slet alle
19 | Enqueued: I kø
20 | Error: Fejl
21 | ErrorBacktrace: Fejl backtrace
22 | ErrorClass: Fejlklasse
23 | ErrorMessage: Fejlbesked
24 | Extras: Ekstra
25 | Failed: Fejlet
26 | Failure: Fejl
27 | Failures: Fejl
28 | GoBack: ← Tilbage
29 | History: Historik
30 | Job: Job
31 | Jobs: Jobs
32 | Latency: Forsinkelse
33 | LastRetry: Sidste forsøg
34 | LivePoll: Live Poll
35 | MemoryUsage: RAM forbrug
36 | Name: Navn
37 | Namespace: Namespace
38 | NextRetry: Næste forsøg
39 | NoDeadJobsFound: Ingen døde jobs fundet
40 | NoJobMetricsFound: Ingen nylig job-metrics blev fundet
41 | NoRetriesFound: Ingen gen-forsøg var fundet
42 | NoScheduledFound: Ingen jobs i kø fundet
43 | OneMonth: 1 måned
44 | OneWeek: 1 uge
45 | OriginallyFailed: Oprindeligt fejlet
46 | PeakMemoryUsage: Peak RAM forbrug
47 | Processed: Processeret
48 | Processes: Processer
49 | Queue: Kø
50 | Queues: Køer
51 | Realtime: Realtid
52 | Retries: Forsøg
53 | RetryAll: Forsøg alle
54 | RetryCount: Antal forsøg
55 | RetryNow: Prøv igen nu
56 | Scheduled: Planlagt
57 | ScheduledJobs: Jobs i kø
58 | ShowAll: Vis alle
59 | SixMonths: 6 måneder
60 | Size: Størrelse
61 | Started: Startet
62 | Status: Status
63 | StopPolling: Stop Polling
64 | Success: Succes
65 | Thread: Tråd
66 | Threads: Tråde
67 | ThreeMonths: 3 måneder
68 | Time: Tid
69 | TotalExecutionTime: Total eksekveringstid
70 | Uptime: Oppetid (dage)
71 | Version: Version
72 | When: Når
73 | Worker: Arbejder
74 | active: aktiv
75 | idle: idle
76 |
--------------------------------------------------------------------------------
/locales/de.yml:
--------------------------------------------------------------------------------
1 | # elements like %{queue} are variables and should not be translated
2 | de:
3 | Actions: Aktionen
4 | AddToQueue: In Warteschlange einreihen
5 | AreYouSure: Bist du sicher?
6 | AreYouSureDeleteJob: Möchtest du diesen Job wirklich löschen?
7 | AreYouSureDeleteQueue: Möchtest du %{queue} wirklich löschen?
8 | Arguments: Argumente
9 | BackToApp: Zurück zur Anwendung
10 | Busy: Beschäftigt
11 | Class: Klasse
12 | Connections: Verbindungen
13 | CreatedAt: Erstellt
14 | CurrentMessagesInQueue: Aktuelle Nachrichten in %{queue}
15 | Dashboard: Dashboard
16 | Dead: Tot
17 | DeadJobs: Gestorbene Jobs
18 | Delete: Löschen
19 | DeleteAll: Alle löschen
20 | Enqueued: In der Warteschlange
21 | Error: Fehler
22 | ErrorBacktrace: Fehlerbericht
23 | ErrorClass: Fehlerklasse
24 | ErrorMessage: Fehlernachricht
25 | Extras: Extras
26 | Failed: Fehlgeschlagen
27 | Failures: Ausfälle
28 | GoBack: ← Zurück
29 | History: Verlauf
30 | Job: Job
31 | Jobs: Jobs
32 | Kill: Vernichten
33 | KillAll: Alle vernichten
34 | LastRetry: Letzter Versuch
35 | Latency: Latenz
36 | LivePoll: Echtzeitabfrage
37 | MemoryUsage: RAM-Nutzung
38 | Namespace: Namensraum
39 | NextRetry: Nächster Versuch
40 | NoDeadJobsFound: Keine toten Jobs gefunden
41 | NoRetriesFound: Keine erneuten Versuche gefunden
42 | NoScheduledFound: Keine geplanten Jobs gefunden
43 | NotYetEnqueued: Noch nicht in der Warteschlange
44 | OneMonth: 1 Monat
45 | OneWeek: 1 Woche
46 | OriginallyFailed: Ursprünglich fehlgeschlagen
47 | Paused: Pausiert
48 | PeakMemoryUsage: Maximale RAM-Nutzung
49 | Plugins: Erweiterungen
50 | PollingInterval: Abfrageintervall
51 | Processed: Verarbeitet
52 | Processes: Prozesse
53 | Queue: Warteschlange
54 | Queues: Warteschlangen
55 | Quiet: Leise
56 | QuietAll: Alle leise
57 | Realtime: Echtzeit
58 | Retries: Versuche
59 | RetryAll: Alle erneut versuchen
60 | RetryCount: Anzahl der Versuche
61 | RetryNow: Jetzt erneut versuchen
62 | Scheduled: Geplant
63 | ScheduledJobs: Jobs in der Warteschlange
64 | ShowAll: Alle anzeigen
65 | SixMonths: 6 Monate
66 | Size: Größe
67 | Started: Gestartet
68 | Status: Status
69 | Stop: Stopp
70 | StopAll: Alle stoppen
71 | StopPolling: Abfrage stoppen
72 | Thread: Thread
73 | Threads: Threads
74 | ThreeMonths: 3 Monate
75 | Time: Zeit
76 | Uptime: Laufzeit
77 | Version: Version
78 | When: Wann
79 | Worker: Arbeiter
80 | active: aktiv
81 | idle: untätig
82 |
--------------------------------------------------------------------------------
/locales/el.yml:
--------------------------------------------------------------------------------
1 | # elements like %{queue} are variables and should not be translated
2 | el: # <---- change this to your locale code
3 | Dashboard: Πίνακας Ελέγχου
4 | Status: Κατάσταση
5 | Time: Χρόνος
6 | Namespace: Namespace
7 | Realtime: Τρέχουσα Κατάσταση
8 | History: Ιστορικό
9 | Busy: Υπό επεξεργασία
10 | Utilization: Σε χρήση
11 | Processed: Επεξεργάστηκαν
12 | Failed: Απέτυχαν
13 | Scheduled: Προγραμματισμένα
14 | Retries: Επαναλήψεις
15 | Enqueued: Μπήκαν στην στοίβα
16 | Worker: Εργάτης
17 | LivePoll: Τρέχουσα Κατάσταση
18 | StopPolling: Διακοπή Τρέχουσας Κατάστασης
19 | Queue: Στοίβα
20 | Class: Κλάση
21 | Job: Εργασία
22 | Arguments: Ορίσματα
23 | Extras: Extras
24 | Started: Ξεκίνησε
25 | ShowAll: Εμφάνιση Όλων
26 | Enqueued: Μπήκαν στην στοίβα
27 | AddToQueue: Προσθήκη στην στοίβα
28 | AreYouSureDeleteJob: Θέλετε να διαγράψετε αυτή την εργασία;
29 | AreYouSureDeleteQueue: Θέλετε να διαγράψετε την στοίβα %{queue}; Αυτό θα διαγράψει όλες τις εργασίες εντός της στοίβας, θα εμφανιστεί ξανά εάν προωθήσετε περισσότερες εργασίες σε αυτήν στο μέλλον.
30 | Queues: Στοίβες
31 | Size: Μέγεθος
32 | Actions: Ενέργειες
33 | NextRetry: Επόμενη Προσπάθεια
34 | RetryCount: Αριθμός Προσπαθειών
35 | RetryNow: Επανάληψη Τώρα
36 | # Kill: Kill
37 | LastRetry: Τελευταία Προσπάθεια
38 | OriginallyFailed: Αρχικές Αποτυχίες
39 | AreYouSure: Είστε σίγουρος;
40 | DeleteAll: Διαγραφή Όλων
41 | RetryAll: Επανάληψη Όλων
42 | # KillAll: Kill All
43 | NoRetriesFound: Δεν βρέθηκαν εργασίες προς επαναλήψη
44 | ErrorBacktrace: Backtrace Σφάλματος
45 | GoBack: ← Πίσω
46 | NoScheduledFound: Δεν βρέθηκαν προγραμματισμένες εργασίες
47 | When: Πότε
48 | ScheduledJobs: Προγραμματισμένες Εργασίες
49 | idle: αδρανές
50 | active: ενεργό
51 | Version: Έκδοση
52 | Connections: Συνδέσεις
53 | MemoryUsage: Χρήση Μνήμης
54 | PeakMemoryUsage: Μέγιστη Χρήση Μνήμης
55 | Uptime: Ημέρες Λειτουργίας
56 | OneWeek: 1 εβδομάδα
57 | OneMonth: 1 μήνας
58 | ThreeMonths: 3 μήνες
59 | SixMonths: 6 μήνες
60 | Failures: Αποτυχίες
61 | DeadJobs: Αδρανείς Εργασίες
62 | NoDeadJobsFound: Δεν βρέθηκαν αδρανείς εργασίες
63 | Dead: Αδρανείς
64 | Process: Διεργασία
65 | Processes: Διεργασίες
66 | Name: Όνομα
67 | Thread: Νήμα
68 | Threads: Νήματα
69 | Jobs: Εργασίες
70 | Paused: Σε παύση
71 | Stop: Διακοπή
72 | Quiet: Σίγαση
73 | StopAll: Διακοπή Όλων
74 | QuietAll: Σίγαση Όλων
75 | PollingInterval: Συχνότητα Ανανέωσης
76 | Plugins: Πρόσθετα
77 | NotYetEnqueued: Δεν προστέθηκε στην στοίβα ακόμη
78 | CreatedAt: Δημιουργήθηκε στις
79 | BackToApp: Πίσω στην Εφαρμογή
80 | Latency: Καθυστέρηση
81 | Pause: Παύση
82 | Unpause: Κατάργηση Παύσης
83 | Metrics: Μετρήσεις
84 | NoDataFound: Δεν βρέθηκαν δεδομένα
85 | TotalExecutionTime: Συνολικός Χρόνος Εκτέλεσης
86 | AvgExecutionTime: Μέσος Χρόνος Εκτέλεσης
87 | # Context: Context
88 |
--------------------------------------------------------------------------------
/locales/en.yml:
--------------------------------------------------------------------------------
1 | # elements like %{queue} are variables and should not be translated
2 | en:
3 | Actions: Actions
4 | AddToQueue: Add to queue
5 | AreYouSure: Are you sure?
6 | AreYouSureDeleteJob: Are you sure you want to delete this job?
7 | AreYouSureDeleteQueue: Are you sure you want to delete the %{queue} queue? This will delete all jobs within the queue, it will reappear if you push more jobs to it in the future.
8 | Arguments: Arguments
9 | BackToApp: Back to App
10 | Busy: Busy
11 | Class: Class
12 | Connections: Connections
13 | CreatedAt: Created At
14 | CurrentMessagesInQueue: Current jobs in %{queue}
15 | Dashboard: Dashboard
16 | Dead: Dead
17 | DeadJobs: Dead Jobs
18 | Delete: Delete
19 | DeleteAll: Delete All
20 | Deploy: Deploy
21 | Enqueued: Enqueued
22 | Error: Error
23 | ErrorBacktrace: Error Backtrace
24 | ErrorClass: Error Class
25 | ErrorMessage: Error Message
26 | ExecutionTime: Execution Time
27 | Extras: Extras
28 | Failed: Failed
29 | Failures: Failures
30 | Failure: Failure
31 | GoBack: ← Back
32 | History: History
33 | Job: Job
34 | Jobs: Jobs
35 | Kill: Kill
36 | KillAll: Kill All
37 | LastRetry: Last Retry
38 | Latency: Latency
39 | LivePoll: Live Poll
40 | MemoryUsage: Memory Usage
41 | Name: Name
42 | Namespace: Namespace
43 | NextRetry: Next Retry
44 | NoDeadJobsFound: No dead jobs were found
45 | NoRetriesFound: No retries were found
46 | NoScheduledFound: No scheduled jobs were found
47 | NotYetEnqueued: Not yet enqueued
48 | OneMonth: 1 month
49 | OneWeek: 1 week
50 | OriginallyFailed: Originally Failed
51 | Pause: Pause
52 | Paused: Paused
53 | PeakMemoryUsage: Peak Memory Usage
54 | Plugins: Plugins
55 | PollingInterval: Polling interval
56 | Process: Process
57 | Processed: Processed
58 | Processes: Processes
59 | Queue: Queue
60 | Queues: Queues
61 | Quiet: Quiet
62 | QuietAll: Quiet All
63 | Realtime: Real-time
64 | Retries: Retries
65 | RetryAll: Retry All
66 | RetryCount: Retry Count
67 | RetryNow: Retry Now
68 | Scheduled: Scheduled
69 | ScheduledJobs: Scheduled Jobs
70 | Seconds: Seconds
71 | ShowAll: Show All
72 | SixMonths: 6 months
73 | Size: Size
74 | Started: Started
75 | Status: Status
76 | Stop: Stop
77 | StopAll: Stop All
78 | StopPolling: Stop Polling
79 | Success: Success
80 | Summary: Summary
81 | Thread: Thread
82 | Threads: Threads
83 | ThreeMonths: 3 months
84 | Time: Time
85 | Unpause: Unpause
86 | Uptime: Uptime (days)
87 | Utilization: Utilization
88 | Version: Version
89 | When: When
90 | Worker: Worker
91 | active: active
92 | idle: idle
93 | Metrics: Metrics
94 | NoDataFound: No data found
95 | TotalExecutionTime: Total Execution Time
96 | AvgExecutionTime: Average Execution Time
97 | Context: Context
98 | Bucket: Bucket
99 | NoJobMetricsFound: No recent job metrics were found
100 | Filter: Filter
101 | AnyJobContent: Any job content
102 |
--------------------------------------------------------------------------------
/locales/es.yml:
--------------------------------------------------------------------------------
1 | # elements like %{queue} are variables and should not be translated
2 | es:
3 | Actions: Acciones
4 | AddToQueue: Añadir a la cola
5 | AreYouSure: ¿Estás seguro?
6 | AreYouSureDeleteJob: ¿Estás seguro de eliminar este trabajo?
7 | AreYouSureDeleteQueue: ¿Estás seguro de eliminar la cola %{queue}?
8 | Arguments: Argumentos
9 | BackToApp: Volver a la Aplicación
10 | Busy: Ocupado
11 | Class: Clase
12 | Connections: Conexiones
13 | CreatedAt: Creado en
14 | CurrentMessagesInQueue: Mensajes actualmente en %{queue}
15 | Dashboard: Panel de Control
16 | Dead: Muerto
17 | DeadJobs: Trabajos muertos
18 | Delete: Eliminar
19 | DeleteAll: Borrar Todo
20 | Enqueued: En Cola
21 | Error: Error
22 | ErrorBacktrace: Trazado del Error
23 | ErrorClass: Clase del Error
24 | ErrorMessage: Mensaje de Error
25 | Extras: Extras
26 | Failed: Fallidas
27 | Failures: Fallas
28 | GoBack: ← Regresar
29 | History: Historial
30 | Job: Trabajo
31 | Jobs: Trabajos
32 | Kill: Matar
33 | KillAll: Matar Todo
34 | LastRetry: Último Reintento
35 | Latency: Latencia
36 | LivePoll: Sondeo en Vivo
37 | MemoryUsage: Uso de Memoria
38 | Name: Nombre
39 | Namespace: Espacio de Nombre
40 | NextRetry: Siguiente Intento
41 | NoDeadJobsFound: No hay trabajos muertos
42 | NoRetriesFound: No se encontraron reintentos
43 | NoScheduledFound: No se encontraron trabajos pendientes
44 | NotYetEnqueued: Aún no en cola
45 | OneMonth: 1 mes
46 | OneWeek: 1 semana
47 | OriginallyFailed: Falló Originalmente
48 | Pause: Pausar
49 | Paused: Pausado
50 | PeakMemoryUsage: Máximo Uso de Memoria
51 | Plugins: Plugins
52 | PollingInterval: Intervalo de Sondeo
53 | Process: Proceso
54 | Processed: Procesadas
55 | Processes: Procesos
56 | Queue: Cola
57 | Queues: Colas
58 | Quiet: Silenciar
59 | QuietAll: Silenciar Todo
60 | Realtime: Tiempo Real
61 | Retries: Reintentos
62 | RetryAll: Reintentar Todo
63 | RetryCount: Numero de Reintentos
64 | RetryNow: Reintentar Ahora
65 | Scheduled: Programadas
66 | ScheduledJobs: Trabajos programados
67 | ShowAll: Mostrar Todo
68 | SixMonths: 6 meses
69 | Size: Tamaño
70 | Started: Hora de Inicio
71 | Status: Estatus
72 | Stop: Detener
73 | StopAll: Detener Todo
74 | StopPolling: Detener Sondeo
75 | Thread: Hilo
76 | Threads: Hilos
77 | ThreeMonths: 3 meses
78 | Time: Tiempo
79 | Unpause: Reanudar
80 | Uptime: Tiempo de Funcionamiento (días)
81 | Utilization: Utilización
82 | Version: Versión
83 | When: Cuando
84 | Worker: Trabajador
85 | active: activo
86 | idle: inactivo
87 |
--------------------------------------------------------------------------------
/locales/fa.yml:
--------------------------------------------------------------------------------
1 | # elements like %{queue} are variables and should not be translated
2 | fa:
3 | Actions: اعمال
4 | AddToQueue: افزودن به صف
5 | AreYouSure: آیا مطمعن هستید?
6 | AreYouSureDeleteJob: آیا شما مطمعن هستید از حذف این کار ؟
7 | AreYouSureDeleteQueue: ایا شما مطمعنید از حذف %{queue} ?
8 | Arguments: آرگومنت
9 | BackToApp: برگشت به برنامه
10 | Busy: مشغول
11 | Class: کلاس
12 | Connections: ارتباطات
13 | CreatedAt: ساخته شده در
14 | CurrentMessagesInQueue: کار فعلی در %{queue}
15 | Dashboard: داشبورد
16 | Dead: مرده
17 | DeadJobs: کار مرده
18 | Delete: حذف
19 | DeleteAll: حذف همه
20 | Enqueued: صف بندی نشدند
21 | Error: خطا
22 | ErrorBacktrace: خطای معکوس
23 | ErrorClass: خطا کلاس
24 | ErrorMessage: پیغام خطا
25 | Extras: اضافی
26 | Failed: ناموفق
27 | Failures: شکست ها
28 | GoBack: ← برگشت
29 | History: تاریخچه
30 | Job: کار
31 | Jobs: کار ها
32 | Kill: کشتن
33 | LastRetry: آخرین تلاش
34 | LivePoll: Live Poll
35 | MemoryUsage: حافظه استفاده شده
36 | Namespace: فضای نام
37 | NextRetry: بار دیگر تلاش کنید
38 | NoDeadJobsFound: کار مرده ای یافت نشد
39 | NoRetriesFound: هیچ تلاش پیدا نشد
40 | NoScheduledFound: هیچ کار برنامه ریزی شده ای یافت نشد
41 | NotYetEnqueued: بدون صف بندی
42 | OneMonth: ۱ ماه
43 | OneWeek: ۱ هفته
44 | OriginallyFailed: Originally Failed
45 | Paused: مکث
46 | PeakMemoryUsage: اوج حافظه استفاده شده
47 | Plugins: پلاگین ها
48 | PollingInterval: Polling interval
49 | Processed: پردازش شده
50 | Processes: پردازش ها
51 | Queue: صف
52 | Queues: صف ها
53 | Quiet: خروج
54 | QuietAll: خروج همه
55 | Realtime: زنده
56 | Retries: تکرار
57 | RetryAll: تلاش مجدد برای همه
58 | RetryCount: تعداد تلاش ها
59 | RetryNow: تلاش مجدد
60 | Scheduled: زمان بندی
61 | ScheduledJobs: کار برنامه ریزی شده
62 | ShowAll: نمایش همه
63 | SixMonths: ۶ ماه
64 | Size: سایز
65 | Started: شروع شده
66 | Status: اعلان
67 | Stop: توقف
68 | StopAll: توقف همه
69 | StopPolling: Stop Polling
70 | TextDirection: 'rtl'
71 | Thread: رشته
72 | Threads: رشته ها
73 | ThreeMonths: ۳ ماه
74 | Time: رمان
75 | Uptime: آپ تایم (روز)
76 | Version: ورژن
77 | When: وقتی که
78 | Worker: کارگزار
79 | active: فعال
80 | idle: بیهودی
81 |
--------------------------------------------------------------------------------
/locales/fr.yml:
--------------------------------------------------------------------------------
1 | # elements like %{queue} are variables and should not be translated
2 | fr:
3 | Actions: Actions
4 | AddToQueue: Ajouter à la queue
5 | AreYouSure: Êtes-vous certain ?
6 | AreYouSureDeleteJob: Êtes-vous certain de vouloir supprimer cette tâche ?
7 | AreYouSureDeleteQueue: Êtes-vous certain de vouloir supprimer la queue %{queue} ?
8 | Arguments: Arguments
9 | Back to App: Retour à l'application
10 | Busy: En cours
11 | Class: Classe
12 | Connections: Connexions
13 | CreatedAt: Créée le
14 | CurrentMessagesInQueue: Messages actuellement dans %{queue}
15 | Dashboard: Tableau de Bord
16 | Dead: Mortes
17 | DeadJobs: Tâches mortes
18 | Delete: Supprimer
19 | DeleteAll: Tout supprimer
20 | Deploy: Déploiement
21 | Enqueued: En attente
22 | Error: Erreur
23 | ErrorBacktrace: Backtrace d’erreur
24 | ErrorClass: Classe d’erreur
25 | ErrorMessage: Message d’erreur
26 | ExecutionTime: Temps d'exécution
27 | Extras: Extras
28 | Failed: Échouées
29 | Failures: Echecs
30 | Failure: Echec
31 | GoBack: ← Retour
32 | History: Historique
33 | Job: Tâche
34 | Jobs: Tâches
35 | Kill: Tuer
36 | KillAll: Tout tuer
37 | LastRetry: Dernier essai
38 | Latency: Latence
39 | LivePoll: Temps réel
40 | MemoryUsage: Mémoire utilisée
41 | Name: Nom
42 | Namespace: Namespace
43 | NextRetry: Prochain essai
44 | NoDeadJobsFound: Aucune tâche morte n'a été trouvée
45 | NoRetriesFound: Aucune tâche à réessayer n’a été trouvée
46 | NoScheduledFound: Aucune tâche planifiée n'a été trouvée
47 | NotYetEnqueued: Pas encore en file d'attente
48 | OneMonth: 1 mois
49 | OneWeek: 1 semaine
50 | OriginallyFailed: Échec initial
51 | Pause: Pause
52 | Paused: Mise en pause
53 | PeakMemoryUsage: Mémoire utilisée (max.)
54 | Plugins: Plugins
55 | PollingInterval: Intervalle de rafraîchissement
56 | Process: Processus
57 | Processed: Traitées
58 | Processes: Processus
59 | Queue: Queue
60 | Queues: Queues
61 | Quiet: Clore
62 | QuietAll: Tout clore
63 | Realtime: Temps réel
64 | Retries: Tentatives
65 | RetryAll: Tout réessayer
66 | RetryCount: Nombre d'essais
67 | RetryNow: Réessayer maintenant
68 | Scheduled: Planifiées
69 | ScheduledJobs: Tâches planifiées
70 | Seconds: Secondes
71 | ShowAll: Tout montrer
72 | SixMonths: 6 mois
73 | Size: Taille
74 | Started: Démarrée
75 | Status: État
76 | Stop: Arrêter
77 | StopAll: Tout arrêter
78 | StopPolling: Arrêt du temps réel
79 | Success: Succès
80 | Summary: Résumé
81 | Thread: Thread
82 | Threads: Threads
83 | ThreeMonths: 3 mois
84 | Time: Heure
85 | Unpause: Unpause
86 | Uptime: Uptime (jours)
87 | Utilization: Utilisation
88 | Version: Version
89 | When: Quand
90 | Worker: Travailleur
91 | active: actif
92 | idle: inactif
93 | Metrics: Métriques
94 | NoDataFound: Aucune donnée disponible
95 | TotalExecutionTime: Temps d'exécution total
96 | AvgExecutionTime: Temps d'exécution moyen
97 | Context: Contexte
98 | Bucket: Bucket
99 | NoJobMetricsFound: Aucune statistique de tâche récente n'a été trouvée
100 |
--------------------------------------------------------------------------------
/locales/gd.yml:
--------------------------------------------------------------------------------
1 | # elements like %{queue} are variables and should not be translated
2 | gd:
3 | Actions: Gnìomhan
4 | AddToQueue: Cuir ris a’ chiutha
5 | AreYouSure: A bheil thu cinnteach?
6 | AreYouSureDeleteJob: A bheil thu cinnteach gu bheil thu airson an obair seo a sguabadh às?
7 | AreYouSureDeleteQueue: A bheil thu cinnteach gu bheil thu airson ciutha %{queue} a sguabadh às? Sguabaidh seo às gach obair sa chiutha seo, nochdaidh e a-rithist nuair a phutas tu barrachd obraichean dha an uairsin.
8 | Arguments: Argamaidean
9 | BackToApp: Till dhan aplacaid
10 | Busy: Trang
11 | Class: Clas
12 | Connections: Ceanglaichean
13 | CreatedAt: Air a chruthachadh
14 | CurrentMessagesInQueue: Obraichean làithreach am broinn %{queue}
15 | Dashboard: Deas-bhòrd
16 | Dead: Marbh
17 | DeadJobs: Obraichean marbh
18 | Delete: Sguab às
19 | DeleteAll: Sguab às na h-uile
20 | Deploy: Cuir an gnìomh
21 | Enqueued: Sa chiutha
22 | Error: Mearachd
23 | ErrorBacktrace: Backtrace na mearachd
24 | ErrorClass: Clas na mearachd
25 | ErrorMessage: Teachdaireachd na mearachd
26 | ExecutionTime: Àm a’ ghnìomha
27 | Extras: Nithean a bharrachd
28 | Failed: Air fàilligeadh
29 | Failures: Fàilligidhean
30 | Failure: Fàilligeadh
31 | GoBack: ← Air ais
32 | History: Eachdraidh
33 | Job: Obair
34 | Jobs: Obraichean
35 | Kill: Marbh
36 | KillAll: Marbh na h-uile
37 | LastRetry: An oidhirp mu dheireadh
38 | Latency: Foillidheachd
39 | LivePoll: Ath-nuadhachadh beò
40 | MemoryUsage: Cleachdadh a’ chuimhne
41 | Name: Ainm
42 | Namespace: Ainm-spàs
43 | NextRetry: An ath-oidhirp
44 | NoDeadJobsFound: Cha deach obair mharbh a lorg
45 | NoRetriesFound: Cha deach ath-oidhirp a lorg
46 | NoScheduledFound: Cha deach obair air an sgeideal a lorg
47 | NotYetEnqueued: Chan eil seo sa chiutha fhathast
48 | OneMonth: Mìos
49 | OneWeek: Seachdain
50 | OriginallyFailed: Dh’fhàillig e o thùs
51 | Pause: Cuir ’na stad
52 | Paused: ’Na stad
53 | PeakMemoryUsage: Bàrr cleachdadh a’ chuimhne
54 | Plugins: Plugain
55 | PollingInterval: Eadaramh an ath-nuadhachaidh
56 | Process: Pròiseas
57 | Processed: Air pròiseasadh
58 | Processes: Pròiseasan
59 | Queue: Ciutha
60 | Queues: Ciuthan
61 | Quiet: Mùch
62 | QuietAll: Mùch na h-uile
63 | Realtime: Fìor-àm
64 | Retries: Oidhirpean
65 | RetryAll: Feuch ris na h-uile a-rithist
66 | RetryCount: Cunntas nan oidhirpean
67 | RetryNow: Feuch ris a-rithist an-dràsta
68 | Scheduled: Air an sgeideal
69 | ScheduledJobs: Obraichean air an sgeideal
70 | Seconds: Diogan
71 | ShowAll: Seall na h-uile
72 | SixMonths: Leth-bhliadhna
73 | Size: Meud
74 | Started: Air a thòiseachadh
75 | Status: Staid
76 | Stop: Cuir stad air
77 | StopAll: Cuir stad air na h-uile
78 | StopPolling: Sguir dhen ath-nuadhachadh
79 | Success: Chaidh leis
80 | Summary: Geàrr-chunntas
81 | Thread: Snàithlean
82 | Threads: Snàithleanan
83 | ThreeMonths: 3 mìosan
84 | Time: Àm
85 | Unpause: Lean air
86 | Uptime: Beò fad (làithean)
87 | Utilization: Cleachdadh
88 | Version: Tionndadh
89 | When: Cuin
90 | Worker: Obraiche
91 | active: gnìomhach
92 | idle: ’na thàmh
93 | Metrics: Meatraigeachd
94 | NoDataFound: Cha deach dàta a lorg
95 | TotalExecutionTime: Ùine iomlan nan gnìomhan
96 | AvgExecutionTime: Ùine cuibheasach nan gnìomhan
97 | Context: Co-theacsa
98 | Bucket: Bucaid
99 | NoJobMetricsFound: Cha deach meatraigeachd o chionn goirid air obair a lorg
100 |
--------------------------------------------------------------------------------
/locales/he.yml:
--------------------------------------------------------------------------------
1 | # elements like %{queue} are variables and should not be translated
2 | he:
3 | Actions: פעולות
4 | AddToQueue: הוסף לתור
5 | AreYouSure: אתם בטוחים?
6 | AreYouSureDeleteJob: האם אתם בטוחים שברצונכם למחוק את העבודה הזאת?
7 | AreYouSureDeleteQueue: האם אתם בטוחים שברצונכם למחוק את התור %{queue}?
8 | Arguments: ארגומנטים
9 | BackToApp: חזרה לאפליקציה
10 | Busy: עסוקים
11 | Class: מחלקה
12 | Connections: חיבורים
13 | CreatedAt: נוצר ב
14 | CurrentMessagesInQueue: עבודות נוכחיות בתור %{queue}
15 | Dashboard: לוח מחוונים
16 | Dead: מתים
17 | DeadJobs: עבודות מתות
18 | Delete: מחק
19 | DeleteAll: מחק הכל
20 | Enqueued: בתור
21 | Error: שגיאה
22 | ErrorBacktrace: מעקב לאחור של השגיאה
23 | ErrorClass: סוג השגיאה
24 | ErrorMessage: הודעת השגיאה
25 | Extras: תוספות
26 | Failed: נכשלו
27 | Failures: כשלונות
28 | GoBack: ← אחורה
29 | History: היסטוריה
30 | Job: עבודה
31 | Jobs: עבודות
32 | Kill: הרוג
33 | LastRetry: ניסיון חוזר אחרון
34 | LivePoll: תשאול חי
35 | MemoryUsage: שימוש בזיכרון
36 | Namespace: מרחב שם
37 | NextRetry: ניסיון חוזר הבא
38 | NoDeadJobsFound: לא נמצאו עבודות מתות
39 | NoRetriesFound: לא נמצאו נסיונות חוזרים
40 | NoScheduledFound: לא נמצאו עבודות מתוכננות
41 | NotYetEnqueued: עוד לא בתור
42 | OneMonth: חודש 1
43 | OneWeek: שבוע 1
44 | OriginallyFailed: נכשל בניסיון הראשון
45 | Paused: הופסקו
46 | PeakMemoryUsage: שיא השימוש בזיכרון
47 | Plugins: תוספים
48 | PollingInterval: מרווח זמן בין תשאולים
49 | Processed: עובדו
50 | Processes: תהליכים
51 | Queue: תור
52 | Queues: תורים
53 | Quiet: שקט
54 | QuietAll: השקט את כולם
55 | Realtime: זמן אמת
56 | Retries: נסיונות חוזרים
57 | RetryAll: נסה שוב את הכל
58 | RetryCount: מספר נסיונות חוזרים
59 | RetryNow: נסה שוב עכשיו
60 | Scheduled: מתוכננים
61 | ScheduledJobs: עבודות מתוכננות
62 | ShowAll: הצג את הכל
63 | SixMonths: 6 חדשים
64 | Size: אורך
65 | Started: הותחלו
66 | Status: מצב
67 | Stop: עצור
68 | StopAll: עצור הכל
69 | StopPolling: עצור תשאול
70 | TextDirection: 'rtl'
71 | Thread: חוט
72 | Threads: חוטים
73 | ThreeMonths: 3 חדשים
74 | Time: שעה
75 | Uptime: זמן פעילות (ימים)
76 | Version: גירסה
77 | When: מתי
78 | Worker: עובד
79 | active: פעיל
80 | idle: במנוחה
81 |
--------------------------------------------------------------------------------
/locales/hi.yml:
--------------------------------------------------------------------------------
1 | # elements like %{queue} are variables and should not be translated
2 | hi:
3 | Actions: कार्रवाई
4 | AddToQueue: कतार मे जोड़ें
5 | AreYouSure: क्या आपको यकीन है?
6 | AreYouSureDeleteJob: क्या आप इस कार्य को हटाना चाहते है?
7 | AreYouSureDeleteQueue: क्या आप %{queue} कतार को हटाना चाहते है?
8 | Arguments: अर्गुमेन्ट्स्
9 | Busy: व्यस्थ
10 | Class: क्लास
11 | Connections: कनेक्श्न
12 | CurrentMessagesInQueue: %{queue} कतार मे वर्तमान कार्य
13 | Dashboard: डैशबोर्ड
14 | Dead: निष्प्राण
15 | DeadJobs: निष्प्राण कार्य
16 | Delete: हटाओ
17 | DeleteAll: सब हटाओ
18 | Enqueued: कतारबद्ध
19 | Error: एरर
20 | ErrorBacktrace: एरर बैकट्रेस
21 | ErrorClass: एरर क्लास
22 | ErrorMessage: एरर संदेश
23 | Extras: अतिरिक्त
24 | Failed: असफल
25 | Failures: असफलता
26 | GoBack: ← पीछे
27 | History: वृत्तान्त
28 | Job: कार्य
29 | Jobs: कार्य
30 | Kill: नष्ट करे
31 | LastRetry: अंतिम पुन:प्रयास
32 | LivePoll: लाईव सर्वेक्षण
33 | MemoryUsage: मेमरी उपयोग
34 | Namespace: नामस्थान
35 | NextRetry: अगला पुन:प्रयास
36 | NoDeadJobsFound: कोई निष्प्राण कार्य नही पाए गए
37 | NoRetriesFound: कोई पुनर्प्रयास नही पाए गए
38 | NoScheduledFound: कोई परिगणित कार्य नही पाए गए
39 | OneMonth: १ महीना
40 | OneWeek: १ सप्ताह
41 | OriginallyFailed: पहिले से विफल
42 | Paused: थमे हुए
43 | PeakMemoryUsage: अधिकतम मेमरी उपयोग
44 | PollingInterval: सर्वेक्षण अंतराल
45 | Processed: कार्रवाई कृत
46 | Processes: प्रोसेसेस्
47 | Queue: कतार
48 | Queues: कतारे
49 | Quiet: शांत करो
50 | QuietAll: सब शांत करो
51 | Realtime: रिअल टाईम
52 | Retries: पुनर्प्रयास
53 | RetryAll: सब पुन:प्रयास करे
54 | RetryCount: पुन:प्रयास संख्या
55 | RetryNow: पुन:प्रयास करे
56 | Scheduled: परिगणित
57 | ScheduledJobs: परिगणित कार्य
58 | ShowAll: सब दिखाएं
59 | SixMonths: ६ महीने
60 | Size: आकार
61 | Started: शुरु हुआ
62 | Status: स्थिती
63 | Stop: रोको
64 | StopAll: सब रोको
65 | StopPolling: सर्वेक्षण रोको
66 | Thread: थ्रेड
67 | Threads: थ्रेड्स्
68 | ThreeMonths: ३ महीने
69 | Time: समय
70 | Uptime: उपरिकाल (दिवस)
71 | Version: वर्जन
72 | When: कब
73 | Worker: वर्कर
74 | active: सक्रिय
75 | idle: निष्क्रिय
76 |
--------------------------------------------------------------------------------
/locales/it.yml:
--------------------------------------------------------------------------------
1 | # elements like %{queue} are variables and should not be translated
2 | it:
3 | Actions: Azioni
4 | AddToQueue: Aggiungi alla coda
5 | AreYouSure: Sei sicuro?
6 | AreYouSureDeleteJob: Sei sicuro di voler cancellare questo lavoro?
7 | AreYouSureDeleteQueue: Sei sicuro di voler cancellare la coda %{queue}?
8 | Arguments: Argomenti
9 | Busy: Occupato
10 | Class: Classe
11 | Connections: Connessioni
12 | CurrentMessagesInQueue: Messaggi in %{queue}
13 | Dashboard: Dashboard
14 | Dead: Arrestato
15 | DeadJobs: Lavori arrestati
16 | Delete: Cancella
17 | DeleteAll: Cancella tutti
18 | Enqueued: In coda
19 | Error: Errore
20 | ErrorBacktrace: Backtrace dell'errore
21 | ErrorClass: Classe dell'errore
22 | ErrorMessage: Messaggio di errore
23 | Extras: Extra
24 | Failed: Fallito
25 | Failures: Fallimenti
26 | GoBack: ← Indietro
27 | History: Storia
28 | Job: Lavoro
29 | Jobs: Lavori
30 | Kill: Uccidere
31 | LastRetry: Ultimo tentativo
32 | LivePoll: Live poll
33 | MemoryUsage: Memoria utilizzata
34 | Namespace: Namespace
35 | NextRetry: Prossimo tentativo
36 | NoDeadJobsFound: Non ci sono lavori arrestati
37 | NoRetriesFound: Non sono stati trovati nuovi tentativi
38 | NoScheduledFound: Non ci sono lavori pianificati
39 | OneMonth: 1 mese
40 | OneWeek: 1 settimana
41 | OriginallyFailed: Primo fallimento
42 | PeakMemoryUsage: Memoria utilizzata (max.)
43 | Processed: Processato
44 | Processes: Processi
45 | Queue: Coda
46 | Queues: Code
47 | Realtime: Tempo reale
48 | Retries: Nuovi tentativi
49 | RetryAll: Riprova tutti
50 | RetryCount: Totale tentativi
51 | RetryNow: Riprova
52 | Scheduled: Pianificato
53 | ScheduledJobs: Lavori pianificati
54 | ShowAll: Mostra tutti
55 | SixMonths: 6 mesi
56 | Size: Dimensione
57 | Started: Iniziato
58 | Status: Stato
59 | StopPolling: Ferma il polling
60 | Thread: Thread
61 | Threads: Thread
62 | ThreeMonths: 3 mesi
63 | Time: Ora
64 | Uptime: Uptime (giorni)
65 | Version: Versione
66 | When: Quando
67 | Worker: Lavoratore
68 | active: attivo
69 | idle: inattivo
70 |
--------------------------------------------------------------------------------
/locales/ja.yml:
--------------------------------------------------------------------------------
1 | # elements like %{queue} are variables and should not be translated
2 | ja:
3 | Actions: アクション
4 | AddToQueue: キューに追加
5 | AreYouSure: よろしいですか?
6 | AreYouSureDeleteJob: このジョブを削除しますか?
7 | AreYouSureDeleteQueue: この %{queue} キューを削除しますか?
8 | Arguments: 引数
9 | BackToApp: アプリに戻る
10 | Busy: 実行中
11 | Class: クラス
12 | Connections: 接続
13 | CreatedAt: 作成日時
14 | CurrentMessagesInQueue: %{queue}に メッセージがあります
15 | Dashboard: ダッシュボード
16 | Dead: デッド
17 | DeadJobs: デッドジョブ
18 | Delete: 削除
19 | DeleteAll: 全て削除
20 | Deploy: デプロイ
21 | Enqueued: 待機状態
22 | Error: エラー
23 | ErrorBacktrace: エラーバックトレース
24 | ErrorClass: エラークラス
25 | ErrorMessage: エラーメッセージ
26 | ExecutionTime: 実行時間
27 | Extras: エクストラ
28 | Failed: 失敗
29 | Failures: 失敗
30 | Failure: 失敗
31 | GoBack: ← 戻る
32 | History: 履歴
33 | Job: ジョブ
34 | Jobs: ジョブ
35 | Kill: 強制終了
36 | KillAll: 全て強制終了
37 | LastRetry: 再試行履歴
38 | Latency: レイテンシ
39 | LivePoll: ポーリング開始
40 | MemoryUsage: メモリー使用量
41 | Name: 名前
42 | Namespace: ネームスペース
43 | NextRetry: 再試行
44 | NoDeadJobsFound: デッドジョブはありません
45 | NoRetriesFound: 再試行するジョブはありません
46 | NoScheduledFound: 予定されたジョブはありません
47 | NotYetEnqueued: キューに入っていません
48 | OneMonth: 1 ヶ月
49 | OneWeek: 1 週
50 | OriginallyFailed: 失敗
51 | Pause: 一時停止
52 | Paused: 一時停止中
53 | PeakMemoryUsage: 最大メモリー使用量
54 | Plugins: プラグイン
55 | PollingInterval: ポーリング間隔
56 | Process: プロセス
57 | Processed: 完了
58 | Processes: プロセス
59 | Queue: キュー
60 | Queues: キュー
61 | Quiet: 処理終了
62 | QuietAll: すべて処理終了
63 | Realtime: リアルタイム
64 | Retries: 再試行
65 | RetryAll: 全て再試行
66 | RetryCount: 再試行
67 | RetryNow: 今すぐ再試行
68 | Scheduled: 予定
69 | ScheduledJobs: 予定されたジョブ
70 | Seconds: 秒
71 | ShowAll: 全て見せる
72 | SixMonths: 6 ヶ月
73 | Size: サイズ
74 | Started: 開始
75 | Status: 状態
76 | Stop: 停止
77 | StopAll: すべて停止
78 | StopPolling: ポーリング停止
79 | Success: 成功
80 | Thread: スレッド
81 | Threads: スレッド
82 | ThreeMonths: 3 ヶ月
83 | Time: 時間
84 | Unpause: 一時停止を解除
85 | Metrics: メトリクス
86 | NoDataFound: データが見つかりませんでした
87 | TotalExecutionTime: 合計実行時間
88 | AvgExecutionTime: 平均実行時間
89 | Context: コンテキスト
90 | Bucket: バケット
91 | NoJobMetricsFound: 直近のジョブメトリクスが見つかりませんでした
92 |
--------------------------------------------------------------------------------
/locales/ko.yml:
--------------------------------------------------------------------------------
1 | # elements like %{queue} are variables and should not be translated
2 | ko:
3 | Actions: 동작
4 | AddToQueue: 큐 추가
5 | AreYouSure: 정말입니까?
6 | AreYouSureDeleteJob: 이 작업을 삭제하시겠습니까?
7 | AreYouSureDeleteQueue: 이 %{queue} 큐를 삭제하시겠습니까?
8 | Arguments: 인자
9 | Batches: 배치
10 | Busy: 작동
11 | Class: 클래스
12 | Connections: 커넥션
13 | CurrentMessagesInQueue: %{queue}에 대기 중인 메시지
14 | Dashboard: 대시보드
15 | Dead: 죽음
16 | DeadJobs: 죽은 작업
17 | Delete: 삭제
18 | DeleteAll: 모두 삭제
19 | Enqueued: 대기 중
20 | Error: 에러
21 | ErrorBacktrace: 에러 Backtrace
22 | ErrorClass: 에러 클래스
23 | ErrorMessage: 에러 메시지
24 | Failed: 실패
25 | Failures: 실패
26 | GoBack: ← 뒤로
27 | History: 히스토리
28 | Job: 작업
29 | Jobs: 작업
30 | LastRetry: 최근 재시도
31 | LivePoll: 폴링 시작
32 | MemoryUsage: 메모리 사용량
33 | Namespace: 네임스페이스
34 | NextRetry: 다음 재시도
35 | NoDeadJobsFound: 죽은 작업이 없습니다
36 | NoRetriesFound: 재시도 내역이 없습니다
37 | NoScheduledFound: 예약된 작업이 없습니다
38 | OneMonth: 1 달
39 | OneWeek: 1 주
40 | OriginallyFailed: 실패
41 | PeakMemoryUsage: 최대 메모리 사용량
42 | Processed: 처리완료
43 | Processes: 프로세스
44 | Queue: 큐
45 | Queues: 큐
46 | Realtime: 실시간
47 | Retries: 재시도
48 | RetryAll: 모두 재시도
49 | RetryCount: 재시도 횟수
50 | RetryNow: 지금 재시도
51 | Scheduled: 예약
52 | ScheduledJobs: 예약된 작업
53 | ShowAll: 모두 보기
54 | SixMonths: 6 달
55 | Size: 크기
56 | Started: 시작
57 | Status: 상태
58 | StopPolling: 폴링 중단
59 | Thread: 스레드
60 | Threads: 스레드
61 | ThreeMonths: 3 달
62 | Time: 시간
63 | Uptime: 업타임 (일)
64 | Version: 버전
65 | When: 언제
66 | Worker: 워커
67 | active: 동작 중
68 | idle: 대기 중
69 |
--------------------------------------------------------------------------------
/locales/lt.yml:
--------------------------------------------------------------------------------
1 | # elements like %{queue} are variables and should not be translated
2 | lt:
3 | Actions: Veiksmai
4 | AddToQueue: Pridėti į eilę
5 | AreYouSure: Ar jūs įsitikinę?
6 | AreYouSureDeleteJob: Ar tikrai norite pašalinti šį darbą?
7 | AreYouSureDeleteQueue: Ar tikrai norite pašalinti šią eilę %{queue}?
8 | Arguments: Parametrai
9 | BackToApp: Atgal į Aplikaciją
10 | Busy: Užimti
11 | Class: Klasė
12 | Connections: Ryšiai
13 | CreatedAt: Sukurta
14 | CurrentMessagesInQueue: Esami darbai eilėje %{queue}
15 | Dashboard: Valdymo skydas
16 | Dead: Negyvi
17 | DeadJobs: Negyvi Darbai
18 | Delete: Pašalinti
19 | DeleteAll: Pašalinti Visus
20 | Enqueued: Eilėje
21 | Error: Klaida
22 | ErrorBacktrace: Klaidos Pėdsakai
23 | ErrorClass: Klaidos Klasė
24 | ErrorMessage: Klaidos Žinutė
25 | Extras: Papildomi
26 | Failed: Nepavykę
27 | Failures: Nesėkmingi vykdymai
28 | GoBack: ← Atgal
29 | History: Istorija
30 | Job: Darbas
31 | Jobs: Darbai
32 | Kill: Priverstinai Nutraukti
33 | KillAll: Priverstinai Nutraukti Visus
34 | LastRetry: Paskutinis Kartojimas
35 | Latency: Vėlavimas
36 | LivePoll: Užklausti gyvai
37 | MemoryUsage: Atminties Vartojimas
38 | Namespace: Vardų erdvė
39 | NextRetry: Sekantis Kartojimas
40 | NoDeadJobsFound: Negyvų darbų nerasta
41 | NoRetriesFound: Nerasta kartojimų
42 | NoScheduledFound: Planuojamų darbų nerasta
43 | NotYetEnqueued: Dar neįtraukti į eilę
44 | OneMonth: 1 mėnuo
45 | OneWeek: 1 savaitė
46 | OriginallyFailed: Iš pradžių Nepavykę
47 | Pause: Pristabdyti
48 | Paused: Pristabdytas
49 | PeakMemoryUsage: Atminties Vartojimo Pikas
50 | Plugins: Įskiepiai
51 | PollingInterval: Užklausimų intervalas
52 | Processed: Įvykdyti
53 | Processes: Procesai
54 | Queue: Eilė
55 | Queues: Eilės
56 | Quiet: Nutildyti
57 | QuietAll: Nutildyti Visus
58 | Realtime: Realiu laiku
59 | Retries: Kartojami
60 | RetryAll: Kartoti Visus
61 | RetryCount: Kartojimų Skaičius
62 | RetryNow: Kartoti Dabar
63 | Scheduled: Suplanuoti
64 | ScheduledJobs: Planuojami Darbai
65 | ShowAll: Rodyti Visus
66 | SixMonths: 6 mėnesiai
67 | Size: Dydis
68 | Started: Pradėti
69 | Status: Būsena
70 | Stop: Sustabdyti
71 | StopAll: Sustabdyti Visus
72 | StopPolling: Stabdyti užklausas
73 | Thread: Gija
74 | Threads: Gijos
75 | ThreeMonths: 3 mėnesiai
76 | Time: Laikas
77 | Unpause: Pratęsti
78 | Uptime: Gyvavimo laikas (dienomis)
79 | Version: Versija
80 | When: Kada
81 | Worker: Darbuotojas
82 | active: aktyvus
83 | idle: neveiksnus
84 |
--------------------------------------------------------------------------------
/locales/nb.yml:
--------------------------------------------------------------------------------
1 | # elements like %{queue} are variables and should not be translated
2 | nb:
3 | Actions: Handlinger
4 | AddToQueue: Legg til i kø
5 | AreYouSure: Er du sikker?
6 | AreYouSureDeleteJob: Er du sikker på at du vil slette denne jobben?
7 | AreYouSureDeleteQueue: Er du sikker på at du vil slette køen %{queue}?
8 | Arguments: Argumenter
9 | Busy: Opptatt
10 | Class: Klasse
11 | Connections: Tilkoblinger
12 | CurrentMessagesInQueue: Nåværende melding i %{queue}
13 | Dashboard: Oversikt
14 | Dead: Død
15 | DeadJobs: Døde jobber
16 | Delete: Slett
17 | DeleteAll: Slett alle
18 | Enqueued: I kø
19 | Error: Feil
20 | ErrorBacktrace: Feilbakgrunn
21 | ErrorClass: Feilklasse
22 | ErrorMessage: Feilmelding
23 | Extras: Ekstra
24 | Failed: Mislykket
25 | Failures: Feil
26 | GoBack: ← Tilbake
27 | History: Historikk
28 | Job: Jobb
29 | Jobs: Jobber
30 | Kill: Kill
31 | LastRetry: Forrige forsøk
32 | LivePoll: Automatisk oppdatering
33 | MemoryUsage: Minneforbruk
34 | Namespace: Navnerom
35 | NextRetry: Neste forsøk
36 | NoDeadJobsFound: Ingen døde jobber funnet
37 | NoRetriesFound: Ingen forsøk funnet
38 | NoScheduledFound: Ingen planlagte jobber funnet
39 | NotYetEnqueued: Ikke køet enda
40 | OneMonth: 1 måned
41 | OneWeek: 1 uke
42 | OriginallyFailed: Feilet opprinnelig
43 | Paused: Pauset
44 | PeakMemoryUsage: Høyeste minneforbruk
45 | Plugins: Innstikk
46 | PollingInterval: Oppdateringsintervall
47 | Processed: Prosessert
48 | Processes: Prosesser
49 | Queue: Kø
50 | Queues: Køer
51 | Quiet: Demp
52 | QuietAll: Demp alle
53 | Realtime: Sanntid
54 | Retries: Forsøk
55 | RetryAll: Forsøk alle på nytt
56 | RetryCount: Antall forsøk
57 | RetryNow: Forsøk igjen nå
58 | Scheduled: Planlagt
59 | ScheduledJobs: Planlagte jobber
60 | ShowAll: Vis alle
61 | SixMonths: 6 måneder
62 | Size: Størrelse
63 | Started: Startet
64 | Status: Status
65 | Stop: Stopp
66 | StopAll: Stopp alle
67 | StopPolling: Stopp automatisk oppdatering
68 | Thread: Tråd
69 | Threads: Tråder
70 | ThreeMonths: 3 måneder
71 | Time: Tid
72 | Uptime: Oppetid (dager)
73 | Version: Versjon
74 | When: Når
75 | Worker: Arbeider
76 | active: aktiv
77 | idle: uvirksom
78 |
--------------------------------------------------------------------------------
/locales/nl.yml:
--------------------------------------------------------------------------------
1 | # elements like %{queue} are variables and should not be translated
2 | nl:
3 | Actions: Acties
4 | AddToQueue: Toevoegen aan wachtrij
5 | AreYouSure: Weet u het zeker?
6 | AreYouSureDeleteJob: Weet u zeker dat u deze taak wilt verwijderen?
7 | AreYouSureDeleteQueue: Weet u zeker dat u wachtrij %{queue} wilt verwijderen?
8 | Arguments: Argumenten
9 | Busy: Bezet
10 | Class: Klasse
11 | Connections: Verbindingen
12 | CurrentMessagesInQueue: Aantal berichten in %{queue}
13 | Dashboard: Dashboard
14 | Dead: Overleden
15 | DeadJobs: Overleden taken
16 | Delete: Verwijderen
17 | DeleteAll: Alle verwijderen
18 | Enqueued: In de wachtrij
19 | Error: Fout
20 | ErrorBacktrace: Fout Backtrace
21 | ErrorClass: Fout Klasse
22 | ErrorMessage: Foutmelding
23 | Extras: Extra's
24 | Failed: Mislukt
25 | Failures: Mislukt
26 | GoBack: ← Terug
27 | History: Geschiedenis
28 | Job: Taak
29 | Jobs: Taken
30 | LastRetry: Laatste poging
31 | LivePoll: Live bijwerken
32 | MemoryUsage: Geheugengebruik
33 | Namespace: Namespace
34 | NextRetry: Volgende opnieuw proberen
35 | NoDeadJobsFound: Geen overleden taken gevonden
36 | NoRetriesFound: Geen opnieuw te proberen taken gevonden
37 | NoScheduledFound: Geen geplande taken gevonden
38 | OneMonth: 1 maand
39 | OneWeek: 1 week
40 | OriginallyFailed: Oorspronkelijk mislukt
41 | PeakMemoryUsage: Piek geheugengebruik
42 | Processed: Verwerkt
43 | Processes: Processen
44 | Queue: Wachtrij
45 | Queues: Wachtrijen
46 | Realtime: Real-time
47 | Retries: Opnieuw proberen
48 | RetryAll: Alle opnieuw proberen
49 | RetryCount: Aantal opnieuw geprobeerd
50 | RetryNow: Nu opnieuw proberen
51 | Scheduled: Gepland
52 | ScheduledJobs: Geplande taken
53 | ShowAll: Toon alle
54 | SixMonths: 6 maanden
55 | Size: Grootte
56 | Started: Gestart
57 | Status: Status
58 | StopPolling: Stop live bijwerken
59 | Thread: Thread
60 | Threads: Threads
61 | ThreeMonths: 3 maanden
62 | Time: Tijd
63 | Uptime: Looptijd (dagen)
64 | Version: Versie
65 | When: Wanneer
66 | Worker: Werker
67 | active: actief
68 | idle: inactief
69 |
--------------------------------------------------------------------------------
/locales/pl.yml:
--------------------------------------------------------------------------------
1 | # elements like %{queue} are variables and should not be translated
2 | pl:
3 | Actions: Akcje
4 | AddToQueue: dodaj do kolejki
5 | AreYouSure: Na pewno?
6 | AreYouSureDeleteJob: Czy na pewno usunąć to zadanie?
7 | AreYouSureDeleteQueue: Czy na pewno usunąć kolejkę %{queue}?
8 | Arguments: Argumenty
9 | Busy: Zajęte
10 | Class: Klasa
11 | Connections: Połączenia
12 | CurrentMessagesInQueue: Aktualne wiadomości w kolejce %{queue}
13 | Dashboard: Kokpit
14 | Delete: Usuń
15 | DeleteAll: Usuń wszystko
16 | Enqueued: Zakolejkowane
17 | Error: Błąd
18 | ErrorBacktrace: Wyjście błędu
19 | ErrorClass: Klasa błędu
20 | ErrorMessage: Wiadomosć błędu
21 | Failed: Nieudane
22 | GoBack: ← Wróć
23 | History: Historia
24 | Job: Zadanie
25 | LastRetry: Ostatnie ponowienie
26 | LivePoll: Wczytuj na żywo
27 | MemoryUsage: Wykorzystanie pamięci
28 | Namespace: Przestrzeń nazw
29 | NextRetry: Następne ponowienie
30 | NoRetriesFound: Brak zadań do ponowienia
31 | NoScheduledFound: Brak zaplanowanych zadań
32 | OneMonth: 1 miesiąc
33 | OneWeek: 1 tydzień
34 | OriginallyFailed: Ostatnio nieudane
35 | PeakMemoryUsage: Największe wykorzystanie pamięci
36 | Processed: Ukończone
37 | Queue: Kolejka
38 | Queues: Kolejki
39 | Realtime: Czas rzeczywisty
40 | Retries: Do ponowienia
41 | RetryAll: Powtórz wszystko
42 | RetryCount: Ilość ponowień
43 | RetryNow: Ponów teraz
44 | Scheduled: Zaplanowane
45 | ScheduledJobs: Zaplanowane zadania
46 | ShowAll: Pokaż wszystko
47 | SixMonths: 6 miesięcy
48 | Size: Rozmiar
49 | Started: Rozpoczęte
50 | Status: Status
51 | StopPolling: Zatrzymaj wczytywanie na żywo
52 | ThreeMonths: 3 miesiące
53 | Time: Czas
54 | Uptime: Uptime (dni)
55 | Version: Wersja
56 | When: Kiedy
57 | Worker: Worker
58 | active: aktywne
59 | idle: bezczynne
60 |
--------------------------------------------------------------------------------
/locales/pt-br.yml:
--------------------------------------------------------------------------------
1 | "pt-br":
2 | Actions: Ações
3 | AddToQueue: Adicionar à fila
4 | AreYouSure: Tem certeza?
5 | AreYouSureDeleteJob: Deseja deletar esta tarefa?
6 | AreYouSureDeleteQueue: Deseja deletar a fila %{queue}? Isso irá deletar todas as tarefas desta fila.
7 | Arguments: Argumentos
8 | AvgExecutionTime: Tempo médio de execução
9 | BackToApp: De volta ao aplicativo
10 | Bucket: Bucket
11 | Busy: Ocupados
12 | Class: Classe
13 | Connections: Conexões
14 | Context: Contexto
15 | CreatedAt: Criado em
16 | CurrentMessagesInQueue: Mensagens atualmente na %{queue}
17 | Dashboard: Painel
18 | Dead: Morta
19 | DeadJobs: Tarefas mortas
20 | Delete: Apagar
21 | DeleteAll: Apagar tudo
22 | Deploy: Deploy
23 | Enqueued: Na fila
24 | Error: Erro
25 | ErrorBacktrace: Rastreamento do erro
26 | ErrorClass: Classe de erro
27 | ErrorMessage: Mensagem de erro
28 | ExecutionTime: Tempo de execução
29 | Extras: Extras
30 | Failed: Falhas
31 | Failure: Falha
32 | Failures: Falhas
33 | GoBack: ← Voltar
34 | History: Histórico
35 | Job: Tarefa
36 | Jobs: Tarefas
37 | Kill: Matar
38 | KillAll: Matar todas
39 | LastRetry: Última tentativa
40 | Latency: Latência
41 | LivePoll: Live Poll
42 | MemoryUsage: Uso de memória
43 | Metrics: Métricas
44 | Name: Nome
45 | Namespace: Namespace
46 | NextRetry: Próxima Tentativa
47 | NoDataFound: Nenhum dado encontrado
48 | NoDeadJobsFound: Nenhuma tarefa morta foi encontrada
49 | NoJobMetricsFound: Nenhuma métrica de tarefa encontrada
50 | NoRetriesFound: Nenhuma tentativa encontrada
51 | NoScheduledFound: Nenhuma tarefa agendada foi encontrada
52 | NotYetEnqueued: Ainda não enfileirado
53 | OneMonth: 1 mês
54 | OneWeek: 1 semana
55 | OriginallyFailed: Falhou originalmente
56 | Pause: Pausar
57 | Paused: Pausado
58 | PeakMemoryUsage: Pico de uso de memória
59 | Uptime: Tempo de atividade
60 | Plugins: Plug-ins
61 | PollingInterval: Intervalo de Polling
62 | Process: Processo
63 | Processed: Processados
64 | Processes: Processos
65 | Queue: Fila
66 | Queues: Filas
67 | Quiet: Silenciar
68 | QuietAll: Silenciar Todos
69 | Realtime: Tempo real
70 | Retries: Tentativas
71 | RetryAll: Tentar tudo novamente
72 | RetryCount: Número de Tentativas
73 | RetryNow: Tentar novamente agora
74 | Scheduled: Agendados
75 | ScheduledJobs: Tarefas agendadas
76 | idle: Ocioso
77 | active: Ativo
78 | Seconds: Segundos
79 | ShowAll: Mostrar todos
80 | SixMonths: 6 meses
81 | Size: Tamanho
82 | Started: Iniciado
83 | Stop: Parar
84 | StopAll: Parar Todos
85 | StopPolling: Parar Polling
86 | Success: Sucesso
87 | Summary: Resumo
88 | Thread: Thread
89 | Threads: Threads
90 | ThreeMonths: 3 meses
91 | TotalExecutionTime: Tempo total de execução
92 | Unpause: Despausar
93 | Utilization: Utilização
94 | Version: Versão
95 | When: Quando
96 | Worker: Trabalhador
--------------------------------------------------------------------------------
/locales/pt.yml:
--------------------------------------------------------------------------------
1 | # elements like %{queue} are variables and should not be translated
2 | pt:
3 | Actions: Acções
4 | AddToQueue: Adicionar à fila
5 | AreYouSure: Tem a certeza?
6 | AreYouSureDeleteJob: Tem a certeza que deseja eliminar esta tarefa?
7 | AreYouSureDeleteQueue: Tem a certeza que deseja eliminar a fila %{queue}?
8 | Arguments: Argumentos
9 | Busy: Ocupado
10 | Class: Classe
11 | Connections: Conexões
12 | CurrentMessagesInQueue: Mensagens na fila %{queue}
13 | Dashboard: Dashboard
14 | Dead: Morto
15 | DeadJobs: Tarefas mortas
16 | Delete: Apagar
17 | DeleteAll: Eliminar todos
18 | Enqueued: Em espera
19 | Error: Erro
20 | ErrorBacktrace: Backtrace do Erro
21 | ErrorClass: Classe de Erro
22 | ErrorMessage: Mensagem de erro
23 | Failed: Falhados
24 | Failures: Falhas
25 | GoBack: ← Voltar
26 | History: Histórico
27 | Job: Tarefa
28 | Jobs: Tarefas
29 | LastRetry: Última Tentativa
30 | LivePoll: Live Poll
31 | MemoryUsage: Utilização de Memória
32 | Namespace: Namespace
33 | NextRetry: Próxima Tentativa
34 | NoDeadJobsFound: Não foram encontradas tarefas mortas
35 | NoRetriesFound: Não foram encontradas tentativas
36 | NoScheduledFound: Não foram encontradas tarefas agendadas
37 | OneMonth: 1 mês
38 | OneWeek: 1 semana
39 | OriginallyFailed: Falhou inicialmente
40 | PeakMemoryUsage: Pico de utilização de memória
41 | Processed: Processados
42 | Processes: Processos
43 | Queue: Fila
44 | Queues: Filas
45 | Realtime: Tempo real
46 | Retries: Tentativas
47 | RetryAll: Tentar tudo novamente
48 | RetryCount: Tentativas efectuadas
49 | RetryNow: Tentar novamente
50 | Scheduled: Agendados
51 | ScheduledJobs: Tarefas agendadas
52 | ShowAll: Mostrar todos
53 | SixMonths: 6 meses
54 | Size: Tamanho
55 | Started: Iniciados
56 | Status: Estado
57 | StopPolling: Desactivar Live Poll
58 | Thread: Thread
59 | Threads: Threads
60 | ThreeMonths: 3 meses
61 | Time: Tempo
62 | Uptime: Uptime (em dias)
63 | Version: Versão
64 | When: Quando
65 | Worker: Worker
66 | active: activo
67 | idle: livre
68 |
--------------------------------------------------------------------------------
/locales/ru.yml:
--------------------------------------------------------------------------------
1 | # elements like %{queue} are variables and should not be translated
2 | ru:
3 | Actions: Действия
4 | AddToQueue: Добавить в очередь
5 | AreYouSure: Вы уверены?
6 | AreYouSureDeleteJob: Вы уверены, что хотите удалить эту задачу?
7 | AreYouSureDeleteQueue: Вы уверены, что хотите удалить очередь %{queue}?
8 | Arguments: Аргументы
9 | BackToApp: Назад
10 | Busy: Занят
11 | Class: Класс
12 | Connections: Соединения
13 | CreatedAt: Создан
14 | CurrentMessagesInQueue: Текущие задачи в очереди %{queue}
15 | Dashboard: Панель управления
16 | Dead: Убито
17 | DeadJobs: Убитые задачи
18 | Delete: Удалить
19 | DeleteAll: Удалить все
20 | Enqueued: В очереди
21 | Error: Ошибка
22 | ErrorBacktrace: Трассировка ошибки
23 | ErrorClass: Класс ошибки
24 | ErrorMessage: Сообщение об ошибке
25 | Extras: Дополнительно
26 | Failed: Провалено
27 | Failures: Провалы
28 | GoBack: ← Назад
29 | History: История
30 | Job: Задача
31 | Jobs: Задачи
32 | Kill: Убиваем
33 | KillAll: Убить всё
34 | LastRetry: Последняя попытка
35 | Latency: Задержка
36 | LivePoll: Постоянный опрос
37 | MemoryUsage: Использование памяти
38 | Namespace: Пространство имен
39 | NextRetry: Следующая попытка
40 | NoDeadJobsFound: Нет убитых задач
41 | NoRetriesFound: Нет попыток
42 | NoScheduledFound: Нет запланированных задач
43 | NotYetEnqueued: Пока не в очереди
44 | OneMonth: 1 месяц
45 | OneWeek: 1 неделя
46 | OriginallyFailed: Первый провал
47 | Pause: Пауза
48 | Paused: Приостановлено
49 | PeakMemoryUsage: Максимальный расход памяти
50 | Plugins: Плагины
51 | PollingInterval: Интервал опроса
52 | Processed: Обработано
53 | Processes: Процессы
54 | Queue: Очередь
55 | Queues: Очереди
56 | Quiet: Отдыхать
57 | QuietAll: Отдыхать всем
58 | Realtime: Сейчас
59 | Retries: Попытки
60 | RetryAll: Повторить все
61 | RetryCount: Кол-во попыток
62 | RetryNow: Повторить сейчас
63 | Scheduled: Запланировано
64 | ScheduledJobs: Запланированные задачи
65 | ShowAll: Показать все
66 | SixMonths: 6 месяцев
67 | Size: Размер
68 | Started: Запущено
69 | Status: Статус
70 | Stop: Остановить
71 | StopAll: Остановить все
72 | StopPolling: Остановить опрос
73 | Thread: Поток
74 | Threads: Потоки
75 | ThreeMonths: 3 месяца
76 | Time: Время
77 | Unpause: Возобновить
78 | Uptime: Дня(ей) бесперебойной работы
79 | Version: Версия
80 | When: Когда
81 | Worker: Обработчик
82 | active: активен
83 | idle: отдыхает
84 |
--------------------------------------------------------------------------------
/locales/sv.yml:
--------------------------------------------------------------------------------
1 | # elements like %{queue} are variables and should not be translated
2 | sv:
3 | Actions: Åtgärder
4 | AddToQueue: Lägg till i kö
5 | AreYouSure: Är du säker?
6 | AreYouSureDeleteJob: Är du säker på att du vill ta bort detta jobb?
7 | AreYouSureDeleteQueue: Är du säker på att du vill ta bort kön %{queue}?
8 | Arguments: Argument
9 | Busy: Upptagen
10 | Class: Klass
11 | Connections: Anslutningar
12 | CurrentMessagesInQueue: Jobb i %{queue}
13 | Dashboard: Panel
14 | Dead: Död
15 | DeadJobs: Döda jobb
16 | Delete: Ta bort
17 | DeleteAll: Ta bort alla
18 | Enqueued: Köad
19 | Error: Fel
20 | ErrorBacktrace: Backtrace för fel
21 | ErrorClass: Felklass
22 | ErrorMessage: Felmeddelande
23 | Extras: Extra
24 | Failed: Misslyckad
25 | Failures: Failures
26 | GoBack: ← Bakåt
27 | History: Historik
28 | Job: Jobb
29 | Jobs: Jobb
30 | LastRetry: Senaste försök
31 | LivePoll: Live poll
32 | MemoryUsage: Minnesanvändning
33 | Namespace: Namnrymd
34 | NextRetry: Nästa försök
35 | NoDeadJobsFound: Inga döda jobb hittades
36 | NoRetriesFound: Inga försök hittades
37 | NoScheduledFound: Inga schemalagda jobb hittades
38 | OneMonth: 1 månad
39 | OneWeek: 1 vecka
40 | OriginallyFailed: Misslyckades ursprungligen
41 | PeakMemoryUsage: Minnesanvändning (peak)
42 | Processed: Processerad
43 | Processes: Processer
44 | Queue: Kö
45 | Queues: Köer
46 | Realtime: Realtid
47 | Retries: Försök
48 | RetryAll: Försök alla igen
49 | RetryCount: Antal försök
50 | RetryNow: Försök nu
51 | Scheduled: Schemalagd
52 | ScheduledJobs: Schemalagda jobb
53 | ShowAll: Visa alla
54 | SixMonths: 6 månader
55 | Size: Storlek
56 | Started: Startad
57 | Status: Status
58 | StopPolling: Stoppa polling
59 | Thread: Tråd
60 | Threads: Trådar
61 | ThreeMonths: 3 månader
62 | Time: Tid
63 | Uptime: Upptid (dagar)
64 | Version: Version
65 | When: När
66 | Worker: Worker
67 | active: aktiv
68 | idle: avvaktande
69 |
--------------------------------------------------------------------------------
/locales/ta.yml:
--------------------------------------------------------------------------------
1 | # elements like %{queue} are variables and should not be translated
2 | ta:
3 | Actions: செயல்கள்
4 | AddToQueue: வரிசையில் சேர்
5 | AreYouSure: நீங்கள் உறுதியாக இருக்கிறீர்களா?
6 | AreYouSureDeleteJob: நீ இந்த வேலையை நீக்க வேண்டும் என்று உறுதியாக இருக்கிறீர்களா?
7 | AreYouSureDeleteQueue: நீங்கள் %{queue} வரிசையில் நீக்க வேண்டும் என்பதில் உறுதியாக இருக்கிறீர்களா?
8 | Arguments: வாதங்கள்,
9 | Busy: பணிமிகுதி
10 | Class: வகுப்பு
11 | Connections: இணைப்புகள்
12 | CurrentMessagesInQueue: தற்போதைய வேலைகள் %{queue}
13 | Dashboard: டாஷ்போர்டு
14 | Dead: இறந்துபோன
15 | DeadJobs: டெட் வேலைகள்
16 | Delete: நீக்கு
17 | DeleteAll: அனைத்து நீக்கு
18 | Enqueued: வரிசைப்படுத்தப்பட்டவை
19 | Error: பிழை
20 | ErrorBacktrace: பிழை பின்தேடுலை
21 | ErrorClass: பிழை வகுப்பு
22 | ErrorMessage: பிழை செய்தி
23 | Extras: உபரி
24 | Failed: தோல்வி
25 | Failures: தோல்விகள்
26 | GoBack: பின்புறம்
27 | History: வரலாறு
28 | Job: வேலை
29 | Jobs: வேலை வாய்ப்புகள்
30 | Kill: கொல்
31 | LastRetry: கடைசியாக, மீண்டும் முயற்சிக்கவும்
32 | LivePoll: நேரடி கணிப்பு
33 | MemoryUsage: நினைவக பயன்பாடு
34 | Namespace: பெயர்வெளி
35 | NextRetry: அடுத்த, மீண்டும் முயற்சிக்கவும்
36 | NoDeadJobsFound: இறந்த வேலை எதுவும் இல்லை
37 | NoRetriesFound: இல்லை மீண்டும் காணப்படவில்லை
38 | NoScheduledFound: திட்டமிட்ட வேலைகள் காணப்படவில்லை
39 | OneMonth: 1 மாதம்
40 | OneWeek: 1 வாரம்
41 | OriginallyFailed: முதலில் தோல்வி
42 | Paused: தற்காலிக பணிநிறுத்தம்
43 | PeakMemoryUsage: உச்ச நினைவக பயன்பாடு
44 | PollingInterval: வாக்குப்பதிவு இடைவெளி
45 | Processed: நிறையுற்றது
46 | Processes: செயல்முறைகள்
47 | Queue: வரிசை
48 | Queues: வரிசை
49 | Quiet: அமைதியான
50 | QuietAll: அமைதியான அனைத்து
51 | Realtime: நேரலை
52 | Retries: மீண்டும் முயற்சிக்க,
53 | RetryAll: அனைத்து, மீண்டும் முயற்சிக்கவும்
54 | RetryCount: கணிப்பீடு, மீண்டும் முயற்சிக்கவும்
55 | RetryNow: இப்போது மீண்டும் முயற்சி செய்க
56 | Scheduled: திட்டமிடப்பட்ட
57 | ScheduledJobs: திட்டமிட்ட வேலைகள்
58 | ShowAll: அனைத்து காட்டு
59 | SixMonths: 6 மாதங்கள்
60 | Size: அளவு
61 | Started: தொடங்குதல்
62 | Status: நிலைமை
63 | Stop: நிறுத்து
64 | StopAll: நிறுத்து அனைத்து
65 | StopPolling: நிறுத்து வாக்குப்பதிவு
66 | Thread: நூல்
67 | Threads: நூல்கள்
68 | ThreeMonths: 3 மாதங்கள்
69 | Time: நேரம்
70 | Uptime: இயக்க நேரம் (நாட்கள்)
71 | Version: பதிப்பு
72 | When: எப்பொழுது?
73 | Worker: பணியாளர்
74 | active: செயலில்
75 | idle: முடங்கு நேரம்
76 |
--------------------------------------------------------------------------------
/locales/uk.yml:
--------------------------------------------------------------------------------
1 | # elements like %{queue} are variables and should not be translated
2 | uk:
3 | Actions: Дії
4 | AddToQueue: Додати до черги
5 | AreYouSure: Ви впевнені?
6 | AreYouSureDeleteJob: Ви впевнені у тому, що хочете видалити задачу?
7 | AreYouSureDeleteQueue: Ви впевнені у тому, що хочете видалити чергу %{queue}?
8 | Arguments: Аргументи
9 | Busy: Зайнятих
10 | Class: Клас
11 | Connections: З'єднань
12 | CurrentMessagesInQueue: Поточні задачі у черзі %{queue}
13 | Dashboard: Панель керування
14 | Dead: Вбитих
15 | DeadJobs: Вбиті задачі
16 | Delete: Видалити
17 | DeleteAll: Видалити усі
18 | Enqueued: У черзі
19 | Error: Помилка
20 | ErrorBacktrace: Трасування помилки
21 | ErrorClass: Клас помилки
22 | ErrorMessage: Повідомлення про помилку
23 | Extras: Додатково
24 | Failed: Невдалих
25 | Failures: Невдачі
26 | GoBack: ← Назад
27 | History: Історія
28 | Job: Задача
29 | Jobs: Задачі
30 | Kill: Вбиваємо
31 | LastRetry: Остання спроба
32 | LivePoll: Постійне опитування
33 | MemoryUsage: Використання пам'яті
34 | Namespace: Простір імен
35 | NextRetry: Наступна спроба
36 | NoDeadJobsFound: Вбитих задач не знайдено
37 | NoRetriesFound: Спроб не знайдено
38 | NoScheduledFound: Запланованих задач не знайдено
39 | NotYetEnqueued: Ще не в черзі
40 | OneMonth: 1 місяць
41 | OneWeek: 1 тиждень
42 | OriginallyFailed: Перша невдала спроба
43 | Paused: Призупинено
44 | PeakMemoryUsage: Максимальне використання пам'яті
45 | Plugins: Плагіни
46 | PollingInterval: Інтервал опитування
47 | Processed: Опрацьовано
48 | Processes: Процеси
49 | Queue: Черга
50 | Queues: Черги
51 | Quiet: Призупинити
52 | QuietAll: Призупинити усі
53 | Realtime: Зараз
54 | Retries: Спроби
55 | RetryAll: Повторити усі
56 | RetryCount: Кількість спроб
57 | RetryNow: Повторити зараз
58 | Scheduled: Заплановано
59 | ScheduledJobs: Заплановані задачі
60 | ShowAll: Відобразити усі
61 | SixMonths: 6 місяців
62 | Size: Розмір
63 | Started: Запущено
64 | Status: Статус
65 | Stop: Зупинити
66 | StopAll: Зупинити усі
67 | StopPolling: Зупинити опитування
68 | Thread: Потік
69 | Threads: Потоки
70 | ThreeMonths: 3 місяці
71 | Time: Час
72 | Uptime: Днів безперебійної роботи
73 | Version: Версія
74 | When: Коли
75 | Worker: Обробник
76 | active: активний
77 | idle: незайнятий
78 |
--------------------------------------------------------------------------------
/locales/ur.yml:
--------------------------------------------------------------------------------
1 | # elements like %{queue} are variables and should not be translated
2 | ur:
3 | Actions: ﻋﻮاﻣﻞ
4 | AddToQueue: ﻗﻄﺎﺭ ميں شامل کريں
5 | AreYouSure: کيا یقین ؟
6 | AreYouSureDeleteJob: کيا آپ یقین جاب حتم کرنا چاھتے ہيں ؟
7 | AreYouSureDeleteQueue: کيا آپ یقین قطار حتم کرنا چاھتے ہيں ؟
8 | Arguments: دلائل
9 | BackToApp: ﻭاپﺱ صفحۂ اﻭﻝ پر
10 | Busy: مصروف
11 | Class: کلاس
12 | Connections: کنکشنز
13 | CreatedAt: ﺗﺎﺭﻳﺢ آﻏﺎﺯ
14 | CurrentMessagesInQueue: قطار ميں موجود تمام پيغامات %{queue}
15 | Dashboard: صفحۂ اول
16 | Dead: ختم شدہ
17 | DeadJobs: ختم شدہ جاب
18 | Delete: ﺣﺬﻑ
19 | DeleteAll: ﺗﻤﺎﻡ ﺣﺬﻑ کر ديں
20 | Enqueued: قطار ميں شامل
21 | Error: مسئلہ
22 | ErrorBacktrace: مسئلہ کی کی تحقیقات کريں
23 | ErrorClass: مسئلہ کی کلاس
24 | ErrorMessage: مسئلہ کی وجہ
25 | Extras: اﺻﺎﻑی
26 | Failed: ﻧﺎکاﻡ ﺷﺪﮦ
27 | Failures: ناکامیاں
28 | GoBack: واپس جايں
29 | History: ﺗﺎﺭﻳﺦ
30 | Job: جاب
31 | Jobs: جابز
32 | Kill: ختم کرديں
33 | LastRetry: گزشتہ کوشش
34 | LivePoll: ﺑﺮاﮦ ﺭاﺳﺖ
35 | MemoryUsage: یاداشت کا استعمال
36 | Namespace: Namespace
37 | NextRetry: اگلی کﻭﺷﻴﺶ
38 | NoDeadJobsFound: کویٔ ختم شدہ جاب نہيی ملی
39 | NoRetriesFound: کویٔ ﺩﻭﺑﺎﺭﮦ کﻭﺷﻴﺶ نھيں ملی
40 | NoScheduledFound: کویٔ ﻁےﺷﺪﮦچيز نہیں ملی
41 | NotYetEnqueued: ﻗﺘﺎﺭميں شامل نھيں
42 | OneMonth: ایک مہینہ
43 | OneWeek: ایک ہفتہ
44 | OriginallyFailed: ابتادائ ناکامی
45 | Paused: موقوف
46 | PeakMemoryUsage: سب سے زيادہ یاداشت کا استعمال
47 | Plugins: پلگ انز
48 | PollingInterval: ﺑﺮاﮦ ﺭاﺳﺖ کا ﺩﻭﺭاﻧﻴﮧ
49 | Processed: مکمل شدہ
50 | Processes: ﻋﻤﻠﻴﺎﺕ
51 | Queue: قطار
52 | Queues: قطاريں
53 | Quiet: ﺣﺘﻢ کﺭﻭ
54 | QuietAll: ﺗﻤﺎﻡ ﺣﺘﻢ کﺭﻭ
55 | Realtime: ﺑﺮاﮦ ﺭاﺳﺖ
56 | Retries: ﺩﻭﺑﺎﺭﮦ کﻭﺷﻴﺶ
57 | RetryAll: ﺗﻤﺎﻡ کی ﺩﻭﺑﺎﺭﮦ کﻭﺷﻴﺶ کﺭيں
58 | RetryCount: دوبارہ کوشش کا مکمل شمار
59 | RetryNow: ابھی دوبارہ کوشش
60 | Scheduled: ﻁےﺷﺪﮦ
61 | ScheduledJobs: ﻁےﺷﺪﮦجاب
62 | ShowAll: سارے دکھاو
63 | SixMonths: چھ ماہ
64 | Size: ﺣﺠﻢ
65 | Started: شروع
66 | Status: اسٹیٹس
67 | Stop: بند کرو
68 | StopAll: ﺗﻤﺎﻡ ﺑﻨﺪ کﺭﻭ
69 | StopPolling: ﺑﺮاﮦ ﺭاﺳﺖ روکيے
70 | TextDirection: 'rtl'
71 | Thread: موضوع
72 | Threads: موضوع
73 | ThreeMonths: تین ماہ
74 | Time: ﻭﻗﺖ
75 | Uptime: اپ ٹائم
76 | Version: ورژن
77 | When: ﺏک
78 | Worker: ورکر
79 | active: فعال
80 | idle: بیکار
81 |
--------------------------------------------------------------------------------
/locales/vi.yml:
--------------------------------------------------------------------------------
1 | # elements like %{queue} are variables and should not be translated
2 | vi:
3 | Actions: Những hành động
4 | AddToQueue: Thêm vào hàng đợi
5 | AreYouSure: Bạn chắc chứ?
6 | AreYouSureDeleteJob: Bạn có chắc là muốn xóa tác vụ này?
7 | AreYouSureDeleteQueue: Bạn có chắc là muốn xóa %{queue} này?
8 | Arguments: Tham số
9 | BackToApp: Trở về ứng dụng
10 | Busy: Bận rộn
11 | Class: Lớp
12 | Connections: Các kết nối
13 | CreatedAt: Được tạo vào lúc
14 | CurrentMessagesInQueue: Số lượng công việc trong %{queue}
15 | Dashboard: Bảng điều khiển
16 | Dead: Chết
17 | DeadJobs: Những tác vụ đã chết
18 | Delete: Xóa
19 | DeleteAll: Xóa hết
20 | Enqueued: Đã xếp hàng đợi
21 | Error: Lỗi
22 | ErrorBacktrace: Dấu vết của lỗi
23 | ErrorClass: Lớp lỗi
24 | ErrorMessage: Tin nhắn lỗi
25 | Extras: Thêm
26 | Failed: Đã thất bại
27 | Failures: Các thất bại
28 | GoBack: ← Trở lại
29 | History: Lịch sử
30 | Job: Tác vụ
31 | Jobs: Các tác vụ
32 | Kill: Giết
33 | KillAll: Giết hết
34 | LastRetry: Lần thử cuối
35 | Latency: Độ trễ
36 | LivePoll: Thăm dò trực tiếp
37 | MemoryUsage: Lượng bộ nhớ sử dụng
38 | Namespace: Không gian tên
39 | NextRetry: Lần thử lại tiếp theo
40 | NoDeadJobsFound: Không có tác vụ đã chết nào được tìm thấy
41 | NoRetriesFound: Không có lần thử nào được tìm thấy
42 | NoScheduledFound: Không có tác vụ đã lên lịch nào được tìm thấy
43 | NotYetEnqueued: Chưa được bỏ vào hàng đợi
44 | OneMonth: 1 tháng
45 | OneWeek: 1 tuần
46 | OriginallyFailed: Đã thất bại từ đầu
47 | Pause: Tạm dừng
48 | Paused: Đã tạm dừng
49 | PeakMemoryUsage: Lượng bộ nhớ sử dụng đỉnh điểm
50 | Plugins: Hệ thống đính kèm
51 | PollingInterval: Khoảng thời gian giữa các lần thăm dò
52 | Processed: Đã xử lí
53 | Processes: Tiến trình xử lí
54 | Queue: Hàng đợi
55 | Queues: Các hàng đợi
56 | Quiet: Im lặng
57 | QuietAll: Làm cho tất cả im lặng
58 | Realtime: Thời gian thực
59 | Retries: Số lần thử
60 | RetryAll: Thử lại tất cả
61 | RetryCount: Số lần thử lại
62 | RetryNow: Thử lại ngay bây giờ
63 | Scheduled: Đã lên lịch
64 | ScheduledJobs: Những Tác Vụ Được Hẹn
65 | ShowAll: Hiện tất cả
66 | SixMonths: 6 tháng
67 | Size: Kích thước
68 | Started: Đã bắt đầu
69 | Status: Trạng thái
70 | Stop: Dừng Lại
71 | StopAll: Dừng lại tất cả
72 | StopPolling: Ngừng thăm dò
73 | Thread: Luồng xử lí
74 | Threads: Những luồng xử lí
75 | ThreeMonths: 3 tháng
76 | Time: Thời gian
77 | Unpause: Hủy tạm dừng
78 | Uptime: Thời gian hệ thống đã online (days)
79 | Version: Phiên bản
80 | When: Khi nào
81 | Worker: Máy xử lí
82 | active: Đang hoạt động
83 | idle: Đang chờ
84 |
--------------------------------------------------------------------------------
/locales/zh-cn.yml:
--------------------------------------------------------------------------------
1 | # elements like %{queue} are variables and should not be translated
2 | zh-cn: # <---- change this to your locale code
3 | Dashboard: 信息板
4 | Status: 状态
5 | Time: 时间
6 | Namespace: 命名空间
7 | Realtime: 实时
8 | History: 历史记录
9 | Busy: 执行中
10 | Utilization: 利用率
11 | Processed: 已处理
12 | Failed: 已失败
13 | Scheduled: 已计划
14 | Retries: 重试
15 | Enqueued: 已进入队列
16 | Worker: 工人
17 | LivePoll: 实时轮询
18 | StopPolling: 停止轮询
19 | Queue: 队列
20 | Class: 类别
21 | Job: 任务
22 | Arguments: 参数
23 | Extras: 额外的
24 | Started: 已开始
25 | ShowAll: 显示全部
26 | CurrentMessagesInQueue: 目前在%{queue}的任务
27 | Delete: 删除
28 | AddToQueue: 添加至队列
29 | AreYouSureDeleteJob: 你确定要删除这个任务么?
30 | AreYouSureDeleteQueue: 你确定要删除%{queue}这个队列?
31 | Queues: 队列
32 | Size: 容量
33 | Actions: 动作
34 | NextRetry: 下次重试
35 | RetryCount: 重试次数
36 | RetryNow: 现在重试
37 | Kill: 终止
38 | LastRetry: 上次重试
39 | OriginallyFailed: 首次失败
40 | AreYouSure: 你确定?
41 | DeleteAll: 全部删除
42 | RetryAll: 全部重试
43 | KillAll: 全部终止
44 | NoRetriesFound: 没有发现可重试
45 | Error: 错误
46 | ErrorClass: 错误类别
47 | ErrorMessage: 错误消息
48 | ErrorBacktrace: 错误细节
49 | GoBack: ← 返回
50 | NoScheduledFound: 没有发现计划任务
51 | When: 当
52 | ScheduledJobs: 计划任务
53 | idle: 闲置
54 | active: 活动中
55 | Version: 版本
56 | Connections: 连接
57 | MemoryUsage: 内存占用
58 | PeakMemoryUsage: 内存占用峰值
59 | Uptime: 上线时间 (天数)
60 | OneWeek: 一周
61 | OneMonth: 一个月
62 | ThreeMonths: 三个月
63 | SixMonths: 六个月
64 | Failures: 失败
65 | DeadJobs: 已停滞任务
66 | NoDeadJobsFound: 没有发现任何已停滞的任务
67 | Dead: 已停滞
68 | Process: 进程
69 | Processes: 进程
70 | Name: 名称
71 | Thread: 线程
72 | Threads: 线程
73 | Jobs: 任务
74 | Paused: 已暂停
75 | Stop: 强制暂停
76 | Quiet: 暂停
77 | StopAll: 全部强制暂停
78 | QuietAll: 全部暂停
79 | PollingInterval: 轮询周期
80 | Plugins: 插件
81 | NotYetEnqueued: 尚未进入队列
82 | CreatedAt: 建立时间
83 | BackToApp: 回首頁
84 | Latency: 延迟
85 | Pause: 暂停
86 | Unpause: 取消暂停
87 | Metrics: 指标
88 | NoDataFound: 无数据
89 | TotalExecutionTime: 总执行时间
90 | AvgExecutionTime: 平均执行时间
91 | Context: 上下文
92 | Bucket: 桶
93 | NoJobMetricsFound: 无任务相关指标数据
94 | Success: 成功
95 | Failure: 失败
96 |
--------------------------------------------------------------------------------
/locales/zh-tw.yml:
--------------------------------------------------------------------------------
1 | # elements like %{queue} are variables and should not be translated
2 | zh-tw: # <---- change this to your locale code
3 | Dashboard: 資訊主頁
4 | Status: 狀態
5 | Time: 時間
6 | Namespace: 命名空間
7 | Realtime: 即時
8 | History: 歷史資料
9 | Busy: 忙碌
10 | Utilization: 使用率
11 | Processed: 已處理
12 | Failed: 已失敗
13 | Scheduled: 已排程
14 | Retries: 重試
15 | Enqueued: 已佇列
16 | Worker: 工人
17 | LivePoll: 即時輪詢
18 | StopPolling: 停止輪詢
19 | Queue: 佇列
20 | Class: 類別
21 | Job: 工作
22 | Arguments: 參數
23 | Extras: 額外的
24 | Started: 已開始
25 | ShowAll: 顯示全部
26 | CurrentMessagesInQueue: 目前在%{queue}的工作
27 | Delete: 刪除
28 | AddToQueue: 增加至佇列
29 | AreYouSureDeleteJob: 確定要刪除這個工作嗎?
30 | AreYouSureDeleteQueue: 確定要刪除%{queue}佇列?這會刪除佇列裡的所有工作,佇列將會在有新工作時重新出現。
31 | Queues: 佇列
32 | Size: 容量
33 | Actions: 動作
34 | NextRetry: 下次重試
35 | RetryCount: 重試次數
36 | RetryNow: 馬上重試
37 | Kill: 取消
38 | LastRetry: 最後一次重試
39 | OriginallyFailed: 原本已失敗
40 | AreYouSure: 你確定?
41 | DeleteAll: 全部刪除
42 | RetryAll: 全部重試
43 | KillAll: 全部取消
44 | NoRetriesFound: 找無可重試的工作
45 | Error: 錯誤
46 | ErrorBacktrace: 錯誤的回調追踨
47 | ErrorClass: 錯誤類別
48 | ErrorMessage: 錯誤訊息
49 | ErrorBacktrace: 詳細錯誤訊息
50 | GoBack: ← 返回
51 | NoScheduledFound: 找無已排程的工作
52 | When: 當
53 | ScheduledJobs: 已排程的工作
54 | idle: 閒置
55 | active: 活動中
56 | Version: 版本
57 | Connections: 連線
58 | MemoryUsage: 記憶體使用量
59 | PeakMemoryUsage: 尖峰記憶體使用量
60 | Uptime: 上線時間 (天數)
61 | OneWeek: 一週
62 | OneMonth: 一個月
63 | ThreeMonths: 三個月
64 | SixMonths: 六個月
65 | Failures: 失敗
66 | GoBack: ← 返回
67 | History: 歷史資料
68 | Job: 工作
69 | Jobs: 工作
70 | LastRetry: 最後一次重試
71 | LivePoll: 即時輪詢
72 | MemoryUsage: 記憶體使用量
73 | Namespace: 命名空間
74 | NextRetry: 下次重試
75 | NoDeadJobsFound: 沒有發現任何停滯的工作
76 | Dead: 停滯
77 | Process: 程序
78 | Processes: 處理中
79 | Name: 名稱
80 | Thread: 執行緒
81 | Threads: 執行緒
82 | Jobs: 工作
83 | Paused: 已暫停
84 | Stop: 強制暫停
85 | Quiet: 暫停
86 | StopAll: 全部強制暫停
87 | QuietAll: 全部暫停
88 | PollingInterval: 輪詢週期
89 | Plugins: 套件
90 | NotYetEnqueued: 尚未進入佇列
91 | CreatedAt: 建立時間
92 | BackToApp: 回首頁
93 | Latency: 延時
94 | Pause: 暫停
95 | Unpause: 取消暫停
96 | Metrics: 計量
97 | NoDataFound: 找無資料
98 | TotalExecutionTime: 總執行時間
99 | AvgExecutionTime: 平均執行時間
100 | Context: 上下文
101 | Bucket: 桶
102 | NoJobMetricsFound: 找無工作相關計量資料
103 |
--------------------------------------------------------------------------------
/misc/ui.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mperham/kuiq/9be3a114b80a261d7abe37a5c1e63ad1a088512b/misc/ui.png
--------------------------------------------------------------------------------
/test/test_helper.rb:
--------------------------------------------------------------------------------
1 | # frozen_string_literal: true
2 |
3 | $LOAD_PATH.unshift File.expand_path("../lib", __dir__)
4 | require "kuiq"
5 |
6 | require "minitest/autorun"
7 |
--------------------------------------------------------------------------------
/test/test_kuiq.rb:
--------------------------------------------------------------------------------
1 | # frozen_string_literal: true
2 |
3 | require "test_helper"
4 |
5 | class TestKuiq < Minitest::Test
6 | def test_that_it_has_a_version_number
7 | refute_nil ::Kuiq::VERSION
8 | end
9 | end
10 |
--------------------------------------------------------------------------------