foreman-tasks 8.0.1 → 8.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. checksums.yaml +4 -4
  2. data/.tx/config +3 -1
  3. data/app/assets/javascripts/foreman-tasks/locale/de/foreman_tasks.js +1 -0
  4. data/app/assets/javascripts/foreman-tasks/locale/en/foreman_tasks.js +1 -0
  5. data/app/assets/javascripts/foreman-tasks/locale/es/foreman_tasks.js +1 -0
  6. data/app/assets/javascripts/foreman-tasks/locale/fr/foreman_tasks.js +1 -0
  7. data/app/assets/javascripts/foreman-tasks/locale/ja/foreman_tasks.js +1 -0
  8. data/app/assets/javascripts/foreman-tasks/locale/ka/foreman_tasks.js +1 -0
  9. data/app/assets/javascripts/foreman-tasks/locale/ko/foreman_tasks.js +1 -0
  10. data/app/assets/javascripts/foreman-tasks/locale/pt_BR/foreman_tasks.js +1 -0
  11. data/app/assets/javascripts/foreman-tasks/locale/ru/foreman_tasks.js +1 -0
  12. data/app/assets/javascripts/foreman-tasks/locale/zh_CN/foreman_tasks.js +1 -0
  13. data/app/assets/javascripts/foreman-tasks/locale/zh_TW/foreman_tasks.js +1 -0
  14. data/app/lib/actions/check_long_running_tasks.rb +45 -0
  15. data/app/lib/actions/deliver_long_running_tasks_notification.rb +22 -0
  16. data/app/mailers/tasks_mailer.rb +12 -0
  17. data/app/models/foreman_tasks/tasks_mail_notification.rb +9 -0
  18. data/app/services/ui_notifications/tasks/tasks_running_long.rb +33 -0
  19. data/app/views/tasks_mailer/long_tasks.html.erb +29 -0
  20. data/app/views/tasks_mailer/long_tasks.text.erb +16 -0
  21. data/db/seeds.d/30-notification_blueprints.rb +7 -0
  22. data/db/seeds.d/95-mail_notifications.rb +24 -0
  23. data/lib/foreman_tasks/engine.rb +2 -1
  24. data/lib/foreman_tasks/tasks/reschedule_long_running_tasks_checker.rake +21 -0
  25. data/lib/foreman_tasks/version.rb +1 -1
  26. data/lib/foreman_tasks.rb +16 -0
  27. data/locale/Makefile +6 -3
  28. data/locale/action_names.rb +1 -1
  29. data/locale/de/LC_MESSAGES/foreman_tasks.mo +0 -0
  30. data/locale/de/foreman_tasks.po +14 -14
  31. data/locale/en/LC_MESSAGES/foreman_tasks.mo +0 -0
  32. data/locale/en/foreman_tasks.po +9 -9
  33. data/locale/es/LC_MESSAGES/foreman_tasks.mo +0 -0
  34. data/locale/es/foreman_tasks.po +29 -29
  35. data/locale/foreman_tasks.pot +25 -25
  36. data/locale/fr/LC_MESSAGES/foreman_tasks.mo +0 -0
  37. data/locale/fr/foreman_tasks.po +4 -4
  38. data/locale/ja/LC_MESSAGES/foreman_tasks.mo +0 -0
  39. data/locale/ja/foreman_tasks.po +24 -24
  40. data/locale/ka/LC_MESSAGES/foreman_tasks.mo +0 -0
  41. data/locale/ka/foreman_tasks.po +12 -10
  42. data/locale/ko/LC_MESSAGES/foreman_tasks.mo +0 -0
  43. data/locale/ko/foreman_tasks.po +4 -4
  44. data/locale/pt_BR/LC_MESSAGES/foreman_tasks.mo +0 -0
  45. data/locale/pt_BR/foreman_tasks.po +4 -4
  46. data/locale/ru/LC_MESSAGES/foreman_tasks.mo +0 -0
  47. data/locale/ru/foreman_tasks.po +4 -4
  48. data/locale/zh_CN/LC_MESSAGES/foreman_tasks.mo +0 -0
  49. data/locale/zh_CN/foreman_tasks.po +4 -4
  50. data/locale/zh_TW/LC_MESSAGES/foreman_tasks.mo +0 -0
  51. data/locale/zh_TW/foreman_tasks.po +4 -4
  52. metadata +23 -3
@@ -0,0 +1 @@
1
+ locales['foreman_tasks'] = locales['foreman_tasks'] || {}; locales['foreman_tasks']['zh_CN'] = {"domain":"foreman_tasks","locale_data":{"foreman_tasks":{"":{"Project-Id-Version":"foreman_tasks 8.0.1","Report-Msgid-Bugs-To":"","POT-Creation-Date":"2023-05-18 08:15+0000","PO-Revision-Date":"2016-02-12 14:04+0000","Last-Translator":"FULL NAME <EMAIL@ADDRESS>","Language-Team":"Chinese (China) (http://app.transifex.com/foreman/foreman/language/zh_CN/)","MIME-Version":"1.0","Content-Type":"text/plain; charset=UTF-8","Content-Transfer-Encoding":"8bit","Language":"zh_CN","Plural-Forms":"nplurals=1; plural=0;","lang":"zh_CN","domain":"foreman_tasks","plural_forms":"nplurals=1; plural=0;"},"List recurring logics":["列出重复逻辑"],"Show recurring logic details":["显示重复逻辑详情"],"Update recurring logic":["更新周期性逻辑"],"Cancel recurring logic":["取消重复逻辑"],"Delete recurring logics by search query":["通过搜索查询删除重复逻辑"],"Search query":["搜索查询"],"Please provide a search parameter in the request":["请在请求中提供搜索参数"],"Resume all paused error tasks":["恢复所有暂停的错误任务"],"Resume tasks matching search string":["恢复与搜索字符串匹配的任务"],"Resume specific tasks by ID":["根据 ID 恢复特定任务"],"Cancel selected cancellable tasks":["取消所选的可取消的任务"],"Cancel tasks matching search string":["取消与搜索字符串匹配的任务"],"Cancel specific tasks by ID":["根据 ID 取消特定任务"],"Please provide at least one of search or task_ids parameters in the request":["请在请求中至少提供 search 或 task_ids 参数之一"],"Stop selected stoppable tasks":["停止所选的可停止的任务"],"Stop tasks matching search string":["停止与搜索字符串匹配的任务"],"Stop specific tasks by ID":["停止通过 ID 指定的特定任务"],"List tasks":["列出任务"],"UUID of the task":["任务的 UUID"],"The ID of the step inside the execution plan to send the event to":["执行计划中的步骤 ID 要发送事件到"],"Data to be sent to the action":["发送到操作的数据"],"Send data to the task from external executor (such as smart_proxy_dynflow)":["从外部执行者发送到的任务(例如 smart_proxy_dynflow)"],"User search_params requires user_id to be specified":["使用者 search_params 需要指定 user_id"],"Resource search_params requires resource_type and resource_id to be specified":["资源 search_params 需要指定 resource_type 和 resource_id"],"Task search_params requires task_id to be specified":["任务 search_params 需要指定 task_id"],"Type %s for search_params is not supported":["search_params 的 类型 %s 不被支持"],"The recurring logic was enabled.":["重复逻辑已启用。"],"The recurring logic was disabled.":["重复逻辑已被禁用。"],"Trying to abort the task":["尝试中止任务"],"The task cannot be aborted at the moment.":["目前无法中止任务。"],"Enable":["启用"],"Disable":["禁用"],"Cancel":["取消"],"Tasks":["任务"],"Sub tasks":["子任务"],"Start at":["开始于"],"Start before":["在此时间前开始"],"Indicates that the action should be cancelled if it cannot be started before this time.":["这代表,如果操作无法在这个时间前开始则操作应该被取消。"],"Repeats":["重复"],"Purpose":["目的"],"A special label for tracking a recurring job. There can be only one active job with a given purpose at a time.":["用于跟踪周期性作业的特殊标签。一次只能有一个具有给定目的的活跃作业。"],"is minute (range: 0-59)":["分钟(范围:0-59)"],"is hour (range: 0-23)":["小时(范围:0-23)"],"is day of month (range: 1-31)":["日期(范围:1-31)"],"is month (range: 1-12)":["月份(范围:1-12)"],"is day of week (range: 0-6)":["星期几(范围:0-6)"],"Cron line format 'a b c d e', where: %s":["Cron 行格式 'a b c d e',其中:%s"],"Cron line":["Cron 行"],"Days":["天"],"Days of week":["星期几"],"Mon":["周一"],"Tue":["周二"],"Wed":["周三"],"Thu":["周四"],"Fri":["周五"],"Sat":["周六"],"Sun":["周日"],"At":["位于"],"Repeat N times":["重复 N 次"],"Ends":["结束"],"Never":["决不"],"On":["上"],"Ends at":["结束于"],"Unlimited":["无限制"],"%{total} task(s), %{success} success, %{failed} fail":["%{total} 任务),%{success}成功,%{failed}失败"],"Bulk action":["批量操作"],"Empty bulk action":["清空批次動作"],"The targets are of different types":["目标为不同的类型"],"Import facts":["导入事实"],"Import Puppet classes":["导入 Puppet 类"],"activation key":["激活码"],"user":["用户"],"repository":["软件仓库"],"content view version":["内容视图版本"],"content view":["内容视图"],"product":["产品"],"system":["系統"],"organization":["机构"],"Failed to initialize":["初始化失败"],"No proxy defined for execution":["没有为执行定义代理"],"All proxies with the required feature are unavailable at the moment":["具备所需功能的所有代理暂时都不可用"],"Changing request id %{request_id} to saved id %{saved_id}":["将请求 id %{request_id} 改为保存的 id %{saved_id}"],"Failed to check on tasks on proxy at %{url}: %{exception}":["无法检查在 %{url} 代理中的任务: %{exception}"],"The smart proxy task %s failed.":["智能代理任务 %s 失败。"],"Cancel enforced: the task might be still running on the proxy":["强制取消:任务可能仍在代理服务器上运行"],"Task aborted: the task might be still running on the proxy":["被中止的任务:该任务可能仍在代理服务器中运行"],"Event delivered by request %{request_id}":["由请求 %{request_id} 发送的事件"],"Proxy task gone missing from the smart proxy":["代理任务在智能代理中丢失"],"Failed to trigger task on the smart proxy: ":["在智能代理中触发任务失败: "],"Initialization error: %s":["初始化错误:%s"],"Required lock is already taken by other running tasks.":["所需的锁定已由其他正在运行的任务获取。"],"Please inspect their state, fix their errors and resume them.":["请检查其状态,纠正其错误,然后恢复它们。"],"Conflicts with tasks:":["与任务冲突 :"],"Active":["活跃"],"Cancelled":["已取消"],"Finished":["完成"],"Disabled":["禁用"],"N/A":["不适用"],"Cannot update a cancelled Recurring Logic.":["无法更新一个已取消的周期性逻辑"],"Delayed":["延迟"],"Immediate":["立即"],"Recurring logic":["重复逻辑"],"%{value} is not allowed triggering mode":["%{value} 不允许触发模式"],"%{value} is not allowed input type":["%{value} 不允许输入类型"],"%{value} is wrong format":["%{value} 格式错误"],"mode has to be one of %{allowed_modes}":["模式必须是 %{allowed_modes} 之一"],"is not a valid format":["不是有效格式"],"No task could be started":["无法启动任何任务"],"Active or disabled recurring logic with purpose %s already exists":["带有目的 %s 的活跃或禁用的周期性逻辑已存在"],"%s is not valid format of cron line":["%s 不是正确的 cron 行"],"The task could not be started":["无法启动该任务"],"A paused task represents a process that has not finished properly. Any task in paused state can lead to potential inconsistency and needs to be resolved.":["暂停的任务代表未正确完成的进程。任何处于暂停状态的任务都可能导致潜在的不一致,需要被解决。"],"The recommended approach is to investigate the error messages below and in 'errors' tab, address the primary cause of the issue and resume the task.":["推荐的方法是调查下面和“错误”选项卡中的错误消息,解决造成问题的主要原因,然后继续执行任务。"],"troubleshooting documentation":["故障排除文档"],"See %{link} for more details on how to resolve the issue":["有关如何解决此问题的更多详细信息,请参见%{link}"],"There is %{count} paused task in the system that need attention":["系统中有%{count}个暂停的任务需要注意"],"Schedule":["调度"],"Execute now":["立即执行"],"Schedule future execution":["调度未来的执行"],"Set up recurring execution":["设置重复逻辑"],"Recurring logics":["重复逻辑"],"Clear Cancelled":["清除取消"],"This action will delete all cancelled recurring logics. Please note that this action can't be reversed.":["此操作将删除所有取消的重复逻辑。请注意,此操作无法撤消。"],"ID":["ID"],"Task count":["任务计数"],"Action":["操作"],"Last occurrence":["最后一次发生"],"Next occurrence":["下次发生"],"Current iteration":["現有重述"],"Iteration limit":["重述限制"],"Repeat until":["重复直到"],"State":["状态"],"Details":["详情"],"Task group common":["任务组一般事项"],"Associated resources":["相关的资源"],"Latest Warning/Error Tasks":["最新的警告/错误任务"],"Name":["名称"],"Result":["结果"],"Started":["已启动"],"Task Status":["任务状态"],"No. of Tasks":["任务号"],"Last start time":["最后的开始时间"],"Details of %s task":["%s 任务的详细信息"],"List of tasks":["任务清单"],"Task Details":["任务详情"],"Back to tasks":["返回到任务"],"Foreman Tasks":["Foreman 任务"],"Recurring Logics":["重复逻辑"],"Number of seconds to wait for synchronous task to finish.":["等待同步任务完成的秒数。"],"Sync task timeout":["同步任务超时"],"Enable the dynflow console (/foreman_tasks/dynflow) for debugging":["启用 dynflow 控制台(/foreman_tasks/dynflow)用于故障排除"],"Enable dynflow console":["启用 dynflow 控制台"],"Require user to be authenticated as user with admin rights when accessing dynflow console":["存取 dynflow 主控台時,需要使用者授權成為擁有 admin 權限的使用者"],"Require auth for dynflow console":["dynflow 控制台需要验证"],"Number of attempts to start a task on the smart proxy before failing":["失败前在智能代理上尝试启动一个任务的次数"],"Proxy action retry count":["代理操作重试计数"],"Time in seconds between retries":["重试间的间隔时间(秒)"],"Proxy action retry interval":["代理操作重试间隔"],"Allow triggering tasks on the smart proxy in batches":["允许以批量形式触发智能代理上的任务"],"Allow proxy batch tasks":["允许代理批处理任务"],"Number of tasks which should be sent to the smart proxy in one request, if foreman_tasks_proxy_batch_trigger is enabled":["如果启用了 foreman_tasks_proxy_batch_trigger,在一个请求中应发送到智能代理的任务数"],"Proxy tasks batch size":["代理任务批处理大小"],"Url pointing to the task troubleshooting documentation. It should contain %{label} placeholder, that will be replaced with normalized task label (restricted to only alphanumeric characters)). %{version} placeholder is also available.":["指向任务故障排除文档的 URL。它应该包含%{label} 占位符,它将被标准化的任务标签(仅限字母数字字符)替换。还可以使用 %{version} 占位符。"],"Tasks troubleshooting URL":["任务故障排除 URL"],"Polling multiplier which is used to multiply the default polling intervals. This can be used to prevent polling too frequently for long running tasks.":["轮询乘数,用于乘以默认轮询间隔。这可用于防止对长时间运行的任务进行过于频繁的轮询。"],"Polling intervals multiplier":["轮询间隔乘数"],"was resumed":["被恢复"],"could not be resumed":["无法恢复"],"task has to be resumable":["任务必须是可恢复的"],"was cancelled":["已取消。"],"task has to be cancellable":["任务必须可取消"],"resources were unlocked with force.":["资源被强行解锁。"],"cannot be cancelled with force at the moment.":["目前无法强行取消。"],"resources were unlocked ":["资源已解锁 "],"resources cannot be unlocked at the moment.":["目前无法解锁资源。"],"I understand that this may cause harm and have working database backups of all backend services.":["我理解这可能会导致损害,并对所有后端服务具有可以正常工作的数据库备份。"],"Unlock":["开锁"],"This will unlock the resources that the task is running against. Please note that this might lead to inconsistent state and should be used with caution, after making sure that the task can't be resumed.":["这将解锁任务正在针对其运行的资源。请注意,这可能会导致状态不一致,应该谨慎使用,然后再确保任务无法恢复。"],"Force Unlock":["强制解除锁定"],"Resources for %s task(s) will be unlocked and will not prevent other tasks from being run. As the task(s) might be still running, it should be avoided to use this unless you are really sure the task(s) got stuck.":["%s 任务的资源将被取消锁定,将不会阻止其他任务运行。因为任务可能仍在运行,除非您完全确定任务已卡住,否则应避免使用这个功能。"],"Execution plan data not available ":["未可用执行计划数据"],"No errors":["无错误"],"Input":["输入"],"Output":["输出"],"Exception":["例外"],"Backtrace":["回溯"],"You can find resource locks on this page. Exclusive lock marked with locked icon means that no other task can use locked resource while this task is running. Non-exclusive lock marked with unlocked icon means other tasks can access the resource freely, it is only used to indicate the relation of this task with the resource":["您可以在本页中找到资源锁。标有已锁图标的独占锁表示此任务运行时其他任务都不能使用已锁定的资源。标有未锁图标的非独占锁表示其他任务可以自由访问该资源,它仅用于指出此任务与该资源的关系"],"Id":["ID"],"Label":["标签"],"Duration":["持续时间"],"Raw input":["原始輸入"],"Raw output":["原始輸出"],"External Id":["外部 Id"],"No running steps":["没有运行步骤"],"You do not have permission":["您没有权限"],"Setting is off":["设置已关闭"],"Stop auto-reloading":["停止自动重新载入"],"Start auto-reloading":["开始自动重新载入"],"Dynflow console":["Dynflow 控制台"],"Resume":["恢复"],"Parent task":["父任务"],"seconds":["秒"],"Complete":["完成"],"Troubleshooting":["故障排除"],"Output:":["输出:"],"Errors:":["错误:"],"Could not receive data: %s":[""],"Task":["任务"],"Running Steps":["运行步骤"],"Errors":["错误"],"Locks":["锁"],"Raw":["Raw"],"Trying to cancel step":["试图取消步骤"],"Step Canceled":["步骤已取消"],"Could not cancel step.":["无法取消步骤。"],"Paused":["暂停"],"Running":["執行中"],"Scheduled":["调度的"],"Total":["总计"],"Other includes all stopped tasks that are cancelled or pending":["其他包括已取消或待处理的所有已停止任务"],"Other:":["其他:"],"Stopped":["停止"],"%(last)s Last %(time)s":["%(last)s 最后 %(time)s"],"%(older)s Older %(time)s":["%(older)s 较老 %(time)s"],"Active Filters:":["活跃的过滤器:"],"Clear All Filters":["清除所有过滤器"],"With focus on last":["专注于最后"],"state":["状态"],"result":["结果"],"mode":["模式"],"time":["时间"],"running":["运行"],"paused":["暂停"],"stopped":["停止"],"scheduled":["调度"],"error":["错误"],"warning":["警告"],"success":["成功"],"other":["其他"],"last":["最近"],"older":["较老"],"24h":["24 小时"],"12h":["12 小时"],"week":["周"],"Select Action":["选择操作"],"Cancel selected tasks":["取消选择的任务"],"Cancel Selected":["取消选择"],"Resume selected tasks":["恢复选择的任务"],"Resume Selected":["恢复选择"],"Force Cancel selected tasks":["强制取消选择的任务"],"Force Cancel Selected":["强制取消选择"],"%s Selected Tasks":["%s 选择的任务"],"This will %(action)s %(number)s task(s), putting them in the %(state)s state. Are you sure?":["这将 %(action)s %(number)s 任务,把它们置于 %(state)s 状态。确定吗?"],"No":["否"],"Yes":["是"],"Select all {count} tasks":[""],"All %s tasks are selected.":[""],"Undo selection":["撤销选择"],"Select row":["选择行"],"Sub tasks of %s":["%s 的子任务"],"Cannot resume tasks at the moment":["目前无法恢复任务"],"Not all the selected tasks can be resumed":["并非所有选定的任务都可以恢复"],"Resuming selected tasks, this might take a while":["恢复所选任务,这可能需要一段时间"],"Cannot cancel tasks at the moment":["目前无法取消任务"],"Canceling selected tasks, this might take a while":["取消所选任务,这可能需要一段时间"],"Not all the selected tasks can be cancelled":["并非所有选定的任务都可以取消"],"Cannot force cancel tasks at the moment":["目前无法强制取消任务"],"Canceling with force selected tasks, this might take a while":["取消强制选择的任务,这可能需要一段时间"],"No Tasks":["没有任务"],"No start or end dates":["没有开始或结束日期"],"Task was canceled":["任务已取消"],"More than":["多于"],"Less than a second":["少于一秒"],"Refresh Data":["刷新数据"],"Export All":["导出所有"],"Started at":["起始於"],"Operation":["操作"],"Task cannot be canceled":["任务无法取消"],"Force Cancel":["强制取消"],"Action with sub plans":["有子计划的操作"]}}};
@@ -0,0 +1 @@
1
+ locales['foreman_tasks'] = locales['foreman_tasks'] || {}; locales['foreman_tasks']['zh_TW'] = {"domain":"foreman_tasks","locale_data":{"foreman_tasks":{"":{"Project-Id-Version":"foreman_tasks 8.0.1","Report-Msgid-Bugs-To":"","POT-Creation-Date":"2023-05-18 08:15+0000","PO-Revision-Date":"2016-02-12 14:04+0000","Last-Translator":"FULL NAME <EMAIL@ADDRESS>","Language-Team":"Chinese (Taiwan) (http://app.transifex.com/foreman/foreman/language/zh_TW/)","MIME-Version":"1.0","Content-Type":"text/plain; charset=UTF-8","Content-Transfer-Encoding":"8bit","Language":"zh_TW","Plural-Forms":"nplurals=1; plural=0;","lang":"zh_TW","domain":"foreman_tasks","plural_forms":"nplurals=1; plural=0;"},"List recurring logics":["列出週期邏輯"],"Show recurring logic details":["顯示週期邏輯的詳情"],"Update recurring logic":[""],"Cancel recurring logic":["取消週期邏輯"],"Delete recurring logics by search query":[""],"Search query":["搜尋查詢"],"Please provide a search parameter in the request":[""],"Resume all paused error tasks":["繼續所有處於暫停狀態的錯誤任務"],"Resume tasks matching search string":["繼續符合搜尋字串的任務"],"Resume specific tasks by ID":["透過 ID 繼續特定任務"],"Cancel selected cancellable tasks":[""],"Cancel tasks matching search string":[""],"Cancel specific tasks by ID":[""],"Please provide at least one of search or task_ids parameters in the request":[""],"Stop selected stoppable tasks":[""],"Stop tasks matching search string":[""],"Stop specific tasks by ID":[""],"List tasks":["列出任務"],"UUID of the task":["任務的 UUID"],"The ID of the step inside the execution plan to send the event to":["執行計畫中要發送事件的步驟 ID"],"Data to be sent to the action":["要發送到動作的資料"],"Send data to the task from external executor (such as smart_proxy_dynflow)":["從外部執行者(例如 smart_proxy_dynflow)發送資料到任務"],"User search_params requires user_id to be specified":["使用者 search_params 需要指定 user_id"],"Resource search_params requires resource_type and resource_id to be specified":["資源 search_params 需要指定 resource_type 與 resource_id"],"Task search_params requires task_id to be specified":["任務 search_params 需要指定 task_id"],"Type %s for search_params is not supported":["不支援 search_params 的 %s"],"The recurring logic was enabled.":[""],"The recurring logic was disabled.":[""],"Trying to abort the task":[""],"The task cannot be aborted at the moment.":[""],"Enable":["啟用"],"Disable":["停用"],"Cancel":["取消"],"Tasks":["工作"],"Sub tasks":["子任務"],"Start at":["開始於"],"Start before":["在這之前開始"],"Indicates that the action should be cancelled if it cannot be started before this time.":["這表示如果不能在這時間之前開始,就應該取消動作。"],"Repeats":["重複"],"Purpose":[""],"A special label for tracking a recurring job. There can be only one active job with a given purpose at a time.":[""],"is minute (range: 0-59)":["是分鐘(範圍:0-59)"],"is hour (range: 0-23)":["是小時(範圍:0-23)"],"is day of month (range: 1-31)":["是日期(範圍:1-31)"],"is month (range: 1-12)":["是月份(範圍:1-12)"],"is day of week (range: 0-6)":["是星期幾(範圍:0-6)"],"Cron line format 'a b c d e', where: %s":["Cron 行格式 'a b c d e',其中:%s"],"Cron line":["Cron 行"],"Days":["天"],"Days of week":["星期幾"],"Mon":["週一"],"Tue":["週二"],"Wed":["週三"],"Thu":["週四"],"Fri":["週五"],"Sat":["週六"],"Sun":["週日"],"At":["於"],"Repeat N times":["重複 N 次"],"Ends":["結束"],"Never":["永不"],"On":["開啟"],"Ends at":["結束於"],"Unlimited":["無限制"],"%{total} task(s), %{success} success, %{failed} fail":["%{total} 任務,%{success} 成功,%{failed} 失敗"],"Bulk action":["批次動作"],"Empty bulk action":["清空批次動作"],"The targets are of different types":["目標類型不同"],"Import facts":["匯入詳情"],"Import Puppet classes":["匯入 Puppet 類別"],"activation key":["啟動金鑰"],"user":["使用者"],"repository":["軟體庫"],"content view version":["內容視域版本"],"content view":["內容視域"],"product":["產品"],"system":["系統"],"organization":["組織"],"Failed to initialize":["無法初始化"],"No proxy defined for execution":[""],"All proxies with the required feature are unavailable at the moment":[""],"Changing request id %{request_id} to saved id %{saved_id}":[""],"Failed to check on tasks on proxy at %{url}: %{exception}":[""],"The smart proxy task %s failed.":["智慧型代理任務 %s 失敗。"],"Cancel enforced: the task might be still running on the proxy":["強制取消:任務可能還在代理伺服器上執行"],"Task aborted: the task might be still running on the proxy":[""],"Event delivered by request %{request_id}":[""],"Proxy task gone missing from the smart proxy":[""],"Failed to trigger task on the smart proxy: ":[""],"Initialization error: %s":["初始化錯誤:%s"],"Required lock is already taken by other running tasks.":["所需要的所已經由其它執行中任務取得。"],"Please inspect their state, fix their errors and resume them.":["請檢查它們的狀態,修正錯誤然後繼續。"],"Conflicts with tasks:":["和任務有衝突:"],"Active":["啟用中"],"Cancelled":["已取消"],"Finished":["已完成"],"Disabled":["已停用"],"N/A":["N/A"],"Cannot update a cancelled Recurring Logic.":[""],"Delayed":["已延遲"],"Immediate":["立即"],"Recurring logic":["週期邏輯"],"%{value} is not allowed triggering mode":["%{value} 並不允許觸發模式"],"%{value} is not allowed input type":["%{value} 並非允許的輸入類型"],"%{value} is wrong format":["%{value} 的格式錯誤"],"mode has to be one of %{allowed_modes}":[""],"is not a valid format":[""],"No task could be started":[""],"Active or disabled recurring logic with purpose %s already exists":[""],"%s is not valid format of cron line":["%s 不是 cron 行的正確格式"],"The task could not be started":[""],"A paused task represents a process that has not finished properly. Any task in paused state can lead to potential inconsistency and needs to be resolved.":[""],"The recommended approach is to investigate the error messages below and in 'errors' tab, address the primary cause of the issue and resume the task.":[""],"troubleshooting documentation":[""],"See %{link} for more details on how to resolve the issue":[""],"There is %{count} paused task in the system that need attention":["",""],"Schedule":["排程"],"Execute now":["立即執行"],"Schedule future execution":["排程未來的執行"],"Set up recurring execution":["設定週期執行"],"Recurring logics":["週期邏輯"],"Clear Cancelled":[""],"This action will delete all cancelled recurring logics. Please note that this action can't be reversed.":[""],"ID":["ID"],"Task count":["工作數量"],"Action":["動作"],"Last occurrence":["最後一次發生"],"Next occurrence":["下次發生"],"Current iteration":["現有重述"],"Iteration limit":["重述限制"],"Repeat until":["重複直到"],"State":["狀態"],"Details":["詳細資訊"],"Task group common":["任務群組的一般事項"],"Associated resources":["相聯資源"],"Latest Warning/Error Tasks":["最新的警告 / 錯誤任務"],"Name":["名稱"],"Result":["結果"],"Started":[""],"Task Status":["任務狀態"],"No. of Tasks":["任務編號"],"Last start time":[""],"Details of %s task":[""],"List of tasks":[""],"Task Details":["任務的詳細資訊"],"Back to tasks":[""],"Foreman Tasks":[""],"Recurring Logics":[""],"Number of seconds to wait for synchronous task to finish.":[""],"Sync task timeout":[""],"Enable the dynflow console (/foreman_tasks/dynflow) for debugging":["啟用 dynflow 主控台(/foreman_tasks/dynflow)作為偵錯使用"],"Enable dynflow console":[""],"Require user to be authenticated as user with admin rights when accessing dynflow console":["存取 dynflow 主控台時,需要使用者授權成為擁有 admin 權限的使用者"],"Require auth for dynflow console":[""],"Number of attempts to start a task on the smart proxy before failing":["在智慧代理上啟動任務的嘗試次數"],"Proxy action retry count":[""],"Time in seconds between retries":["重試之間的時間(秒)"],"Proxy action retry interval":[""],"Allow triggering tasks on the smart proxy in batches":[""],"Allow proxy batch tasks":[""],"Number of tasks which should be sent to the smart proxy in one request, if foreman_tasks_proxy_batch_trigger is enabled":[""],"Proxy tasks batch size":[""],"Url pointing to the task troubleshooting documentation. It should contain %{label} placeholder, that will be replaced with normalized task label (restricted to only alphanumeric characters)). %{version} placeholder is also available.":[""],"Tasks troubleshooting URL":[""],"Polling multiplier which is used to multiply the default polling intervals. This can be used to prevent polling too frequently for long running tasks.":[""],"Polling intervals multiplier":[""],"was resumed":[""],"could not be resumed":[""],"task has to be resumable":[""],"was cancelled":[""],"task has to be cancellable":[""],"resources were unlocked with force.":[""],"cannot be cancelled with force at the moment.":[""],"resources were unlocked ":[""],"resources cannot be unlocked at the moment.":[""],"I understand that this may cause harm and have working database backups of all backend services.":["我瞭解這可能會導致傷害,而且我已經備份了所有後端服務的資料庫。"],"Unlock":["解鎖"],"This will unlock the resources that the task is running against. Please note that this might lead to inconsistent state and should be used with caution, after making sure that the task can't be resumed.":["這會解鎖任務執行的資源。請注意,這可能會導致不一致的狀態,請小心使用,並確定任務不能被繼續執行。"],"Force Unlock":["強制解除鎖定"],"Resources for %s task(s) will be unlocked and will not prevent other tasks from being run. As the task(s) might be still running, it should be avoided to use this unless you are really sure the task(s) got stuck.":[""],"Execution plan data not available ":[""],"No errors":["無錯誤"],"Input":["輸入"],"Output":["輸出"],"Exception":["例外"],"Backtrace":["追蹤"],"You can find resource locks on this page. Exclusive lock marked with locked icon means that no other task can use locked resource while this task is running. Non-exclusive lock marked with unlocked icon means other tasks can access the resource freely, it is only used to indicate the relation of this task with the resource":[""],"Id":["Id"],"Label":["標籤"],"Duration":["持續時間"],"Raw input":["原始輸入"],"Raw output":["原始輸出"],"External Id":["外部 ID"],"No running steps":["沒有執行步驟"],"You do not have permission":[""],"Setting is off":[""],"Stop auto-reloading":["停止自動重新載入"],"Start auto-reloading":["開始自動載入"],"Dynflow console":["Dynflow 主控台"],"Resume":["繼續"],"Parent task":["父任務"],"seconds":["秒"],"Complete":[""],"Troubleshooting":["疑難排解"],"Output:":[""],"Errors:":[""],"Could not receive data: %s":[""],"Task":["工作"],"Running Steps":["執行中的步驟"],"Errors":["錯誤"],"Locks":["鎖"],"Raw":["Raw"],"Trying to cancel step":[""],"Step Canceled":[""],"Could not cancel step.":[""],"Paused":["已暫停"],"Running":["執行中"],"Scheduled":[""],"Total":["總數"],"Other includes all stopped tasks that are cancelled or pending":[""],"Other:":[""],"Stopped":[""],"%(last)s Last %(time)s":[""],"%(older)s Older %(time)s":[""],"Active Filters:":[""],"Clear All Filters":[""],"With focus on last":[""],"state":["狀態"],"result":[""],"mode":[""],"time":[""],"running":["執行中"],"paused":[""],"stopped":[""],"scheduled":[""],"error":[""],"warning":[""],"success":["成功"],"other":[""],"last":[""],"older":[""],"24h":[""],"12h":[""],"week":[""],"Select Action":["選擇動作"],"Cancel selected tasks":[""],"Cancel Selected":[""],"Resume selected tasks":[""],"Resume Selected":[""],"Force Cancel selected tasks":[""],"Force Cancel Selected":[""],"%s Selected Tasks":[""],"This will %(action)s %(number)s task(s), putting them in the %(state)s state. Are you sure?":[""],"No":["否"],"Yes":["是"],"Select all {count} tasks":[""],"All %s tasks are selected.":[""],"Undo selection":[""],"Select row":[""],"Sub tasks of %s":[""],"Cannot resume tasks at the moment":[""],"Not all the selected tasks can be resumed":[""],"Resuming selected tasks, this might take a while":[""],"Cannot cancel tasks at the moment":[""],"Canceling selected tasks, this might take a while":[""],"Not all the selected tasks can be cancelled":[""],"Cannot force cancel tasks at the moment":[""],"Canceling with force selected tasks, this might take a while":[""],"No Tasks":[""],"No start or end dates":[""],"Task was canceled":[""],"More than":[""],"Less than a second":[""],"Refresh Data":[""],"Export All":[""],"Started at":["起始於"],"Operation":["作業"],"Task cannot be canceled":[""],"Force Cancel":[""],"Action with sub plans":["有子計畫的動作"]}}};
@@ -0,0 +1,45 @@
1
+ module Actions
2
+ class CheckLongRunningTasks < ::Actions::EntryAction
3
+ include Actions::RecurringAction
4
+
5
+ INTERVAL = 2.days
6
+ STATES = ['running', 'paused'].freeze
7
+
8
+ def plan
9
+ time = Time.now.utc
10
+ cutoff = time - INTERVAL
11
+ notification = ::ForemanTasks::TasksMailNotification.find_by(name: "long_running_tasks")
12
+ org_admin_role = Role.find_by(name: 'Organization admin')
13
+ users = User.left_joins(:roles)
14
+ .where(id: UserMailNotification.where(mail_notification_id: notification.id).select(:host_id))
15
+ .or(User.where(admin: true))
16
+ .or(User.where(id: UserRole.where(id: [org_admin_role.id] + org_admin_role.cloned_role_ids).select(:owner_id)))
17
+
18
+ query = "state ^ (#{STATES.join(', ')}) AND state_updated_at <= \"#{cutoff}\""
19
+ users.each do |user|
20
+ User.as(user) do
21
+ tasks = ForemanTasks::Task.authorized
22
+ .search_for(query)
23
+ .select(:id)
24
+ .pluck(:id)
25
+ plan_action(DeliverLongRunningTasksNotification,
26
+ OpenStruct.new(
27
+ user_id: User.current.id,
28
+ time: time,
29
+ interval: INTERVAL,
30
+ states: STATES,
31
+ task_uuids: tasks,
32
+ query: query,
33
+ # Non serializable fields
34
+ user: nil,
35
+ tasks: nil
36
+ ))
37
+ end
38
+ end
39
+ end
40
+
41
+ def humanized_name
42
+ _('Check for long running tasks')
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,22 @@
1
+ module Actions
2
+ class DeliverLongRunningTasksNotification < EntryAction
3
+ def plan(report)
4
+ return if report.task_uuids.empty?
5
+
6
+ plan_self report: report
7
+ end
8
+
9
+ def run
10
+ report = OpenStruct.new(input[:report])
11
+ tasks = ForemanTasks::Task.where(id: report.task_uuids)
12
+ report.user = User.current
13
+ report.tasks = tasks
14
+ ::UINotifications::Tasks::TasksRunningLong.new.deliver!
15
+ TasksMailer.long_tasks(report).deliver_now
16
+ end
17
+
18
+ def humanized_name
19
+ _('Deliver notifications about long running tasks')
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,12 @@
1
+ class TasksMailer < ApplicationMailer
2
+ helper ApplicationHelper
3
+
4
+ def long_tasks(report, opts = {})
5
+ return if report.tasks.empty?
6
+
7
+ @report = report
8
+ @subject = opts[:subject]
9
+ @subject ||= _('Tasks pending since %s') % (@report.time - @report.interval)
10
+ mail(to: report.user.mail, subject: @subject)
11
+ end
12
+ end
@@ -0,0 +1,9 @@
1
+ module ForemanTasks
2
+ class TasksMailNotification < MailNotification
3
+ ALL = N_("Subscribe")
4
+
5
+ def subscription_options
6
+ [ALL]
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,33 @@
1
+ module UINotifications
2
+ module Tasks
3
+ class TasksRunningLong < Tasks::Base
4
+ include Rails.application.routes.url_helpers
5
+
6
+ def deliver!
7
+ notification = ::Notification.new(
8
+ :audience => Notification::AUDIENCE_GLOBAL,
9
+ :notification_blueprint => blueprint,
10
+ :initiator => initiator,
11
+ :message => message,
12
+ :subject => nil,
13
+ :notification_recipients => [NotificationRecipient.create(:user => User.current)]
14
+ )
15
+ notification.actions['links'] ||= []
16
+ notification.actions['links'] << {
17
+ href: foreman_tasks_tasks_path(search: subject.query),
18
+ title: N_('Long running tasks'),
19
+ }
20
+ notification.save!
21
+ notification
22
+ end
23
+
24
+ def blueprint
25
+ @blueprint ||= NotificationBlueprint.unscoped.find_by(:name => 'tasks_running_long')
26
+ end
27
+
28
+ def message
29
+ _("%{count} tasks are in running or paused state for more than a day") % { count: subject.task_uuids.count }
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,29 @@
1
+ <p>
2
+ <%= _("Tasks lingering in states %{states} since %{time}") % {
3
+ time: @report.time - @report.interval,
4
+ states: @report.states.join(', ')
5
+ } %>
6
+ </p>
7
+
8
+ <div class="dashboard">
9
+ <table>
10
+ <tr>
11
+ <th>_("ID")</th>
12
+ <th>_("Action")</th>
13
+ <th>_("Label")</th>
14
+ <th>_("State")</th>
15
+ <th>_("State updated at")</th>
16
+ </tr>
17
+ <% @report.tasks.each do |task| %>
18
+ <tr>
19
+ <td><%= link_to task.id, foreman_tasks_task_url(task) %></td>
20
+ <td><%= task.action %></td>
21
+ <td><%= task.label %></td>
22
+ <td><%= task.state %></td>
23
+ <td><%= task.state_updated_at %></td>
24
+ </tr>
25
+ <% end %>
26
+ </table>
27
+ </div>
28
+
29
+ <%= link_to 'More details', foreman_tasks_tasks_url(search: @report.query) %>
@@ -0,0 +1,16 @@
1
+ <%= _("Tasks lingering in states %{states} since %{time}") % {
2
+ time: @report.time - @report.interval,
3
+ states: @report.states.join(', ')
4
+ } %>
5
+
6
+ More details: <%= foreman_tasks_tasks_url(search: @report.query) %>
7
+
8
+ <% @report.tasks.each do |task| %>
9
+ ID: <%= task.id %>
10
+ Action: <%= task.action %>
11
+ Label: <%= task.label %>
12
+ State: <%= task.state %>
13
+ State updated at: <%= task.state_updated_at %>
14
+ Details: <%= foreman_tasks_task_url(task) %>
15
+
16
+ <% end %>
@@ -49,6 +49,13 @@ blueprints = [
49
49
  level: 'info',
50
50
  message: "DYNAMIC",
51
51
  },
52
+
53
+ {
54
+ group: N_('Tasks'),
55
+ name: 'tasks_running_long',
56
+ message: 'DYNAMIC',
57
+ level: 'warning',
58
+ },
52
59
  ]
53
60
 
54
61
  blueprints.each { |blueprint| UINotifications::Seed.new(blueprint).configure }
@@ -0,0 +1,24 @@
1
+ N_('Long running tasks')
2
+
3
+ notifications = [
4
+ {
5
+ :name => 'long_running_tasks',
6
+ :description => N_('A notification when tasks run for suspiciously long time'),
7
+ :mailer => 'TasksMailer',
8
+ :method => 'long_tasks',
9
+ :subscription_type => 'alert',
10
+ },
11
+ ]
12
+
13
+ notifications.each do |notification|
14
+ if (mail = ForemanTasks::TasksMailNotification.find_by(name: notification[:name]))
15
+ mail.attributes = notification
16
+ mail.save! if mail.changed?
17
+ else
18
+ created_notification = ForemanTasks::TasksMailNotification.create(notification)
19
+ if created_notification.nil? || created_notification.errors.any?
20
+ raise ::Foreman::Exception.new(N_("Unable to create mail notification: %s"),
21
+ SeedHelper.format_errors(created_notification))
22
+ end
23
+ end
24
+ end
@@ -162,6 +162,7 @@ module ForemanTasks
162
162
  world.middleware.use Actions::Middleware::KeepCurrentTimezone
163
163
  world.middleware.use Actions::Middleware::KeepCurrentRequestID
164
164
  world.middleware.use ::Actions::Middleware::LoadSettingValues
165
+ ForemanTasks.register_scheduled_task(Actions::CheckLongRunningTasks, ENV['FOREMAN_TASKS_CHECK_LONG_RUNNING_TASKS_CRONLINE'] || '0 0 * * *')
165
166
  end
166
167
  ::ForemanTasks.dynflow.config.on_init(true) do
167
168
  ::ForemanTasks::Task::DynflowTask.consistency_check
@@ -186,7 +187,7 @@ module ForemanTasks
186
187
  end
187
188
 
188
189
  rake_tasks do
189
- %w[dynflow.rake test.rake export_tasks.rake cleanup.rake generate_task_actions.rake].each do |rake_file|
190
+ %w[dynflow.rake test.rake export_tasks.rake cleanup.rake generate_task_actions.rake reschedule_long_running_tasks_checker.rake].each do |rake_file|
190
191
  full_path = File.expand_path("../tasks/#{rake_file}", __FILE__)
191
192
  load full_path if File.exist?(full_path)
192
193
  end
@@ -0,0 +1,21 @@
1
+ namespace :foreman_tasks do
2
+ desc <<~DESC
3
+ Reschedules the long running task checker recurring logic to run at a different schedule. ENV variables:
4
+
5
+ * FOREMAN_TASKS_CHECK_LONG_RUNNING_TASKS_CRONLINE : A cron line describing the schedule, defaults to 0 0 * * *
6
+ DESC
7
+ task :reschedule_long_running_tasks_checker => ['environment', 'dynflow:client'] do
8
+ User.as_anonymous_admin do
9
+ task_class = Actions::CheckLongRunningTasks
10
+ cronline = ENV['FOREMAN_TASKS_CHECK_LONG_RUNNING_TASKS_CRONLINE'] || '0 0 * * *'
11
+ rl = ForemanTasks::RecurringLogic.joins(:tasks)
12
+ .where(state: 'active')
13
+ .merge(ForemanTasks::Task.where(label: task_class.name))
14
+ .first
15
+ if rl&.cron_line != cronline
16
+ rl.cancel
17
+ ForemanTasks.register_scheduled_task(task_class, cronline)
18
+ end
19
+ end
20
+ end
21
+ end
@@ -1,3 +1,3 @@
1
1
  module ForemanTasks
2
- VERSION = '8.0.1'.freeze
2
+ VERSION = '8.1.0'.freeze
3
3
  end
data/lib/foreman_tasks.rb CHANGED
@@ -61,4 +61,20 @@ module ForemanTasks
61
61
  result = dynflow.world.delay action, delay_options, *args
62
62
  ForemanTasks::Task::DynflowTask.where(:external_id => result.id).first!
63
63
  end
64
+
65
+ def self.register_scheduled_task(task_class, cronline)
66
+ ForemanTasks::RecurringLogic.transaction(isolation: :serializable) do
67
+ return if ForemanTasks::RecurringLogic.joins(:tasks)
68
+ .where(state: 'active')
69
+ .merge(ForemanTasks::Task.where(label: task_class.name))
70
+ .exists?
71
+
72
+ User.as_anonymous_admin do
73
+ recurring_logic = ForemanTasks::RecurringLogic.new_from_cronline(cronline)
74
+ recurring_logic.save!
75
+ recurring_logic.start(task_class)
76
+ end
77
+ end
78
+ rescue ActiveRecord::TransactionIsolationError # rubocop:disable Lint/SuppressedException
79
+ end
64
80
  end
data/locale/Makefile CHANGED
@@ -14,6 +14,7 @@ POFILES = $(shell find . -name '$(DOMAIN).po')
14
14
  MOFILES = $(patsubst %.po,%.mo,$(POFILES))
15
15
  POXFILES = $(patsubst %.po,%.pox,$(POFILES))
16
16
  EDITFILES = $(patsubst %.po,%.edit.po,$(POFILES))
17
+ JSFILES = $(shell find ../app/assets/javascripts/*/locale -name '$(DOMAIN).js')
17
18
 
18
19
  %.mo: %.po
19
20
  mkdir -p $(shell dirname $@)/LC_MESSAGES
@@ -42,18 +43,20 @@ uniq-po:
42
43
  done
43
44
 
44
45
  tx-pull: $(EDITFILES)
45
- tx pull -f
46
+ cd .. && tx pull -f
46
47
  for f in $(EDITFILES) ; do \
47
48
  sed -i 's/^\("Project-Id-Version: \).*$$/\1$(DOMAIN) $(VERSION)\\n"/' $$f; \
48
49
  done
49
50
 
50
51
  tx-update: tx-pull
51
52
  @echo
52
- @echo Run rake plugin:gettext[$(DOMAIN)] from the Foreman installation, then make -C locale mo-files to finish
53
+ @echo Run rake plugin:gettext[$(DOMAIN)] from the Foreman installation
54
+ @echo then run rake plugin:po_to_json[$(DOMAIN)] from the Foreman installation
55
+ @echo then run make -C locale mo-files to finish
53
56
  @echo
54
57
 
55
58
  mo-files: $(MOFILES)
56
- git add $(POFILES) $(POTFILE) ../locale/*/LC_MESSAGES
59
+ git add $(POFILES) $(POTFILE) $(JSFILES) ../locale/*/LC_MESSAGES
57
60
  git commit -m "i18n - pulling from tx"
58
61
  @echo
59
62
  @echo Changes commited!
@@ -1,4 +1,4 @@
1
1
  # Autogenerated!
2
2
  _("Action with sub plans")
3
3
  _("Import Puppet classes")
4
- _("Import facts")
4
+ _("Import facts")
Binary file
@@ -4,16 +4,16 @@
4
4
  #
5
5
  # Translators:
6
6
  # Crited <Alexander.Stoll@netways.de>, 2019
7
- # Ettore Atalan <atalanttore@googlemail.com>, 2016-2017
7
+ # Ettore Atalan <atalanttore@googlemail.com>, 2016-2017,2023
8
8
  # Nonof Yourbusiness <jonasschell@ocupe.org>, 2019
9
9
  # Patrick Dolinic, 2021
10
10
  msgid ""
11
11
  msgstr ""
12
- "Project-Id-Version: foreman_tasks 7.1.0\n"
12
+ "Project-Id-Version: foreman_tasks 8.0.1\n"
13
13
  "Report-Msgid-Bugs-To: \n"
14
14
  "PO-Revision-Date: 2016-02-12 14:04+0000\n"
15
- "Last-Translator: Patrick Dolinic, 2021\n"
16
- "Language-Team: German (http://www.transifex.com/foreman/foreman/language/de/)\n"
15
+ "Last-Translator: Ettore Atalan <atalanttore@googlemail.com>, 2016-2017,2023\n"
16
+ "Language-Team: German (http://app.transifex.com/foreman/foreman/language/de/)\n"
17
17
  "MIME-Version: 1.0\n"
18
18
  "Content-Type: text/plain; charset=UTF-8\n"
19
19
  "Content-Transfer-Encoding: 8bit\n"
@@ -27,7 +27,7 @@ msgid "%(older)s Older %(time)s"
27
27
  msgstr "%(older)s Older %(time)s"
28
28
 
29
29
  msgid "%s Selected Tasks"
30
- msgstr " %s Selected Tasks"
30
+ msgstr " %s ausgewählte Aufgaben"
31
31
 
32
32
  msgid "%s is not valid format of cron line"
33
33
  msgstr "%s ist ungültiges Cron-Zeilen-Format"
@@ -91,7 +91,7 @@ msgid "At"
91
91
  msgstr "Um"
92
92
 
93
93
  msgid "Back to tasks"
94
- msgstr "Zurück zu Jobs"
94
+ msgstr "Zurück zu Aufgaben"
95
95
 
96
96
  msgid "Backtrace"
97
97
  msgstr "Ablaufverfolgung"
@@ -274,7 +274,7 @@ msgid "Force Unlock"
274
274
  msgstr "Entsperren erzwingen"
275
275
 
276
276
  msgid "Foreman Tasks"
277
- msgstr "Foreman Tasks"
277
+ msgstr "Foreman-Aufgaben"
278
278
 
279
279
  msgid "Fri"
280
280
  msgstr "Fr"
@@ -373,7 +373,7 @@ msgid "No start or end dates"
373
373
  msgstr "Kein Start- oder Enddatum"
374
374
 
375
375
  msgid "No task could be started"
376
- msgstr "Keine Jobs konnten gestartet werden"
376
+ msgstr "Es konnte keine Aufgabe gestartet werden"
377
377
 
378
378
  msgid "No. of Tasks"
379
379
  msgstr "Nr. der Aufgaben"
@@ -566,7 +566,7 @@ msgid "Start at"
566
566
  msgstr "Startet um "
567
567
 
568
568
  msgid "Start auto-reloading"
569
- msgstr ""
569
+ msgstr "Automatisches Neuladen starten"
570
570
 
571
571
  msgid "Start before"
572
572
  msgstr "Startet vor"
@@ -584,7 +584,7 @@ msgid "Step Canceled"
584
584
  msgstr "Schritt abgebrochen"
585
585
 
586
586
  msgid "Stop auto-reloading"
587
- msgstr ""
587
+ msgstr "Automatisches Neuladen anhalten"
588
588
 
589
589
  msgid "Stop selected stoppable tasks"
590
590
  msgstr "Ausgewählte stoppbare Aufgaben stoppen"
@@ -614,7 +614,7 @@ msgid "Task"
614
614
  msgstr "Aufgabe"
615
615
 
616
616
  msgid "Task Details"
617
- msgstr "Taskdetails"
617
+ msgstr "Aufgabendetails"
618
618
 
619
619
  msgid "Task Status"
620
620
  msgstr "Aufgabenstatus"
@@ -662,10 +662,10 @@ msgid "The targets are of different types"
662
662
  msgstr "Die Ziele haben verschiedene Typen"
663
663
 
664
664
  msgid "The task cannot be aborted at the moment."
665
- msgstr "Der Job kann nicht abgebrochen werden."
665
+ msgstr "Die Aufgabe kann im Moment nicht abgebrochen werden."
666
666
 
667
667
  msgid "The task could not be started"
668
- msgstr "Der Job konnte nicht gestartet werden."
668
+ msgstr "Die Aufgabe konnte nicht gestartet werden."
669
669
 
670
670
  msgid "There is %{count} paused task in the system that need attention"
671
671
  msgid_plural "There are %{count} paused tasks in the system that need attention"
@@ -694,7 +694,7 @@ msgid "Troubleshooting"
694
694
  msgstr "Fehlerbehebung"
695
695
 
696
696
  msgid "Trying to abort the task"
697
- msgstr "Versuche Jobabbruch"
697
+ msgstr "Versuch des Abbruchs der Aufgabe"
698
698
 
699
699
  msgid "Trying to cancel step"
700
700
  msgstr "Versuch, Schritt abzubrechen"
Binary file
@@ -1,21 +1,21 @@
1
- # English translations for foreman_tasks package.
2
- # Copyright (C) 2016 THE PACKAGE'S COPYRIGHT HOLDER
1
+ # SOME DESCRIPTIVE TITLE.
2
+ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
3
3
  # This file is distributed under the same license as the foreman_tasks package.
4
- # FIRST AUTHOR <EMAIL@ADDRESS>, 2016.
4
+ # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
5
5
  #
6
+ #, fuzzy
6
7
  msgid ""
7
8
  msgstr ""
8
- "Project-Id-Version: foreman_tasks 7.1.0\n"
9
+ "Project-Id-Version: foreman_tasks 1.0.0\n"
9
10
  "Report-Msgid-Bugs-To: \n"
10
- "PO-Revision-Date: 2016-02-03 09:55-0500\n"
11
+ "PO-Revision-Date: 2023-05-18 08:15+0000\n"
11
12
  "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12
- "Language-Team: English\n"
13
- "Language: en\n"
13
+ "Language-Team: LANGUAGE <LL@li.org>\n"
14
+ "Language: \n"
14
15
  "MIME-Version: 1.0\n"
15
16
  "Content-Type: text/plain; charset=UTF-8\n"
16
17
  "Content-Transfer-Encoding: 8bit\n"
17
- "Plural-Forms: nplurals=2; plural=n != 1;\n"
18
- "\n"
18
+ "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
19
19
 
20
20
  msgid "%(last)s Last %(time)s"
21
21
  msgstr ""
Binary file