├── .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 | ![ui.png](misc/ui.png) 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 | --------------------------------------------------------------------------------